#ifndef _PIECEINF_H_ #define _PIECEINF_H_ #include #ifndef GLuint #include "opengl.h" #endif #include "lc_math.h" #include "lc_array.h" #include "lc_mesh.h" #define LC_PIECE_HAS_DEFAULT 0x01 // Piece has triangles using the default color #define LC_PIECE_HAS_SOLID 0x02 // Piece has triangles using a solid color #define LC_PIECE_HAS_TRANSLUCENT 0x04 // Piece has triangles using a translucent color #define LC_PIECE_HAS_LINES 0x08 // Piece has lines #define LC_PIECE_PLACEHOLDER 0x10 // Placeholder for a piece not in the library #define LC_PIECE_CACHED 0x20 // Piece is saved in the library cache #define LC_PIECE_GENERATED 0x40 // Mesh is generated in code #define LC_PIECE_NAME_LEN 256 class PieceInfo { public: PieceInfo(int ZipFileIndex); ~PieceInfo(); int AddRef() { mRefCount++; if (mRefCount == 1) Load(); return mRefCount; } int Release() { mRefCount--; if (!mRefCount) Unload(); return mRefCount; } bool IsPatterned() const { const char* Name = m_strName; while (*Name) { if (*Name < '0' || *Name > '9') break; Name++; } if (*Name == 'P') return true; return false; } bool IsSubPiece() const { return (m_strDescription[0] == '~'); } lcVector3 GetCenter() const { return lcVector3((m_fDimensions[0] + m_fDimensions[3]) * 0.5f, (m_fDimensions[1] + m_fDimensions[4]) * 0.5f, (m_fDimensions[2] + m_fDimensions[5]) * 0.5f); } // Operations void ZoomExtents(float Fov, float Aspect, float* EyePos = NULL) const; void RenderPiece(int nColor); void AddRenderMeshes(const lcMatrix44& ViewMatrix, lcMatrix44* WorldMatrix, int ColorIndex, bool Focused, bool Selected, lcArray& OpaqueMeshes, lcArray& TranslucentMeshes); void CreatePlaceholder(const char* Name); public: lcMesh* mMesh; // Attributes char m_strName[LC_PIECE_NAME_LEN]; char m_strDescription[128]; float m_fDimensions[6]; lcuint32 mZipFileIndex; lcuint32 mFlags; protected: int mRefCount; void Load(); void Unload(); }; #endif // _PIECEINF_H_