// Make note of what scenery falls outside of our view frustum. void HK_CALL cull_scenery( hkpWorld* world, tbb::concurrent_vector vec_scenery, std::vector* ids_in_frustum ){ Camera_Alt const* pcam = World_Manager::GetPlayereCamera(); glm::vec3 look_from = World_Manager::player->get_lookFrom(); glm::vec3 look_to = World_Manager::player->get_lookTo(); hkVector4 transFrom(look_from.x,look_from.y,look_from.z,0); hkVector4 transTo(look_to.x,look_to.y,look_to.z,0); // Lock the world and get the tree broad-phase. world->lock(); hkpTreeBroadPhase* broadphase = static_cast(world->getBroadPhase()); //broadphase->fullOptimize(); glm::vec3 f_r = -pcam->getXAxis(); glm::vec3 f_u = -pcam->getYAxis(); glm::vec3 f_f = -pcam->getZAxis(); // organize our axes................................... float sc = 50.0f; hkVector4 start_fu( f_u.x, f_u.y, f_u.z, 1 ); hkVector4 end_fu( f_u.x*sc, f_u.y*sc, f_u.z*sc, 1 ); hkVector4 start_fr( f_r.x, f_r.y, f_r.z, 1 ); hkVector4 end_fr( f_r.x*sc, f_r.y*sc, f_r.z*sc, 1 ); hkVector4 start_ff( f_f.x, f_f.y, f_f.z, 1 ); hkVector4 end_ff( f_f.x*sc, f_f.y*sc, f_f.z*sc, 1 ); start_fu.add(transFrom); end_fu.add(transFrom); start_fr.add(transFrom); end_fr.add(transFrom); start_ff.add(transFrom); end_ff.add(transFrom); //..................................................... if( VISUALIZE_AXES ){ // Visualize the axes in the vdb........................ HK_DISPLAY_LINE( start_fu, end_fu ,hkColor::RED); HK_DISPLAY_LINE( start_fr, end_fr ,hkColor::AZURE); HK_DISPLAY_LINE( start_ff, end_ff ,hkColor::GREEN); } //........................................................ // Create frustum vertices. hkVector4 nearPlaneQuad[4]; // Find corners according to our direction. float s1=10.0f; glm::vec3 bl( f_r*-s1 + f_u*-s1 ); glm::vec3 br( f_r*s1 + f_u*-s1 ); glm::vec3 tr( f_r*s1 + f_u*s1 ); glm::vec3 tl( f_r*-s1 + f_u*s1 ); nearPlaneQuad[0].set( bl.x, bl.y, bl.z ); nearPlaneQuad[1].set( br.x, br.y, br.z ); nearPlaneQuad[2].set( tr.x, tr.y, tr.z ); nearPlaneQuad[3].set( tl.x, tl.y, tl.z ); hkVector4 farPlaneQuad[4]; hkSimdReal fovFactor = pcam->getFov() * 6.5f; hkReal farOffset = pcam->getZFar(); for(int i=0; i<4; ++i) { farPlaneQuad[i].setMul4(fovFactor, nearPlaneQuad[i]); // Translate frustum. nearPlaneQuad[i].add( transFrom ); farPlaneQuad[i].add( transTo ); } // Draw frustum. if( VISUALIZE_FRUSTUM ){ HK_DISPLAY_LINE(nearPlaneQuad[0], nearPlaneQuad[1], hkColor::YELLOW); HK_DISPLAY_LINE(nearPlaneQuad[1], nearPlaneQuad[2], hkColor::YELLOW); HK_DISPLAY_LINE(nearPlaneQuad[2], nearPlaneQuad[3], hkColor::YELLOW); HK_DISPLAY_LINE(nearPlaneQuad[3], nearPlaneQuad[0], hkColor::YELLOW); HK_DISPLAY_LINE(farPlaneQuad[0], farPlaneQuad[1], hkColor::YELLOW); HK_DISPLAY_LINE(farPlaneQuad[1], farPlaneQuad[2], hkColor::YELLOW); HK_DISPLAY_LINE(farPlaneQuad[2], farPlaneQuad[3], hkColor::YELLOW); HK_DISPLAY_LINE(farPlaneQuad[3], farPlaneQuad[0], hkColor::YELLOW); HK_DISPLAY_LINE(farPlaneQuad[0], nearPlaneQuad[0], hkColor::YELLOW); HK_DISPLAY_LINE(farPlaneQuad[1], nearPlaneQuad[1], hkColor::YELLOW); HK_DISPLAY_LINE(farPlaneQuad[2], nearPlaneQuad[2], hkColor::YELLOW); HK_DISPLAY_LINE(farPlaneQuad[3], nearPlaneQuad[3], hkColor::YELLOW); } // Compute frustum planes. hkVector4 planes[6]; // Side planes planes[0] = computePlaneFromTriangle(nearPlaneQuad[0], farPlaneQuad[0], nearPlaneQuad[1]); planes[1] = computePlaneFromTriangle(nearPlaneQuad[1], farPlaneQuad[1], nearPlaneQuad[2]); planes[2] = computePlaneFromTriangle(nearPlaneQuad[2], farPlaneQuad[2], nearPlaneQuad[3]); planes[3] = computePlaneFromTriangle(nearPlaneQuad[3], farPlaneQuad[3], nearPlaneQuad[0]); // Near plane planes[4] = computePlaneFromTriangle(nearPlaneQuad[0], nearPlaneQuad[1], nearPlaneQuad[2]); // Far plane planes[5] = computePlaneFromTriangle(farPlaneQuad[0], farPlaneQuad[2], farPlaneQuad[1]); broadphase->lock(); // Cull using frustum. hkArray handles; { HK_TIME_CODE_BLOCK("Culling",this); handles.reserve(4096 / sizeof(const hkpBroadPhaseHandle*)); broadphase->queryConvex(planes, 6, handles); } // Get out objects visible from the frustum. for(int i=0; ipush_back( handles[i]->m_id ); } broadphase->unlock(); world->unlock(); }