Changeset 406

Show
Ignore:
Timestamp:
10/11/11 22:01:42 (7 months ago)
Author:
Carsten
Message:

Model support:
Refactored our discrete-level-of-detail (dlod) code from obsolete class ModelDlodT into new class LoaderDlodT,
adding a "dlod-chain" of instances to CafuModelT and AnimPoseT accordingly.

Location:
cafu/trunk
Files:
2 added
2 removed
16 modified

Legend:

Unmodified
Added
Removed
  • cafu/trunk/CaWE/ModelEditor/ModelDocument.cpp

    r400 r406  
    3030#include "Models/Loader_assimp.hpp" 
    3131#include "Models/Loader_cmdl.hpp" 
     32#include "Models/Loader_dlod.hpp" 
    3233#include "Models/Loader_fbx.hpp" 
    3334#include "Models/Loader_lwo.hpp" 
     
    271272    else if (cf::String::EndsWith(fn, "dxf"    )) { LoaderFbxT    Loader(fn, UserCbs, Flags); return new CafuModelT(Loader); } 
    272273    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); } 
    274275    else if (cf::String::EndsWith(fn, "lwo"    )) { LoaderLwoT    Loader(fn, Flags);          return new CafuModelT(Loader); } 
    275276    else if (cf::String::EndsWith(fn, "mdl"    )) { LoaderHL1mdlT Loader(fn, Flags);          return new CafuModelT(Loader); } 
  • cafu/trunk/Libs/Models/AnimPose.cpp

    r403 r406  
    3434      m_FrameNr(FrameNr), 
    3535      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. 
    3637      m_NeedsRecache(true), 
    3738      m_BoundingBox() 
     
    4142 
    4243 
     44AnimPoseT::~AnimPoseT() 
     45{ 
     46    delete m_DlodPose; 
     47} 
     48 
     49 
    4350void AnimPoseT::SetSequNr(int SequNr) 
    4451{ 
     
    4956 
    5057    m_NeedsRecache=true; 
     58 
     59    // Recursively update the chain of dlod poses. 
     60    if (m_DlodPose) m_DlodPose->SetSequNr(SequNr); 
    5161} 
    5262 
     
    6070 
    6171    m_NeedsRecache=true; 
     72 
     73    // Recursively update the chain of dlod poses. 
     74    if (m_DlodPose) m_DlodPose->SetFrameNr(FrameNr); 
    6275} 
    6376 
     
    7083 
    7184    m_NeedsRecache=true; 
     85 
     86    // Recursively update the chain of dlod poses. 
     87    if (m_DlodPose) m_DlodPose->SetSuper(Super); 
    7288} 
    7389 
     
    102118 
    103119    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 
     126void 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 
    109134    Recache(); 
    110135 
     
    263288bool AnimPoseT::TraceRay(int SkinNr, const Vector3fT& RayOrigin, const Vector3fT& RayDir, ModelT::TraceResultT& Result) const 
    264289{ 
     290    // if (m_Model.GetDlodModel() && LodDist >= m_Model.GetDlodDist()) 
     291    // { 
     292    //     return m_DlodPose->TraceRay(SkinNr, RayOrigin, RayDir, Result); 
     293    // } 
     294 
    265295    Recache(); 
    266296 
  • cafu/trunk/Libs/Models/AnimPose.hpp

    r402 r406  
    9999 
    100100 
     101    /// The constructor. 
    101102    AnimPoseT(const CafuModelT& Model, int SequNr=-1, float FrameNr=0.0f); 
     103 
     104    /// The destructor. 
     105    ~AnimPoseT(); 
    102106 
    103107    /// @param SequenceNr   The number of the animation sequence to use, -1 for the bind pose. 
     
    120124    /// This method renders the model in this pose. 
    121125    /// @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. 
    123127    void Draw(int SkinNr, float LodDist) const; 
    124128 
     
    153157    private: 
    154158 
     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 
    155162    void NormalizeInput(); 
    156163    void SyncDimensions() const; 
     
    162169    float                         m_FrameNr;        ///< The animation frame    number at which we have computed the cache data. 
    163170    const SuperT*                 m_Super; 
     171    AnimPoseT*                    m_DlodPose;       ///< The next pose in the chain of dlod poses matching the chain of dlod models. 
    164172 // ArrayT<...>                   m_Def;            ///< Array of { channel, sequence, framenr, (forceloop), blendweight } tuples. 
    165173 // 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  
    4848 
    4949    /// 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; } 
    5152 
    5253    /// Some (static, non-animated) model file formats may bring all their tangent space data with them. 
     
    6768    /// Loads the animation channels (groups of joints) of the Cafu model. 
    6869    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; 
    6973 
    7074    /// Postprocesses the file data according to flags given to the constructor. 
  • cafu/trunk/Libs/Models/Loader_ase.hpp

    r391 r406  
    4444    void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs); 
    4545    void Load(ArrayT<CafuModelT::ChannelT>& Channels) { } 
     46    bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 
    4647 
    4748 
  • cafu/trunk/Libs/Models/Loader_assimp.hpp

    r391 r406  
    4848    void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs) { } 
    4949    void Load(ArrayT<CafuModelT::ChannelT>& Channels) { } 
     50    bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 
    5051 
    5152 
  • cafu/trunk/Libs/Models/Loader_cmdl.hpp

    r391 r406  
    4747    void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs); 
    4848    void Load(ArrayT<CafuModelT::ChannelT>& Channels); 
     49    bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 
    4950 
    5051 
  • cafu/trunk/Libs/Models/Loader_fbx.hpp

    r391 r406  
    4545    void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs); 
    4646    void Load(ArrayT<CafuModelT::ChannelT>& Channels) { } 
     47    bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 
    4748 
    4849 
  • cafu/trunk/Libs/Models/Loader_lwo.hpp

    r391 r406  
    4141    void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs) { } 
    4242    void Load(ArrayT<CafuModelT::ChannelT>& Channels) { } 
     43    bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 
    4344 
    4445 
  • cafu/trunk/Libs/Models/Loader_md5.hpp

    r391 r406  
    4343    void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs) { } 
    4444    void Load(ArrayT<CafuModelT::ChannelT>& Channels) { } 
     45    bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 
    4546}; 
    4647 
  • cafu/trunk/Libs/Models/Loader_mdl.cpp

    r383 r406  
    3333 
    3434LoaderHL1mdlT::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. 
    3638{ 
    3739    // 1. Initialize auxiliary variables. 
  • cafu/trunk/Libs/Models/Loader_mdl.hpp

    r391 r406  
    4949    void Load(ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures, ArrayT<CafuModelT::GuiLocT>& GuiLocs) { } 
    5050    void Load(ArrayT<CafuModelT::ChannelT>& Channels) { } 
     51    bool Load(unsigned int Level, CafuModelT*& DlodModel, float& DlodDist) { return false; } 
    5152 
    5253 
  • cafu/trunk/Libs/Models/Model_cmdl.cpp

    r405 r406  
    235235 
    236236 
    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 #endif 
    242  
    243  
    244237CafuModelT::CafuModelT(ModelLoaderT& Loader) 
    245238    : m_FileName(Loader.GetFileName()), 
    246239      m_MaterialMan(), 
    247240      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) 
    250245{ 
    251246    // No matter the actual model file format (that is, even if the file format is not "cmdl"), 
     
    272267 // if (m_Meshes.Size()==0) throw ModelT::LoadError();  // Consider models with no meshes as valid, skeleton-only meshes are sometimes useful for testing. 
    273268 
     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 
    274283    // Make sure that each skin has as many materials as there are meshes. 
    275284    for (unsigned long SkinNr=0; SkinNr<m_Skins.Size(); SkinNr++) 
     
    316325CafuModelT::~CafuModelT() 
    317326{ 
     327    delete m_TEMP_Pose; 
     328 
     329    delete m_DlodModel; 
     330    m_DlodModel=NULL; 
     331 
    318332    if (MatSys::Renderer==NULL) return; 
    319333 
     
    961975void CafuModelT::Draw(int SequenceNr, float FrameNr, float LodDist, const ModelT* /*SubModel*/) const 
    962976{ 
    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); 
    967981} 
    968982 
     
    10411055bool CafuModelT::TraceRay(int SequenceNr, float FrameNr, int SkinNr, const Vector3fT& RayOrigin, const Vector3fT& RayDir, TraceResultT& Result) const 
    10421056{ 
    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); 
    10471061} 
    10481062 
  • cafu/trunk/Libs/Models/Model_cmdl.hpp

    r405 r406  
    259259    const ArrayT<AnimT>&        GetAnims() const { return m_Anims; } 
    260260    const ArrayT<ChannelT>&     GetChannels() const { return m_Channels; } 
     261    const CafuModelT*           GetDlodModel() const { return m_DlodModel; } 
     262    float                       GetDlodDist() const { return m_DlodDist; } 
    261263 
    262264    /// Returns the proper material for the given mesh in the given skin. 
     
    299301    friend class ModelEditor::CommandUpdateGuiFixtureT; 
    300302 
     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 
    301306    void RecomputeBindPoseBB();                     ///< Recomputes the bounding box for the model in bind pose (stored in m_BindPoseBB). 
    302307    void InitMeshes();                              ///< An auxiliary method for the constructors. 
    303308 
    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! 
    319327}; 
    320328 
  • cafu/trunk/Libs/Models/Model_proxy.cpp

    r404 r406  
    2222#include "Loader_ase.hpp" 
    2323#include "Loader_cmdl.hpp" 
     24#include "Loader_dlod.hpp" 
    2425#include "Loader_lwo.hpp" 
    2526#include "Loader_md5.hpp" 
    2627#include "Loader_mdl.hpp" 
    2728#include "Model_cmdl.hpp" 
    28 #include "Model_dlod.hpp" 
    2929#include "Model_dummy.hpp" 
    3030#include "Model_proxy.hpp" 
     
    120120    try 
    121121    { 
    122         const int Flags=ModelLoaderT::REMOVE_DEGEN_TRIANGLES | ModelLoaderT::REMOVE_UNUSED_VERTICES | ModelLoaderT::REMOVE_UNUSED_WEIGHTS; 
    123  
    124122        // TODO: This duplicates the code in CaWE/ModelEditor/ModelDocument.cpp and should be combined elsewhere, e.g. into class ModelLoaderT. 
    125123        //       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); } 
    138136        else throw ModelT::LoadError(); 
    139137 
  • cafu/trunk/Libs/SConscript

    r404 r406  
    1313                    FileSys/FileManImpl.cpp FileSys/FileSys_LocalPath.cpp FileSys/FileSys_ZipArchive_GV.cpp FileSys/File_local.cpp FileSys/File_memory.cpp FileSys/Password.cpp 
    1414                    MapFile.cpp 
    15                     Models/Loader.cpp Models/Loader_ase.cpp Models/Loader_cmdl.cpp Models/Loader_lwo.cpp Models/Loader_md5.cpp 
     15                    Models/Loader.cpp Models/Loader_ase.cpp Models/Loader_dlod.cpp Models/Loader_cmdl.cpp Models/Loader_lwo.cpp Models/Loader_md5.cpp 
    1616                    Models/Loader_mdl.cpp Models/AnimPose.cpp 
    17                     Models/Model_cmdl.cpp Models/Model_dlod.cpp Models/Model_dummy.cpp Models/Model_proxy.cpp 
     17                    Models/Model_cmdl.cpp Models/Model_dummy.cpp Models/Model_proxy.cpp 
    1818                    Network/Network.cpp ParticleEngine/ParticleEngineMS.cpp PlatformAux.cpp Terrain/Terrain.cpp 
    1919                    TextParser/TextParser.cpp