nuclear@6: #ifndef MESH_H_ nuclear@6: #define MESH_H_ nuclear@6: nuclear@23: #include nuclear@6: #include nuclear@24: #include nuclear@45: #include "common.h" 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]; 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@54: struct Light { nuclear@54: float pos[4], color[4]; nuclear@54: }; nuclear@54: 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@22: struct KDNode { nuclear@37: int axis; nuclear@25: AABBox aabb; nuclear@26: float cost; nuclear@24: nuclear@24: KDNode *left, *right; nuclear@32: std::vector face_idx; nuclear@26: nuclear@26: KDNode(); nuclear@23: }; nuclear@22: nuclear@24: struct KDNodeGPU { nuclear@28: AABBox aabb; nuclear@43: int face_idx[MAX_NODE_FACES]; nuclear@28: int num_faces; nuclear@35: int left, right; nuclear@35: int padding; 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@28: mutable KDNodeGPU *kdbuf; nuclear@28: nuclear@6: public: nuclear@6: std::vector meshes; nuclear@54: std::vector lights; nuclear@6: std::vector matlib; nuclear@24: KDNode *kdtree; nuclear@24: nuclear@24: Scene(); nuclear@24: ~Scene(); nuclear@6: nuclear@13: bool add_mesh(Mesh *m); nuclear@54: bool add_light(const Light <); nuclear@54: John@14: int get_num_meshes() const; nuclear@54: int get_num_lights() const; nuclear@35: int get_num_faces() const; John@14: int get_num_materials() const; nuclear@35: int get_num_kdnodes() const; nuclear@13: nuclear@54: Mesh **get_meshes(); nuclear@54: const Mesh * const *get_meshes() const; nuclear@54: nuclear@54: Light *get_lights(); nuclear@54: const Light *get_lights() const; nuclear@54: 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@28: const KDNodeGPU *get_kdtree_buffer() const; nuclear@27: nuclear@27: void draw_kdtree() const; nuclear@27: bool build_kdtree(); nuclear@6: }; nuclear@6: nuclear@26: enum { nuclear@26: ACCEL_PARAM_MAX_TREE_DEPTH, nuclear@26: ACCEL_PARAM_MAX_NODE_ITEMS, nuclear@26: ACCEL_PARAM_COST_TRAVERSE, nuclear@26: ACCEL_PARAM_COST_INTERSECT, nuclear@26: nuclear@26: NUM_ACCEL_PARAMS nuclear@26: }; nuclear@26: nuclear@26: void set_accel_param(int p, int v); nuclear@26: nuclear@28: int kdtree_depth(const KDNode *tree); nuclear@28: int kdtree_nodes(const KDNode *tree); nuclear@28: nuclear@32: bool kdtree_dump(const KDNode *tree, const char *fname); nuclear@32: KDNode *kdtree_restore(const char *fname); nuclear@32: nuclear@6: #endif /* MESH_H_ */