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,29 @@
|
|
|
1
|
+
package org.sunflow.core;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Represents a mapping from the 3D scene onto the final image. A camera lens is
|
|
5
|
+
* responsible for determining what ray to cast through each pixel.
|
|
6
|
+
*/
|
|
7
|
+
public interface CameraLens extends RenderObject {
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Create a new {@link Ray ray}to be cast through pixel (x,y) on the image
|
|
11
|
+
* plane. Two sampling parameters are provided for lens sampling. They are
|
|
12
|
+
* guarenteed to be in the interval [0,1). They can be used to perturb the
|
|
13
|
+
* position of the source of the ray on the lens of the camera for DOF
|
|
14
|
+
* effects. A third sampling parameter is provided for motion blur effects.
|
|
15
|
+
* Note that the {@link Camera} class already handles camera movement motion
|
|
16
|
+
* blur. Rays should be generated in camera space - that is, with the eye at
|
|
17
|
+
* the origin, looking down the -Z axis, with +Y pointing up.
|
|
18
|
+
*
|
|
19
|
+
* @param x x coordinate of the (sub)pixel
|
|
20
|
+
* @param y y coordinate of the (sub)pixel
|
|
21
|
+
* @param imageWidth image width in pixels
|
|
22
|
+
* @param imageHeight image height in pixels
|
|
23
|
+
* @param lensX x lens sampling parameter
|
|
24
|
+
* @param lensY y lens sampling parameter
|
|
25
|
+
* @param time time sampling parameter
|
|
26
|
+
* @return a new ray passing through the given pixel
|
|
27
|
+
*/
|
|
28
|
+
public Ray getRay(float x, float y, int imageWidth, int imageHeight, double lensX, double lensY, double time);
|
|
29
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
package org.sunflow.core;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This class is a generic interface to caustic photon mapping capabilities.
|
|
5
|
+
*/
|
|
6
|
+
public interface CausticPhotonMapInterface extends PhotonStore {
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Retrieve caustic photons at the specified shading location and add them
|
|
10
|
+
* as diffuse light samples.
|
|
11
|
+
*
|
|
12
|
+
* @param state
|
|
13
|
+
*/
|
|
14
|
+
void getSamples(ShadingState state);
|
|
15
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
package org.sunflow.core;
|
|
2
|
+
|
|
3
|
+
import org.sunflow.image.Color;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Represents an image output device.
|
|
7
|
+
*/
|
|
8
|
+
public interface Display {
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* This is called before an image is rendered to indicate how large the
|
|
12
|
+
* rendered image will be. This allows the display driver to write out image
|
|
13
|
+
* headers or allocate surfaces. Bucket size will be 0 when called from a
|
|
14
|
+
* non-bucket based source.
|
|
15
|
+
*
|
|
16
|
+
* @param w width of the rendered image in pixels
|
|
17
|
+
* @param h height of the rendered image in pixels
|
|
18
|
+
* @param bucketSize size of the buckets in pixels
|
|
19
|
+
*/
|
|
20
|
+
void imageBegin(int w, int h, int bucketSize);
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Prepare the specified area to be rendered. This may be used to highlight
|
|
24
|
+
* the work in progress area or simply to setup the display driver to
|
|
25
|
+
* receive the specified portion of the image
|
|
26
|
+
*
|
|
27
|
+
* @param x x coordinate of the bucket within the image
|
|
28
|
+
* @param y y coordinate of the bucket within the image
|
|
29
|
+
* @param w width of the bucket in pixels
|
|
30
|
+
* @param h height of the bucket in pixels
|
|
31
|
+
* @param id unique identifier corresponding to the thread which invoked
|
|
32
|
+
* this call
|
|
33
|
+
*/
|
|
34
|
+
void imagePrepare(int x, int y, int w, int h, int id);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Update the current image with a bucket of data. The region is guarenteed
|
|
38
|
+
* to be within the bounds created by the call to imageBegin. No clipping is
|
|
39
|
+
* necessary. Colors are passed in unprocessed. It is up the display driver
|
|
40
|
+
* to do any type of quantization, gamma compensation or tone-mapping
|
|
41
|
+
* needed. The array of colors will be exactly
|
|
42
|
+
* <code>w * h</code> long and in row major order.
|
|
43
|
+
*
|
|
44
|
+
* @param x x coordinate of the bucket within the image
|
|
45
|
+
* @param y y coordinate of the bucket within the image
|
|
46
|
+
* @param w width of the bucket in pixels
|
|
47
|
+
* @param h height of the bucket in pixels
|
|
48
|
+
* @param data bucket data, this array will be exactly <code>w * h</code>
|
|
49
|
+
* long
|
|
50
|
+
* @param alpha pixel coverage data, this array will be exactly
|
|
51
|
+
* <code>w * h</code> long
|
|
52
|
+
*/
|
|
53
|
+
void imageUpdate(int x, int y, int w, int h, Color[] data, float[] alpha);
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Update the current image with a region of flat color. This is used by
|
|
57
|
+
* progressive rendering to render progressively smaller regions of the
|
|
58
|
+
* screen which will overlap. The region is guarenteed to be within the
|
|
59
|
+
* bounds created by the call to imageBegin. No clipping is necessary.
|
|
60
|
+
* Colors are passed in unprocessed. It is up the display driver to do any
|
|
61
|
+
* type of quantization , gamma compensation or tone-mapping needed.
|
|
62
|
+
*
|
|
63
|
+
* @param x x coordinate of the region within the image
|
|
64
|
+
* @param y y coordinate of the region within the image
|
|
65
|
+
* @param w with of the region in pixels
|
|
66
|
+
* @param h height of the region in pixels
|
|
67
|
+
* @param c color to fill the region with
|
|
68
|
+
* @param alpha pixel coverage
|
|
69
|
+
*/
|
|
70
|
+
void imageFill(int x, int y, int w, int h, Color c, float alpha);
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* This call is made after the image has been rendered. This allows the
|
|
74
|
+
* display driver to close any open files, write the image to disk or flush
|
|
75
|
+
* any other type of buffers.
|
|
76
|
+
*/
|
|
77
|
+
void imageEnd();
|
|
78
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
package org.sunflow.core;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Represents a multi-pixel image filter kernel.
|
|
5
|
+
*/
|
|
6
|
+
public interface Filter {
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Width in pixels of the filter extents. The filter will be applied to the
|
|
10
|
+
* range of pixels within a box of
|
|
11
|
+
* <code>+/- getSize() / 2</code> around the center of the pixel.
|
|
12
|
+
*
|
|
13
|
+
* @return width in pixels
|
|
14
|
+
*/
|
|
15
|
+
public float getSize();
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Get value of the filter at offset (x, y). The filter should never be
|
|
19
|
+
* called with values beyond its extents but should return 0 in those cases
|
|
20
|
+
* anyway.
|
|
21
|
+
*
|
|
22
|
+
* @param x x offset in pixels
|
|
23
|
+
* @param y y offset in pixels
|
|
24
|
+
* @return value of the filter at the specified location
|
|
25
|
+
*/
|
|
26
|
+
public float get(float x, float y);
|
|
27
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
package org.sunflow.core;
|
|
2
|
+
|
|
3
|
+
import org.sunflow.image.Color;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* This represents a global illumination algorithm. It provides an interface to
|
|
7
|
+
* compute indirect diffuse bounces of light and make those results available to
|
|
8
|
+
* shaders.
|
|
9
|
+
*/
|
|
10
|
+
public interface GIEngine {
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* This is an optional method for engines that contain a secondary
|
|
14
|
+
* illumination engine which can return an approximation of the global
|
|
15
|
+
* radiance in the scene (like a photon map). Engines can safely return
|
|
16
|
+
* <code>Color.BLACK</code> if they can't or don't wish to support this.
|
|
17
|
+
*
|
|
18
|
+
* @param state shading state
|
|
19
|
+
* @return color approximating global radiance
|
|
20
|
+
*/
|
|
21
|
+
public Color getGlobalRadiance(ShadingState state);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Initialize the engine. This is called before rendering begins.
|
|
25
|
+
*
|
|
26
|
+
* @return <code>true</code> if the init phase succeeded, <code>false</code>
|
|
27
|
+
* otherwise
|
|
28
|
+
*/
|
|
29
|
+
public boolean init(Options options, Scene scene);
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Return the incomming irradiance due to indirect diffuse illumination at
|
|
33
|
+
* the specified surface point.
|
|
34
|
+
*
|
|
35
|
+
* @param state current render state describing the point to be computed
|
|
36
|
+
* @param diffuseReflectance diffuse albedo of the point being shaded, this
|
|
37
|
+
* can be used for importance tracking
|
|
38
|
+
* @return irradiance from indirect diffuse illumination at the specified
|
|
39
|
+
* point
|
|
40
|
+
*/
|
|
41
|
+
public Color getIrradiance(ShadingState state, Color diffuseReflectance);
|
|
42
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
package org.sunflow.core;
|
|
2
|
+
|
|
3
|
+
import org.sunflow.SunflowAPI;
|
|
4
|
+
import org.sunflow.core.accel.NullAccelerator;
|
|
5
|
+
import org.sunflow.math.BoundingBox;
|
|
6
|
+
import org.sunflow.math.Matrix4;
|
|
7
|
+
import org.sunflow.system.UI;
|
|
8
|
+
import org.sunflow.system.UI.Module;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* This class represent a geometric object in its native object space. These
|
|
12
|
+
* object are not rendered directly, they must be instanced via
|
|
13
|
+
* {@link Instance}. This class performs all the bookkeeping needed for
|
|
14
|
+
* on-demand tesselation and acceleration structure building.
|
|
15
|
+
*/
|
|
16
|
+
public class Geometry implements RenderObject {
|
|
17
|
+
|
|
18
|
+
private Tesselatable tesselatable;
|
|
19
|
+
private PrimitiveList primitives;
|
|
20
|
+
private AccelerationStructure accel;
|
|
21
|
+
private int builtAccel;
|
|
22
|
+
private int builtTess;
|
|
23
|
+
private String acceltype;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Create a geometry from the specified tesselatable object. The actual
|
|
27
|
+
* renderable primitives will be generated on demand.
|
|
28
|
+
*
|
|
29
|
+
* @param tesselatable tesselation object
|
|
30
|
+
*/
|
|
31
|
+
public Geometry(Tesselatable tesselatable) {
|
|
32
|
+
this.tesselatable = tesselatable;
|
|
33
|
+
primitives = null;
|
|
34
|
+
accel = null;
|
|
35
|
+
builtAccel = 0;
|
|
36
|
+
builtTess = 0;
|
|
37
|
+
acceltype = null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Create a geometry from the specified primitive aggregate. The
|
|
42
|
+
* acceleration structure for this object will be built on demand.
|
|
43
|
+
*
|
|
44
|
+
* @param primitives primitive list object
|
|
45
|
+
*/
|
|
46
|
+
public Geometry(PrimitiveList primitives) {
|
|
47
|
+
tesselatable = null;
|
|
48
|
+
this.primitives = primitives;
|
|
49
|
+
accel = null;
|
|
50
|
+
builtAccel = 0;
|
|
51
|
+
builtTess = 1; // already tesselated
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@Override
|
|
55
|
+
public boolean update(ParameterList pl, SunflowAPI api) {
|
|
56
|
+
acceltype = pl.getString("accel", acceltype);
|
|
57
|
+
// clear up old tesselation if it exists
|
|
58
|
+
if (tesselatable != null) {
|
|
59
|
+
primitives = null;
|
|
60
|
+
builtTess = 0;
|
|
61
|
+
}
|
|
62
|
+
// clear acceleration structure so it will be rebuilt
|
|
63
|
+
accel = null;
|
|
64
|
+
builtAccel = 0;
|
|
65
|
+
if (tesselatable != null) {
|
|
66
|
+
return tesselatable.update(pl, api);
|
|
67
|
+
}
|
|
68
|
+
// update primitives
|
|
69
|
+
return primitives.update(pl, api);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
int getNumPrimitives() {
|
|
73
|
+
return primitives == null ? 0 : primitives.getNumPrimitives();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
BoundingBox getWorldBounds(Matrix4 o2w) {
|
|
77
|
+
if (primitives == null) {
|
|
78
|
+
|
|
79
|
+
BoundingBox b = tesselatable.getWorldBounds(o2w);
|
|
80
|
+
if (b != null) {
|
|
81
|
+
return b;
|
|
82
|
+
}
|
|
83
|
+
if (builtTess == 0) {
|
|
84
|
+
tesselate();
|
|
85
|
+
}
|
|
86
|
+
if (primitives == null) {
|
|
87
|
+
return null; // failed tesselation, return infinite bounding
|
|
88
|
+
} // box
|
|
89
|
+
}
|
|
90
|
+
return primitives.getWorldBounds(o2w);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
void intersect(Ray r, IntersectionState state) {
|
|
94
|
+
if (builtTess == 0) {
|
|
95
|
+
tesselate();
|
|
96
|
+
}
|
|
97
|
+
if (builtAccel == 0) {
|
|
98
|
+
build();
|
|
99
|
+
}
|
|
100
|
+
accel.intersect(r, state);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
private synchronized void tesselate() {
|
|
104
|
+
// double check flag
|
|
105
|
+
if (builtTess != 0) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (tesselatable != null && primitives == null) {
|
|
109
|
+
UI.printInfo(Module.GEOM, "Tesselating geometry ...");
|
|
110
|
+
primitives = tesselatable.tesselate();
|
|
111
|
+
if (primitives == null) {
|
|
112
|
+
UI.printError(Module.GEOM, "Tesselation failed - geometry will be discarded");
|
|
113
|
+
} else {
|
|
114
|
+
UI.printDetailed(Module.GEOM, "Tesselation produced %d primitives", primitives.getNumPrimitives());
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
builtTess = 1;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private synchronized void build() {
|
|
121
|
+
// double check flag
|
|
122
|
+
if (builtAccel != 0) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (primitives != null) {
|
|
126
|
+
int n = primitives.getNumPrimitives();
|
|
127
|
+
if (n >= 1000) {
|
|
128
|
+
UI.printInfo(Module.GEOM, "Building acceleration structure for %d primitives ...", n);
|
|
129
|
+
}
|
|
130
|
+
accel = AccelerationStructureFactory.create(acceltype, n, true);
|
|
131
|
+
accel.build(primitives);
|
|
132
|
+
} else {
|
|
133
|
+
// create an empty accelerator to avoid having to check for null
|
|
134
|
+
// pointers in the intersect method
|
|
135
|
+
accel = new NullAccelerator();
|
|
136
|
+
}
|
|
137
|
+
builtAccel = 1;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
void prepareShadingState(ShadingState state) {
|
|
141
|
+
primitives.prepareShadingState(state);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
PrimitiveList getBakingPrimitives() {
|
|
145
|
+
if (builtTess == 0) {
|
|
146
|
+
tesselate();
|
|
147
|
+
}
|
|
148
|
+
if (primitives == null) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
return primitives.getBakingPrimitives();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
PrimitiveList getPrimitiveList() {
|
|
155
|
+
return primitives;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
package org.sunflow.core;
|
|
2
|
+
|
|
3
|
+
import org.sunflow.image.Color;
|
|
4
|
+
import org.sunflow.math.Point3;
|
|
5
|
+
import org.sunflow.math.Vector3;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Represents a global photon map. This is a structure which can return a rough
|
|
9
|
+
* approximation of the diffuse radiance at a given surface point.
|
|
10
|
+
*/
|
|
11
|
+
public interface GlobalPhotonMapInterface extends PhotonStore {
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Lookup the global diffuse radiance at the specified surface point.
|
|
15
|
+
*
|
|
16
|
+
* @param p surface position
|
|
17
|
+
* @param n surface normal
|
|
18
|
+
* @return an approximation of global diffuse radiance at this point
|
|
19
|
+
*/
|
|
20
|
+
public Color getRadiance(Point3 p, Vector3 n);
|
|
21
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
package org.sunflow.core;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This interface represents an image sampling algorithm capable of rendering
|
|
5
|
+
* the entire image. Implementations are responsible for anti-aliasing and
|
|
6
|
+
* filtering.
|
|
7
|
+
*/
|
|
8
|
+
public interface ImageSampler {
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Prepare the sampler for rendering an image of w x h pixels
|
|
12
|
+
*
|
|
13
|
+
* @param w width of the image
|
|
14
|
+
* @param h height of the image
|
|
15
|
+
*/
|
|
16
|
+
public boolean prepare(Options options, Scene scene, int w, int h);
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Render the image to the specified display. The sampler can assume the
|
|
20
|
+
* display has been opened and that it will be closed after the method
|
|
21
|
+
* returns.
|
|
22
|
+
*
|
|
23
|
+
* @param display Display driver to send image data to
|
|
24
|
+
*/
|
|
25
|
+
public void render(Display display);
|
|
26
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
package org.sunflow.core;
|
|
2
|
+
|
|
3
|
+
import org.sunflow.SunflowAPI;
|
|
4
|
+
import org.sunflow.math.BoundingBox;
|
|
5
|
+
import org.sunflow.math.Matrix4;
|
|
6
|
+
import org.sunflow.math.MovingMatrix4;
|
|
7
|
+
import org.sunflow.system.UI;
|
|
8
|
+
import org.sunflow.system.UI.Module;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* This represents an instance of a {@link Geometry} into the scene. This class
|
|
12
|
+
* maps object space to world space and maintains a list of shaders and
|
|
13
|
+
* modifiers attached to the surface.
|
|
14
|
+
*/
|
|
15
|
+
public class Instance implements RenderObject {
|
|
16
|
+
|
|
17
|
+
private MovingMatrix4 o2w;
|
|
18
|
+
private MovingMatrix4 w2o;
|
|
19
|
+
private BoundingBox bounds;
|
|
20
|
+
private Geometry geometry;
|
|
21
|
+
private Shader[] shaders;
|
|
22
|
+
private Modifier[] modifiers;
|
|
23
|
+
|
|
24
|
+
public Instance() {
|
|
25
|
+
o2w = new MovingMatrix4(null);
|
|
26
|
+
w2o = new MovingMatrix4(null);
|
|
27
|
+
bounds = null;
|
|
28
|
+
geometry = null;
|
|
29
|
+
shaders = null;
|
|
30
|
+
modifiers = null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public static Instance createTemporary(PrimitiveList primitives, Matrix4 transform, Shader shader) {
|
|
34
|
+
Instance i = new Instance();
|
|
35
|
+
i.o2w = new MovingMatrix4(transform);
|
|
36
|
+
i.w2o = i.o2w.inverse();
|
|
37
|
+
if (i.w2o == null) {
|
|
38
|
+
UI.printError(Module.GEOM, "Unable to compute transform inverse");
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
i.geometry = new Geometry(primitives);
|
|
42
|
+
i.shaders = new Shader[]{shader};
|
|
43
|
+
i.updateBounds();
|
|
44
|
+
return i;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public boolean update(ParameterList pl, SunflowAPI api) {
|
|
48
|
+
String geometryName = pl.getString("geometry", null);
|
|
49
|
+
if (geometry == null || geometryName != null) {
|
|
50
|
+
if (geometryName == null) {
|
|
51
|
+
UI.printError(Module.GEOM, "geometry parameter missing - unable to create instance");
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
geometry = api.lookupGeometry(geometryName);
|
|
55
|
+
if (geometry == null) {
|
|
56
|
+
UI.printError(Module.GEOM, "Geometry \"%s\" was not declared yet - instance is invalid", geometryName);
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
String[] shaderNames = pl.getStringArray("shaders", null);
|
|
61
|
+
if (shaderNames != null) {
|
|
62
|
+
// new shader names have been provided
|
|
63
|
+
shaders = new Shader[shaderNames.length];
|
|
64
|
+
for (int i = 0; i < shaders.length; i++) {
|
|
65
|
+
shaders[i] = api.lookupShader(shaderNames[i]);
|
|
66
|
+
if (shaders[i] == null) {
|
|
67
|
+
UI.printWarning(Module.GEOM, "Shader \"%s\" was not declared yet - ignoring", shaderNames[i]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
// re-use existing shader array
|
|
72
|
+
}
|
|
73
|
+
String[] modifierNames = pl.getStringArray("modifiers", null);
|
|
74
|
+
if (modifierNames != null) {
|
|
75
|
+
// new modifier names have been provided
|
|
76
|
+
modifiers = new Modifier[modifierNames.length];
|
|
77
|
+
for (int i = 0; i < modifiers.length; i++) {
|
|
78
|
+
modifiers[i] = api.lookupModifier(modifierNames[i]);
|
|
79
|
+
if (modifiers[i] == null) {
|
|
80
|
+
UI.printWarning(Module.GEOM, "Modifier \"%s\" was not declared yet - ignoring", modifierNames[i]);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
o2w = pl.getMovingMatrix("transform", o2w);
|
|
85
|
+
w2o = o2w.inverse();
|
|
86
|
+
if (w2o == null) {
|
|
87
|
+
UI.printError(Module.GEOM, "Unable to compute transform inverse");
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Recompute world space bounding box of this instance.
|
|
95
|
+
*/
|
|
96
|
+
public void updateBounds() {
|
|
97
|
+
bounds = geometry.getWorldBounds(o2w.getData(0));
|
|
98
|
+
for (int i = 1; i < o2w.numSegments(); i++) {
|
|
99
|
+
bounds.include(geometry.getWorldBounds(o2w.getData(i)));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Checks to see if this instance is relative to the specified geometry.
|
|
105
|
+
*
|
|
106
|
+
* @param g geometry to check against
|
|
107
|
+
* @return <code>true</code> if the instanced geometry is equals to g,
|
|
108
|
+
* <code>false</code> otherwise
|
|
109
|
+
*/
|
|
110
|
+
public boolean hasGeometry(Geometry g) {
|
|
111
|
+
return geometry == g;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Remove the specified shader from the instance's list if it is being used.
|
|
116
|
+
*
|
|
117
|
+
* @param s shader to remove
|
|
118
|
+
*/
|
|
119
|
+
public void removeShader(Shader s) {
|
|
120
|
+
if (shaders != null) {
|
|
121
|
+
for (int i = 0; i < shaders.length; i++) {
|
|
122
|
+
if (shaders[i] == s) {
|
|
123
|
+
shaders[i] = null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Remove the specified modifier from the instance's list if it is being
|
|
131
|
+
* used.
|
|
132
|
+
*
|
|
133
|
+
* @param m modifier to remove
|
|
134
|
+
*/
|
|
135
|
+
public void removeModifier(Modifier m) {
|
|
136
|
+
if (modifiers != null) {
|
|
137
|
+
for (int i = 0; i < modifiers.length; i++) {
|
|
138
|
+
if (modifiers[i] == m) {
|
|
139
|
+
modifiers[i] = null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Get the world space bounding box for this instance.
|
|
147
|
+
*
|
|
148
|
+
* @return bounding box in world space
|
|
149
|
+
*/
|
|
150
|
+
public BoundingBox getBounds() {
|
|
151
|
+
return bounds;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
int getNumPrimitives() {
|
|
155
|
+
return geometry.getNumPrimitives();
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
void intersect(Ray r, IntersectionState state) {
|
|
159
|
+
Ray localRay = r.transform(w2o.sample(state.time));
|
|
160
|
+
state.current = this;
|
|
161
|
+
geometry.intersect(localRay, state);
|
|
162
|
+
// FIXME: transfer max distance to current ray
|
|
163
|
+
r.setMax(localRay.getMax());
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Prepare the shading state for shader invocation. This also runs the
|
|
168
|
+
* currently attached surface modifier.
|
|
169
|
+
*
|
|
170
|
+
* @param state shading state to be prepared
|
|
171
|
+
*/
|
|
172
|
+
public void prepareShadingState(ShadingState state) {
|
|
173
|
+
geometry.prepareShadingState(state);
|
|
174
|
+
if (state.getNormal() != null && state.getGeoNormal() != null) {
|
|
175
|
+
state.correctShadingNormal();
|
|
176
|
+
}
|
|
177
|
+
// run modifier if it was provided
|
|
178
|
+
if (state.getModifier() != null) {
|
|
179
|
+
state.getModifier().modify(state);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Get a shader for the instance's list.
|
|
185
|
+
*
|
|
186
|
+
* @param i index into the shader list
|
|
187
|
+
* @return requested shader, or <code>null</code> if the input is invalid
|
|
188
|
+
*/
|
|
189
|
+
public Shader getShader(int i) {
|
|
190
|
+
if (shaders == null || i < 0 || i >= shaders.length) {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
return shaders[i];
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Get a modifier for the instance's list.
|
|
198
|
+
*
|
|
199
|
+
* @param i index into the modifier list
|
|
200
|
+
* @return requested modifier, or <code>null</code> if the input is invalid
|
|
201
|
+
*/
|
|
202
|
+
public Modifier getModifier(int i) {
|
|
203
|
+
if (modifiers == null || i < 0 || i >= modifiers.length) {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
return modifiers[i];
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
Matrix4 getObjectToWorld(float time) {
|
|
210
|
+
return o2w.sample(time);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
Matrix4 getWorldToObject(float time) {
|
|
214
|
+
return w2o.sample(time);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
PrimitiveList getBakingPrimitives() {
|
|
218
|
+
return geometry.getBakingPrimitives();
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
Geometry getGeometry() {
|
|
222
|
+
return geometry;
|
|
223
|
+
}
|
|
224
|
+
}
|