Changeset 404 for cafu/trunk

Show
Ignore:
Timestamp:
10/09/11 23:19:43 (8 months ago)
Author:
Carsten
Message:

Model support:
Removed the obsolete class ModelMdlT. In its place, HL1 mdl models are now loaded via the LoaderHL1mdlT into the newer and better class CafuModelT.

Also fixed the orientation of stencil shadow polygons (silhouette and "endcaps") of face occluders in the world BSP tree, making their orientation consistent to those used in CafuModelT. Without this, the sign of the stencil count of the world shadows mismatches that of the models shadows, yielding artifacts whenever model shadows and world shadows overlap.

Location:
cafu/trunk/Libs
Files:
3 removed
3 modified

Legend:

Unmodified
Added
Removed
  • cafu/trunk/Libs/Models/Model_proxy.cpp

    r382 r404  
    2424#include "Loader_lwo.hpp" 
    2525#include "Loader_md5.hpp" 
     26#include "Loader_mdl.hpp" 
    2627#include "Model_cmdl.hpp" 
    2728#include "Model_dlod.hpp" 
    2829#include "Model_dummy.hpp" 
    29 #include "Model_mdl.hpp" 
    3030#include "Model_proxy.hpp" 
    3131#include "String.hpp" 
     
    120120    try 
    121121    { 
     122        const int Flags=ModelLoaderT::REMOVE_DEGEN_TRIANGLES | ModelLoaderT::REMOVE_UNUSED_VERTICES | ModelLoaderT::REMOVE_UNUSED_WEIGHTS; 
     123 
    122124        // TODO: This duplicates the code in CaWE/ModelEditor/ModelDocument.cpp and should be combined elsewhere, e.g. into class ModelLoaderT. 
    123              if (cf::String::EndsWith(FileName, "ase"    )) { LoaderAseT  Loader(FileName); NewModel=new CafuModelT(Loader); } 
    124         else if (cf::String::EndsWith(FileName, "cmdl"   )) { LoaderCafuT Loader(FileName); NewModel=new CafuModelT(Loader); } 
     125        //       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); } 
    125132        else if (cf::String::EndsWith(FileName, "dlod"   )) NewModel=new ModelDlodT(FileName); 
    126         else if (cf::String::EndsWith(FileName, "mdl"    )) NewModel=new ModelMdlT (FileName); 
    127         else if (cf::String::EndsWith(FileName, "md5"    )) { LoaderMd5T  Loader(FileName); NewModel=new CafuModelT(Loader); } 
    128         else if (cf::String::EndsWith(FileName, "md5mesh")) { LoaderMd5T  Loader(FileName); NewModel=new CafuModelT(Loader); } 
    129         else if (cf::String::EndsWith(FileName, "lwo"    )) { LoaderLwoT  Loader(FileName); NewModel=new CafuModelT(Loader); } 
     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); } 
    130138        else throw ModelT::LoadError(); 
     139 
     140        // LoaderAssimpT Loader(fn, Flags); 
     141        // NewModel=new CafuModelT(Loader); 
    131142    } 
    132143    catch (const ModelT::LoadError&) 
  • cafu/trunk/Libs/SConscript

    r400 r404  
    1515                    Models/Loader.cpp Models/Loader_ase.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_mdl.cpp Models/Model_proxy.cpp 
     17                    Models/Model_cmdl.cpp Models/Model_dlod.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 
  • cafu/trunk/Libs/SceneGraph/FaceNode.cpp

    r285 r404  
    605605 
    606606    // Render the silhouette quads. 
    607     static MatSys::MeshT SilhouetteMesh(MatSys::MeshT::QuadStrip, MatSys::MeshT::CCW); 
     607    static MatSys::MeshT SilhouetteMesh(MatSys::MeshT::QuadStrip); 
    608608    SilhouetteMesh.Vertices.Overwrite(); 
    609609    SilhouetteMesh.Vertices.PushBackEmpty(2*Mesh.Vertices.Size()+2); 
     
    633633 
    634634    // Render the occluders near cap (front-facing wrt. the light source). 
    635     // (The MatSys expects vertices for front-facing polygons to be specified in CCW order. 
    636     //  However, as we are considering a *back-facing* polygon as a occluder (oriented CW when looked at from behind), 
    637     //  we have to reverse the order of its vertices in order to turn it into a CCW ordered, front-facing polygon.) 
    638     static MatSys::MeshT M_front(MatSys::MeshT::TriangleFan, MatSys::MeshT::CCW); 
    639     M_front.Vertices.Overwrite(); 
    640     M_front.Vertices.PushBackEmpty(Mesh.Vertices.Size()); 
     635    // As we are considering a *back-facing* polygon as a occluder (oriented CCW when looked at from behind), 
     636    // we have to reverse the order of its vertices in order to turn it into a CW ordered, front-facing polygon. 
     637    static MatSys::MeshT CapMesh(MatSys::MeshT::TriangleFan);   // The default winding order is "CW". 
     638 
     639    CapMesh.Vertices.Overwrite(); 
     640    CapMesh.Vertices.PushBackEmpty(Mesh.Vertices.Size()); 
    641641 
    642642    for (unsigned long VertexNr=0; VertexNr<Mesh.Vertices.Size(); VertexNr++) 
    643         M_front.Vertices[M_front.Vertices.Size()-VertexNr-1].SetOrigin(Mesh.Vertices[VertexNr].Origin[0], 
     643        CapMesh.Vertices[CapMesh.Vertices.Size()-VertexNr-1].SetOrigin(Mesh.Vertices[VertexNr].Origin[0], 
    644644                                                                       Mesh.Vertices[VertexNr].Origin[1], 
    645645                                                                       Mesh.Vertices[VertexNr].Origin[2], 1.0); 
    646646 
    647647    // What a pity the order isn't the other way round. Could then simply write:  MatSys::Renderer->RenderMesh(Mesh); 
    648     MatSys::Renderer->RenderMesh(M_front); 
     648    MatSys::Renderer->RenderMesh(CapMesh); 
    649649 
    650650 
     
    652652    // As we are already dealing with a back-facing polygon, the vertex order is already as required, 
    653653    // we just have to project them to infinity as seen from the light source. 
    654     static MatSys::MeshT M_back(MatSys::MeshT::TriangleFan, MatSys::MeshT::CCW); 
    655     M_back.Vertices.Overwrite(); 
    656     M_back.Vertices.PushBackEmpty(Mesh.Vertices.Size()); 
    657  
    658654    for (unsigned long VertexNr=0; VertexNr<Mesh.Vertices.Size(); VertexNr++) 
    659         M_back.Vertices[VertexNr].SetOrigin(Mesh.Vertices[VertexNr].Origin[0]-LightPos.x, 
    660                                             Mesh.Vertices[VertexNr].Origin[1]-LightPos.y, 
    661                                             Mesh.Vertices[VertexNr].Origin[2]-LightPos.z, 0.0); 
    662  
    663     MatSys::Renderer->RenderMesh(M_back); 
     655        CapMesh.Vertices[VertexNr].SetOrigin(Mesh.Vertices[VertexNr].Origin[0]-LightPos.x, 
     656                                             Mesh.Vertices[VertexNr].Origin[1]-LightPos.y, 
     657                                             Mesh.Vertices[VertexNr].Origin[2]-LightPos.z, 0.0); 
     658 
     659    MatSys::Renderer->RenderMesh(CapMesh); 
    664660} 
    665661