/* =========================================================================== Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). Doom 3 BFG Edition Source Code 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 3 of the License, or (at your option) any later version. Doom 3 BFG Edition Source Code 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 Doom 3 BFG Edition Source Code. If not, see . In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ #ifndef __MODEL_LOCAL_H__ #define __MODEL_LOCAL_H__ /* =============================================================================== Static model =============================================================================== */ class idJointMat; struct deformInfo_t; class idRenderModelStatic : public idRenderModel { public: // the inherited public interface static idRenderModel* Alloc(); idRenderModelStatic(); virtual ~idRenderModelStatic(); virtual void InitFromFile( const char* fileName ); virtual bool LoadBinaryModel( idFile* file, const ID_TIME_T sourceTimeStamp ); virtual void WriteBinaryModel( idFile* file, ID_TIME_T* _timeStamp = NULL ) const; virtual bool SupportsBinaryModel() { return true; } virtual void PartialInitFromFile( const char* fileName ); virtual void PurgeModel(); virtual void Reset() {}; virtual void LoadModel(); virtual bool IsLoaded(); virtual void SetLevelLoadReferenced( bool referenced ); virtual bool IsLevelLoadReferenced(); virtual void TouchData(); virtual void InitEmpty( const char* name ); virtual void AddSurface( modelSurface_t surface ); virtual void FinishSurfaces(); virtual void FreeVertexCache(); virtual const char* Name() const; virtual void Print() const; virtual void List() const; virtual int Memory() const; virtual ID_TIME_T Timestamp() const; virtual int NumSurfaces() const; virtual int NumBaseSurfaces() const; virtual const modelSurface_t* Surface( int surfaceNum ) const; virtual srfTriangles_t* AllocSurfaceTriangles( int numVerts, int numIndexes ) const; virtual void FreeSurfaceTriangles( srfTriangles_t* tris ) const; virtual bool IsStaticWorldModel() const; virtual dynamicModel_t IsDynamicModel() const; virtual bool IsDefaultModel() const; virtual bool IsReloadable() const; virtual idRenderModel* InstantiateDynamicModel( const struct renderEntity_s* ent, const viewDef_t* view, idRenderModel* cachedModel ); virtual int NumJoints() const; virtual const idMD5Joint* GetJoints() const; virtual jointHandle_t GetJointHandle( const char* name ) const; virtual const char* GetJointName( jointHandle_t handle ) const; virtual const idJointQuat* GetDefaultPose() const; virtual int NearestJoint( int surfaceNum, int a, int b, int c ) const; virtual idBounds Bounds( const struct renderEntity_s* ent ) const; virtual void ReadFromDemoFile( class idDemoFile* f ); virtual void WriteToDemoFile( class idDemoFile* f ); virtual float DepthHack() const; virtual bool ModelHasDrawingSurfaces() const { return hasDrawingSurfaces; }; virtual bool ModelHasInteractingSurfaces() const { return hasInteractingSurfaces; }; virtual bool ModelHasShadowCastingSurfaces() const { return hasShadowCastingSurfaces; }; void MakeDefaultModel(); bool LoadASE( const char* fileName ); bool LoadLWO( const char* fileName ); bool LoadMA( const char* filename ); bool ConvertASEToModelSurfaces( const struct aseModel_s* ase ); bool ConvertLWOToModelSurfaces( const struct st_lwObject* lwo ); bool ConvertMAToModelSurfaces( const struct maModel_s* ma ); struct aseModel_s* ConvertLWOToASE( const struct st_lwObject* obj, const char* fileName ); bool DeleteSurfaceWithId( int id ); void DeleteSurfacesWithNegativeId(); bool FindSurfaceWithId( int id, int& surfaceNum ) const; public: idList surfaces; idBounds bounds; int overlaysAdded; // when an md5 is instantiated, the inverted joints array is stored to allow GPU skinning int numInvertedJoints; idJointMat* jointsInverted; vertCacheHandle_t jointsInvertedBuffer; protected: int lastModifiedFrame; int lastArchivedFrame; idStr name; bool isStaticWorldModel; bool defaulted; bool purged; // eventually we will have dynamic reloading bool fastLoad; // don't generate tangents and shadow data bool reloadable; // if not, reloadModels won't check timestamp bool levelLoadReferenced; // for determining if it needs to be freed bool hasDrawingSurfaces; bool hasInteractingSurfaces; bool hasShadowCastingSurfaces; ID_TIME_T timeStamp; static idCVar r_mergeModelSurfaces; // combine model surfaces with the same material static idCVar r_slopVertex; // merge xyz coordinates this far apart static idCVar r_slopTexCoord; // merge texture coordinates this far apart static idCVar r_slopNormal; // merge normals that dot less than this }; /* =============================================================================== MD5 animated model =============================================================================== */ class idMD5Mesh { friend class idRenderModelMD5; public: idMD5Mesh(); ~idMD5Mesh(); void ParseMesh( idLexer& parser, int numJoints, const idJointMat* joints ); int NumVerts() const { return numVerts; } int NumTris() const { return numTris; } void UpdateSurface( const struct renderEntity_s* ent, const idJointMat* joints, const idJointMat* entJointsInverted, modelSurface_t* surf ); void CalculateBounds( const idJointMat* entJoints, idBounds& bounds ) const; int NearestJoint( int a, int b, int c ) const; private: const idMaterial* shader; // material applied to mesh int numVerts; // number of vertices int numTris; // number of triangles byte* meshJoints; // the joints used by this mesh int numMeshJoints; // number of mesh joints float maxJointVertDist; // maximum distance a vertex is separated from a joint deformInfo_t* deformInfo; // used to create srfTriangles_t from base frames and new vertexes int surfaceNum; // number of the static surface created for this mesh }; class idRenderModelMD5 : public idRenderModelStatic { public: virtual void InitFromFile( const char* fileName ); virtual bool LoadBinaryModel( idFile* file, const ID_TIME_T sourceTimeStamp ); virtual void WriteBinaryModel( idFile* file, ID_TIME_T* _timeStamp = NULL ) const; virtual dynamicModel_t IsDynamicModel() const; virtual idBounds Bounds( const struct renderEntity_s* ent ) const; virtual void Print() const; virtual void List() const; virtual void TouchData(); virtual void PurgeModel(); virtual void LoadModel(); virtual int Memory() const; virtual idRenderModel* InstantiateDynamicModel( const struct renderEntity_s* ent, const viewDef_t* view, idRenderModel* cachedModel ); virtual int NumJoints() const; virtual const idMD5Joint* GetJoints() const; virtual jointHandle_t GetJointHandle( const char* name ) const; virtual const char* GetJointName( jointHandle_t handle ) const; virtual const idJointQuat* GetDefaultPose() const; virtual int NearestJoint( int surfaceNum, int a, int b, int c ) const; virtual bool SupportsBinaryModel() { return true; } private: idList joints; idList defaultPose; idList invertedDefaultPose; idList meshes; void DrawJoints( const renderEntity_t* ent, const viewDef_t* view ) const; void ParseJoint( idLexer& parser, idMD5Joint* joint, idJointQuat* defaultPose ); }; /* =============================================================================== MD3 animated model =============================================================================== */ struct md3Header_s; struct md3Surface_s; class idRenderModelMD3 : public idRenderModelStatic { public: virtual void InitFromFile( const char* fileName ); virtual bool SupportsBinaryModel() { return false; } virtual dynamicModel_t IsDynamicModel() const; virtual idRenderModel* InstantiateDynamicModel( const struct renderEntity_s* ent, const viewDef_t* view, idRenderModel* cachedModel ); virtual idBounds Bounds( const struct renderEntity_s* ent ) const; private: int index; // model = tr.models[model->index] int dataSize; // just for listing purposes struct md3Header_s* md3; // only if type == MOD_MESH int numLods; void LerpMeshVertexes( srfTriangles_t* tri, const struct md3Surface_s* surf, const float backlerp, const int frame, const int oldframe ) const; }; /* =============================================================================== Liquid model =============================================================================== */ class idRenderModelLiquid : public idRenderModelStatic { public: idRenderModelLiquid(); virtual void InitFromFile( const char* fileName ); virtual bool SupportsBinaryModel() { return false; } virtual dynamicModel_t IsDynamicModel() const; virtual idRenderModel* InstantiateDynamicModel( const struct renderEntity_s* ent, const viewDef_t* view, idRenderModel* cachedModel ); virtual idBounds Bounds( const struct renderEntity_s* ent ) const; virtual void Reset(); void IntersectBounds( const idBounds& bounds, float displacement ); private: modelSurface_t GenerateSurface( float lerp ); void WaterDrop( int x, int y, float* page ); void Update(); int verts_x; int verts_y; float scale_x; float scale_y; int time; int liquid_type; int update_tics; int seed; idRandom random; const idMaterial* shader; deformInfo_t* deformInfo; // used to create srfTriangles_t from base frames // and new vertexes float density; float drop_height; int drop_radius; float drop_delay; idList pages; float* page1; float* page2; idList verts; int nextDropTime; }; /* =============================================================================== PRT model =============================================================================== */ class idRenderModelPrt : public idRenderModelStatic { public: idRenderModelPrt(); virtual void InitFromFile( const char* fileName ); virtual bool SupportsBinaryModel() { return false; } virtual void TouchData(); virtual dynamicModel_t IsDynamicModel() const; virtual idRenderModel* InstantiateDynamicModel( const struct renderEntity_s* ent, const viewDef_t* view, idRenderModel* cachedModel ); virtual idBounds Bounds( const struct renderEntity_s* ent ) const; virtual float DepthHack() const; virtual int Memory() const; // with the addModels2 arrangement we could have light accepting and // shadowing dynamic models, but the original game never did virtual bool ModelHasDrawingSurfaces() const { return true; }; virtual bool ModelHasInteractingSurfaces() const { return false; }; virtual bool ModelHasShadowCastingSurfaces() const { return false; }; private: const idDeclParticle* particleSystem; }; /* =============================================================================== Beam model =============================================================================== */ class idRenderModelBeam : public idRenderModelStatic { public: virtual dynamicModel_t IsDynamicModel() const; virtual bool SupportsBinaryModel() { return false; } virtual bool IsLoaded() const; virtual idRenderModel* InstantiateDynamicModel( const struct renderEntity_s* ent, const viewDef_t* view, idRenderModel* cachedModel ); virtual idBounds Bounds( const struct renderEntity_s* ent ) const; // with the addModels2 arrangement we could have light accepting and // shadowing dynamic models, but the original game never did virtual bool ModelHasDrawingSurfaces() const { return true; }; virtual bool ModelHasInteractingSurfaces() const { return false; }; virtual bool ModelHasShadowCastingSurfaces() const { return false; }; }; /* =============================================================================== Beam model =============================================================================== */ #define MAX_TRAIL_PTS 20 struct Trail_t { int lastUpdateTime; int duration; idVec3 pts[MAX_TRAIL_PTS]; int numPoints; }; class idRenderModelTrail : public idRenderModelStatic { idList trails; int numActive; idBounds trailBounds; public: idRenderModelTrail(); virtual dynamicModel_t IsDynamicModel() const; virtual bool SupportsBinaryModel() { return false; } virtual bool IsLoaded() const; virtual idRenderModel* InstantiateDynamicModel( const struct renderEntity_s* ent, const viewDef_t* view, idRenderModel* cachedModel ); virtual idBounds Bounds( const struct renderEntity_s* ent ) const; // with the addModels2 arrangement we could have light accepting and // shadowing dynamic models, but the original game never did virtual bool ModelHasDrawingSurfaces() const { return true; }; virtual bool ModelHasInteractingSurfaces() const { return false; }; virtual bool ModelHasShadowCastingSurfaces() const { return false; }; int NewTrail( idVec3 pt, int duration ); void UpdateTrail( int index, idVec3 pt ); void DrawTrail( int index, const struct renderEntity_s* ent, srfTriangles_t* tri, float globalAlpha ); }; /* =============================================================================== Lightning model =============================================================================== */ class idRenderModelLightning : public idRenderModelStatic { public: virtual dynamicModel_t IsDynamicModel() const; virtual bool SupportsBinaryModel() { return false; } virtual bool IsLoaded() const; virtual idRenderModel* InstantiateDynamicModel( const struct renderEntity_s* ent, const viewDef_t* view, idRenderModel* cachedModel ); virtual idBounds Bounds( const struct renderEntity_s* ent ) const; // with the addModels2 arrangement we could have light accepting and // shadowing dynamic models, but the original game never did virtual bool ModelHasDrawingSurfaces() const { return true; }; virtual bool ModelHasInteractingSurfaces() const { return false; }; virtual bool ModelHasShadowCastingSurfaces() const { return false; }; }; /* ================================================================================ idRenderModelSprite ================================================================================ */ class idRenderModelSprite : public idRenderModelStatic { public: virtual dynamicModel_t IsDynamicModel() const; virtual bool SupportsBinaryModel() { return false; } virtual bool IsLoaded() const; virtual idRenderModel* InstantiateDynamicModel( const struct renderEntity_s* ent, const viewDef_t* view, idRenderModel* cachedModel ); virtual idBounds Bounds( const struct renderEntity_s* ent ) const; // with the addModels2 arrangement we could have light accepting and // shadowing dynamic models, but the original game never did virtual bool ModelHasDrawingSurfaces() const { return true; }; virtual bool ModelHasInteractingSurfaces() const { return false; }; virtual bool ModelHasShadowCastingSurfaces() const { return false; }; }; #endif /* !__MODEL_LOCAL_H__ */