joonsrenderer 1.1-java → 1.3.1-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. checksums.yaml +5 -5
  2. data/.mvn/extensions.xml +1 -1
  3. data/.mvn/wrapper/MavenWrapperDownloader.java +117 -0
  4. data/.mvn/wrapper/maven-wrapper.properties +2 -0
  5. data/CHANGELOG.md +12 -1
  6. data/README.md +1 -1
  7. data/Rakefile +6 -1
  8. data/docs/Gemfile +2 -0
  9. data/docs/_config.yml +3 -0
  10. data/docs/_includes/header.html +1 -1
  11. data/docs/_includes/top.html +11 -0
  12. data/docs/_layouts/default.html +6 -15
  13. data/docs/_posts/2017-01-06-media.md +101 -0
  14. data/docs/_posts/2017-01-08-animated_ray_tracing.md +2 -2
  15. data/docs/_posts/2017-01-08-resources.md +14 -0
  16. data/docs/about.md +2 -2
  17. data/docs/assets/media_captured.png +0 -0
  18. data/docs/assets/media_rendered.png +0 -0
  19. data/joonsrenderer.gemspec +2 -2
  20. data/lib/commons.compiler/module-info.class +0 -0
  21. data/lib/commons.compiler/module-info.java +7 -0
  22. data/lib/janino/module-info.class +0 -0
  23. data/lib/janino/module-info.java +5 -0
  24. data/lib/joonsrenderer/version.rb +1 -1
  25. data/mvnw +310 -0
  26. data/mvnw.cmd +182 -0
  27. data/pom.rb +22 -22
  28. data/pom.xml +32 -17
  29. data/src/{test/java/a_maintest.java → a_maintest.java} +1 -1
  30. data/src/main/java/SunflowGUI.java +295 -351
  31. data/src/main/java/joons/JRFiller.java +15 -23
  32. data/src/main/java/joons/JoonsRenderer.java +6 -5
  33. data/src/main/java/org/sunflow/AsciiFileSunflowAPI.java +1 -1
  34. data/src/main/java/org/sunflow/BinaryFileSunflowAPI.java +1 -1
  35. data/src/main/java/org/sunflow/SunflowAPI.java +5 -5
  36. data/src/main/java/org/sunflow/core/GIEngine.java +3 -1
  37. data/src/main/java/org/sunflow/core/Geometry.java +1 -1
  38. data/src/main/java/org/sunflow/core/ImageSampler.java +3 -0
  39. data/src/main/java/org/sunflow/core/InstanceList.java +1 -1
  40. data/src/main/java/org/sunflow/core/IntersectionState.java +7 -6
  41. data/src/main/java/org/sunflow/core/ParameterList.java +3 -2
  42. data/src/main/java/org/sunflow/core/PhotonStore.java +1 -0
  43. data/src/main/java/org/sunflow/core/Ray.java +4 -3
  44. data/src/main/java/org/sunflow/core/TextureCache.java +1 -1
  45. data/src/main/java/org/sunflow/core/accel/BoundingIntervalHierarchy.java +1 -1
  46. data/src/main/java/org/sunflow/core/accel/KDTree.java +1 -1
  47. data/src/main/java/org/sunflow/core/photonmap/CausticPhotonMap.java +2 -2
  48. data/src/main/java/org/sunflow/core/photonmap/GlobalPhotonMap.java +2 -2
  49. data/src/main/java/org/sunflow/core/renderer/BucketRenderer.java +3 -1
  50. data/src/main/java/org/sunflow/image/writers/EXRBitmapWriter.java +28 -19
  51. data/src/main/java/org/sunflow/image/writers/PNGBitmapWriter.java +5 -0
  52. data/src/main/java/org/sunflow/image/writers/TGABitmapWriter.java +20 -14
  53. data/src/main/java/org/sunflow/system/BenchmarkFramework.java +2 -2
  54. data/src/main/java/org/sunflow/system/RenderGlobalsPanel.java +5 -4
  55. metadata +20 -8
  56. data/docs/_includes/head.html +0 -15
@@ -1,24 +1,24 @@
1
1
  package joons;
2
2
 
3
- import java.util.ArrayList;
4
- import java.util.List;
3
+ import org.sunflow.util.FloatArray;
4
+ import org.sunflow.util.IntArray;
5
5
 
6
6
  public class JRFiller {
7
7
 
8
- private final List<Float> vertices;
9
- private final List<Integer> triangleIndices;
10
- private final List<Float> spheres;
11
- private final List<Float> points;
8
+ private final FloatArray vertices;
9
+ private final IntArray triangleIndices;
10
+ private final FloatArray spheres;
11
+ private final FloatArray points;
12
12
 
13
13
  private final String fillType;
14
14
  public float[] p; //array of parameters
15
15
  public int np = 0; //number of parameters
16
16
 
17
17
  public JRFiller(String fillType, float... params) {
18
- vertices = new ArrayList<>();
19
- triangleIndices = new ArrayList<>();
20
- spheres = new ArrayList<>();
21
- points = new ArrayList<>();
18
+ vertices = new FloatArray();
19
+ triangleIndices = new IntArray();
20
+ spheres = new FloatArray();
21
+ points = new FloatArray();
22
22
 
23
23
  this.fillType = fillType;
24
24
  p = params;
@@ -29,12 +29,12 @@ public class JRFiller {
29
29
  return fillType;
30
30
  }
31
31
 
32
- public List<Float> getVertices() {
32
+ public FloatArray getVertices() {
33
33
  return vertices;
34
34
  }
35
35
 
36
36
  private void writeTriangleIndices() {
37
- for (int i = 0; i < (vertices.size() / 9); i++) {
37
+ for (int i = 0; i < (vertices.getSize() / 9); i++) {
38
38
  //vertices/3 = number of 3d points
39
39
  //vertices/9 = number of triangles
40
40
  triangleIndices.add(i * 3);
@@ -44,20 +44,12 @@ public class JRFiller {
44
44
  }
45
45
 
46
46
  public float[] verticesToArray() {
47
- float[] v = new float[vertices.size()];
48
- for (int i = 0; i < vertices.size(); i++) {
49
- v[i] = vertices.get(i);
50
- }
51
- return v;
47
+ return vertices.trim();
52
48
  }
53
49
 
54
50
  public int[] triangleIndicesToArray() {
55
51
  writeTriangleIndices();
56
- int[] t = new int[triangleIndices.size()];
57
- for (int i = 0; i < triangleIndices.size(); i++) {
58
- t[i] = triangleIndices.get(i);
59
- }
60
- return t;
52
+ return triangleIndices.trim();
61
53
  }
62
54
 
63
55
  public void addSphere(float x, float y, float z, float r) {
@@ -67,7 +59,7 @@ public class JRFiller {
67
59
  spheres.add(r);
68
60
  }
69
61
 
70
- public List<Float> getSpheres() {
62
+ public FloatArray getSpheres() {
71
63
  return spheres;
72
64
  }
73
65
 
@@ -1,6 +1,6 @@
1
1
  package joons;
2
2
 
3
- import java.util.List;
3
+ import org.sunflow.util.FloatArray;
4
4
 
5
5
  import org.sunflow.SunflowAPI;
6
6
  import org.sunflow.math.Matrix4;
@@ -210,6 +210,7 @@ public class JoonsRenderer {
210
210
  case(AMBIENT_OCCLUSION):
211
211
  case(LIGHT):
212
212
  case(MIRROR):
213
+ case(GLASS):
213
214
  fillers.add(new JRFiller(type, params));
214
215
  break;
215
216
  default:
@@ -661,8 +662,8 @@ public class JoonsRenderer {
661
662
  }
662
663
 
663
664
  //light spheres
664
- List<Float> spheres = temp.getSpheres();
665
- int noOfSpheres = (int) spheres.size() / 4;
665
+ FloatArray spheres = temp.getSpheres();
666
+ int noOfSpheres = (int) spheres.getSize() / 4;
666
667
 
667
668
  for (int j = 0; j < noOfSpheres; j++) {
668
669
  float x = spheres.get(j * 4);
@@ -801,8 +802,8 @@ public class JoonsRenderer {
801
802
  api.instance("Object_" + i + ".instance", "Object_" + i);
802
803
 
803
804
  //render the respective spheres
804
- List<Float> spheres = temp.getSpheres();
805
- int noOfSpheres = spheres.size() / 4;
805
+ FloatArray spheres = temp.getSpheres();
806
+ int noOfSpheres = spheres.getSize() / 4;
806
807
 
807
808
  for (int j = 0; j < noOfSpheres; j++) {
808
809
  float x = spheres.get(j * 4);
@@ -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)));
@@ -68,9 +68,9 @@ public class SunflowAPI implements SunflowAPIInterface {
68
68
  UI.printError(Module.API, "JVM available memory is below %d MB (found %d MB only).\nPlease make sure you launched the program with the -Xmx command line options.", RECOMMENDED_MAX_SIZE, maxMb);
69
69
  }
70
70
  String compiler = System.getProperty("java.vm.name");
71
- if (compiler == null || !(compiler.contains("HotSpot") && compiler.contains("Server"))) {
72
- UI.printError(Module.API, "You do not appear to be running Sun's server JVM\nPerformance may suffer");
73
- }
71
+ // if (compiler == null || !(compiler.contains("HotSpot") && compiler.contains("Server"))) {
72
+ // UI.printError(Module.API, "You do not appear to be running Sun's server JVM\nPerformance may suffer");
73
+ // }
74
74
  UI.printDetailed(Module.API, "Java environment settings:");
75
75
  UI.printDetailed(Module.API, " * Max memory available : %d MB", maxMb);
76
76
  UI.printDetailed(Module.API, " * Virtual machine name : %s", compiler == null ? "<unknown" : compiler);
@@ -639,7 +639,7 @@ public class SunflowAPI implements SunflowAPIInterface {
639
639
  if (filename == null) {
640
640
  return new SunflowAPI();
641
641
  }
642
- SunflowAPI api = null;
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 = null;
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. This is called before rendering begins.
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
  */
@@ -15,7 +15,7 @@ import org.sunflow.system.UI.Module;
15
15
  */
16
16
  public class Geometry implements RenderObject {
17
17
 
18
- private Tesselatable tesselatable;
18
+ private final Tesselatable tesselatable;
19
19
  private PrimitiveList primitives;
20
20
  private AccelerationStructure accel;
21
21
  private int builtAccel;
@@ -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
 
@@ -6,7 +6,7 @@ import org.sunflow.math.Matrix4;
6
6
 
7
7
  final class InstanceList implements PrimitiveList {
8
8
 
9
- private Instance[] instances;
9
+ private final Instance[] instances;
10
10
  private Instance[] lights;
11
11
 
12
12
  InstanceList() {
@@ -36,9 +36,9 @@ public final class IntersectionState {
36
36
  * Initializes all traversal stacks.
37
37
  */
38
38
  public IntersectionState() {
39
- for (int i = 0; i < stacks.length; i++) {
40
- for (int j = 0; j < stacks[i].length; j++) {
41
- stacks[i][j] = new StackNode();
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. 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.
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<String, Parameter>();
39
+ list = new FastHashMap<>();
40
40
  numVerts = numFaces = numFaceVerts = 0;
41
41
  }
42
42
 
43
43
  /**
44
- * Clears the list of all its members. If some members were never used, a
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) {
@@ -19,6 +19,7 @@ public interface PhotonStore {
19
19
  /**
20
20
  * Initialize this object for the specified scene size.
21
21
  *
22
+ * @param options
22
23
  * @param sceneBounds scene bounding box
23
24
  */
24
25
  void prepare(Options options, BoundingBox sceneBounds);
@@ -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. If
99
- * the matrix is
100
- * <code>null</code>, the original ray is returned.
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<String, Texture>();
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;
@@ -471,7 +471,7 @@ public class KDTree implements AccelerationStructure {
471
471
  // current plane
472
472
  int pClosed = 0, pPlanar = 0, pOpened = 0;
473
473
  long ptrMasked = ptr & (~TYPE_MASK & 0xFFFFFFFFF0000000L);
474
- long ptrClosed = ptrMasked | CLOSED;
474
+ long ptrClosed = ptrMasked;
475
475
  long ptrPlanar = ptrMasked | PLANAR;
476
476
  long ptrOpened = ptrMasked | OPENED;
477
477
  while (i < nSplits && (splits[i] & 0xFFFFFFFFF0000000L) == ptrClosed) {
@@ -41,7 +41,7 @@ public final class CausticPhotonMap implements CausticPhotonMapInterface {
41
41
  bounds = new BoundingBox();
42
42
  maxPower = 0;
43
43
  maxRadius = 0;
44
- photonList = new ArrayList<Photon>();
44
+ photonList = new ArrayList<>();
45
45
  photonList.add(null);
46
46
  photons = null;
47
47
  storedPhotons = halfStoredPhotons = 0;
@@ -267,7 +267,7 @@ public final class CausticPhotonMap implements CausticPhotonMapInterface {
267
267
 
268
268
  int found;
269
269
  float px, py, pz;
270
- private int max;
270
+ private final int max;
271
271
  private boolean gotHeap;
272
272
  protected float[] dist2;
273
273
  protected Photon[] index;
@@ -22,7 +22,7 @@ public final class GlobalPhotonMap implements GlobalPhotonMapInterface {
22
22
  private int log2n;
23
23
  private int numGather;
24
24
  private float gatherRadius;
25
- private BoundingBox bounds;
25
+ private final BoundingBox bounds;
26
26
  private boolean hasRadiance;
27
27
  private float maxPower;
28
28
  private float maxRadius;
@@ -425,7 +425,7 @@ public final class GlobalPhotonMap implements GlobalPhotonMapInterface {
425
425
 
426
426
  int found;
427
427
  float px, py, pz;
428
- private int max;
428
+ private final int max;
429
429
  private boolean gotHeap;
430
430
  protected float[] dist2;
431
431
  protected Photon[] index;
@@ -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
- if (value.equals("none")) {
52
- compression = NO_COMPRESSION;
53
- } else if (value.equals("rle")) {
54
- compression = RLE_COMPRESSION;
55
- } else if (value.equals("zip")) {
56
- compression = ZIP_COMPRESSION;
57
- } else {
58
- UI.printWarning(Module.IMG, "EXR - Compression type was not recognized - defaulting to zip");
59
- compression = ZIP_COMPRESSION;
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
- if (value.equals("float")) {
63
- channelType = FLOAT;
64
- channelSize = FLOAT_SIZE;
65
- } else if (value.equals("half")) {
66
- channelType = HALF;
67
- channelSize = HALF_SIZE;
68
- } else {
69
- UI.printWarning(Module.DISP, "EXR - Channel type was not recognized - defaulting to float");
70
- channelType = FLOAT;
71
- channelSize = FLOAT_SIZE;
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
  }