void SBVRGeogen2D::ComputeGeometry(bool bMeshOnly) { InitBBOX(); if (bMeshOnly) { m_vSliceTrianglesX.clear(); m_vSliceTrianglesY.clear(); m_vSliceTrianglesZ.clear(); SortMeshWithoutVolume(m_vSliceTrianglesX); m_vSliceTrianglesY = m_vSliceTrianglesX; m_vSliceTrianglesZ = m_vSliceTrianglesX; return; } // TODO handle mesh when the volume is not empty switch (m_eMethod) { case METHOD_REZK : ComputeGeometryRezk(); break; case METHOD_KRUEGER : ComputeGeometryKrueger(); break; default : ComputeGeometryKruegerFast(); break; } if(m_bClipPlaneEnabled && (m_bClipVolume || m_bClipMesh)) { PLANE<float> transformed = m_ClipPlane * m_matView; const FLOATVECTOR3 normal(transformed.xyz()); const float d = transformed.d(); m_vSliceTrianglesX = ClipTriangles(m_vSliceTrianglesX, normal, d); m_vSliceTrianglesY = ClipTriangles(m_vSliceTrianglesY, normal, d); m_vSliceTrianglesZ = ClipTriangles(m_vSliceTrianglesZ, normal, d); } }
void GLRaycaster::RenderBox(const RenderRegion& renderRegion, const FLOATVECTOR3& vCenter, const FLOATVECTOR3& vExtend, const FLOATVECTOR3& vMinCoords, const FLOATVECTOR3& vMaxCoords, bool bCullBack, EStereoID eStereoID) const { m_pContext->GetStateManager()->SetCullState(bCullBack ? CULL_FRONT : CULL_BACK); FLOATVECTOR3 vMinPoint, vMaxPoint; vMinPoint = (vCenter - vExtend/2.0); vMaxPoint = (vCenter + vExtend/2.0); // \todo compute this only once per brick FLOATMATRIX4 m = ComputeEyeToTextureMatrix(renderRegion, FLOATVECTOR3(vMaxPoint.x, vMaxPoint.y, vMaxPoint.z), FLOATVECTOR3(vMaxCoords.x, vMaxCoords.y, vMaxCoords.z), FLOATVECTOR3(vMinPoint.x, vMinPoint.y, vMinPoint.z), FLOATVECTOR3(vMinCoords.x, vMinCoords.y, vMinCoords.z), eStereoID); m.setTextureMatrix(); std::vector<FLOATVECTOR3> posData; MaxMinBoxToVector(vMinPoint, vMaxPoint, posData); if ( m_bClipPlaneOn ) { // clip plane is normaly defined in world space, transform back to model space FLOATMATRIX4 inv = (renderRegion.rotation * renderRegion.translation).inverse(); PLANE<float> transformed = m_ClipPlane.Plane() * inv; const FLOATVECTOR3 normal(transformed.xyz().normalized()); const float d = transformed.d(); Clipper::BoxPlane(posData, normal, d); } m_pBBoxVBO->ClearVertexData(); m_pBBoxVBO->AddVertexData(posData); m_pBBoxVBO->Bind(); m_pBBoxVBO->Draw(GL_TRIANGLES); m_pBBoxVBO->UnBind(); }
Intersection intersectionLinePlane(const VEC3& P, const VEC3& Dir, const PLANE& Plane, VEC3& Inter) { return intersectionLinePlane(P, Dir, Plane.normal()*Plane.d(), Plane.normal(), Inter); }