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,30 @@
|
|
|
1
|
+
package org.sunflow.image;
|
|
2
|
+
|
|
3
|
+
public class RegularSpectralCurve extends SpectralCurve {
|
|
4
|
+
|
|
5
|
+
private final float[] spectrum;
|
|
6
|
+
private final float lambdaMin, lambdaMax;
|
|
7
|
+
private final float delta, invDelta;
|
|
8
|
+
|
|
9
|
+
public RegularSpectralCurve(float[] spectrum, float lambdaMin, float lambdaMax) {
|
|
10
|
+
this.lambdaMin = lambdaMin;
|
|
11
|
+
this.lambdaMax = lambdaMax;
|
|
12
|
+
this.spectrum = spectrum;
|
|
13
|
+
delta = (lambdaMax - lambdaMin) / (spectrum.length - 1);
|
|
14
|
+
invDelta = 1 / delta;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@Override
|
|
18
|
+
public float sample(float lambda) {
|
|
19
|
+
// reject wavelengths outside the valid range
|
|
20
|
+
if (lambda < lambdaMin || lambda > lambdaMax) {
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
// interpolate the two closest samples linearly
|
|
24
|
+
float x = (lambda - lambdaMin) * invDelta;
|
|
25
|
+
int b0 = (int) x;
|
|
26
|
+
int b1 = Math.min(b0 + 1, spectrum.length - 1);
|
|
27
|
+
float dx = x - b0;
|
|
28
|
+
return (1 - dx) * spectrum[b0] + dx * spectrum[b1];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
package org.sunflow.image;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This class is an abstract interface to sampled or analytic spectral data.
|
|
5
|
+
*/
|
|
6
|
+
public abstract class SpectralCurve {
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* This function determines the actual spectral curve data. Note that the
|
|
10
|
+
* lambda parameter is assumed to be in nanometers.
|
|
11
|
+
*
|
|
12
|
+
* @param lambda wavelength to sample in nanometers
|
|
13
|
+
* @return the value of the spectral curve at this point
|
|
14
|
+
*/
|
|
15
|
+
public abstract float sample(float lambda);
|
|
16
|
+
private static final int WAVELENGTH_MIN = 360;
|
|
17
|
+
private static final int WAVELENGTH_MAX = 830;
|
|
18
|
+
private static final double[] CIE_XBAR = {0.000129900000, 0.000232100000,
|
|
19
|
+
0.000414900000, 0.000741600000, 0.001368000000, 0.002236000000,
|
|
20
|
+
0.004243000000, 0.007650000000, 0.014310000000, 0.023190000000,
|
|
21
|
+
0.043510000000, 0.077630000000, 0.134380000000, 0.214770000000,
|
|
22
|
+
0.283900000000, 0.328500000000, 0.348280000000, 0.348060000000,
|
|
23
|
+
0.336200000000, 0.318700000000, 0.290800000000, 0.251100000000,
|
|
24
|
+
0.195360000000, 0.142100000000, 0.095640000000, 0.057950010000,
|
|
25
|
+
0.032010000000, 0.014700000000, 0.004900000000, 0.002400000000,
|
|
26
|
+
0.009300000000, 0.029100000000, 0.063270000000, 0.109600000000,
|
|
27
|
+
0.165500000000, 0.225749900000, 0.290400000000, 0.359700000000,
|
|
28
|
+
0.433449900000, 0.512050100000, 0.594500000000, 0.678400000000,
|
|
29
|
+
0.762100000000, 0.842500000000, 0.916300000000, 0.978600000000,
|
|
30
|
+
1.026300000000, 1.056700000000, 1.062200000000, 1.045600000000,
|
|
31
|
+
1.002600000000, 0.938400000000, 0.854449900000, 0.751400000000,
|
|
32
|
+
0.642400000000, 0.541900000000, 0.447900000000, 0.360800000000,
|
|
33
|
+
0.283500000000, 0.218700000000, 0.164900000000, 0.121200000000,
|
|
34
|
+
0.087400000000, 0.063600000000, 0.046770000000, 0.032900000000,
|
|
35
|
+
0.022700000000, 0.015840000000, 0.011359160000, 0.008110916000,
|
|
36
|
+
0.005790346000, 0.004106457000, 0.002899327000, 0.002049190000,
|
|
37
|
+
0.001439971000, 0.000999949300, 0.000690078600, 0.000476021300,
|
|
38
|
+
0.000332301100, 0.000234826100, 0.000166150500, 0.000117413000,
|
|
39
|
+
0.000083075270, 0.000058706520, 0.000041509940, 0.000029353260,
|
|
40
|
+
0.000020673830, 0.000014559770, 0.000010253980, 0.000007221456,
|
|
41
|
+
0.000005085868, 0.000003581652, 0.000002522525, 0.000001776509,
|
|
42
|
+
0.000001251141,};
|
|
43
|
+
private static final double[] CIE_YBAR = {0.000003917000, 0.000006965000,
|
|
44
|
+
0.000012390000, 0.000022020000, 0.000039000000, 0.000064000000,
|
|
45
|
+
0.000120000000, 0.000217000000, 0.000396000000, 0.000640000000,
|
|
46
|
+
0.001210000000, 0.002180000000, 0.004000000000, 0.007300000000,
|
|
47
|
+
0.011600000000, 0.016840000000, 0.023000000000, 0.029800000000,
|
|
48
|
+
0.038000000000, 0.048000000000, 0.060000000000, 0.073900000000,
|
|
49
|
+
0.090980000000, 0.112600000000, 0.139020000000, 0.169300000000,
|
|
50
|
+
0.208020000000, 0.258600000000, 0.323000000000, 0.407300000000,
|
|
51
|
+
0.503000000000, 0.608200000000, 0.710000000000, 0.793200000000,
|
|
52
|
+
0.862000000000, 0.914850100000, 0.954000000000, 0.980300000000,
|
|
53
|
+
0.994950100000, 1.000000000000, 0.995000000000, 0.978600000000,
|
|
54
|
+
0.952000000000, 0.915400000000, 0.870000000000, 0.816300000000,
|
|
55
|
+
0.757000000000, 0.694900000000, 0.631000000000, 0.566800000000,
|
|
56
|
+
0.503000000000, 0.441200000000, 0.381000000000, 0.321000000000,
|
|
57
|
+
0.265000000000, 0.217000000000, 0.175000000000, 0.138200000000,
|
|
58
|
+
0.107000000000, 0.081600000000, 0.061000000000, 0.044580000000,
|
|
59
|
+
0.032000000000, 0.023200000000, 0.017000000000, 0.011920000000,
|
|
60
|
+
0.008210000000, 0.005723000000, 0.004102000000, 0.002929000000,
|
|
61
|
+
0.002091000000, 0.001484000000, 0.001047000000, 0.000740000000,
|
|
62
|
+
0.000520000000, 0.000361100000, 0.000249200000, 0.000171900000,
|
|
63
|
+
0.000120000000, 0.000084800000, 0.000060000000, 0.000042400000,
|
|
64
|
+
0.000030000000, 0.000021200000, 0.000014990000, 0.000010600000,
|
|
65
|
+
0.000007465700, 0.000005257800, 0.000003702900, 0.000002607800,
|
|
66
|
+
0.000001836600, 0.000001293400, 0.000000910930, 0.000000641530,
|
|
67
|
+
0.000000451810,};
|
|
68
|
+
private static final double[] CIE_ZBAR = {0.000606100000, 0.001086000000,
|
|
69
|
+
0.001946000000, 0.003486000000, 0.006450001000, 0.010549990000,
|
|
70
|
+
0.020050010000, 0.036210000000, 0.067850010000, 0.110200000000,
|
|
71
|
+
0.207400000000, 0.371300000000, 0.645600000000, 1.039050100000,
|
|
72
|
+
1.385600000000, 1.622960000000, 1.747060000000, 1.782600000000,
|
|
73
|
+
1.772110000000, 1.744100000000, 1.669200000000, 1.528100000000,
|
|
74
|
+
1.287640000000, 1.041900000000, 0.812950100000, 0.616200000000,
|
|
75
|
+
0.465180000000, 0.353300000000, 0.272000000000, 0.212300000000,
|
|
76
|
+
0.158200000000, 0.111700000000, 0.078249990000, 0.057250010000,
|
|
77
|
+
0.042160000000, 0.029840000000, 0.020300000000, 0.013400000000,
|
|
78
|
+
0.008749999000, 0.005749999000, 0.003900000000, 0.002749999000,
|
|
79
|
+
0.002100000000, 0.001800000000, 0.001650001000, 0.001400000000,
|
|
80
|
+
0.001100000000, 0.001000000000, 0.000800000000, 0.000600000000,
|
|
81
|
+
0.000340000000, 0.000240000000, 0.000190000000, 0.000100000000,
|
|
82
|
+
0.000049999990, 0.000030000000, 0.000020000000, 0.000010000000,
|
|
83
|
+
0.000000000000, 0.000000000000, 0.000000000000, 0.000000000000,
|
|
84
|
+
0.000000000000, 0.000000000000, 0.000000000000, 0.000000000000,
|
|
85
|
+
0.000000000000, 0.000000000000, 0.000000000000, 0.000000000000,
|
|
86
|
+
0.000000000000, 0.000000000000, 0.000000000000, 0.000000000000,
|
|
87
|
+
0.000000000000, 0.000000000000, 0.000000000000, 0.000000000000,
|
|
88
|
+
0.000000000000, 0.000000000000, 0.000000000000, 0.000000000000,
|
|
89
|
+
0.000000000000, 0.000000000000, 0.000000000000, 0.000000000000,
|
|
90
|
+
0.000000000000, 0.000000000000, 0.000000000000, 0.000000000000,
|
|
91
|
+
0.000000000000, 0.000000000000, 0.000000000000, 0.000000000000,
|
|
92
|
+
0.000000000000,};
|
|
93
|
+
private static final int WAVELENGTH_STEP = (WAVELENGTH_MAX - WAVELENGTH_MIN) / (CIE_XBAR.length - 1);
|
|
94
|
+
|
|
95
|
+
static {
|
|
96
|
+
if (WAVELENGTH_STEP * (CIE_XBAR.length - 1) != WAVELENGTH_MAX - WAVELENGTH_MIN) {
|
|
97
|
+
String err = String.format("Internal error - spectrum static data is inconsistent!\n * min = %d\n * max = %d\n * step = %d\n * num = %d", WAVELENGTH_MIN, WAVELENGTH_MAX, WAVELENGTH_STEP, CIE_XBAR.length);
|
|
98
|
+
throw new RuntimeException(err);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Convert this curve to a tristimulus CIE XYZ color by integrating against
|
|
104
|
+
* the CIE color matching functions.
|
|
105
|
+
*
|
|
106
|
+
* @return XYZColor that represents this spectra
|
|
107
|
+
*/
|
|
108
|
+
public final XYZColor toXYZ() {
|
|
109
|
+
float X = 0, Y = 0, Z = 0;
|
|
110
|
+
for (int i = 0, w = WAVELENGTH_MIN; i < CIE_XBAR.length; i++, w += WAVELENGTH_STEP) {
|
|
111
|
+
float s = sample(w);
|
|
112
|
+
X += s * CIE_XBAR[i];
|
|
113
|
+
Y += s * CIE_YBAR[i];
|
|
114
|
+
Z += s * CIE_ZBAR[i];
|
|
115
|
+
}
|
|
116
|
+
return new XYZColor(X, Y, Z).mul(WAVELENGTH_STEP);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
package org.sunflow.image;
|
|
2
|
+
|
|
3
|
+
public final class XYZColor {
|
|
4
|
+
|
|
5
|
+
private float X, Y, Z;
|
|
6
|
+
|
|
7
|
+
public XYZColor() {
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public XYZColor(float X, float Y, float Z) {
|
|
11
|
+
this.X = X;
|
|
12
|
+
this.Y = Y;
|
|
13
|
+
this.Z = Z;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public final float getX() {
|
|
17
|
+
return X;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public final float getY() {
|
|
21
|
+
return Y;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public final float getZ() {
|
|
25
|
+
return Z;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public final XYZColor mul(float s) {
|
|
29
|
+
X *= s;
|
|
30
|
+
Y *= s;
|
|
31
|
+
Z *= s;
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public final void normalize() {
|
|
36
|
+
float XYZ = X + Y + Z;
|
|
37
|
+
if (XYZ < 1e-6f) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
float s = 1 / XYZ;
|
|
41
|
+
X *= s;
|
|
42
|
+
Y *= s;
|
|
43
|
+
Z *= s;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@Override
|
|
47
|
+
public final String toString() {
|
|
48
|
+
return String.format("(%.3f, %.3f, %.3f)", X, Y, Z);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
package org.sunflow.image.formats;
|
|
2
|
+
|
|
3
|
+
import org.sunflow.image.Bitmap;
|
|
4
|
+
import org.sunflow.image.Color;
|
|
5
|
+
|
|
6
|
+
public class BitmapBlack extends Bitmap {
|
|
7
|
+
|
|
8
|
+
@Override
|
|
9
|
+
public int getWidth() {
|
|
10
|
+
return 1;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@Override
|
|
14
|
+
public int getHeight() {
|
|
15
|
+
return 1;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@Override
|
|
19
|
+
public Color readColor(int x, int y) {
|
|
20
|
+
return Color.BLACK;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@Override
|
|
24
|
+
public float readAlpha(int x, int y) {
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
package org.sunflow.image.formats;
|
|
2
|
+
|
|
3
|
+
import org.sunflow.image.Bitmap;
|
|
4
|
+
import org.sunflow.image.Color;
|
|
5
|
+
|
|
6
|
+
public class BitmapG8 extends Bitmap {
|
|
7
|
+
|
|
8
|
+
private int w, h;
|
|
9
|
+
private byte[] data;
|
|
10
|
+
|
|
11
|
+
public BitmapG8(int w, int h, byte[] data) {
|
|
12
|
+
this.w = w;
|
|
13
|
+
this.h = h;
|
|
14
|
+
this.data = data;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@Override
|
|
18
|
+
public int getWidth() {
|
|
19
|
+
return w;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@Override
|
|
23
|
+
public int getHeight() {
|
|
24
|
+
return h;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@Override
|
|
28
|
+
public Color readColor(int x, int y) {
|
|
29
|
+
return new Color((data[x + y * w] & 0xFF) * INV255);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@Override
|
|
33
|
+
public float readAlpha(int x, int y) {
|
|
34
|
+
return 1;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
package org.sunflow.image.formats;
|
|
2
|
+
|
|
3
|
+
import org.sunflow.image.Bitmap;
|
|
4
|
+
import org.sunflow.image.Color;
|
|
5
|
+
|
|
6
|
+
public class BitmapGA8 extends Bitmap {
|
|
7
|
+
|
|
8
|
+
private int w, h;
|
|
9
|
+
private byte[] data;
|
|
10
|
+
|
|
11
|
+
@Override
|
|
12
|
+
public int getWidth() {
|
|
13
|
+
return w;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@Override
|
|
17
|
+
public int getHeight() {
|
|
18
|
+
return h;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@Override
|
|
22
|
+
public Color readColor(int x, int y) {
|
|
23
|
+
return new Color((data[2 * (x + y * w) + 0] & 0xFF) * INV255);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@Override
|
|
27
|
+
public float readAlpha(int x, int y) {
|
|
28
|
+
return (data[2 * (x + y * w) + 1] & 0xFF) * INV255;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
package org.sunflow.image.formats;
|
|
2
|
+
|
|
3
|
+
import org.sunflow.image.Bitmap;
|
|
4
|
+
import org.sunflow.image.Color;
|
|
5
|
+
|
|
6
|
+
public class BitmapRGB8 extends Bitmap {
|
|
7
|
+
|
|
8
|
+
private int w, h;
|
|
9
|
+
private byte[] data;
|
|
10
|
+
|
|
11
|
+
public BitmapRGB8(int w, int h, byte[] data) {
|
|
12
|
+
this.w = w;
|
|
13
|
+
this.h = h;
|
|
14
|
+
this.data = data;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@Override
|
|
18
|
+
public int getWidth() {
|
|
19
|
+
return w;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@Override
|
|
23
|
+
public int getHeight() {
|
|
24
|
+
return h;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@Override
|
|
28
|
+
public Color readColor(int x, int y) {
|
|
29
|
+
int index = 3 * (x + y * w);
|
|
30
|
+
float r = (data[index + 0] & 0xFF) * INV255;
|
|
31
|
+
float g = (data[index + 1] & 0xFF) * INV255;
|
|
32
|
+
float b = (data[index + 2] & 0xFF) * INV255;
|
|
33
|
+
return new Color(r, g, b);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@Override
|
|
37
|
+
public float readAlpha(int x, int y) {
|
|
38
|
+
return 1;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
package org.sunflow.image.formats;
|
|
2
|
+
|
|
3
|
+
import org.sunflow.image.Bitmap;
|
|
4
|
+
import org.sunflow.image.Color;
|
|
5
|
+
|
|
6
|
+
public class BitmapRGBA8 extends Bitmap {
|
|
7
|
+
|
|
8
|
+
private int w, h;
|
|
9
|
+
private byte[] data;
|
|
10
|
+
|
|
11
|
+
public BitmapRGBA8(int w, int h, byte[] data) {
|
|
12
|
+
this.w = w;
|
|
13
|
+
this.h = h;
|
|
14
|
+
this.data = data;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@Override
|
|
18
|
+
public int getWidth() {
|
|
19
|
+
return w;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@Override
|
|
23
|
+
public int getHeight() {
|
|
24
|
+
return h;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@Override
|
|
28
|
+
public Color readColor(int x, int y) {
|
|
29
|
+
int index = 4 * (x + y * w);
|
|
30
|
+
float r = (data[index + 0] & 0xFF) * INV255;
|
|
31
|
+
float g = (data[index + 1] & 0xFF) * INV255;
|
|
32
|
+
float b = (data[index + 2] & 0xFF) * INV255;
|
|
33
|
+
return new Color(r, g, b);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@Override
|
|
37
|
+
public float readAlpha(int x, int y) {
|
|
38
|
+
return (data[4 * (x + y * w) + 3] & 0xFF) * INV255;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
package org.sunflow.image.formats;
|
|
2
|
+
|
|
3
|
+
import org.sunflow.image.Bitmap;
|
|
4
|
+
import org.sunflow.image.Color;
|
|
5
|
+
|
|
6
|
+
public class BitmapRGBE extends Bitmap {
|
|
7
|
+
|
|
8
|
+
private int w, h;
|
|
9
|
+
private int[] data;
|
|
10
|
+
private static final float[] EXPONENT = new float[256];
|
|
11
|
+
|
|
12
|
+
static {
|
|
13
|
+
EXPONENT[0] = 0;
|
|
14
|
+
for (int i = 1; i < 256; i++) {
|
|
15
|
+
float f = 1.0f;
|
|
16
|
+
int e = i - (128 + 8);
|
|
17
|
+
if (e > 0) {
|
|
18
|
+
for (int j = 0; j < e; j++) {
|
|
19
|
+
f *= 2.0f;
|
|
20
|
+
}
|
|
21
|
+
} else {
|
|
22
|
+
for (int j = 0; j < -e; j++) {
|
|
23
|
+
f *= 0.5f;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
EXPONENT[i] = f;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public BitmapRGBE(int w, int h, int[] data) {
|
|
31
|
+
this.w = w;
|
|
32
|
+
this.h = h;
|
|
33
|
+
this.data = data;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@Override
|
|
37
|
+
public int getWidth() {
|
|
38
|
+
return w;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@Override
|
|
42
|
+
public int getHeight() {
|
|
43
|
+
return h;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@Override
|
|
47
|
+
public Color readColor(int x, int y) {
|
|
48
|
+
int rgbe = data[x + y * w];
|
|
49
|
+
float f = EXPONENT[rgbe & 0xFF];
|
|
50
|
+
float r = f * ((rgbe >>> 24) + 0.5f);
|
|
51
|
+
float g = f * (((rgbe >> 16) & 0xFF) + 0.5f);
|
|
52
|
+
float b = f * (((rgbe >> 8) & 0xFF) + 0.5f);
|
|
53
|
+
return new Color(r, g, b);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@Override
|
|
57
|
+
public float readAlpha(int x, int y) {
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
package org.sunflow.image.formats;
|
|
2
|
+
|
|
3
|
+
import org.sunflow.image.Bitmap;
|
|
4
|
+
import org.sunflow.image.Color;
|
|
5
|
+
import org.sunflow.image.XYZColor;
|
|
6
|
+
|
|
7
|
+
public class BitmapXYZ extends Bitmap {
|
|
8
|
+
|
|
9
|
+
private int w, h;
|
|
10
|
+
private float[] data;
|
|
11
|
+
|
|
12
|
+
public BitmapXYZ(int w, int h, float[] data) {
|
|
13
|
+
this.w = w;
|
|
14
|
+
this.h = h;
|
|
15
|
+
this.data = data;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@Override
|
|
19
|
+
public int getWidth() {
|
|
20
|
+
return w;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@Override
|
|
24
|
+
public int getHeight() {
|
|
25
|
+
return h;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@Override
|
|
29
|
+
public Color readColor(int x, int y) {
|
|
30
|
+
int index = 3 * (x + y * w);
|
|
31
|
+
return Color.NATIVE_SPACE.convertXYZtoRGB(new XYZColor(data[index], data[index + 1], data[index + 2])).mul(0.1f);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@Override
|
|
35
|
+
public float readAlpha(int x, int y) {
|
|
36
|
+
return 1;
|
|
37
|
+
}
|
|
38
|
+
}
|