Skip to content
Permalink
Browse files
Keep densely packed array of world-space bboxes in AABBoxRasterizerSSE
  • Loading branch information
rygorous committed Feb 2, 2013
1 parent 28e1833 commit bd29f46
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 8 deletions.
@@ -20,6 +20,7 @@
AABBoxRasterizerSSE::AABBoxRasterizerSSE()
: mNumModels(0),
mpTransformedAABBox(NULL),
mpWorldBoxes(NULL),
mpBBoxVisible(NULL),
mpNumTriangles(NULL),
mpRenderTargetPixels(NULL),
@@ -45,6 +46,7 @@ AABBoxRasterizerSSE::~AABBoxRasterizerSSE()
_aligned_free(mProjMatrix);
SAFE_DELETE_ARRAY(mpVisible);
SAFE_DELETE_ARRAY(mpTransformedAABBox);
SAFE_DELETE_ARRAY(mpWorldBoxes);
SAFE_DELETE_ARRAY(mpBBoxVisible);
SAFE_DELETE_ARRAY(mpNumTriangles);
}
@@ -74,6 +76,7 @@ void AABBoxRasterizerSSE::CreateTransformedAABBoxes(CPUTAssetSet **pAssetSet, UI

mpVisible = new bool[mNumModels];
mpTransformedAABBox = new TransformedAABBoxSSE[mNumModels];
mpWorldBoxes = new WorldBBox[mNumModels];
mpBBoxVisible = new bool[mNumModels];
mpNumTriangles = new UINT[mNumModels];

@@ -90,6 +93,7 @@ void AABBoxRasterizerSSE::CreateTransformedAABBoxes(CPUTAssetSet **pAssetSet, UI
pModel = (CPUTModelDX11*)pRenderNode;

mpTransformedAABBox[modelId].CreateAABBVertexIndexList(pModel);
pModel->GetBoundsWorldSpace(&mpWorldBoxes[modelId].mCenter, &mpWorldBoxes[modelId].mHalf);
mpNumTriangles[modelId] = 0;
for(int meshId = 0; meshId < pModel->GetMeshCount(); meshId++)
{
@@ -181,4 +185,15 @@ void AABBoxRasterizerSSE::Render(CPUTAssetSet **pAssetSet,
}
}
mNumCulled = mNumModels - count;
}

//------------------------------------------------------------------------
// Calculate frustum culling state for a bunch of models
//------------------------------------------------------------------------
void AABBoxRasterizerSSE::CalcInsideFrustum(CPUTFrustum *pFrustum, UINT start, UINT end)
{
for(UINT i = start; i < end; i++)
{
mpBBoxVisible[i] = pFrustum->IsVisible(mpWorldBoxes[i].mCenter, mpWorldBoxes[i].mHalf);
}
}
@@ -85,10 +85,19 @@ class AABBoxRasterizerSSE : public AABBoxRasterizer
return numCulledTris;
}

void CalcInsideFrustum(CPUTFrustum *pFrustum, UINT start, UINT end);


protected:
struct WorldBBox
{
float3 mCenter;
float3 mHalf;
};

UINT mNumModels;
TransformedAABBoxSSE *mpTransformedAABBox;
WorldBBox *mpWorldBoxes;
bool *mpBBoxVisible;
UINT *mpNumTriangles;
__m128 *mViewMatrix;
@@ -73,10 +73,7 @@ void AABBoxRasterizerSSEMT::IsInsideViewFrustum(UINT taskId, UINT taskCount)
end = start + numModelsPerTask2;
}

for(UINT i = start; i < end; i++)
{
mpBBoxVisible[i] = mpTransformedAABBox[i].IsInsideViewFrustum(mpCamera);
}
CalcInsideFrustum(&mpCamera->mFrustum, start, end);
}

//-------------------------------------------------------------------------------
@@ -34,10 +34,7 @@ AABBoxRasterizerSSEST::~AABBoxRasterizerSSEST()
void AABBoxRasterizerSSEST::IsInsideViewFrustum(CPUTCamera *pCamera)
{
mpCamera = pCamera;
for(UINT i = 0; i < mNumModels; i++)
{
mpBBoxVisible[i] = mpTransformedAABBox[i].IsInsideViewFrustum(mpCamera);
}
CalcInsideFrustum(&pCamera->mFrustum, 0, mNumModels);
}

//------------------------------------------------------------------------------

0 comments on commit bd29f46

Please sign in to comment.