rev |
line source |
nuclear@6
|
1 #ifndef MESH_H_
|
nuclear@6
|
2 #define MESH_H_
|
nuclear@6
|
3
|
nuclear@23
|
4 #include <stdio.h>
|
nuclear@6
|
5 #include <vector>
|
nuclear@24
|
6 #include <list>
|
nuclear@45
|
7 #include "common.h"
|
nuclear@6
|
8
|
nuclear@6
|
9 struct Vertex {
|
nuclear@9
|
10 float pos[4];
|
nuclear@9
|
11 float normal[4];
|
nuclear@12
|
12 float tex[4];
|
nuclear@12
|
13 float padding[4];
|
nuclear@6
|
14 };
|
nuclear@6
|
15
|
nuclear@6
|
16 struct Face {
|
nuclear@6
|
17 Vertex v[3];
|
nuclear@9
|
18 float normal[4];
|
nuclear@6
|
19 int matid;
|
nuclear@12
|
20 int padding[3];
|
John@15
|
21
|
John@15
|
22 bool operator ==(const Face &f) const;
|
nuclear@6
|
23 };
|
nuclear@6
|
24
|
nuclear@6
|
25 struct Material {
|
nuclear@9
|
26 float kd[4], ks[4];
|
nuclear@6
|
27 float kr, kt;
|
nuclear@6
|
28 float spow;
|
nuclear@12
|
29 float padding;
|
nuclear@6
|
30 };
|
nuclear@6
|
31
|
nuclear@6
|
32 struct Mesh {
|
nuclear@6
|
33 std::vector<Face> faces;
|
nuclear@6
|
34 int matid;
|
nuclear@6
|
35 };
|
nuclear@6
|
36
|
nuclear@54
|
37 struct Light {
|
nuclear@54
|
38 float pos[4], color[4];
|
nuclear@54
|
39 };
|
nuclear@54
|
40
|
nuclear@25
|
41 class AABBox {
|
nuclear@25
|
42 public:
|
nuclear@25
|
43 float min[4], max[4];
|
nuclear@25
|
44
|
nuclear@25
|
45 float calc_surface_area() const;
|
nuclear@25
|
46 };
|
nuclear@25
|
47
|
nuclear@22
|
48 struct KDNode {
|
nuclear@37
|
49 int axis;
|
nuclear@25
|
50 AABBox aabb;
|
nuclear@26
|
51 float cost;
|
nuclear@24
|
52
|
nuclear@24
|
53 KDNode *left, *right;
|
nuclear@32
|
54 std::vector<int> face_idx;
|
nuclear@26
|
55
|
nuclear@26
|
56 KDNode();
|
nuclear@23
|
57 };
|
nuclear@22
|
58
|
nuclear@24
|
59 struct KDNodeGPU {
|
nuclear@28
|
60 AABBox aabb;
|
nuclear@43
|
61 int face_idx[MAX_NODE_FACES];
|
nuclear@28
|
62 int num_faces;
|
nuclear@35
|
63 int left, right;
|
nuclear@35
|
64 int padding;
|
nuclear@24
|
65 };
|
nuclear@24
|
66
|
nuclear@24
|
67
|
nuclear@6
|
68 class Scene {
|
nuclear@24
|
69 private:
|
nuclear@24
|
70 mutable Face *facebuf;
|
nuclear@24
|
71 mutable int num_faces;
|
nuclear@24
|
72
|
nuclear@28
|
73 mutable KDNodeGPU *kdbuf;
|
nuclear@28
|
74
|
nuclear@6
|
75 public:
|
nuclear@6
|
76 std::vector<Mesh*> meshes;
|
nuclear@54
|
77 std::vector<Light> lights;
|
nuclear@6
|
78 std::vector<Material> matlib;
|
nuclear@24
|
79 KDNode *kdtree;
|
nuclear@24
|
80
|
nuclear@24
|
81 Scene();
|
nuclear@24
|
82 ~Scene();
|
nuclear@6
|
83
|
nuclear@13
|
84 bool add_mesh(Mesh *m);
|
nuclear@54
|
85 bool add_light(const Light <);
|
nuclear@54
|
86
|
John@14
|
87 int get_num_meshes() const;
|
nuclear@54
|
88 int get_num_lights() const;
|
nuclear@35
|
89 int get_num_faces() const;
|
John@14
|
90 int get_num_materials() const;
|
nuclear@35
|
91 int get_num_kdnodes() const;
|
nuclear@13
|
92
|
nuclear@54
|
93 Mesh **get_meshes();
|
nuclear@54
|
94 const Mesh * const *get_meshes() const;
|
nuclear@54
|
95
|
nuclear@54
|
96 Light *get_lights();
|
nuclear@54
|
97 const Light *get_lights() const;
|
nuclear@54
|
98
|
John@14
|
99 Material *get_materials();
|
John@14
|
100 const Material *get_materials() const;
|
nuclear@13
|
101
|
nuclear@6
|
102 bool load(const char *fname);
|
nuclear@6
|
103 bool load(FILE *fp);
|
nuclear@22
|
104
|
nuclear@24
|
105 const Face *get_face_buffer() const;
|
nuclear@28
|
106 const KDNodeGPU *get_kdtree_buffer() const;
|
nuclear@27
|
107
|
nuclear@27
|
108 void draw_kdtree() const;
|
nuclear@27
|
109 bool build_kdtree();
|
nuclear@6
|
110 };
|
nuclear@6
|
111
|
nuclear@26
|
112 enum {
|
nuclear@26
|
113 ACCEL_PARAM_MAX_TREE_DEPTH,
|
nuclear@26
|
114 ACCEL_PARAM_MAX_NODE_ITEMS,
|
nuclear@26
|
115 ACCEL_PARAM_COST_TRAVERSE,
|
nuclear@26
|
116 ACCEL_PARAM_COST_INTERSECT,
|
nuclear@26
|
117
|
nuclear@26
|
118 NUM_ACCEL_PARAMS
|
nuclear@26
|
119 };
|
nuclear@26
|
120
|
nuclear@26
|
121 void set_accel_param(int p, int v);
|
nuclear@26
|
122
|
nuclear@28
|
123 int kdtree_depth(const KDNode *tree);
|
nuclear@28
|
124 int kdtree_nodes(const KDNode *tree);
|
nuclear@28
|
125
|
nuclear@32
|
126 bool kdtree_dump(const KDNode *tree, const char *fname);
|
nuclear@32
|
127 KDNode *kdtree_restore(const char *fname);
|
nuclear@32
|
128
|
nuclear@6
|
129 #endif /* MESH_H_ */
|