void Forest::_renderCellBounds( ObjectRenderInst *ri, SceneRenderState *state, BaseMatInstance *overrideMat ) { PROFILE_SCOPE( Forest_RenderCellBounds ); if ( overrideMat ) return; GFXTransformSaver saver; MatrixF projBias(true); const Frustum frustum = GFX->getFrustum(); MathUtils::getZBiasProjectionMatrix( 0.001f, frustum, &projBias ); GFX->setProjectionMatrix( projBias ); VectorF extents; Point3F pos; // Get top level cells Vector<ForestCell*> cellStack; mData->getCells( &cellStack ); // Holds child cells we need to render as we encounter them. Vector<ForestCell*> frontier; GFXDrawUtil *drawer = GFX->getDrawUtil(); GFXStateBlockDesc desc; desc.setZReadWrite( true, false ); desc.setBlend( true ); desc.setFillModeWireframe(); while ( !cellStack.empty() ) { while ( !cellStack.empty() ) { const ForestCell *cell = cellStack.last(); cellStack.pop_back(); Box3F box = cell->getBounds(); drawer->drawCube( desc, box, ColorI( 0, 255, 0 ) ); RectF rect = cell->getRect(); box.minExtents.set( rect.point.x, rect.point.y, box.minExtents.z ); box.maxExtents.set( rect.point.x + rect.extent.x, rect.point.y + rect.extent.y, box.minExtents.z ); drawer->drawCube( desc, box, ColorI::RED ); // If this cell has children, add them to the frontier. if ( !cell->isLeaf() ) cell->getChildren( &frontier ); } // Now the frontier becomes the cellStack and we empty the frontier. cellStack = frontier; frontier.clear(); } }
void ConvexShape::renderFaceEdges( S32 faceid, const ColorI &color /*= ColorI::WHITE*/, F32 lineWidth /*= 1.0f */ ) { const Vector< ConvexShape::Face > &faceList = mGeometry.faces; if ( faceid >= faceList.size() ) return; GFXTransformSaver saver; MatrixF xfm( mObjToWorld ); xfm.scale( mObjScale ); GFX->multWorld( xfm ); GFXStateBlockDesc desc; desc.setBlend( true ); GFX->setStateBlockByDesc( desc ); MatrixF projBias(true); const Frustum& frustum = GFX->getFrustum(); MathUtils::getZBiasProjectionMatrix( 0.001f, frustum, &projBias ); GFX->setProjectionMatrix( projBias ); S32 s = faceid; S32 e = faceid + 1; if ( faceid == -1 ) { s = 0; e = faceList.size(); } for ( S32 i = s; i < e; i++ ) { const ConvexShape::Face &face = faceList[i]; const Vector< ConvexShape::Edge > &edgeList = face.edges; const Vector< U32 > &facePntList = face.points; const Vector< Point3F > &pointList = mGeometry.points; PrimBuild::begin( GFXLineList, edgeList.size() * 2 ); PrimBuild::color( color ); for ( S32 j = 0; j < edgeList.size(); j++ ) { PrimBuild::vertex3fv( pointList[ facePntList[ edgeList[j].p0 ] ] ); PrimBuild::vertex3fv( pointList[ facePntList[ edgeList[j].p1 ] ] ); } PrimBuild::end(); } }