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.