7 #include "imstkCamera.h"     8 #include "imstkDirectionalLight.h"     9 #include "imstkKeyboardDeviceClient.h"    10 #include "imstkKeyboardSceneControl.h"    11 #include "imstkLooseOctree.h"    12 #include "imstkMouseDeviceClient.h"    13 #include "imstkMouseSceneControl.h"    15 #include "imstkRenderMaterial.h"    16 #include "imstkScene.h"    17 #include "imstkSceneManager.h"    18 #include "imstkSceneObject.h"    19 #include "imstkSimulationManager.h"    20 #include "imstkSimulationUtils.h"    21 #include "imstkSurfaceMesh.h"    22 #include "imstkTextVisualModel.h"    23 #include "imstkVisualModel.h"    24 #include "imstkVTKViewer.h"    25 #include "OctreeDebugModel.h"    27 using namespace imstk;
    30 #define NUM_MESHES 10u    33 std::pair<std::shared_ptr<VecDataArray<double, 3>>, std::shared_ptr<VecDataArray<int, 3>>> getBunny();
    34 static std::pair<std::shared_ptr<VecDataArray<double, 3>>, std::shared_ptr<VecDataArray<int, 3>>> g_BunnyData = getBunny();
    39 std::shared_ptr<SceneObject>
    40 createMeshObject(
const std::string& objectName,
    45     std::shared_ptr<VecDataArray<double, 3>> verticesPtr = std::make_shared<VecDataArray<double, 3>>();
    46     *verticesPtr = *g_BunnyData.first;
    47     std::shared_ptr<VecDataArray<int, 3>> indicesPtr = std::make_shared<VecDataArray<int, 3>>();
    48     *indicesPtr = *g_BunnyData.second;
    53     visualModel->setGeometry(surfMesh);
    55     material->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
    56     material->setColor(color); 
    57     material->setLineWidth(1.0);
    61     visualObject->addVisualModel(visualModel);
    72     Color color(0, 0, 0, 1);
    75         for (
unsigned int i = 0; i < 3; ++i)
    77             color.rgba[i] = 
static_cast<double>(rand()) / static_cast<double>(RAND_MAX);
    79         if (color.rgba[0] > 0.95
    80             || color.rgba[1] > 0.95
    81             || color.rgba[2] > 0.95)
   107     auto statusText = std::make_shared<TextVisualModel>(
"StatusText");
   108     statusText->setFontSize(30.0);
   109     statusText->setTextColor(Color::Orange);
   110     statusText->setPosition(TextVisualModel::DisplayPosition::UpperLeft);
   113     srand(static_cast<unsigned int>(time(
nullptr)));
   116     std::vector<std::shared_ptr<SurfaceMesh>> triMeshes;
   117     for (
unsigned int i = 0; i < NUM_MESHES; ++i)
   119         std::shared_ptr<SceneObject> sceneObj = createMeshObject(
"Mesh-" + std::to_string(triMeshes.size()), getRandomColor());
   120         scene->addSceneObject(sceneObj);
   121         triMeshes.push_back(std::dynamic_pointer_cast<SurfaceMesh>(sceneObj->getVisualGeometry()));
   125     Vec3d      lowerCorner, upperCorner;
   126     const auto pointset = std::dynamic_pointer_cast<
PointSet>(triMeshes.front());
   127     ParallelUtils::findAABB(*pointset->getVertexPositions(), lowerCorner, upperCorner);
   128     const auto scaleFactor = 20.0 / (upperCorner - lowerCorner).norm();
   129     for (
const auto& mesh : triMeshes)
   131         mesh->
scale(scaleFactor, Geometry::TransformType::ApplyToData);
   141     for (
const auto& mesh : triMeshes)
   143         octree->addTriangleMesh(mesh);
   148     LOG(INFO) << 
"Build octree time: " << timer.
getTimeElapsed() << 
" ms";
   154     auto debugOctreeObj   = std::make_shared<Entity>();
   156     debugOctreeModel->setInputOctree(octree);
   157     debugOctreeModel->setLineWidth(1.0);
   158     debugOctreeModel->setLineColor(Color::Green);
   159     scene->addSceneObject(debugOctreeObj);
   162     const double            translation = 15.0;
   165     for (
unsigned int i = 0; i < NUM_MESHES; ++i)
   167         centers.
push_back(Vec3d(translation, 0, 0));
   172     const double angle = 2.0 * PI / NUM_MESHES;
   173     for (
unsigned int i = 0; i < NUM_MESHES; ++i)
   175         const auto rotation = angle * 
static_cast<double>(i);
   176         triMeshes[i]->translate(translation, 0, 1, Geometry::TransformType::ApplyToData);
   177         triMeshes[i]->rotate(Vec3d(0, 1, 0), rotation, Geometry::TransformType::ApplyToData);
   179         auto t = centers[i][0];
   180         centers[i][0] = std::cos(rotation) * t;
   181         centers[i][2] = -std::sin(rotation) * t;
   184         dirs[i][0] = std::cos(rotation) * t;
   185         dirs[i][2] = -std::sin(rotation) * t;
   191             for (
size_t i = 0; i < triMeshes.size(); ++i)
   193                 triMeshes[i]->translate(dirs[i][0], dirs[i][1], dirs[i][2], Geometry::TransformType::ApplyToData);
   194                 centers[i] += dirs[i];
   197             Vec3d lowerCorners, upperCorner;
   198             ParallelUtils::findAABB(centers, lowerCorners, upperCorner);
   199             if ((lowerCorners - upperCorner).norm() > 70.0)
   201                 for (
size_t i = 0; i < static_cast<size_t>(dirs.size()); i++)
   212             const auto numActiveNodes          = octree->getNumActiveNodes();
   213             const auto numAllocatedNodes       = octree->getNumAllocatedNodes();
   214             const auto maxNumPrimitivesInNodes = octree->getMaxNumPrimitivesInNodes();
   216             std::stringstream ss;
   217             ss << 
"Octree update time: " << updateTime << 
" ms\n"   218                << 
"Active nodes: " << numActiveNodes
   219                << 
" (" << 
static_cast<double>(numActiveNodes) / static_cast<double>(numAllocatedNodes) * 100.0
   220                << 
" % usage / total allocated nodes: " << numAllocatedNodes << 
")\n"   221                << 
"Max number of primitives in tree nodes: " << maxNumPrimitivesInNodes;
   223             statusText->setText(ss.str());
   227     auto cam = scene->getActiveCamera();
   228     cam->setPosition(Vec3d(0, 15, 50));
   229     cam->setFocalPoint(Vec3d(0, 0, 0));
   236         scene->addLight(
"light 1", light1);
   241         scene->addLight(
"light 2", light2);
   249         sceneManager->pause(); 
   250         connect<Event>(sceneManager, &SceneManager::postUpdate, updateFunc);
   253         driver->addModule(viewer);
   254         driver->addModule(sceneManager);
   255         driver->setDesiredDt(0.05);
   258         connect<Event>(viewer, &Viewer::preUpdate, [&](
Event*)
   262                 debugOctreeModel->debugUpdate(8, 
true);
   266         std::shared_ptr<Entity> mouseAndKeyControls =
   267             SimulationUtils::createDefaultSceneControl(driver);
   268         mouseAndKeyControls->addComponent(statusText);
   269         scene->addSceneObject(mouseAndKeyControls);
 Base class for all geometries represented by discrete points and elements The pointsets follow a pipe...
 
void setActiveScene(std::shared_ptr< Scene > scene) override
Set scene to be rendered. 
 
Base class for events which contain a type, priority, and data priority defaults to 0 and uses a grea...
 
virtual void start()
Start the appropriate timer. 
 
void initialize(std::shared_ptr< VecDataArray< double, 3 >> vertices, std::shared_ptr< VecDataArray< int, 3 >> triangleIndices, const bool computeDerivedData=false)
Initializes the rest of the data structures given vertex positions and triangle connectivity. 
 
void push_back(const ValueType &val)
Append the data array to hold the new value, resizes if neccesary. 
 
void setIntensity(const double intensity)
Set the light intensity. This value is unbounded. 
 
void scale(const Vec3d &scaling, TransformType type=TransformType::ConcatenateToTransform)
Scale in Cartesian directions. 
 
std::shared_ptr<T> obj = std::make_shared<T>(); equivalent, convenience class for STL shared allocati...
 
void setRenderMaterial(std::shared_ptr< RenderMaterial > renderMaterial)
Set/Get render material. 
 
Stop Watch utility class. 
 
void setFocalPoint(const Vec3d &p)
Get/Set the light focal point. 
 
void setActiveScene(std::string newSceneName)
Sets the currently updating scene. 
 
OctreeDebugModel for debug visualizing an octree. 
 
virtual double getTimeElapsed(const TimeUnitType unitType=TimeUnitType::milliSeconds)
Returns the time elapsed since calling start. 
 
void setSize(const int width, const int height) override
Set the render window size. 
 
static LoggerG3 & startLogger()
Starts logger with default sinks, use getInstance to create a logger with no sinks. 
 
void setWindowTitle(const std::string &title) override
Set the render window title.