// *************************************************************************** void CQuadGridClipClusterQTreeNode::noFrustumClip(CClipTrav *clipTrav) { // if empty (test important for branch and leave clusters) if(Empty) return; // clip the sons if( LeafNode) { // clip DistMax. CVector c= BBoxExt.getCenter(); float dist= (c - clipTrav->CamPos).norm(); dist-= BBoxExt.getRadius(); sint minDistSetup= (sint)floor(Owner->_NumDist*dist/Owner->_DistMax); // NB if too far, set _NumDist (ie will clip only the infinite objects ones) clamp(minDistSetup, 0, (sint)Owner->_NumDist); // clip the sons H_AUTO_USE( NL3D_QuadClip_SonsShowNoClip ); ListNode.clipSons(minDistSetup); } else { // forceShow of cluster sons Sons[0]->noFrustumClip(clipTrav); Sons[1]->noFrustumClip(clipTrav); Sons[2]->noFrustumClip(clipTrav); Sons[3]->noFrustumClip(clipTrav); } }
// *************************************************************************** void CQuadGridClipCluster::clip(CClipTrav *clipTrav) { H_AUTO_USE( NL3D_QuadClip_ClusterClip ); // clip the quadtree _Root.clip(clipTrav); }
//========================================================================= void CHairSet::init (NLMISC::IProgressCallback &progress) { H_AUTO_USE(RZ_HairSet) clear(); uint numHairItem = SheetMngr.getNumItem(SLOTTYPE::HEAD_SLOT); for(uint k = 0; k < numHairItem; ++k) { // Progress bar progress.progress ((float)k/(float)numHairItem); const CItemSheet *item = SheetMngr.getItem(SLOTTYPE::HEAD_SLOT, k); if( (item) && (!item->getShape().empty()) ) { std::string itemName = item->getShape(); itemName = NLMISC::strlwr(itemName); if (item->getShape().find("cheveux", 0) != std::string::npos) { // get race uint16 race = (uint16) itemName[1] | ((uint16) itemName[0] << 8); switch(race) { case 'ma': _Hairs[Matis].push_back(k); break; case 'tr': _Hairs[Tryker].push_back(k); break; case 'zo': _Hairs[Zorai].push_back(k); break; case 'fy': _Hairs[Fyros].push_back(k); break; } } } } }