Changeset 406
- Timestamp:
- 10/11/11 22:01:42 (7 months ago)
- Location:
- cafu/trunk
- Files:
-
- 2 added
- 2 removed
- 16 modified
-
CaWE/ModelEditor/ModelDocument.cpp (modified) (2 diffs)
-
Libs/Models/AnimPose.cpp (modified) (7 diffs)
-
Libs/Models/AnimPose.hpp (modified) (4 diffs)
-
Libs/Models/Loader.hpp (modified) (2 diffs)
-
Libs/Models/Loader_ase.hpp (modified) (1 diff)
-
Libs/Models/Loader_assimp.hpp (modified) (1 diff)
-
Libs/Models/Loader_cmdl.hpp (modified) (1 diff)
-
Libs/Models/Loader_dlod.cpp (added)
-
Libs/Models/Loader_dlod.hpp (added)
-
Libs/Models/Loader_fbx.hpp (modified) (1 diff)
-
Libs/Models/Loader_lwo.hpp (modified) (1 diff)
-
Libs/Models/Loader_md5.hpp (modified) (1 diff)
-
Libs/Models/Loader_mdl.cpp (modified) (1 diff)
-
Libs/Models/Loader_mdl.hpp (modified) (1 diff)
-
Libs/Models/Model_cmdl.cpp (modified) (5 diffs)
-
Libs/Models/Model_cmdl.hpp (modified) (2 diffs)
-
Libs/Models/Model_dlod.cpp (deleted)
-
Libs/Models/Model_dlod.hpp (deleted)
-
Libs/Models/Model_proxy.cpp (modified) (2 diffs)
-
Libs/SConscript (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
cafu/trunk/CaWE/ModelEditor/ModelDocument.cpp
r400 r406 30 30 #include "Models/Loader_assimp.hpp" 31 31 #include "Models/Loader_cmdl.hpp" 32 #include "Models/Loader_dlod.hpp" 32 33 #include "Models/Loader_fbx.hpp" 33 34 #include "Models/Loader_lwo.hpp" … … 271 272 else if (cf::String::EndsWith(fn, "dxf" )) { LoaderFbxT Loader(fn, UserCbs, Flags); return new CafuModelT(Loader); } 272 273 else if (cf::String::EndsWith(fn, "fbx" )) { LoaderFbxT Loader(fn, UserCbs, Flags); return new CafuModelT(Loader); } 273 // else if (cf::String::EndsWith(fn, "dlod" )) return new ModelDlodT(fn);274 else if (cf::String::EndsWith(fn, "dlod" )) { LoaderDlodT Loader(fn, Flags); return new CafuModelT(Loader); } 274 275 else if (cf::String::EndsWith(fn, "lwo" )) { LoaderLwoT Loader(fn, Flags); return new CafuModelT(Loader); } 275 276 else if (cf::String::EndsWith(fn, "mdl" )) { LoaderHL1mdlT Loader(fn, Flags); return new CafuModelT(Loader); } -
cafu/trunk/Libs/Models/AnimPose.cpp
r403 r406 34 34 m_FrameNr(FrameNr), 35 35 m_Super(NULL), 36 m_DlodPose(m_Model.GetDlodModel() ? new AnimPoseT(*m_Model.GetDlodModel(), SequNr, FrameNr) : NULL), // Recursively create the chain of dlod poses matching the chain of dlod models. 36 37 m_NeedsRecache(true), 37 38 m_BoundingBox() … … 41 42 42 43 44 AnimPoseT::~AnimPoseT() 45 { 46 delete m_DlodPose; 47 } 48 49 43 50 void AnimPoseT::SetSequNr(int SequNr) 44 51 { … … 49 56 50 57 m_NeedsRecache=true; 58 59 // Recursively update the chain of dlod poses. 60 if (m_DlodPose) m_DlodPose->SetSequNr(SequNr); 51 61 } 52 62 … … 60 70 61 71 m_NeedsRecache=true; 72 73 // Recursively update the chain of dlod poses. 74 if (m_DlodPose) m_DlodPose->SetFrameNr(FrameNr); 62 75 } 63 76 … … 70 83 71 84 m_NeedsRecache=true; 85 86 // Recursively update the chain of dlod poses. 87 if (m_DlodPose) m_DlodPose->SetSuper(Super); 72 88 } 73 89 … … 102 118 103 119 SetFrameNr(FrameNr); 104 } 105 106 107 void AnimPoseT::Draw(int SkinNr, float /*LodDist*/) const 108 { 120 121 // Recursively update the chain of dlod poses. 122 if (m_DlodPose) m_DlodPose->Advance(Time, ForceLoop); 123 } 124 125 126 void AnimPoseT::Draw(int SkinNr, float LodDist) const 127 { 128 if (m_Model.GetDlodModel() && LodDist >= m_Model.GetDlodDist()) 129 { 130 m_DlodPose->Draw(SkinNr, LodDist); 131 return; 132 } 133 109 134 Recache(); 110 135 … … 263 288 bool AnimPoseT::TraceRay(int SkinNr, const Vector3fT& RayOrigin, const Vector3fT& RayDir, ModelT::TraceResultT& Result) const 264 289 { 290 // if (m_Model.GetDlodModel() && LodDist >= m_Model.GetDlodDist()) 291 // { 292 // return m_DlodPose->TraceRay(SkinNr, RayOrigin, RayDir, Result); 293 // } 294 265 295 Recache(); 266 296 -
cafu/trunk/Libs/Models/AnimPose.hpp
r402 r406 99 99 100 100 101 /// The constructor. 101 102 AnimPoseT(const CafuModelT& Model, int SequNr=-1, float FrameNr=0.0f); 103 104 /// The destructor. 105 ~AnimPoseT(); 102 106 103 107 /// @param SequenceNr The number of the animation sequence to use, -1 for the bind pose. … … 120 124 /// This method renders the model in this pose. 121 125 /// @param SkinNr The skin to render the model with, -1 for the default skin. 122 /// @param LodDist The distance to the camera for reducing the level-of-detail (currently unused).126 /// @param LodDist The distance to the camera for reducing the level-of-detail. 123 127 void Draw(int SkinNr, float LodDist) const; 124 128 … … 153 157 private: 154 158 159 AnimPoseT(const AnimPoseT&); ///< Use of the Copy Constructor is not allowed. 160 void operator = (const AnimPoseT&); ///< Use of the Assignment Operator is not allowed. 161 155 162 void NormalizeInput(); 156 163 void SyncDimensions() const; … … 162 169 float m_FrameNr; ///< The animation frame number at which we have computed the cache data. 163 170 const SuperT* m_Super; 171 AnimPoseT* m_DlodPose; ///< The next pose in the chain of dlod poses matching the chain of dlod models. 164 172 // ArrayT<...> m_Def; ///< Array of { channel, sequence, framenr, (forceloop), blendweight } tuples. 165 173 // bool m_DoCache; ///< Cache the computed data? (Set to true by the user if he want to re-use this instance.) -
cafu/trunk/Libs/Models/Loader.hpp
r391 r406 48 48 49 49 /// Returns the file name of the imported model. 50 const std::string& GetFileName() const { return m_FileName; } 50 /// This method is reimplemented in the \c LoaderDlodT class. 51 virtual const std::string& GetFileName() const { return m_FileName; } 51 52 52 53 /// Some (static, non-animated) model file formats may bring all their tangent space data with them. … … 67 68 /// Loads the animation channels (groups of joints) of the Cafu model. 68 69 virtual void Load(ArrayT<CafuModelT::ChannelT>& Channels)=0; 70 71 /// Loads the dlod-model and dlod-distance at the given level. 72 virtual bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist)=0; 69 73 70 74 /// Postprocesses the file data according to flags given to the constructor. -
cafu/trunk/Libs/Models/Loader_ase.hpp
r391 r406 44 44 void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs); 45 45 void Load(ArrayT<CafuModelT::ChannelT>& Channels) { } 46 bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 46 47 47 48 -
cafu/trunk/Libs/Models/Loader_assimp.hpp
r391 r406 48 48 void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs) { } 49 49 void Load(ArrayT<CafuModelT::ChannelT>& Channels) { } 50 bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 50 51 51 52 -
cafu/trunk/Libs/Models/Loader_cmdl.hpp
r391 r406 47 47 void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs); 48 48 void Load(ArrayT<CafuModelT::ChannelT>& Channels); 49 bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 49 50 50 51 -
cafu/trunk/Libs/Models/Loader_fbx.hpp
r391 r406 45 45 void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs); 46 46 void Load(ArrayT<CafuModelT::ChannelT>& Channels) { } 47 bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 47 48 48 49 -
cafu/trunk/Libs/Models/Loader_lwo.hpp
r391 r406 41 41 void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs) { } 42 42 void Load(ArrayT<CafuModelT::ChannelT>& Channels) { } 43 bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 43 44 44 45 -
cafu/trunk/Libs/Models/Loader_md5.hpp
r391 r406 43 43 void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs) { } 44 44 void Load(ArrayT<CafuModelT::ChannelT>& Channels) { } 45 bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 45 46 }; 46 47 -
cafu/trunk/Libs/Models/Loader_mdl.cpp
r383 r406 33 33 34 34 LoaderHL1mdlT::LoaderHL1mdlT(const std::string& FileName, int Flags) /*throw (ModelT::LoadError)*/ 35 : ModelLoaderT(FileName, Flags | REMOVE_UNUSED_VERTICES | REMOVE_UNUSED_WEIGHTS) // The code below relies on postprocessing removing unused vertices and weights. 35 : ModelLoaderT(FileName, Flags | 36 REMOVE_DEGEN_TRIANGLES | // Need this flag in order to pass all assertions in the CafuModelT code. 37 REMOVE_UNUSED_VERTICES | REMOVE_UNUSED_WEIGHTS) // The code below relies on postprocessing removing unused vertices and weights. 36 38 { 37 39 // 1. Initialize auxiliary variables. -
cafu/trunk/Libs/Models/Loader_mdl.hpp
r391 r406 49 49 void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs) { } 50 50 void Load(ArrayT<CafuModelT::ChannelT>& Channels) { } 51 bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 51 52 52 53 -
cafu/trunk/Libs/Models/Model_cmdl.cpp
r405 r406 235 235 236 236 237 // TEMPORARY!238 #if defined(_WIN32) && defined(_MSC_VER)239 // Turn off "warning C4355: 'this' : used in base member initializer list".240 #pragma warning(disable:4355)241 #endif242 243 244 237 CafuModelT::CafuModelT(ModelLoaderT& Loader) 245 238 : m_FileName(Loader.GetFileName()), 246 239 m_MaterialMan(), 247 240 m_UseGivenTangentSpace(Loader.UseGivenTS()), // Should we use the fixed, given tangent space, or recompute it ourselves here? 248 m_BindPoseBB(Vector3fT()) // Re-initialized in InitMeshes() calling RecomputeBindPoseBB(), but start with a valid box anyways (e.g. for testing models that have a skeleton, but no mesh). 249 , m_TEMP_Pose(*this) 241 m_BindPoseBB(Vector3fT()), // Re-initialized in InitMeshes() calling RecomputeBindPoseBB(), but start with a valid box anyways (e.g. for testing models that have a skeleton, but no mesh). 242 m_DlodModel(NULL), 243 m_DlodDist(0.0f) 244 , m_TEMP_Pose(NULL) 250 245 { 251 246 // No matter the actual model file format (that is, even if the file format is not "cmdl"), … … 272 267 // if (m_Meshes.Size()==0) throw ModelT::LoadError(); // Consider models with no meshes as valid, skeleton-only meshes are sometimes useful for testing. 273 268 269 // Load the chain of dlod models, if any. 270 { 271 unsigned int Num=1; 272 CafuModelT* Model=this; 273 274 while (Loader.Load(Num, Model->m_DlodModel, Model->m_DlodDist)) 275 { 276 Num++; 277 Model=Model->m_DlodModel; 278 } 279 } 280 281 m_TEMP_Pose=new AnimPoseT(*this); 282 274 283 // Make sure that each skin has as many materials as there are meshes. 275 284 for (unsigned long SkinNr=0; SkinNr<m_Skins.Size(); SkinNr++) … … 316 325 CafuModelT::~CafuModelT() 317 326 { 327 delete m_TEMP_Pose; 328 329 delete m_DlodModel; 330 m_DlodModel=NULL; 331 318 332 if (MatSys::Renderer==NULL) return; 319 333 … … 961 975 void CafuModelT::Draw(int SequenceNr, float FrameNr, float LodDist, const ModelT* /*SubModel*/) const 962 976 { 963 m_TEMP_Pose .SetSequNr(SequenceNr);964 m_TEMP_Pose .SetFrameNr(FrameNr);965 966 m_TEMP_Pose .Draw(-1 /*default skin*/, LodDist);977 m_TEMP_Pose->SetSequNr(SequenceNr); 978 m_TEMP_Pose->SetFrameNr(FrameNr); 979 980 m_TEMP_Pose->Draw(-1 /*default skin*/, LodDist); 967 981 } 968 982 … … 1041 1055 bool CafuModelT::TraceRay(int SequenceNr, float FrameNr, int SkinNr, const Vector3fT& RayOrigin, const Vector3fT& RayDir, TraceResultT& Result) const 1042 1056 { 1043 m_TEMP_Pose .SetSequNr(SequenceNr);1044 m_TEMP_Pose .SetFrameNr(FrameNr);1045 1046 return m_TEMP_Pose .TraceRay(SkinNr, RayOrigin, RayDir, Result);1057 m_TEMP_Pose->SetSequNr(SequenceNr); 1058 m_TEMP_Pose->SetFrameNr(FrameNr); 1059 1060 return m_TEMP_Pose->TraceRay(SkinNr, RayOrigin, RayDir, Result); 1047 1061 } 1048 1062 -
cafu/trunk/Libs/Models/Model_cmdl.hpp
r405 r406 259 259 const ArrayT<AnimT>& GetAnims() const { return m_Anims; } 260 260 const ArrayT<ChannelT>& GetChannels() const { return m_Channels; } 261 const CafuModelT* GetDlodModel() const { return m_DlodModel; } 262 float GetDlodDist() const { return m_DlodDist; } 261 263 262 264 /// Returns the proper material for the given mesh in the given skin. … … 299 301 friend class ModelEditor::CommandUpdateGuiFixtureT; 300 302 303 CafuModelT(const CafuModelT&); ///< Use of the Copy Constructor is not allowed. 304 void operator = (const CafuModelT&); ///< Use of the Assignment Operator is not allowed. 305 301 306 void RecomputeBindPoseBB(); ///< Recomputes the bounding box for the model in bind pose (stored in m_BindPoseBB). 302 307 void InitMeshes(); ///< An auxiliary method for the constructors. 303 308 304 const std::string m_FileName; ///< File name of this model. TODO: Remove!?! 305 MaterialManagerImplT m_MaterialMan; ///< The material manager for the materials that are used with the meshes of this model. 306 ArrayT<JointT> m_Joints; ///< Array of joints of this model. 307 ArrayT<MeshT> m_Meshes; ///< Array of (sub)meshes of this model. 308 ArrayT<SkinT> m_Skins; ///< Array of additional/alternative skins for this model. 309 ArrayT<GuiFixtureT> m_GuiFixtures; ///< Array of GUI fixtures in the model. 310 ArrayT<GuiLocT> m_GuiLocs; ///< Array of locations where GUIs can be attached to this model. 311 ArrayT<AnimT> m_Anims; ///< Array of animations of this model. 312 ArrayT<ChannelT> m_Channels; ///< Array of channels in this model. 313 314 const bool m_UseGivenTangentSpace; ///< Whether this model should use the fixed, given tangent space that was loaded from the model file, or it the tangent space is dynamically recomputed (useful for animated models). 315 // const bool m_CastShadows; ///< Should this model cast shadows? 316 BoundingBox3fT m_BindPoseBB; ///< [REMOVE???] The bounding-box for the base pose of the model. 317 318 mutable AnimPoseT m_TEMP_Pose; ///< TEMPORARY! 309 const std::string m_FileName; ///< File name of this model. TODO: Remove!?! 310 MaterialManagerImplT m_MaterialMan; ///< The material manager for the materials that are used with the meshes of this model. 311 ArrayT<JointT> m_Joints; ///< Array of joints of this model. 312 ArrayT<MeshT> m_Meshes; ///< Array of (sub)meshes of this model. 313 ArrayT<SkinT> m_Skins; ///< Array of additional/alternative skins for this model. 314 ArrayT<GuiFixtureT> m_GuiFixtures; ///< Array of GUI fixtures in the model. 315 ArrayT<GuiLocT> m_GuiLocs; ///< Array of locations where GUIs can be attached to this model. 316 ArrayT<AnimT> m_Anims; ///< Array of animations of this model. 317 ArrayT<ChannelT> m_Channels; ///< Array of channels in this model. 318 319 const bool m_UseGivenTangentSpace; ///< Whether this model should use the fixed, given tangent space that was loaded from the model file, or it the tangent space is dynamically recomputed (useful for animated models). 320 // const bool m_CastShadows; ///< Should this model cast shadows? 321 BoundingBox3fT m_BindPoseBB; ///< [REMOVE???] The bounding-box for the base pose of the model. 322 323 CafuModelT* m_DlodModel; ///< Use the m_DlodModel instead of this when the camera is more that m_DlodDist away. 324 float m_DlodDist; ///< The distance beyond which the m_DlodModel is used instead of this. 325 326 mutable AnimPoseT* m_TEMP_Pose; ///< TEMPORARY! 319 327 }; 320 328 -
cafu/trunk/Libs/Models/Model_proxy.cpp
r404 r406 22 22 #include "Loader_ase.hpp" 23 23 #include "Loader_cmdl.hpp" 24 #include "Loader_dlod.hpp" 24 25 #include "Loader_lwo.hpp" 25 26 #include "Loader_md5.hpp" 26 27 #include "Loader_mdl.hpp" 27 28 #include "Model_cmdl.hpp" 28 #include "Model_dlod.hpp"29 29 #include "Model_dummy.hpp" 30 30 #include "Model_proxy.hpp" … … 120 120 try 121 121 { 122 const int Flags=ModelLoaderT::REMOVE_DEGEN_TRIANGLES | ModelLoaderT::REMOVE_UNUSED_VERTICES | ModelLoaderT::REMOVE_UNUSED_WEIGHTS;123 124 122 // TODO: This duplicates the code in CaWE/ModelEditor/ModelDocument.cpp and should be combined elsewhere, e.g. into class ModelLoaderT. 125 123 // Better yet: Use the type system with the loaders, and be able to iterate over them. 126 // if (cf::String::EndsWith(FileName, "3ds" )) { LoaderFbxT Loader(FileName); NewModel=new CafuModelT(Loader); }127 /*else*/ if (cf::String::EndsWith(FileName, "ase" )) { LoaderAseT Loader(FileName); NewModel=new CafuModelT(Loader); }128 else if (cf::String::EndsWith(FileName, "cmdl" )) { LoaderCafuT Loader(FileName); NewModel=new CafuModelT(Loader); }129 // else if (cf::String::EndsWith(FileName, "dae" )) { LoaderFbxT Loader(FileName); NewModel=new CafuModelT(Loader); }130 // else if (cf::String::EndsWith(FileName, "dxf" )) { LoaderFbxT Loader(FileName); NewModel=new CafuModelT(Loader); }131 // else if (cf::String::EndsWith(FileName, "fbx" )) { LoaderFbxT Loader(FileName); NewModel=new CafuModelT(Loader); }132 else if (cf::String::EndsWith(FileName, "dlod" )) NewModel=new ModelDlodT(FileName);133 else if (cf::String::EndsWith(FileName, "lwo" )) { LoaderLwoT Loader(FileName); NewModel=new CafuModelT(Loader); }134 else if (cf::String::EndsWith(FileName, "mdl" )) { LoaderHL1mdlT Loader(FileName , Flags); NewModel=new CafuModelT(Loader); } // Need these flags in order to pass all assertions in the CafuModelT code.135 else if (cf::String::EndsWith(FileName, "md5" )) { LoaderMd5T Loader(FileName); NewModel=new CafuModelT(Loader); }136 else if (cf::String::EndsWith(FileName, "md5mesh")) { LoaderMd5T Loader(FileName); NewModel=new CafuModelT(Loader); }137 // else if (cf::String::EndsWith(FileName, "obj" )) { LoaderFbxT Loader(FileName); NewModel=new CafuModelT(Loader); }124 // if (cf::String::EndsWith(FileName, "3ds" )) { LoaderFbxT Loader(FileName); NewModel=new CafuModelT(Loader); } 125 /*else*/ if (cf::String::EndsWith(FileName, "ase" )) { LoaderAseT Loader(FileName); NewModel=new CafuModelT(Loader); } 126 else if (cf::String::EndsWith(FileName, "cmdl" )) { LoaderCafuT Loader(FileName); NewModel=new CafuModelT(Loader); } 127 // else if (cf::String::EndsWith(FileName, "dae" )) { LoaderFbxT Loader(FileName); NewModel=new CafuModelT(Loader); } 128 // else if (cf::String::EndsWith(FileName, "dxf" )) { LoaderFbxT Loader(FileName); NewModel=new CafuModelT(Loader); } 129 // else if (cf::String::EndsWith(FileName, "fbx" )) { LoaderFbxT Loader(FileName); NewModel=new CafuModelT(Loader); } 130 else if (cf::String::EndsWith(FileName, "dlod" )) { LoaderDlodT Loader(FileName); NewModel=new CafuModelT(Loader); } 131 else if (cf::String::EndsWith(FileName, "lwo" )) { LoaderLwoT Loader(FileName); NewModel=new CafuModelT(Loader); } 132 else if (cf::String::EndsWith(FileName, "mdl" )) { LoaderHL1mdlT Loader(FileName); NewModel=new CafuModelT(Loader); } 133 else if (cf::String::EndsWith(FileName, "md5" )) { LoaderMd5T Loader(FileName); NewModel=new CafuModelT(Loader); } 134 else if (cf::String::EndsWith(FileName, "md5mesh")) { LoaderMd5T Loader(FileName); NewModel=new CafuModelT(Loader); } 135 // else if (cf::String::EndsWith(FileName, "obj" )) { LoaderFbxT Loader(FileName); NewModel=new CafuModelT(Loader); } 138 136 else throw ModelT::LoadError(); 139 137 -
cafu/trunk/Libs/SConscript
r404 r406 13 13 FileSys/FileManImpl.cpp FileSys/FileSys_LocalPath.cpp FileSys/FileSys_ZipArchive_GV.cpp FileSys/File_local.cpp FileSys/File_memory.cpp FileSys/Password.cpp 14 14 MapFile.cpp 15 Models/Loader.cpp Models/Loader_ase.cpp Models/Loader_ cmdl.cpp Models/Loader_lwo.cpp Models/Loader_md5.cpp15 Models/Loader.cpp Models/Loader_ase.cpp Models/Loader_dlod.cpp Models/Loader_cmdl.cpp Models/Loader_lwo.cpp Models/Loader_md5.cpp 16 16 Models/Loader_mdl.cpp Models/AnimPose.cpp 17 Models/Model_cmdl.cpp Models/Model_d lod.cpp Models/Model_dummy.cpp Models/Model_proxy.cpp17 Models/Model_cmdl.cpp Models/Model_dummy.cpp Models/Model_proxy.cpp 18 18 Network/Network.cpp ParticleEngine/ParticleEngineMS.cpp PlatformAux.cpp Terrain/Terrain.cpp 19 19 TextParser/TextParser.cpp
