Преглед на файлове

* added ambient occlusion tutorial example

Former-commit-id: 7d5030d2cb0e2c947d0b1596e56a70fed87de6c1
Daniele Panozzo преди 11 години
родител
ревизия
581cd4b6d2
променени са 4 файла, в които са добавени 126 реда и са изтрити 0 реда
  1. 15 0
      tutorial/606_AmbientOcclusion/CMakeLists.txt
  2. 61 0
      tutorial/606_AmbientOcclusion/main.cpp
  3. 43 0
      tutorial/cmake/FindEMBREE.cmake
  4. 7 0
      tutorial/compile_macosx.sh

+ 15 - 0
tutorial/606_AmbientOcclusion/CMakeLists.txt

@@ -0,0 +1,15 @@
+cmake_minimum_required(VERSION 2.6)
+project(606_AmbientOcclusion)
+
+include("../CMakeLists.shared")
+
+find_package(EMBREE REQUIRED)
+
+include_directories(${EMBREE_INCLUDE_DIRS})
+
+set(SOURCES
+${PROJECT_SOURCE_DIR}/main.cpp
+)
+
+add_executable(${CMAKE_PROJECT_NAME} ${SOURCES} ${SHARED_SOURCES})
+target_link_libraries(${CMAKE_PROJECT_NAME} ${SHARED_LIBRARIES} ${EMBREE_LIBRARIES})

+ 61 - 0
tutorial/606_AmbientOcclusion/main.cpp

@@ -0,0 +1,61 @@
+#include <igl/readOFF.h>
+#include <igl/viewer/Viewer.h>
+#include <igl/local_basis.h>
+#include <igl/barycenter.h>
+#include <igl/avg_edge_length.h>
+#include <igl/embree/ambient_occlusion.h>
+#include <algorithm>
+
+using namespace Eigen;
+using namespace std;
+
+// Mesh
+Eigen::MatrixXd V;
+Eigen::MatrixXi F;
+
+VectorXd AO;
+
+  // It allows to change the degree of the field when a number is pressed
+bool key_down(igl::Viewer& viewer, unsigned char key, int modifier)
+{
+  if (key == '1')
+  {
+    // Show the mesh without the ambient occlusion factor
+    viewer.set_colors(Eigen::RowVector3d(1,1,1));
+  }
+
+  if (key == '2')
+  {
+    // Show the mesh with the ambient occlusion factor
+    MatrixXd C = MatrixXd::Constant(V.rows(),3,1);
+    for (unsigned i=0; i<C.rows();++i)
+      C.row(i) *= std::min<double>(AO(i)+0.2,1);
+    viewer.set_colors(C);
+  }
+
+  return false;
+}
+
+int main(int argc, char *argv[])
+{
+  using namespace std;
+  using namespace Eigen;
+
+  // Load a mesh in OFF format
+  igl::readOFF("../shared/fertility.off", V, F);
+
+  MatrixXd N;
+  igl::per_vertex_normals(V,F,N);
+
+  // Compute ambient occlusion factor using embree
+  igl::ambient_occlusion(V,F,V,N,500,AO);
+  AO = 1.0 - AO.array();
+
+  // Show mesh
+  igl::Viewer viewer;
+  viewer.set_mesh(V, F);
+  viewer.callback_key_down = &key_down;
+  key_down(viewer,'2',0);
+  viewer.options.show_lines = false;
+  viewer.launch();
+}

+ 43 - 0
tutorial/cmake/FindEMBREE.cmake

@@ -0,0 +1,43 @@
+#
+# Try to find EMBREE
+# Once done this will define
+#
+# EMBREE_FOUND           - system has EMBREE
+# EMBREE_INCLUDE_DIRS    - the EMBREE include directories
+# EMBREE_LIBRARIES       - Link these to use EMBREE
+#
+
+FIND_PATH(EMBREE_INCLUDE_DIR embree/include/embree.h
+	  PATHS
+		${PROJECT_SOURCE_DIR}/../../external/embree
+		NO_DEFAULT_PATH
+    )
+
+SET(SEARCH_PATHS "${EMBREE_INCLUDE_DIR}" "${EMBREE_INCLUDE_DIR}/build")
+
+FIND_LIBRARY(EMBREE_CORE_LIBRARY  NAMES libembree.a PATHS ${SEARCH_PATHS})
+FIND_LIBRARY(EMBREE_CORE_LIBRARY2 NAMES libdevice.a PATHS ${SEARCH_PATHS})
+FIND_LIBRARY(EMBREE_CORE_LIBRARY3 NAMES libimage.a PATHS ${SEARCH_PATHS})
+FIND_LIBRARY(EMBREE_CORE_LIBRARY4 NAMES liblexers.a PATHS ${SEARCH_PATHS})
+FIND_LIBRARY(EMBREE_CORE_LIBRARY5 NAMES libloaders.a PATHS ${SEARCH_PATHS})
+FIND_LIBRARY(EMBREE_CORE_LIBRARY6 NAMES libsys.a PATHS ${SEARCH_PATHS})
+
+if(EMBREE_CORE_LIBRARY AND EMBREE_INCLUDE_DIR)
+set(EMBREE_FOUND TRUE)
+endif(EMBREE_CORE_LIBRARY AND EMBREE_INCLUDE_DIR)
+
+IF (EMBREE_FOUND)
+   message(STATUS "Found EMBREE: ${EMBREE_INCLUDE_DIR}")
+
+   SET(EMBREE_LIBRARIES
+   "${EMBREE_CORE_LIBRARY}"
+   "${EMBREE_CORE_LIBRARY2}"
+   "${EMBREE_CORE_LIBRARY3}"
+   "${EMBREE_CORE_LIBRARY4}"
+   "${EMBREE_CORE_LIBRARY5}"
+   "${EMBREE_CORE_LIBRARY6}"
+   )
+   SET(EMBREE_INCLUDE_DIRS ${EMBREE_INCLUDE_DIR} ${EMBREE_INCLUDE_DIR}/embree)
+ELSE (EMBREE_FOUND)
+    message(FATAL_ERROR "could NOT find EMBREE")
+ENDIF (EMBREE_FOUND)

+ 7 - 0
tutorial/compile_macosx.sh

@@ -7,4 +7,11 @@ cmake -DCMAKE_BUILD_TYPE=Release .
 rm src/*.a
 make
 
+cd ../../embree/
+rm -fr build
+mkdir build
+cd build
+cmake -DCMAKE_BUILD_TYPE=Release ../
+make
+
 cd ../../tutorial