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