nuclear@8: #ifndef MESH_H_ nuclear@8: #define MESH_H_ nuclear@8: nuclear@8: #include nuclear@8: #include nuclear@8: nuclear@8: enum MeshAttrib { nuclear@8: MESH_VERTEX, nuclear@8: MESH_NORMAL, nuclear@8: MESH_TEXCOORD, nuclear@8: MESH_TANGENT, nuclear@8: nuclear@8: NUM_MESH_ATTRIBS nuclear@8: }; nuclear@8: nuclear@8: struct MeshAttribData { nuclear@8: std::vector data; nuclear@8: int nelems; nuclear@8: int sdrloc; nuclear@8: nuclear@8: int vbo_size; nuclear@8: unsigned int vbo; nuclear@8: bool vbo_valid; nuclear@8: }; nuclear@8: nuclear@8: struct MeshFace { nuclear@8: int vcount; nuclear@8: Vector3 v[4]; nuclear@8: }; nuclear@8: nuclear@8: class Mesh { nuclear@8: private: nuclear@8: int prim, prim_verts; nuclear@8: MeshAttribData attrib[NUM_MESH_ATTRIBS]; nuclear@8: int num_verts; nuclear@8: nuclear@8: std::vector index; nuclear@8: int num_idx; nuclear@8: unsigned int ibo; nuclear@8: int ibo_size; nuclear@8: bool ibo_valid; nuclear@8: nuclear@8: unsigned int vbo_usage, ibo_usage; nuclear@8: nuclear@8: Vector3 cur_norm, cur_tang; nuclear@8: Vector2 cur_tc; nuclear@8: bool cur_norm_valid, cur_tc_valid, cur_tang_valid; nuclear@8: nuclear@14: void update_buffers(); nuclear@14: nuclear@8: public: nuclear@8: Mesh(); nuclear@8: ~Mesh(); nuclear@8: nuclear@8: void clear(); nuclear@8: nuclear@8: void set_primitive(int prim = -1); nuclear@8: void set_attrib_location(int attr, int loc); nuclear@8: nuclear@8: float *set_vertex_data(int attr, int nelem, int count, float *data = 0); nuclear@8: unsigned int *set_index_data(int count, unsigned int *data = 0); nuclear@8: nuclear@8: int get_vertex_count() const; nuclear@8: float *get_vertex_data(int attr); nuclear@8: const float *get_vertex_data(int attr) const; nuclear@8: nuclear@8: int get_index_count() const; nuclear@8: unsigned int *get_index_data(); nuclear@8: const unsigned int *get_index_data() const; nuclear@8: nuclear@8: int get_face_count() const; nuclear@8: MeshFace get_face(int idx) const; nuclear@8: nuclear@8: void begin(int prim = -1); nuclear@8: void end(); nuclear@8: nuclear@8: void vertex(float x, float y, float z); nuclear@8: void normal(float x, float y, float z); nuclear@8: void texcoord(float x, float y); nuclear@8: void tangent(float x, float y, float z); nuclear@8: nuclear@8: void draw() const; nuclear@8: }; nuclear@8: nuclear@8: #endif // MESH_H_