diff --git a/Examples/AVMNidus/main.cpp b/Examples/AVMNidus/main.cpp index f5bacc52c5b65638a3ff9b6c5b6eba11cf950778..0e56984773508e84ed3510169e318e0bbf599c91 100644 --- a/Examples/AVMNidus/main.cpp +++ b/Examples/AVMNidus/main.cpp @@ -46,8 +46,6 @@ #include "VTKRendering/InitVTKRendering.h" #include "IO/IOMesh.h" -#include <vtkShader.h> - int main(int ac, char **av) { std::string configFile = "./nidus.config"; @@ -59,140 +57,64 @@ int main(int ac, char **av) InitVTKRendering(); InitIODelegates(); - Matrix33d mat; - //------------------------------------------------------- // 1. Create an instance of the SimMedTK framework/SDK // 2. Create viewer // 3. Create default scene (scene 0) //------------------------------------------------------- auto sdk = SDK::createStandardSDK(); + auto sdkSimulator = sdk->getSimulator(); //------------------------------------------------------- // Create scene actor 1: fem scene object + fem simulator //------------------------------------------------------- - // create a FEM simulator - // auto femSimulator = std::make_shared<VegaFemSimulator>(sdk->getErrorLog()); + auto femSimulator = std::make_shared<VegaFemSimulator>(sdk->getErrorLog()); // create a Vega based FEM object and attach it to the fem simulator - //auto femObject = std::make_shared<VegaFemSceneObject>(sdk->getErrorLog(),configFile); - - auto meshRenderDetail = std::make_shared<RenderDetail>(//SIMMEDTK_RENDER_WIREFRAME | - //| SIMMEDTK_RENDER_VERTICES - SIMMEDTK_RENDER_FACES | SIMMEDTK_RENDER_NORMALS - ); - meshRenderDetail->setAmbientColor(Color(0.2,0.2,0.2,1.0)); - meshRenderDetail->setDiffuseColor(Color::colorGray); - meshRenderDetail->setSpecularColor(Color(1.0, 1.0, 1.0,0.5)); - meshRenderDetail->setShininess(20.0); - - // Set shader porograms - - //meshRenderDetail->addShaderProgram(vtkShader::Vertex,"shaders/wet_vert.glsl","wetshader"); - //meshRenderDetail->addShaderProgram(vtkShader::Fragment,"shaders/wet_frag.glsl","wetshader"); - Shaders::createShader("wetshader", "shaders/wet_vert.glsl", "shaders/wet_frag.glsl", ""); - meshRenderDetail->addShaderProgram("wetshader"); - //meshRenderDetail->addTexture("decal", "textures/metal1.bmp", "textureDecal", "wetshader"); - //meshRenderDetail->addTexture("bump", "textures/metalbump.jpg", "textureBump", "wetshader"); - - meshRenderDetail->addTexture("decal", "textures/brainx.bmp", "textureDecal", "wetshader"); - meshRenderDetail->addTexture("bump", "textures/metalbump.jpg", "textureBump", "wetshader"); + auto femObject = std::make_shared<VegaFemSceneObject>(sdk->getErrorLog(),configFile); - - auto planeMeshRenderDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_FACES | SIMMEDTK_RENDER_NORMALS); - planeMeshRenderDetail->setAmbientColor(Color(0.2, 0.2, 0.2, 1.0)); - planeMeshRenderDetail->setDiffuseColor(Color::colorGray); - planeMeshRenderDetail->setSpecularColor(Color(1.0, 1.0, 1.0, 0.5)); - planeMeshRenderDetail->setShininess(20.0); - - // Set shader porograms - planeMeshRenderDetail->addShaderProgram("wetshader"); - planeMeshRenderDetail->addTexture("decal", "textures/brain_outside.jpg", "textureDecal", "wetshader"); - planeMeshRenderDetail->addTexture("bump", "textures/metalbump.jpg", "textureBump", "wetshader"); + sdk->addSceneActor(femObject, femSimulator); + sdkSimulator->registerObjectSimulator(femSimulator); - - // auto renderingMesh = femObject->getVolumetricMesh()->getRenderingMesh(); - /* if(renderingMesh) - { - renderingMesh->setRenderDetail(meshRenderDetail); - } - - sdk->addSceneActor(femObject, femSimulator);*/ - //------------------------------------------------------- // Create scene actor 2: plane + dummy simulator //------------------------------------------------------- // Create dummy simulator auto staticSimulator = std::make_shared<DefaultSimulator>(sdk->getErrorLog()); - // create a static plane scene object of given normal and position - //auto staticObject = std::make_shared<StaticSceneObject>(); - - //auto plane = std::make_shared<PlaneCollisionModel>(core::Vec3d(0.0, 0.0, -35.0), - // core::Vec3d(0.0, 0.0, 1.0)); + // Create a static plane scene object of given normal and position + auto staticObject = std::make_shared<StaticSceneObject>(); - //staticObject->setModel(plane); - //sdk->addSceneActor(staticObject, staticSimulator); + auto plane = std::make_shared<PlaneCollisionModel>(core::Vec3d(0.0, 0.0, -35.0), + core::Vec3d(0.0, 0.0, 1.0)); - //------------------------------------------------------- - // Register both object simulators - //------------------------------------------------------- - auto sdkSimulator = sdk->getSimulator(); - //sdkSimulator->registerObjectSimulator(femSimulator); + staticObject->setModel(plane); + sdk->addSceneActor(staticObject, staticSimulator); //------------------------------------------------------- // Enable collision between scene actors 1 and 2 //------------------------------------------------------- - //auto meshModel = std::make_shared<MeshCollisionModel>(); - - //meshModel->setMesh(femObject->getVolumetricMesh()->getAttachedMesh(0)); + auto meshModel = std::make_shared<MeshCollisionModel>(); + meshModel->setMesh(femObject->getVolumetricMesh()->getAttachedMesh(0)); - //auto planeMeshCollisionPairs = std::make_shared<CollisionPair>(); + auto planeMeshCollisionPairs = std::make_shared<CollisionPair>(); + planeMeshCollisionPairs->setModels(meshModel, plane); - //planeMeshCollisionPairs->setModels(meshModel, plane); + sdkSimulator->addCollisionPair(planeMeshCollisionPairs); - //sdkSimulator->addCollisionPair(planeMeshCollisionPairs); + auto planeToMeshCollisionDetection = std::make_shared<PlaneToMeshCollision>(); - //auto planeToMeshCollisionDetection = std::make_shared<PlaneToMeshCollision>(); - - //sdkSimulator->registerCollisionDetection(planeToMeshCollisionDetection); + sdkSimulator->registerCollisionDetection(planeToMeshCollisionDetection); //------------------------------------------------------- // Enable contact handling between scene actors 1 and 2 //------------------------------------------------------- - //auto planeToMeshContact = std::make_shared<PenaltyContactFemToStatic>(false); - - //planeToMeshContact->setCollisionPairs(planeMeshCollisionPairs); - - //planeToMeshContact->setSceneObjects(staticObject, femObject); - - //sdkSimulator->registerContactHandling(planeToMeshContact); - - - - auto cubeModel = std::make_shared<MeshModel>(); - //cubeModel->load("models/blade2.obj"); - //cubeModel->load("models/brain.obj"); - cubeModel->load("models/brain.3ds"); - - //cubeModel->load("models/blade.3ds"); - - //cubeModel->getMesh()->scale(Eigen::UniformScaling<double>(10.0)); - cubeModel->setRenderDetail(meshRenderDetail); + auto planeToMeshContact = std::make_shared<PenaltyContactFemToStatic>(false); + planeToMeshContact->setCollisionPairs(planeMeshCollisionPairs); + planeToMeshContact->setSceneObjects(staticObject, femObject); - auto cube = std::make_shared<StaticSceneObject>(); - cube->setModel(cubeModel); - - - - auto planeModel = std::make_shared<MeshModel>(); - //cubeModel->load("models/blade2.obj"); - planeModel->load("models/plane.obj"); - planeModel->setRenderDetail(planeMeshRenderDetail); - - auto plane = std::make_shared<StaticSceneObject>(); - plane->setModel(planeModel); + sdkSimulator->registerContactHandling(planeToMeshContact); //------------------------------------------------------- // Customize the viewer @@ -205,13 +127,12 @@ int main(int ac, char **av) viewer->setGlobalAxisLength(0.8); + //------------------------------------------------------- + // Customize the scene + //------------------------------------------------------- // Get Scene auto scene = sdk->getScene(0); viewer->registerScene(scene); - - scene->addSceneObject(cube); - scene->addSceneObject(plane); - // Setup Scene lighting auto light1 = Light::getDefaultLighting(); diff --git a/Examples/CMakeLists.txt b/Examples/CMakeLists.txt index 3bf051f978b0694317db2330b893b4bdfbed2b3b..ff8e3d44f87b12c751ff3fd2e7990a0497d84025 100644 --- a/Examples/CMakeLists.txt +++ b/Examples/CMakeLists.txt @@ -26,3 +26,4 @@ endfunction() add_subdirectory(vegaFem) add_subdirectory(LaparoscopicCamera) add_subdirectory(AVMNidus) +add_subdirectory(Shaders) diff --git a/Examples/Shaders/CMakeLists.txt b/Examples/Shaders/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..493c99c43081f0081dc7531e2a354ce968f95bef --- /dev/null +++ b/Examples/Shaders/CMakeLists.txt @@ -0,0 +1,38 @@ +set(APP Shaders) + +include(${VTK_USE_FILE}) + +add_executable(${APP} main.cpp) +target_link_libraries(${APP} + Core + Geometry + VTKRendering + Rendering + Mesh + Event + IO + ) + +set_target_properties(${APP} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" +) + +set(${APP}_DATA "${CMAKE_CURRENT_BINARY_DIR}") +if(NOT EXISTS ${${APP}_DATA}) + file(MAKE_DIRECTORY ${${APP}_DATA}) +endif() + +set(FILE_URL http://midas3.kitware.com/midas/download/item/318851/ShadersData.tar) +set(FILE_SHA1 df719673804075b4505ea267b39e5cd68568f72c) +set(LOCAL_FILE ${EXAMPLES_DATA}/ShadersData.tar) + +midas_download(${FILE_URL} ${FILE_SHA1} ${LOCAL_FILE}) + +add_custom_command( + TARGET ${APP} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E tar xf ${LOCAL_FILE} + WORKING_DIRECTORY ${${APP}_DATA} + COMMENT "-- Unpacking ${LOCAL_FILE}" +) diff --git a/Examples/Shaders/main.cpp b/Examples/Shaders/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..29600b57be6ee4d965e6a23d0a3814569e553905 --- /dev/null +++ b/Examples/Shaders/main.cpp @@ -0,0 +1,134 @@ +// This file is part of the SimMedTK project. +// Copyright (c) Center for Modeling, Simulation, and Imaging in Medicine, +// Rensselaer Polytechnic Institute +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//--------------------------------------------------------------------------- +// +// Authors: +// +// Contact: +//--------------------------------------------------------------------------- + +#include <memory> + +// Core SimMedTK includes +#include "Core/SDK.h" +#include "Geometry/MeshModel.h" + +#include "IO/InitIO.h" +#include "VTKRendering/InitVTKRendering.h" +#include "IO/IOMesh.h" + +int main() +{ + InitVTKRendering(); + InitIODelegates(); + + //------------------------------------------------------- + // 1. Create an instance of the SimMedTK framework/SDK + // 2. Create viewer + // 3. Create default scene (scene 0) + //------------------------------------------------------- + auto sdk = SDK::createStandardSDK(); + + //------------------------------------------------------- + // Customize the viewer + //------------------------------------------------------- + auto viewer = sdk->getViewerInstance(); + + viewer->viewerRenderDetail = viewer->viewerRenderDetail | + SIMMEDTK_VIEWERRENDER_FADEBACKGROUND | + SIMMEDTK_VIEWERRENDER_GLOBAL_AXIS; + + viewer->setGlobalAxisLength(0.8); + + //------------------------------------------------------- + // Setup Shaders and textures + //------------------------------------------------------- + Shaders::createShader("wetshader", "ShadersData/shaders/wet_vert.glsl", "ShadersData/shaders/wet_frag.glsl", ""); + + // Mesh render detail + auto meshRenderDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_FACES | SIMMEDTK_RENDER_NORMALS ); + meshRenderDetail->setAmbientColor(Color(0.2,0.2,0.2,1.0)); + meshRenderDetail->setDiffuseColor(Color::colorGray); + meshRenderDetail->setSpecularColor(Color(1.0, 1.0, 1.0,0.5)); + meshRenderDetail->setShininess(20.0); + + meshRenderDetail->addShaderProgram("wetshader"); + meshRenderDetail->addTexture("decal", "ShadersData/textures/brainx.bmp", "textureDecal", "wetshader"); + meshRenderDetail->addTexture("bump", "ShadersData/textures/metalbump.jpg", "textureBump", "wetshader"); + + // Plane render detail + auto planeMeshRenderDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_FACES | SIMMEDTK_RENDER_NORMALS); + planeMeshRenderDetail->setAmbientColor(Color(0.2, 0.2, 0.2, 1.0)); + planeMeshRenderDetail->setDiffuseColor(Color::colorGray); + planeMeshRenderDetail->setSpecularColor(Color(1.0, 1.0, 1.0, 0.5)); + planeMeshRenderDetail->setShininess(20.0); + + planeMeshRenderDetail->addShaderProgram("wetshader"); + planeMeshRenderDetail->addTexture("decal", "ShadersData/textures/brain_outside.jpg", "textureDecal", "wetshader"); + planeMeshRenderDetail->addTexture("bump", "ShadersData/textures/metalbump.jpg", "textureBump", "wetshader"); + + //------------------------------------------------------- + // Customize the scene + //------------------------------------------------------- + // Get Scene + auto scene = sdk->getScene(0); + viewer->registerScene(scene); + + // Setup Cube + auto cubeModel = std::make_shared<MeshModel>(); + cubeModel->load("ShadersData/models/brain.obj"); + //cubeModel->load("ShadersData/models/brain.3ds"); + cubeModel->setRenderDetail(meshRenderDetail); + + auto cube = std::make_shared<StaticSceneObject>(); + cube->setModel(cubeModel); + scene->addSceneObject(cube); + + // Setup Plane + auto planeModel = std::make_shared<MeshModel>(); + planeModel->load("ShadersData/models/plane.obj"); + planeModel->setRenderDetail(planeMeshRenderDetail); + + auto planeObject = std::make_shared<StaticSceneObject>(); + planeObject->setModel(planeModel); + scene->addSceneObject(planeObject); + + // Setup Scene lighting + auto light1 = Light::getDefaultLighting(); + light1->lightPos.setPosition(core::Vec3d(-25.0, 10.0, 10.0)); + scene->addLight(light1); + + auto light2 = Light::getDefaultLighting(); + light2->lightPos.setPosition(core::Vec3d(25.0, 10.0, 10.0)); + scene->addLight(light2); + + // Camera setup + auto sceneCamera = Camera::getDefaultCamera(); + sceneCamera->setPos(-200,0,0); + sceneCamera->setZoom(.5); + scene->addCamera(sceneCamera); + + //------------------------------------------------------- + // Run the SDK + //------------------------------------------------------- + sdk->run(); + + //cleanup + sdk->releaseScene(scene); + + return 0; +}