//----------------------------------------------------------------// void ZLFrustum::Init ( const ZLMatrix4x4& invViewProjMtx ) { // set up the homogenous coordinates of the canonical view volume ZLVec3D nlt ( -1.0f, 1.0f, -1.0f ); ZLVec3D nrt ( 1.0f, 1.0f, -1.0f ); ZLVec3D nrb ( 1.0f, -1.0f, -1.0f ); ZLVec3D nlb ( -1.0f, -1.0f, -1.0f ); ZLVec3D flt ( -1.0f, 1.0f, 1.0f ); ZLVec3D frt ( 1.0f, 1.0f, 1.0f ); ZLVec3D frb ( 1.0f, -1.0f, 1.0f ); ZLVec3D flb ( -1.0f, -1.0f, 1.0f ); // compute the corners of the frustum invViewProjMtx.Project ( nlt ); invViewProjMtx.Project ( nrt ); invViewProjMtx.Project ( nrb ); invViewProjMtx.Project ( nlb ); invViewProjMtx.Project ( flt ); invViewProjMtx.Project ( frt ); invViewProjMtx.Project ( frb ); invViewProjMtx.Project ( flb ); this->mPoints [ NEAR_LT_POINT ].Init ( nlt.mX, nlt.mY, nlt.mZ ); this->mPoints [ NEAR_RT_POINT ].Init ( nrt.mX, nrt.mY, nrt.mZ ); this->mPoints [ NEAR_RB_POINT ].Init ( nrb.mX, nrb.mY, nrb.mZ ); this->mPoints [ NEAR_LB_POINT ].Init ( nlb.mX, nlb.mY, nlb.mZ ); this->mPoints [ FAR_LT_POINT ].Init ( flt.mX, flt.mY, flt.mZ ); this->mPoints [ FAR_RT_POINT ].Init ( frt.mX, frt.mY, frt.mZ ); this->mPoints [ FAR_RB_POINT ].Init ( frb.mX, frb.mY, frb.mZ ); this->mPoints [ FAR_LB_POINT ].Init ( flb.mX, flb.mY, flb.mZ ); // Compute the frustum's axis-aligned bounding box this->mAABB.Init ( nlt ); this->mAABB.Grow ( nrt ); this->mAABB.Grow ( nrb ); this->mAABB.Grow ( nlb ); this->mAABB.Grow ( flt ); this->mAABB.Grow ( frt ); this->mAABB.Grow ( frb ); this->mAABB.Grow ( flb ); // intialize the planes this->mPlanes [ LEFT_PLANE ].Init ( nlt, flt, flb ); this->mPlanes [ RIGHT_PLANE ].Init ( nrb, frb, frt ); this->mPlanes [ TOP_PLANE ].Init ( nrt, frt, flt ); this->mPlanes [ BOTTOM_PLANE ].Init ( nlb, flb, frb ); this->mPlanes [ NEAR_PLANE ].Init ( nrt, nlt, nlb ); this->mPlanes [ FAR_PLANE ].Init ( flt, frt, frb ); double frustArea = _frustArea ( *this ); double boxArea = this->mAABB.Area (); this->mUsePlanesForCull = (( float )( frustArea / boxArea )) < MIN_FILL_RATIO; }
//----------------------------------------------------------------// ZLRect MOAIScissorRect::GetScissorRect ( const ZLMatrix4x4& worldToWndMtx ) const { ZLVec3D vtx3D [ 4 ]; vtx3D [ 0 ].mX = this->mRect.mXMin; vtx3D [ 0 ].mY = this->mRect.mYMin; vtx3D [ 0 ].mZ = 0.0f; vtx3D [ 1 ].mX = this->mRect.mXMin; vtx3D [ 1 ].mY = this->mRect.mYMax; vtx3D [ 1 ].mZ = 0.0f; vtx3D [ 2 ].mX = this->mRect.mXMax; vtx3D [ 2 ].mY = this->mRect.mYMax; vtx3D [ 2 ].mZ = 0.0f; vtx3D [ 3 ].mX = this->mRect.mXMax; vtx3D [ 3 ].mY = this->mRect.mYMin; vtx3D [ 3 ].mZ = 0.0f; ZLMatrix4x4 mtx; mtx.Init ( this->GetLocalToWorldMtx ()); mtx.Append ( worldToWndMtx ); mtx.Project ( vtx3D [ 0 ]); mtx.Project ( vtx3D [ 1 ]); mtx.Project ( vtx3D [ 2 ]); mtx.Project ( vtx3D [ 3 ]); ZLRect scissorRect; scissorRect.Init ( vtx3D [ 0 ]); scissorRect.Grow ( vtx3D [ 1 ]); scissorRect.Grow ( vtx3D [ 2 ]); scissorRect.Grow ( vtx3D [ 3 ]); if ( this->mScissorRect ) { ZLRect parentRect = this->mScissorRect->GetScissorRect ( worldToWndMtx ); parentRect.Clip ( scissorRect ); } return scissorRect; }