joonsrenderer 1.1-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +53 -0
  3. data/.mvn/extensions.xml +8 -0
  4. data/CHANGELOG.md +2 -0
  5. data/Gemfile +6 -0
  6. data/LICENSE +674 -0
  7. data/README.md +2 -0
  8. data/Rakefile +43 -0
  9. data/docs/.gitignore +6 -0
  10. data/docs/_config.yml +20 -0
  11. data/docs/_includes/footer.html +38 -0
  12. data/docs/_includes/head.html +15 -0
  13. data/docs/_includes/header.html +27 -0
  14. data/docs/_includes/icon-github.html +1 -0
  15. data/docs/_includes/icon-github.svg +1 -0
  16. data/docs/_includes/icon-twitter.html +1 -0
  17. data/docs/_includes/icon-twitter.svg +1 -0
  18. data/docs/_layouts/default.html +20 -0
  19. data/docs/_layouts/page.html +14 -0
  20. data/docs/_layouts/post.html +15 -0
  21. data/docs/_posts/2017-01-08-animated_ray_tracing.md +72 -0
  22. data/docs/_posts/2017-01-08-welcome.md +78 -0
  23. data/docs/_sass/_base.scss +206 -0
  24. data/docs/_sass/_layout.scss +242 -0
  25. data/docs/_sass/_syntax-highlighting.scss +71 -0
  26. data/docs/about.md +12 -0
  27. data/docs/assets/Animation.ogv +0 -0
  28. data/docs/assets/Animation.png +0 -0
  29. data/docs/assets/basic.png +0 -0
  30. data/docs/assets/basic_traced.png +0 -0
  31. data/docs/css/main.scss +38 -0
  32. data/docs/favicon.ico +0 -0
  33. data/docs/feed.xml +30 -0
  34. data/docs/index.html +38 -0
  35. data/joonsrenderer.gemspec +23 -0
  36. data/lib/joonsrenderer.rb +12 -0
  37. data/lib/joonsrenderer/version.rb +3 -0
  38. data/pom.rb +75 -0
  39. data/pom.xml +163 -0
  40. data/src/main/java/SunflowGUI.java +1354 -0
  41. data/src/main/java/joons/JRFiller.java +79 -0
  42. data/src/main/java/joons/JRImagePanel.java +141 -0
  43. data/src/main/java/joons/JRRecorder.java +183 -0
  44. data/src/main/java/joons/JRStatics.java +199 -0
  45. data/src/main/java/joons/JoonsRenderer.java +837 -0
  46. data/src/main/java/org/sunflow/AsciiFileSunflowAPI.java +98 -0
  47. data/src/main/java/org/sunflow/Benchmark.java +313 -0
  48. data/src/main/java/org/sunflow/BinaryFileSunflowAPI.java +228 -0
  49. data/src/main/java/org/sunflow/FileSunflowAPI.java +354 -0
  50. data/src/main/java/org/sunflow/PluginRegistry.java +322 -0
  51. data/src/main/java/org/sunflow/RealtimeBenchmark.java +125 -0
  52. data/src/main/java/org/sunflow/RenderObjectMap.java +344 -0
  53. data/src/main/java/org/sunflow/SunflowAPI.java +762 -0
  54. data/src/main/java/org/sunflow/SunflowAPIInterface.java +277 -0
  55. data/src/main/java/org/sunflow/core/AccelerationStructure.java +20 -0
  56. data/src/main/java/org/sunflow/core/AccelerationStructureFactory.java +36 -0
  57. data/src/main/java/org/sunflow/core/BucketOrder.java +21 -0
  58. data/src/main/java/org/sunflow/core/Camera.java +125 -0
  59. data/src/main/java/org/sunflow/core/CameraLens.java +29 -0
  60. data/src/main/java/org/sunflow/core/CausticPhotonMapInterface.java +15 -0
  61. data/src/main/java/org/sunflow/core/Display.java +78 -0
  62. data/src/main/java/org/sunflow/core/Filter.java +27 -0
  63. data/src/main/java/org/sunflow/core/GIEngine.java +42 -0
  64. data/src/main/java/org/sunflow/core/Geometry.java +157 -0
  65. data/src/main/java/org/sunflow/core/GlobalPhotonMapInterface.java +21 -0
  66. data/src/main/java/org/sunflow/core/ImageSampler.java +26 -0
  67. data/src/main/java/org/sunflow/core/Instance.java +224 -0
  68. data/src/main/java/org/sunflow/core/InstanceList.java +83 -0
  69. data/src/main/java/org/sunflow/core/IntersectionState.java +120 -0
  70. data/src/main/java/org/sunflow/core/LightSample.java +104 -0
  71. data/src/main/java/org/sunflow/core/LightServer.java +382 -0
  72. data/src/main/java/org/sunflow/core/LightSource.java +67 -0
  73. data/src/main/java/org/sunflow/core/Modifier.java +16 -0
  74. data/src/main/java/org/sunflow/core/Options.java +20 -0
  75. data/src/main/java/org/sunflow/core/ParameterList.java +758 -0
  76. data/src/main/java/org/sunflow/core/PhotonStore.java +62 -0
  77. data/src/main/java/org/sunflow/core/PrimitiveList.java +70 -0
  78. data/src/main/java/org/sunflow/core/Ray.java +219 -0
  79. data/src/main/java/org/sunflow/core/RenderObject.java +25 -0
  80. data/src/main/java/org/sunflow/core/Scene.java +377 -0
  81. data/src/main/java/org/sunflow/core/SceneParser.java +58 -0
  82. data/src/main/java/org/sunflow/core/Shader.java +30 -0
  83. data/src/main/java/org/sunflow/core/ShadingCache.java +84 -0
  84. data/src/main/java/org/sunflow/core/ShadingState.java +939 -0
  85. data/src/main/java/org/sunflow/core/Statistics.java +85 -0
  86. data/src/main/java/org/sunflow/core/Tesselatable.java +36 -0
  87. data/src/main/java/org/sunflow/core/Texture.java +128 -0
  88. data/src/main/java/org/sunflow/core/TextureCache.java +48 -0
  89. data/src/main/java/org/sunflow/core/accel/BoundingIntervalHierarchy.java +652 -0
  90. data/src/main/java/org/sunflow/core/accel/KDTree.java +833 -0
  91. data/src/main/java/org/sunflow/core/accel/NullAccelerator.java +30 -0
  92. data/src/main/java/org/sunflow/core/accel/UniformGrid.java +329 -0
  93. data/src/main/java/org/sunflow/core/bucket/BucketOrderFactory.java +26 -0
  94. data/src/main/java/org/sunflow/core/bucket/ColumnBucketOrder.java +21 -0
  95. data/src/main/java/org/sunflow/core/bucket/DiagonalBucketOrder.java +28 -0
  96. data/src/main/java/org/sunflow/core/bucket/HilbertBucketOrder.java +65 -0
  97. data/src/main/java/org/sunflow/core/bucket/InvertedBucketOrder.java +28 -0
  98. data/src/main/java/org/sunflow/core/bucket/RandomBucketOrder.java +49 -0
  99. data/src/main/java/org/sunflow/core/bucket/RowBucketOrder.java +21 -0
  100. data/src/main/java/org/sunflow/core/bucket/SpiralBucketOrder.java +43 -0
  101. data/src/main/java/org/sunflow/core/camera/FisheyeLens.java +25 -0
  102. data/src/main/java/org/sunflow/core/camera/PinholeLens.java +43 -0
  103. data/src/main/java/org/sunflow/core/camera/SphericalLens.java +22 -0
  104. data/src/main/java/org/sunflow/core/camera/ThinLens.java +107 -0
  105. data/src/main/java/org/sunflow/core/display/FastDisplay.java +119 -0
  106. data/src/main/java/org/sunflow/core/display/FileDisplay.java +83 -0
  107. data/src/main/java/org/sunflow/core/display/FrameDisplay.java +97 -0
  108. data/src/main/java/org/sunflow/core/display/ImgPipeDisplay.java +109 -0
  109. data/src/main/java/org/sunflow/core/filter/BlackmanHarrisFilter.java +28 -0
  110. data/src/main/java/org/sunflow/core/filter/BoxFilter.java +16 -0
  111. data/src/main/java/org/sunflow/core/filter/CatmullRomFilter.java +29 -0
  112. data/src/main/java/org/sunflow/core/filter/CubicBSpline.java +32 -0
  113. data/src/main/java/org/sunflow/core/filter/GaussianFilter.java +24 -0
  114. data/src/main/java/org/sunflow/core/filter/LanczosFilter.java +30 -0
  115. data/src/main/java/org/sunflow/core/filter/MitchellFilter.java +28 -0
  116. data/src/main/java/org/sunflow/core/filter/SincFilter.java +25 -0
  117. data/src/main/java/org/sunflow/core/filter/TriangleFilter.java +16 -0
  118. data/src/main/java/org/sunflow/core/gi/AmbientOcclusionGIEngine.java +57 -0
  119. data/src/main/java/org/sunflow/core/gi/FakeGIEngine.java +48 -0
  120. data/src/main/java/org/sunflow/core/gi/InstantGI.java +194 -0
  121. data/src/main/java/org/sunflow/core/gi/IrradianceCacheGIEngine.java +268 -0
  122. data/src/main/java/org/sunflow/core/gi/PathTracingGIEngine.java +65 -0
  123. data/src/main/java/org/sunflow/core/light/DirectionalSpotlight.java +103 -0
  124. data/src/main/java/org/sunflow/core/light/ImageBasedLight.java +303 -0
  125. data/src/main/java/org/sunflow/core/light/PointLight.java +72 -0
  126. data/src/main/java/org/sunflow/core/light/SphereLight.java +166 -0
  127. data/src/main/java/org/sunflow/core/light/SunSkyLight.java +362 -0
  128. data/src/main/java/org/sunflow/core/light/TriangleMeshLight.java +296 -0
  129. data/src/main/java/org/sunflow/core/modifiers/BumpMappingModifier.java +37 -0
  130. data/src/main/java/org/sunflow/core/modifiers/NormalMapModifier.java +34 -0
  131. data/src/main/java/org/sunflow/core/modifiers/PerlinModifier.java +80 -0
  132. data/src/main/java/org/sunflow/core/parser/Keyword.java +39 -0
  133. data/src/main/java/org/sunflow/core/parser/RA2Parser.java +107 -0
  134. data/src/main/java/org/sunflow/core/parser/RA3Parser.java +68 -0
  135. data/src/main/java/org/sunflow/core/parser/SCAbstractParser.java +299 -0
  136. data/src/main/java/org/sunflow/core/parser/SCAsciiParser.java +251 -0
  137. data/src/main/java/org/sunflow/core/parser/SCBinaryParser.java +156 -0
  138. data/src/main/java/org/sunflow/core/parser/SCParser.java +1403 -0
  139. data/src/main/java/org/sunflow/core/parser/ShaveRibParser.java +174 -0
  140. data/src/main/java/org/sunflow/core/parser/TriParser.java +79 -0
  141. data/src/main/java/org/sunflow/core/photonmap/CausticPhotonMap.java +429 -0
  142. data/src/main/java/org/sunflow/core/photonmap/GlobalPhotonMap.java +530 -0
  143. data/src/main/java/org/sunflow/core/photonmap/GridPhotonMap.java +308 -0
  144. data/src/main/java/org/sunflow/core/primitive/Background.java +55 -0
  145. data/src/main/java/org/sunflow/core/primitive/BanchoffSurface.java +100 -0
  146. data/src/main/java/org/sunflow/core/primitive/Box.java +210 -0
  147. data/src/main/java/org/sunflow/core/primitive/CornellBox.java +476 -0
  148. data/src/main/java/org/sunflow/core/primitive/CubeGrid.java +318 -0
  149. data/src/main/java/org/sunflow/core/primitive/Cylinder.java +104 -0
  150. data/src/main/java/org/sunflow/core/primitive/Hair.java +275 -0
  151. data/src/main/java/org/sunflow/core/primitive/JuliaFractal.java +266 -0
  152. data/src/main/java/org/sunflow/core/primitive/ParticleSurface.java +114 -0
  153. data/src/main/java/org/sunflow/core/primitive/Plane.java +163 -0
  154. data/src/main/java/org/sunflow/core/primitive/QuadMesh.java +413 -0
  155. data/src/main/java/org/sunflow/core/primitive/Sphere.java +101 -0
  156. data/src/main/java/org/sunflow/core/primitive/SphereFlake.java +234 -0
  157. data/src/main/java/org/sunflow/core/primitive/Torus.java +145 -0
  158. data/src/main/java/org/sunflow/core/primitive/TriangleMesh.java +849 -0
  159. data/src/main/java/org/sunflow/core/renderer/BucketRenderer.java +491 -0
  160. data/src/main/java/org/sunflow/core/renderer/MultipassRenderer.java +237 -0
  161. data/src/main/java/org/sunflow/core/renderer/ProgressiveRenderer.java +171 -0
  162. data/src/main/java/org/sunflow/core/renderer/SimpleRenderer.java +106 -0
  163. data/src/main/java/org/sunflow/core/shader/AmbientOcclusionShader.java +53 -0
  164. data/src/main/java/org/sunflow/core/shader/AnisotropicWardShader.java +216 -0
  165. data/src/main/java/org/sunflow/core/shader/ConstantShader.java +31 -0
  166. data/src/main/java/org/sunflow/core/shader/DiffuseShader.java +65 -0
  167. data/src/main/java/org/sunflow/core/shader/GlassShader.java +147 -0
  168. data/src/main/java/org/sunflow/core/shader/IDShader.java +27 -0
  169. data/src/main/java/org/sunflow/core/shader/MirrorShader.java +68 -0
  170. data/src/main/java/org/sunflow/core/shader/NormalShader.java +32 -0
  171. data/src/main/java/org/sunflow/core/shader/PhongShader.java +89 -0
  172. data/src/main/java/org/sunflow/core/shader/PrimIDShader.java +30 -0
  173. data/src/main/java/org/sunflow/core/shader/QuickGrayShader.java +63 -0
  174. data/src/main/java/org/sunflow/core/shader/ShinyDiffuseShader.java +98 -0
  175. data/src/main/java/org/sunflow/core/shader/SimpleShader.java +24 -0
  176. data/src/main/java/org/sunflow/core/shader/TexturedAmbientOcclusionShader.java +31 -0
  177. data/src/main/java/org/sunflow/core/shader/TexturedDiffuseShader.java +31 -0
  178. data/src/main/java/org/sunflow/core/shader/TexturedPhongShader.java +31 -0
  179. data/src/main/java/org/sunflow/core/shader/TexturedShinyDiffuseShader.java +31 -0
  180. data/src/main/java/org/sunflow/core/shader/TexturedWardShader.java +31 -0
  181. data/src/main/java/org/sunflow/core/shader/UVShader.java +27 -0
  182. data/src/main/java/org/sunflow/core/shader/UberShader.java +149 -0
  183. data/src/main/java/org/sunflow/core/shader/ViewCausticsShader.java +33 -0
  184. data/src/main/java/org/sunflow/core/shader/ViewGlobalPhotonsShader.java +25 -0
  185. data/src/main/java/org/sunflow/core/shader/ViewIrradianceShader.java +25 -0
  186. data/src/main/java/org/sunflow/core/shader/WireframeShader.java +83 -0
  187. data/src/main/java/org/sunflow/core/tesselatable/BezierMesh.java +254 -0
  188. data/src/main/java/org/sunflow/core/tesselatable/FileMesh.java +251 -0
  189. data/src/main/java/org/sunflow/core/tesselatable/Gumbo.java +1147 -0
  190. data/src/main/java/org/sunflow/core/tesselatable/Teapot.java +237 -0
  191. data/src/main/java/org/sunflow/image/Bitmap.java +15 -0
  192. data/src/main/java/org/sunflow/image/BitmapReader.java +39 -0
  193. data/src/main/java/org/sunflow/image/BitmapWriter.java +79 -0
  194. data/src/main/java/org/sunflow/image/BlackbodySpectrum.java +16 -0
  195. data/src/main/java/org/sunflow/image/ChromaticitySpectrum.java +55 -0
  196. data/src/main/java/org/sunflow/image/Color.java +374 -0
  197. data/src/main/java/org/sunflow/image/ColorEncoder.java +94 -0
  198. data/src/main/java/org/sunflow/image/ColorFactory.java +122 -0
  199. data/src/main/java/org/sunflow/image/ConstantSpectralCurve.java +21 -0
  200. data/src/main/java/org/sunflow/image/IrregularSpectralCurve.java +57 -0
  201. data/src/main/java/org/sunflow/image/RGBSpace.java +207 -0
  202. data/src/main/java/org/sunflow/image/RegularSpectralCurve.java +30 -0
  203. data/src/main/java/org/sunflow/image/SpectralCurve.java +118 -0
  204. data/src/main/java/org/sunflow/image/XYZColor.java +50 -0
  205. data/src/main/java/org/sunflow/image/formats/BitmapBlack.java +27 -0
  206. data/src/main/java/org/sunflow/image/formats/BitmapG8.java +36 -0
  207. data/src/main/java/org/sunflow/image/formats/BitmapGA8.java +30 -0
  208. data/src/main/java/org/sunflow/image/formats/BitmapRGB8.java +40 -0
  209. data/src/main/java/org/sunflow/image/formats/BitmapRGBA8.java +40 -0
  210. data/src/main/java/org/sunflow/image/formats/BitmapRGBE.java +60 -0
  211. data/src/main/java/org/sunflow/image/formats/BitmapXYZ.java +38 -0
  212. data/src/main/java/org/sunflow/image/formats/GenericBitmap.java +73 -0
  213. data/src/main/java/org/sunflow/image/readers/BMPBitmapReader.java +39 -0
  214. data/src/main/java/org/sunflow/image/readers/HDRBitmapReader.java +155 -0
  215. data/src/main/java/org/sunflow/image/readers/IGIBitmapReader.java +104 -0
  216. data/src/main/java/org/sunflow/image/readers/JPGBitmapReader.java +39 -0
  217. data/src/main/java/org/sunflow/image/readers/PNGBitmapReader.java +40 -0
  218. data/src/main/java/org/sunflow/image/readers/TGABitmapReader.java +141 -0
  219. data/src/main/java/org/sunflow/image/writers/EXRBitmapWriter.java +395 -0
  220. data/src/main/java/org/sunflow/image/writers/HDRBitmapWriter.java +54 -0
  221. data/src/main/java/org/sunflow/image/writers/IGIBitmapWriter.java +75 -0
  222. data/src/main/java/org/sunflow/image/writers/PNGBitmapWriter.java +39 -0
  223. data/src/main/java/org/sunflow/image/writers/TGABitmapWriter.java +63 -0
  224. data/src/main/java/org/sunflow/math/BoundingBox.java +340 -0
  225. data/src/main/java/org/sunflow/math/MathUtils.java +159 -0
  226. data/src/main/java/org/sunflow/math/Matrix4.java +573 -0
  227. data/src/main/java/org/sunflow/math/MovingMatrix4.java +119 -0
  228. data/src/main/java/org/sunflow/math/OrthoNormalBasis.java +110 -0
  229. data/src/main/java/org/sunflow/math/PerlinScalar.java +331 -0
  230. data/src/main/java/org/sunflow/math/PerlinVector.java +132 -0
  231. data/src/main/java/org/sunflow/math/Point2.java +36 -0
  232. data/src/main/java/org/sunflow/math/Point3.java +133 -0
  233. data/src/main/java/org/sunflow/math/QMC.java +209 -0
  234. data/src/main/java/org/sunflow/math/Solvers.java +142 -0
  235. data/src/main/java/org/sunflow/math/Vector3.java +197 -0
  236. data/src/main/java/org/sunflow/system/BenchmarkFramework.java +73 -0
  237. data/src/main/java/org/sunflow/system/BenchmarkTest.java +17 -0
  238. data/src/main/java/org/sunflow/system/ByteUtil.java +119 -0
  239. data/src/main/java/org/sunflow/system/FileUtils.java +27 -0
  240. data/src/main/java/org/sunflow/system/ImagePanel.java +282 -0
  241. data/src/main/java/org/sunflow/system/Memory.java +18 -0
  242. data/src/main/java/org/sunflow/system/Parser.java +162 -0
  243. data/src/main/java/org/sunflow/system/Plugins.java +142 -0
  244. data/src/main/java/org/sunflow/system/RenderGlobalsPanel.java +209 -0
  245. data/src/main/java/org/sunflow/system/SearchPath.java +67 -0
  246. data/src/main/java/org/sunflow/system/Timer.java +53 -0
  247. data/src/main/java/org/sunflow/system/UI.java +112 -0
  248. data/src/main/java/org/sunflow/system/UserInterface.java +46 -0
  249. data/src/main/java/org/sunflow/system/ui/ConsoleInterface.java +48 -0
  250. data/src/main/java/org/sunflow/system/ui/SilentInterface.java +28 -0
  251. data/src/main/java/org/sunflow/util/FastHashMap.java +220 -0
  252. data/src/main/java/org/sunflow/util/FloatArray.java +77 -0
  253. data/src/main/java/org/sunflow/util/IntArray.java +77 -0
  254. data/src/test/java/a_maintest.java +129 -0
  255. metadata +300 -0
@@ -0,0 +1,296 @@
1
+ package org.sunflow.core.light;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.Instance;
5
+ import org.sunflow.core.LightSample;
6
+ import org.sunflow.core.LightSource;
7
+ import org.sunflow.core.ParameterList;
8
+ import org.sunflow.core.Ray;
9
+ import org.sunflow.core.Shader;
10
+ import org.sunflow.core.ShadingState;
11
+ import org.sunflow.core.primitive.TriangleMesh;
12
+ import org.sunflow.image.Color;
13
+ import org.sunflow.math.MathUtils;
14
+ import org.sunflow.math.OrthoNormalBasis;
15
+ import org.sunflow.math.Point3;
16
+ import org.sunflow.math.Vector3;
17
+
18
+ public class TriangleMeshLight extends TriangleMesh implements Shader, LightSource {
19
+
20
+ private Color radiance;
21
+ private int numSamples;
22
+ private float[] areas;
23
+ private float totalArea;
24
+ private Vector3[] ngs;
25
+
26
+ public TriangleMeshLight() {
27
+ radiance = Color.WHITE;
28
+ numSamples = 4;
29
+ }
30
+
31
+ @Override
32
+ public boolean update(ParameterList pl, SunflowAPI api) {
33
+ radiance = pl.getColor("radiance", radiance);
34
+ numSamples = pl.getInt("samples", numSamples);
35
+ if (super.update(pl, api)) {
36
+ // precompute triangle areas and normals
37
+ areas = new float[getNumPrimitives()];
38
+ ngs = new Vector3[getNumPrimitives()];
39
+ totalArea = 0;
40
+ for (int tri3 = 0, i = 0; tri3 < triangles.length; tri3 += 3, i++) {
41
+ int a = triangles[tri3 + 0];
42
+ int b = triangles[tri3 + 1];
43
+ int c = triangles[tri3 + 2];
44
+ Point3 v0p = getPoint(a);
45
+ Point3 v1p = getPoint(b);
46
+ Point3 v2p = getPoint(c);
47
+ ngs[i] = Point3.normal(v0p, v1p, v2p);
48
+ areas[i] = 0.5f * ngs[i].length();
49
+ ngs[i].normalize();
50
+ totalArea += areas[i];
51
+ }
52
+ } else {
53
+ return false;
54
+ }
55
+ return true;
56
+ }
57
+
58
+ private boolean intersectTriangleKensler(int tri3, Ray r) {
59
+ int a = 3 * triangles[tri3 + 0];
60
+ int b = 3 * triangles[tri3 + 1];
61
+ int c = 3 * triangles[tri3 + 2];
62
+ float edge0x = points[b + 0] - points[a + 0];
63
+ float edge0y = points[b + 1] - points[a + 1];
64
+ float edge0z = points[b + 2] - points[a + 2];
65
+ float edge1x = points[a + 0] - points[c + 0];
66
+ float edge1y = points[a + 1] - points[c + 1];
67
+ float edge1z = points[a + 2] - points[c + 2];
68
+ float nx = edge0y * edge1z - edge0z * edge1y;
69
+ float ny = edge0z * edge1x - edge0x * edge1z;
70
+ float nz = edge0x * edge1y - edge0y * edge1x;
71
+ float v = r.dot(nx, ny, nz);
72
+ float iv = 1 / v;
73
+ float edge2x = points[a + 0] - r.ox;
74
+ float edge2y = points[a + 1] - r.oy;
75
+ float edge2z = points[a + 2] - r.oz;
76
+ float va = nx * edge2x + ny * edge2y + nz * edge2z;
77
+ float t = iv * va;
78
+ if (t <= 0) {
79
+ return false;
80
+ }
81
+ float ix = edge2y * r.dz - edge2z * r.dy;
82
+ float iy = edge2z * r.dx - edge2x * r.dz;
83
+ float iz = edge2x * r.dy - edge2y * r.dx;
84
+ float v1 = ix * edge1x + iy * edge1y + iz * edge1z;
85
+ float beta = iv * v1;
86
+ if (beta < 0) {
87
+ return false;
88
+ }
89
+ float v2 = ix * edge0x + iy * edge0y + iz * edge0z;
90
+ if ((v1 + v2) * v > v * v) {
91
+ return false;
92
+ }
93
+ float gamma = iv * v2;
94
+ if (gamma < 0) {
95
+ return false;
96
+ }
97
+ // FIXME: arbitrary bias, should handle as in other places
98
+ r.setMax(t - 1e-3f);
99
+ return true;
100
+ }
101
+
102
+ @Override
103
+ public Color getRadiance(ShadingState state) {
104
+ if (!state.includeLights()) {
105
+ return Color.BLACK;
106
+ }
107
+ state.faceforward();
108
+ // emit constant radiance
109
+ return state.isBehind() ? Color.BLACK : radiance;
110
+ }
111
+
112
+ @Override
113
+ public void scatterPhoton(ShadingState state, Color power) {
114
+ // do not scatter photons
115
+ }
116
+
117
+ @Override
118
+ public Instance createInstance() {
119
+ return Instance.createTemporary(this, null, this);
120
+ }
121
+
122
+ @Override
123
+ public int getNumSamples() {
124
+ return numSamples * getNumPrimitives();
125
+ }
126
+
127
+ @Override
128
+ public void getPhoton(double randX1, double randY1, double randX2, double randY2, Point3 p, Vector3 dir, Color power) {
129
+ double rnd = randX1 * totalArea;
130
+ int j = areas.length - 1;
131
+ for (int i = 0; i < areas.length; i++) {
132
+ if (rnd < areas[i]) {
133
+ j = i;
134
+ break;
135
+ }
136
+ rnd -= areas[i]; // try next triangle
137
+ }
138
+ rnd /= areas[j];
139
+ randX1 = rnd;
140
+ double s = Math.sqrt(1 - randX2);
141
+ float u = (float) (randY2 * s);
142
+ float v = (float) (1 - s);
143
+ float w = 1 - u - v;
144
+ int tri3 = j * 3;
145
+ int index0 = 3 * triangles[tri3 + 0];
146
+ int index1 = 3 * triangles[tri3 + 1];
147
+ int index2 = 3 * triangles[tri3 + 2];
148
+ p.x = w * points[index0 + 0] + u * points[index1 + 0] + v * points[index2 + 0];
149
+ p.y = w * points[index0 + 1] + u * points[index1 + 1] + v * points[index2 + 1];
150
+ p.z = w * points[index0 + 2] + u * points[index1 + 2] + v * points[index2 + 2];
151
+ p.x += 0.001f * ngs[j].x;
152
+ p.y += 0.001f * ngs[j].y;
153
+ p.z += 0.001f * ngs[j].z;
154
+ OrthoNormalBasis onb = OrthoNormalBasis.makeFromW(ngs[j]);
155
+ u = (float) (2 * Math.PI * randX1);
156
+ s = Math.sqrt(randY1);
157
+ onb.transform(new Vector3((float) (Math.cos(u) * s), (float) (Math.sin(u) * s), (float) (Math.sqrt(1 - randY1))), dir);
158
+ Color.mul((float) Math.PI * areas[j], radiance, power);
159
+ }
160
+
161
+ @Override
162
+ public float getPower() {
163
+ return radiance.copy().mul((float) Math.PI * totalArea).getLuminance();
164
+ }
165
+
166
+ @Override
167
+ public void getSamples(ShadingState state) {
168
+ if (numSamples == 0) {
169
+ return;
170
+ }
171
+ Vector3 n = state.getNormal();
172
+ Point3 p = state.getPoint();
173
+ for (int tri3 = 0, i = 0; tri3 < triangles.length; tri3 += 3, i++) {
174
+ // vector towards each vertex of the light source
175
+ Vector3 p0 = Point3.sub(getPoint(triangles[tri3 + 0]), p, new Vector3());
176
+ // cull triangle if it is facing the wrong way
177
+ if (Vector3.dot(p0, ngs[i]) >= 0) {
178
+ continue;
179
+ }
180
+ Vector3 p1 = Point3.sub(getPoint(triangles[tri3 + 1]), p, new Vector3());
181
+ Vector3 p2 = Point3.sub(getPoint(triangles[tri3 + 2]), p, new Vector3());
182
+ // if all three vertices are below the hemisphere, stop
183
+ if (Vector3.dot(p0, n) <= 0 && Vector3.dot(p1, n) <= 0 && Vector3.dot(p2, n) <= 0) {
184
+ continue;
185
+ }
186
+ p0.normalize();
187
+ p1.normalize();
188
+ p2.normalize();
189
+ float dot = Vector3.dot(p2, p0);
190
+ Vector3 h = new Vector3();
191
+ h.x = p2.x - dot * p0.x;
192
+ h.y = p2.y - dot * p0.y;
193
+ h.z = p2.z - dot * p0.z;
194
+ float hlen = h.length();
195
+ if (hlen > 1e-6f) {
196
+ h.div(hlen);
197
+ } else {
198
+ continue;
199
+ }
200
+ Vector3 n0 = Vector3.cross(p0, p1, new Vector3());
201
+ float len0 = n0.length();
202
+ if (len0 > 1e-6f) {
203
+ n0.div(len0);
204
+ } else {
205
+ continue;
206
+ }
207
+ Vector3 n1 = Vector3.cross(p1, p2, new Vector3());
208
+ float len1 = n1.length();
209
+ if (len1 > 1e-6f) {
210
+ n1.div(len1);
211
+ } else {
212
+ continue;
213
+ }
214
+ Vector3 n2 = Vector3.cross(p2, p0, new Vector3());
215
+ float len2 = n2.length();
216
+ if (len2 > 1e-6f) {
217
+ n2.div(len2);
218
+ } else {
219
+ continue;
220
+ }
221
+
222
+ float cosAlpha = MathUtils.clamp(-Vector3.dot(n2, n0), -1.0f, 1.0f);
223
+ float cosBeta = MathUtils.clamp(-Vector3.dot(n0, n1), -1.0f, 1.0f);
224
+ float cosGamma = MathUtils.clamp(-Vector3.dot(n1, n2), -1.0f, 1.0f);
225
+
226
+ float alpha = (float) Math.acos(cosAlpha);
227
+ float beta = (float) Math.acos(cosBeta);
228
+ float gamma = (float) Math.acos(cosGamma);
229
+
230
+ float area = alpha + beta + gamma - (float) Math.PI;
231
+
232
+ float cosC = MathUtils.clamp(Vector3.dot(p0, p1), -1.0f, 1.0f);
233
+ float salpha = (float) Math.sin(alpha);
234
+ float product = salpha * cosC;
235
+
236
+ // use lower sampling depth for diffuse bounces
237
+ int samples = state.getDiffuseDepth() > 0 ? 1 : numSamples;
238
+ Color c = Color.mul(area / samples, radiance);
239
+ for (int j = 0; j < samples; j++) {
240
+ // random offset on unit square
241
+ double randX = state.getRandom(j, 0, samples);
242
+ double randY = state.getRandom(j, 1, samples);
243
+
244
+ float phi = (float) randX * area - alpha + (float) Math.PI;
245
+ float sinPhi = (float) Math.sin(phi);
246
+ float cosPhi = (float) Math.cos(phi);
247
+
248
+ float u = cosPhi + cosAlpha;
249
+ float v = sinPhi - product;
250
+
251
+ float q = (-v + cosAlpha * (cosPhi * -v + sinPhi * u)) / (salpha * (sinPhi * -v - cosPhi * u));
252
+ float q1 = 1.0f - q * q;
253
+ if (q1 < 0.0f) {
254
+ q1 = 0.0f;
255
+ }
256
+
257
+ float sqrtq1 = (float) Math.sqrt(q1);
258
+ float ncx = q * p0.x + sqrtq1 * h.x;
259
+ float ncy = q * p0.y + sqrtq1 * h.y;
260
+ float ncz = q * p0.z + sqrtq1 * h.z;
261
+ dot = p1.dot(ncx, ncy, ncz);
262
+ float z = 1.0f - (float) randY * (1.0f - dot);
263
+ float z1 = 1.0f - z * z;
264
+ if (z1 < 0.0f) {
265
+ z1 = 0.0f;
266
+ }
267
+ Vector3 nd = new Vector3();
268
+ nd.x = ncx - dot * p1.x;
269
+ nd.y = ncy - dot * p1.y;
270
+ nd.z = ncz - dot * p1.z;
271
+ nd.normalize();
272
+ float sqrtz1 = (float) Math.sqrt(z1);
273
+ Vector3 result = new Vector3();
274
+ result.x = z * p1.x + sqrtz1 * nd.x;
275
+ result.y = z * p1.y + sqrtz1 * nd.y;
276
+ result.z = z * p1.z + sqrtz1 * nd.z;
277
+
278
+ // make sure the sample is in the right hemisphere - facing in
279
+ // the right direction
280
+ if (Vector3.dot(result, n) > 0 && Vector3.dot(result, state.getGeoNormal()) > 0 && Vector3.dot(result, ngs[i]) < 0) {
281
+ // compute intersection with triangle (if any)
282
+ Ray shadowRay = new Ray(state.getPoint(), result);
283
+ if (!intersectTriangleKensler(tri3, shadowRay)) {
284
+ continue;
285
+ }
286
+ LightSample dest = new LightSample();
287
+ dest.setShadowRay(shadowRay);
288
+ // prepare sample
289
+ dest.setRadiance(c, c);
290
+ dest.traceShadow(state);
291
+ state.addSample(dest);
292
+ }
293
+ }
294
+ }
295
+ }
296
+ }
@@ -0,0 +1,37 @@
1
+ package org.sunflow.core.modifiers;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.Modifier;
5
+ import org.sunflow.core.ParameterList;
6
+ import org.sunflow.core.ShadingState;
7
+ import org.sunflow.core.Texture;
8
+ import org.sunflow.core.TextureCache;
9
+ import org.sunflow.math.OrthoNormalBasis;
10
+
11
+ public class BumpMappingModifier implements Modifier {
12
+
13
+ private Texture bumpTexture;
14
+ private float scale;
15
+
16
+ public BumpMappingModifier() {
17
+ bumpTexture = null;
18
+ scale = 1;
19
+ }
20
+
21
+ @Override
22
+ public boolean update(ParameterList pl, SunflowAPI api) {
23
+ String filename = pl.getString("texture", null);
24
+ if (filename != null) {
25
+ bumpTexture = TextureCache.getTexture(api.resolveTextureFilename(filename), true);
26
+ }
27
+ scale = pl.getFloat("scale", scale);
28
+ return bumpTexture != null;
29
+ }
30
+
31
+ @Override
32
+ public void modify(ShadingState state) {
33
+ // apply bump
34
+ state.getNormal().set(bumpTexture.getBump(state.getUV().x, state.getUV().y, state.getBasis(), scale));
35
+ state.setBasis(OrthoNormalBasis.makeFromW(state.getNormal()));
36
+ }
37
+ }
@@ -0,0 +1,34 @@
1
+ package org.sunflow.core.modifiers;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.Modifier;
5
+ import org.sunflow.core.ParameterList;
6
+ import org.sunflow.core.ShadingState;
7
+ import org.sunflow.core.Texture;
8
+ import org.sunflow.core.TextureCache;
9
+ import org.sunflow.math.OrthoNormalBasis;
10
+
11
+ public class NormalMapModifier implements Modifier {
12
+
13
+ private Texture normalMap;
14
+
15
+ public NormalMapModifier() {
16
+ normalMap = null;
17
+ }
18
+
19
+ @Override
20
+ public boolean update(ParameterList pl, SunflowAPI api) {
21
+ String filename = pl.getString("texture", null);
22
+ if (filename != null) {
23
+ normalMap = TextureCache.getTexture(api.resolveTextureFilename(filename), true);
24
+ }
25
+ return normalMap != null;
26
+ }
27
+
28
+ @Override
29
+ public void modify(ShadingState state) {
30
+ // apply normal map
31
+ state.getNormal().set(normalMap.getNormal(state.getUV().x, state.getUV().y, state.getBasis()));
32
+ state.setBasis(OrthoNormalBasis.makeFromW(state.getNormal()));
33
+ }
34
+ }
@@ -0,0 +1,80 @@
1
+ package org.sunflow.core.modifiers;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.Modifier;
5
+ import org.sunflow.core.ParameterList;
6
+ import org.sunflow.core.ShadingState;
7
+ import org.sunflow.math.OrthoNormalBasis;
8
+ import org.sunflow.math.PerlinScalar;
9
+ import org.sunflow.math.Point3;
10
+ import org.sunflow.math.Vector3;
11
+
12
+ public class PerlinModifier implements Modifier {
13
+
14
+ private int function = 0;
15
+ private float scale = 50;
16
+ private float size = 1;
17
+
18
+ @Override
19
+ public boolean update(ParameterList pl, SunflowAPI api) {
20
+ function = pl.getInt("function", function);
21
+ size = pl.getFloat("size", size);
22
+ scale = pl.getFloat("scale", scale);
23
+ return true;
24
+ }
25
+
26
+ @Override
27
+ public void modify(ShadingState state) {
28
+ Point3 p = state.transformWorldToObject(state.getPoint());
29
+ p.x *= size;
30
+ p.y *= size;
31
+ p.z *= size;
32
+ Vector3 normal = state.transformNormalWorldToObject(state.getNormal());
33
+ double f0 = f(p.x, p.y, p.z);
34
+ double fx = f(p.x + .0001, p.y, p.z);
35
+ double fy = f(p.x, p.y + .0001, p.z);
36
+ double fz = f(p.x, p.y, p.z + .0001);
37
+
38
+ normal.x -= scale * (fx - f0) / .0001;
39
+ normal.y -= scale * (fy - f0) / .0001;
40
+ normal.z -= scale * (fz - f0) / .0001;
41
+ normal.normalize();
42
+
43
+ state.getNormal().set(state.transformNormalObjectToWorld(normal));
44
+ state.getNormal().normalize();
45
+ state.setBasis(OrthoNormalBasis.makeFromW(state.getNormal()));
46
+ }
47
+
48
+ double f(double x, double y, double z) {
49
+ switch (function) {
50
+ case 0:
51
+ return .03 * noise(x, y, z, 8);
52
+ case 1:
53
+ return .01 * stripes(x + 2 * turbulence(x, y, z, 1), 1.6);
54
+ default:
55
+ return -.10 * turbulence(x, y, z, 1);
56
+ }
57
+ }
58
+
59
+ private static double stripes(double x, double f) {
60
+ double t = .5 + .5 * Math.sin(f * 2 * Math.PI * x);
61
+ return t * t - .5;
62
+ }
63
+
64
+ private static double turbulence(double x, double y, double z, double freq) {
65
+ double t = -.5;
66
+ for (; freq <= 300 / 12; freq *= 2) {
67
+ t += Math.abs(noise(x, y, z, freq) / freq);
68
+ }
69
+ return t;
70
+ }
71
+
72
+ private static double noise(double x, double y, double z, double freq) {
73
+ double x1, y1, z1;
74
+ x1 = .707 * x - .707 * z;
75
+ z1 = .707 * x + .707 * z;
76
+ y1 = .707 * x1 + .707 * y;
77
+ x1 = .707 * x1 - .707 * y;
78
+ return PerlinScalar.snoise((float) (freq * x1 + 100), (float) (freq * y1), (float) (freq * z1));
79
+ }
80
+ }