nuclear@6: #ifndef MESH_H_ nuclear@6: #define MESH_H_ nuclear@6: nuclear@23: #include nuclear@6: #include nuclear@24: #include nuclear@6: nuclear@6: struct Vertex { nuclear@9: float pos[4]; nuclear@9: float normal[4]; nuclear@12: float tex[4]; nuclear@12: float padding[4]; nuclear@6: }; nuclear@6: nuclear@6: struct Face { nuclear@6: Vertex v[3]; nuclear@9: float normal[4]; nuclear@6: int matid; nuclear@12: int padding[3]; John@15: John@15: bool operator ==(const Face &f) const; nuclear@6: }; nuclear@6: nuclear@6: struct Material { nuclear@9: float kd[4], ks[4]; nuclear@6: float kr, kt; nuclear@6: float spow; nuclear@12: float padding; nuclear@6: }; nuclear@6: nuclear@6: struct Mesh { nuclear@6: std::vector faces; nuclear@6: int matid; nuclear@6: }; nuclear@6: nuclear@25: class AABBox { nuclear@25: public: nuclear@25: float min[4], max[4]; nuclear@25: nuclear@25: float calc_surface_area() const; nuclear@25: }; nuclear@25: nuclear@23: enum { nuclear@22: KDAXIS_X, nuclear@22: KDAXIS_Y, nuclear@22: KDAXIS_Z nuclear@22: }; nuclear@22: nuclear@22: #define KDCLEAR(node) ((node)->axis = -1) nuclear@22: #define KDUSED(node) ((node)->axis >= 0) nuclear@22: #define KDPARENT(x) ((x) >> 1) nuclear@22: #define KDLEFT(x) ((x) << 1) nuclear@22: #define KDRIGHT(x) (((x) << 1) + 1) nuclear@22: nuclear@22: struct KDNode { nuclear@22: int axis; nuclear@22: float pt; nuclear@25: AABBox aabb; nuclear@24: nuclear@24: KDNode *left, *right; nuclear@25: std::list faces; nuclear@23: }; nuclear@22: nuclear@24: struct KDNodeGPU { nuclear@24: int axis; nuclear@24: float pt; nuclear@24: }; nuclear@24: nuclear@24: nuclear@6: class Scene { nuclear@24: private: nuclear@24: mutable Face *facebuf; nuclear@24: mutable int num_faces; nuclear@24: nuclear@6: public: nuclear@6: std::vector meshes; nuclear@6: std::vector matlib; nuclear@24: nuclear@24: KDNode *kdtree; nuclear@24: std::vector kdtree_gpu; nuclear@24: nuclear@24: Scene(); nuclear@24: ~Scene(); nuclear@6: nuclear@13: bool add_mesh(Mesh *m); John@14: int get_num_meshes() const; John@14: int get_num_materials() const; John@14: int get_num_faces() const; nuclear@13: John@14: Material *get_materials(); John@14: const Material *get_materials() const; nuclear@13: nuclear@6: bool load(const char *fname); nuclear@6: bool load(FILE *fp); nuclear@22: nuclear@24: const Face *get_face_buffer() const; nuclear@23: void build_kdtree(); nuclear@6: }; nuclear@6: nuclear@6: #endif /* MESH_H_ */