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.
- checksums.yaml +7 -0
- data/.gitignore +53 -0
- data/.mvn/extensions.xml +8 -0
- data/CHANGELOG.md +2 -0
- data/Gemfile +6 -0
- data/LICENSE +674 -0
- data/README.md +2 -0
- data/Rakefile +43 -0
- data/docs/.gitignore +6 -0
- data/docs/_config.yml +20 -0
- data/docs/_includes/footer.html +38 -0
- data/docs/_includes/head.html +15 -0
- data/docs/_includes/header.html +27 -0
- data/docs/_includes/icon-github.html +1 -0
- data/docs/_includes/icon-github.svg +1 -0
- data/docs/_includes/icon-twitter.html +1 -0
- data/docs/_includes/icon-twitter.svg +1 -0
- data/docs/_layouts/default.html +20 -0
- data/docs/_layouts/page.html +14 -0
- data/docs/_layouts/post.html +15 -0
- data/docs/_posts/2017-01-08-animated_ray_tracing.md +72 -0
- data/docs/_posts/2017-01-08-welcome.md +78 -0
- data/docs/_sass/_base.scss +206 -0
- data/docs/_sass/_layout.scss +242 -0
- data/docs/_sass/_syntax-highlighting.scss +71 -0
- data/docs/about.md +12 -0
- data/docs/assets/Animation.ogv +0 -0
- data/docs/assets/Animation.png +0 -0
- data/docs/assets/basic.png +0 -0
- data/docs/assets/basic_traced.png +0 -0
- data/docs/css/main.scss +38 -0
- data/docs/favicon.ico +0 -0
- data/docs/feed.xml +30 -0
- data/docs/index.html +38 -0
- data/joonsrenderer.gemspec +23 -0
- data/lib/joonsrenderer.rb +12 -0
- data/lib/joonsrenderer/version.rb +3 -0
- data/pom.rb +75 -0
- data/pom.xml +163 -0
- data/src/main/java/SunflowGUI.java +1354 -0
- data/src/main/java/joons/JRFiller.java +79 -0
- data/src/main/java/joons/JRImagePanel.java +141 -0
- data/src/main/java/joons/JRRecorder.java +183 -0
- data/src/main/java/joons/JRStatics.java +199 -0
- data/src/main/java/joons/JoonsRenderer.java +837 -0
- data/src/main/java/org/sunflow/AsciiFileSunflowAPI.java +98 -0
- data/src/main/java/org/sunflow/Benchmark.java +313 -0
- data/src/main/java/org/sunflow/BinaryFileSunflowAPI.java +228 -0
- data/src/main/java/org/sunflow/FileSunflowAPI.java +354 -0
- data/src/main/java/org/sunflow/PluginRegistry.java +322 -0
- data/src/main/java/org/sunflow/RealtimeBenchmark.java +125 -0
- data/src/main/java/org/sunflow/RenderObjectMap.java +344 -0
- data/src/main/java/org/sunflow/SunflowAPI.java +762 -0
- data/src/main/java/org/sunflow/SunflowAPIInterface.java +277 -0
- data/src/main/java/org/sunflow/core/AccelerationStructure.java +20 -0
- data/src/main/java/org/sunflow/core/AccelerationStructureFactory.java +36 -0
- data/src/main/java/org/sunflow/core/BucketOrder.java +21 -0
- data/src/main/java/org/sunflow/core/Camera.java +125 -0
- data/src/main/java/org/sunflow/core/CameraLens.java +29 -0
- data/src/main/java/org/sunflow/core/CausticPhotonMapInterface.java +15 -0
- data/src/main/java/org/sunflow/core/Display.java +78 -0
- data/src/main/java/org/sunflow/core/Filter.java +27 -0
- data/src/main/java/org/sunflow/core/GIEngine.java +42 -0
- data/src/main/java/org/sunflow/core/Geometry.java +157 -0
- data/src/main/java/org/sunflow/core/GlobalPhotonMapInterface.java +21 -0
- data/src/main/java/org/sunflow/core/ImageSampler.java +26 -0
- data/src/main/java/org/sunflow/core/Instance.java +224 -0
- data/src/main/java/org/sunflow/core/InstanceList.java +83 -0
- data/src/main/java/org/sunflow/core/IntersectionState.java +120 -0
- data/src/main/java/org/sunflow/core/LightSample.java +104 -0
- data/src/main/java/org/sunflow/core/LightServer.java +382 -0
- data/src/main/java/org/sunflow/core/LightSource.java +67 -0
- data/src/main/java/org/sunflow/core/Modifier.java +16 -0
- data/src/main/java/org/sunflow/core/Options.java +20 -0
- data/src/main/java/org/sunflow/core/ParameterList.java +758 -0
- data/src/main/java/org/sunflow/core/PhotonStore.java +62 -0
- data/src/main/java/org/sunflow/core/PrimitiveList.java +70 -0
- data/src/main/java/org/sunflow/core/Ray.java +219 -0
- data/src/main/java/org/sunflow/core/RenderObject.java +25 -0
- data/src/main/java/org/sunflow/core/Scene.java +377 -0
- data/src/main/java/org/sunflow/core/SceneParser.java +58 -0
- data/src/main/java/org/sunflow/core/Shader.java +30 -0
- data/src/main/java/org/sunflow/core/ShadingCache.java +84 -0
- data/src/main/java/org/sunflow/core/ShadingState.java +939 -0
- data/src/main/java/org/sunflow/core/Statistics.java +85 -0
- data/src/main/java/org/sunflow/core/Tesselatable.java +36 -0
- data/src/main/java/org/sunflow/core/Texture.java +128 -0
- data/src/main/java/org/sunflow/core/TextureCache.java +48 -0
- data/src/main/java/org/sunflow/core/accel/BoundingIntervalHierarchy.java +652 -0
- data/src/main/java/org/sunflow/core/accel/KDTree.java +833 -0
- data/src/main/java/org/sunflow/core/accel/NullAccelerator.java +30 -0
- data/src/main/java/org/sunflow/core/accel/UniformGrid.java +329 -0
- data/src/main/java/org/sunflow/core/bucket/BucketOrderFactory.java +26 -0
- data/src/main/java/org/sunflow/core/bucket/ColumnBucketOrder.java +21 -0
- data/src/main/java/org/sunflow/core/bucket/DiagonalBucketOrder.java +28 -0
- data/src/main/java/org/sunflow/core/bucket/HilbertBucketOrder.java +65 -0
- data/src/main/java/org/sunflow/core/bucket/InvertedBucketOrder.java +28 -0
- data/src/main/java/org/sunflow/core/bucket/RandomBucketOrder.java +49 -0
- data/src/main/java/org/sunflow/core/bucket/RowBucketOrder.java +21 -0
- data/src/main/java/org/sunflow/core/bucket/SpiralBucketOrder.java +43 -0
- data/src/main/java/org/sunflow/core/camera/FisheyeLens.java +25 -0
- data/src/main/java/org/sunflow/core/camera/PinholeLens.java +43 -0
- data/src/main/java/org/sunflow/core/camera/SphericalLens.java +22 -0
- data/src/main/java/org/sunflow/core/camera/ThinLens.java +107 -0
- data/src/main/java/org/sunflow/core/display/FastDisplay.java +119 -0
- data/src/main/java/org/sunflow/core/display/FileDisplay.java +83 -0
- data/src/main/java/org/sunflow/core/display/FrameDisplay.java +97 -0
- data/src/main/java/org/sunflow/core/display/ImgPipeDisplay.java +109 -0
- data/src/main/java/org/sunflow/core/filter/BlackmanHarrisFilter.java +28 -0
- data/src/main/java/org/sunflow/core/filter/BoxFilter.java +16 -0
- data/src/main/java/org/sunflow/core/filter/CatmullRomFilter.java +29 -0
- data/src/main/java/org/sunflow/core/filter/CubicBSpline.java +32 -0
- data/src/main/java/org/sunflow/core/filter/GaussianFilter.java +24 -0
- data/src/main/java/org/sunflow/core/filter/LanczosFilter.java +30 -0
- data/src/main/java/org/sunflow/core/filter/MitchellFilter.java +28 -0
- data/src/main/java/org/sunflow/core/filter/SincFilter.java +25 -0
- data/src/main/java/org/sunflow/core/filter/TriangleFilter.java +16 -0
- data/src/main/java/org/sunflow/core/gi/AmbientOcclusionGIEngine.java +57 -0
- data/src/main/java/org/sunflow/core/gi/FakeGIEngine.java +48 -0
- data/src/main/java/org/sunflow/core/gi/InstantGI.java +194 -0
- data/src/main/java/org/sunflow/core/gi/IrradianceCacheGIEngine.java +268 -0
- data/src/main/java/org/sunflow/core/gi/PathTracingGIEngine.java +65 -0
- data/src/main/java/org/sunflow/core/light/DirectionalSpotlight.java +103 -0
- data/src/main/java/org/sunflow/core/light/ImageBasedLight.java +303 -0
- data/src/main/java/org/sunflow/core/light/PointLight.java +72 -0
- data/src/main/java/org/sunflow/core/light/SphereLight.java +166 -0
- data/src/main/java/org/sunflow/core/light/SunSkyLight.java +362 -0
- data/src/main/java/org/sunflow/core/light/TriangleMeshLight.java +296 -0
- data/src/main/java/org/sunflow/core/modifiers/BumpMappingModifier.java +37 -0
- data/src/main/java/org/sunflow/core/modifiers/NormalMapModifier.java +34 -0
- data/src/main/java/org/sunflow/core/modifiers/PerlinModifier.java +80 -0
- data/src/main/java/org/sunflow/core/parser/Keyword.java +39 -0
- data/src/main/java/org/sunflow/core/parser/RA2Parser.java +107 -0
- data/src/main/java/org/sunflow/core/parser/RA3Parser.java +68 -0
- data/src/main/java/org/sunflow/core/parser/SCAbstractParser.java +299 -0
- data/src/main/java/org/sunflow/core/parser/SCAsciiParser.java +251 -0
- data/src/main/java/org/sunflow/core/parser/SCBinaryParser.java +156 -0
- data/src/main/java/org/sunflow/core/parser/SCParser.java +1403 -0
- data/src/main/java/org/sunflow/core/parser/ShaveRibParser.java +174 -0
- data/src/main/java/org/sunflow/core/parser/TriParser.java +79 -0
- data/src/main/java/org/sunflow/core/photonmap/CausticPhotonMap.java +429 -0
- data/src/main/java/org/sunflow/core/photonmap/GlobalPhotonMap.java +530 -0
- data/src/main/java/org/sunflow/core/photonmap/GridPhotonMap.java +308 -0
- data/src/main/java/org/sunflow/core/primitive/Background.java +55 -0
- data/src/main/java/org/sunflow/core/primitive/BanchoffSurface.java +100 -0
- data/src/main/java/org/sunflow/core/primitive/Box.java +210 -0
- data/src/main/java/org/sunflow/core/primitive/CornellBox.java +476 -0
- data/src/main/java/org/sunflow/core/primitive/CubeGrid.java +318 -0
- data/src/main/java/org/sunflow/core/primitive/Cylinder.java +104 -0
- data/src/main/java/org/sunflow/core/primitive/Hair.java +275 -0
- data/src/main/java/org/sunflow/core/primitive/JuliaFractal.java +266 -0
- data/src/main/java/org/sunflow/core/primitive/ParticleSurface.java +114 -0
- data/src/main/java/org/sunflow/core/primitive/Plane.java +163 -0
- data/src/main/java/org/sunflow/core/primitive/QuadMesh.java +413 -0
- data/src/main/java/org/sunflow/core/primitive/Sphere.java +101 -0
- data/src/main/java/org/sunflow/core/primitive/SphereFlake.java +234 -0
- data/src/main/java/org/sunflow/core/primitive/Torus.java +145 -0
- data/src/main/java/org/sunflow/core/primitive/TriangleMesh.java +849 -0
- data/src/main/java/org/sunflow/core/renderer/BucketRenderer.java +491 -0
- data/src/main/java/org/sunflow/core/renderer/MultipassRenderer.java +237 -0
- data/src/main/java/org/sunflow/core/renderer/ProgressiveRenderer.java +171 -0
- data/src/main/java/org/sunflow/core/renderer/SimpleRenderer.java +106 -0
- data/src/main/java/org/sunflow/core/shader/AmbientOcclusionShader.java +53 -0
- data/src/main/java/org/sunflow/core/shader/AnisotropicWardShader.java +216 -0
- data/src/main/java/org/sunflow/core/shader/ConstantShader.java +31 -0
- data/src/main/java/org/sunflow/core/shader/DiffuseShader.java +65 -0
- data/src/main/java/org/sunflow/core/shader/GlassShader.java +147 -0
- data/src/main/java/org/sunflow/core/shader/IDShader.java +27 -0
- data/src/main/java/org/sunflow/core/shader/MirrorShader.java +68 -0
- data/src/main/java/org/sunflow/core/shader/NormalShader.java +32 -0
- data/src/main/java/org/sunflow/core/shader/PhongShader.java +89 -0
- data/src/main/java/org/sunflow/core/shader/PrimIDShader.java +30 -0
- data/src/main/java/org/sunflow/core/shader/QuickGrayShader.java +63 -0
- data/src/main/java/org/sunflow/core/shader/ShinyDiffuseShader.java +98 -0
- data/src/main/java/org/sunflow/core/shader/SimpleShader.java +24 -0
- data/src/main/java/org/sunflow/core/shader/TexturedAmbientOcclusionShader.java +31 -0
- data/src/main/java/org/sunflow/core/shader/TexturedDiffuseShader.java +31 -0
- data/src/main/java/org/sunflow/core/shader/TexturedPhongShader.java +31 -0
- data/src/main/java/org/sunflow/core/shader/TexturedShinyDiffuseShader.java +31 -0
- data/src/main/java/org/sunflow/core/shader/TexturedWardShader.java +31 -0
- data/src/main/java/org/sunflow/core/shader/UVShader.java +27 -0
- data/src/main/java/org/sunflow/core/shader/UberShader.java +149 -0
- data/src/main/java/org/sunflow/core/shader/ViewCausticsShader.java +33 -0
- data/src/main/java/org/sunflow/core/shader/ViewGlobalPhotonsShader.java +25 -0
- data/src/main/java/org/sunflow/core/shader/ViewIrradianceShader.java +25 -0
- data/src/main/java/org/sunflow/core/shader/WireframeShader.java +83 -0
- data/src/main/java/org/sunflow/core/tesselatable/BezierMesh.java +254 -0
- data/src/main/java/org/sunflow/core/tesselatable/FileMesh.java +251 -0
- data/src/main/java/org/sunflow/core/tesselatable/Gumbo.java +1147 -0
- data/src/main/java/org/sunflow/core/tesselatable/Teapot.java +237 -0
- data/src/main/java/org/sunflow/image/Bitmap.java +15 -0
- data/src/main/java/org/sunflow/image/BitmapReader.java +39 -0
- data/src/main/java/org/sunflow/image/BitmapWriter.java +79 -0
- data/src/main/java/org/sunflow/image/BlackbodySpectrum.java +16 -0
- data/src/main/java/org/sunflow/image/ChromaticitySpectrum.java +55 -0
- data/src/main/java/org/sunflow/image/Color.java +374 -0
- data/src/main/java/org/sunflow/image/ColorEncoder.java +94 -0
- data/src/main/java/org/sunflow/image/ColorFactory.java +122 -0
- data/src/main/java/org/sunflow/image/ConstantSpectralCurve.java +21 -0
- data/src/main/java/org/sunflow/image/IrregularSpectralCurve.java +57 -0
- data/src/main/java/org/sunflow/image/RGBSpace.java +207 -0
- data/src/main/java/org/sunflow/image/RegularSpectralCurve.java +30 -0
- data/src/main/java/org/sunflow/image/SpectralCurve.java +118 -0
- data/src/main/java/org/sunflow/image/XYZColor.java +50 -0
- data/src/main/java/org/sunflow/image/formats/BitmapBlack.java +27 -0
- data/src/main/java/org/sunflow/image/formats/BitmapG8.java +36 -0
- data/src/main/java/org/sunflow/image/formats/BitmapGA8.java +30 -0
- data/src/main/java/org/sunflow/image/formats/BitmapRGB8.java +40 -0
- data/src/main/java/org/sunflow/image/formats/BitmapRGBA8.java +40 -0
- data/src/main/java/org/sunflow/image/formats/BitmapRGBE.java +60 -0
- data/src/main/java/org/sunflow/image/formats/BitmapXYZ.java +38 -0
- data/src/main/java/org/sunflow/image/formats/GenericBitmap.java +73 -0
- data/src/main/java/org/sunflow/image/readers/BMPBitmapReader.java +39 -0
- data/src/main/java/org/sunflow/image/readers/HDRBitmapReader.java +155 -0
- data/src/main/java/org/sunflow/image/readers/IGIBitmapReader.java +104 -0
- data/src/main/java/org/sunflow/image/readers/JPGBitmapReader.java +39 -0
- data/src/main/java/org/sunflow/image/readers/PNGBitmapReader.java +40 -0
- data/src/main/java/org/sunflow/image/readers/TGABitmapReader.java +141 -0
- data/src/main/java/org/sunflow/image/writers/EXRBitmapWriter.java +395 -0
- data/src/main/java/org/sunflow/image/writers/HDRBitmapWriter.java +54 -0
- data/src/main/java/org/sunflow/image/writers/IGIBitmapWriter.java +75 -0
- data/src/main/java/org/sunflow/image/writers/PNGBitmapWriter.java +39 -0
- data/src/main/java/org/sunflow/image/writers/TGABitmapWriter.java +63 -0
- data/src/main/java/org/sunflow/math/BoundingBox.java +340 -0
- data/src/main/java/org/sunflow/math/MathUtils.java +159 -0
- data/src/main/java/org/sunflow/math/Matrix4.java +573 -0
- data/src/main/java/org/sunflow/math/MovingMatrix4.java +119 -0
- data/src/main/java/org/sunflow/math/OrthoNormalBasis.java +110 -0
- data/src/main/java/org/sunflow/math/PerlinScalar.java +331 -0
- data/src/main/java/org/sunflow/math/PerlinVector.java +132 -0
- data/src/main/java/org/sunflow/math/Point2.java +36 -0
- data/src/main/java/org/sunflow/math/Point3.java +133 -0
- data/src/main/java/org/sunflow/math/QMC.java +209 -0
- data/src/main/java/org/sunflow/math/Solvers.java +142 -0
- data/src/main/java/org/sunflow/math/Vector3.java +197 -0
- data/src/main/java/org/sunflow/system/BenchmarkFramework.java +73 -0
- data/src/main/java/org/sunflow/system/BenchmarkTest.java +17 -0
- data/src/main/java/org/sunflow/system/ByteUtil.java +119 -0
- data/src/main/java/org/sunflow/system/FileUtils.java +27 -0
- data/src/main/java/org/sunflow/system/ImagePanel.java +282 -0
- data/src/main/java/org/sunflow/system/Memory.java +18 -0
- data/src/main/java/org/sunflow/system/Parser.java +162 -0
- data/src/main/java/org/sunflow/system/Plugins.java +142 -0
- data/src/main/java/org/sunflow/system/RenderGlobalsPanel.java +209 -0
- data/src/main/java/org/sunflow/system/SearchPath.java +67 -0
- data/src/main/java/org/sunflow/system/Timer.java +53 -0
- data/src/main/java/org/sunflow/system/UI.java +112 -0
- data/src/main/java/org/sunflow/system/UserInterface.java +46 -0
- data/src/main/java/org/sunflow/system/ui/ConsoleInterface.java +48 -0
- data/src/main/java/org/sunflow/system/ui/SilentInterface.java +28 -0
- data/src/main/java/org/sunflow/util/FastHashMap.java +220 -0
- data/src/main/java/org/sunflow/util/FloatArray.java +77 -0
- data/src/main/java/org/sunflow/util/IntArray.java +77 -0
- data/src/test/java/a_maintest.java +129 -0
- 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
|
+
}
|