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,237 @@
|
|
|
1
|
+
package org.sunflow.core.tesselatable;
|
|
2
|
+
|
|
3
|
+
public class Teapot extends BezierMesh {
|
|
4
|
+
// teapot data, from: http://www.cs.ucsb.edu/~cs280/winter2004/hw2/
|
|
5
|
+
|
|
6
|
+
private static final float[][] PATCHES = {
|
|
7
|
+
{-80.00f, 0.00f, 30.00f, -80.00f, -44.80f, 30.00f, -44.80f,
|
|
8
|
+
-80.00f, 30.00f, 0.00f, -80.00f, 30.00f, -80.00f, 0.00f,
|
|
9
|
+
12.00f, -80.00f, -44.80f, 12.00f, -44.80f, -80.00f, 12.00f,
|
|
10
|
+
0.00f, -80.00f, 12.00f, -60.00f, 0.00f, 3.00f, -60.00f,
|
|
11
|
+
-33.60f, 3.00f, -33.60f, -60.00f, 3.00f, 0.00f, -60.00f,
|
|
12
|
+
3.00f, -60.00f, 0.00f, 0.00f, -60.00f, -33.60f, 0.00f,
|
|
13
|
+
-33.60f, -60.00f, 0.00f, 0.00f, -60.00f, 0.00f,},
|
|
14
|
+
{0.00f, -80.00f, 30.00f, 44.80f, -80.00f, 30.00f, 80.00f, -44.80f,
|
|
15
|
+
30.00f, 80.00f, 0.00f, 30.00f, 0.00f, -80.00f, 12.00f,
|
|
16
|
+
44.80f, -80.00f, 12.00f, 80.00f, -44.80f, 12.00f, 80.00f,
|
|
17
|
+
0.00f, 12.00f, 0.00f, -60.00f, 3.00f, 33.60f, -60.00f,
|
|
18
|
+
3.00f, 60.00f, -33.60f, 3.00f, 60.00f, 0.00f, 3.00f, 0.00f,
|
|
19
|
+
-60.00f, 0.00f, 33.60f, -60.00f, 0.00f, 60.00f, -33.60f,
|
|
20
|
+
0.00f, 60.00f, 0.00f, 0.00f,},
|
|
21
|
+
{-60.00f, 0.00f, 90.00f, -60.00f, -33.60f, 90.00f, -33.60f,
|
|
22
|
+
-60.00f, 90.00f, 0.00f, -60.00f, 90.00f, -70.00f, 0.00f,
|
|
23
|
+
69.00f, -70.00f, -39.20f, 69.00f, -39.20f, -70.00f, 69.00f,
|
|
24
|
+
0.00f, -70.00f, 69.00f, -80.00f, 0.00f, 48.00f, -80.00f,
|
|
25
|
+
-44.80f, 48.00f, -44.80f, -80.00f, 48.00f, 0.00f, -80.00f,
|
|
26
|
+
48.00f, -80.00f, 0.00f, 30.00f, -80.00f, -44.80f, 30.00f,
|
|
27
|
+
-44.80f, -80.00f, 30.00f, 0.00f, -80.00f, 30.00f,},
|
|
28
|
+
{0.00f, -60.00f, 90.00f, 33.60f, -60.00f, 90.00f, 60.00f, -33.60f,
|
|
29
|
+
90.00f, 60.00f, 0.00f, 90.00f, 0.00f, -70.00f, 69.00f,
|
|
30
|
+
39.20f, -70.00f, 69.00f, 70.00f, -39.20f, 69.00f, 70.00f,
|
|
31
|
+
0.00f, 69.00f, 0.00f, -80.00f, 48.00f, 44.80f, -80.00f,
|
|
32
|
+
48.00f, 80.00f, -44.80f, 48.00f, 80.00f, 0.00f, 48.00f,
|
|
33
|
+
0.00f, -80.00f, 30.00f, 44.80f, -80.00f, 30.00f, 80.00f,
|
|
34
|
+
-44.80f, 30.00f, 80.00f, 0.00f, 30.00f,},
|
|
35
|
+
{-56.00f, 0.00f, 90.00f, -56.00f, -31.36f, 90.00f, -31.36f,
|
|
36
|
+
-56.00f, 90.00f, 0.00f, -56.00f, 90.00f, -53.50f, 0.00f,
|
|
37
|
+
95.25f, -53.50f, -29.96f, 95.25f, -29.96f, -53.50f, 95.25f,
|
|
38
|
+
0.00f, -53.50f, 95.25f, -57.50f, 0.00f, 95.25f, -57.50f,
|
|
39
|
+
-32.20f, 95.25f, -32.20f, -57.50f, 95.25f, 0.00f, -57.50f,
|
|
40
|
+
95.25f, -60.00f, 0.00f, 90.00f, -60.00f, -33.60f, 90.00f,
|
|
41
|
+
-33.60f, -60.00f, 90.00f, 0.00f, -60.00f, 90.00f,},
|
|
42
|
+
{0.00f, -56.00f, 90.00f, 31.36f, -56.00f, 90.00f, 56.00f, -31.36f,
|
|
43
|
+
90.00f, 56.00f, 0.00f, 90.00f, 0.00f, -53.50f, 95.25f,
|
|
44
|
+
29.96f, -53.50f, 95.25f, 53.50f, -29.96f, 95.25f, 53.50f,
|
|
45
|
+
0.00f, 95.25f, 0.00f, -57.50f, 95.25f, 32.20f, -57.50f,
|
|
46
|
+
95.25f, 57.50f, -32.20f, 95.25f, 57.50f, 0.00f, 95.25f,
|
|
47
|
+
0.00f, -60.00f, 90.00f, 33.60f, -60.00f, 90.00f, 60.00f,
|
|
48
|
+
-33.60f, 90.00f, 60.00f, 0.00f, 90.00f,},
|
|
49
|
+
{80.00f, 0.00f, 30.00f, 80.00f, 44.80f, 30.00f, 44.80f, 80.00f,
|
|
50
|
+
30.00f, 0.00f, 80.00f, 30.00f, 80.00f, 0.00f, 12.00f,
|
|
51
|
+
80.00f, 44.80f, 12.00f, 44.80f, 80.00f, 12.00f, 0.00f,
|
|
52
|
+
80.00f, 12.00f, 60.00f, 0.00f, 3.00f, 60.00f, 33.60f,
|
|
53
|
+
3.00f, 33.60f, 60.00f, 3.00f, 0.00f, 60.00f, 3.00f, 60.00f,
|
|
54
|
+
0.00f, 0.00f, 60.00f, 33.60f, 0.00f, 33.60f, 60.00f, 0.00f,
|
|
55
|
+
0.00f, 60.00f, 0.00f,},
|
|
56
|
+
{0.00f, 80.00f, 30.00f, -44.80f, 80.00f, 30.00f, -80.00f, 44.80f,
|
|
57
|
+
30.00f, -80.00f, 0.00f, 30.00f, 0.00f, 80.00f, 12.00f,
|
|
58
|
+
-44.80f, 80.00f, 12.00f, -80.00f, 44.80f, 12.00f, -80.00f,
|
|
59
|
+
0.00f, 12.00f, 0.00f, 60.00f, 3.00f, -33.60f, 60.00f,
|
|
60
|
+
3.00f, -60.00f, 33.60f, 3.00f, -60.00f, 0.00f, 3.00f,
|
|
61
|
+
0.00f, 60.00f, 0.00f, -33.60f, 60.00f, 0.00f, -60.00f,
|
|
62
|
+
33.60f, 0.00f, -60.00f, 0.00f, 0.00f,},
|
|
63
|
+
{60.00f, 0.00f, 90.00f, 60.00f, 33.60f, 90.00f, 33.60f, 60.00f,
|
|
64
|
+
90.00f, 0.00f, 60.00f, 90.00f, 70.00f, 0.00f, 69.00f,
|
|
65
|
+
70.00f, 39.20f, 69.00f, 39.20f, 70.00f, 69.00f, 0.00f,
|
|
66
|
+
70.00f, 69.00f, 80.00f, 0.00f, 48.00f, 80.00f, 44.80f,
|
|
67
|
+
48.00f, 44.80f, 80.00f, 48.00f, 0.00f, 80.00f, 48.00f,
|
|
68
|
+
80.00f, 0.00f, 30.00f, 80.00f, 44.80f, 30.00f, 44.80f,
|
|
69
|
+
80.00f, 30.00f, 0.00f, 80.00f, 30.00f,},
|
|
70
|
+
{0.00f, 60.00f, 90.00f, -33.60f, 60.00f, 90.00f, -60.00f, 33.60f,
|
|
71
|
+
90.00f, -60.00f, 0.00f, 90.00f, 0.00f, 70.00f, 69.00f,
|
|
72
|
+
-39.20f, 70.00f, 69.00f, -70.00f, 39.20f, 69.00f, -70.00f,
|
|
73
|
+
0.00f, 69.00f, 0.00f, 80.00f, 48.00f, -44.80f, 80.00f,
|
|
74
|
+
48.00f, -80.00f, 44.80f, 48.00f, -80.00f, 0.00f, 48.00f,
|
|
75
|
+
0.00f, 80.00f, 30.00f, -44.80f, 80.00f, 30.00f, -80.00f,
|
|
76
|
+
44.80f, 30.00f, -80.00f, 0.00f, 30.00f,},
|
|
77
|
+
{56.00f, 0.00f, 90.00f, 56.00f, 31.36f, 90.00f, 31.36f, 56.00f,
|
|
78
|
+
90.00f, 0.00f, 56.00f, 90.00f, 53.50f, 0.00f, 95.25f,
|
|
79
|
+
53.50f, 29.96f, 95.25f, 29.96f, 53.50f, 95.25f, 0.00f,
|
|
80
|
+
53.50f, 95.25f, 57.50f, 0.00f, 95.25f, 57.50f, 32.20f,
|
|
81
|
+
95.25f, 32.20f, 57.50f, 95.25f, 0.00f, 57.50f, 95.25f,
|
|
82
|
+
60.00f, 0.00f, 90.00f, 60.00f, 33.60f, 90.00f, 33.60f,
|
|
83
|
+
60.00f, 90.00f, 0.00f, 60.00f, 90.00f,},
|
|
84
|
+
{0.00f, 56.00f, 90.00f, -31.36f, 56.00f, 90.00f, -56.00f, 31.36f,
|
|
85
|
+
90.00f, -56.00f, 0.00f, 90.00f, 0.00f, 53.50f, 95.25f,
|
|
86
|
+
-29.96f, 53.50f, 95.25f, -53.50f, 29.96f, 95.25f, -53.50f,
|
|
87
|
+
0.00f, 95.25f, 0.00f, 57.50f, 95.25f, -32.20f, 57.50f,
|
|
88
|
+
95.25f, -57.50f, 32.20f, 95.25f, -57.50f, 0.00f, 95.25f,
|
|
89
|
+
0.00f, 60.00f, 90.00f, -33.60f, 60.00f, 90.00f, -60.00f,
|
|
90
|
+
33.60f, 90.00f, -60.00f, 0.00f, 90.00f,},
|
|
91
|
+
{-64.00f, 0.00f, 75.00f, -64.00f, 12.00f, 75.00f, -60.00f, 12.00f,
|
|
92
|
+
84.00f, -60.00f, 0.00f, 84.00f, -92.00f, 0.00f, 75.00f,
|
|
93
|
+
-92.00f, 12.00f, 75.00f, -100.00f, 12.00f, 84.00f,
|
|
94
|
+
-100.00f, 0.00f, 84.00f, -108.00f, 0.00f, 75.00f, -108.00f,
|
|
95
|
+
12.00f, 75.00f, -120.00f, 12.00f, 84.00f, -120.00f, 0.00f,
|
|
96
|
+
84.00f, -108.00f, 0.00f, 66.00f, -108.00f, 12.00f, 66.00f,
|
|
97
|
+
-120.00f, 12.00f, 66.00f, -120.00f, 0.00f, 66.00f,},
|
|
98
|
+
{-60.00f, 0.00f, 84.00f, -60.00f, -12.00f, 84.00f, -64.00f,
|
|
99
|
+
-12.00f, 75.00f, -64.00f, 0.00f, 75.00f, -100.00f, 0.00f,
|
|
100
|
+
84.00f, -100.00f, -12.00f, 84.00f, -92.00f, -12.00f,
|
|
101
|
+
75.00f, -92.00f, 0.00f, 75.00f, -120.00f, 0.00f, 84.00f,
|
|
102
|
+
-120.00f, -12.00f, 84.00f, -108.00f, -12.00f, 75.00f,
|
|
103
|
+
-108.00f, 0.00f, 75.00f, -120.00f, 0.00f, 66.00f, -120.00f,
|
|
104
|
+
-12.00f, 66.00f, -108.00f, -12.00f, 66.00f, -108.00f,
|
|
105
|
+
0.00f, 66.00f,},
|
|
106
|
+
{-108.00f, 0.00f, 66.00f, -108.00f, 12.00f, 66.00f, -120.00f,
|
|
107
|
+
12.00f, 66.00f, -120.00f, 0.00f, 66.00f, -108.00f, 0.00f,
|
|
108
|
+
57.00f, -108.00f, 12.00f, 57.00f, -120.00f, 12.00f, 48.00f,
|
|
109
|
+
-120.00f, 0.00f, 48.00f, -100.00f, 0.00f, 39.00f, -100.00f,
|
|
110
|
+
12.00f, 39.00f, -106.00f, 12.00f, 31.50f, -106.00f, 0.00f,
|
|
111
|
+
31.50f, -80.00f, 0.00f, 30.00f, -80.00f, 12.00f, 30.00f,
|
|
112
|
+
-76.00f, 12.00f, 18.00f, -76.00f, 0.00f, 18.00f,},
|
|
113
|
+
{-120.00f, 0.00f, 66.00f, -120.00f, -12.00f, 66.00f, -108.00f,
|
|
114
|
+
-12.00f, 66.00f, -108.00f, 0.00f, 66.00f, -120.00f, 0.00f,
|
|
115
|
+
48.00f, -120.00f, -12.00f, 48.00f, -108.00f, -12.00f,
|
|
116
|
+
57.00f, -108.00f, 0.00f, 57.00f, -106.00f, 0.00f, 31.50f,
|
|
117
|
+
-106.00f, -12.00f, 31.50f, -100.00f, -12.00f, 39.00f,
|
|
118
|
+
-100.00f, 0.00f, 39.00f, -76.00f, 0.00f, 18.00f, -76.00f,
|
|
119
|
+
-12.00f, 18.00f, -80.00f, -12.00f, 30.00f, -80.00f, 0.00f,
|
|
120
|
+
30.00f,},
|
|
121
|
+
{68.00f, 0.00f, 51.00f, 68.00f, 26.40f, 51.00f, 68.00f, 26.40f,
|
|
122
|
+
18.00f, 68.00f, 0.00f, 18.00f, 104.00f, 0.00f, 51.00f,
|
|
123
|
+
104.00f, 26.40f, 51.00f, 124.00f, 26.40f, 27.00f, 124.00f,
|
|
124
|
+
0.00f, 27.00f, 92.00f, 0.00f, 78.00f, 92.00f, 10.00f,
|
|
125
|
+
78.00f, 96.00f, 10.00f, 75.00f, 96.00f, 0.00f, 75.00f,
|
|
126
|
+
108.00f, 0.00f, 90.00f, 108.00f, 10.00f, 90.00f, 132.00f,
|
|
127
|
+
10.00f, 90.00f, 132.00f, 0.00f, 90.00f,},
|
|
128
|
+
{68.00f, 0.00f, 18.00f, 68.00f, -26.40f, 18.00f, 68.00f, -26.40f,
|
|
129
|
+
51.00f, 68.00f, 0.00f, 51.00f, 124.00f, 0.00f, 27.00f,
|
|
130
|
+
124.00f, -26.40f, 27.00f, 104.00f, -26.40f, 51.00f,
|
|
131
|
+
104.00f, 0.00f, 51.00f, 96.00f, 0.00f, 75.00f, 96.00f,
|
|
132
|
+
-10.00f, 75.00f, 92.00f, -10.00f, 78.00f, 92.00f, 0.00f,
|
|
133
|
+
78.00f, 132.00f, 0.00f, 90.00f, 132.00f, -10.00f, 90.00f,
|
|
134
|
+
108.00f, -10.00f, 90.00f, 108.00f, 0.00f, 90.00f,},
|
|
135
|
+
{108.00f, 0.00f, 90.00f, 108.00f, 10.00f, 90.00f, 132.00f, 10.00f,
|
|
136
|
+
90.00f, 132.00f, 0.00f, 90.00f, 112.00f, 0.00f, 93.00f,
|
|
137
|
+
112.00f, 10.00f, 93.00f, 141.00f, 10.00f, 93.75f, 141.00f,
|
|
138
|
+
0.00f, 93.75f, 116.00f, 0.00f, 93.00f, 116.00f, 6.00f,
|
|
139
|
+
93.00f, 138.00f, 6.00f, 94.50f, 138.00f, 0.00f, 94.50f,
|
|
140
|
+
112.00f, 0.00f, 90.00f, 112.00f, 6.00f, 90.00f, 128.00f,
|
|
141
|
+
6.00f, 90.00f, 128.00f, 0.00f, 90.00f,},
|
|
142
|
+
{132.00f, 0.00f, 90.00f, 132.00f, -10.00f, 90.00f, 108.00f,
|
|
143
|
+
-10.00f, 90.00f, 108.00f, 0.00f, 90.00f, 141.00f, 0.00f,
|
|
144
|
+
93.75f, 141.00f, -10.00f, 93.75f, 112.00f, -10.00f, 93.00f,
|
|
145
|
+
112.00f, 0.00f, 93.00f, 138.00f, 0.00f, 94.50f, 138.00f,
|
|
146
|
+
-6.00f, 94.50f, 116.00f, -6.00f, 93.00f, 116.00f, 0.00f,
|
|
147
|
+
93.00f, 128.00f, 0.00f, 90.00f, 128.00f, -6.00f, 90.00f,
|
|
148
|
+
112.00f, -6.00f, 90.00f, 112.00f, 0.00f, 90.00f,},
|
|
149
|
+
{50.00f, 0.00f, 90.00f, 50.00f, 28.00f, 90.00f, 28.00f, 50.00f,
|
|
150
|
+
90.00f, 0.00f, 50.00f, 90.00f, 52.00f, 0.00f, 90.00f,
|
|
151
|
+
52.00f, 29.12f, 90.00f, 29.12f, 52.00f, 90.00f, 0.00f,
|
|
152
|
+
52.00f, 90.00f, 54.00f, 0.00f, 90.00f, 54.00f, 30.24f,
|
|
153
|
+
90.00f, 30.24f, 54.00f, 90.00f, 0.00f, 54.00f, 90.00f,
|
|
154
|
+
56.00f, 0.00f, 90.00f, 56.00f, 31.36f, 90.00f, 31.36f,
|
|
155
|
+
56.00f, 90.00f, 0.00f, 56.00f, 90.00f,},
|
|
156
|
+
{0.00f, 50.00f, 90.00f, -28.00f, 50.00f, 90.00f, -50.00f, 28.00f,
|
|
157
|
+
90.00f, -50.00f, 0.00f, 90.00f, 0.00f, 52.00f, 90.00f,
|
|
158
|
+
-29.12f, 52.00f, 90.00f, -52.00f, 29.12f, 90.00f, -52.00f,
|
|
159
|
+
0.00f, 90.00f, 0.00f, 54.00f, 90.00f, -30.24f, 54.00f,
|
|
160
|
+
90.00f, -54.00f, 30.24f, 90.00f, -54.00f, 0.00f, 90.00f,
|
|
161
|
+
0.00f, 56.00f, 90.00f, -31.36f, 56.00f, 90.00f, -56.00f,
|
|
162
|
+
31.36f, 90.00f, -56.00f, 0.00f, 90.00f,},
|
|
163
|
+
{-50.00f, 0.00f, 90.00f, -50.00f, -28.00f, 90.00f, -28.00f,
|
|
164
|
+
-50.00f, 90.00f, 0.00f, -50.00f, 90.00f, -52.00f, 0.00f,
|
|
165
|
+
90.00f, -52.00f, -29.12f, 90.00f, -29.12f, -52.00f, 90.00f,
|
|
166
|
+
0.00f, -52.00f, 90.00f, -54.00f, 0.00f, 90.00f, -54.00f,
|
|
167
|
+
-30.24f, 90.00f, -30.24f, -54.00f, 90.00f, 0.00f, -54.00f,
|
|
168
|
+
90.00f, -56.00f, 0.00f, 90.00f, -56.00f, -31.36f, 90.00f,
|
|
169
|
+
-31.36f, -56.00f, 90.00f, 0.00f, -56.00f, 90.00f,},
|
|
170
|
+
{0.00f, -50.00f, 90.00f, 28.00f, -50.00f, 90.00f, 50.00f, -28.00f,
|
|
171
|
+
90.00f, 50.00f, 0.00f, 90.00f, 0.00f, -52.00f, 90.00f,
|
|
172
|
+
29.12f, -52.00f, 90.00f, 52.00f, -29.12f, 90.00f, 52.00f,
|
|
173
|
+
0.00f, 90.00f, 0.00f, -54.00f, 90.00f, 30.24f, -54.00f,
|
|
174
|
+
90.00f, 54.00f, -30.24f, 90.00f, 54.00f, 0.00f, 90.00f,
|
|
175
|
+
0.00f, -56.00f, 90.00f, 31.36f, -56.00f, 90.00f, 56.00f,
|
|
176
|
+
-31.36f, 90.00f, 56.00f, 0.00f, 90.00f,},
|
|
177
|
+
{8.00f, 0.00f, 102.00f, 8.00f, 4.48f, 102.00f, 4.48f, 8.00f,
|
|
178
|
+
102.00f, 0.00f, 8.00f, 102.00f, 16.00f, 0.00f, 96.00f,
|
|
179
|
+
16.00f, 8.96f, 96.00f, 8.96f, 16.00f, 96.00f, 0.00f,
|
|
180
|
+
16.00f, 96.00f, 52.00f, 0.00f, 96.00f, 52.00f, 29.12f,
|
|
181
|
+
96.00f, 29.12f, 52.00f, 96.00f, 0.00f, 52.00f, 96.00f,
|
|
182
|
+
52.00f, 0.00f, 90.00f, 52.00f, 29.12f, 90.00f, 29.12f,
|
|
183
|
+
52.00f, 90.00f, 0.00f, 52.00f, 90.00f,},
|
|
184
|
+
{0.00f, 8.00f, 102.00f, -4.48f, 8.00f, 102.00f, -8.00f, 4.48f,
|
|
185
|
+
102.00f, -8.00f, 0.00f, 102.00f, 0.00f, 16.00f, 96.00f,
|
|
186
|
+
-8.96f, 16.00f, 96.00f, -16.00f, 8.96f, 96.00f, -16.00f,
|
|
187
|
+
0.00f, 96.00f, 0.00f, 52.00f, 96.00f, -29.12f, 52.00f,
|
|
188
|
+
96.00f, -52.00f, 29.12f, 96.00f, -52.00f, 0.00f, 96.00f,
|
|
189
|
+
0.00f, 52.00f, 90.00f, -29.12f, 52.00f, 90.00f, -52.00f,
|
|
190
|
+
29.12f, 90.00f, -52.00f, 0.00f, 90.00f,},
|
|
191
|
+
{-8.00f, 0.00f, 102.00f, -8.00f, -4.48f, 102.00f, -4.48f, -8.00f,
|
|
192
|
+
102.00f, 0.00f, -8.00f, 102.00f, -16.00f, 0.00f, 96.00f,
|
|
193
|
+
-16.00f, -8.96f, 96.00f, -8.96f, -16.00f, 96.00f, 0.00f,
|
|
194
|
+
-16.00f, 96.00f, -52.00f, 0.00f, 96.00f, -52.00f, -29.12f,
|
|
195
|
+
96.00f, -29.12f, -52.00f, 96.00f, 0.00f, -52.00f, 96.00f,
|
|
196
|
+
-52.00f, 0.00f, 90.00f, -52.00f, -29.12f, 90.00f, -29.12f,
|
|
197
|
+
-52.00f, 90.00f, 0.00f, -52.00f, 90.00f,},
|
|
198
|
+
{0.00f, -8.00f, 102.00f, 4.48f, -8.00f, 102.00f, 8.00f, -4.48f,
|
|
199
|
+
102.00f, 8.00f, 0.00f, 102.00f, 0.00f, -16.00f, 96.00f,
|
|
200
|
+
8.96f, -16.00f, 96.00f, 16.00f, -8.96f, 96.00f, 16.00f,
|
|
201
|
+
0.00f, 96.00f, 0.00f, -52.00f, 96.00f, 29.12f, -52.00f,
|
|
202
|
+
96.00f, 52.00f, -29.12f, 96.00f, 52.00f, 0.00f, 96.00f,
|
|
203
|
+
0.00f, -52.00f, 90.00f, 29.12f, -52.00f, 90.00f, 52.00f,
|
|
204
|
+
-29.12f, 90.00f, 52.00f, 0.00f, 90.00f,},
|
|
205
|
+
{0.00f, 0.00f, 120.00f, 0.00f, 0.00f, 120.00f, 0.00f, 0.00f,
|
|
206
|
+
120.00f, 0.00f, 0.00f, 120.00f, 32.00f, 0.00f, 120.00f,
|
|
207
|
+
32.00f, 18.00f, 120.00f, 18.00f, 32.00f, 120.00f, 0.00f,
|
|
208
|
+
32.00f, 120.00f, 0.00f, 0.00f, 108.00f, 0.00f, 0.00f,
|
|
209
|
+
108.00f, 0.00f, 0.00f, 108.00f, 0.00f, 0.00f, 108.00f,
|
|
210
|
+
8.00f, 0.00f, 102.00f, 8.00f, 4.48f, 102.00f, 4.48f, 8.00f,
|
|
211
|
+
102.00f, 0.00f, 8.00f, 102.00f,},
|
|
212
|
+
{0.00f, 0.00f, 120.00f, 0.00f, 0.00f, 120.00f, 0.00f, 0.00f,
|
|
213
|
+
120.00f, 0.00f, 0.00f, 120.00f, 0.00f, 32.00f, 120.00f,
|
|
214
|
+
-18.00f, 32.00f, 120.00f, -32.00f, 18.00f, 120.00f,
|
|
215
|
+
-32.00f, 0.00f, 120.00f, 0.00f, 0.00f, 108.00f, 0.00f,
|
|
216
|
+
0.00f, 108.00f, 0.00f, 0.00f, 108.00f, 0.00f, 0.00f,
|
|
217
|
+
108.00f, 0.00f, 8.00f, 102.00f, -4.48f, 8.00f, 102.00f,
|
|
218
|
+
-8.00f, 4.48f, 102.00f, -8.00f, 0.00f, 102.00f,},
|
|
219
|
+
{0.00f, 0.00f, 120.00f, 0.00f, 0.00f, 120.00f, 0.00f, 0.00f,
|
|
220
|
+
120.00f, 0.00f, 0.00f, 120.00f, -32.00f, 0.00f, 120.00f,
|
|
221
|
+
-32.00f, -18.00f, 120.00f, -18.00f, -32.00f, 120.00f,
|
|
222
|
+
0.00f, -32.00f, 120.00f, 0.00f, 0.00f, 108.00f, 0.00f,
|
|
223
|
+
0.00f, 108.00f, 0.00f, 0.00f, 108.00f, 0.00f, 0.00f,
|
|
224
|
+
108.00f, -8.00f, 0.00f, 102.00f, -8.00f, -4.48f, 102.00f,
|
|
225
|
+
-4.48f, -8.00f, 102.00f, 0.00f, -8.00f, 102.00f,},
|
|
226
|
+
{0.00f, 0.00f, 120.00f, 0.00f, 0.00f, 120.00f, 0.00f, 0.00f,
|
|
227
|
+
120.00f, 0.00f, 0.00f, 120.00f, 0.00f, -32.00f, 120.00f,
|
|
228
|
+
18.00f, -32.00f, 120.00f, 32.00f, -18.00f, 120.00f, 32.00f,
|
|
229
|
+
0.00f, 120.00f, 0.00f, 0.00f, 108.00f, 0.00f, 0.00f,
|
|
230
|
+
108.00f, 0.00f, 0.00f, 108.00f, 0.00f, 0.00f, 108.00f,
|
|
231
|
+
0.00f, -8.00f, 102.00f, 4.48f, -8.00f, 102.00f, 8.00f,
|
|
232
|
+
-4.48f, 102.00f, 8.00f, 0.00f, 102.00f,}};
|
|
233
|
+
|
|
234
|
+
public Teapot() {
|
|
235
|
+
super(PATCHES);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
package org.sunflow.image;
|
|
2
|
+
|
|
3
|
+
public abstract class Bitmap {
|
|
4
|
+
|
|
5
|
+
protected static final float INV255 = 1.0f / 255;
|
|
6
|
+
protected static final float INV65535 = 1.0f / 65535;
|
|
7
|
+
|
|
8
|
+
public abstract int getWidth();
|
|
9
|
+
|
|
10
|
+
public abstract int getHeight();
|
|
11
|
+
|
|
12
|
+
public abstract Color readColor(int x, int y);
|
|
13
|
+
|
|
14
|
+
public abstract float readAlpha(int x, int y);
|
|
15
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
package org.sunflow.image;
|
|
2
|
+
|
|
3
|
+
import java.io.IOException;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* This is a very simple interface, designed to handle loading of bitmap data.
|
|
7
|
+
*/
|
|
8
|
+
public interface BitmapReader {
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Load the specified filename. This method should throw exception if it
|
|
12
|
+
* encounters any errors. If the file is valid but its contents are not
|
|
13
|
+
* (invalid header for example), a {@link BitmapFormatException} may be
|
|
14
|
+
* thrown. It is an error for this method to return
|
|
15
|
+
* <code>null</code>.
|
|
16
|
+
*
|
|
17
|
+
* @param filename image filename to load
|
|
18
|
+
* @param isLinear if this is <code>true</code>, the bitmap is assumed to be
|
|
19
|
+
* already in linear space. This can be usefull when reading greyscale
|
|
20
|
+
* images for bump mapping for example. HDR formats can ignore this flag
|
|
21
|
+
* since they usually always store data in linear form.
|
|
22
|
+
* @return a new {@link Bitmap} object
|
|
23
|
+
* @throws java.io.IOException
|
|
24
|
+
* @throws org.sunflow.image.BitmapReader.BitmapFormatException
|
|
25
|
+
*/
|
|
26
|
+
public Bitmap load(String filename, boolean isLinear) throws IOException, BitmapFormatException;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* This exception can be used internally by bitmap readers to signal they
|
|
30
|
+
* have encountered a valid file but which contains invalid content.
|
|
31
|
+
*/
|
|
32
|
+
@SuppressWarnings("serial")
|
|
33
|
+
public static final class BitmapFormatException extends Exception {
|
|
34
|
+
|
|
35
|
+
public BitmapFormatException(String message) {
|
|
36
|
+
super(message);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
package org.sunflow.image;
|
|
2
|
+
|
|
3
|
+
import java.io.IOException;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* This interface is used to represents an image output format. The methods are
|
|
7
|
+
* tile oriented so that tiled image formats may be optimally supported. Note
|
|
8
|
+
* that if the header is declared with a 0 tile size, the image will not be
|
|
9
|
+
* written with identical sized tiles. The image should either be buffered so it
|
|
10
|
+
* can be written all at once on close, or an eror should be thrown. The bitmap
|
|
11
|
+
* writer should be designed so that it is thread safe. Specifically, this means
|
|
12
|
+
* that the tile writing method can be called by several threads.
|
|
13
|
+
*/
|
|
14
|
+
public interface BitmapWriter {
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* This method will be called before writing begins. It is used to set
|
|
18
|
+
* common attributes to file writers. Currently supported keywords include:
|
|
19
|
+
* <ul>
|
|
20
|
+
* <li>"compression"</li>
|
|
21
|
+
* <li>"channeltype": "byte", "short", "half", "float"</li>
|
|
22
|
+
* </ul>
|
|
23
|
+
* Note that this method should not fail if its input is not supported or
|
|
24
|
+
* invalid. It should gracefully ignore the error and keep its default
|
|
25
|
+
* state.
|
|
26
|
+
*
|
|
27
|
+
* @param option
|
|
28
|
+
* @param value
|
|
29
|
+
*/
|
|
30
|
+
public abstract void configure(String option, String value);
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Open a handle to the specified file for writing. If the writer buffers
|
|
34
|
+
* the image and writes it on close, then the filename should be stored.
|
|
35
|
+
*
|
|
36
|
+
* @param filename filename to write the bitmap to
|
|
37
|
+
* @throws IOException thrown if an I/O error occurs
|
|
38
|
+
*/
|
|
39
|
+
public abstract void openFile(String filename) throws IOException;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Write the bitmap header. This may be defered if the image is buffered for
|
|
43
|
+
* writing all at once on close. Note that if tile size is positive, data
|
|
44
|
+
* sent to this class is guarenteed to arrive in tiles of that size (except
|
|
45
|
+
* at borders). Otherwise, it should be assumed that the data is random, and
|
|
46
|
+
* that it may overlap. The writer should then either throw an error or
|
|
47
|
+
* start buffering data manually.
|
|
48
|
+
*
|
|
49
|
+
* @param width image width
|
|
50
|
+
* @param height image height
|
|
51
|
+
* @param tileSize tile size or 0 if the image will not be sent in tiled
|
|
52
|
+
* form
|
|
53
|
+
* @throws IOException thrown if an I/O error occurs
|
|
54
|
+
* @throws UnsupportedOperationException thrown if this writer does not
|
|
55
|
+
* support writing the image with the supplied tile size
|
|
56
|
+
*/
|
|
57
|
+
public abstract void writeHeader(int width, int height, int tileSize) throws IOException, UnsupportedOperationException;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Write a tile of data. Note that this method may be called by more than
|
|
61
|
+
* one thread, so it should be made thread-safe if possible.
|
|
62
|
+
*
|
|
63
|
+
* @param x tile x coordinate
|
|
64
|
+
* @param y tile y coordinate
|
|
65
|
+
* @param w tile width
|
|
66
|
+
* @param h tile height
|
|
67
|
+
* @param color color data
|
|
68
|
+
* @param alpha alpha data
|
|
69
|
+
* @throws IOException thrown if an I/O error occurs
|
|
70
|
+
*/
|
|
71
|
+
public abstract void writeTile(int x, int y, int w, int h, Color[] color, float[] alpha) throws IOException;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Close the file, this completes the bitmap writing process.
|
|
75
|
+
*
|
|
76
|
+
* @throws IOException thrown if an I/O error occurs
|
|
77
|
+
*/
|
|
78
|
+
public abstract void closeFile() throws IOException;
|
|
79
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
package org.sunflow.image;
|
|
2
|
+
|
|
3
|
+
public class BlackbodySpectrum extends SpectralCurve {
|
|
4
|
+
|
|
5
|
+
private final float temp;
|
|
6
|
+
|
|
7
|
+
public BlackbodySpectrum(float temp) {
|
|
8
|
+
this.temp = temp;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
@Override
|
|
12
|
+
public float sample(float lambda) {
|
|
13
|
+
double wavelength = lambda * 1e-9;
|
|
14
|
+
return (float) ((3.74183e-16 * Math.pow(wavelength, -5.0)) / (Math.exp(1.4388e-2 / (wavelength * temp)) - 1.0));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
package org.sunflow.image;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This spectral curve represents a given (x,y) chromaticity pair as explained
|
|
5
|
+
* in the sun/sky paper (section A.5)
|
|
6
|
+
*/
|
|
7
|
+
public final class ChromaticitySpectrum extends SpectralCurve {
|
|
8
|
+
|
|
9
|
+
private static final float[] S0_AMPLITUDES = {0.04f, 6.0f, 29.6f, 55.3f,
|
|
10
|
+
57.3f, 61.8f, 61.5f, 68.8f, 63.4f, 65.8f, 94.8f, 104.8f, 105.9f,
|
|
11
|
+
96.8f, 113.9f, 125.6f, 125.5f, 121.3f, 121.3f, 113.5f, 113.1f,
|
|
12
|
+
110.8f, 106.5f, 108.8f, 105.3f, 104.4f, 100.0f, 96.0f, 95.1f,
|
|
13
|
+
89.1f, 90.5f, 90.3f, 88.4f, 84.0f, 85.1f, 81.9f, 82.6f, 84.9f,
|
|
14
|
+
81.3f, 71.9f, 74.3f, 76.4f, 63.3f, 71.7f, 77.0f, 65.2f, 47.7f,
|
|
15
|
+
68.6f, 65.0f, 66.0f, 61.0f, 53.3f, 58.9f, 61.9f};
|
|
16
|
+
private static final float[] S1_AMPLITUDES = {0.02f, 4.5f, 22.4f, 42.0f,
|
|
17
|
+
40.6f, 41.6f, 38.0f, 42.4f, 38.5f, 35.0f, 43.4f, 46.3f, 43.9f,
|
|
18
|
+
37.1f, 36.7f, 35.9f, 32.6f, 27.9f, 24.3f, 20.1f, 16.2f, 13.2f,
|
|
19
|
+
8.6f, 6.1f, 4.2f, 1.9f, 0.0f, -1.6f, -3.5f, -3.5f, -5.8f, -7.2f,
|
|
20
|
+
-8.6f, -9.5f, -10.9f, -10.7f, -12.0f, -14.0f, -13.6f, -12.0f,
|
|
21
|
+
-13.3f, -12.9f, -10.6f, -11.6f, -12.2f, -10.2f, -7.8f, -11.2f,
|
|
22
|
+
-10.4f, -10.6f, -9.7f, -8.3f, -9.3f, -9.8f};
|
|
23
|
+
private static final float[] S2_AMPLITUDES = {0.0f, 2.0f, 4.0f, 8.5f, 7.8f,
|
|
24
|
+
6.7f, 5.3f, 6.1f, 3.0f, 1.2f, -1.1f, -0.5f, -0.7f, -1.2f, -2.6f,
|
|
25
|
+
-2.9f, -2.8f, -2.6f, -2.6f, -1.8f, -1.5f, -1.3f, -1.2f, -1.0f,
|
|
26
|
+
-0.5f, -0.3f, 0.0f, 0.2f, 0.5f, 2.1f, 3.2f, 4.1f, 4.7f, 5.1f, 6.7f,
|
|
27
|
+
7.3f, 8.6f, 9.8f, 10.2f, 8.3f, 9.6f, 8.5f, 7.0f, 7.6f, 8.0f, 6.7f,
|
|
28
|
+
5.2f, 7.4f, 6.8f, 7.0f, 6.4f, 5.5f, 6.1f, 6.5f};
|
|
29
|
+
private static final RegularSpectralCurve KS0_SPECTRUM = new RegularSpectralCurve(S0_AMPLITUDES, 300, 830);
|
|
30
|
+
private static final RegularSpectralCurve KS1_SPECTRUM = new RegularSpectralCurve(S1_AMPLITUDES, 300, 830);
|
|
31
|
+
private static final RegularSpectralCurve KS2_SPECTRUM = new RegularSpectralCurve(S2_AMPLITUDES, 300, 830);
|
|
32
|
+
private static final XYZColor S0_XYZ = KS0_SPECTRUM.toXYZ();
|
|
33
|
+
private static final XYZColor S1_XYZ = KS1_SPECTRUM.toXYZ();
|
|
34
|
+
private static final XYZColor S2_XYZ = KS2_SPECTRUM.toXYZ();
|
|
35
|
+
private final float M1, M2;
|
|
36
|
+
|
|
37
|
+
public ChromaticitySpectrum(float x, float y) {
|
|
38
|
+
M1 = (-1.3515f - 1.7703f * x + 5.9114f * y) / (0.0241f + 0.2562f * x - 0.7341f * y);
|
|
39
|
+
M2 = (0.03f - 31.4424f * x + 30.0717f * y) / (0.0241f + 0.2562f * x - 0.7341f * y);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@Override
|
|
43
|
+
public float sample(float lambda) {
|
|
44
|
+
return KS0_SPECTRUM.sample(lambda) + M1 * KS1_SPECTRUM.sample(lambda) + M2 * KS2_SPECTRUM.sample(lambda);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public static final XYZColor get(float x, float y) {
|
|
48
|
+
float M1 = (-1.3515f - 1.7703f * x + 5.9114f * y) / (0.0241f + 0.2562f * x - 0.7341f * y);
|
|
49
|
+
float M2 = (0.03f - 31.4424f * x + 30.0717f * y) / (0.0241f + 0.2562f * x - 0.7341f * y);
|
|
50
|
+
float X = S0_XYZ.getX() + M1 * S1_XYZ.getX() + M2 * S2_XYZ.getX();
|
|
51
|
+
float Y = S0_XYZ.getY() + M1 * S1_XYZ.getY() + M2 * S2_XYZ.getY();
|
|
52
|
+
float Z = S0_XYZ.getZ() + M1 * S1_XYZ.getZ() + M2 * S2_XYZ.getZ();
|
|
53
|
+
return new XYZColor(X, Y, Z);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
package org.sunflow.image;
|
|
2
|
+
|
|
3
|
+
import org.sunflow.math.MathUtils;
|
|
4
|
+
|
|
5
|
+
public final class Color {
|
|
6
|
+
|
|
7
|
+
private float r, g, b;
|
|
8
|
+
public static final RGBSpace NATIVE_SPACE = RGBSpace.SRGB;
|
|
9
|
+
public static final Color BLACK = new Color(0, 0, 0);
|
|
10
|
+
public static final Color WHITE = new Color(1, 1, 1);
|
|
11
|
+
public static final Color RED = new Color(1, 0, 0);
|
|
12
|
+
public static final Color GREEN = new Color(0, 1, 0);
|
|
13
|
+
public static final Color BLUE = new Color(0, 0, 1);
|
|
14
|
+
public static final Color YELLOW = new Color(1, 1, 0);
|
|
15
|
+
public static final Color CYAN = new Color(0, 1, 1);
|
|
16
|
+
public static final Color MAGENTA = new Color(1, 0, 1);
|
|
17
|
+
public static final Color GRAY = new Color(0.5f, 0.5f, 0.5f);
|
|
18
|
+
|
|
19
|
+
public static Color black() {
|
|
20
|
+
return new Color();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public static Color white() {
|
|
24
|
+
return new Color(1, 1, 1);
|
|
25
|
+
}
|
|
26
|
+
private static final float[] EXPONENT = new float[256];
|
|
27
|
+
|
|
28
|
+
static {
|
|
29
|
+
EXPONENT[0] = 0;
|
|
30
|
+
for (int i = 1; i < 256; i++) {
|
|
31
|
+
float f = 1.0f;
|
|
32
|
+
int e = i - (128 + 8);
|
|
33
|
+
if (e > 0) {
|
|
34
|
+
for (int j = 0; j < e; j++) {
|
|
35
|
+
f *= 2.0f;
|
|
36
|
+
}
|
|
37
|
+
} else {
|
|
38
|
+
for (int j = 0; j < -e; j++) {
|
|
39
|
+
f *= 0.5f;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
EXPONENT[i] = f;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public Color() {
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public Color(float gray) {
|
|
50
|
+
r = g = b = gray;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public Color(float r, float g, float b) {
|
|
54
|
+
this.r = r;
|
|
55
|
+
this.g = g;
|
|
56
|
+
this.b = b;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public Color toNonLinear() {
|
|
60
|
+
r = NATIVE_SPACE.gammaCorrect(r);
|
|
61
|
+
g = NATIVE_SPACE.gammaCorrect(g);
|
|
62
|
+
b = NATIVE_SPACE.gammaCorrect(b);
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public Color toLinear() {
|
|
67
|
+
r = NATIVE_SPACE.ungammaCorrect(r);
|
|
68
|
+
g = NATIVE_SPACE.ungammaCorrect(g);
|
|
69
|
+
b = NATIVE_SPACE.ungammaCorrect(b);
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public Color(Color c) {
|
|
74
|
+
r = c.r;
|
|
75
|
+
g = c.g;
|
|
76
|
+
b = c.b;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public Color(int rgb) {
|
|
80
|
+
r = ((rgb >> 16) & 0xFF) / 255.0f;
|
|
81
|
+
g = ((rgb >> 8) & 0xFF) / 255.0f;
|
|
82
|
+
b = (rgb & 0xFF) / 255.0f;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public Color copy() {
|
|
86
|
+
return new Color(this);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public final Color set(float r, float g, float b) {
|
|
90
|
+
this.r = r;
|
|
91
|
+
this.g = g;
|
|
92
|
+
this.b = b;
|
|
93
|
+
return this;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public final Color set(Color c) {
|
|
97
|
+
r = c.r;
|
|
98
|
+
g = c.g;
|
|
99
|
+
b = c.b;
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
public final Color setRGB(int rgb) {
|
|
104
|
+
r = ((rgb >> 16) & 0xFF) / 255.0f;
|
|
105
|
+
g = ((rgb >> 8) & 0xFF) / 255.0f;
|
|
106
|
+
b = (rgb & 0xFF) / 255.0f;
|
|
107
|
+
return this;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
public final Color setRGBE(int rgbe) {
|
|
111
|
+
float f = EXPONENT[rgbe & 0xFF];
|
|
112
|
+
r = f * ((rgbe >>> 24) + 0.5f);
|
|
113
|
+
g = f * (((rgbe >> 16) & 0xFF) + 0.5f);
|
|
114
|
+
b = f * (((rgbe >> 8) & 0xFF) + 0.5f);
|
|
115
|
+
return this;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public final boolean isBlack() {
|
|
119
|
+
return r <= 0 && g <= 0 && b <= 0;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
public final float getLuminance() {
|
|
123
|
+
return (0.2989f * r) + (0.5866f * g) + (0.1145f * b);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
public final float getMin() {
|
|
127
|
+
return MathUtils.min(r, g, b);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
public final float getMax() {
|
|
131
|
+
return MathUtils.max(r, g, b);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
public final float getAverage() {
|
|
135
|
+
return (r + g + b) / 3.0f;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
public final float[] getRGB() {
|
|
139
|
+
return new float[]{r, g, b};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
public final int toRGB() {
|
|
143
|
+
int ir = (int) (r * 255 + 0.5);
|
|
144
|
+
int ig = (int) (g * 255 + 0.5);
|
|
145
|
+
int ib = (int) (b * 255 + 0.5);
|
|
146
|
+
ir = MathUtils.clamp(ir, 0, 255);
|
|
147
|
+
ig = MathUtils.clamp(ig, 0, 255);
|
|
148
|
+
ib = MathUtils.clamp(ib, 0, 255);
|
|
149
|
+
return (ir << 16) | (ig << 8) | ib;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
public final int toRGBA(float a) {
|
|
153
|
+
int ir = (int) (r * 255 + 0.5);
|
|
154
|
+
int ig = (int) (g * 255 + 0.5);
|
|
155
|
+
int ib = (int) (b * 255 + 0.5);
|
|
156
|
+
int ia = (int) (a * 255 + 0.5);
|
|
157
|
+
ir = MathUtils.clamp(ir, 0, 255);
|
|
158
|
+
ig = MathUtils.clamp(ig, 0, 255);
|
|
159
|
+
ib = MathUtils.clamp(ib, 0, 255);
|
|
160
|
+
ia = MathUtils.clamp(ia, 0, 255);
|
|
161
|
+
return (ia << 24) | (ir << 16) | (ig << 8) | ib;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
public final int toRGBE() {
|
|
165
|
+
// encode the color into 32bits while preserving HDR using Ward's RGBE
|
|
166
|
+
// technique
|
|
167
|
+
float v = MathUtils.max(r, g, b);
|
|
168
|
+
if (v < 1e-32f) {
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// get mantissa and exponent
|
|
173
|
+
float m = v;
|
|
174
|
+
int e = 0;
|
|
175
|
+
if (v > 1.0f) {
|
|
176
|
+
while (m > 1.0f) {
|
|
177
|
+
m *= 0.5f;
|
|
178
|
+
e++;
|
|
179
|
+
}
|
|
180
|
+
} else if (v <= 0.5f) {
|
|
181
|
+
while (m <= 0.5f) {
|
|
182
|
+
m *= 2.0f;
|
|
183
|
+
e--;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
v = (m * 255.0f) / v;
|
|
187
|
+
int c = (e + 128);
|
|
188
|
+
c |= ((int) (r * v) << 24);
|
|
189
|
+
c |= ((int) (g * v) << 16);
|
|
190
|
+
c |= ((int) (b * v) << 8);
|
|
191
|
+
return c;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
public final Color constrainRGB() {
|
|
195
|
+
// clamp the RGB value to a representable value
|
|
196
|
+
float w = -MathUtils.min(0, r, g, b);
|
|
197
|
+
if (w > 0) {
|
|
198
|
+
r += w;
|
|
199
|
+
g += w;
|
|
200
|
+
b += w;
|
|
201
|
+
}
|
|
202
|
+
return this;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
public final boolean isNan() {
|
|
206
|
+
return Float.isNaN(r) || Float.isNaN(g) || Float.isNaN(b);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
public final boolean isInf() {
|
|
210
|
+
return Float.isInfinite(r) || Float.isInfinite(g) || Float.isInfinite(b);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
public final Color add(Color c) {
|
|
214
|
+
r += c.r;
|
|
215
|
+
g += c.g;
|
|
216
|
+
b += c.b;
|
|
217
|
+
return this;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
public static final Color add(Color c1, Color c2) {
|
|
221
|
+
return Color.add(c1, c2, new Color());
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
public static final Color add(Color c1, Color c2, Color dest) {
|
|
225
|
+
dest.r = c1.r + c2.r;
|
|
226
|
+
dest.g = c1.g + c2.g;
|
|
227
|
+
dest.b = c1.b + c2.b;
|
|
228
|
+
return dest;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
public final Color madd(float s, Color c) {
|
|
232
|
+
r += (s * c.r);
|
|
233
|
+
g += (s * c.g);
|
|
234
|
+
b += (s * c.b);
|
|
235
|
+
return this;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
public final Color madd(Color s, Color c) {
|
|
239
|
+
r += s.r * c.r;
|
|
240
|
+
g += s.g * c.g;
|
|
241
|
+
b += s.b * c.b;
|
|
242
|
+
return this;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
public final Color sub(Color c) {
|
|
246
|
+
r -= c.r;
|
|
247
|
+
g -= c.g;
|
|
248
|
+
b -= c.b;
|
|
249
|
+
return this;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
public static final Color sub(Color c1, Color c2) {
|
|
253
|
+
return Color.sub(c1, c2, new Color());
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
public static final Color sub(Color c1, Color c2, Color dest) {
|
|
257
|
+
dest.r = c1.r - c2.r;
|
|
258
|
+
dest.g = c1.g - c2.g;
|
|
259
|
+
dest.b = c1.b - c2.b;
|
|
260
|
+
return dest;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
public final Color mul(Color c) {
|
|
264
|
+
r *= c.r;
|
|
265
|
+
g *= c.g;
|
|
266
|
+
b *= c.b;
|
|
267
|
+
return this;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
public static final Color mul(Color c1, Color c2) {
|
|
271
|
+
return Color.mul(c1, c2, new Color());
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
public static final Color mul(Color c1, Color c2, Color dest) {
|
|
275
|
+
dest.r = c1.r * c2.r;
|
|
276
|
+
dest.g = c1.g * c2.g;
|
|
277
|
+
dest.b = c1.b * c2.b;
|
|
278
|
+
return dest;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
public final Color mul(float s) {
|
|
282
|
+
r *= s;
|
|
283
|
+
g *= s;
|
|
284
|
+
b *= s;
|
|
285
|
+
return this;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
public static final Color mul(float s, Color c) {
|
|
289
|
+
return Color.mul(s, c, new Color());
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
public static final Color mul(float s, Color c, Color dest) {
|
|
293
|
+
dest.r = s * c.r;
|
|
294
|
+
dest.g = s * c.g;
|
|
295
|
+
dest.b = s * c.b;
|
|
296
|
+
return dest;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
public final Color div(Color c) {
|
|
300
|
+
r /= c.r;
|
|
301
|
+
g /= c.g;
|
|
302
|
+
b /= c.b;
|
|
303
|
+
return this;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
public static final Color div(Color c1, Color c2) {
|
|
307
|
+
return Color.div(c1, c2, new Color());
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
public static final Color div(Color c1, Color c2, Color dest) {
|
|
311
|
+
dest.r = c1.r / c2.r;
|
|
312
|
+
dest.g = c1.g / c2.g;
|
|
313
|
+
dest.b = c1.b / c2.b;
|
|
314
|
+
return dest;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
public final Color exp() {
|
|
318
|
+
r = (float) Math.exp(r);
|
|
319
|
+
g = (float) Math.exp(g);
|
|
320
|
+
b = (float) Math.exp(b);
|
|
321
|
+
return this;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
public final Color opposite() {
|
|
325
|
+
r = 1 - r;
|
|
326
|
+
g = 1 - g;
|
|
327
|
+
b = 1 - b;
|
|
328
|
+
return this;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
public final Color clamp(float min, float max) {
|
|
332
|
+
r = MathUtils.clamp(r, min, max);
|
|
333
|
+
g = MathUtils.clamp(g, min, max);
|
|
334
|
+
b = MathUtils.clamp(b, min, max);
|
|
335
|
+
return this;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
public static final Color blend(Color c1, Color c2, float b) {
|
|
339
|
+
return blend(c1, c2, b, new Color());
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
public static final Color blend(Color c1, Color c2, float b, Color dest) {
|
|
343
|
+
dest.r = (1.0f - b) * c1.r + b * c2.r;
|
|
344
|
+
dest.g = (1.0f - b) * c1.g + b * c2.g;
|
|
345
|
+
dest.b = (1.0f - b) * c1.b + b * c2.b;
|
|
346
|
+
return dest;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
public static final Color blend(Color c1, Color c2, Color b) {
|
|
350
|
+
return blend(c1, c2, b, new Color());
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
public static final Color blend(Color c1, Color c2, Color b, Color dest) {
|
|
354
|
+
dest.r = (1.0f - b.r) * c1.r + b.r * c2.r;
|
|
355
|
+
dest.g = (1.0f - b.g) * c1.g + b.g * c2.g;
|
|
356
|
+
dest.b = (1.0f - b.b) * c1.b + b.b * c2.b;
|
|
357
|
+
return dest;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
public static final boolean hasContrast(Color c1, Color c2, float thresh) {
|
|
361
|
+
if (Math.abs(c1.r - c2.r) / (c1.r + c2.r) > thresh) {
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
if (Math.abs(c1.g - c2.g) / (c1.g + c2.g) > thresh) {
|
|
365
|
+
return true;
|
|
366
|
+
}
|
|
367
|
+
return (Math.abs(c1.b - c2.b) / (c1.b + c2.b) > thresh);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
@Override
|
|
371
|
+
public String toString() {
|
|
372
|
+
return String.format("(%.3f, %.3f, %.3f)", r, g, b);
|
|
373
|
+
}
|
|
374
|
+
}
|