joonsrenderer 1.1.3-java → 1.2.0-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 +5 -5
- data/.mvn/extensions.xml +1 -1
- data/.mvn/wrapper/maven-wrapper.properties +1 -0
- data/CHANGELOG.md +3 -1
- data/Rakefile +1 -1
- data/docs/Gemfile +2 -0
- data/docs/_config.yml +3 -0
- data/docs/_includes/header.html +1 -1
- data/docs/_includes/top.html +11 -0
- data/docs/_layouts/default.html +6 -15
- data/docs/about.md +2 -2
- data/joonsrenderer.gemspec +2 -2
- data/lib/joonsrenderer/version.rb +1 -1
- data/pom.rb +4 -4
- data/pom.xml +7 -7
- data/src/{test/java/a_maintest.java → a_maintest.java} +1 -1
- data/src/main/java/SunflowGUI.java +294 -352
- data/src/main/java/org/sunflow/AsciiFileSunflowAPI.java +1 -1
- data/src/main/java/org/sunflow/BinaryFileSunflowAPI.java +1 -1
- data/src/main/java/org/sunflow/SunflowAPI.java +2 -2
- data/src/main/java/org/sunflow/core/GIEngine.java +3 -1
- data/src/main/java/org/sunflow/core/ImageSampler.java +3 -0
- data/src/main/java/org/sunflow/core/InstanceList.java +1 -1
- data/src/main/java/org/sunflow/core/IntersectionState.java +7 -6
- data/src/main/java/org/sunflow/core/ParameterList.java +3 -2
- data/src/main/java/org/sunflow/core/PhotonStore.java +1 -0
- data/src/main/java/org/sunflow/core/Ray.java +4 -3
- data/src/main/java/org/sunflow/core/TextureCache.java +1 -1
- data/src/main/java/org/sunflow/core/accel/BoundingIntervalHierarchy.java +1 -1
- data/src/main/java/org/sunflow/core/photonmap/CausticPhotonMap.java +1 -1
- data/src/main/java/org/sunflow/core/renderer/BucketRenderer.java +3 -1
- data/src/main/java/org/sunflow/image/writers/EXRBitmapWriter.java +28 -19
- data/src/main/java/org/sunflow/image/writers/PNGBitmapWriter.java +5 -0
- data/src/main/java/org/sunflow/image/writers/TGABitmapWriter.java +20 -14
- data/src/main/java/org/sunflow/system/BenchmarkFramework.java +2 -2
- data/src/main/java/org/sunflow/system/RenderGlobalsPanel.java +5 -4
- metadata +9 -8
- data/docs/_includes/head.html +0 -15
@@ -12,7 +12,7 @@ import org.sunflow.math.Matrix4;
|
|
12
12
|
|
13
13
|
class AsciiFileSunflowAPI extends FileSunflowAPI {
|
14
14
|
|
15
|
-
private OutputStream stream;
|
15
|
+
private final OutputStream stream;
|
16
16
|
|
17
17
|
AsciiFileSunflowAPI(String filename) throws IOException {
|
18
18
|
stream = new BufferedOutputStream(new FileOutputStream(filename));
|
@@ -12,7 +12,7 @@ import org.sunflow.math.Matrix4;
|
|
12
12
|
|
13
13
|
class BinaryFileSunflowAPI extends FileSunflowAPI {
|
14
14
|
|
15
|
-
private DataOutputStream stream;
|
15
|
+
private final DataOutputStream stream;
|
16
16
|
|
17
17
|
BinaryFileSunflowAPI(String filename) throws FileNotFoundException {
|
18
18
|
stream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(filename)));
|
@@ -639,7 +639,7 @@ public class SunflowAPI implements SunflowAPIInterface {
|
|
639
639
|
if (filename == null) {
|
640
640
|
return new SunflowAPI();
|
641
641
|
}
|
642
|
-
SunflowAPI api
|
642
|
+
SunflowAPI api;
|
643
643
|
if (filename.endsWith(".java")) {
|
644
644
|
Timer t = new Timer();
|
645
645
|
UI.printInfo(Module.API, "Compiling \"" + filename + "\" ...");
|
@@ -684,7 +684,7 @@ public class SunflowAPI implements SunflowAPIInterface {
|
|
684
684
|
* @return <code>true</code> upon success, <code>false</code> otherwise
|
685
685
|
*/
|
686
686
|
public static boolean translate(String filename, String outputFilename) {
|
687
|
-
FileSunflowAPI api
|
687
|
+
FileSunflowAPI api;
|
688
688
|
try {
|
689
689
|
if (outputFilename.endsWith(".sca")) {
|
690
690
|
api = new AsciiFileSunflowAPI(outputFilename);
|
@@ -21,8 +21,10 @@ public interface GIEngine {
|
|
21
21
|
public Color getGlobalRadiance(ShadingState state);
|
22
22
|
|
23
23
|
/**
|
24
|
-
* Initialize the engine.
|
24
|
+
* Initialize the engine.This is called before rendering begins.
|
25
25
|
*
|
26
|
+
* @param options
|
27
|
+
* @param scene
|
26
28
|
* @return <code>true</code> if the init phase succeeded, <code>false</code>
|
27
29
|
* otherwise
|
28
30
|
*/
|
@@ -10,8 +10,11 @@ public interface ImageSampler {
|
|
10
10
|
/**
|
11
11
|
* Prepare the sampler for rendering an image of w x h pixels
|
12
12
|
*
|
13
|
+
* @param options
|
14
|
+
* @param scene
|
13
15
|
* @param w width of the image
|
14
16
|
* @param h height of the image
|
17
|
+
* @return
|
15
18
|
*/
|
16
19
|
public boolean prepare(Options options, Scene scene, int w, int h);
|
17
20
|
|
@@ -36,9 +36,9 @@ public final class IntersectionState {
|
|
36
36
|
* Initializes all traversal stacks.
|
37
37
|
*/
|
38
38
|
public IntersectionState() {
|
39
|
-
for (
|
40
|
-
for (int j = 0; j <
|
41
|
-
|
39
|
+
for (StackNode[] stack : stacks) {
|
40
|
+
for (int j = 0; j < stack.length; j++) {
|
41
|
+
stack[j] = new StackNode();
|
42
42
|
}
|
43
43
|
}
|
44
44
|
}
|
@@ -102,13 +102,14 @@ public final class IntersectionState {
|
|
102
102
|
}
|
103
103
|
|
104
104
|
/**
|
105
|
-
* Record an intersection with the specified primitive id.
|
106
|
-
|
107
|
-
|
105
|
+
* Record an intersection with the specified primitive id.The parent object
|
106
|
+
is assumed to be the current instance. The u and v parameters are used to
|
107
|
+
pinpoint the location on the surface if needed.
|
108
108
|
*
|
109
109
|
* @param id primitive id of the intersected object
|
110
110
|
* @param u u surface paramater of the intersection point
|
111
111
|
* @param v v surface parameter of the intersection point
|
112
|
+
* @param w
|
112
113
|
*/
|
113
114
|
public final void setIntersection(int id, float u, float v, float w) {
|
114
115
|
instance = current;
|
@@ -36,13 +36,14 @@ public class ParameterList {
|
|
36
36
|
* Creates an empty ParameterList.
|
37
37
|
*/
|
38
38
|
public ParameterList() {
|
39
|
-
list = new FastHashMap
|
39
|
+
list = new FastHashMap<>();
|
40
40
|
numVerts = numFaces = numFaceVerts = 0;
|
41
41
|
}
|
42
42
|
|
43
43
|
/**
|
44
|
-
* Clears the list of all its members.
|
44
|
+
* Clears the list of all its members.If some members were never used, a
|
45
45
|
* warning will be printed to remind the user something may be wrong.
|
46
|
+
* @param showUnused
|
46
47
|
*/
|
47
48
|
public void clear(boolean showUnused) {
|
48
49
|
if (showUnused) {
|
@@ -95,11 +95,12 @@ public final class Ray {
|
|
95
95
|
}
|
96
96
|
|
97
97
|
/**
|
98
|
-
* Create a new ray by transforming the supplied one by the given matrix.
|
99
|
-
|
100
|
-
|
98
|
+
* Create a new ray by transforming the supplied one by the given matrix.If
|
99
|
+
the matrix is
|
100
|
+
<code>null</code>, the original ray is returned.
|
101
101
|
*
|
102
102
|
* @param m matrix to transform the ray by
|
103
|
+
* @return
|
103
104
|
*/
|
104
105
|
public Ray transform(Matrix4 m) {
|
105
106
|
if (m == null) {
|
@@ -11,7 +11,7 @@ import org.sunflow.system.UI.Module;
|
|
11
11
|
*/
|
12
12
|
public final class TextureCache {
|
13
13
|
|
14
|
-
private static HashMap<String, Texture> textures = new HashMap
|
14
|
+
private static final HashMap<String, Texture> textures = new HashMap<>();
|
15
15
|
|
16
16
|
private TextureCache() {
|
17
17
|
}
|
@@ -17,7 +17,7 @@ public class BoundingIntervalHierarchy implements AccelerationStructure {
|
|
17
17
|
private int[] objects;
|
18
18
|
private PrimitiveList primitives;
|
19
19
|
private BoundingBox bounds;
|
20
|
-
private int maxPrims;
|
20
|
+
private final int maxPrims;
|
21
21
|
|
22
22
|
public BoundingIntervalHierarchy() {
|
23
23
|
maxPrims = 2;
|
@@ -34,7 +34,7 @@ public class BucketRenderer implements ImageSampler {
|
|
34
34
|
private int bucketSize;
|
35
35
|
private int bucketCounter;
|
36
36
|
private int[] bucketCoords;
|
37
|
-
private boolean dumpBuckets;
|
37
|
+
private final boolean dumpBuckets;
|
38
38
|
// anti-aliasing
|
39
39
|
private int minAADepth;
|
40
40
|
private int maxAADepth;
|
@@ -67,6 +67,7 @@ public class BucketRenderer implements ImageSampler {
|
|
67
67
|
dumpBuckets = false; // for debugging only - not user settable
|
68
68
|
}
|
69
69
|
|
70
|
+
@Override
|
70
71
|
public boolean prepare(Options options, Scene scene, int w, int h) {
|
71
72
|
this.scene = scene;
|
72
73
|
imageWidth = w;
|
@@ -142,6 +143,7 @@ public class BucketRenderer implements ImageSampler {
|
|
142
143
|
return String.format("%s%d sample%s", depth < 0 ? "1/" : "", pixelAA * pixelAA, depth == 0 ? "" : "s");
|
143
144
|
}
|
144
145
|
|
146
|
+
@Override
|
145
147
|
public void render(Display display) {
|
146
148
|
this.display = display;
|
147
149
|
display.imageBegin(imageWidth, imageHeight, bucketSize);
|
@@ -48,27 +48,36 @@ public class EXRBitmapWriter implements BitmapWriter {
|
|
48
48
|
@Override
|
49
49
|
public final void configure(final String option, String value) {
|
50
50
|
if (option.equals(COMPRESSION)) {
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
51
|
+
switch (value) {
|
52
|
+
case "none":
|
53
|
+
compression = NO_COMPRESSION;
|
54
|
+
break;
|
55
|
+
case "rle":
|
56
|
+
compression = RLE_COMPRESSION;
|
57
|
+
break;
|
58
|
+
case "zip":
|
59
|
+
compression = ZIP_COMPRESSION;
|
60
|
+
break;
|
61
|
+
default:
|
62
|
+
UI.printWarning(Module.IMG, "EXR - Compression type was not recognized - defaulting to zip");
|
63
|
+
compression = ZIP_COMPRESSION;
|
64
|
+
break;
|
60
65
|
}
|
61
66
|
} else if (option.equals("channeltype")) {
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
67
|
+
switch (value) {
|
68
|
+
case "float":
|
69
|
+
channelType = FLOAT;
|
70
|
+
channelSize = FLOAT_SIZE;
|
71
|
+
break;
|
72
|
+
case "half":
|
73
|
+
channelType = HALF;
|
74
|
+
channelSize = HALF_SIZE;
|
75
|
+
break;
|
76
|
+
default:
|
77
|
+
UI.printWarning(Module.DISP, "EXR - Channel type was not recognized - defaulting to float");
|
78
|
+
channelType = FLOAT;
|
79
|
+
channelSize = FLOAT_SIZE;
|
80
|
+
break;
|
72
81
|
}
|
73
82
|
}
|
74
83
|
}
|
@@ -14,17 +14,21 @@ public class PNGBitmapWriter implements BitmapWriter {
|
|
14
14
|
private String filename;
|
15
15
|
private BufferedImage image;
|
16
16
|
|
17
|
+
@Override
|
17
18
|
public void configure(String option, String value) {
|
18
19
|
}
|
19
20
|
|
21
|
+
@Override
|
20
22
|
public void openFile(String filename) throws IOException {
|
21
23
|
this.filename = filename;
|
22
24
|
}
|
23
25
|
|
26
|
+
@Override
|
24
27
|
public void writeHeader(int width, int height, int tileSize) throws IOException, UnsupportedOperationException {
|
25
28
|
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
|
26
29
|
}
|
27
30
|
|
31
|
+
@Override
|
28
32
|
public void writeTile(int x, int y, int w, int h, Color[] color, float[] alpha) throws IOException {
|
29
33
|
for (int j = 0, index = 0; j < h; j++) {
|
30
34
|
for (int i = 0; i < w; i++, index++) {
|
@@ -33,6 +37,7 @@ public class PNGBitmapWriter implements BitmapWriter {
|
|
33
37
|
}
|
34
38
|
}
|
35
39
|
|
40
|
+
@Override
|
36
41
|
public void closeFile() throws IOException {
|
37
42
|
ImageIO.write(image, "png", new File(filename));
|
38
43
|
}
|
@@ -15,19 +15,23 @@ public class TGABitmapWriter implements BitmapWriter {
|
|
15
15
|
private int width, height;
|
16
16
|
private byte[] data;
|
17
17
|
|
18
|
+
@Override
|
18
19
|
public void configure(String option, String value) {
|
19
20
|
}
|
20
21
|
|
22
|
+
@Override
|
21
23
|
public void openFile(String filename) throws IOException {
|
22
24
|
this.filename = filename;
|
23
25
|
}
|
24
26
|
|
27
|
+
@Override
|
25
28
|
public void writeHeader(int width, int height, int tileSize) throws IOException, UnsupportedOperationException {
|
26
29
|
this.width = width;
|
27
30
|
this.height = height;
|
28
31
|
data = new byte[width * height * 4]; // RGBA8
|
29
32
|
}
|
30
33
|
|
34
|
+
@Override
|
31
35
|
public void writeTile(int x, int y, int w, int h, Color[] color, float[] alpha) throws IOException {
|
32
36
|
color = ColorEncoder.unlinearize(color); // gamma correction
|
33
37
|
byte[] tileData = ColorEncoder.quantizeRGBA8(color, alpha);
|
@@ -43,21 +47,23 @@ public class TGABitmapWriter implements BitmapWriter {
|
|
43
47
|
}
|
44
48
|
}
|
45
49
|
|
50
|
+
@Override
|
46
51
|
public void closeFile() throws IOException {
|
47
|
-
// actually write the file from here
|
48
|
-
OutputStream f = new BufferedOutputStream(new FileOutputStream(filename));
|
49
52
|
// no id, no colormap, uncompressed 32bpp RGBA
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
53
|
+
try ( // actually write the file from here
|
54
|
+
OutputStream f = new BufferedOutputStream(new FileOutputStream(filename))) {
|
55
|
+
// no id, no colormap, uncompressed 32bpp RGBA
|
56
|
+
byte[] tgaHeader = {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
57
|
+
f.write(tgaHeader);
|
58
|
+
// then the size info
|
59
|
+
f.write(width & 0xFF);
|
60
|
+
f.write((width >> 8) & 0xFF);
|
61
|
+
f.write(height & 0xFF);
|
62
|
+
f.write((height >> 8) & 0xFF);
|
63
|
+
// bitsperpixel and filler
|
64
|
+
f.write(32);
|
65
|
+
f.write(0);
|
66
|
+
f.write(data); // write image data bytes (already in BGRA order)
|
67
|
+
}
|
62
68
|
}
|
63
69
|
}
|
@@ -8,8 +8,8 @@ import org.sunflow.system.UI.Module;
|
|
8
8
|
*/
|
9
9
|
public class BenchmarkFramework {
|
10
10
|
|
11
|
-
private Timer[] timers;
|
12
|
-
private int timeLimit; // time limit in seconds
|
11
|
+
private final Timer[] timers;
|
12
|
+
private final int timeLimit; // time limit in seconds
|
13
13
|
|
14
14
|
public BenchmarkFramework(int iterations, int timeLimit) {
|
15
15
|
this.timeLimit = timeLimit;
|
@@ -64,6 +64,7 @@ public class RenderGlobalsPanel extends JTabbedPane {
|
|
64
64
|
|
65
65
|
/**
|
66
66
|
* Auto-generated main method to display this JPanel inside a new JFrame.
|
67
|
+
* @param args
|
67
68
|
*/
|
68
69
|
public static void main(String[] args) {
|
69
70
|
JFrame frame = new JFrame();
|
@@ -181,9 +182,9 @@ public class RenderGlobalsPanel extends JTabbedPane {
|
|
181
182
|
jLabel5.setText("Min:");
|
182
183
|
}
|
183
184
|
{
|
184
|
-
ComboBoxModel<String> minSamplingComboBoxModel = new DefaultComboBoxModel
|
185
|
+
ComboBoxModel<String> minSamplingComboBoxModel = new DefaultComboBoxModel<>(new String[]{
|
185
186
|
"Item One", "Item Two"});
|
186
|
-
minSamplingComboBox = new JComboBox
|
187
|
+
minSamplingComboBox = new JComboBox<>();
|
187
188
|
samplingPanel.add(minSamplingComboBox);
|
188
189
|
minSamplingComboBox.setModel(minSamplingComboBoxModel);
|
189
190
|
}
|
@@ -193,9 +194,9 @@ public class RenderGlobalsPanel extends JTabbedPane {
|
|
193
194
|
jLabel6.setText("Max:");
|
194
195
|
}
|
195
196
|
{
|
196
|
-
ComboBoxModel<String> maxSamplingComboxBoxModel = new DefaultComboBoxModel
|
197
|
+
ComboBoxModel<String> maxSamplingComboxBoxModel = new DefaultComboBoxModel<>(new String[]{
|
197
198
|
"Item One", "Item Two"});
|
198
|
-
maxSamplingComboxBox = new JComboBox
|
199
|
+
maxSamplingComboxBox = new JComboBox<>();
|
199
200
|
samplingPanel.add(maxSamplingComboxBox);
|
200
201
|
maxSamplingComboxBox.setModel(maxSamplingComboxBoxModel);
|
201
202
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: joonsrenderer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- monkstone
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-04-29 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A realistic ray tracer for propane and JRubyArt
|
14
14
|
email:
|
@@ -19,20 +19,22 @@ extra_rdoc_files: []
|
|
19
19
|
files:
|
20
20
|
- ".gitignore"
|
21
21
|
- ".mvn/extensions.xml"
|
22
|
+
- ".mvn/wrapper/maven-wrapper.properties"
|
22
23
|
- CHANGELOG.md
|
23
24
|
- Gemfile
|
24
25
|
- LICENSE
|
25
26
|
- README.md
|
26
27
|
- Rakefile
|
27
28
|
- docs/.gitignore
|
29
|
+
- docs/Gemfile
|
28
30
|
- docs/_config.yml
|
29
31
|
- docs/_includes/footer.html
|
30
|
-
- docs/_includes/head.html
|
31
32
|
- docs/_includes/header.html
|
32
33
|
- docs/_includes/icon-github.html
|
33
34
|
- docs/_includes/icon-github.svg
|
34
35
|
- docs/_includes/icon-twitter.html
|
35
36
|
- docs/_includes/icon-twitter.svg
|
37
|
+
- docs/_includes/top.html
|
36
38
|
- docs/_layouts/default.html
|
37
39
|
- docs/_layouts/page.html
|
38
40
|
- docs/_layouts/post.html
|
@@ -55,13 +57,14 @@ files:
|
|
55
57
|
- docs/feed.xml
|
56
58
|
- docs/index.html
|
57
59
|
- joonsrenderer.gemspec
|
58
|
-
- lib/commons-compiler-3.0.
|
59
|
-
- lib/janino-3.0.
|
60
|
+
- lib/commons-compiler-3.0.12.jar
|
61
|
+
- lib/janino-3.0.12.jar
|
60
62
|
- lib/joonsrenderer.jar
|
61
63
|
- lib/joonsrenderer.rb
|
62
64
|
- lib/joonsrenderer/version.rb
|
63
65
|
- pom.rb
|
64
66
|
- pom.xml
|
67
|
+
- src/a_maintest.java
|
65
68
|
- src/main/java/SunflowGUI.java
|
66
69
|
- src/main/java/joons/JRFiller.java
|
67
70
|
- src/main/java/joons/JRImagePanel.java
|
@@ -276,7 +279,6 @@ files:
|
|
276
279
|
- src/main/java/org/sunflow/util/FastHashMap.java
|
277
280
|
- src/main/java/org/sunflow/util/FloatArray.java
|
278
281
|
- src/main/java/org/sunflow/util/IntArray.java
|
279
|
-
- src/test/java/a_maintest.java
|
280
282
|
homepage: https://ruby-processing.github.io/joonsrenderer/
|
281
283
|
licenses:
|
282
284
|
- GPL-3.0
|
@@ -296,8 +298,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
296
298
|
- !ruby/object:Gem::Version
|
297
299
|
version: '0'
|
298
300
|
requirements: []
|
299
|
-
|
300
|
-
rubygems_version: 2.5.1
|
301
|
+
rubygems_version: 3.0.3
|
301
302
|
signing_key:
|
302
303
|
specification_version: 4
|
303
304
|
summary: From Sketch to Ray Traced Image
|