//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RivFemPartPartMgr::updateCellColor(cvf::Color4f color) { if (m_surfaceFaces.isNull()) return; // Set default effect caf::SurfaceEffectGenerator geometryEffgen(color, caf::PO_1); cvf::ref<cvf::Effect> geometryOnlyEffect = geometryEffgen.generateCachedEffect(); if (m_surfaceFaces.notNull()) m_surfaceFaces->setEffect(geometryOnlyEffect.p()); if (color.a() < 1.0f) { // Set priority to make sure this transparent geometry are rendered last if (m_surfaceFaces.notNull()) m_surfaceFaces->setPriority(100); } m_opacityLevel = color.a(); m_defaultColor = color.toColor3f(); // Update mesh colors as well, in case of change RiaPreferences* prefs = RiaApplication::instance()->preferences(); cvf::ref<cvf::Effect> eff; if (m_surfaceFaces.notNull()) { caf::MeshEffectGenerator effGen(prefs->defaultGridLineColors()); eff = effGen.generateCachedEffect(); m_surfaceGridLines->setEffect(eff.p()); } }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- cvf::ref<cvf::Part> RivWellFracturePartMgr::createScalarMapperPart(cvf::DrawableGeo* drawableGeo, const cvf::ScalarMapper* scalarMapper, RimFracture* fracture, bool disableLighting) { cvf::ref<cvf::Part> surfacePart = new cvf::Part(0, "FractureSurfacePart_stimPlan"); surfacePart->setDrawable(drawableGeo); surfacePart->setPriority(RivPartPriority::PartType::BaseLevel); surfacePart->setSourceInfo(new RivObjectSourceInfo(fracture)); caf::ScalarMapperEffectGenerator effGen(scalarMapper, caf::PO_1); effGen.disableLighting(disableLighting); cvf::ref<cvf::Effect> eff = effGen.generateCachedEffect(); surfacePart->setEffect(eff.p()); return surfacePart; }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RivGridBoxGenerator::createLegend(EdgeType edge, cvf::Collection<cvf::Part>* parts) { cvf::Vec3d posMin = cvf::Vec3d::ZERO; cvf::Vec3d posMax = cvf::Vec3d::ZERO; cvf::Vec3d min = m_displayCoordsBoundingBox.min(); cvf::Vec3d max = m_displayCoordsBoundingBox.max(); AxisType axis = X_AXIS; cvf::Vec3f tickMarkDir = cvf::Vec3f::X_AXIS; switch (edge) { case RivGridBoxGenerator::POS_Z_POS_X: axis = Y_AXIS; posMin.set(max.x(), min.y(), max.z()); posMax.set(max.x(), max.y(), max.z()); tickMarkDir = cornerDirection(POS_Z, POS_X); break; case RivGridBoxGenerator::POS_Z_NEG_X: axis = Y_AXIS; posMin.set(min.x(), min.y(), max.z()); posMax.set(min.x(), max.y(), max.z()); tickMarkDir = cornerDirection(POS_Z, NEG_X); break; case RivGridBoxGenerator::POS_Z_POS_Y: axis = X_AXIS; posMin.set(min.x(), max.y(), max.z()); posMax.set(max.x(), max.y(), max.z()); tickMarkDir = cornerDirection(POS_Z, POS_Y); break; case RivGridBoxGenerator::POS_Z_NEG_Y: axis = X_AXIS; posMin.set(min.x(), min.y(), max.z()); posMax.set(max.x(), min.y(), max.z()); tickMarkDir = cornerDirection(POS_Z, NEG_Y); break; case RivGridBoxGenerator::NEG_Z_POS_X: axis = Y_AXIS; posMin.set(max.x(), min.y(), min.z()); posMax.set(max.x(), max.y(), min.z()); tickMarkDir = cornerDirection(NEG_Z, POS_X); break; case RivGridBoxGenerator::NEG_Z_NEG_X: axis = Y_AXIS; posMin.set(min.x(), min.y(), min.z()); posMax.set(min.x(), max.y(), min.z()); tickMarkDir = cornerDirection(NEG_Z, NEG_X); break; case RivGridBoxGenerator::NEG_Z_POS_Y: axis = X_AXIS; posMin.set(min.x(), max.y(), min.z()); posMax.set(max.x(), max.y(), min.z()); tickMarkDir = cornerDirection(NEG_Z, POS_Y); break; case RivGridBoxGenerator::NEG_Z_NEG_Y: axis = X_AXIS; posMin.set(min.x(), min.y(), min.z()); posMax.set(max.x(), min.y(), min.z()); tickMarkDir = cornerDirection(NEG_Z, NEG_Y); break; case RivGridBoxGenerator::POS_X_POS_Y: axis = Z_AXIS; posMin.set(max.x(), max.y(), min.z()); posMax.set(max.x(), max.y(), max.z()); tickMarkDir = cornerDirection(POS_X, POS_Y); break; case RivGridBoxGenerator::POS_X_NEG_Y: axis = Z_AXIS; posMin.set(max.x(), min.y(), min.z()); posMax.set(max.x(), min.y(), max.z()); tickMarkDir = cornerDirection(POS_X, NEG_Y); break; case RivGridBoxGenerator::NEG_X_POS_Y: axis = Z_AXIS; posMin.set(min.x(), max.y(), min.z()); posMax.set(min.x(), max.y(), max.z()); tickMarkDir = cornerDirection(NEG_X, POS_Y); break; case RivGridBoxGenerator::NEG_X_NEG_Y: axis = Z_AXIS; posMin.set(min.x(), min.y(), min.z()); posMax.set(min.x(), min.y(), max.z()); tickMarkDir = cornerDirection(NEG_X, NEG_Y); break; default: CVF_TIGHT_ASSERT(false); break; } std::vector<double>* displayCoordsTickValues = NULL; std::vector<double>* domainCoordsTickValues = NULL; if (axis == X_AXIS) { displayCoordsTickValues = &m_displayCoordsXValues; domainCoordsTickValues = &m_domainCoordsXValues; } else if (axis == Y_AXIS) { displayCoordsTickValues = &m_displayCoordsYValues; domainCoordsTickValues = &m_domainCoordsYValues; } else if (axis == Z_AXIS) { displayCoordsTickValues = &m_displayCoordsZValues; domainCoordsTickValues = &m_domainCoordsZValues; } CVF_ASSERT(displayCoordsTickValues); CVF_ASSERT(domainCoordsTickValues); size_t numVerts = (displayCoordsTickValues->size()) * 2; size_t numLines = (displayCoordsTickValues->size()) + 1; cvf::ref<cvf::Vec3fArray> vertices = new cvf::Vec3fArray; vertices->reserve(numVerts); cvf::ref<cvf::UIntArray> indices = new cvf::UIntArray; indices->reserve(2 * numLines); float tickLength = static_cast<float>(m_displayCoordsBoundingBox.extent().length() / 100.0); cvf::Vec3f point = cvf::Vec3f(posMin); cvf::Vec3f tickPoint; // Tick marks for (size_t i = 0; i < displayCoordsTickValues->size(); ++i) { point[axis] = static_cast<float>(displayCoordsTickValues->at(i)); vertices->add(point); tickPoint = point + tickLength*tickMarkDir;; vertices->add(tickPoint); if (i == 0 || i == displayCoordsTickValues->size() - 1) { // Do not show tick mark at ends of legend // Add to list of indices to keep surrounding code unchanged indices->add(2 * static_cast<cvf::uint>(i)); indices->add(2 * static_cast<cvf::uint>(i)); } else { indices->add(2 * static_cast<cvf::uint>(i)); indices->add(2 * static_cast<cvf::uint>(i) + 1); } } // Backbone of legend indices->add(0); indices->add(static_cast<cvf::uint>(numVerts) - 2); { // Legend lines cvf::ref<cvf::DrawableGeo> geo = new cvf::DrawableGeo; geo->setVertexArray(vertices.p()); cvf::ref<cvf::PrimitiveSetIndexedUInt> primSet = new cvf::PrimitiveSetIndexedUInt(cvf::PT_LINES); primSet->setIndices(indices.p()); geo->addPrimitiveSet(primSet.p()); cvf::ref<cvf::Part> part = new cvf::Part; part->setName("Legend lines"); part->setDrawable(geo.p()); part->updateBoundingBox(); cvf::ref<cvf::Effect> eff; caf::MeshEffectGenerator effGen(m_gridLegendColor); eff = effGen.generateUnCachedEffect(); cvf::ref<cvf::RenderStateDepth> depth = new cvf::RenderStateDepth; depth->enableDepthTest(false); eff->setRenderState(depth.p()); part->setPriority(1500); part->setEffect(eff.p()); parts->push_back(part.p()); } { // Text labels cvf::ref<cvf::DrawableText> geo = new cvf::DrawableText; cvf::Font* standardFont = RiaApplication::instance()->standardFont(); geo->setFont(standardFont); geo->setTextColor(m_gridLegendColor); geo->setCheckPosVisible(false); geo->setDrawBackground(false); geo->setDrawBorder(false); // Do not draw legend labels at first/last tick mark for (size_t idx = 1; idx < domainCoordsTickValues->size() - 1; idx++) { double legendValue = domainCoordsTickValues->at(idx); if (axis == Z_AXIS) { legendValue = -domainCoordsTickValues->at(idx); } cvf::int64 integerValue = static_cast<cvf::int64>(legendValue); cvf::String numberText = cvf::String("%1").arg(integerValue); geo->addText(numberText, vertices->get(idx*2 + 1) + (0.5f * tickLength) * tickMarkDir); } cvf::ref<cvf::Part> part = new cvf::Part; part->setName("Legend text"); part->setDrawable(geo.p()); part->updateBoundingBox(); caf::TextEffectGenerator textGen; cvf::ref<cvf::Effect> eff = textGen.generateCachedEffect(); part->setEffect(eff.p()); parts->push_back(part.p()); } }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RivGridBoxGenerator::createGridBoxFaceParts() { m_gridBoxFaceParts.clear(); CVF_ASSERT(m_displayCoordsBoundingBox.isValid()); CVF_ASSERT(m_displayCoordsXValues.size() > 0); CVF_ASSERT(m_displayCoordsYValues.size() > 0); CVF_ASSERT(m_displayCoordsZValues.size() > 0); cvf::Vec3d min = m_displayCoordsBoundingBox.min(); cvf::Vec3d max = m_displayCoordsBoundingBox.max(); for (int face = POS_X; face <= NEG_Z; face++) { // TODO: move out of loop RivPatchGenerator patchGen; if (face == POS_X) { patchGen.setOrigin(cvf::Vec3d(max.x(), 0.0, 0.0)); patchGen.setAxes(cvf::Vec3d::Y_AXIS, cvf::Vec3d::Z_AXIS); patchGen.setSubdivisions(m_displayCoordsYValues, m_displayCoordsZValues); } else if (face == NEG_X) { patchGen.setOrigin(cvf::Vec3d(min.x(), 0.0, 0.0)); patchGen.setAxes(cvf::Vec3d::Y_AXIS, cvf::Vec3d::Z_AXIS); patchGen.setSubdivisions(m_displayCoordsYValues, m_displayCoordsZValues); } else if (face == POS_Y) { patchGen.setOrigin(cvf::Vec3d(0.0, max.y(), 0.0)); patchGen.setAxes(cvf::Vec3d::X_AXIS, cvf::Vec3d::Z_AXIS); patchGen.setSubdivisions(m_displayCoordsXValues, m_displayCoordsZValues); } else if (face == NEG_Y) { patchGen.setOrigin(cvf::Vec3d(0.0, min.y(), 0.0)); patchGen.setAxes(cvf::Vec3d::X_AXIS, cvf::Vec3d::Z_AXIS); patchGen.setSubdivisions(m_displayCoordsXValues, m_displayCoordsZValues); } else if (face == POS_Z) { patchGen.setOrigin(cvf::Vec3d(0.0, 0.0, max.z())); patchGen.setAxes(cvf::Vec3d::X_AXIS, cvf::Vec3d::Y_AXIS); patchGen.setSubdivisions(m_displayCoordsXValues, m_displayCoordsYValues); } else if (face == NEG_Z) { patchGen.setOrigin(cvf::Vec3d(0.0, 0.0, min.z())); patchGen.setAxes(cvf::Vec3d::X_AXIS, cvf::Vec3d::Y_AXIS); patchGen.setSubdivisions(m_displayCoordsXValues, m_displayCoordsYValues); } else { CVF_ASSERT(false); } cvf::GeometryBuilderFaceList builder; patchGen.generate(&builder); cvf::ref<cvf::Vec3fArray> vertexArray = builder.vertices(); cvf::ref<cvf::UIntArray> faceList = builder.faceList(); { // Box mesh cvf::MeshEdgeExtractor ee; ee.addFaceList(*faceList); cvf::ref<cvf::DrawableGeo> geo = new cvf::DrawableGeo; geo->setVertexArray(vertexArray.p()); geo->addPrimitiveSet(new cvf::PrimitiveSetIndexedUInt(cvf::PT_LINES, ee.lineIndices().p())); cvf::ref<cvf::Part> part = new cvf::Part; part->setName("Grid box "); part->setDrawable(geo.p()); part->updateBoundingBox(); cvf::ref<cvf::Effect> eff; caf::MeshEffectGenerator effGen(m_gridColor); eff = effGen.generateCachedEffect(); part->setEffect(eff.p()); m_gridBoxFaceParts.push_back(part.p()); } } }
void RivGridPartMgr::generatePartGeometry(cvf::StructGridGeometryGenerator& geoBuilder, bool faultGeometry) { bool useBufferObjects = true; // Surface geometry { cvf::ref<cvf::DrawableGeo> geo = geoBuilder.generateSurface(); if (geo.notNull()) { geo->computeNormals(); if (useBufferObjects) { geo->setRenderMode(cvf::DrawableGeo::BUFFER_OBJECT); } cvf::ref<cvf::Part> part = new cvf::Part; part->setName("Grid " + cvf::String(static_cast<int>(m_gridIdx))); part->setId(m_gridIdx); // !! For now, use grid index as part ID (needed for pick info) part->setDrawable(geo.p()); part->setTransform(m_scaleTransform.p()); // Set mapping from triangle face index to cell index part->setSourceInfo(geoBuilder.triangleToSourceGridCellMap().p()); part->updateBoundingBox(); // Set default effect caf::SurfaceEffectGenerator geometryEffgen(cvf::Color4f(cvf::Color3f::WHITE), true); cvf::ref<cvf::Effect> geometryOnlyEffect = geometryEffgen.generateEffect(); part->setEffect(geometryOnlyEffect.p()); if (faultGeometry) { part->setEnableMask(faultBit); m_faultFaces = part; } else { part->setEnableMask(surfaceBit); m_surfaceFaces = part; } } } // Mesh geometry { cvf::ref<cvf::DrawableGeo> geoMesh = geoBuilder.createMeshDrawable(); if (geoMesh.notNull()) { if (useBufferObjects) { geoMesh->setRenderMode(cvf::DrawableGeo::BUFFER_OBJECT); } cvf::ref<cvf::Part> part = new cvf::Part; part->setName("Grid mesh " + cvf::String(static_cast<int>(m_gridIdx))); part->setDrawable(geoMesh.p()); part->setTransform(m_scaleTransform.p()); part->updateBoundingBox(); cvf::ref<cvf::Effect> eff; if (faultGeometry) { caf::MeshEffectGenerator effGen(cvf::Color3f::BLACK); eff = effGen.generateEffect(); part->setEnableMask(meshFaultBit); part->setEffect(eff.p()); m_faultGridLines = part; } else { caf::MeshEffectGenerator effGen(cvf::Color3f::WHITE); eff = effGen.generateEffect(); // Set priority to make sure fault lines are rendered first part->setPriority(10); part->setEnableMask(meshSurfaceBit); part->setEffect(eff.p()); m_surfaceGridLines = part; } } } }
void RivFemPartPartMgr::generatePartGeometry(RivFemPartGeometryGenerator& geoBuilder) { bool useBufferObjects = true; // Surface geometry { m_surfaceFaces = NULL; // To possibly free memory before adding the new stuff cvf::ref<cvf::DrawableGeo> geo = geoBuilder.generateSurface(); if (geo.notNull()) { geo->computeNormals(); if (useBufferObjects) { geo->setRenderMode(cvf::DrawableGeo::BUFFER_OBJECT); } cvf::ref<cvf::Part> part = new cvf::Part; part->setName("FemPart " + cvf::String(m_gridIdx)); part->setId(m_gridIdx); // Use grid index as part ID part->setDrawable(geo.p()); part->setTransform(m_scaleTransform.p()); // Set mapping from triangle face index to element index cvf::ref<RivFemPickSourceInfo> si = new RivFemPickSourceInfo(m_gridIdx, geoBuilder.triangleToElementMapper()); part->setSourceInfo(si.p()); part->updateBoundingBox(); // Set default effect caf::SurfaceEffectGenerator geometryEffgen(cvf::Color4f(cvf::Color3f::WHITE), caf::PO_1); cvf::ref<cvf::Effect> geometryOnlyEffect = geometryEffgen.generateCachedEffect(); part->setEffect(geometryOnlyEffect.p()); part->setEnableMask(surfaceBit); m_surfaceFaces = part; } } // Mesh geometry { m_surfaceGridLines = NULL; // To possibly free memory before adding the new stuff cvf::ref<cvf::DrawableGeo> geoMesh = geoBuilder.createMeshDrawable(); if (geoMesh.notNull()) { if (useBufferObjects) { geoMesh->setRenderMode(cvf::DrawableGeo::BUFFER_OBJECT); } cvf::ref<cvf::Part> part = new cvf::Part; part->setName("Grid mesh " + cvf::String(m_gridIdx)); part->setDrawable(geoMesh.p()); part->setTransform(m_scaleTransform.p()); part->updateBoundingBox(); RiaPreferences* prefs = RiaApplication::instance()->preferences(); cvf::ref<cvf::Effect> eff; caf::MeshEffectGenerator effGen(prefs->defaultGridLineColors()); eff = effGen.generateCachedEffect(); // Set priority to make sure fault lines are rendered first part->setPriority(10); part->setEnableMask(meshSurfaceBit); part->setEffect(eff.p()); m_surfaceGridLines = part; } } }