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,31 @@
1
+ package org.sunflow.core.shader;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.ParameterList;
5
+ import org.sunflow.core.ShadingState;
6
+ import org.sunflow.core.Texture;
7
+ import org.sunflow.core.TextureCache;
8
+ import org.sunflow.image.Color;
9
+
10
+ public class TexturedDiffuseShader extends DiffuseShader {
11
+
12
+ private Texture tex;
13
+
14
+ public TexturedDiffuseShader() {
15
+ tex = null;
16
+ }
17
+
18
+ @Override
19
+ public boolean update(ParameterList pl, SunflowAPI api) {
20
+ String filename = pl.getString("texture", null);
21
+ if (filename != null) {
22
+ tex = TextureCache.getTexture(api.resolveTextureFilename(filename), false);
23
+ }
24
+ return tex != null && super.update(pl, api);
25
+ }
26
+
27
+ @Override
28
+ public Color getDiffuse(ShadingState state) {
29
+ return tex.getPixel(state.getUV().x, state.getUV().y);
30
+ }
31
+ }
@@ -0,0 +1,31 @@
1
+ package org.sunflow.core.shader;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.ParameterList;
5
+ import org.sunflow.core.ShadingState;
6
+ import org.sunflow.core.Texture;
7
+ import org.sunflow.core.TextureCache;
8
+ import org.sunflow.image.Color;
9
+
10
+ public class TexturedPhongShader extends PhongShader {
11
+
12
+ private Texture tex;
13
+
14
+ public TexturedPhongShader() {
15
+ tex = null;
16
+ }
17
+
18
+ @Override
19
+ public boolean update(ParameterList pl, SunflowAPI api) {
20
+ String filename = pl.getString("texture", null);
21
+ if (filename != null) {
22
+ tex = TextureCache.getTexture(api.resolveTextureFilename(filename), false);
23
+ }
24
+ return tex != null && super.update(pl, api);
25
+ }
26
+
27
+ @Override
28
+ public Color getDiffuse(ShadingState state) {
29
+ return tex.getPixel(state.getUV().x, state.getUV().y);
30
+ }
31
+ }
@@ -0,0 +1,31 @@
1
+ package org.sunflow.core.shader;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.ParameterList;
5
+ import org.sunflow.core.ShadingState;
6
+ import org.sunflow.core.Texture;
7
+ import org.sunflow.core.TextureCache;
8
+ import org.sunflow.image.Color;
9
+
10
+ public class TexturedShinyDiffuseShader extends ShinyDiffuseShader {
11
+
12
+ private Texture tex;
13
+
14
+ public TexturedShinyDiffuseShader() {
15
+ tex = null;
16
+ }
17
+
18
+ @Override
19
+ public boolean update(ParameterList pl, SunflowAPI api) {
20
+ String filename = pl.getString("texture", null);
21
+ if (filename != null) {
22
+ tex = TextureCache.getTexture(api.resolveTextureFilename(filename), false);
23
+ }
24
+ return tex != null && super.update(pl, api);
25
+ }
26
+
27
+ @Override
28
+ public Color getDiffuse(ShadingState state) {
29
+ return tex.getPixel(state.getUV().x, state.getUV().y);
30
+ }
31
+ }
@@ -0,0 +1,31 @@
1
+ package org.sunflow.core.shader;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.ParameterList;
5
+ import org.sunflow.core.ShadingState;
6
+ import org.sunflow.core.Texture;
7
+ import org.sunflow.core.TextureCache;
8
+ import org.sunflow.image.Color;
9
+
10
+ public class TexturedWardShader extends AnisotropicWardShader {
11
+
12
+ private Texture tex;
13
+
14
+ public TexturedWardShader() {
15
+ tex = null;
16
+ }
17
+
18
+ @Override
19
+ public boolean update(ParameterList pl, SunflowAPI api) {
20
+ String filename = pl.getString("texture", null);
21
+ if (filename != null) {
22
+ tex = TextureCache.getTexture(api.resolveTextureFilename(filename), false);
23
+ }
24
+ return tex != null && super.update(pl, api);
25
+ }
26
+
27
+ @Override
28
+ public Color getDiffuse(ShadingState state) {
29
+ return tex.getPixel(state.getUV().x, state.getUV().y);
30
+ }
31
+ }
@@ -0,0 +1,27 @@
1
+ package org.sunflow.core.shader;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.ParameterList;
5
+ import org.sunflow.core.Shader;
6
+ import org.sunflow.core.ShadingState;
7
+ import org.sunflow.image.Color;
8
+
9
+ public class UVShader implements Shader {
10
+
11
+ @Override
12
+ public boolean update(ParameterList pl, SunflowAPI api) {
13
+ return true;
14
+ }
15
+
16
+ @Override
17
+ public Color getRadiance(ShadingState state) {
18
+ if (state.getUV() == null) {
19
+ return Color.BLACK;
20
+ }
21
+ return new Color(state.getUV().x, state.getUV().y, 0);
22
+ }
23
+
24
+ @Override
25
+ public void scatterPhoton(ShadingState state, Color power) {
26
+ }
27
+ }
@@ -0,0 +1,149 @@
1
+ package org.sunflow.core.shader;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.ParameterList;
5
+ import org.sunflow.core.Ray;
6
+ import org.sunflow.core.Shader;
7
+ import org.sunflow.core.ShadingState;
8
+ import org.sunflow.core.Texture;
9
+ import org.sunflow.core.TextureCache;
10
+ import org.sunflow.image.Color;
11
+ import org.sunflow.math.MathUtils;
12
+ import org.sunflow.math.OrthoNormalBasis;
13
+ import org.sunflow.math.Vector3;
14
+
15
+ public class UberShader implements Shader {
16
+
17
+ private Color diff;
18
+ private Color spec;
19
+ private Texture diffmap;
20
+ private Texture specmap;
21
+ private float diffBlend;
22
+ private float specBlend;
23
+ private float glossyness;
24
+ private int numSamples;
25
+
26
+ public UberShader() {
27
+ diff = spec = Color.GRAY;
28
+ diffmap = specmap = null;
29
+ diffBlend = specBlend = 1;
30
+ glossyness = 0;
31
+ numSamples = 4;
32
+ }
33
+
34
+ @Override
35
+ public boolean update(ParameterList pl, SunflowAPI api) {
36
+ diff = pl.getColor("diffuse", diff);
37
+ spec = pl.getColor("specular", spec);
38
+ String filename;
39
+ filename = pl.getString("diffuse.texture", null);
40
+ if (filename != null) {
41
+ diffmap = TextureCache.getTexture(api.resolveTextureFilename(filename), false);
42
+ }
43
+ filename = pl.getString("specular.texture", null);
44
+ if (filename != null) {
45
+ specmap = TextureCache.getTexture(api.resolveTextureFilename(filename), false);
46
+ }
47
+ diffBlend = MathUtils.clamp(pl.getFloat("diffuse.blend", diffBlend), 0, 1);
48
+ specBlend = MathUtils.clamp(pl.getFloat("specular.blend", diffBlend), 0, 1);
49
+ glossyness = MathUtils.clamp(pl.getFloat("glossyness", glossyness), 0, 1);
50
+ numSamples = pl.getInt("samples", numSamples);
51
+ return true;
52
+ }
53
+
54
+ public Color getDiffuse(ShadingState state) {
55
+ return diffmap == null ? diff : Color.blend(diff, diffmap.getPixel(state.getUV().x, state.getUV().y), diffBlend);
56
+ }
57
+
58
+ public Color getSpecular(ShadingState state) {
59
+ return specmap == null ? spec : Color.blend(spec, specmap.getPixel(state.getUV().x, state.getUV().y), specBlend);
60
+ }
61
+
62
+ @Override
63
+ public Color getRadiance(ShadingState state) {
64
+ // make sure we are on the right side of the material
65
+ state.faceforward();
66
+ // direct lighting
67
+ state.initLightSamples();
68
+ state.initCausticSamples();
69
+ Color d = getDiffuse(state);
70
+ Color lr = state.diffuse(d);
71
+ if (!state.includeSpecular()) {
72
+ return lr;
73
+ }
74
+ if (glossyness == 0) {
75
+ float cos = state.getCosND();
76
+ float dn = 2 * cos;
77
+ Vector3 refDir = new Vector3();
78
+ refDir.x = (dn * state.getNormal().x) + state.getRay().getDirection().x;
79
+ refDir.y = (dn * state.getNormal().y) + state.getRay().getDirection().y;
80
+ refDir.z = (dn * state.getNormal().z) + state.getRay().getDirection().z;
81
+ Ray refRay = new Ray(state.getPoint(), refDir);
82
+ // compute Fresnel term
83
+ cos = 1 - cos;
84
+ float cos2 = cos * cos;
85
+ float cos5 = cos2 * cos2 * cos;
86
+ Color specular = getSpecular(state);
87
+ Color ret = Color.white();
88
+ ret.sub(specular);
89
+ ret.mul(cos5);
90
+ ret.add(specular);
91
+ return lr.add(ret.mul(state.traceReflection(refRay, 0)));
92
+ } else {
93
+ return lr.add(state.specularPhong(getSpecular(state), 2 / glossyness, numSamples));
94
+ }
95
+ }
96
+
97
+ @Override
98
+ public void scatterPhoton(ShadingState state, Color power) {
99
+ Color diffuse, specular;
100
+ // make sure we are on the right side of the material
101
+ state.faceforward();
102
+ diffuse = getDiffuse(state);
103
+ specular = getSpecular(state);
104
+ state.storePhoton(state.getRay().getDirection(), power, diffuse);
105
+ float d = diffuse.getAverage();
106
+ float r = specular.getAverage();
107
+ double rnd = state.getRandom(0, 0, 1);
108
+ if (rnd < d) {
109
+ // photon is scattered
110
+ power.mul(diffuse).mul(1.0f / d);
111
+ OrthoNormalBasis onb = state.getBasis();
112
+ double u = 2 * Math.PI * rnd / d;
113
+ double v = state.getRandom(0, 1, 1);
114
+ float s = (float) Math.sqrt(v);
115
+ float s1 = (float) Math.sqrt(1.0 - v);
116
+ Vector3 w = new Vector3((float) Math.cos(u) * s, (float) Math.sin(u) * s, s1);
117
+ w = onb.transform(w, new Vector3());
118
+ state.traceDiffusePhoton(new Ray(state.getPoint(), w), power);
119
+ } else if (rnd < d + r) {
120
+ if (glossyness == 0) {
121
+ float cos = -Vector3.dot(state.getNormal(), state.getRay().getDirection());
122
+ power.mul(diffuse).mul(1.0f / d);
123
+ // photon is reflected
124
+ float dn = 2 * cos;
125
+ Vector3 dir = new Vector3();
126
+ dir.x = (dn * state.getNormal().x) + state.getRay().getDirection().x;
127
+ dir.y = (dn * state.getNormal().y) + state.getRay().getDirection().y;
128
+ dir.z = (dn * state.getNormal().z) + state.getRay().getDirection().z;
129
+ state.traceReflectionPhoton(new Ray(state.getPoint(), dir), power);
130
+ } else {
131
+ float dn = 2.0f * state.getCosND();
132
+ // reflected direction
133
+ Vector3 refDir = new Vector3();
134
+ refDir.x = (dn * state.getNormal().x) + state.getRay().dx;
135
+ refDir.y = (dn * state.getNormal().y) + state.getRay().dy;
136
+ refDir.z = (dn * state.getNormal().z) + state.getRay().dz;
137
+ power.mul(spec).mul(1.0f / r);
138
+ OrthoNormalBasis onb = state.getBasis();
139
+ double u = 2 * Math.PI * (rnd - r) / r;
140
+ double v = state.getRandom(0, 1, 1);
141
+ float s = (float) Math.pow(v, 1 / ((1.0f / glossyness) + 1));
142
+ float s1 = (float) Math.sqrt(1 - s * s);
143
+ Vector3 w = new Vector3((float) Math.cos(u) * s1, (float) Math.sin(u) * s1, s);
144
+ w = onb.transform(w, new Vector3());
145
+ state.traceReflectionPhoton(new Ray(state.getPoint(), w), power);
146
+ }
147
+ }
148
+ }
149
+ }
@@ -0,0 +1,33 @@
1
+ package org.sunflow.core.shader;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.LightSample;
5
+ import org.sunflow.core.ParameterList;
6
+ import org.sunflow.core.Shader;
7
+ import org.sunflow.core.ShadingState;
8
+ import org.sunflow.image.Color;
9
+
10
+ public class ViewCausticsShader implements Shader {
11
+
12
+ @Override
13
+ public boolean update(ParameterList pl, SunflowAPI api) {
14
+ return true;
15
+ }
16
+
17
+ @Override
18
+ public Color getRadiance(ShadingState state) {
19
+ state.faceforward();
20
+ state.initCausticSamples();
21
+ // integrate a diffuse function
22
+ Color lr = Color.black();
23
+ for (LightSample sample : state) {
24
+ lr.madd(sample.dot(state.getNormal()), sample.getDiffuseRadiance());
25
+ }
26
+ return lr.mul(1.0f / (float) Math.PI);
27
+
28
+ }
29
+
30
+ @Override
31
+ public void scatterPhoton(ShadingState state, Color power) {
32
+ }
33
+ }
@@ -0,0 +1,25 @@
1
+ package org.sunflow.core.shader;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.ParameterList;
5
+ import org.sunflow.core.Shader;
6
+ import org.sunflow.core.ShadingState;
7
+ import org.sunflow.image.Color;
8
+
9
+ public class ViewGlobalPhotonsShader implements Shader {
10
+
11
+ @Override
12
+ public boolean update(ParameterList pl, SunflowAPI api) {
13
+ return true;
14
+ }
15
+
16
+ @Override
17
+ public Color getRadiance(ShadingState state) {
18
+ state.faceforward();
19
+ return state.getGlobalRadiance();
20
+ }
21
+
22
+ @Override
23
+ public void scatterPhoton(ShadingState state, Color power) {
24
+ }
25
+ }
@@ -0,0 +1,25 @@
1
+ package org.sunflow.core.shader;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.ParameterList;
5
+ import org.sunflow.core.Shader;
6
+ import org.sunflow.core.ShadingState;
7
+ import org.sunflow.image.Color;
8
+
9
+ public class ViewIrradianceShader implements Shader {
10
+
11
+ @Override
12
+ public boolean update(ParameterList pl, SunflowAPI api) {
13
+ return true;
14
+ }
15
+
16
+ @Override
17
+ public Color getRadiance(ShadingState state) {
18
+ state.faceforward();
19
+ return new Color().set(state.getIrradiance(Color.WHITE)).mul(1.0f / (float) Math.PI);
20
+ }
21
+
22
+ @Override
23
+ public void scatterPhoton(ShadingState state, Color power) {
24
+ }
25
+ }
@@ -0,0 +1,83 @@
1
+ package org.sunflow.core.shader;
2
+
3
+ import org.sunflow.SunflowAPI;
4
+ import org.sunflow.core.ParameterList;
5
+ import org.sunflow.core.Shader;
6
+ import org.sunflow.core.ShadingState;
7
+ import org.sunflow.image.Color;
8
+ import org.sunflow.math.Matrix4;
9
+ import org.sunflow.math.Point3;
10
+
11
+ public class WireframeShader implements Shader {
12
+
13
+ private Color lineColor;
14
+ private Color fillColor;
15
+ private float width;
16
+ private float cosWidth;
17
+
18
+ public WireframeShader() {
19
+ lineColor = Color.BLACK;
20
+ fillColor = Color.WHITE;
21
+ // pick a very small angle - should be roughly the half the angular
22
+ // width of a
23
+ // pixel
24
+ width = (float) (Math.PI * 0.5 / 4096);
25
+ cosWidth = (float) Math.cos(width);
26
+ }
27
+
28
+ @Override
29
+ public boolean update(ParameterList pl, SunflowAPI api) {
30
+ lineColor = pl.getColor("line", lineColor);
31
+ fillColor = pl.getColor("fill", fillColor);
32
+ width = pl.getFloat("width", width);
33
+ cosWidth = (float) Math.cos(width);
34
+ return true;
35
+ }
36
+
37
+ public Color getFillColor(ShadingState state) {
38
+ return fillColor;
39
+ }
40
+
41
+ public Color getLineColor(ShadingState state) {
42
+ return lineColor;
43
+ }
44
+
45
+ @Override
46
+ public Color getRadiance(ShadingState state) {
47
+ Point3[] p = new Point3[3];
48
+ if (!state.getTrianglePoints(p)) {
49
+ return getFillColor(state);
50
+ }
51
+ // transform points into camera space
52
+ Point3 center = state.getPoint();
53
+ Matrix4 w2c = state.getWorldToCamera();
54
+ center = w2c.transformP(center);
55
+ for (int i = 0; i < 3; i++) {
56
+ p[i] = w2c.transformP(state.transformObjectToWorld(p[i]));
57
+ }
58
+ float cn = 1.0f / (float) Math.sqrt(center.x * center.x + center.y * center.y + center.z * center.z);
59
+ for (int i = 0, i2 = 2; i < 3; i2 = i, i++) {
60
+ // compute orthogonal projection of the shading point onto each
61
+ // triangle edge as in:
62
+ // http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html
63
+ float t = (center.x - p[i].x) * (p[i2].x - p[i].x);
64
+ t += (center.y - p[i].y) * (p[i2].y - p[i].y);
65
+ t += (center.z - p[i].z) * (p[i2].z - p[i].z);
66
+ t /= p[i].distanceToSquared(p[i2]);
67
+ float projx = (1 - t) * p[i].x + t * p[i2].x;
68
+ float projy = (1 - t) * p[i].y + t * p[i2].y;
69
+ float projz = (1 - t) * p[i].z + t * p[i2].z;
70
+ float n = 1.0f / (float) Math.sqrt(projx * projx + projy * projy + projz * projz);
71
+ // check angular width
72
+ float dot = projx * center.x + projy * center.y + projz * center.z;
73
+ if (dot * n * cn >= cosWidth) {
74
+ return getLineColor(state);
75
+ }
76
+ }
77
+ return getFillColor(state);
78
+ }
79
+
80
+ @Override
81
+ public void scatterPhoton(ShadingState state, Color power) {
82
+ }
83
+ }