Changeset 2842


Ignore:
Timestamp:
07/16/08 17:19:25 (16 years ago)
Author:
mattausch
Message:
 
Location:
GTP/trunk/App/Demos/Vis/FriendlyCulling/src
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/Bvh.cpp

    r2839 r2842  
    152152        { 
    153153                mGeometry[i] = (*it); 
    154                 mBox.Include((*it)->GetBoundingBox()); 
     154                //mBox.Include((*it)->GetBoundingBox()); 
    155155        } 
    156156 
     
    799799        for (int i = node->mFirst; i <= node->mLast; ++ i) 
    800800        { 
    801 #ifdef TODO 
    802                 numTriangles += mGeometry[i]->GetGeometry()->GetNumTriangles(); 
    803 #endif 
     801                numTriangles += mGeometry[i]->CountNumTriangles(); 
    804802        } 
    805803 
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/Geometry.h

    r2840 r2842  
    3535 
    3636        inline bool HasTexture() const { return mHasTexture; } 
     37         
    3738        const AxisAlignedBox3& GetBoundingBox() const; 
    3839 
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/RenderQueue.cpp

    r2841 r2842  
    1414{ 
    1515 
    16 static Camera *sCam = NULL; 
    17  
    18  
    19 inline static bool CompDist(SceneEntity *e1, SceneEntity *e2) 
    20 { 
    21         return  
    22                 (SqrMagnitude(e1->GetBoundingBox().Center() - sCam->GetPosition()) < 
    23                  SqrMagnitude(e2->GetBoundingBox().Center() - sCam->GetPosition())); 
    24 } 
    25  
    2616 
    2717inline static bool CompDist2(RenderQueueBucket *b1, RenderQueueBucket *b2) 
     
    2919        return (b1->mMinDistance < b2->mMinDistance); 
    3020} 
     21 
    3122 
    3223 
     
    4637mSize(0) 
    4738{ 
    48         sCam = cam; 
    4939} 
    5040 
     
    9181        shapes.clear(); 
    9282 
    93         entity->GetCurrentLODLevel(shapes) 
     83        entity->GetCurrentLODLevel(shapes); 
    9484 
    9585        ShapeContainer::const_iterator sit, sit_end = shapes.end(); 
     
    10797        ++ mSize; 
    10898         
    109         if (entity->mRenderQueueBucket) 
    110         { 
    111                 bucket = entity->mRenderQueueBucket; 
     99        if (shape->mRenderQueueBucket) 
     100        { 
     101                bucket = shape->mRenderQueueBucket; 
    112102        } 
    113103        else 
     
    119109                for (; i < mBuckets.size(); ++ i) 
    120110                { 
    121                         if (bucketFound = FitsInBucket(entity, i)) 
     111                        if (bucketFound = FitsInBucket(shape, i)) 
    122112                                break; 
    123113                } 
     
    128118                        RenderQueueBucket *bucket = new RenderQueueBucket(); 
    129119 
    130                         Material *mat = entity->GetMaterial(); 
     120                        Material *mat = shape->GetMaterial(); 
    131121 
    132122                        bucket->mAlphaTestEnabled = mat->IsAlphaTestEnabled(); 
     
    143133                        // assume that the incoming nodes are ordered by distance => set min dist 
    144134                        // on first incoming node 
    145                         float dist = SqrMagnitude(entity->GetBoundingBox().Center() - mCamera->GetPosition()); 
     135                        Vector3 v = shape->GetTransformedBoundingBox().Center() - mCamera->GetPosition(); 
     136                        const float dist = SqrMagnitude(v); 
    146137                        mBuckets[i]->mMinDistance = dist; 
    147138 
     
    150141 
    151142                bucket = mBuckets[i]; 
    152                 entity->mRenderQueueBucket = bucket; 
    153         } 
    154  
    155         bucket->mEntities.push_back(entity); 
     143                shape->mRenderQueueBucket = bucket; 
     144        } 
     145 
     146        bucket->mShapes.push_back(shape); 
    156147} 
    157148 
     
    174165void RenderQueue::Render() 
    175166{ 
     167        // sort the buckets 
    176168        Sort(); 
    177          
     169 
    178170        // render all buckets 
    179171        for (size_t i = 0; i < mBuckets.size(); ++ i) 
     
    215207 
    216208 
     209void RenderQueue::Sort() 
     210{ 
     211        // sort buckets itself 
     212        sort(mBuckets.begin(), mBuckets.end(), CompDist2); 
     213} 
     214 
     215 
    217216void RenderQueue::Apply() 
    218217{ 
     
    222221 
    223222 
    224 void RenderQueue::Sort() 
    225 { 
    226         // sort buckets itself 
    227         sort(mBuckets.begin(), mBuckets.end(), CompDist2); 
    228 } 
    229  
    230  
    231 } 
     223} 
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/RenderQueue.h

    r2841 r2842  
    7070protected: 
    7171 
     72        void Sort(); 
     73 
    7274        void Enqueue(Shape *shape); 
    7375 
    7476        inline bool FitsInBucket(Shape *shape, size_t idx) const; 
    75  
    76         /** Sorts the render queue by materials / textures. 
    77         */ 
    78         void Sort(); 
    7977        /** Clears the render queue 
    8078        */ 
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/RenderTraverser.cpp

    r2839 r2842  
    109109                { 
    110110                        SceneEntity *ent = entities[i]; 
    111 #ifdef TODO 
    112                         mStats.mNumRenderedTriangles += ent->GetGeometry()->GetNumTriangles(); 
    113 #endif 
     111                         
     112                        mStats.mNumRenderedTriangles += ent->CountNumTriangles(); 
     113 
    114114                        if (mUseRenderQueue) 
    115115                                mRenderQueue->Enqueue(ent); 
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/ResourceManager.cpp

    r2840 r2842  
    99#include "Vector3.h" 
    1010#include "Transform3.h" 
     11#include "Shape.h" 
    1112 
    1213 
     
    2627        CLEAR_CONTAINER(mTextures); 
    2728        CLEAR_CONTAINER(mTrafos); 
     29        CLEAR_CONTAINER(mShapes); 
    2830} 
    2931 
     
    6264        sceneGeom = new SceneEntity(trafo); 
    6365 
     66        // create shape 
     67        Shape *shape = new Shape(geom, mat, sceneGeom); 
     68        mShapes.push_back(shape); 
     69 
     70        sceneGeom->AddShape(shape); 
     71 
    6472        return sceneGeom; 
    6573} 
     
    104112 
    105113                mGeometryTable[i] = geom; 
    106                 mMaterialTable[i] = mat; 
     114                mMaterialTable[i] = mat;                 
    107115 
    108116                mGeometry.push_back(geom); 
     
    199207                SceneEntity *ent = LoadSceneEntity(str); 
    200208                entities[i] = ent; 
     209 
    201210                mSceneEntities.push_back(ent); 
    202211        } 
     
    232241        mGeometryTable.clear(); 
    233242        mMaterialTable.clear(); 
     243        //mShapesTable.clear(); 
    234244 
    235245        return true; 
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/ResourceManager.h

    r2840 r2842  
    4848        std::map<int, Material *> mMaterialTable; 
    4949        std::map<int, Geometry *> mGeometryTable; 
     50        //std::map<int, Shape *> mShapesTable; 
    5051 
    5152        // these are kept to be able to delete these resources afterwards 
     
    5354        std::vector<Material *> mMaterials; 
    5455        std::vector<Geometry *> mGeometry; 
    55         std::vector<SceneEntity *> mSceneEntities; 
    5656        std::vector<Transform3 *> mTrafos; 
     57         
     58        SceneEntityContainer mSceneEntities; 
     59        ShapeContainer mShapes; 
    5760}; 
    5861 
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/SceneEntity.cpp

    r2841 r2842  
    99 
    1010 
     11using namespace std; 
     12 
     13 
    1114namespace CHCDemoEngine  
    1215{ 
     16 
    1317 
    1418SceneEntity::SceneEntity(Transform3 *trafo): mTransform(trafo) 
     
    2630        ShapeContainer::const_iterator sit, sit_end; 
    2731 
    28         if (mLODInfos->empty()) 
     32        if (mLODInfos.empty()) 
    2933        { 
    3034                sit = mShapes.begin(); sit_end = mShapes.end(); 
     
    3539        int i = 0; 
    3640 
    37         LODInfo *info; 
    38  
    3941        LODInfoContainer::const_iterator lid, lid_end = mLODInfos.end(); 
    4042 
    4143        for (lid = mLODInfos.begin(); lid != lid_end; ++ lid) 
    4244        { 
    43                 info = *lid; 
     45                LODInfo *lodInfo = *lid; 
    4446 
    45                 if (info->mDistance > mDistance) 
     47                if (lodInfo->mSquaredDistance > mDistance) 
    4648                { 
    47                         sit = info->mShapes.begin();  
    48                         sit_end = info->mShapes.end(); 
     49                        sit = lodInfo->mShapes.begin();  
     50                        sit_end = lodInfo->mShapes.end(); 
    4951                        break; 
    5052                } 
     
    7072        ShapeContainer::const_iterator sit, sit_end = shapes.end(); 
    7173 
    72         for (; sit != sit_end; ++ sit) 
     74        for (sit = shapes.begin(); sit != sit_end; ++ sit) 
    7375        { 
    7476                (*sit)->Render(state); 
     
    101103 
    102104 
    103 AxisAlignedBox3 SceneEntity::GetBoundingBox() const 
     105int SceneEntity::CountNumTriangles() 
    104106{ 
    105 #ifdef TODO 
    106         AxisAlignedBox3 box = mGeometry->GetBoundingBox(); 
    107         if (mTransform) Transform(box, *mTransform); 
    108 #else 
    109         AxisAlignedBox3 box; 
    110 #endif 
    111          
     107        int numTriangles = 0; 
     108        static ShapeContainer shapes; 
     109        shapes.clear(); 
    112110 
    113         return box; 
     111        GetCurrentLODLevel(shapes); 
     112 
     113        ShapeContainer::const_iterator sit, sit_end = shapes.end(); 
     114 
     115        for (sit = shapes.begin(); sit != sit_end; ++ sit) 
     116        { 
     117                numTriangles += (*sit)->GetGeometry()->GetNumTriangles(); 
     118        } 
     119 
     120        return numTriangles; 
    114121} 
    115122 
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/SceneEntity.h

    r2841 r2842  
    5151        /** Returns the transformed bounding box. 
    5252        */ 
    53         AxisAlignedBox3 GetBoundingBox() const; 
     53        //AxisAlignedBox3 GetBoundingBox() const; 
    5454        /** set frame where we last rendered this node 
    5555        */ 
     
    6262        inline Transform3 *GetTransform() const  { return mTransform; } 
    6363 
     64        void GetCurrentLODLevel(ShapeContainer &shapes); 
    6465 
    65         void GetCurrentLODLevel(ShapeContainer &shapes); 
     66        int CountNumTriangles(); 
     67 
    6668 
    6769protected: 
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/Shape.cpp

    r2840 r2842  
    44#include "Geometry.h" 
    55#include "SceneEntity.h" 
    6  
    7 #include "glInterface.h" 
    8 #include <Cg/cg.h> 
    9 #include <Cg/cgGL.h> 
     6#include "Transform3.h" 
    107 
    118 
     
    3027        if (mMaterial) mMaterial->Render(state); 
    3128 
     29        mParent->GetTransform()->Load(state); 
    3230        mGeometry->Render(state); 
     31        mParent->GetTransform()->Unload(state); 
     32 
    3333} 
    3434 
     
    4646 
    4747 
     48 
     49AxisAlignedBox3 Shape::GetBoundingBox() const 
     50{ 
     51        return mGeometry->GetBoundingBox(); 
    4852} 
     53 
     54 
     55AxisAlignedBox3 Shape::GetTransformedBoundingBox() const 
     56{ 
     57        AxisAlignedBox3 box = mGeometry->GetBoundingBox(); 
     58        Matrix4x4 *mat = mParent->GetTransform()->GetMatrix(); 
     59 
     60        if (mat) Transform(box, *mat); 
     61 
     62        return box; 
     63} 
     64 
     65} 
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/Shape.h

    r2840 r2842  
    1212 
    1313 
    14  
    1514class Material; 
    1615class Geometry; 
    1716class RenderState; 
     17class AxisAlignedBox3; 
     18 
    1819struct RenderQueueBucket; 
     20 
    1921 
    2022/** Class representing a shape. 
     
    4345        */ 
    4446        void SetMaterial(Material *mat); 
    45          
     47        /** Returns the transformed bounding box. 
     48        */ 
     49        AxisAlignedBox3 GetBoundingBox() const; 
     50        /** Returns bounding box transformed with the parent transform. 
     51        */ 
     52        AxisAlignedBox3 GetTransformedBoundingBox() const; 
     53 
    4654        inline Material *GetMaterial() const  { return mMaterial; } 
    4755 
Note: See TracChangeset for help on using the changeset viewer.