#include "cafBoxManipulatorGeometryGenerator.h" #include "cvfBoxGenerator.h" #include "cvfDrawableGeo.h" #include "cvfGeometryBuilderFaceList.h" #include "cvfPrimitiveSetIndexedUInt.h" using namespace cvf; namespace caf { //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- BoxManipulatorGeometryGenerator::BoxManipulatorGeometryGenerator() { } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- BoxManipulatorGeometryGenerator::~BoxManipulatorGeometryGenerator() { } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void BoxManipulatorGeometryGenerator::setOrigin(const cvf::Vec3d& origin) { m_origin = origin; m_vertices = nullptr; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void BoxManipulatorGeometryGenerator::setSize(const cvf::Vec3d& size) { m_size = size; m_vertices = nullptr; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- cvf::ref BoxManipulatorGeometryGenerator::createBoundingBoxMeshDrawable() { if (m_vertices.isNull()) { calculateArrays(); } if (!(m_vertices.notNull() && m_vertices->size() != 0)) return NULL; cvf::ref geo = new cvf::DrawableGeo; geo->setVertexArray(m_vertices.p()); cvf::ref indices = lineIndicesFromQuadVertexArray(m_vertices.p()); cvf::ref prim = new cvf::PrimitiveSetIndexedUInt(cvf::PT_LINES); prim->setIndices(indices.p()); geo->addPrimitiveSet(prim.p()); return geo; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void BoxManipulatorGeometryGenerator::calculateArrays() { BoxGenerator gen; cvf::Vec3d min = m_origin; cvf::Vec3d max = m_origin + m_size; gen.setMinMax(min, max); gen.setSubdivisions(1, 1, 1); GeometryBuilderFaceList builder; gen.generate(&builder); m_vertices = builder.vertices(); // TODO: Rotate generated vertices } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- cvf::ref BoxManipulatorGeometryGenerator::lineIndicesFromQuadVertexArray(const cvf::Vec3fArray* vertexArray) { CVF_ASSERT(vertexArray); size_t numVertices = vertexArray->size(); int numQuads = static_cast(numVertices / 4); CVF_ASSERT(numVertices % 4 == 0); cvf::ref indices = new cvf::UIntArray; indices->resize(numQuads * 8); #pragma omp parallel for for (int i = 0; i < numQuads; i++) { int idx = 8 * i; indices->set(idx + 0, i * 4 + 0); indices->set(idx + 1, i * 4 + 1); indices->set(idx + 2, i * 4 + 1); indices->set(idx + 3, i * 4 + 2); indices->set(idx + 4, i * 4 + 2); indices->set(idx + 5, i * 4 + 3); indices->set(idx + 6, i * 4 + 3); indices->set(idx + 7, i * 4 + 0); } return indices; } } // namespace cvf