void DefaultPointHandleRenderer::render(Vbo& vbo, RenderContext& context) { const Vec4f::List& positionList = positions(); if (positionList.empty()) return; SetVboState activateVbo(vbo, Vbo::VboActive); if (m_vertexArray == NULL) { Vec3f::List vertices = sphere(); unsigned int vertexCount = static_cast<unsigned int>(vertices.size()); m_vertexArray = new VertexArray(vbo, GL_TRIANGLES, vertexCount, Attribute::position3f()); SetVboState mapVbo(vbo, Vbo::VboMapped); Vec3f::List::const_iterator vIt, vEnd; for (vIt = vertices.begin(), vEnd = vertices.end(); vIt != vEnd; ++vIt) { const Vec3f& vertex = *vIt; m_vertexArray->addAttribute(vertex); } } Renderer::ActivateShader shader(context.shaderManager(), Renderer::Shaders::PointHandleShader); shader.currentShader().setUniformVariable("Color", color()); shader.currentShader().setUniformVariable("CameraPosition", context.camera().position()); shader.currentShader().setUniformVariable("ScalingFactor", scalingFactor()); shader.currentShader().setUniformVariable("MaximumDistance", maximumDistance()); Vec4f::List::const_iterator pIt, pEnd; for (pIt = positionList.begin(), pEnd = positionList.end(); pIt != pEnd; ++pIt) { const Vec4f& position = *pIt; shader.currentShader().setUniformVariable("Position", position); m_vertexArray->render(); } }
void InstancedPointHandleRenderer::render(Vbo& vbo, RenderContext& context) { SetVboState activateVbo(vbo, Vbo::VboActive); if (!valid()) { delete m_vertexArray; m_vertexArray = NULL; const Vec4f::List& positionList = positions(); if (!positionList.empty()) { Vec3f::List vertices = sphere(); unsigned int vertexCount = static_cast<unsigned int>(vertices.size()); unsigned int instanceCount = static_cast<unsigned int>(positionList.size()); m_vertexArray = new InstancedVertexArray(vbo, GL_TRIANGLES, vertexCount, instanceCount, Attribute::position3f()); SetVboState mapVbo(vbo, Vbo::VboMapped); Vec3f::List::iterator it, end; for (it = vertices.begin(), end = vertices.end(); it != end; ++it) m_vertexArray->addAttribute(*it); m_vertexArray->addAttributeArray("position", positionList); } validate(); } if (m_vertexArray != NULL) { Renderer::ActivateShader shader(context.shaderManager(), Renderer::Shaders::InstancedPointHandleShader); shader.currentShader().setUniformVariable("Color", color()); shader.currentShader().setUniformVariable("CameraPosition", context.camera().position()); shader.currentShader().setUniformVariable("ScalingFactor", scalingFactor()); shader.currentShader().setUniformVariable("MaximumDistance", maximumDistance()); m_vertexArray->render(shader.currentShader()); } }
kIOS BVFitter<kIOS>::fit(unsigned int* primitive_indices, int num_primitives) { kIOS bv; Matrix3f M; // row first matrix Vec3f E[3]; // row first eigen-vectors Matrix3f::U s[3]; getCovariance(vertices, prev_vertices, tri_indices, primitive_indices, num_primitives, M); eigen(M, s, E); Vec3f* axis = bv.obb.axis; axisFromEigen(E, s, axis); // get centers and extensions getExtentAndCenter(vertices, prev_vertices, tri_indices, primitive_indices, num_primitives, axis, bv.obb.To, bv.obb.extent); const Vec3f& center = bv.obb.To; const Vec3f& extent = bv.obb.extent; FCL_REAL r0 = maximumDistance(vertices, prev_vertices, tri_indices, primitive_indices, num_primitives, center); // decide k in kIOS if(extent[0] > kIOS_RATIO * extent[2]) { if(extent[0] > kIOS_RATIO * extent[1]) bv.num_spheres = 5; else bv.num_spheres = 3; } else bv.num_spheres = 1; bv.spheres[0].o = center; bv.spheres[0].r = r0; if(bv.num_spheres >= 3) { FCL_REAL r10 = sqrt(r0 * r0 - extent[2] * extent[2]) * invSinA; Vec3f delta = axis[2] * (r10 * cosA - extent[2]); bv.spheres[1].o = center - delta; bv.spheres[2].o = center + delta; FCL_REAL r11 = maximumDistance(vertices, prev_vertices, tri_indices, primitive_indices, num_primitives, bv.spheres[1].o); FCL_REAL r12 = maximumDistance(vertices, prev_vertices, tri_indices, primitive_indices, num_primitives, bv.spheres[2].o); bv.spheres[1].o += axis[2] * (-r10 + r11); bv.spheres[2].o += axis[2] * (r10 - r12); bv.spheres[1].r = r10; bv.spheres[2].r = r10; } if(bv.num_spheres >= 5) { FCL_REAL r10 = bv.spheres[1].r; Vec3f delta = axis[1] * (sqrt(r10 * r10 - extent[0] * extent[0] - extent[2] * extent[2]) - extent[1]); bv.spheres[3].o = bv.spheres[0].o - delta; bv.spheres[4].o = bv.spheres[0].o + delta; FCL_REAL r21 = 0, r22 = 0; r21 = maximumDistance(vertices, prev_vertices, tri_indices, primitive_indices, num_primitives, bv.spheres[3].o); r22 = maximumDistance(vertices, prev_vertices, tri_indices, primitive_indices, num_primitives, bv.spheres[4].o); bv.spheres[3].o += axis[1] * (-r10 + r21); bv.spheres[4].o += axis[1] * (r10 - r22); bv.spheres[3].r = r10; bv.spheres[4].r = r10; } return bv; }
void fitn(Vec3f* ps, int n, kIOS& bv) { Matrix3f M; Vec3f E[3]; Matrix3f::U s[3] = {0, 0, 0}; // three eigen values; getCovariance(ps, NULL, NULL, NULL, n, M); eigen(M, s, E); Vec3f* axis = bv.obb.axis; axisFromEigen(E, s, axis); getExtentAndCenter(ps, NULL, NULL, NULL, n, axis, bv.obb.To, bv.obb.extent); // get center and extension const Vec3f& center = bv.obb.To; const Vec3f& extent = bv.obb.extent; FCL_REAL r0 = maximumDistance(ps, NULL, NULL, NULL, n, center); // decide the k in kIOS if(extent[0] > kIOS_RATIO * extent[2]) { if(extent[0] > kIOS_RATIO * extent[1]) bv.num_spheres = 5; else bv.num_spheres = 3; } else bv.num_spheres = 1; bv.spheres[0].o = center; bv.spheres[0].r = r0; if(bv.num_spheres >= 3) { FCL_REAL r10 = sqrt(r0 * r0 - extent[2] * extent[2]) * invSinA; Vec3f delta = axis[2] * (r10 * cosA - extent[2]); bv.spheres[1].o = center - delta; bv.spheres[2].o = center + delta; FCL_REAL r11 = 0, r12 = 0; r11 = maximumDistance(ps, NULL, NULL, NULL, n, bv.spheres[1].o); r12 = maximumDistance(ps, NULL, NULL, NULL, n, bv.spheres[2].o); bv.spheres[1].o += axis[2] * (-r10 + r11); bv.spheres[2].o += axis[2] * (r10 - r12); bv.spheres[1].r = r10; bv.spheres[2].r = r10; } if(bv.num_spheres >= 5) { FCL_REAL r10 = bv.spheres[1].r; Vec3f delta = axis[1] * (sqrt(r10 * r10 - extent[0] * extent[0] - extent[2] * extent[2]) - extent[1]); bv.spheres[3].o = bv.spheres[0].o - delta; bv.spheres[4].o = bv.spheres[0].o + delta; FCL_REAL r21 = 0, r22 = 0; r21 = maximumDistance(ps, NULL, NULL, NULL, n, bv.spheres[3].o); r22 = maximumDistance(ps, NULL, NULL, NULL, n, bv.spheres[4].o); bv.spheres[3].o += axis[1] * (-r10 + r21); bv.spheres[4].o += axis[1] * (r10 - r22); bv.spheres[3].r = r10; bv.spheres[4].r = r10; } }