Changeset 408 for cafu/trunk

Show
Ignore:
Timestamp:
10/14/11 11:54:40 (7 months ago)
Author:
Carsten
Message:

Model code:
Refactored the old and obsolete ModelDummyT code into the newly added LoaderDummyT class.
This change

  • makes "dummy" models consistent with the rest,
  • clears the path for further changes to the ModelT class hierarchy,
  • is a huge improvement as the new dummy models are actually as powerful as all other models, i.e. they can be rendered, traced rays against, etc.
Location:
cafu/trunk
Files:
2 added
2 removed
6 modified

Legend:

Unmodified
Added
Removed
  • cafu/trunk/CaWE/MapHelperModel.cpp

    r285 r408  
    3434#include "Math3D/BoundingBox.hpp" 
    3535#include "Math3D/Matrix3x3.hpp" 
    36 #include "Models/Model_dummy.hpp" 
    3736#include "EditorMaterialManager.hpp" 
    3837#include "MaterialSystem/Renderer.hpp" 
     
    107106 
    108107    // TODO: Cache! 
    109     if (dynamic_cast<const ModelDummyT*>(m_ModelProxy.GetRealModel())==NULL) 
    110     { 
    111         const cf::math::AnglesfT Angles=m_ParentEntity->GetAngles(); 
    112  
    113         // The 3D bounds are the bounds of the oriented model's first sequence, so that frustum culling works properly in the 3D view. 
    114         Vector3fT VerticesBB[8]; 
    115         m_ModelProxy.GetBB(GetSequenceNr(), 0.0f).GetCornerVertices(VerticesBB); 
    116  
    117         // Rotate all eight vertices. 
    118         for (unsigned long VertexNr=0; VertexNr<8; VertexNr++) 
    119             VerticesBB[VertexNr]=VerticesBB[VertexNr].GetRotX(Angles[ROLL]).GetRotY(-Angles[PITCH]).GetRotZ(Angles[YAW]); 
    120  
    121         // Build a new BB of the rotated BB. 
    122         BoundingBox3fT RotBB(VerticesBB[0]); 
    123  
    124         for (unsigned long VertexNr=1; VertexNr<8; VertexNr++) 
    125             RotBB.Insert(VerticesBB[VertexNr]); 
    126  
    127         RotBB.Min+=Origin; 
    128         RotBB.Max+=Origin; 
    129  
    130         return RotBB; 
    131     } 
    132  
    133     return BoundingBox3fT(Origin-Vector3fT(10, 10, 10), Origin+Vector3fT(10, 10, 10)); 
     108    const cf::math::AnglesfT Angles=m_ParentEntity->GetAngles(); 
     109 
     110    // The 3D bounds are the bounds of the oriented model's first sequence, so that frustum culling works properly in the 3D view. 
     111    Vector3fT VerticesBB[8]; 
     112    m_ModelProxy.GetBB(GetSequenceNr(), 0.0f).GetCornerVertices(VerticesBB); 
     113 
     114    // Rotate all eight vertices. 
     115    for (unsigned long VertexNr=0; VertexNr<8; VertexNr++) 
     116        VerticesBB[VertexNr]=VerticesBB[VertexNr].GetRotX(Angles[ROLL]).GetRotY(-Angles[PITCH]).GetRotZ(Angles[YAW]); 
     117 
     118    // Build a new BB of the rotated BB. 
     119    BoundingBox3fT RotBB(VerticesBB[0]); 
     120 
     121    for (unsigned long VertexNr=1; VertexNr<8; VertexNr++) 
     122        RotBB.Insert(VerticesBB[VertexNr]); 
     123 
     124    RotBB.Min+=Origin; 
     125    RotBB.Max+=Origin; 
     126 
     127    return RotBB; 
    134128} 
    135129 
     
    150144    UpdateModelCache(); 
    151145 
    152     if (dynamic_cast<const ModelDummyT*>(m_ModelProxy.GetRealModel())==NULL) 
     146    const Vector3fT ViewPoint=Renderer.GetViewWin3D().GetCamera().Pos; 
     147    const float     ModelDist=length(Origin-ViewPoint); 
     148 
     149    if (Options.view3d.AnimateModels) 
     150        m_ModelFrameNr=m_ModelProxy.AdvanceFrameNr(SequenceNr, m_ModelFrameNr, float(m_Timer.GetSecondsSinceLastCall())); 
     151 
     152    if (ModelDist < float(Options.view3d.ModelDistance)) 
    153153    { 
    154         const Vector3fT ViewPoint=Renderer.GetViewWin3D().GetCamera().Pos; 
    155         const float     ModelDist=length(Origin-ViewPoint); 
    156  
    157         if (Options.view3d.AnimateModels) 
    158             m_ModelFrameNr=m_ModelProxy.AdvanceFrameNr(SequenceNr, m_ModelFrameNr, float(m_Timer.GetSecondsSinceLastCall())); 
    159  
    160         if (ModelDist<float(Options.view3d.ModelDistance)) 
    161         { 
    162             const cf::math::AnglesfT Angles=m_ParentEntity->GetAngles(); 
    163             const float              CAFU_ENG_SCALE=25.4f; 
    164  
    165             MatSys::Renderer->SetCurrentAmbientLightColor(1.0f, 1.0f, 1.0f); 
    166             MatSys::Renderer->PushMatrix(MatSys::RendererI::MODEL_TO_WORLD); 
    167  
    168             MatSys::Renderer->Translate(MatSys::RendererI::MODEL_TO_WORLD, Origin[0], Origin[1], Origin[2]); 
    169             MatSys::Renderer->RotateZ  (MatSys::RendererI::MODEL_TO_WORLD,  Angles[YAW  ]); 
    170             MatSys::Renderer->RotateY  (MatSys::RendererI::MODEL_TO_WORLD, -Angles[PITCH]); 
    171             MatSys::Renderer->RotateX  (MatSys::RendererI::MODEL_TO_WORLD,  Angles[ROLL ]); 
    172  
    173             m_ModelProxy.Draw(SequenceNr, m_ModelFrameNr, CAFU_ENG_SCALE*ModelDist, NULL); 
    174  
    175             MatSys::Renderer->PopMatrix(MatSys::RendererI::MODEL_TO_WORLD); 
    176  
    177             if (m_ParentEntity->IsSelected()) Renderer.RenderBox(GetBB(), Options.colors.Selection, false /* Solid? */); 
    178             return; 
    179         } 
     154        const cf::math::AnglesfT Angles=m_ParentEntity->GetAngles(); 
     155        const float              CAFU_ENG_SCALE=25.4f; 
     156 
     157        MatSys::Renderer->SetCurrentAmbientLightColor(1.0f, 1.0f, 1.0f); 
     158        MatSys::Renderer->PushMatrix(MatSys::RendererI::MODEL_TO_WORLD); 
     159 
     160        MatSys::Renderer->Translate(MatSys::RendererI::MODEL_TO_WORLD, Origin[0], Origin[1], Origin[2]); 
     161        MatSys::Renderer->RotateZ  (MatSys::RendererI::MODEL_TO_WORLD,  Angles[YAW  ]); 
     162        MatSys::Renderer->RotateY  (MatSys::RendererI::MODEL_TO_WORLD, -Angles[PITCH]); 
     163        MatSys::Renderer->RotateX  (MatSys::RendererI::MODEL_TO_WORLD,  Angles[ROLL ]); 
     164 
     165        m_ModelProxy.Draw(SequenceNr, m_ModelFrameNr, CAFU_ENG_SCALE*ModelDist, NULL); 
     166 
     167        MatSys::Renderer->PopMatrix(MatSys::RendererI::MODEL_TO_WORLD); 
     168 
     169        if (m_ParentEntity->IsSelected()) Renderer.RenderBox(GetBB(), Options.colors.Selection, false /* Solid? */); 
    180170    } 
    181  
    182     // Did not render the real model (either because we only have a dummy model, 
    183     // or the distance was too great), thus render a replacement bounding-box. 
    184     Renderer.RenderBox(GetBB(), 
    185         m_ParentEntity->IsSelected() ? Options.colors.Selection : m_ParentEntity->GetColor(Options.view2d.UseGroupColors), true /* Solid? */); 
     171    else 
     172    { 
     173        // Did not render the real model (the distance was too great), thus render a replacement bounding-box. 
     174        Renderer.RenderBox(GetBB(), 
     175            m_ParentEntity->IsSelected() ? Options.colors.Selection : m_ParentEntity->GetColor(Options.view2d.UseGroupColors), true /* Solid? */); 
     176    } 
    186177} 
    187178 
  • cafu/trunk/CaWE/MapModel.cpp

    r285 r408  
    3131#include "Renderer3D.hpp" 
    3232 
    33 #include "Models/Model_dummy.hpp" 
    3433#include "MaterialSystem/Renderer.hpp" 
    3534#include "MaterialSystem/Mesh.hpp" 
     
    159158{ 
    160159    // TODO: Cache! 
    161     if (dynamic_cast<const ModelDummyT*>(m_Model.GetRealModel())==NULL) 
    162     { 
    163         // The 3D bounds are the bounds of the oriented model's first sequence, so that frustum culling works properly in the 3D view. 
    164         Vector3fT VerticesBB[8]; 
    165         m_Model.GetBB(m_SeqNumber, 0.0f).GetCornerVertices(VerticesBB); 
    166  
    167         // Rotate all eight vertices. 
    168         for (unsigned long VertexNr=0; VertexNr<8; VertexNr++) 
    169             VerticesBB[VertexNr]=VerticesBB[VertexNr].GetRotX(m_Angles[ROLL]).GetRotY(m_Angles[PITCH]).GetRotZ(m_Angles[YAW]); 
    170  
    171         // Build a new BB of the rotated BB. 
    172         BoundingBox3fT RotBB(VerticesBB[0]); 
    173  
    174         for (unsigned long VertexNr=1; VertexNr<8; VertexNr++) 
    175             RotBB.Insert(VerticesBB[VertexNr]); 
    176  
    177         RotBB.Min=RotBB.Min*m_Scale+m_Origin; 
    178         RotBB.Max=RotBB.Max*m_Scale+m_Origin; 
    179  
    180         return RotBB; 
    181     } 
    182  
    183     return BoundingBox3fT(m_Origin-Vector3fT(10, 10, 10), m_Origin+Vector3fT(10, 10, 10)); 
     160    // The 3D bounds are the bounds of the oriented model's first sequence, so that frustum culling works properly in the 3D view. 
     161    Vector3fT VerticesBB[8]; 
     162    m_Model.GetBB(m_SeqNumber, 0.0f).GetCornerVertices(VerticesBB); 
     163 
     164    // Rotate all eight vertices. 
     165    for (unsigned long VertexNr=0; VertexNr<8; VertexNr++) 
     166        VerticesBB[VertexNr]=VerticesBB[VertexNr].GetRotX(m_Angles[ROLL]).GetRotY(m_Angles[PITCH]).GetRotZ(m_Angles[YAW]); 
     167 
     168    // Build a new BB of the rotated BB. 
     169    BoundingBox3fT RotBB(VerticesBB[0]); 
     170 
     171    for (unsigned long VertexNr=1; VertexNr<8; VertexNr++) 
     172        RotBB.Insert(VerticesBB[VertexNr]); 
     173 
     174    RotBB.Min=RotBB.Min*m_Scale+m_Origin; 
     175    RotBB.Max=RotBB.Max*m_Scale+m_Origin; 
     176 
     177    return RotBB; 
    184178} 
    185179 
     
    209203void MapModelT::Render3D(Renderer3DT& Renderer) const 
    210204{ 
    211     if (dynamic_cast<const ModelDummyT*>(m_Model.GetRealModel())==NULL) 
     205    const Vector3fT ViewPoint=Renderer.GetViewWin3D().GetCamera().Pos; 
     206    const float     ModelDist=length(m_Origin-ViewPoint); 
     207 
     208    if (Options.view3d.AnimateModels && m_Animated) 
     209        m_FrameNumber=m_Model.AdvanceFrameNr(m_SeqNumber, m_FrameNumber, float(m_Timer.GetSecondsSinceLastCall())*m_FrameTimeScale); 
     210 
     211    if (ModelDist<float(Options.view3d.ModelDistance)) 
    212212    { 
    213         const Vector3fT ViewPoint=Renderer.GetViewWin3D().GetCamera().Pos; 
    214         const float     ModelDist=length(m_Origin-ViewPoint); 
    215  
    216         if (Options.view3d.AnimateModels && m_Animated) 
    217             m_FrameNumber=m_Model.AdvanceFrameNr(m_SeqNumber, m_FrameNumber, float(m_Timer.GetSecondsSinceLastCall())*m_FrameTimeScale); 
    218  
    219         if (ModelDist<float(Options.view3d.ModelDistance)) 
    220         { 
    221             const float CAFU_ENG_SCALE=25.4f; 
    222  
    223             MatSys::Renderer->SetCurrentAmbientLightColor(1.0f, 1.0f, 1.0f); 
    224             MatSys::Renderer->PushMatrix(MatSys::RendererI::MODEL_TO_WORLD); 
    225  
    226             MatSys::Renderer->Translate(MatSys::RendererI::MODEL_TO_WORLD, m_Origin.x, m_Origin.y, m_Origin.z); 
    227             MatSys::Renderer->RotateZ  (MatSys::RendererI::MODEL_TO_WORLD, m_Angles[YAW  ]); 
    228             MatSys::Renderer->RotateY  (MatSys::RendererI::MODEL_TO_WORLD, m_Angles[PITCH]); 
    229             MatSys::Renderer->RotateX  (MatSys::RendererI::MODEL_TO_WORLD, m_Angles[ROLL ]); 
    230             MatSys::Renderer->Scale    (MatSys::RendererI::MODEL_TO_WORLD, m_Scale); 
    231  
    232             m_Model.Draw(m_SeqNumber, m_FrameNumber, CAFU_ENG_SCALE*ModelDist, NULL); 
    233  
    234             MatSys::Renderer->PopMatrix(MatSys::RendererI::MODEL_TO_WORLD); 
    235  
    236             if (IsSelected()) Renderer.RenderBox(GetBB(), Options.colors.Selection, false /* Solid? */); 
    237         } 
    238         else 
    239         { 
    240             // Did not render the real model (the distance was too great), thus render a replacement bounding-box. 
    241             Renderer.RenderBox(GetBB(), 
    242                 IsSelected() ? Options.colors.Selection : GetColor(Options.view2d.UseGroupColors), true /* Solid? */); 
    243         } 
     213        const float CAFU_ENG_SCALE=25.4f; 
     214 
     215        MatSys::Renderer->SetCurrentAmbientLightColor(1.0f, 1.0f, 1.0f); 
     216        MatSys::Renderer->PushMatrix(MatSys::RendererI::MODEL_TO_WORLD); 
     217 
     218        MatSys::Renderer->Translate(MatSys::RendererI::MODEL_TO_WORLD, m_Origin.x, m_Origin.y, m_Origin.z); 
     219        MatSys::Renderer->RotateZ  (MatSys::RendererI::MODEL_TO_WORLD, m_Angles[YAW  ]); 
     220        MatSys::Renderer->RotateY  (MatSys::RendererI::MODEL_TO_WORLD, m_Angles[PITCH]); 
     221        MatSys::Renderer->RotateX  (MatSys::RendererI::MODEL_TO_WORLD, m_Angles[ROLL ]); 
     222        MatSys::Renderer->Scale    (MatSys::RendererI::MODEL_TO_WORLD, m_Scale); 
     223 
     224        m_Model.Draw(m_SeqNumber, m_FrameNumber, CAFU_ENG_SCALE*ModelDist, NULL); 
     225 
     226        MatSys::Renderer->PopMatrix(MatSys::RendererI::MODEL_TO_WORLD); 
     227 
     228        if (IsSelected()) Renderer.RenderBox(GetBB(), Options.colors.Selection, false /* Solid? */); 
    244229    } 
    245230    else 
    246231    { 
    247         // Did not render the real model (we only have a dummy model), thus render a replacement bounding-box. 
     232        // Did not render the real model (the distance was too great), thus render a replacement bounding-box. 
    248233        Renderer.RenderBox(GetBB(), 
    249234            IsSelected() ? Options.colors.Selection : GetColor(Options.view2d.UseGroupColors), true /* Solid? */); 
  • cafu/trunk/CaWE/ModelEditor/ModelDocument.cpp

    r406 r408  
    3131#include "Models/Loader_cmdl.hpp" 
    3232#include "Models/Loader_dlod.hpp" 
     33#include "Models/Loader_dummy.hpp" 
    3334#include "Models/Loader_fbx.hpp" 
    3435#include "Models/Loader_lwo.hpp" 
     
    270271    else if (cf::String::EndsWith(fn, "cmdl"   )) { LoaderCafuT   Loader(fn, Flags);          return new CafuModelT(Loader); } 
    271272    else if (cf::String::EndsWith(fn, "dae"    )) { LoaderFbxT    Loader(fn, UserCbs, Flags); return new CafuModelT(Loader); } 
     273    else if (cf::String::EndsWith(fn, "dummy"  )) { LoaderDummyT  Loader(fn, Flags);          return new CafuModelT(Loader); } 
    272274    else if (cf::String::EndsWith(fn, "dxf"    )) { LoaderFbxT    Loader(fn, UserCbs, Flags); return new CafuModelT(Loader); } 
    273275    else if (cf::String::EndsWith(fn, "fbx"    )) { LoaderFbxT    Loader(fn, UserCbs, Flags); return new CafuModelT(Loader); } 
  • cafu/trunk/Libs/Models/Loader.cpp

    r358 r408  
    149149    Mat.PolygonMode    =MaterialT::Wireframe; 
    150150 // Mat.DepthOffset    =-1.0f; 
     151    Mat.DiffMapComp    =MapCompositionT("file-not-found", "."); 
    151152 // Mat.RedGen         =ExpressionT(1.0f); 
    152     Mat.UseMeshColors  =true; 
    153  // Mat.TwoSided       =true;   // Required e.g. for terrains being selected. 
     153 // Mat.UseMeshColors  =true;       // Mesh colors aren't used for rendering models, but unfortunately required for rendering wire-frame without diffuse-map texture image. 
     154    Mat.TwoSided       =true;       // For wire-frame, render the backsides as well. 
    154155    Mat.meta_EditorSave=EditorSave; 
    155156 
  • cafu/trunk/Libs/Models/Model_proxy.cpp

    r406 r408  
    2323#include "Loader_cmdl.hpp" 
    2424#include "Loader_dlod.hpp" 
     25#include "Loader_dummy.hpp" 
    2526#include "Loader_lwo.hpp" 
    2627#include "Loader_md5.hpp" 
    2728#include "Loader_mdl.hpp" 
    2829#include "Model_cmdl.hpp" 
    29 #include "Model_dummy.hpp" 
    3030#include "Model_proxy.hpp" 
    3131#include "String.hpp" 
     
    8080    ModelPoolManagerT() 
    8181    { 
    82         ModelPool      .PushBack(new ModelDummyT("dummy")); 
     82        LoaderDummyT Loader("dummy"); 
     83 
     84        ModelPool      .PushBack(new CafuModelT(Loader)); 
    8385        ModelPoolCounts.PushBack(1); 
    8486    } 
     
    134136        else if (cf::String::EndsWith(FileName, "md5mesh")) { LoaderMd5T    Loader(FileName); NewModel=new CafuModelT(Loader); } 
    135137     // else if (cf::String::EndsWith(FileName, "obj"    )) { LoaderFbxT    Loader(FileName); NewModel=new CafuModelT(Loader); } 
    136         else throw ModelT::LoadError(); 
     138        else { LoaderDummyT Loader(FileName); NewModel=new CafuModelT(Loader); } 
    137139 
    138140        // LoaderAssimpT Loader(fn, Flags); 
     
    143145        // Okay, the model could not be loaded for some reason. 
    144146        // Do just substitute a dummy model for now. 
    145         NewModel=new ModelDummyT(FileName); 
     147        LoaderDummyT Loader(FileName); 
     148 
     149        NewModel=new CafuModelT(Loader); 
    146150    } 
    147151 
  • cafu/trunk/Libs/SConscript

    r406 r408  
    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_dlod.cpp Models/Loader_cmdl.cpp Models/Loader_lwo.cpp Models/Loader_md5.cpp 
     15                    Models/Loader.cpp Models/Loader_ase.cpp Models/Loader_cmdl.cpp Models/Loader_dlod.cpp Models/Loader_dummy.cpp Models/Loader_lwo.cpp Models/Loader_md5.cpp 
    1616                    Models/Loader_mdl.cpp Models/AnimPose.cpp 
    17                     Models/Model_cmdl.cpp Models/Model_dummy.cpp Models/Model_proxy.cpp 
     17                    Models/Model_cmdl.cpp Models/Model_proxy.cpp 
    1818                    Network/Network.cpp ParticleEngine/ParticleEngineMS.cpp PlatformAux.cpp Terrain/Terrain.cpp 
    1919                    TextParser/TextParser.cpp