void _prim (DWORD prim) { if (bClass3) { sPoly src,dst; src.resize (3); src[0] = verts[ tris[prim].verts[0] ]; src[1] = verts[ tris[prim].verts[1] ]; src[2] = verts[ tris[prim].verts[2] ]; if (F->ClipPoly(src,dst)) { RESULT& R = dest->r_add(); R.id = prim; R.verts[0] = verts[ tris[prim].verts[0] ]; R.verts[1] = verts[ tris[prim].verts[1] ]; R.verts[2] = verts[ tris[prim].verts[2] ]; R.dummy = tris[prim].dummy; } } else { RESULT& R = dest->r_add(); R.id = prim; R.verts[0] = verts[ tris[prim].verts[0] ]; R.verts[1] = verts[ tris[prim].verts[1] ]; R.verts[2] = verts[ tris[prim].verts[2] ]; R.dummy = tris[prim].dummy; } }
void _prim (DWORD prim) { TRI& T = tris[prim]; Fvector& v0 = verts[ T.verts[0] ]; mLeafVerts[0].x = v0.x; mLeafVerts[0].y = v0.y; mLeafVerts[0].z = v0.z; Fvector& v1 = verts[ T.verts[1] ]; mLeafVerts[1].x = v1.x; mLeafVerts[1].y = v1.y; mLeafVerts[1].z = v1.z; Fvector& v2 = verts[ T.verts[2] ]; mLeafVerts[2].x = v2.x; mLeafVerts[2].y = v2.y; mLeafVerts[2].z = v2.z; if (!_tri()) return; RESULT& R = dest->r_add(); R.id = prim; R.verts[0] = v0; R.verts[1] = v1; R.verts[2] = v2; R.dummy = T.dummy; }
void _stab (const AABBNoLeafNode* node) { // Actual box-box test if (!_box((Fvector&)node->mAABB.mCenter,(Fvector&)node->mAABB.mExtents)) return; // 1st chield if (node->HasLeaf()) _prim (node->GetPrimitive()); else _stab (node->GetPos()); // Early exit for "only first" if (bFirst && dest->r_count()) return; // 2nd chield if (node->HasLeaf2()) _prim (node->GetPrimitive2()); else _stab (node->GetNeg()); }
void _stab (const AABBNoLeafNode* node, u32 mask) { // Actual frustum/aabb test EFC_Visible result = _box((Fvector&)node->mAABB.mCenter,(Fvector&)node->mAABB.mExtents,mask); if (fcvNone == result) return; // 1st chield if (node->HasLeaf()) _prim (node->GetPrimitive()); else _stab (node->GetPos(),mask); // Early exit for "only first" if (bFirst && dest->r_count()) return; // 2nd chield if (node->HasLeaf2()) _prim (node->GetPrimitive2()); else _stab (node->GetNeg(),mask); }