// ============================================================== // This file is part of Glest Shared Library (www.glest.org) // // Copyright (C) 2001-2008 MartiƱo Figueroa // // You can redistribute this code 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 // ============================================================== #ifndef _SHARED_GRAPHICS_MODEL_H_ #define _SHARED_GRAPHICS_MODEL_H_ #include #include #include "data_types.h" #include "pixmap.h" #include "texture_manager.h" #include "texture.h" #include "model_header.h" #include #include "common_scoped_ptr.h" #include "byte_order.h" #include "leak_dumper.h" using std::string; using std::map; using std::pair; namespace Shared { namespace Graphics { class Model; class Mesh; class ShadowVolumeData; class InterpolationData; class TextureManager; // ===================================================== // class Mesh // // Part of a 3D model // ===================================================== class Mesh { private: //mesh data Texture2D *textures[meshTextureCount]; bool texturesOwned[meshTextureCount]; string texturePaths[meshTextureCount]; string name; //vertex data counts uint32 frameCount; uint32 vertexCount; uint32 indexCount; uint32 texCoordFrameCount; //vertex data Vec3f *vertices; Vec3f *normals; Vec2f *texCoords; Vec3f *tangents; uint32 *indices; //material data Vec3f diffuseColor; Vec3f specularColor; float specularPower; float opacity; //properties bool twoSided; bool customColor; bool noSelect; bool glow; uint32 textureFlags; InterpolationData *interpolationData; TextureManager *textureManager; // Vertex Buffer Object Names bool hasBuiltVBOs; uint32 m_nVBOVertices; // Vertex VBO Name uint32 m_nVBOTexCoords; // Texture Coordinate VBO Name uint32 m_nVBONormals; // Normal VBO Name uint32 m_nVBOIndexes; // Indexes VBO Name public: //init & end Mesh(); ~Mesh(); void init(); void end(); void copyInto(Mesh *dest, bool ignoreInterpolationData, bool destinationOwnsTextures); //maps const Texture2D *getTexture(int i) const { return textures[i]; } //counts uint32 getFrameCount() const { return frameCount; } uint32 getVertexCount() const { return vertexCount; } uint32 getIndexCount() const { return indexCount; } uint32 getTriangleCount() const; uint32 getVBOVertices() const { return m_nVBOVertices; } uint32 getVBOTexCoords() const { return m_nVBOTexCoords; } uint32 getVBONormals() const { return m_nVBONormals; } uint32 getVBOIndexes() const { return m_nVBOIndexes; } bool hasBuiltVBOEntities() const { return hasBuiltVBOs; } void BuildVBOs(); void ReleaseVBOs(); //data const Vec3f *getVertices() const { return vertices; } const Vec3f *getNormals() const { return normals; } const Vec2f *getTexCoords() const { return texCoords; } const Vec3f *getTangents() const { return tangents; } const uint32 *getIndices() const { return indices; } void setVertices(Vec3f *data, uint32 count); void setNormals(Vec3f *data, uint32 count); void setTexCoords(Vec2f *data, uint32 count); void setIndices(uint32 *data, uint32 count); //material const Vec3f &getDiffuseColor() const { return diffuseColor; } const Vec3f &getSpecularColor() const { return specularColor; } float getSpecularPower() const { return specularPower; } float getOpacity() const { return opacity; } //properties bool getTwoSided() const { return twoSided; } bool getCustomTexture() const { return customColor; } bool getNoSelect() const { return noSelect; } bool getGlow() const { return glow; } string getName() const { return name; } uint32 getTextureFlags() const { return textureFlags; } //external data const InterpolationData *getInterpolationData() const { return interpolationData; } //interpolation void buildInterpolationData(); void cleanupInterpolationData(); void updateInterpolationData(float t, bool cycle); void updateInterpolationVertices(float t, bool cycle); Texture2D *loadMeshTexture(int meshIndex, int textureIndex, TextureManager *textureManager, string textureFile, int textureChannelCount, bool &textureOwned, bool deletePixMapAfterLoad, std::map > > *loadedFileList = NULL, string sourceLoader = "", string modelFile = ""); //load void loadV2(int meshIndex, const string &dir, FILE *f, TextureManager *textureManager, bool deletePixMapAfterLoad, std::map > > *loadedFileList = NULL, string sourceLoader = "", string modelFile = ""); void loadV3(int meshIndex, const string &dir, FILE *f, TextureManager *textureManager, bool deletePixMapAfterLoad, std::map > > *loadedFileList = NULL, string sourceLoader = "", string modelFile = ""); void load(int meshIndex, const string &dir, FILE *f, TextureManager *textureManager, bool deletePixMapAfterLoad, std::map > > *loadedFileList = NULL, string sourceLoader = "", string modelFile = ""); void save(int meshIndex, const string &dir, FILE *f, TextureManager *textureManager, string convertTextureToFormat, std::map &textureDeleteList, bool keepsmallest, string modelFile); void deletePixels(); void toEndian(); void fromEndian(); private: string findAlternateTexture(vector conversionList, string textureFile); void computeTangents(); }; // ===================================================== // class Model // // 3D Model, than can be loaded from a g3d file // ===================================================== class Model { private: TextureManager *textureManager; private: uint8 fileVersion; uint32 meshCount; Mesh *meshes; float lastTData; bool lastCycleData; float lastTVertex; bool lastCycleVertex; string fileName; string sourceLoader; //static bool masterserverMode; public: //constructor & destructor Model(); virtual ~Model(); virtual void init() = 0; virtual void end() = 0; //static void setMasterserverMode(bool value) { masterserverMode=value; } //data void updateInterpolationData(float t, bool cycle); void updateInterpolationVertices(float t, bool cycle); void buildShadowVolumeData() const; //get uint8 getFileVersion() const { return fileVersion; } uint32 getMeshCount() const { return meshCount; } const Mesh *getMesh(int i) const { return &meshes[i]; } Mesh *getMeshPtr(int i) const { return &meshes[i]; } uint32 getTriangleCount() const; uint32 getVertexCount() const; //io void save(const string &path, string convertTextureToFormat, bool keepsmallest); void saveG3d(const string &path, string convertTextureToFormat, bool keepsmallest); void setTextureManager(TextureManager *textureManager) { this->textureManager = textureManager; } void deletePixels(); string getFileName() const { return fileName; } void toEndian(); void fromEndian(); protected: void load(const string &path, bool deletePixMapAfterLoad = false, std::map > > *loadedFileList = NULL, string *sourceLoader = NULL); void loadG3d(const string &path, bool deletePixMapAfterLoad = false, std::map > > *loadedFileList = NULL, string sourceLoader = ""); private: void buildInterpolationData() const; void autoJoinMeshFrames(); }; class PixelBufferWrapper { public: PixelBufferWrapper(int pboCount, int bufferSize); ~PixelBufferWrapper(); Pixmap2D *getPixelBufferFor(int x, int y, int w, int h, int colorComponents); static void begin(); static void end(); static bool getIsPBOEnable() { return isPBOEnabled; } private: static bool isPBOEnabled; static int index; static vector pboIds; int bufferSize; void cleanup(); void addBuffersToPixelBuf(int pboCount); }; class BaseColorPickEntity { public: BaseColorPickEntity(); virtual ~BaseColorPickEntity() { recycleUniqueColor(); } //static const int COLOR_COMPONENTS = 3; static const int COLOR_COMPONENTS = 4; static void init(int bufferSize); static void beginPicking(); static void endPicking(); static vector getPickedList(int x, int y, int w, int h, const vector &rendererModels); void setUniquePickingColor() const; bool isUniquePickingColor(unsigned char *pixel) const; string getColorDescription() const; virtual string getUniquePickName() const = 0; static void resetUniqueColors(); static void setUsingLoopMethod(bool value) { using_loop_method = value; } static void setTrackColorUse(bool value) { trackColorUse = value; } unsigned char * getUniqueColorID() { return &uniqueColorID[0]; } bool get_next_assign_color(unsigned char *assign_to); static int getUsedColorIDListSize() { return (int) usedColorIDList.size(); } static void cleanupPBO(); private: static int bufferSizeRequired; unsigned char uniqueColorID[COLOR_COMPONENTS]; static unsigned char nextColorID[COLOR_COMPONENTS]; static unsigned int nextColorRGB; static const unsigned int k, p; static bool using_loop_method; static bool trackColorUse; static map usedColorIDList; static vector > nextColorIDReuseList; static auto_ptr pbo; //static auto_ptr cachedPixels; void assign_color(); void assign_color_using_prime(unsigned char *assign_to); void assign_color_using_loop(unsigned char *assign_to); void recycleUniqueColor(); }; } }//end namespace #endif