浏览代码

bug fix in orient_outward_ao, now seems working reasonably well

Former-commit-id: 23be16c2d9fd7926e7d06856ca917e9652899136
Kenshi Takayama (kenshi 11 年之前
父节点
当前提交
b8c7598b62

+ 4 - 1
examples/patches/example.cpp

@@ -544,7 +544,10 @@ void init_patches()
   cin >> c;
   if (c == 'y')
   {
-    orient_outward_ao(V,F,CC,F.rows() * 100,F,I);
+    cout << "min_num_rays_per_component=";
+    int min_num_rays_per_component;
+    cin >> min_num_rays_per_component;
+    orient_outward_ao(V,F,CC,min_num_rays_per_component,F.rows() * 100,F,I);
   }
   else
   {

+ 58 - 33
examples/patches/example.vcxproj

@@ -20,14 +20,14 @@
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <PlatformToolset>v110</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
+    <CharacterSet>MultiByte</CharacterSet>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <PlatformToolset>v110</PlatformToolset>
+    <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -41,13 +41,11 @@
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <LinkIncremental>true</LinkIncremental>
-    <IncludePath>C:\Users\kenshi\dev\igl_hg\ext_toolboxes\embree-1.1beta\common;$(IncludePath)</IncludePath>
     <OutDir>$(ProjectDir)\</OutDir>
     <TargetName>$(ProjectName)d</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <LinkIncremental>false</LinkIncremental>
-    <IncludePath>C:\Users\kenshi\dev\igl_hg\ext_toolboxes\embree-1.1beta\common;$(IncludePath)</IncludePath>
     <OutDir>$(ProjectDir)\</OutDir>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@@ -58,7 +56,7 @@
       <Optimization>Disabled</Optimization>
       <PreprocessorDefinitions>IGL_HEADER_ONLY;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <AdditionalIncludeDirectories>C:\Users\kenshi\dev\igl_hg\ext_toolboxes\embree-1.1beta\rtcore;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\external\embree\embree;..\..\external\embree;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <OpenMPSupport>true</OpenMPSupport>
     </ClCompile>
     <Link>
@@ -76,8 +74,9 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>IGL_HEADER_ONLY;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <AdditionalIncludeDirectories>C:\Users\kenshi\dev\igl_hg\ext_toolboxes\embree-1.1beta\rtcore;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\external\embree\embree;..\..\external\embree;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <OpenMPSupport>true</OpenMPSupport>
+      <WholeProgramOptimization>true</WholeProgramOptimization>
     </ClCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -87,33 +86,59 @@
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\filename.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\library.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\platform.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\stl\string.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\sync\condition.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\sync\mutex.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\sysinfo.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\taskscheduler_standard.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\thread.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh2\bvh2.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh2\bvh2_builder.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh2\bvh2_intersector.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh4mb\bvh4mb.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh4mb\bvh4mb_builder.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh4mb\bvh4mb_intersector.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh4\bvh4.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh4\bvh4_builder.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh4\bvh4_intersector.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\accel.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\alloc.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\heuristic_binning.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\heuristic_spatial.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\primrefgen.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\splitter.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\splitter_fallback.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\splitter_parallel.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\stat.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\builders\heuristic_binning.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\builders\heuristic_spatial.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\builders\primrefgen.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\builders\splitter.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\builders\splitter_fallback.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\builders\splitter_parallel.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh2\bvh2.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh2\bvh2_intersector1.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh2\bvh2_intersector4.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh2\bvh2_intersector8.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4i\bvh4i.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4i\bvh4i_intersector1.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4mb\bvh4mb.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4mb\bvh4mb_builder.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4mb\bvh4mb_intersector1.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4mb\bvh4mb_intersector4.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4mb\bvh4mb_intersector8.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector1.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector1_avx.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector4_chunk.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector4_hybrid.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector4_single.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector8_chunk.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector8_hybrid.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector8_single.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\common\accel.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\common\alloc.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\common\registry_accel.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\common\registry_builder.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\common\registry_intersector.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\common\stat.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\embree.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\geometry\triangle_mesh.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\geometry\virtual_scene.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\sys\filename.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\sys\library.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\sys\network.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\sys\platform.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\sys\stl\string.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\sys\sync\condition.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\sys\sync\mutex.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\sys\sysinfo.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\sys\taskscheduler.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\sys\taskscheduler_mic.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\sys\taskscheduler_sys.cpp" />
+    <ClCompile Include="..\..\external\embree\embree\sys\thread.cpp" />
     <ClCompile Include="example.cpp" />
   </ItemGroup>
   <ItemGroup>

+ 116 - 62
examples/patches/example.vcxproj.filters

@@ -2,100 +2,154 @@
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
     <ClCompile Include="example.cpp" />
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh2\bvh2_builder.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\embree.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh2\bvh2_intersector.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\common\registry_builder.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh2\bvh2.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\common\registry_intersector.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh4\bvh4_intersector.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\common\stat.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh4\bvh4.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\common\accel.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh4\bvh4_builder.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\common\alloc.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh4mb\bvh4mb_intersector.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\common\registry_accel.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh4mb\bvh4mb.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\geometry\virtual_scene.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\bvh4mb\bvh4mb_builder.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\geometry\triangle_mesh.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\splitter_fallback.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\bvh2\bvh2.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\splitter_parallel.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\bvh2\bvh2_intersector8.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\stat.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\bvh2\bvh2_intersector1.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\accel.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\bvh2\bvh2_intersector4.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\alloc.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\sys\platform.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\heuristic_binning.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\sys\sysinfo.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\heuristic_spatial.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\sys\taskscheduler.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\primrefgen.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\sys\taskscheduler_mic.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\rtcore\common\splitter.cpp">
-      <Filter>embree-1.1beta\rtcore</Filter>
+    <ClCompile Include="..\..\external\embree\embree\sys\taskscheduler_sys.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\platform.cpp">
-      <Filter>embree-1.1beta\common</Filter>
+    <ClCompile Include="..\..\external\embree\embree\sys\thread.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\sysinfo.cpp">
-      <Filter>embree-1.1beta\common</Filter>
+    <ClCompile Include="..\..\external\embree\embree\sys\filename.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\taskscheduler_standard.cpp">
-      <Filter>embree-1.1beta\common</Filter>
+    <ClCompile Include="..\..\external\embree\embree\sys\library.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\thread.cpp">
-      <Filter>embree-1.1beta\common</Filter>
+    <ClCompile Include="..\..\external\embree\embree\sys\network.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\filename.cpp">
-      <Filter>embree-1.1beta\common</Filter>
+    <ClCompile Include="..\..\external\embree\embree\sys\stl\string.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\library.cpp">
-      <Filter>embree-1.1beta\common</Filter>
+    <ClCompile Include="..\..\external\embree\embree\sys\sync\mutex.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\stl\string.cpp">
-      <Filter>embree-1.1beta\common</Filter>
+    <ClCompile Include="..\..\external\embree\embree\sys\sync\condition.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\sync\mutex.cpp">
-      <Filter>embree-1.1beta\common</Filter>
+    <ClCompile Include="..\..\external\embree\embree\builders\splitter.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\ext_toolboxes\embree-1.1beta\common\sys\sync\condition.cpp">
-      <Filter>embree-1.1beta\common</Filter>
+    <ClCompile Include="..\..\external\embree\embree\builders\splitter_fallback.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\builders\splitter_parallel.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\builders\heuristic_binning.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\builders\heuristic_spatial.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\builders\primrefgen.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector4_single.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector8_chunk.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector8_hybrid.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector8_single.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector1.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector1_avx.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector4_chunk.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4\bvh4_intersector4_hybrid.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4mb\bvh4mb_builder.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4mb\bvh4mb_intersector1.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4mb\bvh4mb_intersector4.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4mb\bvh4mb_intersector8.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4mb\bvh4mb.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4i\bvh4i.cpp">
+      <Filter>embree</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\external\embree\embree\bvh4i\bvh4i_intersector1.cpp">
+      <Filter>embree</Filter>
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <Filter Include="igl">
       <UniqueIdentifier>{53eff656-6473-409c-9ad5-cac1983d91e1}</UniqueIdentifier>
     </Filter>
-    <Filter Include="embree-1.1beta">
-      <UniqueIdentifier>{6d281f01-62c5-4083-90e7-1e9d55cf793c}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="embree-1.1beta\rtcore">
-      <UniqueIdentifier>{ded8eb8e-e3c8-4405-9234-dd048cbb197d}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="embree-1.1beta\common">
-      <UniqueIdentifier>{0c5327d6-c9c7-4e16-a8e3-d3ae7f7b42d9}</UniqueIdentifier>
+    <Filter Include="embree">
+      <UniqueIdentifier>{05d04fa9-d1bf-484f-b199-dea6e4746db7}</UniqueIdentifier>
     </Filter>
   </ItemGroup>
   <ItemGroup>

+ 104 - 66
include/igl/embree/orient_outward_ao.cpp

@@ -1,28 +1,24 @@
 #include "orient_outward_ao.h"
 #include "../per_face_normals.h"
-#include "../barycenter.h"
 #include "../doublearea.h"
-#include "../matlab_format.h"
-#include "ambient_occlusion.h"
+#include "../random_dir.h"
 #include "EmbreeIntersector.h"
 #include <iostream>
 #include <random>
-#include <omp.h>
+#include <limits>
 
 template <
   typename DerivedV, 
   typename DerivedF, 
   typename DerivedC, 
-  typename Scalar,
-  typename Index,
   typename DerivedFF, 
   typename DerivedI>
 IGL_INLINE void igl::orient_outward_ao(
   const Eigen::PlainObjectBase<DerivedV> & V,
   const Eigen::PlainObjectBase<DerivedF> & F,
   const Eigen::PlainObjectBase<DerivedC> & C,
-  const igl::EmbreeIntersector<Scalar,Index> & ei,
-  const int num_samples,
+  const int min_num_rays_per_component,
+  const int total_num_rays,
   Eigen::PlainObjectBase<DerivedFF> & FF,
   Eigen::PlainObjectBase<DerivedI> & I)
 {
@@ -32,6 +28,12 @@ IGL_INLINE void igl::orient_outward_ao(
   assert(F.cols() == 3);
   assert(V.cols() == 3);
   
+  // pass both sides of faces to Embree
+  MatrixXi F2;
+  F2.resize(F.rows()*2,F.cols());
+  F2 << F, F.rowwise().reverse().eval();
+  EmbreeIntersector<typename DerivedV::Scalar, typename DerivedF::Scalar> ei(V,F2);
+  
   // number of faces
   const int m = F.rows();
   // number of patches
@@ -46,68 +48,114 @@ IGL_INLINE void igl::orient_outward_ao(
   PlainObjectBase<DerivedV> N;
   per_face_normals(V,F,N);
   
-  // random number generator/distribution for each thread
-  int max_threads = omp_get_max_threads();
-  
-  // prng
-  vector<mt19937> engine(max_threads);
-  for (int i = 0; i < max_threads; ++i)
-      engine[i].seed(time(0) * (i + 1));
-  
-  // discrete distribution for random selection of faces with probability proportional to their areas
+  // face area
   Matrix<typename DerivedV::Scalar,Dynamic,1> A;
   doublearea(V,F,A);
-  double minarea = A.minCoeff();
-  Matrix<int, Dynamic, 1> A_int = (A * 100.0 / minarea).template cast<int>();       // only integer is allowed for weight
-  auto ddist_func = [&] (double i) { return A_int(static_cast<int>(i)); };
-  vector<discrete_distribution<int>> ddist(max_threads, discrete_distribution<int>(m, 0, m, ddist_func));      // simple ctor of (Iter, Iter) not provided by the stupid VC11 impl...
+  double area_min = A.minCoeff();
+  double area_total = A.sum();
   
-  // uniform real between in [0, 1]
-  vector<uniform_real_distribution<double>> rdist(max_threads);
-  
-  //// occlusion count per component: +1 when front ray is occluded, -1 when back ray is occluded
-  // occlussion count per component, per back/front: C(c,0) --> number of
-  // front-side rays occluded, C(c,1) --> number of back-side rays occluded
-  Matrix<int, Dynamic, 2> C_occlude_count;
-  C_occlude_count.setZero(num_cc, 2);
+  // determine number of rays per component according to its area
+  VectorXd area_per_component;
+  area_per_component.setZero(num_cc);
+  for (int f = 0; f < m; ++f)
+  {
+    area_per_component(C(f)) += A(f);
+  }
+  VectorXi num_rays_per_component;
+  num_rays_per_component.setZero(num_cc);
+  for (int c = 0; c < num_cc; ++c)
+  {
+    num_rays_per_component(c) = max<int>(min_num_rays_per_component, static_cast<int>(total_num_rays * area_per_component(c) / area_total));
+  }
   
-#pragma omp parallel for
-  for (int i = 0; i < num_samples; ++i)
+  // generate all the rays
+  uniform_real_distribution<double> rdist;
+  mt19937 prng;
+  prng.seed(time(0));
+  vector<int     > ray_face;
+  vector<Vector3d> ray_ori;
+  vector<Vector3d> ray_dir;
+  ray_face.reserve(total_num_rays);
+  ray_ori .reserve(total_num_rays);
+  ray_dir .reserve(total_num_rays);
+  for (int c = 0; c < num_cc; ++c)
   {
-    int thread_num = omp_get_thread_num();
-    int f     = ddist[thread_num](engine[thread_num]);   // select face with probability proportional to face area
-    double t0 = rdist[thread_num](engine[thread_num]);
-    double t1 = rdist[thread_num](engine[thread_num]);
-    double t2 = rdist[thread_num](engine[thread_num]);
-    double t_sum = t0 + t1 + t2;
-    t0 /= t_sum;
-    t1 /= t_sum;
-    t2 /= t_sum;
-    RowVector3d p = t0 * V.row(F(f,0)) + t1 * V.row(F(f,1)) + t1 * V.row(F(f,2));
-    RowVector3d n = N.row(f);
-    //bool is_backside = rdist[thread_num](engine[thread_num]) < 0.5;
-    // Loop over front or back side
-    for(int s = 0;s<2;s++)
+    vector<int> CF;     // set of faces per component
+    vector<int> CF_area;
+    for (int f = 0; f < m; ++f)
     {
-      if(s==1)
+      if (C(f)==c)
       {
-          n *= -1;
+        CF.push_back(f);
+        CF_area.push_back(static_cast<int>(100 * A(f) / area_min));
       }
-      Matrix<typename DerivedV::Scalar,Dynamic,1> S;
-      ambient_occlusion(ei, p, n, 1, S);
-      if (S(0) > 0)
+    }
+    // discrete distribution for random selection of faces with probability proportional to their areas
+    auto ddist_func = [&] (double i) { return CF_area[static_cast<int>(i)]; };
+    discrete_distribution<int> ddist(CF.size(), 0, CF.size(), ddist_func);      // simple ctor of (Iter, Iter) not provided by the stupid VC11 impl...
+    for (int i = 0; i < num_rays_per_component[c]; ++i)
+    {
+      int f     = CF[ddist(prng)];    // select face with probability proportional to face area
+      double t0 = rdist(prng);        // random barycentric coordinate
+      double t1 = rdist(prng);
+      double t2 = rdist(prng);
+      double t_sum = t0 + t1 + t2;
+      t0 /= t_sum;
+      t1 /= t_sum;
+      t2 /= t_sum;
+      Vector3d p = t0 * V.row(F(f,0))       // be careful with the index!!!
+                 + t1 * V.row(F(f,1))
+                 + t2 * V.row(F(f,2));
+      Vector3d n = N.row(f);
+      Vector3d d = random_dir();
+      if (n.dot(d) < 0)
       {
-#pragma omp atomic
-        C_occlude_count(C(f),s)++;
+        d *= -1;
       }
+      ray_face.push_back(f);
+      ray_ori .push_back(p);
+      ray_dir .push_back(d);
     }
+  }
+  
+  // occlusion count per component
+  vector<int> C_occlude_count_front(num_cc, 0);
+  vector<int> C_occlude_count_back (num_cc, 0);
 
+  //auto dbg_get_hit_point = [&] (embree::Hit hit) {
+  //  RowVector3d p0 = V.row(F2(hit.id0, 0));
+  //  RowVector3d p1 = V.row(F2(hit.id0, 1));
+  //  RowVector3d p2 = V.row(F2(hit.id0, 2));
+  //  RowVector3d p = (1 - hit.u - hit.v) * p0 + hit.u * p1 + hit.v * p2;
+  //  return p;
+  //};
+
+#pragma omp parallel for
+  for (int i = 0; i < ray_face.size(); ++i)
+  {
+    int      f = ray_face[i];
+    Vector3d o = ray_ori [i];
+    Vector3d d = ray_dir [i];
+    int c = C(f);
+    Hit hit_front;
+    if (ei.intersectRay(o, d, hit_front))
+    {
+#pragma omp atomic
+      //RowVector3d hit_point = dbg_get_hit_point(hit_front);
+      C_occlude_count_front[c]++;
+    }
+    Hit hit_back;
+    if (ei.intersectRay(o, -d, hit_back))
+    {
+#pragma omp atomic
+      //RowVector3d hit_point = dbg_get_hit_point(hit_back);
+      C_occlude_count_back[c]++;
+    }
   }
   
   for(int c = 0;c<num_cc;c++)
   {
-    //I(c) = C_occlude_count(c) > 0;
-    I(c) = C_occlude_count(c,0) > C_occlude_count(c,1);
+    I(c) = C_occlude_count_front[c] > C_occlude_count_back[c];
   }
   // flip according to I
   for(int f = 0;f<m;f++)
@@ -119,7 +167,7 @@ IGL_INLINE void igl::orient_outward_ao(
   }
 }
 
-// EmbreeIntersector generated on the fly
+// Call with default parameters
 template <
   typename DerivedV, 
   typename DerivedF, 
@@ -130,20 +178,10 @@ IGL_INLINE void igl::orient_outward_ao(
   const Eigen::PlainObjectBase<DerivedV> & V,
   const Eigen::PlainObjectBase<DerivedF> & F,
   const Eigen::PlainObjectBase<DerivedC> & C,
-  const int num_samples,
   Eigen::PlainObjectBase<DerivedFF> & FF,
   Eigen::PlainObjectBase<DerivedI> & I)
 {
-  using namespace igl;
-  using namespace Eigen;
-  // Both sides
-  MatrixXi F2;
-  F2.resize(F.rows()*2,F.cols());
-  F2 << F, F.rowwise().reverse().eval();
-  EmbreeIntersector<
-    typename DerivedV::Scalar,
-    typename DerivedF::Scalar > ei(V,F2);
-  return orient_outward_ao(V, F, C, ei, num_samples, FF, I);
+  return orient_outward_ao(V, F, C, 100, F.rows() * 100, FF, I);
 }
 
 #ifndef IGL_HEADER_ONLY

+ 8 - 16
include/igl/embree/orient_outward_ao.h

@@ -4,20 +4,15 @@
 #include <Eigen/Core>
 namespace igl
 {
-  // Forward define
-  template <
-    typename Scalar,
-    typename Index>
-  class EmbreeIntersector;
   // Orient each component (identified by C) of a mesh (V,F) using ambient occlusion 
   // such that the front side is less occluded than back side
   //
   // Inputs:
-  //   V            #V by 3 list of vertex positions
-  //   F            #F by 3 list of triangle indices
-  //   C            #F list of components
-  //   ei           EmbreeIntersector containing (V,F)
-  //   num_samples  total number of rays to be shot
+  //   V                            #V by 3 list of vertex positions
+  //   F                            #F by 3 list of triangle indices
+  //   C                            #F list of components
+  //   min_num_rays_per_component   Each component receives at least this number of rays
+  //   total_num_rays               Total number of rays that will be shot
   // Outputs:
   //   FF  #F by 3 list of new triangle indices such that FF(~I,:) = F(~I,:) and
   //     FF(I,:) = fliplr(F(I,:)) (OK if &FF = &F)
@@ -26,20 +21,18 @@ namespace igl
     typename DerivedV, 
     typename DerivedF, 
     typename DerivedC, 
-    typename Scalar,
-    typename Index,
     typename DerivedFF, 
     typename DerivedI>
   IGL_INLINE void orient_outward_ao(
     const Eigen::PlainObjectBase<DerivedV> & V,
     const Eigen::PlainObjectBase<DerivedF> & F,
     const Eigen::PlainObjectBase<DerivedC> & C,
-    const igl::EmbreeIntersector<Scalar,Index> & ei,
-    const int num_samples,
+    const int min_num_rays_per_component,
+    const int total_num_rays,
     Eigen::PlainObjectBase<DerivedFF> & FF,
     Eigen::PlainObjectBase<DerivedI> & I);
   
-  // EmbreeIntersector generated on the fly
+  // Call with default number of rays
   template <
     typename DerivedV, 
     typename DerivedF, 
@@ -50,7 +43,6 @@ namespace igl
     const Eigen::PlainObjectBase<DerivedV> & V,
     const Eigen::PlainObjectBase<DerivedF> & F,
     const Eigen::PlainObjectBase<DerivedC> & C,
-    const int num_samples,
     Eigen::PlainObjectBase<DerivedFF> & FF,
     Eigen::PlainObjectBase<DerivedI> & I);
 };