/* * PVVMUD a 3D MUD * Copyright (C) 1998-1999 Programvareverkstedet (pvv@pvv.org) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _GEOMETRY_H #define _GEOMETRY_H #include "object.H" #include "objectarray.H" #include #include "cache.H" #include "texture.H" #include "material.H" #include "intarray.H" #include "doublearray.H" #include "beam.H" #include "vector.H" #include "plane.H" #include "vertex.H" #include "bbox.H" #ifdef HAVE_GL_GL_H #include #define POLYGON_TRIANGLES GL_TRIANGLES #define POLYGON_TRIANGLE_STRIP GL_TRIANGLE_STRIP #define POLYGON_TRIANGLE_FAN GL_TRIANGLE_FAN #define POLYGON_QUADS GL_QUADS #define POLYGON_QUAD_STRIP GL_QUAD_STRIP #define POLYGON_POLYGON GL_POLYGON typedef GLdouble TexCoordCoord_t; typedef GLdouble NormalVector_t; #else /* HAVE_GL_GL_H */ #define POLYGON_TRIANGLES 0x0004 #define POLYGON_TRIANGLE_STRIP 0x0005 #define POLYGON_TRIANGLE_FAN 0x0006 #define POLYGON_QUADS 0x0007 #define POLYGON_QUAD_STRIP 0x0008 #define POLYGON_POLYGON 0x0009 typedef double TexCoordCoord_t; typedef double NormalVector_t; #endif /* HAVE_GL_GL_H */ class CGeometry; class CTexCoord : public CObject{ TexCoordCoord_t m_coord[2]; public: CTexCoord(double u, double v); TexCoordCoord_t * getCoord(); void setCoord(double u, double v); double getU(); double getV(); }; class CNormal : public CObject{ NormalVector_t m_vector[3]; public: CNormal(double x, double y, double z); NormalVector_t * getVector(); void setVector(double x, double y, double z); double getX(); double getY(); double getZ(); }; class CVertexList : public CObjectArray { public: CVertexList(int size); virtual ~CVertexList(); int add( double x, double y, double z ); void set( int index, double x, double y, double z ); void get( int index, double * x, double * y, double * z ); VertexCoord_t * get( int index ); CVertex * getVertex( int index ); int getSize(); }; class CNormalList : public CObjectArray { public: CNormalList(int size); virtual ~CNormalList(); int add(double x, double y, double z); void set( int index, double x, double y, double z ); void get(int index, double * x, double * y, double * z ); NormalVector_t * get( int index ); CNormal * getNormal( int index ); }; class CTexCoordList : public CObjectArray { public: CTexCoordList(int size); virtual ~CTexCoordList(); int add( double u, double v); void set( int index, double u, double v ); void get( int index, double * u, double * v ); TexCoordCoord_t * get( int index ); CTexCoord * getTexCoord( int index ); }; class CPolygon; class CPolygonList : public CObjectArray { CGeometry * m_geometry; public: CPolygonList(CGeometry * geometry,int size); virtual ~CPolygonList(); int add( CPolygon * polygon ); void set( int index, CPolygon * polygon ); CPolygon * get(int index ); }; class CPolygon : public CObject{ int m_materialId; int m_type; /* POLYGON_QUADS , POLYGON_POLYGON , etc */ CIntArray * m_vertexIndexList; CIntArray * m_normalIndexList; CIntArray * m_texCoordIndexList; CGeometry * m_geometry; public: CPolygon(int type, int materialId, int numVertices, int numNormals, int numTexCoords); virtual ~CPolygon(); void setGeometry(CGeometry * geometry); void get( int * type, int * materialId, int * numVertices, int * numNormals, int * numTexCoords ); int getType(); void setMaterial( int materialId ); int getMaterial(); int addVertexIndex( int vertexIndex ); void setVertexIndex( int index, int vertexIndex ); int getVertexIndex( int index ); CVertex * getVertex( int index ); int addNormalIndex( int normalIndex ); void setNormalIndex( int index, int normalIndex ); int getNormalIndex( int index ); CNormal * getNormal( int index ); int addTexCoordIndex( int texCoordIndex ); void setTexCoordIndex( int index, int texCoordIndex ); int getTexCoordIndex( int index ); CTexCoord * getTexCoord( int index ); CIntArray * getVertexIList(); int getNumVertices(); CIntArray * getNormalIList(); CIntArray * getTexCoordIList(); void distances(CDoubleArray & distArray, const CBeam & beam); CDoubleArray* distances(const CBeam & beam); }; class CGeometry : public CObject{ protected: int id,subid; CGeometry * next; CVertexList * vertexList; CNormalList * normalList; CTexCoordList * texCoordList; CPolygonList * polygonList; public: CGeometry(int objectGeometryId); CGeometry(int objectGeometryId, int numVertices, int numNormals, int numTexCoords, int numPolygons); virtual ~CGeometry(); virtual CGeometry * newGeometry(int geometryId); void setSize(int numVertices, int numNormals, int numTexCoords, int numPolygons); int getId(); void setId(int id); void setSubId( int subid ); int getSubId(); int getNumSubobjects(); void setNext( CGeometry * next ); CGeometry * getNext(); int addVertex( double x, double y, double z ); void getVertex( int index, double * x, double * y, double * z ); CVertex * getVertex( int index ); void setVertex( int index, double x, double y, double z ); int addNormal( double x, double y, double z ); void setNormal( int index, double x, double y, double z ); void getNormal( int index, double * x, double * y, double * z ); CNormal * getNormal( int index ); int addTexCoord( double u, double v ); void setTexCoord( int index, double u, double v ); void getTexCoord( int index, double * u, double * v ); CTexCoord * getTexCoord( int index ); virtual int draw( CMaterialCache * matCache, CTextureCache * texCache ); int addPolygon( CPolygon * polygon ); void setPolygon( int index, CPolygon * polygon ); CPolygon * getPolygon(int index ); int getNumVertices(); int getNumNormals(); int getNumTexCoords(); int getNumPolygons(); int scale( double scale ); // int ReadBOG(int objId, FILE * bog); void distances(CDoubleArray & distArray, const CBeam & beam, double min, double max); CDoubleArray * distances(const CBeam & beam, double min, double max); CBBox calculateBBox(); void load(char * name); void save(char * name); void readBOG(FILE * bog); int writeBOG(FILE * bog); private: int readBOGCore(FILE * bog, int numV, int numN, int numTC, int numP); }; class CGeometryCache : public CCache { public: CGeometryCache(); virtual ~CGeometryCache(); CGeometry * add( CGeometry * objGeo ); CGeometry * get( int id ); }; #endif /* _GEOMETRY_H */