joonsrenderer 1.1-java
Sign up to get free protection for your applications and to get access to all the features.
- 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,12 @@
|
|
1
|
+
require 'java'
|
2
|
+
|
3
|
+
working_directory = File.join(File.dirname(__FILE__))
|
4
|
+
$LOAD_PATH << working_directory unless $LOAD_PATH.include?(working_directory)
|
5
|
+
Dir[File.join(working_directory, '*.jar')].each do |jar|
|
6
|
+
require jar
|
7
|
+
end
|
8
|
+
|
9
|
+
java_import "joons.JoonsRenderer"
|
10
|
+
|
11
|
+
|
12
|
+
|
data/pom.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
project 'joonsrenderer' do
|
3
|
+
|
4
|
+
model_version '4.0.0'
|
5
|
+
id 'joons:joonsrenderer:1.1-SNAPSHOT'
|
6
|
+
packaging 'jar'
|
7
|
+
description 'joonsrenderer for propane and JRubyArt'
|
8
|
+
organization 'ruby-processing', 'https://ruby-processing.github.io'
|
9
|
+
{ 'fpsunflower' => 'Christopher Kulla', 'geneome' => 'Not Known', 'joonhyublee' => 'Joon Hyub Lee', 'monkstone' => 'Martin Prout' }.each do |key, value|
|
10
|
+
developer key do
|
11
|
+
name value
|
12
|
+
roles 'developer'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
license 'GPL 3', 'http://www.gnu.org/licenses/gpl-3.0-standalone.html'
|
16
|
+
issue_management 'https://github.com/monkstone/joonsrenderer/issues', 'Github'
|
17
|
+
|
18
|
+
properties( 'source.directory' => 'src',
|
19
|
+
'joonsrenderer.basedir' => '${project.basedir}',
|
20
|
+
'polyglot.dump.pom' => 'pom.xml',
|
21
|
+
'maven.compiler.source' => '1.8',
|
22
|
+
'project.build.sourceEncoding' => 'utf-8',
|
23
|
+
'maven.compiler.target' => '1.8',
|
24
|
+
'janino.version' => '3.0.6',
|
25
|
+
'jogl.version' => '2.3.2',
|
26
|
+
'processing.version' => '3.2.3'
|
27
|
+
)
|
28
|
+
|
29
|
+
jar 'org.processing:core:${processing.version}'
|
30
|
+
jar 'org.jogamp.jogl:jogl-all:${jogl.version}'
|
31
|
+
jar 'org.jogamp.gluegen:gluegen-rt:${jogl.version}'
|
32
|
+
jar('org.codehaus.janino:commons-compiler:${janino.version}')
|
33
|
+
jar('org.codehaus.janino:janino:${janino.version}')
|
34
|
+
|
35
|
+
overrides do
|
36
|
+
plugin :resources, '2.6'
|
37
|
+
plugin :dependency, '2.10' do
|
38
|
+
execute_goals( id: 'default-cli',
|
39
|
+
artifactItems:[
|
40
|
+
{ groupId: 'org.codehaus.janino',
|
41
|
+
artifactId: 'janino',
|
42
|
+
version: '${janino.version}',
|
43
|
+
type: 'jar',
|
44
|
+
outputDirectory: '${joonsrenderer.basedir}/lib'
|
45
|
+
},
|
46
|
+
{ groupId: 'org.codehaus.janino',
|
47
|
+
artifactId: 'commons-compiler',
|
48
|
+
version: '${janino.version}',
|
49
|
+
type: 'jar',
|
50
|
+
outputDirectory: '${joonsrenderer.basedir}/lib'
|
51
|
+
}
|
52
|
+
]
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
plugin( :compiler, '3.6.0',
|
57
|
+
source: '${maven.compiler.source}',
|
58
|
+
target: '${maven.compiler.target}'
|
59
|
+
)
|
60
|
+
plugin( :javadoc, '2.10.4',
|
61
|
+
detect_offline_links: 'false',
|
62
|
+
)
|
63
|
+
plugin( :jar, '3.0.2',
|
64
|
+
'archive' => {
|
65
|
+
'manifestFile' => 'MANIFEST.MF'
|
66
|
+
}
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
build do
|
71
|
+
default_goal 'package'
|
72
|
+
source_directory 'src'
|
73
|
+
final_name 'joonsrenderer'
|
74
|
+
end
|
75
|
+
end
|
data/pom.xml
ADDED
@@ -0,0 +1,163 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!--
|
3
|
+
|
4
|
+
|
5
|
+
DO NOT MODIFIY - GENERATED CODE
|
6
|
+
|
7
|
+
|
8
|
+
-->
|
9
|
+
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
10
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
11
|
+
<modelVersion>4.0.0</modelVersion>
|
12
|
+
<groupId>joons</groupId>
|
13
|
+
<artifactId>joonsrenderer</artifactId>
|
14
|
+
<version>1.1-SNAPSHOT</version>
|
15
|
+
<name>joonsrenderer</name>
|
16
|
+
<description>joonsrenderer for propane and JRubyArt</description>
|
17
|
+
<organization>
|
18
|
+
<name>ruby-processing</name>
|
19
|
+
<url>https://ruby-processing.github.io</url>
|
20
|
+
</organization>
|
21
|
+
<licenses>
|
22
|
+
<license>
|
23
|
+
<name>GPL 3</name>
|
24
|
+
<url>http://www.gnu.org/licenses/gpl-3.0-standalone.html</url>
|
25
|
+
</license>
|
26
|
+
</licenses>
|
27
|
+
<developers>
|
28
|
+
<developer>
|
29
|
+
<id>fpsunflower</id>
|
30
|
+
<name>Christopher Kulla</name>
|
31
|
+
<roles>
|
32
|
+
<role>developer</role>
|
33
|
+
</roles>
|
34
|
+
</developer>
|
35
|
+
<developer>
|
36
|
+
<id>geneome</id>
|
37
|
+
<name>Not Known</name>
|
38
|
+
<roles>
|
39
|
+
<role>developer</role>
|
40
|
+
</roles>
|
41
|
+
</developer>
|
42
|
+
<developer>
|
43
|
+
<id>joonhyublee</id>
|
44
|
+
<name>Joon Hyub Lee</name>
|
45
|
+
<roles>
|
46
|
+
<role>developer</role>
|
47
|
+
</roles>
|
48
|
+
</developer>
|
49
|
+
<developer>
|
50
|
+
<id>monkstone</id>
|
51
|
+
<name>Martin Prout</name>
|
52
|
+
<roles>
|
53
|
+
<role>developer</role>
|
54
|
+
</roles>
|
55
|
+
</developer>
|
56
|
+
</developers>
|
57
|
+
<issueManagement>
|
58
|
+
<system>Github</system>
|
59
|
+
<url>https://github.com/monkstone/joonsrenderer/issues</url>
|
60
|
+
</issueManagement>
|
61
|
+
<properties>
|
62
|
+
<jogl.version>2.3.2</jogl.version>
|
63
|
+
<source.directory>src</source.directory>
|
64
|
+
<joonsrenderer.basedir>${project.basedir}</joonsrenderer.basedir>
|
65
|
+
<maven.compiler.target>1.8</maven.compiler.target>
|
66
|
+
<processing.version>3.2.3</processing.version>
|
67
|
+
<project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
|
68
|
+
<janino.version>3.0.6</janino.version>
|
69
|
+
<polyglot.dump.pom>pom.xml</polyglot.dump.pom>
|
70
|
+
<maven.compiler.source>1.8</maven.compiler.source>
|
71
|
+
</properties>
|
72
|
+
<dependencies>
|
73
|
+
<dependency>
|
74
|
+
<groupId>org.processing</groupId>
|
75
|
+
<artifactId>core</artifactId>
|
76
|
+
<version>${processing.version}</version>
|
77
|
+
</dependency>
|
78
|
+
<dependency>
|
79
|
+
<groupId>org.jogamp.jogl</groupId>
|
80
|
+
<artifactId>jogl-all</artifactId>
|
81
|
+
<version>${jogl.version}</version>
|
82
|
+
</dependency>
|
83
|
+
<dependency>
|
84
|
+
<groupId>org.jogamp.gluegen</groupId>
|
85
|
+
<artifactId>gluegen-rt</artifactId>
|
86
|
+
<version>${jogl.version}</version>
|
87
|
+
</dependency>
|
88
|
+
<dependency>
|
89
|
+
<groupId>org.codehaus.janino</groupId>
|
90
|
+
<artifactId>commons-compiler</artifactId>
|
91
|
+
<version>${janino.version}</version>
|
92
|
+
</dependency>
|
93
|
+
<dependency>
|
94
|
+
<groupId>org.codehaus.janino</groupId>
|
95
|
+
<artifactId>janino</artifactId>
|
96
|
+
<version>${janino.version}</version>
|
97
|
+
</dependency>
|
98
|
+
</dependencies>
|
99
|
+
<build>
|
100
|
+
<sourceDirectory>src</sourceDirectory>
|
101
|
+
<defaultGoal>package</defaultGoal>
|
102
|
+
<finalName>joonsrenderer</finalName>
|
103
|
+
<pluginManagement>
|
104
|
+
<plugins>
|
105
|
+
<plugin>
|
106
|
+
<artifactId>maven-resources-plugin</artifactId>
|
107
|
+
<version>2.6</version>
|
108
|
+
</plugin>
|
109
|
+
<plugin>
|
110
|
+
<artifactId>maven-dependency-plugin</artifactId>
|
111
|
+
<version>2.10</version>
|
112
|
+
<executions>
|
113
|
+
<execution>
|
114
|
+
<id>default-cli</id>
|
115
|
+
<configuration>
|
116
|
+
<artifactItems>
|
117
|
+
<artifactItem>
|
118
|
+
<groupId>org.codehaus.janino</groupId>
|
119
|
+
<artifactId>janino</artifactId>
|
120
|
+
<version>${janino.version}</version>
|
121
|
+
<type>jar</type>
|
122
|
+
<outputDirectory>${joonsrenderer.basedir}/lib</outputDirectory>
|
123
|
+
</artifactItem>
|
124
|
+
<artifactItem>
|
125
|
+
<groupId>org.codehaus.janino</groupId>
|
126
|
+
<artifactId>commons-compiler</artifactId>
|
127
|
+
<version>${janino.version}</version>
|
128
|
+
<type>jar</type>
|
129
|
+
<outputDirectory>${joonsrenderer.basedir}/lib</outputDirectory>
|
130
|
+
</artifactItem>
|
131
|
+
</artifactItems>
|
132
|
+
</configuration>
|
133
|
+
</execution>
|
134
|
+
</executions>
|
135
|
+
</plugin>
|
136
|
+
<plugin>
|
137
|
+
<artifactId>maven-compiler-plugin</artifactId>
|
138
|
+
<version>3.6.0</version>
|
139
|
+
<configuration>
|
140
|
+
<source>${maven.compiler.source}</source>
|
141
|
+
<target>${maven.compiler.target}</target>
|
142
|
+
</configuration>
|
143
|
+
</plugin>
|
144
|
+
<plugin>
|
145
|
+
<artifactId>maven-javadoc-plugin</artifactId>
|
146
|
+
<version>2.10.4</version>
|
147
|
+
<configuration>
|
148
|
+
<detectOfflineLinks>false</detectOfflineLinks>
|
149
|
+
</configuration>
|
150
|
+
</plugin>
|
151
|
+
<plugin>
|
152
|
+
<artifactId>maven-jar-plugin</artifactId>
|
153
|
+
<version>3.0.2</version>
|
154
|
+
<configuration>
|
155
|
+
<archive>
|
156
|
+
<manifestFile>MANIFEST.MF</manifestFile>
|
157
|
+
</archive>
|
158
|
+
</configuration>
|
159
|
+
</plugin>
|
160
|
+
</plugins>
|
161
|
+
</pluginManagement>
|
162
|
+
</build>
|
163
|
+
</project>
|
@@ -0,0 +1,1354 @@
|
|
1
|
+
|
2
|
+
import java.awt.BorderLayout;
|
3
|
+
import java.awt.Dimension;
|
4
|
+
import java.awt.FlowLayout;
|
5
|
+
import java.awt.Toolkit;
|
6
|
+
import java.awt.datatransfer.DataFlavor;
|
7
|
+
import java.awt.datatransfer.Transferable;
|
8
|
+
import java.awt.event.ActionEvent;
|
9
|
+
import java.awt.event.ActionListener;
|
10
|
+
import java.beans.PropertyVetoException;
|
11
|
+
import java.io.BufferedReader;
|
12
|
+
import java.io.File;
|
13
|
+
import java.io.FileNotFoundException;
|
14
|
+
import java.io.FileReader;
|
15
|
+
import java.io.FileWriter;
|
16
|
+
import java.io.IOException;
|
17
|
+
import java.util.List;
|
18
|
+
import java.util.logging.Level;
|
19
|
+
import java.util.logging.Logger;
|
20
|
+
|
21
|
+
import javax.swing.BorderFactory;
|
22
|
+
import javax.swing.JButton;
|
23
|
+
import javax.swing.JCheckBoxMenuItem;
|
24
|
+
import javax.swing.JComponent;
|
25
|
+
import javax.swing.JDesktopPane;
|
26
|
+
import javax.swing.JFileChooser;
|
27
|
+
import javax.swing.JInternalFrame;
|
28
|
+
import javax.swing.JMenu;
|
29
|
+
import javax.swing.JMenuBar;
|
30
|
+
import javax.swing.JMenuItem;
|
31
|
+
import javax.swing.JOptionPane;
|
32
|
+
import javax.swing.JPanel;
|
33
|
+
import javax.swing.JProgressBar;
|
34
|
+
import javax.swing.JScrollPane;
|
35
|
+
import javax.swing.JSeparator;
|
36
|
+
import javax.swing.JTextArea;
|
37
|
+
import javax.swing.KeyStroke;
|
38
|
+
import javax.swing.ScrollPaneConstants;
|
39
|
+
import javax.swing.SwingUtilities;
|
40
|
+
import javax.swing.TransferHandler;
|
41
|
+
import javax.swing.UIManager;
|
42
|
+
import javax.swing.UIManager.LookAndFeelInfo;
|
43
|
+
import javax.swing.filechooser.FileFilter;
|
44
|
+
import javax.swing.plaf.metal.DefaultMetalTheme;
|
45
|
+
import javax.swing.plaf.metal.MetalLookAndFeel;
|
46
|
+
|
47
|
+
import org.sunflow.Benchmark;
|
48
|
+
import org.sunflow.RealtimeBenchmark;
|
49
|
+
import org.sunflow.SunflowAPI;
|
50
|
+
import org.sunflow.core.Display;
|
51
|
+
import org.sunflow.core.TextureCache;
|
52
|
+
import org.sunflow.core.accel.KDTree;
|
53
|
+
import org.sunflow.core.display.FileDisplay;
|
54
|
+
import org.sunflow.core.display.FrameDisplay;
|
55
|
+
import org.sunflow.core.display.ImgPipeDisplay;
|
56
|
+
import org.sunflow.core.primitive.TriangleMesh;
|
57
|
+
import org.sunflow.system.ImagePanel;
|
58
|
+
import org.sunflow.system.Timer;
|
59
|
+
import org.sunflow.system.UI;
|
60
|
+
import org.sunflow.system.UserInterface;
|
61
|
+
import org.sunflow.system.UI.Module;
|
62
|
+
import org.sunflow.system.UI.PrintLevel;
|
63
|
+
|
64
|
+
@SuppressWarnings("serial")
|
65
|
+
public class SunflowGUI extends javax.swing.JFrame implements UserInterface {
|
66
|
+
|
67
|
+
final String JAVA_EXT = ".java";
|
68
|
+
private static final int DEFAULT_WIDTH = 1024;
|
69
|
+
private static final int DEFAULT_HEIGHT = 768;
|
70
|
+
private JPanel jPanel3;
|
71
|
+
private JScrollPane jScrollPane1;
|
72
|
+
private JMenuItem exitMenuItem;
|
73
|
+
private JSeparator jSeparator2;
|
74
|
+
private JPanel jPanel1;
|
75
|
+
private JButton renderButton;
|
76
|
+
private JMenuItem jMenuItem4;
|
77
|
+
private JSeparator jSeparator1;
|
78
|
+
private JMenuItem fitWindowMenuItem;
|
79
|
+
private JMenuItem tileWindowMenuItem;
|
80
|
+
private JSeparator jSeparator5;
|
81
|
+
private JMenuItem consoleWindowMenuItem;
|
82
|
+
private JMenuItem editorWindowMenuItem;
|
83
|
+
private JMenuItem imageWindowMenuItem;
|
84
|
+
private JMenu windowMenu;
|
85
|
+
private JInternalFrame consoleFrame;
|
86
|
+
private JInternalFrame editorFrame;
|
87
|
+
private JInternalFrame imagePanelFrame;
|
88
|
+
private JDesktopPane desktop;
|
89
|
+
private JCheckBoxMenuItem smallTrianglesMenuItem;
|
90
|
+
private JMenuItem textureCacheClearMenuItem;
|
91
|
+
private JSeparator jSeparator4;
|
92
|
+
private JMenuItem resetZoomMenuItem;
|
93
|
+
private JMenu imageMenu;
|
94
|
+
private ImagePanel imagePanel;
|
95
|
+
private JPanel jPanel6;
|
96
|
+
private JCheckBoxMenuItem clearLogMenuItem;
|
97
|
+
private JPanel jPanel5;
|
98
|
+
private JButton taskCancelButton;
|
99
|
+
private JProgressBar taskProgressBar;
|
100
|
+
private JSeparator jSeparator3;
|
101
|
+
private JCheckBoxMenuItem autoBuildMenuItem;
|
102
|
+
private JMenuItem iprMenuItem;
|
103
|
+
private JMenuItem renderMenuItem;
|
104
|
+
private JMenuItem buildMenuItem;
|
105
|
+
private JMenu sceneMenu;
|
106
|
+
private JTextArea editorTextArea;
|
107
|
+
private JTextArea consoleTextArea;
|
108
|
+
private JButton clearConsoleButton;
|
109
|
+
private JPanel jPanel4;
|
110
|
+
private JScrollPane jScrollPane2;
|
111
|
+
private JButton iprButton;
|
112
|
+
private JButton buildButton;
|
113
|
+
private JMenuItem saveAsMenuItem;
|
114
|
+
private JMenuItem saveMenuItem;
|
115
|
+
private JMenuItem openFileMenuItem;
|
116
|
+
private JMenuItem newFileMenuItem;
|
117
|
+
private JMenu fileMenu;
|
118
|
+
private JMenuBar jMenuBar1;
|
119
|
+
// non-swing items
|
120
|
+
private String currentFile;
|
121
|
+
private String currentTask;
|
122
|
+
private int currentTaskLastP;
|
123
|
+
private SunflowAPI api;
|
124
|
+
private File lastSaveDirectory;
|
125
|
+
|
126
|
+
public static void usage(boolean verbose) {
|
127
|
+
System.out.println("Usage: SunflowGUI [options] scenefile");
|
128
|
+
if (verbose) {
|
129
|
+
System.out.println("Sunflow v" + SunflowAPI.VERSION + " textmode");
|
130
|
+
System.out.println("Renders the specified scene file");
|
131
|
+
System.out.println("Options:");
|
132
|
+
System.out.println(" -o filename Saves the output as the specified filename (png, hdr, tga)");
|
133
|
+
System.out.println(" #'s get expanded to the current frame number");
|
134
|
+
System.out.println(" -nogui Don't open the frame showing rendering progress");
|
135
|
+
System.out.println(" -ipr Render using progressive algorithm");
|
136
|
+
System.out.println(" -sampler type Render using the specified algorithm");
|
137
|
+
System.out.println(" -threads n Render using n threads");
|
138
|
+
System.out.println(" -lopri Set thread priority to low (default)");
|
139
|
+
System.out.println(" -hipri Set thread priority to high");
|
140
|
+
System.out.println(" -smallmesh Load triangle meshes using triangles optimized for memory use");
|
141
|
+
System.out.println(" -dumpkd Dump KDTree to an obj file for visualization");
|
142
|
+
System.out.println(" -buildonly Do not call render method after loading the scene");
|
143
|
+
System.out.println(" -showaa Display sampling levels per pixel for bucket renderer");
|
144
|
+
System.out.println(" -nogi Disable any global illumination engines in the scene");
|
145
|
+
System.out.println(" -nocaustics Disable any caustic engine in the scene");
|
146
|
+
System.out.println(" -pathgi n Use path tracing with n samples to render global illumination");
|
147
|
+
System.out.println(" -quick_ambocc d Applies ambient occlusion to the scene with specified maximum distance");
|
148
|
+
System.out.println(" -quick_uvs Applies a surface uv visualization shader to the scene");
|
149
|
+
System.out.println(" -quick_normals Applies a surface normal visualization shader to the scene");
|
150
|
+
System.out.println(" -quick_id Renders using a unique color for each instance");
|
151
|
+
System.out.println(" -quick_prims Renders using a unique color for each primitive");
|
152
|
+
System.out.println(" -quick_gray Renders using a plain gray diffuse shader");
|
153
|
+
System.out.println(" -quick_wire Renders using a wireframe shader");
|
154
|
+
System.out.println(" -resolution w h Changes the render resolution to the specified width and height (in pixels)");
|
155
|
+
System.out.println(" -aa min max Overrides the image anti-aliasing depths");
|
156
|
+
System.out.println(" -samples n Overrides the image sample count (affects bucket and multipass samplers)");
|
157
|
+
System.out.println(" -bucket n order Changes the default bucket size to n pixels and the default order");
|
158
|
+
System.out.println(" -bake name Bakes a lightmap for the specified instance");
|
159
|
+
System.out.println(" -bakedir dir Selects the type of lightmap baking: dir=view or ortho");
|
160
|
+
System.out.println(" -filter type Selects the image filter to use");
|
161
|
+
System.out.println(" -bench Run several built-in scenes for benchmark purposes");
|
162
|
+
System.out.println(" -rtbench Run realtime ray-tracing benchmark");
|
163
|
+
System.out.println(" -frame n Set frame number to the specified value");
|
164
|
+
System.out.println(" -anim n1 n2 Render all frames between the two specified values (inclusive)");
|
165
|
+
System.out.println(" -translate file Translate input scene to the specified filename");
|
166
|
+
System.out.println(" -v verbosity Set the verbosity level: 0=none,1=errors,2=warnings,3=info,4=detailed");
|
167
|
+
System.out.println(" -h Prints this message");
|
168
|
+
}
|
169
|
+
System.exit(1);
|
170
|
+
}
|
171
|
+
|
172
|
+
public static void main(String[] args) {
|
173
|
+
if (args.length > 0) {
|
174
|
+
boolean showFrame = true;
|
175
|
+
String sampler = null;
|
176
|
+
boolean noRender = false;
|
177
|
+
String filename = null;
|
178
|
+
String input = null;
|
179
|
+
int i = 0;
|
180
|
+
int threads = 0;
|
181
|
+
boolean lowPriority = true;
|
182
|
+
boolean showAA = false;
|
183
|
+
boolean noGI = false;
|
184
|
+
boolean noCaustics = false;
|
185
|
+
int pathGI = 0;
|
186
|
+
float maxDist = 0;
|
187
|
+
String shaderOverride = null;
|
188
|
+
int resolutionW = 0, resolutionH = 0;
|
189
|
+
int aaMin = -5, aaMax = -5;
|
190
|
+
int samples = -1;
|
191
|
+
int bucketSize = 0;
|
192
|
+
String bucketOrder = null;
|
193
|
+
String bakingName = null;
|
194
|
+
boolean bakeViewdep = false;
|
195
|
+
String filterType = null;
|
196
|
+
boolean runBenchmark = false;
|
197
|
+
boolean runRTBenchmark = false;
|
198
|
+
String translateFilename = null;
|
199
|
+
int frameStart = 1, frameStop = 1;
|
200
|
+
while (i < args.length) {
|
201
|
+
if (args[i].equals("-o")) {
|
202
|
+
if (i > args.length - 2) {
|
203
|
+
usage(false);
|
204
|
+
}
|
205
|
+
filename = args[i + 1];
|
206
|
+
i += 2;
|
207
|
+
} else if (args[i].equals("-nogui")) {
|
208
|
+
showFrame = false;
|
209
|
+
i++;
|
210
|
+
} else if (args[i].equals("-ipr")) {
|
211
|
+
sampler = "ipr";
|
212
|
+
i++;
|
213
|
+
} else if (args[i].equals("-threads")) {
|
214
|
+
if (i > args.length - 2) {
|
215
|
+
usage(false);
|
216
|
+
}
|
217
|
+
threads = Integer.parseInt(args[i + 1]);
|
218
|
+
i += 2;
|
219
|
+
} else if (args[i].equals("-lopri")) {
|
220
|
+
lowPriority = true;
|
221
|
+
i++;
|
222
|
+
} else if (args[i].equals("-hipri")) {
|
223
|
+
lowPriority = false;
|
224
|
+
i++;
|
225
|
+
} else if (args[i].equals("-sampler")) {
|
226
|
+
if (i > args.length - 2) {
|
227
|
+
usage(false);
|
228
|
+
}
|
229
|
+
sampler = args[i + 1];
|
230
|
+
i += 2;
|
231
|
+
} else if (args[i].equals("-smallmesh")) {
|
232
|
+
TriangleMesh.setSmallTriangles(true);
|
233
|
+
i++;
|
234
|
+
} else if (args[i].equals("-dumpkd")) {
|
235
|
+
KDTree.setDumpMode(true, "kdtree");
|
236
|
+
i++;
|
237
|
+
} else if (args[i].equals("-buildonly")) {
|
238
|
+
noRender = true;
|
239
|
+
i++;
|
240
|
+
} else if (args[i].equals("-showaa")) {
|
241
|
+
showAA = true;
|
242
|
+
i++;
|
243
|
+
} else if (args[i].equals("-nogi")) {
|
244
|
+
noGI = true;
|
245
|
+
i++;
|
246
|
+
} else if (args[i].equals("-nocaustics")) {
|
247
|
+
noCaustics = true;
|
248
|
+
i++;
|
249
|
+
} else if (args[i].equals("-pathgi")) {
|
250
|
+
if (i > args.length - 2) {
|
251
|
+
usage(false);
|
252
|
+
}
|
253
|
+
pathGI = Integer.parseInt(args[i + 1]);
|
254
|
+
i += 2;
|
255
|
+
} else if (args[i].equals("-quick_ambocc")) {
|
256
|
+
if (i > args.length - 2) {
|
257
|
+
usage(false);
|
258
|
+
}
|
259
|
+
maxDist = Float.parseFloat(args[i + 1]);
|
260
|
+
shaderOverride = "ambient_occlusion"; // new
|
261
|
+
// AmbientOcclusionShader(Color.WHITE,
|
262
|
+
// d);
|
263
|
+
i += 2;
|
264
|
+
} else if (args[i].equals("-quick_uvs")) {
|
265
|
+
if (i > args.length - 1) {
|
266
|
+
usage(false);
|
267
|
+
}
|
268
|
+
shaderOverride = "show_uvs";
|
269
|
+
i++;
|
270
|
+
} else if (args[i].equals("-quick_normals")) {
|
271
|
+
if (i > args.length - 1) {
|
272
|
+
usage(false);
|
273
|
+
}
|
274
|
+
shaderOverride = "show_normals";
|
275
|
+
i++;
|
276
|
+
} else if (args[i].equals("-quick_id")) {
|
277
|
+
if (i > args.length - 1) {
|
278
|
+
usage(false);
|
279
|
+
}
|
280
|
+
shaderOverride = "show_instance_id";
|
281
|
+
i++;
|
282
|
+
} else if (args[i].equals("-quick_prims")) {
|
283
|
+
if (i > args.length - 1) {
|
284
|
+
usage(false);
|
285
|
+
}
|
286
|
+
shaderOverride = "show_primitive_id";
|
287
|
+
i++;
|
288
|
+
} else if (args[i].equals("-quick_gray")) {
|
289
|
+
if (i > args.length - 1) {
|
290
|
+
usage(false);
|
291
|
+
}
|
292
|
+
shaderOverride = "quick_gray";
|
293
|
+
i++;
|
294
|
+
} else if (args[i].equals("-quick_wire")) {
|
295
|
+
if (i > args.length - 1) {
|
296
|
+
usage(false);
|
297
|
+
}
|
298
|
+
shaderOverride = "wireframe";
|
299
|
+
i++;
|
300
|
+
} else if (args[i].equals("-resolution")) {
|
301
|
+
if (i > args.length - 3) {
|
302
|
+
usage(false);
|
303
|
+
}
|
304
|
+
resolutionW = Integer.parseInt(args[i + 1]);
|
305
|
+
resolutionH = Integer.parseInt(args[i + 2]);
|
306
|
+
i += 3;
|
307
|
+
} else if (args[i].equals("-aa")) {
|
308
|
+
if (i > args.length - 3) {
|
309
|
+
usage(false);
|
310
|
+
}
|
311
|
+
aaMin = Integer.parseInt(args[i + 1]);
|
312
|
+
aaMax = Integer.parseInt(args[i + 2]);
|
313
|
+
i += 3;
|
314
|
+
} else if (args[i].equals("-samples")) {
|
315
|
+
if (i > args.length - 2) {
|
316
|
+
usage(false);
|
317
|
+
}
|
318
|
+
samples = Integer.parseInt(args[i + 1]);
|
319
|
+
i += 2;
|
320
|
+
} else if (args[i].equals("-bucket")) {
|
321
|
+
if (i > args.length - 3) {
|
322
|
+
usage(false);
|
323
|
+
}
|
324
|
+
bucketSize = Integer.parseInt(args[i + 1]);
|
325
|
+
bucketOrder = args[i + 2];
|
326
|
+
i += 3;
|
327
|
+
} else if (args[i].equals("-bake")) {
|
328
|
+
if (i > args.length - 2) {
|
329
|
+
usage(false);
|
330
|
+
}
|
331
|
+
bakingName = args[i + 1];
|
332
|
+
i += 2;
|
333
|
+
} else if (args[i].equals("-bakedir")) {
|
334
|
+
if (i > args.length - 2) {
|
335
|
+
usage(false);
|
336
|
+
}
|
337
|
+
String baketype = args[i + 1];
|
338
|
+
if (baketype.equals("view")) {
|
339
|
+
bakeViewdep = true;
|
340
|
+
} else if (baketype.equals("ortho")) {
|
341
|
+
bakeViewdep = false;
|
342
|
+
} else {
|
343
|
+
usage(false);
|
344
|
+
}
|
345
|
+
i += 2;
|
346
|
+
} else if (args[i].equals("-filter")) {
|
347
|
+
if (i > args.length - 2) {
|
348
|
+
usage(false);
|
349
|
+
}
|
350
|
+
filterType = args[i + 1];
|
351
|
+
i += 2;
|
352
|
+
} else if (args[i].equals("-bench")) {
|
353
|
+
runBenchmark = true;
|
354
|
+
i++;
|
355
|
+
} else if (args[i].equals("-rtbench")) {
|
356
|
+
runRTBenchmark = true;
|
357
|
+
i++;
|
358
|
+
} else if (args[i].equals("-frame")) {
|
359
|
+
if (i > args.length - 2) {
|
360
|
+
usage(false);
|
361
|
+
}
|
362
|
+
frameStart = frameStop = Integer.parseInt(args[i + 1]);
|
363
|
+
i += 2;
|
364
|
+
} else if (args[i].equals("-anim")) {
|
365
|
+
if (i > args.length - 3) {
|
366
|
+
usage(false);
|
367
|
+
}
|
368
|
+
frameStart = Integer.parseInt(args[i + 1]);
|
369
|
+
frameStop = Integer.parseInt(args[i + 2]);
|
370
|
+
i += 3;
|
371
|
+
} else if (args[i].equals("-v")) {
|
372
|
+
if (i > args.length - 2) {
|
373
|
+
usage(false);
|
374
|
+
}
|
375
|
+
UI.verbosity(Integer.parseInt(args[i + 1]));
|
376
|
+
i += 2;
|
377
|
+
} else if (args[i].equals("-translate")) {
|
378
|
+
if (i > args.length - 2) {
|
379
|
+
usage(false);
|
380
|
+
}
|
381
|
+
translateFilename = args[i + 1];
|
382
|
+
i += 2;
|
383
|
+
} else if (args[i].equals("-h") || args[i].equals("-help")) {
|
384
|
+
usage(true);
|
385
|
+
} else {
|
386
|
+
if (input != null) {
|
387
|
+
usage(false);
|
388
|
+
}
|
389
|
+
input = args[i];
|
390
|
+
i++;
|
391
|
+
}
|
392
|
+
}
|
393
|
+
if (runBenchmark) {
|
394
|
+
SunflowAPI.runSystemCheck();
|
395
|
+
new Benchmark().execute();
|
396
|
+
return;
|
397
|
+
}
|
398
|
+
if (runRTBenchmark) {
|
399
|
+
SunflowAPI.runSystemCheck();
|
400
|
+
new RealtimeBenchmark(showFrame, threads);
|
401
|
+
return;
|
402
|
+
}
|
403
|
+
if (input == null) {
|
404
|
+
usage(false);
|
405
|
+
}
|
406
|
+
SunflowAPI.runSystemCheck();
|
407
|
+
if (translateFilename != null) {
|
408
|
+
SunflowAPI.translate(input, translateFilename);
|
409
|
+
return;
|
410
|
+
}
|
411
|
+
if (frameStart < frameStop && showFrame) {
|
412
|
+
UI.printWarning(Module.GUI, "Animations should not be rendered without -nogui - forcing GUI off anyway");
|
413
|
+
showFrame = false;
|
414
|
+
}
|
415
|
+
if (frameStart < frameStop && filename == null) {
|
416
|
+
filename = "output.#.png";
|
417
|
+
UI.printWarning(Module.GUI, "Animation output was not specified - defaulting to: \"%s\"", filename);
|
418
|
+
}
|
419
|
+
for (int frameNumber = frameStart; frameNumber <= frameStop; frameNumber++) {
|
420
|
+
SunflowAPI api = SunflowAPI.create(input, frameNumber);
|
421
|
+
if (api == null) {
|
422
|
+
continue;
|
423
|
+
}
|
424
|
+
if (noRender) {
|
425
|
+
continue;
|
426
|
+
}
|
427
|
+
if (resolutionW > 0 && resolutionH > 0) {
|
428
|
+
api.parameter("resolutionX", resolutionW);
|
429
|
+
api.parameter("resolutionY", resolutionH);
|
430
|
+
}
|
431
|
+
if (aaMin != -5 || aaMax != -5) {
|
432
|
+
api.parameter("aa.min", aaMin);
|
433
|
+
api.parameter("aa.max", aaMax);
|
434
|
+
}
|
435
|
+
if (samples >= 0) {
|
436
|
+
api.parameter("aa.samples", samples);
|
437
|
+
}
|
438
|
+
if (bucketSize > 0) {
|
439
|
+
api.parameter("bucket.size", bucketSize);
|
440
|
+
}
|
441
|
+
if (bucketOrder != null) {
|
442
|
+
api.parameter("bucket.order", bucketOrder);
|
443
|
+
}
|
444
|
+
api.parameter("aa.display", showAA);
|
445
|
+
api.parameter("threads", threads);
|
446
|
+
api.parameter("threads.lowPriority", lowPriority);
|
447
|
+
if (bakingName != null) {
|
448
|
+
api.parameter("baking.instance", bakingName);
|
449
|
+
api.parameter("baking.viewdep", bakeViewdep);
|
450
|
+
}
|
451
|
+
if (filterType != null) {
|
452
|
+
api.parameter("filter", filterType);
|
453
|
+
}
|
454
|
+
if (noGI) {
|
455
|
+
api.parameter("gi.engine", "none");
|
456
|
+
} else if (pathGI > 0) {
|
457
|
+
api.parameter("gi.engine", "path");
|
458
|
+
api.parameter("gi.path.samples", pathGI);
|
459
|
+
}
|
460
|
+
if (noCaustics) {
|
461
|
+
api.parameter("caustics", "none");
|
462
|
+
}
|
463
|
+
if (sampler != null) {
|
464
|
+
api.parameter("sampler", sampler);
|
465
|
+
}
|
466
|
+
api.options(SunflowAPI.DEFAULT_OPTIONS);
|
467
|
+
if (shaderOverride != null) {
|
468
|
+
if (shaderOverride.equals("ambient_occlusion")) {
|
469
|
+
api.parameter("maxdist", maxDist);
|
470
|
+
}
|
471
|
+
api.shader("cmdline_override", shaderOverride);
|
472
|
+
api.parameter("override.shader", "cmdline_override");
|
473
|
+
api.parameter("override.photons", true);
|
474
|
+
api.options(SunflowAPI.DEFAULT_OPTIONS);
|
475
|
+
}
|
476
|
+
// create display
|
477
|
+
Display display;
|
478
|
+
String currentFilename = (filename != null) ? filename.replace("#", String.format("%04d", frameNumber)) : null;
|
479
|
+
if (showFrame) {
|
480
|
+
display = new FrameDisplay(currentFilename);
|
481
|
+
} else {
|
482
|
+
if (currentFilename != null && currentFilename.equals("imgpipe")) {
|
483
|
+
display = new ImgPipeDisplay();
|
484
|
+
} else {
|
485
|
+
display = new FileDisplay(currentFilename);
|
486
|
+
}
|
487
|
+
}
|
488
|
+
api.render(SunflowAPI.DEFAULT_OPTIONS, display);
|
489
|
+
}
|
490
|
+
} else {
|
491
|
+
try {
|
492
|
+
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
|
493
|
+
if ("Nimbus".equals(info.getName())) {
|
494
|
+
UIManager.setLookAndFeel(info.getClassName());
|
495
|
+
break;
|
496
|
+
}
|
497
|
+
}
|
498
|
+
} catch (Exception e) {
|
499
|
+
// If Nimbus is not available, you can set the GUI to another look and feel.
|
500
|
+
MetalLookAndFeel.setCurrentTheme(new DefaultMetalTheme());
|
501
|
+
}
|
502
|
+
|
503
|
+
SunflowGUI gui = new SunflowGUI();
|
504
|
+
gui.setVisible(true);
|
505
|
+
Dimension screenRes = Toolkit.getDefaultToolkit().getScreenSize();
|
506
|
+
if (screenRes.getWidth() <= DEFAULT_WIDTH || screenRes.getHeight() <= DEFAULT_HEIGHT) {
|
507
|
+
gui.setExtendedState(MAXIMIZED_BOTH);
|
508
|
+
}
|
509
|
+
gui.tileWindowMenuItem.doClick();
|
510
|
+
SunflowAPI.runSystemCheck();
|
511
|
+
}
|
512
|
+
}
|
513
|
+
|
514
|
+
public SunflowGUI() {
|
515
|
+
super();
|
516
|
+
currentFile = null;
|
517
|
+
lastSaveDirectory = null;
|
518
|
+
api = null;
|
519
|
+
initGUI();
|
520
|
+
pack();
|
521
|
+
setLocationRelativeTo(null);
|
522
|
+
newFileMenuItemActionPerformed(null);
|
523
|
+
UI.set(this);
|
524
|
+
}
|
525
|
+
|
526
|
+
private void initGUI() {
|
527
|
+
setTitle("Sunflow v" + SunflowAPI.VERSION);
|
528
|
+
setDefaultCloseOperation(EXIT_ON_CLOSE);
|
529
|
+
{
|
530
|
+
desktop = new JDesktopPane();
|
531
|
+
getContentPane().add(desktop, BorderLayout.CENTER);
|
532
|
+
Dimension screenRes = Toolkit.getDefaultToolkit().getScreenSize();
|
533
|
+
if (screenRes.getWidth() <= DEFAULT_WIDTH || screenRes.getHeight() <= DEFAULT_HEIGHT) {
|
534
|
+
desktop.setPreferredSize(new java.awt.Dimension(640, 480));
|
535
|
+
} else {
|
536
|
+
desktop.setPreferredSize(new java.awt.Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT));
|
537
|
+
}
|
538
|
+
{
|
539
|
+
imagePanelFrame = new JInternalFrame();
|
540
|
+
desktop.add(imagePanelFrame);
|
541
|
+
{
|
542
|
+
jPanel1 = new JPanel();
|
543
|
+
FlowLayout jPanel1Layout = new FlowLayout();
|
544
|
+
jPanel1Layout.setAlignment(FlowLayout.LEFT);
|
545
|
+
jPanel1.setLayout(jPanel1Layout);
|
546
|
+
imagePanelFrame.getContentPane().add(jPanel1, BorderLayout.NORTH);
|
547
|
+
{
|
548
|
+
renderButton = new JButton();
|
549
|
+
jPanel1.add(renderButton);
|
550
|
+
renderButton.setText("Render");
|
551
|
+
renderButton.addActionListener(new ActionListener() {
|
552
|
+
@Override
|
553
|
+
public void actionPerformed(ActionEvent evt) {
|
554
|
+
renderMenuItemActionPerformed(evt);
|
555
|
+
}
|
556
|
+
});
|
557
|
+
}
|
558
|
+
{
|
559
|
+
iprButton = new JButton();
|
560
|
+
jPanel1.add(iprButton);
|
561
|
+
iprButton.setText("IPR");
|
562
|
+
iprButton.addActionListener(new ActionListener() {
|
563
|
+
@Override
|
564
|
+
public void actionPerformed(ActionEvent evt) {
|
565
|
+
iprMenuItemActionPerformed(evt);
|
566
|
+
}
|
567
|
+
});
|
568
|
+
}
|
569
|
+
}
|
570
|
+
{
|
571
|
+
imagePanel = new ImagePanel();
|
572
|
+
imagePanelFrame.getContentPane().add(imagePanel, BorderLayout.CENTER);
|
573
|
+
}
|
574
|
+
imagePanelFrame.pack();
|
575
|
+
imagePanelFrame.setResizable(true);
|
576
|
+
imagePanelFrame.setMaximizable(true);
|
577
|
+
imagePanelFrame.setVisible(true);
|
578
|
+
imagePanelFrame.setTitle("Image");
|
579
|
+
imagePanelFrame.setIconifiable(true);
|
580
|
+
}
|
581
|
+
{
|
582
|
+
editorFrame = new JInternalFrame();
|
583
|
+
desktop.add(editorFrame);
|
584
|
+
editorFrame.setTitle("Script Editor");
|
585
|
+
editorFrame.setMaximizable(true);
|
586
|
+
editorFrame.setResizable(true);
|
587
|
+
editorFrame.setIconifiable(true);
|
588
|
+
{
|
589
|
+
jScrollPane1 = new JScrollPane();
|
590
|
+
editorFrame.getContentPane().add(jScrollPane1, BorderLayout.CENTER);
|
591
|
+
jScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
|
592
|
+
jScrollPane1.setPreferredSize(new java.awt.Dimension(360, 280));
|
593
|
+
{
|
594
|
+
editorTextArea = new JTextArea();
|
595
|
+
jScrollPane1.setViewportView(editorTextArea);
|
596
|
+
editorTextArea.setFont(new java.awt.Font("Monospaced", 0, 12));
|
597
|
+
// drag and drop
|
598
|
+
editorTextArea.setTransferHandler(new SceneTransferHandler());
|
599
|
+
}
|
600
|
+
}
|
601
|
+
{
|
602
|
+
jPanel3 = new JPanel();
|
603
|
+
editorFrame.getContentPane().add(jPanel3, BorderLayout.SOUTH);
|
604
|
+
FlowLayout jPanel3Layout = new FlowLayout();
|
605
|
+
jPanel3Layout.setAlignment(FlowLayout.RIGHT);
|
606
|
+
jPanel3.setLayout(jPanel3Layout);
|
607
|
+
{
|
608
|
+
buildButton = new JButton();
|
609
|
+
jPanel3.add(buildButton);
|
610
|
+
buildButton.setText("Build Scene");
|
611
|
+
buildButton.addActionListener(new ActionListener() {
|
612
|
+
@Override
|
613
|
+
public void actionPerformed(ActionEvent evt) {
|
614
|
+
buildMenuItemActionPerformed(evt);
|
615
|
+
}
|
616
|
+
});
|
617
|
+
}
|
618
|
+
}
|
619
|
+
editorFrame.pack();
|
620
|
+
editorFrame.setVisible(true);
|
621
|
+
}
|
622
|
+
{
|
623
|
+
consoleFrame = new JInternalFrame();
|
624
|
+
desktop.add(consoleFrame);
|
625
|
+
consoleFrame.setIconifiable(true);
|
626
|
+
consoleFrame.setMaximizable(true);
|
627
|
+
consoleFrame.setResizable(true);
|
628
|
+
consoleFrame.setTitle("Console");
|
629
|
+
{
|
630
|
+
jScrollPane2 = new JScrollPane();
|
631
|
+
consoleFrame.getContentPane().add(jScrollPane2, BorderLayout.CENTER);
|
632
|
+
jScrollPane2.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
|
633
|
+
jScrollPane2.setPreferredSize(new java.awt.Dimension(360, 100));
|
634
|
+
{
|
635
|
+
consoleTextArea = new JTextArea();
|
636
|
+
jScrollPane2.setViewportView(consoleTextArea);
|
637
|
+
consoleTextArea.setFont(new java.awt.Font("Monospaced", 0, 12));
|
638
|
+
consoleTextArea.setEditable(false);
|
639
|
+
}
|
640
|
+
}
|
641
|
+
{
|
642
|
+
jPanel4 = new JPanel();
|
643
|
+
consoleFrame.getContentPane().add(jPanel4, BorderLayout.SOUTH);
|
644
|
+
BorderLayout jPanel4Layout = new BorderLayout();
|
645
|
+
jPanel4.setLayout(jPanel4Layout);
|
646
|
+
{
|
647
|
+
jPanel6 = new JPanel();
|
648
|
+
BorderLayout jPanel6Layout = new BorderLayout();
|
649
|
+
jPanel6.setLayout(jPanel6Layout);
|
650
|
+
jPanel4.add(jPanel6, BorderLayout.CENTER);
|
651
|
+
jPanel6.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 0));
|
652
|
+
{
|
653
|
+
taskProgressBar = new JProgressBar();
|
654
|
+
jPanel6.add(taskProgressBar);
|
655
|
+
taskProgressBar.setEnabled(false);
|
656
|
+
taskProgressBar.setString("");
|
657
|
+
taskProgressBar.setStringPainted(true);
|
658
|
+
taskProgressBar.setOpaque(false);
|
659
|
+
}
|
660
|
+
}
|
661
|
+
{
|
662
|
+
jPanel5 = new JPanel();
|
663
|
+
FlowLayout jPanel5Layout = new FlowLayout();
|
664
|
+
jPanel5Layout.setAlignment(FlowLayout.RIGHT);
|
665
|
+
jPanel5.setLayout(jPanel5Layout);
|
666
|
+
jPanel4.add(jPanel5, BorderLayout.EAST);
|
667
|
+
{
|
668
|
+
taskCancelButton = new JButton();
|
669
|
+
jPanel5.add(taskCancelButton);
|
670
|
+
taskCancelButton.setText("Cancel");
|
671
|
+
taskCancelButton.setEnabled(false);
|
672
|
+
taskCancelButton.addActionListener(new ActionListener() {
|
673
|
+
@Override
|
674
|
+
public void actionPerformed(ActionEvent evt) {
|
675
|
+
UI.taskCancel();
|
676
|
+
}
|
677
|
+
});
|
678
|
+
}
|
679
|
+
{
|
680
|
+
clearConsoleButton = new JButton();
|
681
|
+
jPanel5.add(clearConsoleButton);
|
682
|
+
clearConsoleButton.setText("Clear");
|
683
|
+
clearConsoleButton.addActionListener(new ActionListener() {
|
684
|
+
@Override
|
685
|
+
public void actionPerformed(ActionEvent evt) {
|
686
|
+
clearConsole();
|
687
|
+
}
|
688
|
+
});
|
689
|
+
}
|
690
|
+
}
|
691
|
+
}
|
692
|
+
consoleFrame.pack();
|
693
|
+
consoleFrame.setVisible(true);
|
694
|
+
}
|
695
|
+
}
|
696
|
+
{
|
697
|
+
jMenuBar1 = new JMenuBar();
|
698
|
+
setJMenuBar(jMenuBar1);
|
699
|
+
{
|
700
|
+
fileMenu = new JMenu();
|
701
|
+
jMenuBar1.add(fileMenu);
|
702
|
+
fileMenu.setText("File");
|
703
|
+
{
|
704
|
+
newFileMenuItem = new JMenuItem();
|
705
|
+
fileMenu.add(newFileMenuItem);
|
706
|
+
newFileMenuItem.setText("New");
|
707
|
+
newFileMenuItem.setAccelerator(KeyStroke.getKeyStroke("ctrl N"));
|
708
|
+
newFileMenuItem.addActionListener(new ActionListener() {
|
709
|
+
@Override
|
710
|
+
public void actionPerformed(ActionEvent evt) {
|
711
|
+
newFileMenuItemActionPerformed(evt);
|
712
|
+
}
|
713
|
+
});
|
714
|
+
}
|
715
|
+
{
|
716
|
+
openFileMenuItem = new JMenuItem();
|
717
|
+
fileMenu.add(openFileMenuItem);
|
718
|
+
openFileMenuItem.setText("Open ...");
|
719
|
+
openFileMenuItem.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));
|
720
|
+
openFileMenuItem.addActionListener(new ActionListener() {
|
721
|
+
@Override
|
722
|
+
public void actionPerformed(ActionEvent evt) {
|
723
|
+
openFileMenuItemActionPerformed(evt);
|
724
|
+
}
|
725
|
+
});
|
726
|
+
}
|
727
|
+
{
|
728
|
+
saveMenuItem = new JMenuItem();
|
729
|
+
fileMenu.add(saveMenuItem);
|
730
|
+
saveMenuItem.setText("Save");
|
731
|
+
saveMenuItem.setAccelerator(KeyStroke.getKeyStroke("ctrl S"));
|
732
|
+
saveMenuItem.addActionListener(new ActionListener() {
|
733
|
+
@Override
|
734
|
+
public void actionPerformed(ActionEvent evt) {
|
735
|
+
saveCurrentFile(currentFile);
|
736
|
+
}
|
737
|
+
});
|
738
|
+
}
|
739
|
+
{
|
740
|
+
saveAsMenuItem = new JMenuItem();
|
741
|
+
fileMenu.add(saveAsMenuItem);
|
742
|
+
saveAsMenuItem.setText("Save As ...");
|
743
|
+
saveAsMenuItem.addActionListener(new ActionListener() {
|
744
|
+
@Override
|
745
|
+
public void actionPerformed(ActionEvent evt) {
|
746
|
+
saveAsMenuItemActionPerformed(evt);
|
747
|
+
}
|
748
|
+
});
|
749
|
+
}
|
750
|
+
{
|
751
|
+
jSeparator2 = new JSeparator();
|
752
|
+
fileMenu.add(jSeparator2);
|
753
|
+
}
|
754
|
+
{
|
755
|
+
exitMenuItem = new JMenuItem();
|
756
|
+
fileMenu.add(exitMenuItem);
|
757
|
+
exitMenuItem.setText("Exit");
|
758
|
+
exitMenuItem.addActionListener(new ActionListener() {
|
759
|
+
@Override
|
760
|
+
public void actionPerformed(ActionEvent evt) {
|
761
|
+
System.exit(0);
|
762
|
+
}
|
763
|
+
});
|
764
|
+
}
|
765
|
+
}
|
766
|
+
{
|
767
|
+
sceneMenu = new JMenu();
|
768
|
+
jMenuBar1.add(sceneMenu);
|
769
|
+
sceneMenu.setText("Scene");
|
770
|
+
{
|
771
|
+
buildMenuItem = new JMenuItem();
|
772
|
+
sceneMenu.add(buildMenuItem);
|
773
|
+
buildMenuItem.setText("Build");
|
774
|
+
buildMenuItem.setAccelerator(KeyStroke.getKeyStroke("ctrl B"));
|
775
|
+
buildMenuItem.addActionListener(new ActionListener() {
|
776
|
+
@Override
|
777
|
+
public void actionPerformed(ActionEvent evt) {
|
778
|
+
if (sceneMenu.isEnabled()) {
|
779
|
+
buildMenuItemActionPerformed(evt);
|
780
|
+
}
|
781
|
+
}
|
782
|
+
});
|
783
|
+
}
|
784
|
+
{
|
785
|
+
autoBuildMenuItem = new JCheckBoxMenuItem();
|
786
|
+
sceneMenu.add(autoBuildMenuItem);
|
787
|
+
autoBuildMenuItem.setText("Build on open");
|
788
|
+
autoBuildMenuItem.setSelected(true);
|
789
|
+
}
|
790
|
+
{
|
791
|
+
jSeparator3 = new JSeparator();
|
792
|
+
sceneMenu.add(jSeparator3);
|
793
|
+
}
|
794
|
+
{
|
795
|
+
renderMenuItem = new JMenuItem();
|
796
|
+
sceneMenu.add(renderMenuItem);
|
797
|
+
renderMenuItem.setText("Render");
|
798
|
+
renderMenuItem.addActionListener(new ActionListener() {
|
799
|
+
@Override
|
800
|
+
public void actionPerformed(ActionEvent evt) {
|
801
|
+
renderMenuItemActionPerformed(evt);
|
802
|
+
}
|
803
|
+
});
|
804
|
+
}
|
805
|
+
{
|
806
|
+
iprMenuItem = new JMenuItem();
|
807
|
+
sceneMenu.add(iprMenuItem);
|
808
|
+
iprMenuItem.setText("IPR");
|
809
|
+
iprMenuItem.addActionListener(new ActionListener() {
|
810
|
+
@Override
|
811
|
+
public void actionPerformed(ActionEvent evt) {
|
812
|
+
iprMenuItemActionPerformed(evt);
|
813
|
+
}
|
814
|
+
});
|
815
|
+
}
|
816
|
+
{
|
817
|
+
clearLogMenuItem = new JCheckBoxMenuItem();
|
818
|
+
sceneMenu.add(clearLogMenuItem);
|
819
|
+
clearLogMenuItem.setText("Auto Clear Log");
|
820
|
+
clearLogMenuItem.setToolTipText("Clears the console before building or rendering");
|
821
|
+
clearLogMenuItem.setSelected(true);
|
822
|
+
}
|
823
|
+
{
|
824
|
+
jSeparator4 = new JSeparator();
|
825
|
+
sceneMenu.add(jSeparator4);
|
826
|
+
}
|
827
|
+
{
|
828
|
+
textureCacheClearMenuItem = new JMenuItem();
|
829
|
+
sceneMenu.add(textureCacheClearMenuItem);
|
830
|
+
textureCacheClearMenuItem.setText("Clear Texture Cache");
|
831
|
+
textureCacheClearMenuItem.addActionListener(new ActionListener() {
|
832
|
+
@Override
|
833
|
+
public void actionPerformed(ActionEvent evt) {
|
834
|
+
textureCacheClearMenuItemActionPerformed(evt);
|
835
|
+
}
|
836
|
+
});
|
837
|
+
}
|
838
|
+
{
|
839
|
+
smallTrianglesMenuItem = new JCheckBoxMenuItem();
|
840
|
+
sceneMenu.add(smallTrianglesMenuItem);
|
841
|
+
smallTrianglesMenuItem.setText("Low Mem Triangles");
|
842
|
+
smallTrianglesMenuItem.setToolTipText("Load future meshes using a low memory footprint triangle representation");
|
843
|
+
smallTrianglesMenuItem.addActionListener(new ActionListener() {
|
844
|
+
@Override
|
845
|
+
public void actionPerformed(ActionEvent evt) {
|
846
|
+
smallTrianglesMenuItemActionPerformed(evt);
|
847
|
+
}
|
848
|
+
});
|
849
|
+
}
|
850
|
+
}
|
851
|
+
{
|
852
|
+
imageMenu = new JMenu();
|
853
|
+
jMenuBar1.add(imageMenu);
|
854
|
+
imageMenu.setText("Image");
|
855
|
+
{
|
856
|
+
resetZoomMenuItem = new JMenuItem();
|
857
|
+
imageMenu.add(resetZoomMenuItem);
|
858
|
+
resetZoomMenuItem.setText("Reset Zoom");
|
859
|
+
resetZoomMenuItem.addActionListener(new ActionListener() {
|
860
|
+
@Override
|
861
|
+
public void actionPerformed(ActionEvent evt) {
|
862
|
+
imagePanel.reset();
|
863
|
+
}
|
864
|
+
});
|
865
|
+
}
|
866
|
+
{
|
867
|
+
fitWindowMenuItem = new JMenuItem();
|
868
|
+
imageMenu.add(fitWindowMenuItem);
|
869
|
+
fitWindowMenuItem.setText("Fit to Window");
|
870
|
+
fitWindowMenuItem.addActionListener(new ActionListener() {
|
871
|
+
@Override
|
872
|
+
public void actionPerformed(ActionEvent evt) {
|
873
|
+
imagePanel.fit();
|
874
|
+
}
|
875
|
+
});
|
876
|
+
}
|
877
|
+
{
|
878
|
+
jSeparator1 = new JSeparator();
|
879
|
+
imageMenu.add(jSeparator1);
|
880
|
+
}
|
881
|
+
{
|
882
|
+
jMenuItem4 = new JMenuItem();
|
883
|
+
imageMenu.add(jMenuItem4);
|
884
|
+
jMenuItem4.setText("Save Image ...");
|
885
|
+
jMenuItem4.addActionListener(new ActionListener() {
|
886
|
+
@Override
|
887
|
+
public void actionPerformed(ActionEvent evt) {
|
888
|
+
// imagePanel.image;
|
889
|
+
JFileChooser fc = new JFileChooser(".");
|
890
|
+
fc.setFileFilter(new FileFilter() {
|
891
|
+
@Override
|
892
|
+
public String getDescription() {
|
893
|
+
return "Image File";
|
894
|
+
}
|
895
|
+
|
896
|
+
@Override
|
897
|
+
public boolean accept(File f) {
|
898
|
+
return (f.isDirectory() || f.getName().endsWith(".png") || f.getName().endsWith(".tga"));
|
899
|
+
}
|
900
|
+
});
|
901
|
+
if (fc.showSaveDialog(SunflowGUI.this) == JFileChooser.APPROVE_OPTION) {
|
902
|
+
String filename = fc.getSelectedFile().getAbsolutePath();
|
903
|
+
imagePanel.save(filename);
|
904
|
+
}
|
905
|
+
}
|
906
|
+
});
|
907
|
+
}
|
908
|
+
}
|
909
|
+
{
|
910
|
+
windowMenu = new JMenu();
|
911
|
+
jMenuBar1.add(windowMenu);
|
912
|
+
windowMenu.setText("Window");
|
913
|
+
}
|
914
|
+
{
|
915
|
+
imageWindowMenuItem = new JMenuItem();
|
916
|
+
windowMenu.add(imageWindowMenuItem);
|
917
|
+
imageWindowMenuItem.setText("Image");
|
918
|
+
imageWindowMenuItem.setAccelerator(KeyStroke.getKeyStroke("ctrl 1"));
|
919
|
+
imageWindowMenuItem.addActionListener(new ActionListener() {
|
920
|
+
@Override
|
921
|
+
public void actionPerformed(ActionEvent evt) {
|
922
|
+
selectFrame(imagePanelFrame);
|
923
|
+
}
|
924
|
+
});
|
925
|
+
}
|
926
|
+
{
|
927
|
+
editorWindowMenuItem = new JMenuItem();
|
928
|
+
windowMenu.add(editorWindowMenuItem);
|
929
|
+
editorWindowMenuItem.setText("Script Editor");
|
930
|
+
editorWindowMenuItem.setAccelerator(KeyStroke.getKeyStroke("ctrl 2"));
|
931
|
+
editorWindowMenuItem.addActionListener(new ActionListener() {
|
932
|
+
@Override
|
933
|
+
public void actionPerformed(ActionEvent evt) {
|
934
|
+
selectFrame(editorFrame);
|
935
|
+
}
|
936
|
+
});
|
937
|
+
}
|
938
|
+
{
|
939
|
+
consoleWindowMenuItem = new JMenuItem();
|
940
|
+
windowMenu.add(consoleWindowMenuItem);
|
941
|
+
consoleWindowMenuItem.setText("Console");
|
942
|
+
consoleWindowMenuItem.setAccelerator(KeyStroke.getKeyStroke("ctrl 3"));
|
943
|
+
consoleWindowMenuItem.addActionListener(new ActionListener() {
|
944
|
+
@Override
|
945
|
+
public void actionPerformed(ActionEvent evt) {
|
946
|
+
selectFrame(consoleFrame);
|
947
|
+
}
|
948
|
+
});
|
949
|
+
}
|
950
|
+
{
|
951
|
+
jSeparator5 = new JSeparator();
|
952
|
+
windowMenu.add(jSeparator5);
|
953
|
+
}
|
954
|
+
{
|
955
|
+
tileWindowMenuItem = new JMenuItem();
|
956
|
+
windowMenu.add(tileWindowMenuItem);
|
957
|
+
tileWindowMenuItem.setText("Tile");
|
958
|
+
tileWindowMenuItem.setAccelerator(KeyStroke.getKeyStroke("ctrl T"));
|
959
|
+
tileWindowMenuItem.addActionListener(new ActionListener() {
|
960
|
+
@Override
|
961
|
+
public void actionPerformed(ActionEvent evt) {
|
962
|
+
tileWindowMenuItemActionPerformed(evt);
|
963
|
+
}
|
964
|
+
});
|
965
|
+
}
|
966
|
+
}
|
967
|
+
}
|
968
|
+
|
969
|
+
private void newFileMenuItemActionPerformed(ActionEvent evt) {
|
970
|
+
if (evt != null) {
|
971
|
+
// check save?
|
972
|
+
}
|
973
|
+
// put some template code into the editor
|
974
|
+
String template = "import org.sunflow.core.*;\nimport org.sunflow.core.accel.*;\nimport org.sunflow.core.camera.*;\nimport org.sunflow.core.primitive.*;\nimport org.sunflow.core.shader.*;\nimport org.sunflow.image.Color;\nimport org.sunflow.math.*;\n\npublic void build() {\n // your code goes here\n\n}\n";
|
975
|
+
editorTextArea.setText(template);
|
976
|
+
}
|
977
|
+
|
978
|
+
private void openFileMenuItemActionPerformed(ActionEvent evt) {
|
979
|
+
JFileChooser fc = new JFileChooser(".");
|
980
|
+
if (lastSaveDirectory != null) {
|
981
|
+
fc.setCurrentDirectory(lastSaveDirectory);
|
982
|
+
}
|
983
|
+
fc.setFileFilter(new FileFilter() {
|
984
|
+
@Override
|
985
|
+
public String getDescription() {
|
986
|
+
return "Scene File";
|
987
|
+
}
|
988
|
+
|
989
|
+
@Override
|
990
|
+
public boolean accept(File f) {
|
991
|
+
return (f.isDirectory() || f.getName().endsWith(".sc") || f.getName().endsWith(JAVA_EXT));
|
992
|
+
}
|
993
|
+
});
|
994
|
+
|
995
|
+
if (fc.showOpenDialog(SunflowGUI.this) == JFileChooser.APPROVE_OPTION) {
|
996
|
+
final String f = fc.getSelectedFile().getAbsolutePath();
|
997
|
+
openFile(f);
|
998
|
+
lastSaveDirectory = fc.getSelectedFile().getParentFile();
|
999
|
+
}
|
1000
|
+
}
|
1001
|
+
|
1002
|
+
private void buildMenuItemActionPerformed(ActionEvent evt) {
|
1003
|
+
new Thread() {
|
1004
|
+
@Override
|
1005
|
+
public void run() {
|
1006
|
+
setEnableInterface(false);
|
1007
|
+
if (clearLogMenuItem.isSelected()) {
|
1008
|
+
clearConsole();
|
1009
|
+
}
|
1010
|
+
Timer t = new Timer();
|
1011
|
+
t.start();
|
1012
|
+
try {
|
1013
|
+
api = SunflowAPI.compile(editorTextArea.getText());
|
1014
|
+
} catch (NoClassDefFoundError e) {
|
1015
|
+
UI.printError(Module.GUI, "Janino library not found. Please check command line.");
|
1016
|
+
api = null;
|
1017
|
+
}
|
1018
|
+
if (api != null) {
|
1019
|
+
try {
|
1020
|
+
if (currentFile != null) {
|
1021
|
+
String dir = new File(currentFile).getAbsoluteFile().getParent();
|
1022
|
+
api.searchpath("texture", dir);
|
1023
|
+
api.searchpath("include", dir);
|
1024
|
+
}
|
1025
|
+
api.build();
|
1026
|
+
|
1027
|
+
|
1028
|
+
} catch (Exception e) {
|
1029
|
+
UI.printError(Module.GUI, "Build terminated abnormally: %s", e.getMessage());
|
1030
|
+
for (StackTraceElement elt : e.getStackTrace()) {
|
1031
|
+
UI.printInfo(Module.GUI, " at %s", elt.toString());
|
1032
|
+
}
|
1033
|
+
Logger.getLogger(SunflowGUI.class.getName()).log(Level.SEVERE, null, e);
|
1034
|
+
}
|
1035
|
+
t.end();
|
1036
|
+
UI.printInfo(Module.GUI, "Build time: %s", t.toString());
|
1037
|
+
}
|
1038
|
+
setEnableInterface(true);
|
1039
|
+
}
|
1040
|
+
}.start();
|
1041
|
+
}
|
1042
|
+
|
1043
|
+
private void clearConsole() {
|
1044
|
+
consoleTextArea.setText(null);
|
1045
|
+
}
|
1046
|
+
|
1047
|
+
private void println(final String s) {
|
1048
|
+
SwingUtilities.invokeLater(new Runnable() {
|
1049
|
+
@Override
|
1050
|
+
public void run() {
|
1051
|
+
consoleTextArea.append(s + "\n");
|
1052
|
+
}
|
1053
|
+
});
|
1054
|
+
}
|
1055
|
+
|
1056
|
+
private void setEnableInterface(boolean enabled) {
|
1057
|
+
// lock or unlock options which are unsafe during builds or renders
|
1058
|
+
newFileMenuItem.setEnabled(enabled);
|
1059
|
+
openFileMenuItem.setEnabled(enabled);
|
1060
|
+
saveMenuItem.setEnabled(enabled);
|
1061
|
+
saveAsMenuItem.setEnabled(enabled);
|
1062
|
+
sceneMenu.setEnabled(enabled);
|
1063
|
+
buildButton.setEnabled(enabled);
|
1064
|
+
renderButton.setEnabled(enabled);
|
1065
|
+
iprButton.setEnabled(enabled);
|
1066
|
+
}
|
1067
|
+
|
1068
|
+
@Override
|
1069
|
+
public void print(Module m, PrintLevel level, String s) {
|
1070
|
+
if (level == PrintLevel.ERROR) {
|
1071
|
+
JOptionPane.showMessageDialog(SunflowGUI.this, s, String.format("Error - %s", m.name()), JOptionPane.ERROR_MESSAGE);
|
1072
|
+
}
|
1073
|
+
println(UI.formatOutput(m, level, s));
|
1074
|
+
}
|
1075
|
+
|
1076
|
+
@Override
|
1077
|
+
public void taskStart(String s, int min, int max) {
|
1078
|
+
currentTask = s;
|
1079
|
+
currentTaskLastP = -1;
|
1080
|
+
final int taskMin = min;
|
1081
|
+
final int taskMax = max;
|
1082
|
+
SwingUtilities.invokeLater(new Runnable() {
|
1083
|
+
@Override
|
1084
|
+
public void run() {
|
1085
|
+
taskProgressBar.setEnabled(true);
|
1086
|
+
taskCancelButton.setEnabled(true);
|
1087
|
+
taskProgressBar.setMinimum(taskMin);
|
1088
|
+
taskProgressBar.setMaximum(taskMax);
|
1089
|
+
taskProgressBar.setValue(taskMin);
|
1090
|
+
taskProgressBar.setString(currentTask);
|
1091
|
+
}
|
1092
|
+
});
|
1093
|
+
}
|
1094
|
+
|
1095
|
+
@Override
|
1096
|
+
public void taskUpdate(int current) {
|
1097
|
+
final int taskCurrent = current;
|
1098
|
+
final String taskString = currentTask;
|
1099
|
+
SwingUtilities.invokeLater(new Runnable() {
|
1100
|
+
@Override
|
1101
|
+
public void run() {
|
1102
|
+
taskProgressBar.setValue(taskCurrent);
|
1103
|
+
int p = (int) (100.0 * taskProgressBar.getPercentComplete());
|
1104
|
+
if (p > currentTaskLastP) {
|
1105
|
+
taskProgressBar.setString(taskString + " [" + p + "%]");
|
1106
|
+
currentTaskLastP = p;
|
1107
|
+
}
|
1108
|
+
}
|
1109
|
+
});
|
1110
|
+
}
|
1111
|
+
|
1112
|
+
@Override
|
1113
|
+
public void taskStop() {
|
1114
|
+
SwingUtilities.invokeLater(new Runnable() {
|
1115
|
+
@Override
|
1116
|
+
public void run() {
|
1117
|
+
taskProgressBar.setValue(taskProgressBar.getMinimum());
|
1118
|
+
taskProgressBar.setString("");
|
1119
|
+
taskProgressBar.setEnabled(false);
|
1120
|
+
taskCancelButton.setEnabled(false);
|
1121
|
+
}
|
1122
|
+
});
|
1123
|
+
}
|
1124
|
+
|
1125
|
+
private void renderMenuItemActionPerformed(ActionEvent evt) {
|
1126
|
+
new Thread() {
|
1127
|
+
@Override
|
1128
|
+
public void run() {
|
1129
|
+
setEnableInterface(false);
|
1130
|
+
if (clearLogMenuItem.isSelected()) {
|
1131
|
+
clearConsole();
|
1132
|
+
}
|
1133
|
+
if (api != null) {
|
1134
|
+
api.parameter("sampler", "bucket");
|
1135
|
+
api.options(SunflowAPI.DEFAULT_OPTIONS);
|
1136
|
+
api.render(SunflowAPI.DEFAULT_OPTIONS, imagePanel);
|
1137
|
+
} else {
|
1138
|
+
UI.printError(Module.GUI, "Nothing to render!");
|
1139
|
+
}
|
1140
|
+
setEnableInterface(true);
|
1141
|
+
}
|
1142
|
+
}.start();
|
1143
|
+
}
|
1144
|
+
|
1145
|
+
private void iprMenuItemActionPerformed(ActionEvent evt) {
|
1146
|
+
new Thread() {
|
1147
|
+
@Override
|
1148
|
+
public void run() {
|
1149
|
+
setEnableInterface(false);
|
1150
|
+
if (clearLogMenuItem.isSelected()) {
|
1151
|
+
clearConsole();
|
1152
|
+
}
|
1153
|
+
if (api != null) {
|
1154
|
+
api.parameter("sampler", "ipr");
|
1155
|
+
api.options(SunflowAPI.DEFAULT_OPTIONS);
|
1156
|
+
api.render(SunflowAPI.DEFAULT_OPTIONS, imagePanel);
|
1157
|
+
} else {
|
1158
|
+
UI.printError(Module.GUI, "Nothing to IPR!");
|
1159
|
+
}
|
1160
|
+
setEnableInterface(true);
|
1161
|
+
}
|
1162
|
+
}.start();
|
1163
|
+
}
|
1164
|
+
|
1165
|
+
private void textureCacheClearMenuItemActionPerformed(ActionEvent evt) {
|
1166
|
+
TextureCache.flush();
|
1167
|
+
}
|
1168
|
+
|
1169
|
+
private void smallTrianglesMenuItemActionPerformed(ActionEvent evt) {
|
1170
|
+
TriangleMesh.setSmallTriangles(smallTrianglesMenuItem.isSelected());
|
1171
|
+
}
|
1172
|
+
|
1173
|
+
private void saveAsMenuItemActionPerformed(ActionEvent evt) {
|
1174
|
+
JFileChooser fc = new JFileChooser(".");
|
1175
|
+
if (lastSaveDirectory != null) {
|
1176
|
+
fc.setCurrentDirectory(lastSaveDirectory);
|
1177
|
+
}
|
1178
|
+
fc.setFileFilter(new FileFilter() {
|
1179
|
+
@Override
|
1180
|
+
public String getDescription() {
|
1181
|
+
return "Scene File";
|
1182
|
+
}
|
1183
|
+
|
1184
|
+
@Override
|
1185
|
+
public boolean accept(File f) {
|
1186
|
+
return (f.isDirectory() || f.getName().endsWith(JAVA_EXT));
|
1187
|
+
}
|
1188
|
+
});
|
1189
|
+
|
1190
|
+
if (fc.showSaveDialog(SunflowGUI.this) == JFileChooser.APPROVE_OPTION) {
|
1191
|
+
String f = fc.getSelectedFile().getAbsolutePath();
|
1192
|
+
if (!f.endsWith(JAVA_EXT)) {
|
1193
|
+
f += JAVA_EXT;
|
1194
|
+
}
|
1195
|
+
File file = new File(f);
|
1196
|
+
if (!file.exists() || JOptionPane.showConfirmDialog(SunflowGUI.this, "This file already exists.\nOverwrite?", "Warning", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
|
1197
|
+
// save file
|
1198
|
+
saveCurrentFile(f);
|
1199
|
+
lastSaveDirectory = file.getParentFile();
|
1200
|
+
}
|
1201
|
+
}
|
1202
|
+
}
|
1203
|
+
|
1204
|
+
private void saveCurrentFile(String filename) {
|
1205
|
+
if (filename == null) {
|
1206
|
+
// no filename was picked, go to save as dialog
|
1207
|
+
saveAsMenuItemActionPerformed(null);
|
1208
|
+
return;
|
1209
|
+
}
|
1210
|
+
FileWriter file;
|
1211
|
+
try {
|
1212
|
+
file = new FileWriter(filename);
|
1213
|
+
// get text from editor pane
|
1214
|
+
file.write(editorTextArea.getText());
|
1215
|
+
file.close();
|
1216
|
+
// update current filename
|
1217
|
+
currentFile = filename;
|
1218
|
+
UI.printInfo(Module.GUI, "Saved current script to \"%s\"", filename);
|
1219
|
+
} catch (IOException e) {
|
1220
|
+
UI.printError(Module.GUI, "Unable to save: \"%s\"", filename);
|
1221
|
+
Logger.getLogger(SunflowGUI.class.getName()).log(Level.SEVERE, null, e);
|
1222
|
+
}
|
1223
|
+
}
|
1224
|
+
|
1225
|
+
private void selectFrame(JInternalFrame frame) {
|
1226
|
+
try {
|
1227
|
+
frame.setSelected(true);
|
1228
|
+
frame.setIcon(false);
|
1229
|
+
} catch (PropertyVetoException e) {
|
1230
|
+
// this should never happen
|
1231
|
+
Logger.getLogger(SunflowGUI.class.getName()).log(Level.SEVERE, null, e);
|
1232
|
+
}
|
1233
|
+
}
|
1234
|
+
|
1235
|
+
private void tileWindowMenuItemActionPerformed(ActionEvent evt) {
|
1236
|
+
try {
|
1237
|
+
if (imagePanelFrame.isIcon()) {
|
1238
|
+
imagePanelFrame.setIcon(false);
|
1239
|
+
}
|
1240
|
+
if (editorFrame.isIcon()) {
|
1241
|
+
editorFrame.setIcon(false);
|
1242
|
+
}
|
1243
|
+
if (consoleFrame.isIcon()) {
|
1244
|
+
consoleFrame.setIcon(false);
|
1245
|
+
}
|
1246
|
+
|
1247
|
+
int width = desktop.getWidth();
|
1248
|
+
int height = desktop.getHeight();
|
1249
|
+
int widthLeft = width * 7 / 12;
|
1250
|
+
int widthRight = width - widthLeft;
|
1251
|
+
int pad = 2;
|
1252
|
+
int pad2 = pad + pad;
|
1253
|
+
|
1254
|
+
imagePanelFrame.reshape(pad, pad, widthLeft - pad2, height - pad2);
|
1255
|
+
editorFrame.reshape(pad + widthLeft, pad, widthRight - pad2, height / 2 - pad2);
|
1256
|
+
consoleFrame.reshape(pad + widthLeft, pad + height / 2, widthRight - pad2, height / 2 - pad2);
|
1257
|
+
} catch (PropertyVetoException e) {
|
1258
|
+
Logger.getLogger(SunflowGUI.class.getName()).log(Level.SEVERE, null, e);
|
1259
|
+
}
|
1260
|
+
}
|
1261
|
+
|
1262
|
+
private void openFile(String filename) {
|
1263
|
+
if (filename.endsWith(JAVA_EXT)) {
|
1264
|
+
// read the file line by line
|
1265
|
+
String code = "";
|
1266
|
+
FileReader file;
|
1267
|
+
try {
|
1268
|
+
file = new FileReader(filename);
|
1269
|
+
BufferedReader bf = new BufferedReader(file);
|
1270
|
+
while (true) {
|
1271
|
+
String line;
|
1272
|
+
line = bf.readLine();
|
1273
|
+
if (line == null) {
|
1274
|
+
break;
|
1275
|
+
}
|
1276
|
+
code += line;
|
1277
|
+
code += "\n";
|
1278
|
+
}
|
1279
|
+
file.close();
|
1280
|
+
editorTextArea.setText(code);
|
1281
|
+
} catch (FileNotFoundException e) {
|
1282
|
+
UI.printError(Module.GUI, "Unable to load: \"%s\"", filename);
|
1283
|
+
return;
|
1284
|
+
} catch (IOException e) {
|
1285
|
+
UI.printError(Module.GUI, "Unable to load: \"%s\"", filename);
|
1286
|
+
return;
|
1287
|
+
}
|
1288
|
+
// loade went ok, use filename as current
|
1289
|
+
currentFile = filename;
|
1290
|
+
UI.printInfo(Module.GUI, "Loaded script: \"%s\"", filename);
|
1291
|
+
} else if (filename.endsWith(".sc")) {
|
1292
|
+
String template = "import org.sunflow.core.*;\nimport org.sunflow.core.accel.*;\nimport org.sunflow.core.camera.*;\nimport org.sunflow.core.primitive.*;\nimport org.sunflow.core.shader.*;\nimport org.sunflow.image.Color;\nimport org.sunflow.math.*;\n\npublic void build() {\n include(\"" + filename.replace("\\", "\\\\") + "\");\n}\n";
|
1293
|
+
editorTextArea.setText(template);
|
1294
|
+
// no java file associated
|
1295
|
+
currentFile = null;
|
1296
|
+
UI.printInfo(Module.GUI, "Created template for \"%s\"", filename);
|
1297
|
+
} else {
|
1298
|
+
UI.printError(Module.GUI, "Unknown file format selected");
|
1299
|
+
return;
|
1300
|
+
}
|
1301
|
+
editorTextArea.setCaretPosition(0);
|
1302
|
+
if (autoBuildMenuItem.isSelected()) {
|
1303
|
+
// try to compile the code we just loaded
|
1304
|
+
buildMenuItemActionPerformed(null);
|
1305
|
+
}
|
1306
|
+
|
1307
|
+
}
|
1308
|
+
|
1309
|
+
private class SceneTransferHandler extends TransferHandler {
|
1310
|
+
|
1311
|
+
@Override
|
1312
|
+
public boolean importData(JComponent c, Transferable t) {
|
1313
|
+
if (!sceneMenu.isEnabled()) {
|
1314
|
+
return false;
|
1315
|
+
}
|
1316
|
+
// can I import it?
|
1317
|
+
if (!canImport(c, t.getTransferDataFlavors())) {
|
1318
|
+
return false;
|
1319
|
+
}
|
1320
|
+
try {
|
1321
|
+
// get a List of Files
|
1322
|
+
@SuppressWarnings("unchecked") // because they are nonsense here
|
1323
|
+
List<File> files = (java.util.List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
|
1324
|
+
for (File file : files) {
|
1325
|
+
String filename = file.getAbsolutePath();
|
1326
|
+
// check extension
|
1327
|
+
if (filename.endsWith(".sc") || filename.endsWith(JAVA_EXT)) {
|
1328
|
+
openFile(filename);
|
1329
|
+
// load only one file at a time, stop here
|
1330
|
+
break;
|
1331
|
+
}
|
1332
|
+
}
|
1333
|
+
} catch (Exception exp) {
|
1334
|
+
Logger.getLogger(SunflowGUI.class.getName()).log(Level.SEVERE, null, exp);
|
1335
|
+
}
|
1336
|
+
|
1337
|
+
return false;
|
1338
|
+
}
|
1339
|
+
|
1340
|
+
@Override
|
1341
|
+
public boolean canImport(JComponent c, DataFlavor[] flavors) {
|
1342
|
+
// Just a quick check to see if a file can be accepted at this time
|
1343
|
+
// Are there any files around?
|
1344
|
+
for (int i = 0; i < flavors.length; i++) {
|
1345
|
+
if (flavors[i].isFlavorJavaFileListType()) {
|
1346
|
+
return true;
|
1347
|
+
}
|
1348
|
+
}
|
1349
|
+
|
1350
|
+
// guess not
|
1351
|
+
return false;
|
1352
|
+
}
|
1353
|
+
}
|
1354
|
+
}
|