Merge with upstream

metadata
Edgar Velazquez-Armendariz 2013-02-02 09:11:26 -05:00
commit 8c60ffb729
36 changed files with 628 additions and 333 deletions

View File

@ -7,3 +7,4 @@ cb6e89af8012fac22cc0f3c5ad247c98c701bdda v0.3.0
ee26517b27207353b0c8a7d357bcb4977b5d93fb v0.4.0 ee26517b27207353b0c8a7d357bcb4977b5d93fb v0.4.0
7db07694ea00eb1655f7a1adcc3ae880e8e116f9 v0.4.1 7db07694ea00eb1655f7a1adcc3ae880e8e116f9 v0.4.1
13a39b11aceee517c19d2e2cec2e6b875546062c v0.4.2 13a39b11aceee517c19d2e2cec2e6b875546062c v0.4.2
f1b73d39617071297167cc7ce96f3892f21105fc v0.4.3

View File

@ -125,13 +125,15 @@
</ClInclude> </ClInclude>
<ClInclude Include="..\src\samplers\sobolseq.h"> <ClInclude Include="..\src\samplers\sobolseq.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\src\libhw\veramono14_dsc.h"> <ClInclude Include="..\src\libhw\data\veramono14_dsc.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\src\libhw\vera14_dsc.h"> <ClInclude Include="..\src\libhw\data\vera14_dsc.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\src\libhw\veramono14_png.h"> <ClInclude Include="..\src\libhw\data\shaders.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\src\libhw\vera14_png.h"> <ClInclude Include="..\src\libhw\data\veramono14_png.h">
</ClInclude>
<ClInclude Include="..\src\libhw\data\vera14_png.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\src\medium\materials.h"> <ClInclude Include="..\src\medium\materials.h">
</ClInclude> </ClInclude>
@ -203,6 +205,8 @@
</ClInclude> </ClInclude>
<ClInclude Include="..\src\films\banner.h"> <ClInclude Include="..\src\films\banner.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\src\films\annotations.h">
</ClInclude>
<ClInclude Include="..\src\shapes\shapegroup.h"> <ClInclude Include="..\src\shapes\shapegroup.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\src\shapes\hair.h"> <ClInclude Include="..\src\shapes\hair.h">
@ -287,14 +291,14 @@
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\render\volume.h"> <ClInclude Include="..\include\mitsuba\render\volume.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\render\sahkdtree4.h">
</ClInclude>
<ClInclude Include="..\include\mitsuba\render\integrator.h"> <ClInclude Include="..\include\mitsuba\render\integrator.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\render\subsurface.h"> <ClInclude Include="..\include\mitsuba\render\subsurface.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\render\texture.h"> <ClInclude Include="..\include\mitsuba\render\texture.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\render\track.h">
</ClInclude>
<ClInclude Include="..\include\mitsuba\render\triaccel_sse.h"> <ClInclude Include="..\include\mitsuba\render\triaccel_sse.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\render\bsdf.h"> <ClInclude Include="..\include\mitsuba\render\bsdf.h">
@ -385,6 +389,8 @@
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\matrix.inl"> <ClInclude Include="..\include\mitsuba\core\matrix.inl">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\math.h">
</ClInclude>
<ClInclude Include="..\include\mitsuba\core\ssemath.h"> <ClInclude Include="..\include\mitsuba\core\ssemath.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\normal.h"> <ClInclude Include="..\include\mitsuba\core\normal.h">
@ -409,6 +415,8 @@
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\statistics.h"> <ClInclude Include="..\include\mitsuba\core\statistics.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\spline.h">
</ClInclude>
<ClInclude Include="..\include\mitsuba\core\thread.h"> <ClInclude Include="..\include\mitsuba\core\thread.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\aabb_sse.h"> <ClInclude Include="..\include\mitsuba\core\aabb_sse.h">
@ -431,6 +439,8 @@
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\brent.h"> <ClInclude Include="..\include\mitsuba\core\brent.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\track.h">
</ClInclude>
<ClInclude Include="..\include\mitsuba\core\chisquare.h"> <ClInclude Include="..\include\mitsuba\core\chisquare.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\sched_remote.h"> <ClInclude Include="..\include\mitsuba\core\sched_remote.h">
@ -455,8 +465,6 @@
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\class.h"> <ClInclude Include="..\include\mitsuba\core\class.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\stl.h">
</ClInclude>
<ClInclude Include="..\include\mitsuba\core\warp.h"> <ClInclude Include="..\include\mitsuba\core\warp.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\util.h"> <ClInclude Include="..\include\mitsuba\core\util.h">
@ -511,6 +519,8 @@
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\hw\gpugeometry.h"> <ClInclude Include="..\include\mitsuba\hw\gpugeometry.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\hw\shadow.h">
</ClInclude>
<ClInclude Include="..\include\mitsuba\hw\glrenderer.h"> <ClInclude Include="..\include\mitsuba\hw\glrenderer.h">
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\hw\glxdevice.h"> <ClInclude Include="..\include\mitsuba\hw\glxdevice.h">
@ -629,8 +639,6 @@
</ClCompile> </ClCompile>
<ClCompile Include="..\src\librender\photonmap.cpp"> <ClCompile Include="..\src\librender\photonmap.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\librender\track.cpp">
</ClCompile>
<ClCompile Include="..\src\librender\renderjob.cpp"> <ClCompile Include="..\src\librender\renderjob.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\librender\intersection.cpp"> <ClCompile Include="..\src\librender\intersection.cpp">
@ -757,6 +765,8 @@
</ClCompile> </ClCompile>
<ClCompile Include="..\src\libhw\vpl.cpp"> <ClCompile Include="..\src\libhw\vpl.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\libhw\shadow.cpp">
</ClCompile>
<ClCompile Include="..\src\libhw\basicshader.cpp"> <ClCompile Include="..\src\libhw\basicshader.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\mitsuba\mitsuba.cpp"> <ClCompile Include="..\src\mitsuba\mitsuba.cpp">
@ -805,6 +815,10 @@
</ClCompile> </ClCompile>
<ClCompile Include="..\src\libcore\logger.cpp"> <ClCompile Include="..\src\libcore\logger.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\libcore\spline.cpp">
</ClCompile>
<ClCompile Include="..\src\libcore\track.cpp">
</ClCompile>
<ClCompile Include="..\src\libcore\formatter.cpp"> <ClCompile Include="..\src\libcore\formatter.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\libcore\bitmap.cpp"> <ClCompile Include="..\src\libcore\bitmap.cpp">
@ -937,6 +951,8 @@
</ClCompile> </ClCompile>
<ClCompile Include="..\src\mtsgui\main.cpp"> <ClCompile Include="..\src\mtsgui\main.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\mtsgui\test_simdtonemap.cpp">
</ClCompile>
<ClCompile Include="..\src\mtsgui\programsettingsdlg.cpp"> <ClCompile Include="..\src\mtsgui\programsettingsdlg.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\mtsgui\symlinks_auth.cpp"> <ClCompile Include="..\src\mtsgui\symlinks_auth.cpp">
@ -1001,12 +1017,8 @@
</ClCompile> </ClCompile>
<ClCompile Include="..\src\utils\addimages.cpp"> <ClCompile Include="..\src\utils\addimages.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\utils\ttest.cpp">
</ClCompile>
<ClCompile Include="..\src\utils\kdbench.cpp"> <ClCompile Include="..\src\utils\kdbench.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\utils\uflakefit.cpp">
</ClCompile>
<ClCompile Include="..\src\utils\joinrgb.cpp"> <ClCompile Include="..\src\utils\joinrgb.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\utils\cylclip.cpp"> <ClCompile Include="..\src\utils\cylclip.cpp">
@ -1021,6 +1033,8 @@
</ClCompile> </ClCompile>
<ClCompile Include="..\src\shapes\ply\ply_parser.cpp"> <ClCompile Include="..\src\shapes\ply\ply_parser.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\shapes\cube.cpp">
</ClCompile>
<ClCompile Include="..\src\shapes\serialized.cpp"> <ClCompile Include="..\src\shapes\serialized.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\shapes\obj.cpp"> <ClCompile Include="..\src\shapes\obj.cpp">
@ -1033,9 +1047,9 @@
</ClCompile> </ClCompile>
<ClCompile Include="..\src\shapes\hair.cpp"> <ClCompile Include="..\src\shapes\hair.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\shapes\ply.cpp"> <ClCompile Include="..\src\shapes\deformable.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\shapes\animatedinstance.cpp"> <ClCompile Include="..\src\shapes\ply.cpp">
</ClCompile> </ClCompile>
<ClCompile Include="..\src\shapes\cylinder.cpp"> <ClCompile Include="..\src\shapes\cylinder.cpp">
</ClCompile> </ClCompile>

View File

@ -9,136 +9,136 @@
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter> </Filter>
<Filter Include="Source Files\converter"> <Filter Include="Source Files\converter">
<UniqueIdentifier>{b54fb131-7e86-4e08-bba2-828939a038ff}</UniqueIdentifier> <UniqueIdentifier>{81dd9e3e-7bca-44a1-a313-76fb5af5ab0c}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\bsdfs"> <Filter Include="Source Files\bsdfs">
<UniqueIdentifier>{62e70ba9-1509-4ecb-9c06-8de3ef48cd47}</UniqueIdentifier> <UniqueIdentifier>{7112f301-f6d5-4351-ae06-4a29910a3766}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\librender"> <Filter Include="Source Files\librender">
<UniqueIdentifier>{81da027f-f282-46cb-a88d-abc84969dbf8}</UniqueIdentifier> <UniqueIdentifier>{15522c16-64b9-487e-b9fe-dea0094cb5c1}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\samplers"> <Filter Include="Source Files\samplers">
<UniqueIdentifier>{8364b08a-50e5-471b-bfaa-4e45915df101}</UniqueIdentifier> <UniqueIdentifier>{4df10a81-6f13-45ae-9a39-ce009db3a659}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\sensors"> <Filter Include="Source Files\sensors">
<UniqueIdentifier>{bb52270c-4a49-423b-ad02-4a7c042295c2}</UniqueIdentifier> <UniqueIdentifier>{0c722d61-5189-477d-b242-2fa2ad26c83c}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\libhw"> <Filter Include="Source Files\libhw">
<UniqueIdentifier>{c4330c75-0353-41ab-a809-1471f359aec6}</UniqueIdentifier> <UniqueIdentifier>{d849b48a-b61d-4540-81ab-f5228fd6fa93}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\libhw\data">
<UniqueIdentifier>{32a38ee8-b255-4e23-8efc-9491fc27c645}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\mitsuba"> <Filter Include="Source Files\mitsuba">
<UniqueIdentifier>{0f1ec875-44fb-46b2-9116-26d659410d97}</UniqueIdentifier> <UniqueIdentifier>{9f6ef52b-2504-4722-a200-7aaa9603088a}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\libcore"> <Filter Include="Source Files\libcore">
<UniqueIdentifier>{ab910bc2-a0a5-4f02-8232-396937071149}</UniqueIdentifier> <UniqueIdentifier>{6c49af9f-8cac-477f-825b-ccb368e313c6}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\tests"> <Filter Include="Source Files\tests">
<UniqueIdentifier>{dff3f942-f016-4bad-aa2c-63c444401a94}</UniqueIdentifier> <UniqueIdentifier>{182aef81-5fdf-4eb1-a7d3-5b1d7d5de2b5}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\medium"> <Filter Include="Source Files\medium">
<UniqueIdentifier>{855b0594-d28c-486a-b081-72991219654e}</UniqueIdentifier> <UniqueIdentifier>{81241aff-695b-4556-bf46-e9d3ac4aa7fb}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\emitters"> <Filter Include="Source Files\emitters">
<UniqueIdentifier>{08449c4a-89f1-4b5b-a756-2bd2f03bf566}</UniqueIdentifier> <UniqueIdentifier>{f4218b48-d878-435b-915a-8da9727666b1}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\emitters\sky">
<UniqueIdentifier>{8437086b-afc9-48b6-a358-53d4df044974}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\emitters\sunsky"> <Filter Include="Source Files\emitters\sunsky">
<UniqueIdentifier>{d9802d62-8614-401a-afa6-941271c63386}</UniqueIdentifier> <UniqueIdentifier>{e6e1a06f-b795-4a12-9b0c-0c730e0b2ac6}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\subsurface"> <Filter Include="Source Files\subsurface">
<UniqueIdentifier>{65e0e20a-2809-4352-8c81-69a0a3824fa9}</UniqueIdentifier> <UniqueIdentifier>{231a82e9-6b4b-4a95-995c-8abd0b6149b3}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\rfilters"> <Filter Include="Source Files\rfilters">
<UniqueIdentifier>{8ea19f58-a2c0-4a30-bc79-817da2f1a1ed}</UniqueIdentifier> <UniqueIdentifier>{4c70e19a-a935-4b0f-88e3-10683b03f66c}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\volume"> <Filter Include="Source Files\volume">
<UniqueIdentifier>{753c9d80-ceb0-4932-8097-5c7cac92e091}</UniqueIdentifier> <UniqueIdentifier>{4a433329-84ca-4a8b-938e-4d06c21ec6ff}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\mtsgui"> <Filter Include="Source Files\mtsgui">
<UniqueIdentifier>{b4290489-566b-4576-847b-392b4c45f1f1}</UniqueIdentifier> <UniqueIdentifier>{4414bb60-269f-4934-9dc9-58bbed35bc1d}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\mtsgui\pch"> <Filter Include="Source Files\mtsgui\pch">
<UniqueIdentifier>{ad07dceb-214e-42e1-933d-c8ceeecd1389}</UniqueIdentifier> <UniqueIdentifier>{4bc23857-f9a2-453d-bc64-8c9ebc5aff42}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\mtsgui\resources"> <Filter Include="Source Files\mtsgui\resources">
<UniqueIdentifier>{3ee94c12-30fb-4f65-8781-f7b5e8a95db2}</UniqueIdentifier> <UniqueIdentifier>{a9318f22-caaa-40af-b8fc-9b8051ec0859}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\mtsgui\shaders"> <Filter Include="Source Files\mtsgui\shaders">
<UniqueIdentifier>{813aba46-5b9d-4290-9a31-18e77952929e}</UniqueIdentifier> <UniqueIdentifier>{fba5da81-e3f2-4fbe-98d7-807aaa2c2cf3}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\phase"> <Filter Include="Source Files\phase">
<UniqueIdentifier>{55bcc3cd-7f6b-4bb6-b22e-b731ed0451fb}</UniqueIdentifier> <UniqueIdentifier>{abd6883d-375b-4d85-bb93-12952995332d}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\utils"> <Filter Include="Source Files\utils">
<UniqueIdentifier>{6ebccae2-fbfd-4a3f-9bfc-7e9dbd2b6d74}</UniqueIdentifier> <UniqueIdentifier>{4c9fdf84-d6a6-47f8-8d58-c01ed8351fa0}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\films"> <Filter Include="Source Files\films">
<UniqueIdentifier>{a339ab19-2bed-4d03-afdc-d73223648b72}</UniqueIdentifier> <UniqueIdentifier>{366f9975-2268-4124-81b9-87e7c2c03b1e}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\shapes"> <Filter Include="Source Files\shapes">
<UniqueIdentifier>{87b01999-0b73-481b-b8fa-b66f594f65be}</UniqueIdentifier> <UniqueIdentifier>{8d2d02ea-1957-4256-8046-f525d13e7ba5}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\shapes\ply"> <Filter Include="Source Files\shapes\ply">
<UniqueIdentifier>{5870cf94-fb1b-44c0-90f2-32c3c8cbf6b7}</UniqueIdentifier> <UniqueIdentifier>{8438e074-8733-4689-95ba-86145dd9fd9d}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\integrators"> <Filter Include="Source Files\integrators">
<UniqueIdentifier>{90263b28-e65b-4d41-92cb-a0d1dac22564}</UniqueIdentifier> <UniqueIdentifier>{9d35d85d-280c-49ef-869a-ffaa0602f9f5}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\integrators\vpl"> <Filter Include="Source Files\integrators\vpl">
<UniqueIdentifier>{453d13c1-1847-4a18-8f2e-028913b4ec43}</UniqueIdentifier> <UniqueIdentifier>{6df94c72-e89d-451e-ad6b-160ea0313077}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\integrators\misc"> <Filter Include="Source Files\integrators\misc">
<UniqueIdentifier>{e4baad7e-ee3c-4085-961f-2851c0ed2b8f}</UniqueIdentifier> <UniqueIdentifier>{7bec8429-3bb9-4dfd-8008-a10c675a9818}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\integrators\direct"> <Filter Include="Source Files\integrators\direct">
<UniqueIdentifier>{a7ab51c2-5596-458f-b5f0-1129dc3dbbf5}</UniqueIdentifier> <UniqueIdentifier>{747a1613-4c01-46ef-ba17-92d2286890ad}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\integrators\pssmlt"> <Filter Include="Source Files\integrators\pssmlt">
<UniqueIdentifier>{a7456898-2253-48d8-abec-9c86311cca64}</UniqueIdentifier> <UniqueIdentifier>{516a0fc3-a824-4486-b50c-f3165d1d8361}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\integrators\photonmapper"> <Filter Include="Source Files\integrators\photonmapper">
<UniqueIdentifier>{cb9f48b8-6f25-4c9d-9d2c-b1a67cc80427}</UniqueIdentifier> <UniqueIdentifier>{bddbc784-474a-4cd3-bbea-3123048dbfaa}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\integrators\path"> <Filter Include="Source Files\integrators\path">
<UniqueIdentifier>{b44ee927-e827-4c46-bbce-c7a1b705b63b}</UniqueIdentifier> <UniqueIdentifier>{7bba2a7a-8cd3-47bd-9ab2-e33939d4eba6}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\integrators\mlt"> <Filter Include="Source Files\integrators\mlt">
<UniqueIdentifier>{40540c0e-02d6-4296-bbdf-87dfd9f7f213}</UniqueIdentifier> <UniqueIdentifier>{32cdfdd7-c3bb-41f2-b433-10165963f9ed}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\integrators\bdpt"> <Filter Include="Source Files\integrators\bdpt">
<UniqueIdentifier>{430d27a2-66db-4169-bb48-aeb0b65e4d1a}</UniqueIdentifier> <UniqueIdentifier>{49edc93d-4305-45a8-a6d9-ae283837d46a}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\integrators\erpt"> <Filter Include="Source Files\integrators\erpt">
<UniqueIdentifier>{a247e523-dbaf-4fb8-b284-6c8c5cbc09a5}</UniqueIdentifier> <UniqueIdentifier>{d24cf1e6-a301-42e8-9fc1-26fe0ddc3f04}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\integrators\ptracer"> <Filter Include="Source Files\integrators\ptracer">
<UniqueIdentifier>{91d6db52-180b-4dde-9339-807917e42f4e}</UniqueIdentifier> <UniqueIdentifier>{3df649be-39d5-4416-8776-427a1696c016}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\textures"> <Filter Include="Source Files\textures">
<UniqueIdentifier>{8ae0e3a3-87db-4e93-bb20-9d198040ae86}</UniqueIdentifier> <UniqueIdentifier>{2e68088f-97e2-4dee-91f5-c85e3e36dd74}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\libbidir"> <Filter Include="Source Files\libbidir">
<UniqueIdentifier>{0049f7d1-4211-4010-b53c-3ee99244046e}</UniqueIdentifier> <UniqueIdentifier>{f7674a86-b0a5-484c-9db3-a20500b9bbf9}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Source Files\libpython"> <Filter Include="Source Files\libpython">
<UniqueIdentifier>{8bddb89b-fa54-448a-a4b3-294f18d45ded}</UniqueIdentifier> <UniqueIdentifier>{f41987e3-e0b9-431d-b37b-5931db380b09}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Header Files\mitsuba"> <Filter Include="Header Files\mitsuba">
<UniqueIdentifier>{082f589c-eb3f-47a4-b2f6-fbd6d89dec07}</UniqueIdentifier> <UniqueIdentifier>{88ed597b-50ba-4d6f-bf50-ae8f5fa17789}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Header Files\mitsuba\render"> <Filter Include="Header Files\mitsuba\render">
<UniqueIdentifier>{a7f59027-bc87-4d28-9b90-eb5be186d8a7}</UniqueIdentifier> <UniqueIdentifier>{5499a8e9-ef31-4ab9-a58f-d3a36a784004}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Header Files\mitsuba\core"> <Filter Include="Header Files\mitsuba\core">
<UniqueIdentifier>{f5410d0f-0a22-4579-afbf-8e13db8fa3d5}</UniqueIdentifier> <UniqueIdentifier>{b74f25a9-ff20-4888-8dfc-57dd968b0b8d}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Header Files\mitsuba\hw"> <Filter Include="Header Files\mitsuba\hw">
<UniqueIdentifier>{ebe2b998-26de-4e92-8618-c739cb43a5f2}</UniqueIdentifier> <UniqueIdentifier>{18246123-74da-4fee-8581-bd2860451c40}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Header Files\mitsuba\bidir"> <Filter Include="Header Files\mitsuba\bidir">
<UniqueIdentifier>{4f4d9d4b-3f44-4d56-9a18-16b94e753706}</UniqueIdentifier> <UniqueIdentifier>{3fdeab5a-5ccf-41c6-bf05-d9f7f510c741}</UniqueIdentifier>
</Filter> </Filter>
</ItemGroup> </ItemGroup>
<ItemGroup Label="Source Files"> <ItemGroup Label="Source Files">
@ -247,9 +247,6 @@
<ClCompile Include="..\src\librender\photonmap.cpp"> <ClCompile Include="..\src\librender\photonmap.cpp">
<Filter>Source Files\librender</Filter> <Filter>Source Files\librender</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\librender\track.cpp">
<Filter>Source Files\librender</Filter>
</ClCompile>
<ClCompile Include="..\src\librender\renderjob.cpp"> <ClCompile Include="..\src\librender\renderjob.cpp">
<Filter>Source Files\librender</Filter> <Filter>Source Files\librender</Filter>
</ClCompile> </ClCompile>
@ -439,6 +436,9 @@
<ClCompile Include="..\src\libhw\vpl.cpp"> <ClCompile Include="..\src\libhw\vpl.cpp">
<Filter>Source Files\libhw</Filter> <Filter>Source Files\libhw</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\libhw\shadow.cpp">
<Filter>Source Files\libhw</Filter>
</ClCompile>
<ClCompile Include="..\src\libhw\basicshader.cpp"> <ClCompile Include="..\src\libhw\basicshader.cpp">
<Filter>Source Files\libhw</Filter> <Filter>Source Files\libhw</Filter>
</ClCompile> </ClCompile>
@ -511,6 +511,12 @@
<ClCompile Include="..\src\libcore\logger.cpp"> <ClCompile Include="..\src\libcore\logger.cpp">
<Filter>Source Files\libcore</Filter> <Filter>Source Files\libcore</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\libcore\spline.cpp">
<Filter>Source Files\libcore</Filter>
</ClCompile>
<ClCompile Include="..\src\libcore\track.cpp">
<Filter>Source Files\libcore</Filter>
</ClCompile>
<ClCompile Include="..\src\libcore\formatter.cpp"> <ClCompile Include="..\src\libcore\formatter.cpp">
<Filter>Source Files\libcore</Filter> <Filter>Source Files\libcore</Filter>
</ClCompile> </ClCompile>
@ -709,6 +715,9 @@
<ClCompile Include="..\src\mtsgui\main.cpp"> <ClCompile Include="..\src\mtsgui\main.cpp">
<Filter>Source Files\mtsgui</Filter> <Filter>Source Files\mtsgui</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\mtsgui\test_simdtonemap.cpp">
<Filter>Source Files\mtsgui</Filter>
</ClCompile>
<ClCompile Include="..\src\mtsgui\programsettingsdlg.cpp"> <ClCompile Include="..\src\mtsgui\programsettingsdlg.cpp">
<Filter>Source Files\mtsgui</Filter> <Filter>Source Files\mtsgui</Filter>
</ClCompile> </ClCompile>
@ -805,15 +814,9 @@
<ClCompile Include="..\src\utils\addimages.cpp"> <ClCompile Include="..\src\utils\addimages.cpp">
<Filter>Source Files\utils</Filter> <Filter>Source Files\utils</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\utils\ttest.cpp">
<Filter>Source Files\utils</Filter>
</ClCompile>
<ClCompile Include="..\src\utils\kdbench.cpp"> <ClCompile Include="..\src\utils\kdbench.cpp">
<Filter>Source Files\utils</Filter> <Filter>Source Files\utils</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\utils\uflakefit.cpp">
<Filter>Source Files\utils</Filter>
</ClCompile>
<ClCompile Include="..\src\utils\joinrgb.cpp"> <ClCompile Include="..\src\utils\joinrgb.cpp">
<Filter>Source Files\utils</Filter> <Filter>Source Files\utils</Filter>
</ClCompile> </ClCompile>
@ -835,6 +838,9 @@
<ClCompile Include="..\src\shapes\ply\ply_parser.cpp"> <ClCompile Include="..\src\shapes\ply\ply_parser.cpp">
<Filter>Source Files\shapes\ply</Filter> <Filter>Source Files\shapes\ply</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\shapes\cube.cpp">
<Filter>Source Files\shapes</Filter>
</ClCompile>
<ClCompile Include="..\src\shapes\serialized.cpp"> <ClCompile Include="..\src\shapes\serialized.cpp">
<Filter>Source Files\shapes</Filter> <Filter>Source Files\shapes</Filter>
</ClCompile> </ClCompile>
@ -853,10 +859,10 @@
<ClCompile Include="..\src\shapes\hair.cpp"> <ClCompile Include="..\src\shapes\hair.cpp">
<Filter>Source Files\shapes</Filter> <Filter>Source Files\shapes</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\shapes\ply.cpp"> <ClCompile Include="..\src\shapes\deformable.cpp">
<Filter>Source Files\shapes</Filter> <Filter>Source Files\shapes</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\shapes\animatedinstance.cpp"> <ClCompile Include="..\src\shapes\ply.cpp">
<Filter>Source Files\shapes</Filter> <Filter>Source Files\shapes</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\shapes\cylinder.cpp"> <ClCompile Include="..\src\shapes\cylinder.cpp">
@ -1035,17 +1041,20 @@
<ClInclude Include="..\src\samplers\sobolseq.h"> <ClInclude Include="..\src\samplers\sobolseq.h">
<Filter>Source Files\samplers</Filter> <Filter>Source Files\samplers</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\src\libhw\veramono14_dsc.h"> <ClInclude Include="..\src\libhw\data\veramono14_dsc.h">
<Filter>Source Files\libhw</Filter> <Filter>Source Files\libhw\data</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\src\libhw\vera14_dsc.h"> <ClInclude Include="..\src\libhw\data\vera14_dsc.h">
<Filter>Source Files\libhw</Filter> <Filter>Source Files\libhw\data</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\src\libhw\veramono14_png.h"> <ClInclude Include="..\src\libhw\data\shaders.h">
<Filter>Source Files\libhw</Filter> <Filter>Source Files\libhw\data</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\src\libhw\vera14_png.h"> <ClInclude Include="..\src\libhw\data\veramono14_png.h">
<Filter>Source Files\libhw</Filter> <Filter>Source Files\libhw\data</Filter>
</ClInclude>
<ClInclude Include="..\src\libhw\data\vera14_png.h">
<Filter>Source Files\libhw\data</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\src\medium\materials.h"> <ClInclude Include="..\src\medium\materials.h">
<Filter>Source Files\medium</Filter> <Filter>Source Files\medium</Filter>
@ -1152,6 +1161,9 @@
<ClInclude Include="..\src\films\banner.h"> <ClInclude Include="..\src\films\banner.h">
<Filter>Source Files\films</Filter> <Filter>Source Files\films</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\src\films\annotations.h">
<Filter>Source Files\films</Filter>
</ClInclude>
<ClInclude Include="..\src\shapes\shapegroup.h"> <ClInclude Include="..\src\shapes\shapegroup.h">
<Filter>Source Files\shapes</Filter> <Filter>Source Files\shapes</Filter>
</ClInclude> </ClInclude>
@ -1278,6 +1290,9 @@
<ClInclude Include="..\include\mitsuba\render\volume.h"> <ClInclude Include="..\include\mitsuba\render\volume.h">
<Filter>Header Files\mitsuba\render</Filter> <Filter>Header Files\mitsuba\render</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\render\sahkdtree4.h">
<Filter>Header Files\mitsuba\render</Filter>
</ClInclude>
<ClInclude Include="..\include\mitsuba\render\integrator.h"> <ClInclude Include="..\include\mitsuba\render\integrator.h">
<Filter>Header Files\mitsuba\render</Filter> <Filter>Header Files\mitsuba\render</Filter>
</ClInclude> </ClInclude>
@ -1287,9 +1302,6 @@
<ClInclude Include="..\include\mitsuba\render\texture.h"> <ClInclude Include="..\include\mitsuba\render\texture.h">
<Filter>Header Files\mitsuba\render</Filter> <Filter>Header Files\mitsuba\render</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\render\track.h">
<Filter>Header Files\mitsuba\render</Filter>
</ClInclude>
<ClInclude Include="..\include\mitsuba\render\triaccel_sse.h"> <ClInclude Include="..\include\mitsuba\render\triaccel_sse.h">
<Filter>Header Files\mitsuba\render</Filter> <Filter>Header Files\mitsuba\render</Filter>
</ClInclude> </ClInclude>
@ -1425,6 +1437,9 @@
<ClInclude Include="..\include\mitsuba\core\matrix.inl"> <ClInclude Include="..\include\mitsuba\core\matrix.inl">
<Filter>Header Files\mitsuba\core</Filter> <Filter>Header Files\mitsuba\core</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\math.h">
<Filter>Header Files\mitsuba\core</Filter>
</ClInclude>
<ClInclude Include="..\include\mitsuba\core\ssemath.h"> <ClInclude Include="..\include\mitsuba\core\ssemath.h">
<Filter>Header Files\mitsuba\core</Filter> <Filter>Header Files\mitsuba\core</Filter>
</ClInclude> </ClInclude>
@ -1461,6 +1476,9 @@
<ClInclude Include="..\include\mitsuba\core\statistics.h"> <ClInclude Include="..\include\mitsuba\core\statistics.h">
<Filter>Header Files\mitsuba\core</Filter> <Filter>Header Files\mitsuba\core</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\spline.h">
<Filter>Header Files\mitsuba\core</Filter>
</ClInclude>
<ClInclude Include="..\include\mitsuba\core\thread.h"> <ClInclude Include="..\include\mitsuba\core\thread.h">
<Filter>Header Files\mitsuba\core</Filter> <Filter>Header Files\mitsuba\core</Filter>
</ClInclude> </ClInclude>
@ -1494,6 +1512,9 @@
<ClInclude Include="..\include\mitsuba\core\brent.h"> <ClInclude Include="..\include\mitsuba\core\brent.h">
<Filter>Header Files\mitsuba\core</Filter> <Filter>Header Files\mitsuba\core</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\track.h">
<Filter>Header Files\mitsuba\core</Filter>
</ClInclude>
<ClInclude Include="..\include\mitsuba\core\chisquare.h"> <ClInclude Include="..\include\mitsuba\core\chisquare.h">
<Filter>Header Files\mitsuba\core</Filter> <Filter>Header Files\mitsuba\core</Filter>
</ClInclude> </ClInclude>
@ -1530,9 +1551,6 @@
<ClInclude Include="..\include\mitsuba\core\class.h"> <ClInclude Include="..\include\mitsuba\core\class.h">
<Filter>Header Files\mitsuba\core</Filter> <Filter>Header Files\mitsuba\core</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\core\stl.h">
<Filter>Header Files\mitsuba\core</Filter>
</ClInclude>
<ClInclude Include="..\include\mitsuba\core\warp.h"> <ClInclude Include="..\include\mitsuba\core\warp.h">
<Filter>Header Files\mitsuba\core</Filter> <Filter>Header Files\mitsuba\core</Filter>
</ClInclude> </ClInclude>
@ -1614,6 +1632,9 @@
<ClInclude Include="..\include\mitsuba\hw\gpugeometry.h"> <ClInclude Include="..\include\mitsuba\hw\gpugeometry.h">
<Filter>Header Files\mitsuba\hw</Filter> <Filter>Header Files\mitsuba\hw</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\include\mitsuba\hw\shadow.h">
<Filter>Header Files\mitsuba\hw</Filter>
</ClInclude>
<ClInclude Include="..\include\mitsuba\hw\glrenderer.h"> <ClInclude Include="..\include\mitsuba\hw\glrenderer.h">
<Filter>Header Files\mitsuba\hw</Filter> <Filter>Header Files\mitsuba\hw</Filter>
</ClInclude> </ClInclude>

View File

@ -1,3 +1,39 @@
mitsuba (0.4.3-1) unstable; urgency=low
* Motion blur: Support for arbitrary linear camera, object, and sensor motion
to produce motion blur in renderings.
* Render-time annotations: added the ability to tag image files with additional
information by means of metadata or text labels.
* Hide directly visible emitters: convenient feature for removing an environment
light source so that an image can be composited onto documents having a
different color.
* Improved instancing: more robust instancing code with support for
non-rigid transformations.
* Threading on Windows: fixed various threading-related issues on Windows that
previously caused crashes and deadlocks.
* Caching: Caching mechanism to further accelerate the loading of
.serialized files.
* File dialogs: Native File Open/Save dialogs are now used on Windows.
* Python: Improved python bindings; easier usage on MacOS X.
* Blender interaction: Fixed a issue where GUI tabs containing scenes created
in Blender could not be cloned.
* Non-uniform scales: All triangle mesh-based shapes now permit
non-uniform scales.
* NaNs and friends: Increased resilience against various numerical corner cases.
* Index-matched participating media: Fixed an unfortunate regression in volpath
regarding index-matched media that was accidentally introduced in 0.4.2.
* roughdiffuse: Fixed texturing support in the roughdiffuse plugin.
* Photon mapping: Fixed some inaccuracies involving participating media when
rendered by the photon mapper and the Beam Radiance Estimate.
* Conductors: Switched Fresnel reflectance computations for conductors to the
exact expressions predicted by geometric optics (an approximation was
previously used).
* New cube shape: Added a cube shape plugin for convenience. This does
exactly what one would expect.
* The rest: As usual, a large number of smaller bugfixes and improvements
were below the threshold and are thus not listed individually. The
repository log has more details.
-- Wenzel Jakob <wenzel@cs.cornell.edu> Tue, 29 Jan 2013 00:00:00 -0400
mitsuba (0.4.2-1) unstable; urgency=low mitsuba (0.4.2-1) unstable; urgency=low
* Volumetric path tracers: improved sampling when dealing with index-matched medium transitions. This is essentially a re-implementation of an optimization that Mitsuba 0.3.1 already had, but which got lost in the bidirectional rewrite. * Volumetric path tracers: improved sampling when dealing with index-matched medium transitions. This is essentially a re-implementation of an optimization that Mitsuba 0.3.1 already had, but which got lost in the bidirectional rewrite.
* Batch tonemapper: due to an unfortunate bug, the batch tonemapper in the last release produced invalid results for images containing an alpha channel. This is now fixed. * Batch tonemapper: due to an unfortunate bug, the batch tonemapper in the last release produced invalid results for images containing an alpha channel. This is now fixed.
@ -50,15 +86,15 @@ mitsuba (0.4.0-1) unstable; urgency=low
mitsuba (0.3.1-1) unstable; urgency=low mitsuba (0.3.1-1) unstable; urgency=low
* Photon mapper: The photon mapper had some serious issues in the * Photon mapper: The photon mapper had some serious issues in the
last release. These are now fixed, and it should run faster too. last release. These are now fixed, and it should run faster too.
* On Linux/x86_64, the performance of the single precision exp() and log() * On Linux/x86_64, the performance of the single precision exp() and log()
math library functions is extremely poor. Mitsuba now uses the double math library functions is extremely poor. Mitsuba now uses the double
prevision versions of these functions by default. prevision versions of these functions by default.
* Primitive clipping: Fixed numerical issues that occurred when using * Primitive clipping: Fixed numerical issues that occurred when using
primitive clipping in a double precision build. primitive clipping in a double precision build.
* The adaptive integrator now better interacts with certain sub-integrators. * The adaptive integrator now better interacts with certain sub-integrators.
* Instanced analytic shapes (e.g. spheres, cylinders, ..) are now supported, * Instanced analytic shapes (e.g. spheres, cylinders, ..) are now supported,
and an error involving network rendering with instanced geometry is fixed. and an error involving network rendering with instanced geometry is fixed.
* Fixed a serious issue that could destroy a scene file when saving from a cloned tab! * Fixed a serious issue that could destroy a scene file when saving from a cloned tab!
* Fixed some bad GUI behavior in multi-screen setups * Fixed some bad GUI behavior in multi-screen setups
@ -72,30 +108,30 @@ mitsuba (0.3.0-1) unstable; urgency=low
* Added Python bindings that can be used to instantiate plugins * Added Python bindings that can be used to instantiate plugins
and control rendering processes. and control rendering processes.
* Spectral rendering: most of the code pertaining to spectral * Spectral rendering: most of the code pertaining to spectral
rendering has seen a significant overhaul. It is now faster and rendering has seen a significant overhaul. It is now faster and
in certain cases more accurate. in certain cases more accurate.
* Flexible material classes: this release introduces a robust and * Flexible material classes: this release introduces a robust and
very general suite of eight physically-based smooth and rough very general suite of eight physically-based smooth and rough
(microfacet-based) material classes. (microfacet-based) material classes.
* Material modifiers: two new material modifiers (bump & coating) * Material modifiers: two new material modifiers (bump & coating)
can be applied to BSDFs to create new materials. can be applied to BSDFs to create new materials.
* Material verification: the sampling methods of all material * Material verification: the sampling methods of all material
models in Mitsuba are now automatically verified with the help models in Mitsuba are now automatically verified with the help
of statistical hypothesis tests (using Chi^2-tests). of statistical hypothesis tests (using Chi^2-tests).
* Generated documentation: there is now a javadoc-like system, * Generated documentation: there is now a javadoc-like system,
which extracts documentation directly from the plugin source code which extracts documentation directly from the plugin source code
and stitches it into a LaTeX reference document. and stitches it into a LaTeX reference document.
* lookAt: Mitsuba inherited a bug from PBRT, where the <lookAt> * lookAt: Mitsuba inherited a bug from PBRT, where the <lookAt>
tag changed the handedness of the coordinate system. This is now tag changed the handedness of the coordinate system. This is now
fixed--also, the syntax of this tag has changed to make it easier to read. fixed--also, the syntax of this tag has changed to make it easier to read.
* Scene portability: A new conversion tool ensures that old and incompatible * Scene portability: A new conversion tool ensures that old and incompatible
scenes can be translated into the scene description format of the scenes can be translated into the scene description format of the
most recent version. most recent version.
* Contributed plugins: Tom Kazimiers and Papas have contributed * Contributed plugins: Tom Kazimiers and Papas have contributed
implementations of the Preetham Sun & Sky model and the Hanrahan-Krueger implementations of the Preetham Sun & Sky model and the Hanrahan-Krueger
scattering model. scattering model.
* Photon mapping: The Photon map integrator has been rewritten for * Photon mapping: The Photon map integrator has been rewritten for
improved accuracy and better performance. Furthermore, the underlying improved accuracy and better performance. Furthermore, the underlying
data structure has been replaced with a ~50% faster implementation. data structure has been replaced with a ~50% faster implementation.
@ -140,8 +176,8 @@ mitsuba (0.2.0-1) unstable; urgency=low
mitsuba (0.1.3-1) unstable; urgency=low mitsuba (0.1.3-1) unstable; urgency=low
This is mainly a bugfix release to address a serious regression in the This is mainly a bugfix release to address a serious regression in the
material system. Other notable changes are: material system. Other notable changes are:
* Imported scenes now store relative paths * Imported scenes now store relative paths
* OBJ importing works on Windows * OBJ importing works on Windows
@ -149,7 +185,7 @@ mitsuba (0.1.3-1) unstable; urgency=low
* The anisotropic Ward BRDF is now supported in the preview * The anisotropic Ward BRDF is now supported in the preview
* Faster texture loading * Faster texture loading
* The renderer now has a testcase framework similar to JUnit * The renderer now has a testcase framework similar to JUnit
-- Wenzel Jakob <wenzel@cs.cornell.edu> Wed, 8 Sep 2010 09:59:00 -0400 -- Wenzel Jakob <wenzel@cs.cornell.edu> Wed, 8 Sep 2010 09:59:00 -0400
mitsuba (0.1.2-1) unstable; urgency=low mitsuba (0.1.2-1) unstable; urgency=low
@ -165,8 +201,8 @@ mitsuba (0.1.2-1) unstable; urgency=low
is lacking some required OpenGL features. is lacking some required OpenGL features.
* Create default cameras/lightsources if none are specified in a scene * Create default cameras/lightsources if none are specified in a scene
* Support for drag & drop in the user interface * Support for drag & drop in the user interface
* The Mitsuba user interface now also doubles as an EXR viewer / tonemapper. * The Mitsuba user interface now also doubles as an EXR viewer / tonemapper.
Drag an EXR file onto the UI or open it using the File menu, and the image Drag an EXR file onto the UI or open it using the File menu, and the image
opens in a new tab. Afterwards, it is possible to export the image as a tonemapped opens in a new tab. Afterwards, it is possible to export the image as a tonemapped
8-bit PNG image. 8-bit PNG image.
* The realtime preview now has a 'force diffuse' feature to improve * The realtime preview now has a 'force diffuse' feature to improve
@ -180,6 +216,6 @@ mitsuba (0.1.2-1) unstable; urgency=low
mitsuba (0.1.1-1) unstable; urgency=low mitsuba (0.1.1-1) unstable; urgency=low
* Initial release * Initial release
-- Wenzel Jakob <wenzel@cs.cornell.edu> Sat, 17 Jul 2010 23:56:03 -0400 -- Wenzel Jakob <wenzel@cs.cornell.edu> Sat, 17 Jul 2010 23:56:03 -0400

View File

@ -1,7 +1,7 @@
Name: mitsuba Name: mitsuba
Version: 0.4.2 Version: 0.4.3
Release: 1%{?dist} Release: 1%{?dist}
Summary: Mitsuba renderer Summary: Mitsuba renderer
Group: Applications/Graphics Group: Applications/Graphics
License: GPL-3 License: GPL-3
URL: http://www.mitsuba-renderer.org URL: http://www.mitsuba-renderer.org
@ -10,11 +10,11 @@ BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires: gcc-c++ scons boost-devel qt4-devel OpenEXR-devel xerces-c-devel python-devel glew-devel collada-dom-devel eigen3-devel BuildRequires: gcc-c++ scons boost-devel qt4-devel OpenEXR-devel xerces-c-devel python-devel glew-devel collada-dom-devel eigen3-devel
Requires: boost qt4 OpenEXR-libs xerces-c python libGLEWmx collada-dom Requires: boost qt4 OpenEXR-libs xerces-c python libGLEWmx collada-dom
%description %description
Mitsuba is an extensible rendering framework written in portable C++. It implements unbiased as well as biased techniques and contains heavy optimizations targeted towards current CPU architectures. Mitsuba is an extensible rendering framework written in portable C++. It implements unbiased as well as biased techniques and contains heavy optimizations targeted towards current CPU architectures.
The program currently runs on Linux, MacOS X and Microsoft Windows and makes use of SSE2 optimizations on x86 and x86_64 platforms. So far, its main use has been as a testbed for algorithm development in computer graphics, but there are many other interesting applications. The program currently runs on Linux, MacOS X and Microsoft Windows and makes use of SSE2 optimizations on x86 and x86_64 platforms. So far, its main use has been as a testbed for algorithm development in computer graphics, but there are many other interesting applications.
Mitsuba comes with a command-line interface as well as a graphical frontend to interactively explore scenes. While navigating, a rough preview is shown that becomes increasingly accurate as soon as all movements are stopped. Once a viewpoint has been chosen, a wide range of rendering techniques can be used to generate images, and their parameters can be tuned from within the program. Mitsuba comes with a command-line interface as well as a graphical frontend to interactively explore scenes. While navigating, a rough preview is shown that becomes increasingly accurate as soon as all movements are stopped. Once a viewpoint has been chosen, a wide range of rendering techniques can be used to generate images, and their parameters can be tuned from within the program.
%package devel %package devel
Summary: Mitsuba development files Summary: Mitsuba development files
Requires: boost-devel qt4-devel OpenEXR-devel xerces-c-devel python-devel glew-devel collada-dom-devel Requires: boost-devel qt4-devel OpenEXR-devel xerces-c-devel python-devel glew-devel collada-dom-devel
@ -63,6 +63,9 @@ rm -rf $RPM_BUILD_ROOT
/usr/include/* /usr/include/*
%changelog %changelog
* Tue Jan 29 2013 Wenzel Jakob <wenzel@cs.cornell.edu> 0.4.3%{?dist}
- Upgrade to version 0.4.3
* Wed Oct 31 2012 Wenzel Jakob <wenzel@cs.cornell.edu> 0.4.2%{?dist} * Wed Oct 31 2012 Wenzel Jakob <wenzel@cs.cornell.edu> 0.4.2%{?dist}
- Upgrade to version 0.4.2 - Upgrade to version 0.4.2

View File

@ -97,7 +97,7 @@ and one or more emitters. Here is a more complex example:
<!-- This mesh is an area emitter --> <!-- This mesh is an area emitter -->
<emitter type="area"> <emitter type="area">
<rgb name="intensity" value="100,400,100"/> <rgb name="radiance" value="100,400,100"/>
</emitter> </emitter>
</shape> </shape>
</scene> </scene>
@ -289,7 +289,7 @@ do not explicitly have to be specified.
\subsection{Animated transformations} \subsection{Animated transformations}
Most shapes, emitters, and sensors in Mitsuba can accept both normal transformations Most shapes, emitters, and sensors in Mitsuba can accept both normal transformations
and \emph{animated transformations} as parameters. The latter is useful to and \emph{animated transformations} as parameters. The latter is useful to
render scenes involving motion blur. The syntax used to specify these render scenes involving motion blur (Figure~\ref{fig:animated-transform}). The syntax used to specify these
is slightly different: is slightly different:
\begin{xml} \begin{xml}
<animation name="trafoProperty"> <animation name="trafoProperty">
@ -304,6 +304,11 @@ is slightly different:
.. additional transformations (optional) .. .. additional transformations (optional) ..
</animation> </animation>
\end{xml} \end{xml}
\renderings{
\fbox{\includegraphics[width=.6\textwidth]{images/animated_transform}}\hfill\,
\caption{\label{fig:animated-transform}Beware the dragon: a triangle mesh undergoing linear motion with several keyframes (object courtesy of XYZRGB)}
}
Mitsuba then decomposes each transformation into a scale, translation, and Mitsuba then decomposes each transformation into a scale, translation, and
rotation component and interpolates\footnote{Using linear interpolation rotation component and interpolates\footnote{Using linear interpolation
for the scale and translation component and spherical linear quaternion for the scale and translation component and spherical linear quaternion
@ -311,7 +316,7 @@ interpolation for the rotation component.} these for intermediate
time values. time values.
It is important to specify appropriate shutter open/close times It is important to specify appropriate shutter open/close times
to the sensor so that the motion is visible. to the sensor so that the motion is visible.
\newpage
\subsection{References} \subsection{References}
Quite often, you will find yourself using an object (such as a material) in many places. To avoid having Quite often, you will find yourself using an object (such as a material) in many places. To avoid having
to declare it over and over again, which wastes memory, you can make use of references. Here is an example to declare it over and over again, which wastes memory, you can make use of references. Here is an example

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

View File

@ -27,6 +27,7 @@
\usepackage{ifthen} \usepackage{ifthen}
\usepackage{longtable} \usepackage{longtable}
\usepackage{wrapfig} \usepackage{wrapfig}
\usepackage{footnote} % savenotes environment
% Make sure that ligatures remain searchable in the PDF % Make sure that ligatures remain searchable in the PDF
\input glyphtounicode \input glyphtounicode
@ -39,8 +40,8 @@
\setcounter{secnumdepth}{3} \setcounter{secnumdepth}{3}
\setcounter{tocdepth}{3} \setcounter{tocdepth}{3}
\newcommand{\MitsubaVersion}{0.4.2} \newcommand{\MitsubaVersion}{0.4.3}
\newcommand{\MitsubaYear}{2012} \newcommand{\MitsubaYear}{2013}
\typearea[current]{last} \typearea[current]{last}
\raggedbottom \raggedbottom

View File

@ -203,13 +203,14 @@ MTS_NAMESPACE_END
#define snprintf _snprintf #define snprintf _snprintf
#define vsnprintf _vsnprintf #define vsnprintf _vsnprintf
#define strncasecmp _strnicmp
namespace mitsuba {
#if defined(__64BIT__) #if defined(__64BIT__)
typedef long long ssize_t; typedef long long ssize_t;
#else #else
typedef long ssize_t; typedef long ssize_t;
#endif #endif
};
namespace std { namespace std {
inline char tolower(char c) { inline char tolower(char c) {

View File

@ -58,7 +58,7 @@ extern MTS_EXPORT_CORE std::string formatString(const char *pFmt, ...);
extern MTS_EXPORT_CORE std::string timeString(Float time, bool precise = false); extern MTS_EXPORT_CORE std::string timeString(Float time, bool precise = false);
/// Turn a memory size into a human-readable string /// Turn a memory size into a human-readable string
extern MTS_EXPORT_CORE std::string memString(size_t size); extern MTS_EXPORT_CORE std::string memString(size_t size, bool precise = false);
/// Return a string representation of a list of objects /// Return a string representation of a list of objects
template<class Iterator> std::string containerToString(const Iterator &start, const Iterator &end) { template<class Iterator> std::string containerToString(const Iterator &start, const Iterator &end) {

View File

@ -68,6 +68,9 @@ private:
# pragma warning( pop ) # pragma warning( pop )
#endif #endif
/// Push a cleanup handler to be executed after loading the scene is done
extern MTS_EXPORT_RENDER void pushSceneCleanupHandler(void (*cleanup)());
/** /**
* \brief XML parser for Mitsuba scene files. To be used with the * \brief XML parser for Mitsuba scene files. To be used with the
* SAX interface of Xerces-C++. * SAX interface of Xerces-C++.
@ -101,9 +104,6 @@ public:
/// Free the memory taken up by staticInitialization() /// Free the memory taken up by staticInitialization()
static void staticShutdown(); static void staticShutdown();
/// Push a cleanup handler to be executed after loading the scene is done
static void pushCleanupHandler(void (*cleanup)());
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Implementation of the SAX DocumentHandler interface // Implementation of the SAX DocumentHandler interface
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@ -136,8 +136,7 @@ protected:
private: private:
struct ParseContext { struct ParseContext {
inline ParseContext(ParseContext *_parent) inline ParseContext(ParseContext *_parent)
: parent(_parent) { : parent(_parent) { }
}
ParseContext *parent; ParseContext *parent;
Properties properties; Properties properties;

View File

@ -419,7 +419,8 @@ protected:
class SmoothCoatingShader : public Shader { class SmoothCoatingShader : public Shader {
public: public:
SmoothCoatingShader(Renderer *renderer, Float eta, const BSDF *nested, SmoothCoatingShader(Renderer *renderer, Float eta, const BSDF *nested,
const Texture *sigmaA) : Shader(renderer, EBSDFShader), m_nested(nested), m_sigmaA(sigmaA), m_eta(eta) { const Texture *sigmaA) : Shader(renderer, EBSDFShader),
m_nested(nested), m_sigmaA(sigmaA), m_eta(eta) {
m_nestedShader = renderer->registerShaderForResource(m_nested.get()); m_nestedShader = renderer->registerShaderForResource(m_nested.get());
m_sigmaAShader = renderer->registerShaderForResource(m_sigmaA.get()); m_sigmaAShader = renderer->registerShaderForResource(m_sigmaA.get());
m_R0 = fresnelDielectricExt(1.0f, eta); m_R0 = fresnelDielectricExt(1.0f, eta);
@ -467,15 +468,15 @@ public:
<< "vec3 " << evalName << "_refract(vec3 wi, out float T) {" << endl << "vec3 " << evalName << "_refract(vec3 wi, out float T) {" << endl
<< " float cosThetaI = cosTheta(wi);" << endl << " float cosThetaI = cosTheta(wi);" << endl
<< " bool entering = cosThetaI > 0.0;" << endl << " bool entering = cosThetaI > 0.0;" << endl
<< " float eta = " << evalName << "_eta;" << endl << " float invEta = 1.0 / " << evalName << "_eta;" << endl
<< " float sinThetaTSqr = eta * eta * sinTheta2(wi);" << endl << " float sinThetaTSqr = invEta * invEta * sinTheta2(wi);" << endl
<< " if (sinThetaTSqr >= 1.0) {" << endl << " if (sinThetaTSqr >= 1.0) {" << endl
<< " T = 0.0; /* Total internal reflection */" << endl << " T = 0.0; /* Total internal reflection */" << endl
<< " return vec3(0.0);" << endl << " return vec3(0.0);" << endl
<< " } else {" << endl << " } else {" << endl
<< " float cosThetaT = sqrt(1.0 - sinThetaTSqr);" << endl << " float cosThetaT = sqrt(1.0 - sinThetaTSqr);" << endl
<< " T = 1.0 - " << evalName << "_schlick(1.0 - abs(cosThetaI));" << endl << " T = 1.0 - " << evalName << "_schlick(1.0 - abs(cosThetaI));" << endl
<< " return vec3(eta*wi.x, eta*wi.y, entering ? cosThetaT : -cosThetaT);" << endl << " return vec3(invEta*wi.x, invEta*wi.y, entering ? cosThetaT : -cosThetaT);" << endl
<< " }" << endl << " }" << endl
<< "}" << endl << "}" << endl
<< endl << endl
@ -512,10 +513,11 @@ public:
<< " 1/abs(cosTheta(woPrime))));" << endl << " 1/abs(cosTheta(woPrime))));" << endl
<< " if (cosTheta(wi)*cosTheta(wo) > 0) {" << endl << " if (cosTheta(wi)*cosTheta(wo) > 0) {" << endl
<< " vec3 H = normalize(wi + wo);" << endl << " vec3 H = normalize(wi + wo);" << endl
<< " if (H.z < 0) H = -H;" << endl
<< " float D = " << evalName << "_D(H)" << ";" << endl << " float D = " << evalName << "_D(H)" << ";" << endl
<< " float G = " << evalName << "_G(H, wi, wo);" << endl << " float G = " << evalName << "_G(H, wi, wo);" << endl
<< " float F = " << evalName << "_schlick(1-dot(wi, H));" << endl << " float F = " << evalName << "_schlick(1-abs(dot(wi, H)));" << endl
<< " result += vec3(F * D * G / (4*cosTheta(wi)));" << endl << " result += vec3(abs(F * D * G) / abs(4*cosTheta(wi)));" << endl
<< " }" << endl << " }" << endl
<< " return result;" << endl << " return result;" << endl
<< "}" << endl << "}" << endl

View File

@ -84,7 +84,11 @@ public:
* (For lower roughness values, please switch to the smooth BSDF variants) * (For lower roughness values, please switch to the smooth BSDF variants)
*/ */
Float transformRoughness(Float value) const { Float transformRoughness(Float value) const {
value = std::max(value, (Float) 1e-5f); #if defined(SINGLE_PRECISION)
value = std::max(value, (Float) 1e-3f);
#else
value = std::max(value, (Float) 1e-5f);
#endif
if (m_type == EPhong || m_type == EAshikhminShirley) if (m_type == EPhong || m_type == EAshikhminShirley)
value = std::max(2 / (value * value) - 2, (Float) 0.1f); value = std::max(2 / (value * value) - 2, (Float) 0.1f);
return value; return value;

View File

@ -339,7 +339,7 @@ public:
Spectrum diff = m_diffuseReflectance->eval(bRec.its); Spectrum diff = m_diffuseReflectance->eval(bRec.its);
if (m_nonlinear) if (m_nonlinear)
diff /= Spectrum(1.0f) - m_fdrInt*diff; diff /= Spectrum(1.0f) - diff*m_fdrInt;
else else
diff /= 1 - m_fdrInt; diff /= 1 - m_fdrInt;
@ -357,6 +357,7 @@ public:
bRec.sampledType = EDiffuseReflection; bRec.sampledType = EDiffuseReflection;
Spectrum diff = m_diffuseReflectance->eval(bRec.its); Spectrum diff = m_diffuseReflectance->eval(bRec.its);
diff /= Spectrum(1.0f) - m_fdrInt*diff;
if (m_nonlinear) if (m_nonlinear)
diff /= Spectrum(1.0f) - diff*m_fdrInt; diff /= Spectrum(1.0f) - diff*m_fdrInt;
else else
@ -424,14 +425,14 @@ public:
bRec.wo = Warp::squareToCosineHemisphere(sample); bRec.wo = Warp::squareToCosineHemisphere(sample);
Float Fo = fresnelDielectricExt(Frame::cosTheta(bRec.wo), m_eta); Float Fo = fresnelDielectricExt(Frame::cosTheta(bRec.wo), m_eta);
pdf = Warp::squareToCosineHemispherePdf(bRec.wo);
Spectrum diff = m_diffuseReflectance->eval(bRec.its); Spectrum diff = m_diffuseReflectance->eval(bRec.its);
if (m_nonlinear) if (m_nonlinear)
diff /= Spectrum(1.0f) - diff*m_fdrInt; diff /= Spectrum(1.0f) - diff*m_fdrInt;
else else
diff /= 1 - m_fdrInt; diff /= 1 - m_fdrInt;
pdf = Warp::squareToCosineHemispherePdf(bRec.wo);
return diff * (m_invEta2 * (1-Fi) * (1-Fo)); return diff * (m_invEta2 * (1-Fi) * (1-Fo));
} }
} }

View File

@ -554,7 +554,7 @@ public:
<< "vec3 " << evalName << "_refract(vec3 wi, out float T) {" << endl << "vec3 " << evalName << "_refract(vec3 wi, out float T) {" << endl
<< " float cosThetaI = cosTheta(wi);" << endl << " float cosThetaI = cosTheta(wi);" << endl
<< " bool entering = cosThetaI > 0.0;" << endl << " bool entering = cosThetaI > 0.0;" << endl
<< " float invEta = " << evalName << "_eta;" << endl << " float invEta = 1.0 / " << evalName << "_eta;" << endl
<< " float sinThetaTSqr = invEta * invEta * sinTheta2(wi);" << endl << " float sinThetaTSqr = invEta * invEta * sinTheta2(wi);" << endl
<< " if (sinThetaTSqr >= 1.0) {" << endl << " if (sinThetaTSqr >= 1.0) {" << endl
<< " T = 0.0; /* Total internal reflection */" << endl << " T = 0.0; /* Total internal reflection */" << endl

View File

@ -75,48 +75,68 @@ void annotate(const Scene *scene, const Properties &properties,
if (!(strt = strchr((char *) value.c_str(), '$'))) if (!(strt = strchr((char *) value.c_str(), '$')))
break; break;
if (strncasecmp(strt, "$rendertime", 11) == 0) { char *par1, *par2;
value.replace(strt-value.c_str(), 11, timeString(renderTime)); if (!(par1 = strchr(strt, '[')))
} else if (strncasecmp(strt, "$memusage", 11) == 0) { break;
value.replace(strt-value.c_str(), 11, memString(getPrivateMemoryUsage())); if (!(par2 = strchr(par1, ']')))
} else { break;
char *par1, *par2;
if (!(par1 = strchr(strt, '[')))
break;
if (!(par2 = strchr(par1, ']')))
break;
std::string propSource = value.substr(strt-value.c_str()+1, par1-strt-1); std::string propSource = value.substr(strt-value.c_str()+1, par1-strt-1);
std::string propKey = value.substr(par1-value.c_str()+1, par2-par1-1); std::string propKey = value.substr(par1-value.c_str()+1, par2-par1-1);
propSource.erase(std::remove_if(propSource.begin(), propSource.end(), ::isspace), propSource.end()); propSource.erase(std::remove_if(propSource.begin(), propSource.end(), ::isspace), propSource.end());
propKey.erase(std::remove_if(propKey.begin(), propKey.end(), ::isspace), propKey.end()); propKey.erase(std::remove_if(propKey.begin(), propKey.end(), ::isspace), propKey.end());
if (!boost::starts_with(propKey, "'") || !boost::ends_with(propKey, "'")) if (!boost::starts_with(propKey, "'") || !boost::ends_with(propKey, "'"))
SLog(EError, "Encountered invalid key '%s'", propKey.c_str()); SLog(EError, "Encountered invalid key '%s'", propKey.c_str());
propKey = propKey.substr(1, propKey.length()-2); propKey = propKey.substr(1, propKey.length()-2);
const ConfigurableObject *source = NULL; const ConfigurableObject *source = NULL;
if (propSource == "film") if (propSource == "scene")
source = scene->getFilm(); source = scene;
else if (propSource == "sampler") else if (propSource == "film")
source = scene->getSampler(); source = scene->getFilm();
else if (propSource == "sensor") else if (propSource == "sampler")
source = scene->getSensor(); source = scene->getSampler();
else if (propSource == "integrator") else if (propSource == "sensor")
source = scene->getIntegrator(); source = scene->getSensor();
else else if (propSource == "integrator")
SLog(EError, "Unknown data source '%s' (must be film/sampler/sensor/integrator)", propSource.c_str()); source = scene->getIntegrator();
else
SLog(EError, "Unknown data source '%s' (must be film/sampler/sensor/integrator)", propSource.c_str());
std::string replacement; std::string replacement;
if (source == scene) {
if (propKey == "renderTime") {
replacement = timeString(renderTime);
} else if (propKey == "renderTimePrecise") {
replacement = timeString(renderTime, true);
} else if (propKey == "memUsage") {
replacement = memString(getPrivateMemoryUsage());
} else if (propKey == "memUsagePrecise") {
replacement = memString(getPrivateMemoryUsage(), true);
} else if (propKey == "coreCount") {
replacement = formatString("%i", Scheduler::getInstance()->getCoreCount());
} else if (propKey == "blockSize") {
replacement = formatString("%i", scene->getBlockSize());
} else if (propKey == "sourceFile") {
replacement = scene->getSourceFile().string();
} else if (propKey == "destFile") {
replacement = scene->getDestinationFile().string();
}
}
if (replacement.empty()) {
if (propKey == "type") if (propKey == "type")
replacement = source->getProperties().getPluginName(); replacement = source->getProperties().getPluginName();
else else
replacement = source->getProperties().getAsString(propKey); replacement = source->getProperties().getAsString(propKey);
value.replace(strt-value.c_str(), par2-strt+1, replacement);
} }
value.replace(strt-value.c_str(), par2-strt+1, replacement);
} }
if (labelAnnotation) { if (labelAnnotation) {
Vector2i size = font->getSize(value); Vector2i size = font->getSize(value);
bitmap->fillRect(offset-Vector2i(4, 4), size + Vector2i(8, 8), Spectrum(0.0f)); bitmap->fillRect(offset-Vector2i(4, 4), size + Vector2i(8, 8), Spectrum(0.0f));

View File

@ -117,33 +117,89 @@ MTS_NAMESPACE_BEGIN
* </film> * </film>
* \end{xml} * \end{xml}
* *
* \subsubsection*{Annotations:} * \subsubsection*{Render-time annotations:}
* \label{sec:film-annotations} * \label{sec:film-annotations}
* The \pluginref{ldrfilm} and \pluginref{hdrfilm} plugins support an additional * The \pluginref{ldrfilm} and \pluginref{hdrfilm} plugins support a
* feature referred to as \emph{annotations}, which can be quite useful under * feature referred to as \emph{render-time annotations} to facilitate
* certain circumstances. * record keeping.
*
* Annotations are used to embed useful information inside a rendered image so * Annotations are used to embed useful information inside a rendered image so
* that this information is later available to anyone viewing the image. * that this information is later available to anyone viewing the image.
* Exemplary uses of this feature might be to store the frame or take number, * Exemplary uses of this feature might be to store the frame or take number,
* camera parameters, or other relevant scene information. * rendering time, memory usage, camera parameters, or other relevant scene
* * information.
* Annotations can either be created by means of a \emph{tag}, which is an entry
* in the metadata table of the image file (does not modify the actual image data),
* or a \emph{text} label which is ``burned'' into the image.
* *
* Currently, two different types are supported: a \code{metadata} annotation
* creates an entry in the metadata table of the image, which is preferable
* when the image contents should not be touched. Alternatively, a \code{label}
* annotation creates a line of text that is overlaid on top of the image. Note
* that this is only visible when opening the output file (i.e. the line is not
* shown in the interactive viewer).
* The syntax of this looks as follows: * The syntax of this looks as follows:
* *
* \begin{xml} * \begin{xml}
* <film type="ldrfilm"> * <film type="hdrfilm">
* <!-- Create a new metadata entry 'my_tag_name' and set it to the value 'my_tag_value' --> * <!-- Create a new metadata entry 'my_tag_name' and set it to the
* <string name="tag('my_tag_name')" value="my_tag_value"/> * value 'my_tag_value' -->
* <string name="metadata['key_name']" value="Hello!"/>
* *
* <!-- Add the label 'Hello' at the image position X=50, Y=80 --> * <!-- Add the label 'Hello' at the image position X=50, Y=80 -->
* <string name="text(50,80)" value="Hello!"/> * <string name="label[50, 80]" value="Hello!"/>
* </film> * </film>
* \end{xml} * \end{xml}
*
* The \code{value="..."} argument may also include certain keywords that will be
* evaluated and substituted when the rendered image is written to disk. A list all available
* keywords is provided in Table~\ref{tbl:film-keywords}.
*
* Apart from querying the render time,
* memory usage, and other scene-related information, it is also possible
* to `paste' an existing parameter that was provided to another plugin---for instance,the
* the camera transform matrix would be obtained as \code{\$sensor['toWorld']}. The name of
* the active integrator plugin is given by \code{\$integrator['type']}, and so on.
* All of these can be mixed to build larger fragments, as following example demonstrates.
* The result of this annotation is shown in Figure~\ref{fig:annotation-example}.
* \begin{xml}[mathescape=false]
* <string name="label[10, 10]" value="Integrator: $integrator['type'],
* $film['width']x$film['height'], $sampler['sampleCount'] spp,
* render time: $scene['renderTime'], memory: $scene['memUsage']"/>
* \end{xml}
* \vspace{1cm}
* \renderings{
* \fbox{\includegraphics[width=.8\textwidth]{images/annotation_example}}\hfill\,
* \caption{\label{fig:annotation-example}A demonstration of the label annotation feature
* given the example string shown above.}
* }
* \vspace{2cm}
* \begin{table}[htb]
* \centering
* \begin{savenotes}
* \begin{tabular}{ll}
* \toprule
* \code{\$scene['renderTime']}& Image render time, use \code{renderTimePrecise} for more digits.\\
* \code{\$scene['memUsage']}& Mitsuba memory usage\footnote{The definition of this quantity unfortunately
* varies a bit from platform to platform. On Linux and Windows, it denotes the total
* amount of allocated RAM and disk-based memory that is private to the process (i.e. not
* shared or shareable), which most intuitively captures the amount of memory required for
* rendering. On OSX, it denotes the working set size---roughly speaking, this is the
* amount of RAM apportioned to the process (i.e. excluding disk-based memory).}.
* Use \code{memUsagePrecise} for more digits.\\
* \code{\$scene['coreCount']}& Number of local and remote cores working on the rendering job\\
* \code{\$scene['blockSize']}& Block size used to parallelize up the rendering workload\\
* \code{\$scene['sourceFile']}& Source file name\\
* \code{\$scene['destFile']}& Destination file name\\
* \code{\$integrator['..']}& Copy a named integrator parameter\\
* \code{\$sensor['..']}& Copy a named sensor parameter\\
* \code{\$sampler['..']}& Copy a named sampler parameter\\
* \code{\$film['..']}& Copy a named film parameter\\
* \bottomrule
* \end{tabular}
* \end{savenotes}
* \caption{\label{tbl:film-keywords}A list of all special
* keywords supported by the annotation feature}
* \end{table}
*
*/ */
class HDRFilm : public Film { class HDRFilm : public Film {
public: public:
HDRFilm(const Properties &props) : Film(props) { HDRFilm(const Properties &props) : Film(props) {

View File

@ -435,9 +435,17 @@ public:
return LiSurf * transmittance + LiMedium; return LiSurf * transmittance + LiMedium;
unsigned int bsdfType = bsdf->getType() & BSDF::EAll; unsigned int bsdfType = bsdf->getType() & BSDF::EAll;
bool isDiffuse = (bsdfType == BSDF::EDiffuseReflection);
if (isDiffuse || cacheQuery) { /* Irradiance cachq query -> trat as diffuse */
bool isDiffuse = (bsdfType == BSDF::EDiffuseReflection) || cacheQuery;
bool hasSpecular = bsdfType & BSDF::EDelta;
/* Exhaustively recurse into all specular lobes? */
bool exhaustiveSpecular = rRec.depth < m_maxSpecularDepth && !cacheQuery;
if (isDiffuse) {
/* 1. Diffuse indirect */
int maxDepth = m_maxDepth == -1 ? INT_MAX : (m_maxDepth-rRec.depth); int maxDepth = m_maxDepth == -1 ? INT_MAX : (m_maxDepth-rRec.depth);
if (rRec.type & RadianceQueryRecord::EIndirectSurfaceRadiance && m_globalPhotonMap.get()) if (rRec.type & RadianceQueryRecord::EIndirectSurfaceRadiance && m_globalPhotonMap.get())
LiSurf += m_globalPhotonMap->estimateIrradiance(its.p, LiSurf += m_globalPhotonMap->estimateIrradiance(its.p,
@ -449,53 +457,55 @@ public:
m_causticLookupSize) * bsdf->getDiffuseReflectance(its) * INV_PI; m_causticLookupSize) * bsdf->getDiffuseReflectance(its) * INV_PI;
} }
if ((bsdfType & BSDF::EDelta) && rRec.depth < m_maxSpecularDepth && !cacheQuery) { if (hasSpecular && exhaustiveSpecular
if (rRec.type & RadianceQueryRecord::EIndirectSurfaceRadiance) { && (rRec.type & RadianceQueryRecord::EIndirectSurfaceRadiance)) {
int compCount = bsdf->getComponentCount(); /* 1. Specular indirect */
RadianceQueryRecord rRec2; int compCount = bsdf->getComponentCount();
for (int i=0; i<compCount; i++) { RadianceQueryRecord rRec2;
unsigned int type = bsdf->getType(i); for (int i=0; i<compCount; i++) {
if (!(type & BSDF::EDelta)) unsigned int type = bsdf->getType(i);
continue; if (!(type & BSDF::EDelta))
/* Sample the BSDF and recurse */ continue;
BSDFSamplingRecord bRec(its, rRec.sampler, ERadiance); /* Sample the BSDF and recurse */
bRec.component = i; BSDFSamplingRecord bRec(its, rRec.sampler, ERadiance);
Spectrum bsdfVal = bsdf->sample(bRec, Point2(0.0f)); bRec.component = i;
if (bsdfVal.isZero()) Spectrum bsdfVal = bsdf->sample(bRec, Point2(0.5f));
continue; if (bsdfVal.isZero())
continue;
rRec2.recursiveQuery(rRec, RadianceQueryRecord::ERadiance); rRec2.recursiveQuery(rRec, RadianceQueryRecord::ERadiance);
RayDifferential bsdfRay(its.p, its.toWorld(bRec.wo), ray.time); RayDifferential bsdfRay(its.p, its.toWorld(bRec.wo), ray.time);
if (its.isMediumTransition()) if (its.isMediumTransition())
rRec2.medium = its.getTargetMedium(bsdfRay.d); rRec2.medium = its.getTargetMedium(bsdfRay.d);
LiSurf += bsdfVal * m_parentIntegrator->Li(bsdfRay, rRec2); LiSurf += bsdfVal * m_parentIntegrator->Li(bsdfRay, rRec2);
}
} }
} else if (rRec.type & RadianceQueryRecord::EDirectSurfaceRadiance) { }
/* Estimate the direct illumination if this is requested */
Point2 *sampleArray;
Point2 sample;
int numEmitterSamples = m_directSamples,
numBSDFSamples;
Float weightLum, weightBSDF; /* Estimate the direct illumination if this is requested */
int numEmitterSamples = m_directSamples, numBSDFSamples;
Float weightLum, weightBSDF;
Point2 *sampleArray;
Point2 sample;
if (rRec.depth > 1 || cacheQuery || adaptiveQuery) { if (rRec.depth > 1 || cacheQuery || adaptiveQuery) {
/* This integrator is used recursively by another integrator. /* This integrator is used recursively by another integrator.
Be less accurate as this sample will not directly be observed. */ Be less accurate as this sample will not directly be observed. */
numBSDFSamples = numEmitterSamples = 1; numBSDFSamples = numEmitterSamples = 1;
weightLum = weightBSDF = 1.0f; weightLum = weightBSDF = 1.0f;
} else {
if (isDiffuse) {
numBSDFSamples = m_directSamples;
weightBSDF = weightLum = m_invEmitterSamples;
} else { } else {
if (isDiffuse) { numBSDFSamples = m_glossySamples;
numBSDFSamples = m_directSamples; weightLum = m_invEmitterSamples;
weightBSDF = weightLum = m_invEmitterSamples; weightBSDF = m_invGlossySamples;
} else {
numBSDFSamples = m_glossySamples;
weightLum = m_invEmitterSamples;
weightBSDF = m_invGlossySamples;
}
} }
}
if ((bsdfType & BSDF::ESmooth) && (rRec.type & RadianceQueryRecord::EDirectSurfaceRadiance)) {
DirectSamplingRecord dRec(its);
if (numEmitterSamples > 1) { if (numEmitterSamples > 1) {
sampleArray = rRec.sampler->next2DArray(m_directSamples); sampleArray = rRec.sampler->next2DArray(m_directSamples);
@ -503,45 +513,62 @@ public:
sample = rRec.nextSample2D(); sampleArray = &sample; sample = rRec.nextSample2D(); sampleArray = &sample;
} }
DirectSamplingRecord dRec(its); for (int i=0; i<numEmitterSamples; ++i) {
if (bsdf->getType() & BSDF::ESmooth) { int interactions = m_maxDepth - rRec.depth - 1;
for (int i=0; i<numEmitterSamples; ++i) { Spectrum value = scene->sampleAttenuatedEmitterDirect(
int interactions = m_maxDepth - rRec.depth - 1; dRec, its, rRec.medium, interactions,
Spectrum value = scene->sampleAttenuatedEmitterDirect( sampleArray[i], rRec.sampler);
dRec, its, rRec.medium, interactions,
sampleArray[i], rRec.sampler);
/* Estimate the direct illumination if this is requested */ /* Estimate the direct illumination if this is requested */
if (!value.isZero()) { if (!value.isZero()) {
const Emitter *emitter = static_cast<const Emitter *>(dRec.object); const Emitter *emitter = static_cast<const Emitter *>(dRec.object);
/* Allocate a record for querying the BSDF */ /* Allocate a record for querying the BSDF */
BSDFSamplingRecord bRec(its, its.toLocal(dRec.d)); BSDFSamplingRecord bRec(its, its.toLocal(dRec.d));
/* Evaluate BSDF * cos(theta) */ /* Evaluate BSDF * cos(theta) */
const Spectrum bsdfVal = bsdf->eval(bRec); const Spectrum bsdfVal = bsdf->eval(bRec);
if (!bsdfVal.isZero()) { if (!bsdfVal.isZero()) {
/* Calculate prob. of having sampled that direction /* Calculate prob. of having sampled that direction
using BSDF sampling */ using BSDF sampling */
Float bsdfPdf = (emitter->isOnSurface()
&& dRec.measure == ESolidAngle
&& interactions == 0)
? bsdf->pdf(bRec) : (Float) 0.0f;
/* Weight using the power heuristic */ if (!hasSpecular || exhaustiveSpecular)
const Float weight = miWeight(dRec.pdf * numEmitterSamples, bRec.typeMask = BSDF::ESmooth;
bsdfPdf * numBSDFSamples) * weightLum;
LiSurf += value * bsdfVal * weight; Float bsdfPdf = (emitter->isOnSurface()
} && dRec.measure == ESolidAngle
&& interactions == 0)
? bsdf->pdf(bRec) : (Float) 0.0f;
/* Weight using the power heuristic */
const Float weight = miWeight(dRec.pdf * numEmitterSamples,
bsdfPdf * numBSDFSamples) * weightLum;
LiSurf += value * bsdfVal * weight;
} }
} }
} }
}
/* ==================================================================== */ /* ==================================================================== */
/* BSDF sampling */ /* BSDF sampling */
/* ==================================================================== */ /* ==================================================================== */
/* Sample direct compontent via BSDF sampling if this is generally requested AND
the BSDF is smooth, or there is a delta component that was not handled by the
exhaustive sampling loop above */
bool bsdfSampleDirect = (rRec.type & RadianceQueryRecord::EDirectSurfaceRadiance) &&
((bsdfType & BSDF::ESmooth) || (hasSpecular && !exhaustiveSpecular));
/* Sample indirect component via BSDF sampling if this is generally requested AND
the BSDF is non-diffuse (diffuse is handled by the global photon map)
or there is a delta component that was not handled by the exhaustive sampling loop
above. */
bool bsdfSampleIndirect = (rRec.type & RadianceQueryRecord::EIndirectSurfaceRadiance) &&
!isDiffuse && ((bsdfType & BSDF::ESmooth) || (hasSpecular && !exhaustiveSpecular));
if (bsdfSampleDirect || bsdfSampleIndirect) {
if (numBSDFSamples > 1) { if (numBSDFSamples > 1) {
sampleArray = rRec.sampler->next2DArray( sampleArray = rRec.sampler->next2DArray(
std::max(m_directSamples, m_glossySamples)); std::max(m_directSamples, m_glossySamples));
@ -552,9 +579,13 @@ public:
RadianceQueryRecord rRec2; RadianceQueryRecord rRec2;
Intersection &bsdfIts = rRec2.its; Intersection &bsdfIts = rRec2.its;
DirectSamplingRecord dRec;
for (int i=0; i<numBSDFSamples; ++i) { for (int i=0; i<numBSDFSamples; ++i) {
/* Sample BSDF * cos(theta) */ /* Sample BSDF * cos(theta) */
BSDFSamplingRecord bRec(its, rRec.sampler, ERadiance); BSDFSamplingRecord bRec(its, rRec.sampler, ERadiance);
if (!hasSpecular || exhaustiveSpecular)
bRec.typeMask = BSDF::ESmooth;
Float bsdfPdf; Float bsdfPdf;
Spectrum bsdfVal = bsdf->sample(bRec, bsdfPdf, sampleArray[i]); Spectrum bsdfVal = bsdf->sample(bRec, bsdfPdf, sampleArray[i]);
if (bsdfVal.isZero()) if (bsdfVal.isZero())
@ -567,12 +598,12 @@ public:
bool hitEmitter = false; bool hitEmitter = false;
if (scene->rayIntersect(bsdfRay, bsdfIts)) { if (scene->rayIntersect(bsdfRay, bsdfIts)) {
/* Intersected something - check if it was a luminaire */ /* Intersected something - check if it was a luminaire */
if (bsdfIts.isEmitter()) { if (bsdfIts.isEmitter() && bsdfSampleDirect) {
value = bsdfIts.Le(-bsdfRay.d); value = bsdfIts.Le(-bsdfRay.d);
dRec.setQuery(bsdfRay, bsdfIts); dRec.setQuery(bsdfRay, bsdfIts);
hitEmitter = true; hitEmitter = true;
} }
} else { } else if (bsdfSampleDirect) {
/* Intersected nothing -- perhaps there is an environment map? */ /* Intersected nothing -- perhaps there is an environment map? */
const Emitter *env = scene->getEnvironmentEmitter(); const Emitter *env = scene->getEnvironmentEmitter();
@ -584,8 +615,7 @@ public:
} }
if (hitEmitter) { if (hitEmitter) {
const Float emitterPdf = (!(bRec.sampledType & BSDF::EDelta)) ? const Float emitterPdf = scene->pdfEmitterDirect(dRec);
scene->pdfEmitterDirect(dRec) : 0;
Spectrum transmittance = rRec2.medium ? Spectrum transmittance = rRec2.medium ?
rRec2.medium->evalTransmittance(Ray(bsdfRay, 0, bsdfIts.t)) : Spectrum(1.0f); rRec2.medium->evalTransmittance(Ray(bsdfRay, 0, bsdfIts.t)) : Spectrum(1.0f);
@ -597,7 +627,7 @@ public:
} }
/* Recurse */ /* Recurse */
if (!isDiffuse && (rRec.type & RadianceQueryRecord::EIndirectSurfaceRadiance) && !cacheQuery) { if (bsdfSampleIndirect) {
rRec2.recursiveQuery(rRec, rRec2.recursiveQuery(rRec,
RadianceQueryRecord::ERadianceNoEmission); RadianceQueryRecord::ERadianceNoEmission);
rRec2.type ^= RadianceQueryRecord::EIntersection; rRec2.type ^= RadianceQueryRecord::EIntersection;
@ -608,35 +638,6 @@ public:
LiSurf += bsdfVal * m_parentIntegrator->Li(bsdfRay, rRec2) * weightBSDF; LiSurf += bsdfVal * m_parentIntegrator->Li(bsdfRay, rRec2) * weightBSDF;
} }
} }
} else if (!isDiffuse && (rRec.type & RadianceQueryRecord::EIndirectSurfaceRadiance) && !cacheQuery) {
int numBSDFSamples = (rRec.depth > 1 || adaptiveQuery) ? 1 : m_glossySamples;
Float weightBSDF;
Point2 *sampleArray;
Point2 sample;
if (numBSDFSamples > 1) {
sampleArray = rRec.sampler->next2DArray(
std::max(m_directSamples, m_glossySamples));
weightBSDF = m_invGlossySamples;
} else {
sample = rRec.nextSample2D(); sampleArray = &sample;
weightBSDF = 1.0f;
}
RadianceQueryRecord rRec2;
for (int i=0; i<numBSDFSamples; ++i) {
/* Sample BSDF * cos(theta) */
BSDFSamplingRecord bRec(its, rRec.sampler, ERadiance);
Float bsdfPdf;
Spectrum bsdfVal = bsdf->sample(bRec, bsdfPdf, sampleArray[i]);
if (bsdfVal.isZero())
continue;
rRec2.recursiveQuery(rRec,
RadianceQueryRecord::ERadianceNoEmission);
RayDifferential bsdfRay(its.p, its.toWorld(bRec.wo), ray.time);
LiSurf += bsdfVal * m_parentIntegrator->Li(bsdfRay, rRec2) * weightBSDF;
}
} }
return LiSurf * transmittance + LiMedium; return LiSurf * transmittance + LiMedium;

View File

@ -325,14 +325,7 @@ StreamBackend::StreamBackend(const std::string &thrName, Scheduler *scheduler,
m_memStream->setByteOrder(Stream::ENetworkByteOrder); m_memStream->setByteOrder(Stream::ENetworkByteOrder);
} }
StreamBackend::~StreamBackend() { StreamBackend::~StreamBackend() { }
if (m_stream->getClass()->derivesFrom(MTS_CLASS(SocketStream))) {
SocketStream *sstream = static_cast<SocketStream *>(m_stream.get());
Log(EInfo, "Closing connection to %s - received %i KB / sent %i KB",
sstream->getPeer().c_str(), (int) (sstream->getReceivedBytes() / 1024),
(int) (sstream->getSentBytes() / 1024));
}
}
void StreamBackend::run() { void StreamBackend::run() {
if (m_detach) if (m_detach)
@ -489,6 +482,13 @@ void StreamBackend::run() {
Log(EWarn, "Removing stray resource %i", (*it).first); Log(EWarn, "Removing stray resource %i", (*it).first);
m_scheduler->unregisterResource((*it).second); m_scheduler->unregisterResource((*it).second);
} }
if (m_stream->getClass()->derivesFrom(MTS_CLASS(SocketStream))) {
SocketStream *sstream = static_cast<SocketStream *>(m_stream.get());
Log(EInfo, "Closing connection to %s - received %i KB / sent %i KB",
sstream->getPeer().c_str(), (int) (sstream->getReceivedBytes() / 1024),
(int) (sstream->getSentBytes() / 1024));
}
} }
void StreamBackend::sendCancellation(int id, int numLost) { void StreamBackend::sendCancellation(int id, int numLost) {

View File

@ -123,19 +123,6 @@ std::string indent(const std::string &string, int amount) {
return oss.str(); return oss.str();
} }
std::string memString(size_t size) {
Float value = (Float) size;
const char *prefixes[] = {
"B", "KiB", "MiB", "GiB", "TiB", "PiB"
};
int prefix = 0;
while (prefix < 5 && value > 1024.0f) {
value /= 1024.0f; ++prefix;
}
return formatString(prefix == 0 ?
"%.0f %s" : "%.2f %s", value, prefixes[prefix]);
}
void * __restrict allocAligned(size_t size) { void * __restrict allocAligned(size_t size) {
#if defined(__WINDOWS__) #if defined(__WINDOWS__)
return _aligned_malloc(size, L1_CACHE_LINE_SIZE); return _aligned_malloc(size, L1_CACHE_LINE_SIZE);
@ -809,8 +796,6 @@ Float fresnelDiffuseReflectance(Float eta, bool fast) {
} }
std::string timeString(Float time, bool precise) { std::string timeString(Float time, bool precise) {
std::ostringstream os;
if (std::isnan(time) || std::isinf(time)) if (std::isnan(time) || std::isinf(time))
return "inf"; return "inf";
@ -825,12 +810,31 @@ std::string timeString(Float time, bool precise) {
} }
} }
std::ostringstream os;
os << std::setprecision(precise ? 4 : 1) os << std::setprecision(precise ? 4 : 1)
<< std::fixed << time << suffix; << std::fixed << time << suffix;
return os.str(); return os.str();
} }
std::string memString(size_t size, bool precise) {
Float value = (Float) size;
const char *suffixes[] = {
"B", "KiB", "MiB", "GiB", "TiB", "PiB"
};
int suffix = 0;
while (suffix < 5 && value > 1024.0f) {
value /= 1024.0f; ++suffix;
}
std::ostringstream os;
os << std::setprecision(suffix == 0 ? 0 : (precise ? 4 : 1))
<< std::fixed << value << suffixes[suffix];
return os.str();
}
Float hypot2(Float a, Float b) { Float hypot2(Float a, Float b) {
Float r; Float r;
if (std::abs(a) > std::abs(b)) { if (std::abs(a) > std::abs(b)) {

View File

@ -274,7 +274,7 @@ void SceneHandler::startElement(const XMLCh* const xmlName,
m_context.push(context); m_context.push(context);
} }
void SceneHandler::pushCleanupHandler(void (*cleanup)()) { void pushSceneCleanupHandler(void (*cleanup)()) {
__cleanup_tls.get().insert(cleanup); __cleanup_tls.get().insert(cleanup);
} }

View File

@ -161,8 +161,12 @@ static void lookupMaterial(const Properties &props, Spectrum &sigmaS, Spectrum &
sigmaA = sigmaT - sigmaS; sigmaA = sigmaT - sigmaS;
} }
if (props.hasProperty("g")) if (props.hasProperty("g")) {
g = Spectrum(props.getFloat("g")); if (props.getType("g") == Properties::ESpectrum)
g = props.getSpectrum("g");
else
g = Spectrum(props.getFloat("g"));
}
if (g.min() <= -1 || g.max() >= 1) if (g.min() <= -1 || g.max() >= 1)
SLog(EError, "The anisotropy parameter 'g' must be in the range (-1, 1)!"); SLog(EError, "The anisotropy parameter 'g' must be in the range (-1, 1)!");

View File

@ -72,9 +72,6 @@ if hasQt:
else: else:
qtSources = [x for x in qtSources if (not isinstance(x, str) or 'cocoa' not in x)] qtSources = [x for x in qtSources if (not isinstance(x, str) or 'cocoa' not in x)]
if sys.platform == 'win32':
qtSources += qtEnv.StaticObject('qtmain_win.cpp')
mtsgui = qtEnv.Program('mtsgui', qtSources) mtsgui = qtEnv.Program('mtsgui', qtSources)
if sys.platform == 'darwin': if sys.platform == 'darwin':
qtEnv.AddPostAction(mtsgui, 'install_name_tool -change QtGui.framework/Versions/4/QtGui @rpath/QtGui $TARGET') qtEnv.AddPostAction(mtsgui, 'install_name_tool -change QtGui.framework/Versions/4/QtGui @rpath/QtGui $TARGET')

View File

@ -82,6 +82,7 @@ AboutDialog::AboutDialog(QWidget *parent) :
SPECTRUM_SAMPLES).c_str(); SPECTRUM_SAMPLES).c_str();
ui->label->setText(ui->label->text().replace("MTS_VERSION", MTS_VERSION)); ui->label->setText(ui->label->text().replace("MTS_VERSION", MTS_VERSION));
ui->label->setText(ui->label->text().replace("MTS_YEAR", MTS_YEAR));
ui->label->setText(ui->label->text().replace("CONFIG_FLAGS", configFlags)); ui->label->setText(ui->label->text().replace("CONFIG_FLAGS", configFlags));
#if defined(__OSX__) #if defined(__OSX__)

View File

@ -81,7 +81,7 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;About Mitsuba&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;About Mitsuba&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Version MTS_VERSION&lt;br /&gt;Configuration flags: &lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;CONFIG_FLAGS&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Version MTS_VERSION&lt;br /&gt;Configuration flags: &lt;span style=&quot; font-family:'Courier New,courier';&quot;&gt;CONFIG_FLAGS&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Mitsuba is an extensible rendering framework written in portable C++. It implements unbiased as well as biased techniques and contains heavy optimizations targeted towards current CPU architectures.&lt;/p&gt; &lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Mitsuba is an extensible rendering framework written in portable C++. It implements unbiased as well as biased techniques and contains heavy optimizations targeted towards current CPU architectures.&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Copyright © 2012 Wenzel Jakob &amp;lt;&lt;a href=&quot;mailto:wenzel@cs.cornell.edu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;wenzel@cs.cornell.edu&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt; &lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Copyright © MTS_YEAR Wenzel Jakob &amp;lt;&lt;a href=&quot;mailto:wenzel@cs.cornell.edu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;wenzel@cs.cornell.edu&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Licensed under the &lt;a href=&quot;http://www.gnu.org/licenses/gpl-3.0.html&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;GNU GPL, Version 3&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> &lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Licensed under the &lt;a href=&quot;http://www.gnu.org/licenses/gpl-3.0.html&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;GNU GPL, Version 3&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="textFormat"> <property name="textFormat">

View File

@ -85,11 +85,12 @@ int main(int argc, char **argv) {
install(argv[1], "mtsimport"); install(argv[1], "mtsimport");
installPython(argv[1], "2.6"); installPython(argv[1], "2.6");
installPython(argv[1], "2.7"); installPython(argv[1], "2.7");
struct passwd *pw = getpwuid(atoi(argv[2]));
appendShellConfig(pw->pw_dir, ".bashrc", "\nexport LD_LIBRARY_PATH=%s/Contents/Frameworks:$LD_LIBRARY_PATH\n", argv[1]); /// this is not required anymore as of Mitsuba 0.4.3
appendShellConfig(pw->pw_dir, ".zshrc", "\nexport LD_LIBRARY_PATH=%s/Contents/Frameworks:$LD_LIBRARY_PATH\n", argv[1]); //struct passwd *pw = getpwuid(atoi(argv[2]));
appendShellConfig(pw->pw_dir, ".cshrc", "\nsetenv LD_LIBRARY_PATH %s/Contents/Frameworks:${LD_LIBRARY_PATH}\n", argv[1]); //appendShellConfig(pw->pw_dir, ".bashrc", "\nexport LD_LIBRARY_PATH=%s/Contents/Frameworks:$LD_LIBRARY_PATH\n", argv[1]);
//appendShellConfig(pw->pw_dir, ".zshrc", "\nexport LD_LIBRARY_PATH=%s/Contents/Frameworks:$LD_LIBRARY_PATH\n", argv[1]);
//appendShellConfig(pw->pw_dir, ".cshrc", "\nsetenv LD_LIBRARY_PATH %s/Contents/Frameworks:${LD_LIBRARY_PATH}\n", argv[1]);
return 0; return 0;
} }

View File

@ -15,6 +15,7 @@ add_shape(rectangle rectangle.cpp)
add_shape(disk disk.cpp) add_shape(disk disk.cpp)
add_shape(sphere sphere.cpp) add_shape(sphere sphere.cpp)
add_shape(cylinder cylinder.cpp) add_shape(cylinder cylinder.cpp)
add_shape(cube cube.cpp)
add_shape(hair hair.h hair.cpp) add_shape(hair hair.h hair.cpp)
add_shape(shapegroup shapegroup.h shapegroup.cpp) add_shape(shapegroup shapegroup.h shapegroup.cpp)
add_shape(instance instance.h instance.cpp) add_shape(instance instance.h instance.cpp)

View File

@ -11,6 +11,7 @@ plugins += env.SharedLibrary('cylinder', ['cylinder.cpp'])
plugins += env.SharedLibrary('hair', ['hair.cpp']) plugins += env.SharedLibrary('hair', ['hair.cpp'])
plugins += env.SharedLibrary('shapegroup', ['shapegroup.cpp']) plugins += env.SharedLibrary('shapegroup', ['shapegroup.cpp'])
plugins += env.SharedLibrary('instance', ['instance.cpp']) plugins += env.SharedLibrary('instance', ['instance.cpp'])
plugins += env.SharedLibrary('cube', ['cube.cpp'])
#plugins += env.SharedLibrary('deformable', ['deformable.cpp']) #plugins += env.SharedLibrary('deformable', ['deformable.cpp'])
Export('plugins') Export('plugins')

115
src/shapes/cube.cpp Normal file
View File

@ -0,0 +1,115 @@
/*
This file is part of Mitsuba, a physically based rendering system.
Copyright (c) 2007-2012 by Wenzel Jakob and others.
Mitsuba is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License Version 3
as published by the Free Software Foundation.
Mitsuba is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <mitsuba/render/trimesh.h>
#include <mitsuba/core/properties.h>
MTS_NAMESPACE_BEGIN
static Float CubeData_vertexPositions[][3] = {{1, 0, 0}, {1, 0, 1}, {0, 0, 1}, {0, 0, 0}, {1, 1, 0}, {0, 1, 0}, {0, 1, 1}, {1, 1, 1}, {1, 0, 0}, {1, 1, 0}, {1, 1, 1}, {1, 0, 1}, {1, 0, 1}, {1, 1, 1}, {0, 1, 1}, {0, 0, 1}, {0, 0, 1}, {0, 1, 1}, {0, 1, 0}, {0, 0, 0}, {1, 1, 0}, {1, 0, 0}, {0, 0, 0}, {0, 1, 0}};
static Float CubeData_vertexNormals[][3] = {{0, -1, 0}, {0, -1, 0}, {0, -1, 0}, {0, -1, 0}, {0, 1, 0}, {0, 1, 0}, {0, 1, 0}, {0, 1, 0}, {1, 0, 0}, {1, 0, 0}, {1, 0, 0}, {1, 0, 0}, {0, 0, 1}, {0, 0, 1}, {0, 0, 1}, {0, 0, 1}, {-1, 0, 0}, {-1, 0, 0}, {-1, 0, 0}, {-1, 0, 0}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}};
static Float CubeData_texcoords[][2] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}};
static uint32_t CubeData_triangles[][3] = {{0, 1, 2}, {3, 0, 2}, {4, 5, 6}, {7, 4, 6}, {8, 9, 10}, {11, 8, 10}, {12, 13, 14}, {15, 12, 14}, {16, 17, 18}, {19, 16, 18}, {20, 21, 22}, {23, 20, 22}};
/*!\plugin{cube}{Cube intersection primitive}
* \order{0}
* \parameters{
* \parameter{toWorld}{\Transform\Or\Animation}{
* Specifies an optional linear object-to-world transformation.
* \default{none (i.e. object space $=$ world space)}
* }
* \parameter{flipNormals}{\Boolean}{
* Is the cube inverted, i.e. should the normal vectors
* be flipped? \default{\code{false}, i.e. the normals point outside}
* }
* }
*
* \renderings{
* \rendering{Basic example, see \lstref{cube-basic}}
* {shape_cube_basic}
* \rendering{A textured and stretched cube with the default parameterization
* (Listing~\ref{lst:cube-example})}
* {shape_cube_parameterization}
* }
*
* This shape plugin describes a simple cube/cuboid intersection primitive. By
* default, it creates a cube between the world-space positions $(0, 0, 0)$ and $(1,1,1)$.
* However, an arbitrary linear transformation may be specified to translate, rotate, scale
* or skew it as desired. The parameterization of this shape maps every face onto the
* rectangle $[0,1]^2$ in $uv$ space.
* \vspace{5mm}
* \begin{xml}[caption={Example of a textured and stretched cube}, label=lst:cube-example]
* <shape type="cube">
* <transform name="toWorld">
* <scale z="2"/>
* </transform>
*
* <bsdf type="diffuse">
* <texture type="checkerboard" name="reflectance">
* <float name="uvscale" value="6"/>
* </texture>
* </bsdf>
* </shape>
* \end{xml}
*/
class Cube : public TriMesh {
public:
Cube(const Properties &props) : TriMesh(props) {
m_name = props.getID();
m_triangleCount = 12;
m_vertexCount = 24;
m_positions = new Point[m_vertexCount];
m_texcoords = new Point2[m_vertexCount];
m_normals = new Normal[m_vertexCount];
m_triangles = new Triangle[m_triangleCount];
Transform toWorld = props.getTransform("toWorld", Transform());
for (uint32_t i=0; i<m_vertexCount; ++i) {
Normal n;
Point p;
Point2 uv;
for (int j=0; j<3; ++j) {
p[j] = CubeData_vertexPositions[i][j];
n[j] = CubeData_vertexNormals[i][j];
}
for (int j=0; j<2; ++j)
uv[j] = CubeData_texcoords[i][j];
m_positions[i] = toWorld(p);
m_normals[i] = normalize(toWorld(n));
m_texcoords[i] = uv;
}
for (uint32_t i=0; i<m_triangleCount; ++i)
for (int j=0; j<3; ++j)
m_triangles[i].idx[j] = CubeData_triangles[i][j];
}
Cube(Stream *stream, InstanceManager *manager)
: TriMesh(stream, manager) { }
MTS_DECLARE_CLASS()
};
MTS_IMPLEMENT_CLASS_S(Cube, false, TriMesh)
MTS_EXPORT_PLUGIN(Cube, "Cube intersection primitive");
MTS_NAMESPACE_END

View File

@ -37,7 +37,7 @@ MTS_NAMESPACE_BEGIN
* A visualization of a fractal surface by Irving and Segerman. * A visualization of a fractal surface by Irving and Segerman.
* (a 2D Gospel curve developed up to level 5 along the third * (a 2D Gospel curve developed up to level 5 along the third
* dimension). This scene makes use of instancing to replicate * dimension). This scene makes use of instancing to replicate
* similar structures to cheaply render a structure that effectively * similar structures to cheaply render a shape that effectively
* consists of several hundred millions of triangles. * consists of several hundred millions of triangles.
* } * }
* } * }

View File

@ -57,7 +57,6 @@ MTS_NAMESPACE_BEGIN
* } * }
* \parameter{toWorld}{\Transform\Or\Animation}{ * \parameter{toWorld}{\Transform\Or\Animation}{
* Specifies an optional linear object-to-world transformation. * Specifies an optional linear object-to-world transformation.
* Note that non-uniform scales are not permitted!
* \default{none (i.e. object space $=$ world space)} * \default{none (i.e. object space $=$ world space)}
* } * }
* } * }

View File

@ -64,7 +64,6 @@ MTS_NAMESPACE_BEGIN
* } * }
* \parameter{toWorld}{\Transform\Or\Animation}{ * \parameter{toWorld}{\Transform\Or\Animation}{
* Specifies an optional linear object-to-world transformation. * Specifies an optional linear object-to-world transformation.
* Note that non-uniform scales are not permitted!
* \default{none (i.e. object space $=$ world space)} * \default{none (i.e. object space $=$ world space)}
* } * }
* \parameter{srgb}{\Boolean}{ * \parameter{srgb}{\Boolean}{
@ -230,7 +229,7 @@ public:
m_aabb.expandBy(p); m_aabb.expandBy(p);
m_positions[m_vertexCtr] = p; m_positions[m_vertexCtr] = p;
if (m_normals) if (m_normals)
m_normals[m_vertexCtr] = m_objectToWorld(m_normal); m_normals[m_vertexCtr] = normalize(m_objectToWorld(m_normal));
if (m_texcoords) if (m_texcoords)
m_texcoords[m_vertexCtr] = m_uv; m_texcoords[m_vertexCtr] = m_uv;
if (m_colors) { if (m_colors) {

View File

@ -17,7 +17,6 @@
*/ */
#include <mitsuba/render/trimesh.h> #include <mitsuba/render/trimesh.h>
#include <mitsuba/render/scenehandler.h>
#include <mitsuba/core/properties.h> #include <mitsuba/core/properties.h>
#include <mitsuba/core/fstream.h> #include <mitsuba/core/fstream.h>
#include <mitsuba/core/fresolver.h> #include <mitsuba/core/fresolver.h>
@ -31,6 +30,9 @@
MTS_NAMESPACE_BEGIN MTS_NAMESPACE_BEGIN
/* Avoid having to include scenehandler.h */
extern MTS_EXPORT_RENDER void pushSceneCleanupHandler(void (*cleanup)());
/*!\plugin{serialized}{Serialized mesh loader} /*!\plugin{serialized}{Serialized mesh loader}
* \order{7} * \order{7}
* \parameters{ * \parameters{
@ -57,7 +59,6 @@ MTS_NAMESPACE_BEGIN
* } * }
* \parameter{toWorld}{\Transform\Or\Animation}{ * \parameter{toWorld}{\Transform\Or\Animation}{
* Specifies an optional linear object-to-world transformation. * Specifies an optional linear object-to-world transformation.
* Note that non-uniform scales are not permitted!
* \default{none (i.e. object space $=$ world space)} * \default{none (i.e. object space $=$ world space)}
* } * }
* } * }
@ -185,7 +186,7 @@ public:
} }
if (m_normals) { if (m_normals) {
for (size_t i=0; i<m_vertexCount; ++i) for (size_t i=0; i<m_vertexCount; ++i)
m_normals[i] = objectToWorld(m_normals[i]); m_normals[i] = normalize(objectToWorld(m_normals[i]));
} }
} }
@ -252,16 +253,23 @@ private:
ref<FileStream> m_fstream; ref<FileStream> m_fstream;
}; };
struct FileStreamCache : LRUCache<fs::path, std::less<fs::path>, typedef LRUCache<fs::path, std::less<fs::path>,
boost::shared_ptr<MeshLoader> > { boost::shared_ptr<MeshLoader> > MeshLoaderCache;
class FileStreamCache : MeshLoaderCache {
public:
inline boost::shared_ptr<MeshLoader> get(const fs::path& path) { inline boost::shared_ptr<MeshLoader> get(const fs::path& path) {
bool dummy; bool dummy;
return LRUCache::get(path, dummy); return MeshLoaderCache::get(path, dummy);
} }
FileStreamCache() : LRUCache(MTS_SERIALIZED_CACHE_SIZE, FileStreamCache() : MeshLoaderCache(MTS_SERIALIZED_CACHE_SIZE,
&boost::make_shared<MeshLoader, const fs::path&>) {} &FileStreamCache::create) { }
private:
inline static boost::shared_ptr<MeshLoader> create(const fs::path &path) {
return boost::make_shared<MeshLoader>(path);
}
}; };
/// Release all currently held offset caches / file streams /// Release all currently held offset caches / file streams
@ -281,7 +289,7 @@ private:
if (EXPECT_NOT_TAKEN(cache == NULL)) { if (EXPECT_NOT_TAKEN(cache == NULL)) {
cache = new FileStreamCache(); cache = new FileStreamCache();
m_cache.set(cache); m_cache.set(cache);
SceneHandler::pushCleanupHandler(&SerializedMesh::flushCache); mitsuba::pushSceneCleanupHandler(&SerializedMesh::flushCache);
} }
boost::shared_ptr<MeshLoader> meshLoader = cache->get(filePath); boost::shared_ptr<MeshLoader> meshLoader = cache->get(filePath);