_Use_decl_annotations_ void KdTreeCompiler2::BuildVisibleIndexList(const XMMATRIX& cameraWorld, const XMMATRIX& projection, uint32_t* indices, uint32_t maxIndices, uint32_t* numIndices, uint32_t* materials, uint32_t maxMaterials, uint32_t* numMaterials) { *numIndices = 0; *numMaterials = 0; // TODO: Remove dependency on BoundingFrustum. Since all we // need is the 4 corners, we can derive those directly from view & projection BoundingFrustum frustum; BoundingFrustum::CreateFromMatrix(frustum, projection); frustum.Transform(frustum, cameraWorld); XMFLOAT3 corners[8]; frustum.GetCorners(corners); XMFLOAT3 min = corners[0]; XMFLOAT3 max = corners[0]; for (uint32_t i = 1; i < 8; ++i) { min = VecMin(min, corners[i]); max = VecMax(max, corners[i]); } XMFLOAT3 position; XMStoreFloat3(&position, cameraWorld.r[3]); AppendVisibleIndices(&position.x, &min.x, &max.x, _root, indices, maxIndices, numIndices, materials, maxMaterials, numMaterials); }
//-------------------------------------------------------------------------------------- void DrawFrustum( const BoundingFrustum& frustum, FXMVECTOR color ) { XMFLOAT3 corners[ BoundingFrustum::CORNER_COUNT ]; frustum.GetCorners( corners ); VertexPositionColor verts[24]; verts[0].position = corners[0]; verts[1].position = corners[1]; verts[2].position = corners[1]; verts[3].position = corners[2]; verts[4].position = corners[2]; verts[5].position = corners[3]; verts[6].position = corners[3]; verts[7].position = corners[0]; verts[8].position = corners[0]; verts[9].position = corners[4]; verts[10].position = corners[1]; verts[11].position = corners[5]; verts[12].position = corners[2]; verts[13].position = corners[6]; verts[14].position = corners[3]; verts[15].position = corners[7]; verts[16].position = corners[4]; verts[17].position = corners[5]; verts[18].position = corners[5]; verts[19].position = corners[6]; verts[20].position = corners[6]; verts[21].position = corners[7]; verts[22].position = corners[7]; verts[23].position = corners[4]; for( size_t j = 0; j < _countof(verts); ++j ) { XMStoreFloat4( &verts[j].color, color ); } auto context = DXUTGetD3D11DeviceContext(); g_BatchEffect->Apply( context ); context->IASetInputLayout( g_pBatchInputLayout ); g_Batch->Begin(); g_Batch->Draw( D3D11_PRIMITIVE_TOPOLOGY_LINELIST, verts, _countof( verts ) ); g_Batch->End(); }