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