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,83 @@
1
+ package org.sunflow.core.display;
2
+
3
+ import java.io.IOException;
4
+
5
+ import org.sunflow.PluginRegistry;
6
+ import org.sunflow.core.Display;
7
+ import org.sunflow.image.BitmapWriter;
8
+ import org.sunflow.image.Color;
9
+ import org.sunflow.system.FileUtils;
10
+ import org.sunflow.system.UI;
11
+ import org.sunflow.system.UI.Module;
12
+
13
+ public class FileDisplay implements Display {
14
+
15
+ private BitmapWriter writer;
16
+ private String filename;
17
+
18
+ public FileDisplay(boolean saveImage) {
19
+ this(saveImage ? "output.png" : ".none");
20
+ }
21
+
22
+ public FileDisplay(String filename) {
23
+ this.filename = filename == null ? "output.png" : filename;
24
+ String extension = FileUtils.getExtension(filename);
25
+ writer = PluginRegistry.BITMAP_WRITER_PLUGINS.createObject(extension);
26
+ }
27
+
28
+ @Override
29
+ public void imageBegin(int w, int h, int bucketSize) {
30
+ if (writer == null) {
31
+ return;
32
+ }
33
+ try {
34
+ writer.openFile(filename);
35
+ writer.writeHeader(w, h, bucketSize);
36
+ } catch (IOException e) {
37
+ UI.printError(Module.IMG, "I/O error occured while preparing image for display: %s", e.getMessage());
38
+ }
39
+ }
40
+
41
+ @Override
42
+ public void imagePrepare(int x, int y, int w, int h, int id) {
43
+ // does nothing for files
44
+ }
45
+
46
+ @Override
47
+ public void imageUpdate(int x, int y, int w, int h, Color[] data, float[] alpha) {
48
+ if (writer == null) {
49
+ return;
50
+ }
51
+ try {
52
+ writer.writeTile(x, y, w, h, data, alpha);
53
+ } catch (IOException e) {
54
+ UI.printError(Module.IMG, "I/O error occured while writing image tile [(%d,%d) %dx%d] image for display: %s", x, y, w, h, e.getMessage());
55
+ }
56
+ }
57
+
58
+ @Override
59
+ public void imageFill(int x, int y, int w, int h, Color c, float alpha) {
60
+ if (writer == null) {
61
+ return;
62
+ }
63
+ Color[] colorTile = new Color[w * h];
64
+ float[] alphaTile = new float[w * h];
65
+ for (int i = 0; i < colorTile.length; i++) {
66
+ colorTile[i] = c;
67
+ alphaTile[i] = alpha;
68
+ }
69
+ imageUpdate(x, y, w, h, colorTile, alphaTile);
70
+ }
71
+
72
+ @Override
73
+ public void imageEnd() {
74
+ if (writer == null) {
75
+ return;
76
+ }
77
+ try {
78
+ writer.closeFile();
79
+ } catch (IOException e) {
80
+ UI.printError(Module.IMG, "I/O error occured while closing the display: %s", e.getMessage());
81
+ }
82
+ }
83
+ }
@@ -0,0 +1,97 @@
1
+ package org.sunflow.core.display;
2
+
3
+ import java.awt.Dimension;
4
+ import java.awt.Toolkit;
5
+ import java.awt.event.KeyAdapter;
6
+ import java.awt.event.KeyEvent;
7
+
8
+ import javax.swing.JFrame;
9
+
10
+ import org.sunflow.SunflowAPI;
11
+ import org.sunflow.core.Display;
12
+ import org.sunflow.image.Color;
13
+ import org.sunflow.system.ImagePanel;
14
+
15
+ public class FrameDisplay implements Display {
16
+
17
+ private String filename;
18
+ private RenderFrame frame;
19
+
20
+ public FrameDisplay() {
21
+ this(null);
22
+ }
23
+
24
+ public FrameDisplay(String filename) {
25
+ this.filename = filename;
26
+ frame = null;
27
+ }
28
+
29
+ @Override
30
+ public void imageBegin(int w, int h, int bucketSize) {
31
+ if (frame == null) {
32
+ frame = new RenderFrame();
33
+ frame.imagePanel.imageBegin(w, h, bucketSize);
34
+ Dimension screenRes = Toolkit.getDefaultToolkit().getScreenSize();
35
+ boolean needFit = false;
36
+ if (w >= (screenRes.getWidth() - 200) || h >= (screenRes.getHeight() - 200)) {
37
+ frame.imagePanel.setPreferredSize(new Dimension((int) screenRes.getWidth() - 200, (int) screenRes.getHeight() - 200));
38
+ needFit = true;
39
+ } else {
40
+ frame.imagePanel.setPreferredSize(new Dimension(w, h));
41
+ }
42
+ frame.pack();
43
+ frame.setLocationRelativeTo(null);
44
+ frame.setVisible(true);
45
+ if (needFit) {
46
+ frame.imagePanel.fit();
47
+ }
48
+ } else {
49
+ frame.imagePanel.imageBegin(w, h, bucketSize);
50
+ }
51
+ }
52
+
53
+ @Override
54
+ public void imagePrepare(int x, int y, int w, int h, int id) {
55
+ frame.imagePanel.imagePrepare(x, y, w, h, id);
56
+ }
57
+
58
+ @Override
59
+ public void imageUpdate(int x, int y, int w, int h, Color[] data, float[] alpha) {
60
+ frame.imagePanel.imageUpdate(x, y, w, h, data, alpha);
61
+ }
62
+
63
+ @Override
64
+ public void imageFill(int x, int y, int w, int h, Color c, float alpha) {
65
+ frame.imagePanel.imageFill(x, y, w, h, c, alpha);
66
+ }
67
+
68
+ @Override
69
+ public void imageEnd() {
70
+ frame.imagePanel.imageEnd();
71
+ if (filename != null) {
72
+ frame.imagePanel.save(filename);
73
+ }
74
+ }
75
+
76
+ @SuppressWarnings("serial")
77
+ private static class RenderFrame extends JFrame {
78
+
79
+ ImagePanel imagePanel;
80
+
81
+ RenderFrame() {
82
+ super("Sunflow v" + SunflowAPI.VERSION);
83
+ setDefaultCloseOperation(EXIT_ON_CLOSE);
84
+ addKeyListener(new KeyAdapter() {
85
+ @Override
86
+ public void keyPressed(KeyEvent e) {
87
+ if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
88
+ System.exit(0);
89
+ }
90
+ }
91
+ });
92
+ imagePanel = new ImagePanel();
93
+ setContentPane(imagePanel);
94
+ pack();
95
+ }
96
+ }
97
+ }
@@ -0,0 +1,109 @@
1
+ package org.sunflow.core.display;
2
+
3
+ import java.io.IOException;
4
+ import java.util.logging.Level;
5
+ import java.util.logging.Logger;
6
+
7
+ import javax.swing.JPanel;
8
+
9
+ import org.sunflow.core.Display;
10
+ import org.sunflow.image.Color;
11
+
12
+ @SuppressWarnings("serial")
13
+ public class ImgPipeDisplay extends JPanel implements Display {
14
+
15
+ private int ih;
16
+
17
+ /**
18
+ * Render to stdout using the imgpipe protocol used in mental image's
19
+ * imf_disp viewer. http://www.lamrug.org/resources/stubtips.html
20
+ */
21
+ public ImgPipeDisplay() {
22
+ }
23
+
24
+ @Override
25
+ public synchronized void imageBegin(int w, int h, int bucketSize) {
26
+ ih = h;
27
+ outputPacket(5, w, h, Float.floatToRawIntBits(1.0f), 0);
28
+ System.out.flush();
29
+ }
30
+
31
+ @Override
32
+ public synchronized void imagePrepare(int x, int y, int w, int h, int id) {
33
+ }
34
+
35
+ @Override
36
+ public synchronized void imageUpdate(int x, int y, int w, int h, Color[] data, float[] alpha) {
37
+ int xl = x;
38
+ int xh = x + w - 1;
39
+ int yl = ih - 1 - (y + h - 1);
40
+ int yh = ih - 1 - y;
41
+ outputPacket(2, xl, xh, yl, yh);
42
+ byte[] rgba = new byte[4 * (yh - yl + 1) * (xh - xl + 1)];
43
+ for (int j = 0, idx = 0; j < h; j++) {
44
+ for (int i = 0; i < w; i++, idx += 4) {
45
+ int rgb = data[(h - j - 1) * w + i].toNonLinear().toRGB();
46
+ int cr = (rgb >> 16) & 0xFF;
47
+ int cg = (rgb >> 8) & 0xFF;
48
+ int cb = rgb & 0xFF;
49
+ rgba[idx + 0] = (byte) (cr & 0xFF);
50
+ rgba[idx + 1] = (byte) (cg & 0xFF);
51
+ rgba[idx + 2] = (byte) (cb & 0xFF);
52
+ rgba[idx + 3] = (byte) (0xFF);
53
+ }
54
+ }
55
+ try {
56
+ System.out.write(rgba);
57
+ } catch (IOException ex) {
58
+ Logger.getLogger(ImgPipeDisplay.class.getName()).log(Level.SEVERE, null, ex);
59
+ }
60
+ }
61
+
62
+ @Override
63
+ public synchronized void imageFill(int x, int y, int w, int h, Color c, float alpha) {
64
+ int xl = x;
65
+ int xh = x + w - 1;
66
+ int yl = ih - 1 - (y + h - 1);
67
+ int yh = ih - 1 - y;
68
+ outputPacket(2, xl, xh, yl, yh);
69
+ int rgb = c.toNonLinear().toRGB();
70
+ int cr = (rgb >> 16) & 0xFF;
71
+ int cg = (rgb >> 8) & 0xFF;
72
+ int cb = rgb & 0xFF;
73
+ byte[] rgba = new byte[4 * (yh - yl + 1) * (xh - xl + 1)];
74
+ for (int j = 0, idx = 0; j < h; j++) {
75
+ for (int i = 0; i < w; i++, idx += 4) {
76
+ rgba[idx + 0] = (byte) (cr & 0xFF);
77
+ rgba[idx + 1] = (byte) (cg & 0xFF);
78
+ rgba[idx + 2] = (byte) (cb & 0xFF);
79
+ rgba[idx + 3] = (byte) (0xFF);
80
+ }
81
+ }
82
+ try {
83
+ System.out.write(rgba);
84
+ } catch (IOException ex) {
85
+ Logger.getLogger(ImgPipeDisplay.class.getName()).log(Level.SEVERE, null, ex);
86
+ }
87
+ }
88
+
89
+ @Override
90
+ public synchronized void imageEnd() {
91
+ outputPacket(4, 0, 0, 0, 0);
92
+ System.out.flush();
93
+ }
94
+
95
+ private void outputPacket(int type, int d0, int d1, int d2, int d3) {
96
+ outputInt32(type);
97
+ outputInt32(d0);
98
+ outputInt32(d1);
99
+ outputInt32(d2);
100
+ outputInt32(d3);
101
+ }
102
+
103
+ private void outputInt32(int i) {
104
+ System.out.write((i >> 24) & 0xFF);
105
+ System.out.write((i >> 16) & 0xFF);
106
+ System.out.write((i >> 8) & 0xFF);
107
+ System.out.write(i & 0xFF);
108
+ }
109
+ }
@@ -0,0 +1,28 @@
1
+ package org.sunflow.core.filter;
2
+
3
+ import org.sunflow.core.Filter;
4
+
5
+ public class BlackmanHarrisFilter implements Filter {
6
+
7
+ @Override
8
+ public float getSize() {
9
+ return 4.0f;
10
+ }
11
+
12
+ @Override
13
+ public float get(float x, float y) {
14
+ return bh1d(x * 0.5f) * bh1d(y * 0.5f);
15
+ }
16
+
17
+ private float bh1d(float x) {
18
+ if (x < -1.0f || x > 1.0f) {
19
+ return 0.0f;
20
+ }
21
+ x = (x + 1) * 0.5f;
22
+ final double A0 = 0.35875;
23
+ final double A1 = -0.48829;
24
+ final double A2 = 0.14128;
25
+ final double A3 = -0.01168;
26
+ return (float) (A0 + A1 * Math.cos(2 * Math.PI * x) + A2 * Math.cos(4 * Math.PI * x) + A3 * Math.cos(6 * Math.PI * x));
27
+ }
28
+ }
@@ -0,0 +1,16 @@
1
+ package org.sunflow.core.filter;
2
+
3
+ import org.sunflow.core.Filter;
4
+
5
+ public class BoxFilter implements Filter {
6
+
7
+ @Override
8
+ public float getSize() {
9
+ return 1.0f;
10
+ }
11
+
12
+ @Override
13
+ public float get(float x, float y) {
14
+ return 1.0f;
15
+ }
16
+ }
@@ -0,0 +1,29 @@
1
+ package org.sunflow.core.filter;
2
+
3
+ import org.sunflow.core.Filter;
4
+
5
+ public class CatmullRomFilter implements Filter {
6
+
7
+ @Override
8
+ public float getSize() {
9
+ return 4.0f;
10
+ }
11
+
12
+ @Override
13
+ public float get(float x, float y) {
14
+ return catrom1d(x) * catrom1d(y);
15
+ }
16
+
17
+ private float catrom1d(float x) {
18
+ x = Math.abs(x);
19
+ float x2 = x * x;
20
+ float x3 = x * x2;
21
+ if (x >= 2) {
22
+ return 0;
23
+ }
24
+ if (x < 1) {
25
+ return 3 * x3 - 5 * x2 + 2;
26
+ }
27
+ return -x3 + 5 * x2 - 8 * x + 4;
28
+ }
29
+ }
@@ -0,0 +1,32 @@
1
+ package org.sunflow.core.filter;
2
+
3
+ import org.sunflow.core.Filter;
4
+
5
+ public class CubicBSpline implements Filter {
6
+
7
+ @Override
8
+ public float get(float x, float y) {
9
+ return B3(x) * B3(y);
10
+ }
11
+
12
+ @Override
13
+ public float getSize() {
14
+ return 4.0f;
15
+ }
16
+
17
+ private float B3(float t) {
18
+ t = Math.abs(t);
19
+ if (t <= 1) {
20
+ return b1(1 - t);
21
+ }
22
+ return b0(2 - t);
23
+ }
24
+
25
+ private float b0(float t) {
26
+ return t * t * t * (1.0f / 6);
27
+ }
28
+
29
+ private float b1(float t) {
30
+ return (1.0f / 6) * (-3 * t * t * t + 3 * t * t + 3 * t + 1);
31
+ }
32
+ }
@@ -0,0 +1,24 @@
1
+ package org.sunflow.core.filter;
2
+
3
+ import org.sunflow.core.Filter;
4
+
5
+ public class GaussianFilter implements Filter {
6
+
7
+ private float es2;
8
+
9
+ public GaussianFilter() {
10
+ es2 = (float) -Math.exp(-getSize() * getSize());
11
+ }
12
+
13
+ @Override
14
+ public final float getSize() {
15
+ return 3.0f;
16
+ }
17
+
18
+ @Override
19
+ public float get(float x, float y) {
20
+ float gx = (float) Math.exp(-x * x) + es2;
21
+ float gy = (float) Math.exp(-y * y) + es2;
22
+ return gx * gy;
23
+ }
24
+ }
@@ -0,0 +1,30 @@
1
+ package org.sunflow.core.filter;
2
+
3
+ import org.sunflow.core.Filter;
4
+
5
+ public class LanczosFilter implements Filter {
6
+
7
+ @Override
8
+ public float getSize() {
9
+ return 4.0f;
10
+ }
11
+
12
+ @Override
13
+ public float get(float x, float y) {
14
+ return sinc1d(x * 0.5f) * sinc1d(y * 0.5f);
15
+ }
16
+
17
+ private float sinc1d(float x) {
18
+ x = Math.abs(x);
19
+ if (x < 1e-5f) {
20
+ return 1;
21
+ }
22
+ if (x > 1.0f) {
23
+ return 0;
24
+ }
25
+ x *= Math.PI;
26
+ float sinc = (float) Math.sin(3 * x) / (3 * x);
27
+ float lanczos = (float) Math.sin(x) / x;
28
+ return sinc * lanczos;
29
+ }
30
+ }