#ifndef SURFACE_H #define SURFACE_H #include "model.hpp" #define MAX_SURFACE_BONES 4 class Surface{ public: struct Vertex{ Vector coords; Vector normal; unsigned color; float tex_coords[2][2]; unsigned char bone_bones[MAX_SURFACE_BONES]; float bone_weights[MAX_SURFACE_BONES]; Vertex():color(~0){ bone_bones[0]=255; memset(tex_coords,0,sizeof(tex_coords)); } bool operator<( const Vertex &t )const{ return memcmp( this,&t,sizeof(*this) )==-1; } }; struct Triangle{ unsigned short verts[3]; }; struct Bone{ Transform coord_tform; Matrix normal_tform; }; struct Monitor{ int brush_changes,geom_changes; }; Surface(); Surface( Monitor *mon ); ~Surface(); void setName( const string &t ); void setBrush( const Brush &b ); void clear( bool verts,bool tris ); void addVertex( const Vertex &v ){ vertices.push_back(v); ++mon->geom_changes; } void setVertex( int n,const Vertex &v ){ vertices[n]=v; if( ngeom_changes; } void setCoords( int n,const Vector &v ){ vertices[n].coords=v; if( ngeom_changes; } void setNormal( int n,const Vector &v ){ vertices[n].normal=v; if( ngeom_changes; } void setTriangle( int n,const Triangle &t ){ triangles[n]=t; if( ngeom_changes; } Vector getColor( int index )const; void setColor( int index,const Vector &v ); void addVertices( const vector &verts ); void addTriangles( const vector &tris ); void updateNormals(); gxMesh *getMesh(); gxMesh *getMesh( const vector &bones ); string getName()const{ return name; } const Brush &getBrush()const{ return brush; } int numVertices()const{ return vertices.size(); } int numTriangles()const{ return triangles.size(); } const Vertex &getVertex( int n )const{ return vertices[n]; } const Triangle &getTriangle( int n )const{ return triangles[n]; } private: Brush brush; string name; gxMesh *mesh; vector vertices; vector triangles; int mesh_vs,mesh_ts; int valid_vs,valid_ts; Monitor *mon; }; #endif