7 #include "imstkCamera.h" 8 #include "imstkImageData.h" 9 #include "imstkKeyboardDeviceClient.h" 10 #include "imstkKeyboardSceneControl.h" 11 #include "imstkLineMesh.h" 12 #include "imstkMeshIO.h" 13 #include "imstkMouseDeviceClient.h" 14 #include "imstkMouseSceneControl.h" 16 #include "imstkRenderMaterial.h" 17 #include "imstkScene.h" 18 #include "imstkSceneManager.h" 19 #include "imstkSceneObject.h" 20 #include "imstkSimulationManager.h" 21 #include "imstkSimulationUtils.h" 22 #include "imstkSpotLight.h" 23 #include "imstkSurfaceMesh.h" 24 #include "imstkVecDataArray.h" 25 #include "imstkVisualModel.h" 26 #include "imstkVTKRenderer.h" 27 #include "imstkVTKViewer.h" 29 #include <vtkImageData.h> 30 #include <vtkJPEGReader.h> 31 #include <vtkOpenGLRenderer.h> 32 #include <vtkSkybox.h> 33 #include <vtkTexture.h> 35 using namespace imstk;
43 const Vec3d& p0,
const Vec3d& p1,
44 const Vec3d& p2,
const Vec3d& p3,
47 const double t2 = t * t;
48 const double t3 = t2 * t;
49 return p1 + 0.5 * ((-p0 + p2) * t
50 + (2.0 * p0 - 5.0 * p1 + 4.0 * p2 - p3) * t2
51 + (-p0 + 3.0 * p1 - 3.0 * p2 + p3) * t3);
59 getSplinePositionFromLineMesh(
double dist, std::shared_ptr<LineMesh> lineMesh)
61 std::shared_ptr<VecDataArray<double, 3>> verticesPtr = lineMesh->getVertexPositions();
63 CHECK(vertices.size() >= 2) <<
"Must have at least 2 vertices";
64 auto vertexDistPtr = std::dynamic_pointer_cast<
DataArray<double>>(lineMesh->getVertexAttribute(
"distances"));
66 const double startLength = vertexDist[0];
67 const double endLength = vertexDist[vertexDist.size() - 1];
70 if (dist <= startLength)
72 const Vec3d m = (vertices[1] - vertices[0]).normalized();
73 return vertices[0] + m * -dist;
75 if (dist >= endLength)
77 const Vec3d m = (vertices[vertices.size() - 1] - vertices[vertices.size() - 2]).normalized();
78 return vertices[vertices.size() - 1] + m * dist;
83 for (
int i = 0; i < vertices.size() - 1; i++)
85 if (dist > vertexDist[i] && dist <= vertexDist[i + 1])
93 const int i0 = std::max(std::min(j - 1, vertices.size() - 1), 0);
94 const int i1 = std::max(std::min(j, vertices.size() - 1), 0);
95 const int i2 = std::max(std::min(j + 1, vertices.size() - 1), 0);
96 const int i3 = std::max(std::min(j + 2, vertices.size() - 1), 0);
100 const Vec3d a = vertices[i0];
101 const Vec3d b = vertices[i1];
102 const Vec3d c = vertices[i2];
103 const Vec3d d = vertices[i3];
106 const double distb = vertexDist[j];
107 const double distc = vertexDist[j + 1];
108 const double frac = (dist - distb) / (distc - distb);
110 const Vec3d results = catmullRom(a, b, c, d, frac);
125 auto colonObject = std::make_shared<SceneObject>(
"colon");
128 colonMaterial->setDisplayMode(RenderMaterial::DisplayMode::Surface);
131 MeshIO::read<ImageData>(iMSTK_DATA_ROOT
"/Organs/Colon/colon_BaseColor.png");
132 colonMaterial->
addTexture(std::make_shared<Texture>(diffuseTexImg, Texture::Type::Diffuse));
134 MeshIO::read<ImageData>(iMSTK_DATA_ROOT
"/Organs/Colon/colon_Normal.png");
135 colonMaterial->
addTexture(std::make_shared<Texture>(normalTexImg, Texture::Type::Normal));
136 colonMaterial->setRecomputeVertexNormals(
true);
137 colonMaterial->setBackFaceCulling(
true);
138 colonMaterial->setMetalness(0.0);
139 colonMaterial->setRoughness(0.26);
140 colonMaterial->setNormalStrength(5.0);
141 colonMaterial->setOcclusionStrength(0.0);
143 colonMaterial->
addTexture(std::make_shared<Texture>(normalTexImg, Texture::Type::CoatNormal));
144 colonMaterial->setCoatRoughness(0.1);
145 colonMaterial->setCoatStrength(1.0);
147 colonMaterial->setCoatIOR(3.0);
148 colonMaterial->setBaseIOR(3.0);
149 colonMaterial->setCoatNormalScale(0.5);
152 auto surfMesh = MeshIO::read<SurfaceMesh>(iMSTK_DATA_ROOT
"/Organs/Colon/colon.obj");
155 visualModel->setGeometry(surfMesh);
156 visualModel->setRenderMaterial(colonMaterial);
157 colonObject->addVisualModel(visualModel);
159 scene->addSceneObject(colonObject);
161 auto colonMedialMesh = MeshIO::read<LineMesh>(iMSTK_DATA_ROOT
"/Organs/Colon/colonMedialMesh.obj");
162 double totalLength = 0.0;
165 std::shared_ptr<VecDataArray<double, 3>> verticesPtr = colonMedialMesh->getVertexPositions();
167 auto vertexDistPtr = std::make_shared<DataArray<double>>(verticesPtr->size());
169 colonMedialMesh->setVertexScalars(
"distances", vertexDistPtr);
171 for (
int i = 1; i < vertices.size(); i++)
173 const double length = (vertices[i] - vertices[i - 1]).norm();
174 vertexDist[i] = vertexDist[i - 1] + length;
176 totalLength = vertexDist[vertexDist.size() - 1];
185 scene->addLight(
"light", light);
195 scene->computeBoundingBox(l, u);
196 const double sceneSize = (u - l).norm();
198 auto renderConfig = std::make_shared<RendererConfig>();
199 renderConfig->m_ssaoConfig.m_enableSSAO =
true;
200 renderConfig->m_ssaoConfig.m_SSAOBlur =
true;
201 renderConfig->m_ssaoConfig.m_SSAORadius = 50.0 * sceneSize;
202 renderConfig->m_ssaoConfig.m_SSAOBias = 0.03 * sceneSize;
203 renderConfig->m_ssaoConfig.m_KernelSize = 128;
209 sceneManager->pause();
216 std::shared_ptr<Entity> mouseAndKeyControls =
217 SimulationUtils::createDefaultSceneControl(driver);
218 scene->addSceneObject(mouseAndKeyControls);
221 std::shared_ptr<Camera> cam = scene->getActiveCamera();
224 const Vec3d eyePos = getSplinePositionFromLineMesh(0.0, colonMedialMesh);
225 const Vec3d focalPt = getSplinePositionFromLineMesh(0.07, colonMedialMesh);
226 cam->setPosition(eyePos);
227 cam->setFocalPoint(focalPt);
228 light->setPosition(eyePos);
233 connect<Event>(sceneManager, &SceneManager::postUpdate,
236 t += sceneManager->
getDt();
238 const double velocity = 0.1;
239 const double dist = std::min(t * velocity, totalLength);
240 const Vec3d eyePos = getSplinePositionFromLineMesh(dist, colonMedialMesh);
241 const Vec3d focalPt = getSplinePositionFromLineMesh(dist + 0.07, colonMedialMesh);
243 cam->setPosition(eyePos);
244 cam->setFocalPoint(focalPt);
245 light->setPosition(eyePos);
249 connect<Event>(driver, &SimulationManager::starting, [&](
Event*)
252 vtkSmartPointer<vtkOpenGLRenderer> oRen = vtkOpenGLRenderer::SafeDownCast(ren);
253 vtkNew<vtkJPEGReader> reader;
254 reader->SetFileName(iMSTK_DATA_ROOT
"/Organs/Colon/colon_irradiance_environment_map.jpg");
257 vtkNew<vtkTexture> texture;
260 texture->InterpolateOn();
261 texture->SetInputData(reader->GetOutput());
262 texture->SetColorModeToDirectScalars();
263 texture->SetCubeMap(
false);
270 ren->AutomaticLightCreationOff();
271 oRen->UseSphericalHarmonicsOff();
272 ren->UseImageBasedLightingOn();
273 ren->SetEnvironmentTexture(texture);
void addTexture(std::shared_ptr< Texture > texture)
Add/Remove/Get texture.
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...
void setAttenuationValues(const double a, const double b, const double c)
Sets the attenuation values. Quadratic, linear, and constant c (ax^2+bx+c) (a,b,c) = {0...
void addModule(std::shared_ptr< Module > module) override
Add a module to run.
virtual void setBackgroundColors(const Color color1, const Color color2=Color(0.0, 0.0, 0.0), const bool gradientBackground=false) override
Set the coloring of the screen background If 'gradientBackground' is false or not supplied color1 wil...
void setIntensity(const double intensity)
Set the light intensity. This value is unbounded.
double getDt() const
Get/Set the time step.
std::shared_ptr<T> obj = std::make_shared<T>(); equivalent, convenience class for STL shared allocati...
std::shared_ptr< Renderer > getActiveRenderer() const
Retrieve the renderer associated with the current scene.
static Color White
Various commonly used colors.
void setSpotAngle(const double angle)
Set the spotlight angle in degrees.
void setFocalPoint(const Vec3d &p)
Get/Set the light focal point.
void setActiveScene(std::string newSceneName)
Sets the currently updating scene.
Physically based rendering.
static LoggerG3 & startLogger()
Starts logger with default sinks, use getInstance to create a logger with no sinks.