propane 3.5.0-java → 3.9.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.mvn/extensions.xml +1 -1
- data/.mvn/wrapper/MavenWrapperDownloader.java +1 -1
- data/.mvn/wrapper/maven-wrapper.properties +2 -2
- data/.travis.yml +1 -1
- data/CHANGELOG.md +7 -1
- data/README.md +7 -22
- data/Rakefile +3 -2
- data/lib/propane.rb +2 -1
- data/lib/propane/app.rb +4 -0
- data/lib/propane/helper_methods.rb +0 -1
- data/lib/propane/runner.rb +12 -12
- data/lib/propane/version.rb +1 -1
- data/library/pdf/pdf.rb +7 -0
- data/library/svg/svg.rb +7 -0
- data/pom.rb +65 -43
- data/pom.xml +44 -5
- data/propane.gemspec +9 -4
- data/src/main/java/japplemenubar/JAppleMenuBar.java +3 -3
- data/src/main/java/monkstone/fastmath/DegLutTables.java +111 -0
- data/src/main/java/monkstone/fastmath/Deglut.java +6 -56
- data/src/main/java/monkstone/noise/FastTerrain.java +874 -0
- data/src/main/java/monkstone/noise/Noise.java +90 -0
- data/src/main/java/monkstone/noise/NoiseGenerator.java +75 -0
- data/src/main/java/monkstone/noise/NoiseMode.java +28 -0
- data/src/main/java/monkstone/noise/OpenSimplex2F.java +881 -0
- data/src/main/java/monkstone/noise/OpenSimplex2S.java +1106 -0
- data/src/main/java/monkstone/noise/SmoothTerrain.java +1099 -0
- data/src/main/java/processing/awt/PGraphicsJava2D.java +8 -17
- data/src/main/java/processing/awt/PImageAWT.java +123 -6
- data/src/main/java/processing/awt/PShapeJava2D.java +1 -0
- data/src/main/java/processing/awt/PSurfaceAWT.java +9 -7
- data/src/main/java/processing/awt/ShimAWT.java +2 -1
- data/src/main/java/processing/core/PApplet.java +13297 -14838
- data/src/main/java/processing/core/PConstants.java +5 -5
- data/src/main/java/processing/core/PFont.java +5 -17
- data/src/main/java/processing/core/PGraphics.java +346 -351
- data/src/main/java/processing/core/PImage.java +1440 -1537
- data/src/main/java/processing/core/PMatrix2D.java +24 -7
- data/src/main/java/processing/core/PMatrix3D.java +12 -5
- data/src/main/java/processing/core/PShape.java +155 -173
- data/src/main/java/processing/core/PShapeOBJ.java +2 -0
- data/src/main/java/processing/core/PShapeSVG.java +632 -611
- data/src/main/java/processing/core/PSurface.java +15 -10
- data/src/main/java/processing/core/PSurfaceNone.java +8 -4
- data/src/main/java/processing/core/PVector.java +35 -28
- data/src/main/java/processing/data/Table.java +20 -20
- data/src/main/java/processing/data/XML.java +1 -1
- data/src/main/java/processing/event/Event.java +1 -1
- data/src/main/java/processing/event/MouseEvent.java +7 -6
- data/src/main/java/processing/javafx/PGraphicsFX2D.java +20 -345
- data/src/main/java/processing/javafx/PSurfaceFX.java +127 -125
- data/src/main/java/processing/opengl/FrameBuffer.java +2 -4
- data/src/main/java/processing/opengl/LinePath.java +4 -0
- data/src/main/java/processing/opengl/LineStroker.java +2 -6
- data/src/main/java/processing/opengl/PGL.java +72 -45
- data/src/main/java/processing/opengl/PGraphicsOpenGL.java +106 -60
- data/src/main/java/processing/opengl/PJOGL.java +15 -3
- data/src/main/java/processing/opengl/PShader.java +26 -47
- data/src/main/java/processing/opengl/PShapeOpenGL.java +1041 -1001
- data/src/main/java/processing/opengl/PSurfaceJOGL.java +211 -208
- data/src/main/java/processing/opengl/Texture.java +7 -4
- data/src/main/java/processing/opengl/VertexBuffer.java +2 -2
- data/src/main/java/processing/pdf/PGraphicsPDF.java +581 -0
- data/src/main/java/processing/svg/PGraphicsSVG.java +378 -0
- data/test/deglut_spec_test.rb +2 -2
- data/vendors/Rakefile +22 -33
- metadata +53 -21
- data/library/simplex_noise/simplex_noise.rb +0 -5
- data/src/main/java/monkstone/noise/SimplexNoise.java +0 -436
@@ -54,9 +54,12 @@ import com.jogamp.opengl.fixedfunc.GLMatrixFunc;
|
|
54
54
|
import com.jogamp.opengl.glu.GLU;
|
55
55
|
import com.jogamp.opengl.glu.GLUtessellator;
|
56
56
|
import com.jogamp.opengl.glu.GLUtessellatorCallbackAdapter;
|
57
|
+
import com.jogamp.opengl.util.awt.AWTGLReadBufferUtil;
|
57
58
|
|
59
|
+
import processing.awt.PImageAWT;
|
58
60
|
import processing.core.PApplet;
|
59
61
|
import processing.core.PGraphics;
|
62
|
+
import processing.core.PImage;
|
60
63
|
import processing.core.PMatrix3D;
|
61
64
|
import processing.core.PSurface;
|
62
65
|
|
@@ -148,6 +151,11 @@ public class PJOGL extends PGL {
|
|
148
151
|
glu = new GLU();
|
149
152
|
}
|
150
153
|
|
154
|
+
public PJOGL(PGraphicsOpenGL pg, PGL.RenderCallback callback) {
|
155
|
+
super(pg, callback);
|
156
|
+
glu = new GLU();
|
157
|
+
}
|
158
|
+
|
151
159
|
|
152
160
|
@Override
|
153
161
|
public Object getNative() {
|
@@ -171,6 +179,13 @@ public class PJOGL extends PGL {
|
|
171
179
|
protected void registerListeners() {}
|
172
180
|
|
173
181
|
|
182
|
+
@Override
|
183
|
+
protected PImage screenshot() {
|
184
|
+
AWTGLReadBufferUtil util = new AWTGLReadBufferUtil(capabilities.getGLProfile(), false);
|
185
|
+
return new PImageAWT(util.readPixelsToBufferedImage(gl, true));
|
186
|
+
}
|
187
|
+
|
188
|
+
|
174
189
|
static public void setIcon(String... icons) {
|
175
190
|
PJOGL.icons = new String[icons.length];
|
176
191
|
PApplet.arrayCopy(icons, PJOGL.icons);
|
@@ -622,7 +637,6 @@ public class PJOGL extends PGL {
|
|
622
637
|
setProperty(GLU.GLU_TESS_WINDING_RULE, rule);
|
623
638
|
}
|
624
639
|
|
625
|
-
@Override
|
626
640
|
public void setProperty(int property, int value) {
|
627
641
|
GLU.gluTessProperty(tess, property, value);
|
628
642
|
}
|
@@ -1821,8 +1835,6 @@ public class PJOGL extends PGL {
|
|
1821
1835
|
gl2.glBlendColor(red, green, blue, alpha);
|
1822
1836
|
}
|
1823
1837
|
|
1824
|
-
///////////////////////////////////////////////////////////
|
1825
|
-
|
1826
1838
|
// Whole Framebuffer Operations
|
1827
1839
|
|
1828
1840
|
@Override
|
@@ -376,7 +376,6 @@ public class PShader implements PConstants {
|
|
376
376
|
|
377
377
|
/**
|
378
378
|
* Returns true if the shader is bound, false otherwise.
|
379
|
-
* @return
|
380
379
|
*/
|
381
380
|
public boolean bound() {
|
382
381
|
return bound;
|
@@ -678,21 +677,14 @@ public class PShader implements PConstants {
|
|
678
677
|
int length) {
|
679
678
|
if (-1 < loc) {
|
680
679
|
updateIntBuffer(vec);
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
pgl.uniform3iv(loc, length, intBuffer);
|
690
|
-
break;
|
691
|
-
case 4:
|
692
|
-
pgl.uniform3iv(loc, length, intBuffer);
|
693
|
-
break;
|
694
|
-
default:
|
695
|
-
break;
|
680
|
+
if (ncoords == 1) {
|
681
|
+
pgl.uniform1iv(loc, length, intBuffer);
|
682
|
+
} else if (ncoords == 2) {
|
683
|
+
pgl.uniform2iv(loc, length, intBuffer);
|
684
|
+
} else if (ncoords == 3) {
|
685
|
+
pgl.uniform3iv(loc, length, intBuffer);
|
686
|
+
} else if (ncoords == 4) {
|
687
|
+
pgl.uniform3iv(loc, length, intBuffer);
|
696
688
|
}
|
697
689
|
}
|
698
690
|
}
|
@@ -702,21 +694,14 @@ public class PShader implements PConstants {
|
|
702
694
|
int length) {
|
703
695
|
if (-1 < loc) {
|
704
696
|
updateFloatBuffer(vec);
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
pgl.uniform3fv(loc, length, floatBuffer);
|
714
|
-
break;
|
715
|
-
case 4:
|
716
|
-
pgl.uniform4fv(loc, length, floatBuffer);
|
717
|
-
break;
|
718
|
-
default:
|
719
|
-
break;
|
697
|
+
if (ncoords == 1) {
|
698
|
+
pgl.uniform1fv(loc, length, floatBuffer);
|
699
|
+
} else if (ncoords == 2) {
|
700
|
+
pgl.uniform2fv(loc, length, floatBuffer);
|
701
|
+
} else if (ncoords == 3) {
|
702
|
+
pgl.uniform3fv(loc, length, floatBuffer);
|
703
|
+
} else if (ncoords == 4) {
|
704
|
+
pgl.uniform4fv(loc, length, floatBuffer);
|
720
705
|
}
|
721
706
|
}
|
722
707
|
}
|
@@ -725,18 +710,12 @@ public class PShader implements PConstants {
|
|
725
710
|
protected void setUniformMatrix(int loc, float[] mat) {
|
726
711
|
if (-1 < loc) {
|
727
712
|
updateFloatBuffer(mat);
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
break;
|
735
|
-
case 16:
|
736
|
-
pgl.uniformMatrix4fv(loc, 1, false, floatBuffer);
|
737
|
-
break;
|
738
|
-
default:
|
739
|
-
break;
|
713
|
+
if (mat.length == 4) {
|
714
|
+
pgl.uniformMatrix2fv(loc, 1, false, floatBuffer);
|
715
|
+
} else if (mat.length == 9) {
|
716
|
+
pgl.uniformMatrix3fv(loc, 1, false, floatBuffer);
|
717
|
+
} else if (mat.length == 16) {
|
718
|
+
pgl.uniformMatrix4fv(loc, 1, false, floatBuffer);
|
740
719
|
}
|
741
720
|
}
|
742
721
|
}
|
@@ -850,7 +829,7 @@ public class PShader implements PConstants {
|
|
850
829
|
if (textures == null) textures = new HashMap<>();
|
851
830
|
textures.put(loc, tex);
|
852
831
|
|
853
|
-
if (texUnits == null) texUnits = new HashMap
|
832
|
+
if (texUnits == null) texUnits = new HashMap<Integer, Integer>();
|
854
833
|
if (texUnits.containsKey(loc)) {
|
855
834
|
unit = texUnits.get(loc);
|
856
835
|
pgl.uniform1i(loc, unit);
|
@@ -878,7 +857,7 @@ public class PShader implements PConstants {
|
|
878
857
|
|
879
858
|
protected void bindTextures() {
|
880
859
|
if (textures != null && texUnits != null) {
|
881
|
-
textures.keySet()
|
860
|
+
for (int loc: textures.keySet()) {
|
882
861
|
Texture tex = textures.get(loc);
|
883
862
|
Integer unit = texUnits.get(loc);
|
884
863
|
if (unit != null) {
|
@@ -887,7 +866,7 @@ public class PShader implements PConstants {
|
|
887
866
|
} else {
|
888
867
|
throw new RuntimeException("Cannot find unit for texture " + tex);
|
889
868
|
}
|
890
|
-
}
|
869
|
+
}
|
891
870
|
}
|
892
871
|
}
|
893
872
|
|
@@ -997,7 +976,7 @@ public class PShader implements PConstants {
|
|
997
976
|
pgl.compileShader(glVertex);
|
998
977
|
|
999
978
|
pgl.getShaderiv(glVertex, PGL.COMPILE_STATUS, intBuffer);
|
1000
|
-
boolean compiled = intBuffer.get(0)
|
979
|
+
boolean compiled = intBuffer.get(0) == 0 ? false : true;
|
1001
980
|
if (!compiled) {
|
1002
981
|
PGraphics.showException("Cannot compile vertex shader:\n" +
|
1003
982
|
pgl.getShaderInfoLog(glVertex));
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
2
2
|
|
3
|
-
|
3
|
+
/*
|
4
4
|
Part of the Processing project - http://processing.org
|
5
5
|
|
6
6
|
Copyright (c) 2012-15 The Processing Foundation
|
@@ -20,7 +20,8 @@
|
|
20
20
|
Public License along with this library; if not, write to the
|
21
21
|
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
22
22
|
Boston, MA 02111-1307 USA
|
23
|
-
|
23
|
+
*/
|
24
|
+
|
24
25
|
package processing.opengl;
|
25
26
|
|
26
27
|
import processing.core.PApplet;
|
@@ -44,33 +45,34 @@ import java.util.Arrays;
|
|
44
45
|
import java.util.HashSet;
|
45
46
|
|
46
47
|
/**
|
47
|
-
* This class holds a 3D model composed of vertices, normals, colors
|
48
|
-
* vertex) and texture coordinates (also per vertex). All this data is
|
49
|
-
* Vertex Buffer Objects (VBO) in GPU memory for very fast access.
|
50
|
-
* implemented using code from Saito's OBJLoader library:
|
51
|
-
* http://code.google.com/p/saitoobjloader/
|
52
|
-
*
|
48
|
+
* This class holds a 3D model composed of vertices, normals, colors
|
49
|
+
* (per vertex) and texture coordinates (also per vertex). All this data is
|
50
|
+
* stored in Vertex Buffer Objects (VBO) in GPU memory for very fast access.
|
51
|
+
* OBJ loading implemented using code from Saito's OBJLoader library:
|
52
|
+
* http://code.google.com/p/saitoobjloader/
|
53
|
+
* and OBJReader from Ahmet Kizilay
|
54
|
+
* http://www.openprocessing.org/visuals/?visualID=191
|
55
|
+
* By Andres Colubri
|
53
56
|
*
|
54
57
|
*
|
55
|
-
* Other formats to consider:
|
56
|
-
* http://en.wikipedia.org/wiki/Additive_Manufacturing_File_Format
|
57
|
-
* http://en.wikipedia.org/wiki/STL_(file_format)
|
58
|
-
* http://people.sc.fsu.edu/~jburkardt/data/off/off.html(file_format)
|
59
|
-
* http://en.wikipedia.org/wiki/AutoCAD_DXF
|
58
|
+
* Other formats to consider:
|
59
|
+
* AMF: http://en.wikipedia.org/wiki/Additive_Manufacturing_File_Format
|
60
|
+
* STL: http://en.wikipedia.org/wiki/STL_(file_format)
|
61
|
+
* OFF: http://people.sc.fsu.edu/~jburkardt/data/off/off.html(file_format)
|
62
|
+
* DXF: http://en.wikipedia.org/wiki/AutoCAD_DXF
|
60
63
|
*/
|
61
64
|
public class PShapeOpenGL extends PShape {
|
62
|
-
|
63
65
|
// Testing these constants, not use as they might go away...
|
64
|
-
static public final int POSITION
|
65
|
-
static public final int NORMAL
|
66
|
-
static public final int TEXCOORD
|
66
|
+
static public final int POSITION = 0;
|
67
|
+
static public final int NORMAL = 1;
|
68
|
+
static public final int TEXCOORD = 2;
|
67
69
|
static public final int DIRECTION = 3;
|
68
|
-
static public final int OFFSET
|
70
|
+
static public final int OFFSET = 4;
|
69
71
|
|
70
72
|
static protected final int TRANSLATE = 0;
|
71
|
-
static protected final int ROTATE
|
72
|
-
static protected final int SCALE
|
73
|
-
static protected final int MATRIX
|
73
|
+
static protected final int ROTATE = 1;
|
74
|
+
static protected final int SCALE = 2;
|
75
|
+
static protected final int MATRIX = 3;
|
74
76
|
|
75
77
|
protected PGraphicsOpenGL pg;
|
76
78
|
protected PGL pgl;
|
@@ -79,7 +81,9 @@ public class PShapeOpenGL extends PShape {
|
|
79
81
|
protected PShapeOpenGL root;
|
80
82
|
|
81
83
|
// ........................................................
|
84
|
+
|
82
85
|
// Input, tessellated geometry
|
86
|
+
|
83
87
|
protected InGeometry inGeo;
|
84
88
|
protected TessGeometry tessGeo;
|
85
89
|
protected Tessellator tessellator;
|
@@ -87,13 +91,17 @@ public class PShapeOpenGL extends PShape {
|
|
87
91
|
protected AttributeMap polyAttribs;
|
88
92
|
|
89
93
|
// ........................................................
|
94
|
+
|
90
95
|
// Texturing
|
96
|
+
|
91
97
|
protected HashSet<PImage> textures;
|
92
98
|
protected boolean strokedTexture;
|
93
99
|
protected boolean untexChild;
|
94
100
|
|
95
101
|
// ........................................................
|
102
|
+
|
96
103
|
// OpenGL buffers
|
104
|
+
|
97
105
|
protected VertexBuffer bufPolyVertex;
|
98
106
|
protected VertexBuffer bufPolyColor;
|
99
107
|
protected VertexBuffer bufPolyNormal;
|
@@ -118,7 +126,9 @@ public class PShapeOpenGL extends PShape {
|
|
118
126
|
public int glUsage = PGL.STATIC_DRAW;
|
119
127
|
|
120
128
|
// ........................................................
|
129
|
+
|
121
130
|
// Offsets for geometry aggregation and update.
|
131
|
+
|
122
132
|
protected int polyVertCopyOffset;
|
123
133
|
protected int polyIndCopyOffset;
|
124
134
|
protected int lineVertCopyOffset;
|
@@ -156,13 +166,17 @@ public class PShapeOpenGL extends PShape {
|
|
156
166
|
protected int lastPointVertex;
|
157
167
|
|
158
168
|
// ........................................................
|
169
|
+
|
159
170
|
// Geometric transformations.
|
171
|
+
|
160
172
|
protected PMatrix transform;
|
161
173
|
protected PMatrix transformInv;
|
162
174
|
protected PMatrix matrixInv;
|
163
175
|
|
164
176
|
// ........................................................
|
177
|
+
|
165
178
|
// State/rendering flags
|
179
|
+
|
166
180
|
protected boolean tessellated;
|
167
181
|
protected boolean needBufferInit = false;
|
168
182
|
|
@@ -184,7 +198,9 @@ public class PShapeOpenGL extends PShape {
|
|
184
198
|
protected boolean hasPoints;
|
185
199
|
|
186
200
|
// ........................................................
|
201
|
+
|
187
202
|
// Bezier and Catmull-Rom curves
|
203
|
+
|
188
204
|
protected int bezierDetail;
|
189
205
|
protected int curveDetail;
|
190
206
|
protected float curveTightness;
|
@@ -194,7 +210,9 @@ public class PShapeOpenGL extends PShape {
|
|
194
210
|
protected float savedCurveTightness;
|
195
211
|
|
196
212
|
// ........................................................
|
213
|
+
|
197
214
|
// Normals
|
215
|
+
|
198
216
|
protected float normalX, normalY, normalZ;
|
199
217
|
|
200
218
|
// normal calculated per triangle
|
@@ -208,7 +226,9 @@ public class PShapeOpenGL extends PShape {
|
|
208
226
|
protected int normalMode;
|
209
227
|
|
210
228
|
// ........................................................
|
229
|
+
|
211
230
|
// Modification variables (used only by the root shape)
|
231
|
+
|
212
232
|
protected boolean modified;
|
213
233
|
|
214
234
|
protected boolean modifiedPolyVertices;
|
@@ -260,8 +280,10 @@ public class PShapeOpenGL extends PShape {
|
|
260
280
|
protected int lastModifiedPointAttribute;
|
261
281
|
|
262
282
|
// ........................................................
|
283
|
+
|
263
284
|
// Saved style variables to style can be re-enabled after disableStyle,
|
264
285
|
// although it won't work if properties are defined on a per-vertex basis.
|
286
|
+
|
265
287
|
protected boolean savedStroke;
|
266
288
|
protected int savedStrokeColor;
|
267
289
|
protected float savedStrokeWeight;
|
@@ -281,9 +303,11 @@ public class PShapeOpenGL extends PShape {
|
|
281
303
|
|
282
304
|
protected int savedTextureMode;
|
283
305
|
|
306
|
+
|
284
307
|
PShapeOpenGL() {
|
285
308
|
}
|
286
309
|
|
310
|
+
|
287
311
|
public PShapeOpenGL(PGraphicsOpenGL pg, int family) {
|
288
312
|
this.pg = pg;
|
289
313
|
this.family = family;
|
@@ -325,7 +349,7 @@ public class PShapeOpenGL extends PShape {
|
|
325
349
|
textureMode = pg.textureMode;
|
326
350
|
|
327
351
|
colorMode(pg.colorMode,
|
328
|
-
|
352
|
+
pg.colorModeX, pg.colorModeY, pg.colorModeZ, pg.colorModeA);
|
329
353
|
|
330
354
|
// Initial values for fill, stroke and tint colors are also imported from
|
331
355
|
// the renderer. This is particular relevant for primitive shapes, since is
|
@@ -378,20 +402,20 @@ public class PShapeOpenGL extends PShape {
|
|
378
402
|
perVertexStyles = true;
|
379
403
|
}
|
380
404
|
|
381
|
-
|
382
|
-
|
383
|
-
*/
|
405
|
+
|
406
|
+
/** Create a shape from the PRIMITIVE family, using this kind and these params */
|
384
407
|
public PShapeOpenGL(PGraphicsOpenGL pg, int kind, float... p) {
|
385
408
|
this(pg, PRIMITIVE);
|
386
409
|
setKind(kind);
|
387
410
|
setParams(p);
|
388
411
|
}
|
389
412
|
|
413
|
+
|
390
414
|
@Override
|
391
415
|
public void addChild(PShape who) {
|
392
416
|
if (who instanceof PShapeOpenGL) {
|
393
417
|
if (family == GROUP) {
|
394
|
-
PShapeOpenGL c3d = (PShapeOpenGL)
|
418
|
+
PShapeOpenGL c3d = (PShapeOpenGL)who;
|
395
419
|
|
396
420
|
super.addChild(c3d);
|
397
421
|
c3d.updateRoot(root);
|
@@ -399,9 +423,9 @@ public class PShapeOpenGL extends PShape {
|
|
399
423
|
|
400
424
|
if (c3d.family == GROUP) {
|
401
425
|
if (c3d.textures != null) {
|
402
|
-
c3d.textures
|
426
|
+
for (PImage tex: c3d.textures) {
|
403
427
|
addTexture(tex);
|
404
|
-
}
|
428
|
+
}
|
405
429
|
} else {
|
406
430
|
untexChild(true);
|
407
431
|
}
|
@@ -427,11 +451,12 @@ public class PShapeOpenGL extends PShape {
|
|
427
451
|
}
|
428
452
|
}
|
429
453
|
|
454
|
+
|
430
455
|
@Override
|
431
456
|
public void addChild(PShape who, int idx) {
|
432
457
|
if (who instanceof PShapeOpenGL) {
|
433
458
|
if (family == GROUP) {
|
434
|
-
PShapeOpenGL c3d = (PShapeOpenGL)
|
459
|
+
PShapeOpenGL c3d = (PShapeOpenGL)who;
|
435
460
|
|
436
461
|
super.addChild(c3d, idx);
|
437
462
|
c3d.updateRoot(root);
|
@@ -467,6 +492,7 @@ public class PShapeOpenGL extends PShape {
|
|
467
492
|
}
|
468
493
|
}
|
469
494
|
|
495
|
+
|
470
496
|
@Override
|
471
497
|
public void removeChild(int idx) {
|
472
498
|
super.removeChild(idx);
|
@@ -475,37 +501,49 @@ public class PShapeOpenGL extends PShape {
|
|
475
501
|
markForTessellation();
|
476
502
|
}
|
477
503
|
|
504
|
+
|
478
505
|
protected void updateRoot(PShape root) {
|
479
506
|
this.root = (PShapeOpenGL) root;
|
480
507
|
if (family == GROUP) {
|
481
508
|
for (int i = 0; i < childCount; i++) {
|
482
|
-
PShapeOpenGL child = (PShapeOpenGL)
|
509
|
+
PShapeOpenGL child = (PShapeOpenGL)children[i];
|
483
510
|
child.updateRoot(root);
|
484
511
|
}
|
485
512
|
}
|
486
513
|
}
|
487
514
|
|
515
|
+
|
488
516
|
///////////////////////////////////////////////////////////
|
517
|
+
|
489
518
|
//
|
490
519
|
// Shape creation (temporary hack)
|
520
|
+
|
521
|
+
|
491
522
|
public static PShapeOpenGL createShape(PGraphicsOpenGL pg, PShape src) {
|
492
523
|
PShapeOpenGL dest = null;
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
524
|
+
switch (src.getFamily()) {
|
525
|
+
case GROUP:
|
526
|
+
//dest = PGraphics3D.createShapeImpl(pg, GROUP);
|
527
|
+
dest = (PShapeOpenGL) pg.createShapeFamily(GROUP);
|
528
|
+
copyGroup(pg, src, dest);
|
529
|
+
break;
|
530
|
+
case PRIMITIVE:
|
531
|
+
//dest = PGraphics3D.createShapeImpl(pg, src.getKind(), src.getParams());
|
532
|
+
dest = (PShapeOpenGL) pg.createShapePrimitive(src.getKind(), src.getParams());
|
533
|
+
PShape.copyPrimitive(src, dest);
|
534
|
+
break;
|
535
|
+
case GEOMETRY:
|
536
|
+
//dest = PGraphics3D.createShapeImpl(pg, PShape.GEOMETRY);
|
537
|
+
dest = (PShapeOpenGL) pg.createShapeFamily(PShape.GEOMETRY);
|
538
|
+
PShape.copyGeometry(src, dest);
|
539
|
+
break;
|
540
|
+
case PATH:
|
541
|
+
dest = (PShapeOpenGL) pg.createShapeFamily(PShape.PATH);
|
542
|
+
//dest = PGraphics3D.createShapeImpl(pg, PATH);
|
543
|
+
PShape.copyPath(src, dest);
|
544
|
+
break;
|
545
|
+
default:
|
546
|
+
break;
|
509
547
|
}
|
510
548
|
dest.setName(src.getName());
|
511
549
|
dest.width = src.width;
|
@@ -540,7 +578,8 @@ public class PShapeOpenGL extends PShape {
|
|
540
578
|
dest.height = src.height;
|
541
579
|
return dest;
|
542
580
|
}
|
543
|
-
|
581
|
+
*/
|
582
|
+
|
544
583
|
static public void copyGroup(PGraphicsOpenGL pg, PShape src, PShape dest) {
|
545
584
|
copyMatrix(src, dest);
|
546
585
|
copyStyles(src, dest);
|
@@ -564,16 +603,21 @@ public class PShapeOpenGL extends PShape {
|
|
564
603
|
dest.addChild(c);
|
565
604
|
}
|
566
605
|
}
|
567
|
-
|
606
|
+
*/
|
607
|
+
|
568
608
|
///////////////////////////////////////////////////////////
|
609
|
+
|
569
610
|
//
|
611
|
+
|
570
612
|
// Query methods
|
613
|
+
|
614
|
+
|
571
615
|
@Override
|
572
616
|
public float getWidth() {
|
573
617
|
PVector min = new PVector(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY,
|
574
|
-
|
618
|
+
Float.POSITIVE_INFINITY);
|
575
619
|
PVector max = new PVector(Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY,
|
576
|
-
|
620
|
+
Float.NEGATIVE_INFINITY);
|
577
621
|
if (shapeCreated) {
|
578
622
|
getVertexMin(min);
|
579
623
|
getVertexMax(max);
|
@@ -582,12 +626,13 @@ public class PShapeOpenGL extends PShape {
|
|
582
626
|
return width;
|
583
627
|
}
|
584
628
|
|
629
|
+
|
585
630
|
@Override
|
586
631
|
public float getHeight() {
|
587
632
|
PVector min = new PVector(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY,
|
588
|
-
|
633
|
+
Float.POSITIVE_INFINITY);
|
589
634
|
PVector max = new PVector(Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY,
|
590
|
-
|
635
|
+
Float.NEGATIVE_INFINITY);
|
591
636
|
if (shapeCreated) {
|
592
637
|
getVertexMin(min);
|
593
638
|
getVertexMax(max);
|
@@ -596,12 +641,13 @@ public class PShapeOpenGL extends PShape {
|
|
596
641
|
return height;
|
597
642
|
}
|
598
643
|
|
644
|
+
|
599
645
|
@Override
|
600
646
|
public float getDepth() {
|
601
647
|
PVector min = new PVector(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY,
|
602
|
-
|
648
|
+
Float.POSITIVE_INFINITY);
|
603
649
|
PVector max = new PVector(Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY,
|
604
|
-
|
650
|
+
Float.NEGATIVE_INFINITY);
|
605
651
|
if (shapeCreated) {
|
606
652
|
getVertexMin(min);
|
607
653
|
getVertexMax(max);
|
@@ -610,6 +656,7 @@ public class PShapeOpenGL extends PShape {
|
|
610
656
|
return depth;
|
611
657
|
}
|
612
658
|
|
659
|
+
|
613
660
|
protected void getVertexMin(PVector min) {
|
614
661
|
updateTessellation();
|
615
662
|
|
@@ -633,6 +680,7 @@ public class PShapeOpenGL extends PShape {
|
|
633
680
|
}
|
634
681
|
}
|
635
682
|
|
683
|
+
|
636
684
|
protected void getVertexMax(PVector max) {
|
637
685
|
updateTessellation();
|
638
686
|
|
@@ -656,6 +704,7 @@ public class PShapeOpenGL extends PShape {
|
|
656
704
|
}
|
657
705
|
}
|
658
706
|
|
707
|
+
|
659
708
|
protected int getVertexSum(PVector sum, int count) {
|
660
709
|
updateTessellation();
|
661
710
|
|
@@ -671,20 +720,25 @@ public class PShapeOpenGL extends PShape {
|
|
671
720
|
if (is3D()) {
|
672
721
|
if (hasLines) {
|
673
722
|
count += tessGeo.getLineVertexSum(sum, firstLineVertex,
|
674
|
-
|
723
|
+
lastLineVertex);
|
675
724
|
}
|
676
725
|
if (hasPoints) {
|
677
726
|
count += tessGeo.getPointVertexSum(sum, firstPointVertex,
|
678
|
-
|
727
|
+
lastPointVertex);
|
679
728
|
}
|
680
729
|
}
|
681
730
|
}
|
682
731
|
return count;
|
683
732
|
}
|
684
733
|
|
734
|
+
|
685
735
|
///////////////////////////////////////////////////////////
|
736
|
+
|
686
737
|
//
|
738
|
+
|
687
739
|
// Drawing methods
|
740
|
+
|
741
|
+
|
688
742
|
@Override
|
689
743
|
public void setTextureMode(int mode) {
|
690
744
|
if (openShape) {
|
@@ -702,10 +756,9 @@ public class PShapeOpenGL extends PShape {
|
|
702
756
|
}
|
703
757
|
}
|
704
758
|
|
759
|
+
|
705
760
|
protected void setTextureModeImpl(int mode) {
|
706
|
-
if (textureMode == mode)
|
707
|
-
return;
|
708
|
-
}
|
761
|
+
if (textureMode == mode) return;
|
709
762
|
textureMode = mode;
|
710
763
|
if (image != null) {
|
711
764
|
float uFactor = image.width;
|
@@ -718,6 +771,7 @@ public class PShapeOpenGL extends PShape {
|
|
718
771
|
}
|
719
772
|
}
|
720
773
|
|
774
|
+
|
721
775
|
@Override
|
722
776
|
public void setTexture(PImage tex) {
|
723
777
|
if (openShape) {
|
@@ -735,6 +789,7 @@ public class PShapeOpenGL extends PShape {
|
|
735
789
|
}
|
736
790
|
}
|
737
791
|
|
792
|
+
|
738
793
|
protected void setTextureImpl(PImage tex) {
|
739
794
|
PImage image0 = image;
|
740
795
|
image = tex;
|
@@ -755,21 +810,20 @@ public class PShapeOpenGL extends PShape {
|
|
755
810
|
}
|
756
811
|
|
757
812
|
if (image0 != tex && parent != null) {
|
758
|
-
((PShapeOpenGL)
|
813
|
+
((PShapeOpenGL)parent).removeTexture(image0, this);
|
759
814
|
}
|
760
815
|
if (parent != null) {
|
761
|
-
((PShapeOpenGL)
|
816
|
+
((PShapeOpenGL)parent).addTexture(image);
|
762
817
|
if (is2D() && stroke) {
|
763
|
-
((PShapeOpenGL)
|
818
|
+
((PShapeOpenGL)parent).strokedTexture(true);
|
764
819
|
}
|
765
820
|
}
|
766
821
|
}
|
767
822
|
|
823
|
+
|
768
824
|
protected void scaleTextureUV(float uFactor, float vFactor) {
|
769
|
-
if (PGraphicsOpenGL.same(uFactor, 1)
|
770
|
-
|
771
|
-
return;
|
772
|
-
}
|
825
|
+
if (PGraphicsOpenGL.same(uFactor, 1) &&
|
826
|
+
PGraphicsOpenGL.same(vFactor, 1)) return;
|
773
827
|
|
774
828
|
for (int i = 0; i < inGeo.vertexCount; i++) {
|
775
829
|
float u = inGeo.texcoords[2 * i + 0];
|
@@ -784,12 +838,8 @@ public class PShapeOpenGL extends PShape {
|
|
784
838
|
last1 = lastPolyVertex + 1;
|
785
839
|
} else if (is2D()) {
|
786
840
|
last1 = lastPolyVertex + 1;
|
787
|
-
if (-1 < firstLineVertex)
|
788
|
-
|
789
|
-
}
|
790
|
-
if (-1 < firstPointVertex) {
|
791
|
-
last1 = firstPointVertex;
|
792
|
-
}
|
841
|
+
if (-1 < firstLineVertex) last1 = firstLineVertex;
|
842
|
+
if (-1 < firstPointVertex) last1 = firstPointVertex;
|
793
843
|
}
|
794
844
|
for (int i = firstLineVertex; i < last1; i++) {
|
795
845
|
float u = tessGeo.polyTexCoords[2 * i + 0];
|
@@ -801,27 +851,26 @@ public class PShapeOpenGL extends PShape {
|
|
801
851
|
}
|
802
852
|
}
|
803
853
|
|
854
|
+
|
804
855
|
protected void addTexture(PImage tex) {
|
805
856
|
if (textures == null) {
|
806
857
|
textures = new HashSet<>();
|
807
858
|
}
|
808
859
|
textures.add(tex);
|
809
860
|
if (parent != null) {
|
810
|
-
((PShapeOpenGL)
|
861
|
+
((PShapeOpenGL)parent).addTexture(tex);
|
811
862
|
}
|
812
863
|
}
|
813
864
|
|
865
|
+
|
814
866
|
protected void removeTexture(PImage tex, PShapeOpenGL caller) {
|
815
|
-
if (textures == null || !textures.contains(tex))
|
816
|
-
|
817
|
-
}
|
867
|
+
if (textures == null || !textures.contains(tex)) return; // Nothing to remove.
|
868
|
+
|
818
869
|
// First check that none of the child shapes have texture tex...
|
819
870
|
boolean childHasTex = false;
|
820
871
|
for (int i = 0; i < childCount; i++) {
|
821
872
|
PShapeOpenGL child = (PShapeOpenGL) children[i];
|
822
|
-
if (child == caller)
|
823
|
-
continue;
|
824
|
-
}
|
873
|
+
if (child == caller) continue;
|
825
874
|
if (child.hasTexture(tex)) {
|
826
875
|
childHasTex = true;
|
827
876
|
break;
|
@@ -831,7 +880,7 @@ public class PShapeOpenGL extends PShape {
|
|
831
880
|
if (!childHasTex) {
|
832
881
|
// ...if not, it is safe to remove from this shape.
|
833
882
|
textures.remove(tex);
|
834
|
-
if (textures.
|
883
|
+
if (textures.isEmpty()) {
|
835
884
|
textures = null;
|
836
885
|
}
|
837
886
|
}
|
@@ -839,18 +888,19 @@ public class PShapeOpenGL extends PShape {
|
|
839
888
|
// Since this shape and all its child shapes don't contain
|
840
889
|
// tex anymore, we now can remove it from the parent.
|
841
890
|
if (parent != null) {
|
842
|
-
((PShapeOpenGL)
|
891
|
+
((PShapeOpenGL)parent).removeTexture(tex, this);
|
843
892
|
}
|
844
893
|
}
|
845
894
|
|
895
|
+
|
846
896
|
protected void strokedTexture(boolean newValue) {
|
847
897
|
strokedTexture(newValue, null);
|
848
898
|
}
|
849
899
|
|
900
|
+
|
850
901
|
protected void strokedTexture(boolean newValue, PShapeOpenGL caller) {
|
851
|
-
if (strokedTexture == newValue)
|
852
|
-
|
853
|
-
}
|
902
|
+
if (strokedTexture == newValue) return; // Nothing to change.
|
903
|
+
|
854
904
|
if (newValue) {
|
855
905
|
strokedTexture = true;
|
856
906
|
} else {
|
@@ -858,9 +908,7 @@ public class PShapeOpenGL extends PShape {
|
|
858
908
|
strokedTexture = false;
|
859
909
|
for (int i = 0; i < childCount; i++) {
|
860
910
|
PShapeOpenGL child = (PShapeOpenGL) children[i];
|
861
|
-
if (child == caller)
|
862
|
-
continue;
|
863
|
-
}
|
911
|
+
if (child == caller) continue;
|
864
912
|
if (child.hasStrokedTexture()) {
|
865
913
|
strokedTexture = true;
|
866
914
|
break;
|
@@ -870,18 +918,19 @@ public class PShapeOpenGL extends PShape {
|
|
870
918
|
|
871
919
|
// Now we can update the parent shape.
|
872
920
|
if (parent != null) {
|
873
|
-
((PShapeOpenGL)
|
921
|
+
((PShapeOpenGL)parent).strokedTexture(newValue, this);
|
874
922
|
}
|
875
923
|
}
|
876
924
|
|
925
|
+
|
877
926
|
protected void untexChild(boolean newValue) {
|
878
927
|
untexChild(newValue, null);
|
879
928
|
}
|
880
929
|
|
930
|
+
|
881
931
|
protected void untexChild(boolean newValue, PShapeOpenGL caller) {
|
882
|
-
if (untexChild == newValue)
|
883
|
-
|
884
|
-
}
|
932
|
+
if (untexChild == newValue) return; // Nothing to change.
|
933
|
+
|
885
934
|
if (newValue) {
|
886
935
|
untexChild = true;
|
887
936
|
} else {
|
@@ -889,9 +938,7 @@ public class PShapeOpenGL extends PShape {
|
|
889
938
|
untexChild = false;
|
890
939
|
for (int i = 0; i < childCount; i++) {
|
891
940
|
PShapeOpenGL child = (PShapeOpenGL) children[i];
|
892
|
-
if (child == caller)
|
893
|
-
continue;
|
894
|
-
}
|
941
|
+
if (child == caller) continue;
|
895
942
|
if (!child.hasTexture()) {
|
896
943
|
untexChild = true;
|
897
944
|
break;
|
@@ -901,10 +948,11 @@ public class PShapeOpenGL extends PShape {
|
|
901
948
|
|
902
949
|
// Now we can update the parent shape.
|
903
950
|
if (parent != null) {
|
904
|
-
((PShapeOpenGL)
|
951
|
+
((PShapeOpenGL)parent).untexChild(newValue, this);
|
905
952
|
}
|
906
953
|
}
|
907
954
|
|
955
|
+
|
908
956
|
protected boolean hasTexture() {
|
909
957
|
if (family == GROUP) {
|
910
958
|
return textures != null && 0 < textures.size();
|
@@ -913,6 +961,7 @@ public class PShapeOpenGL extends PShape {
|
|
913
961
|
}
|
914
962
|
}
|
915
963
|
|
964
|
+
|
916
965
|
protected boolean hasTexture(PImage tex) {
|
917
966
|
if (family == GROUP) {
|
918
967
|
return textures != null && textures.contains(tex);
|
@@ -921,6 +970,7 @@ public class PShapeOpenGL extends PShape {
|
|
921
970
|
}
|
922
971
|
}
|
923
972
|
|
973
|
+
|
924
974
|
protected boolean hasStrokedTexture() {
|
925
975
|
if (family == GROUP) {
|
926
976
|
return strokedTexture;
|
@@ -929,6 +979,7 @@ public class PShapeOpenGL extends PShape {
|
|
929
979
|
}
|
930
980
|
}
|
931
981
|
|
982
|
+
|
932
983
|
@Override
|
933
984
|
public void solid(boolean solid) {
|
934
985
|
if (family == GROUP) {
|
@@ -941,41 +992,46 @@ public class PShapeOpenGL extends PShape {
|
|
941
992
|
}
|
942
993
|
}
|
943
994
|
|
995
|
+
|
944
996
|
@Override
|
945
997
|
protected void beginContourImpl() {
|
946
998
|
breakShape = true;
|
947
999
|
}
|
948
1000
|
|
1001
|
+
|
949
1002
|
@Override
|
950
1003
|
protected void endContourImpl() {
|
951
1004
|
}
|
952
1005
|
|
1006
|
+
|
953
1007
|
@Override
|
954
1008
|
public void vertex(float x, float y) {
|
955
1009
|
vertexImpl(x, y, 0, 0, 0);
|
956
|
-
if (image != null)
|
1010
|
+
if (image != null)
|
957
1011
|
PGraphics.showWarning(PGraphicsOpenGL.MISSING_UV_TEXCOORDS_ERROR);
|
958
|
-
}
|
959
1012
|
}
|
960
1013
|
|
1014
|
+
|
961
1015
|
@Override
|
962
1016
|
public void vertex(float x, float y, float u, float v) {
|
963
1017
|
vertexImpl(x, y, 0, u, v);
|
964
1018
|
}
|
965
1019
|
|
1020
|
+
|
966
1021
|
@Override
|
967
1022
|
public void vertex(float x, float y, float z) {
|
968
1023
|
vertexImpl(x, y, z, 0, 0);
|
969
|
-
if (image != null)
|
1024
|
+
if (image != null)
|
970
1025
|
PGraphics.showWarning(PGraphicsOpenGL.MISSING_UV_TEXCOORDS_ERROR);
|
971
|
-
}
|
972
1026
|
}
|
973
1027
|
|
1028
|
+
|
974
1029
|
@Override
|
975
1030
|
public void vertex(float x, float y, float z, float u, float v) {
|
976
1031
|
vertexImpl(x, y, z, u, v);
|
977
1032
|
}
|
978
1033
|
|
1034
|
+
|
979
1035
|
protected void vertexImpl(float x, float y, float z, float u, float v) {
|
980
1036
|
if (!openShape) {
|
981
1037
|
PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "vertex()");
|
@@ -1014,16 +1070,17 @@ public class PShapeOpenGL extends PShape {
|
|
1014
1070
|
}
|
1015
1071
|
|
1016
1072
|
inGeo.addVertex(x, y, z,
|
1017
|
-
|
1018
|
-
|
1019
|
-
|
1020
|
-
|
1021
|
-
|
1022
|
-
|
1073
|
+
fcolor,
|
1074
|
+
normalX, normalY, normalZ,
|
1075
|
+
u, v,
|
1076
|
+
scolor, sweight,
|
1077
|
+
ambientColor, specularColor, emissiveColor, shininess,
|
1078
|
+
VERTEX, vertexBreak());
|
1023
1079
|
|
1024
1080
|
markForTessellation();
|
1025
1081
|
}
|
1026
1082
|
|
1083
|
+
|
1027
1084
|
protected boolean vertexBreak() {
|
1028
1085
|
if (breakShape) {
|
1029
1086
|
breakShape = false;
|
@@ -1032,6 +1089,7 @@ public class PShapeOpenGL extends PShape {
|
|
1032
1089
|
return false;
|
1033
1090
|
}
|
1034
1091
|
|
1092
|
+
|
1035
1093
|
@Override
|
1036
1094
|
public void normal(float nx, float ny, float nz) {
|
1037
1095
|
if (!openShape) {
|
@@ -1059,59 +1117,54 @@ public class PShapeOpenGL extends PShape {
|
|
1059
1117
|
}
|
1060
1118
|
}
|
1061
1119
|
|
1120
|
+
|
1062
1121
|
@Override
|
1063
1122
|
public void attribPosition(String name, float x, float y, float z) {
|
1064
1123
|
VertexAttribute attrib = attribImpl(name, VertexAttribute.POSITION,
|
1065
|
-
|
1066
|
-
if (attrib != null)
|
1067
|
-
attrib.set(x, y, z);
|
1068
|
-
}
|
1124
|
+
PGL.FLOAT, 3);
|
1125
|
+
if (attrib != null) attrib.set(x, y, z);
|
1069
1126
|
}
|
1070
1127
|
|
1128
|
+
|
1071
1129
|
@Override
|
1072
1130
|
public void attribNormal(String name, float nx, float ny, float nz) {
|
1073
1131
|
VertexAttribute attrib = attribImpl(name, VertexAttribute.NORMAL,
|
1074
|
-
|
1075
|
-
if (attrib != null)
|
1076
|
-
attrib.set(nx, ny, nz);
|
1077
|
-
}
|
1132
|
+
PGL.FLOAT, 3);
|
1133
|
+
if (attrib != null) attrib.set(nx, ny, nz);
|
1078
1134
|
}
|
1079
1135
|
|
1136
|
+
|
1080
1137
|
@Override
|
1081
1138
|
public void attribColor(String name, int color) {
|
1082
1139
|
VertexAttribute attrib = attribImpl(name, VertexAttribute.COLOR, PGL.INT, 1);
|
1083
|
-
if (attrib != null) {
|
1084
|
-
attrib.set(new int[]{color});
|
1085
|
-
}
|
1140
|
+
if (attrib != null) attrib.set(new int[] {color});
|
1086
1141
|
}
|
1087
1142
|
|
1143
|
+
|
1088
1144
|
@Override
|
1089
1145
|
public void attrib(String name, float... values) {
|
1090
1146
|
VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, PGL.FLOAT,
|
1091
|
-
|
1092
|
-
if (attrib != null)
|
1093
|
-
attrib.set(values);
|
1094
|
-
}
|
1147
|
+
values.length);
|
1148
|
+
if (attrib != null) attrib.set(values);
|
1095
1149
|
}
|
1096
1150
|
|
1151
|
+
|
1097
1152
|
@Override
|
1098
1153
|
public void attrib(String name, int... values) {
|
1099
1154
|
VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, PGL.INT,
|
1100
|
-
|
1101
|
-
if (attrib != null)
|
1102
|
-
attrib.set(values);
|
1103
|
-
}
|
1155
|
+
values.length);
|
1156
|
+
if (attrib != null) attrib.set(values);
|
1104
1157
|
}
|
1105
1158
|
|
1159
|
+
|
1106
1160
|
@Override
|
1107
1161
|
public void attrib(String name, boolean... values) {
|
1108
1162
|
VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, PGL.BOOL,
|
1109
|
-
|
1110
|
-
if (attrib != null)
|
1111
|
-
attrib.set(values);
|
1112
|
-
}
|
1163
|
+
values.length);
|
1164
|
+
if (attrib != null) attrib.set(values);
|
1113
1165
|
}
|
1114
1166
|
|
1167
|
+
|
1115
1168
|
protected VertexAttribute attribImpl(String name, int kind, int type, int size) {
|
1116
1169
|
if (4 < size) {
|
1117
1170
|
PGraphics.showWarning("Vertex attributes cannot have more than 4 values");
|
@@ -1138,6 +1191,7 @@ public class PShapeOpenGL extends PShape {
|
|
1138
1191
|
return attrib;
|
1139
1192
|
}
|
1140
1193
|
|
1194
|
+
|
1141
1195
|
@Override
|
1142
1196
|
public void endShape(int mode) {
|
1143
1197
|
super.endShape(mode);
|
@@ -1151,6 +1205,7 @@ public class PShapeOpenGL extends PShape {
|
|
1151
1205
|
shapeCreated = true;
|
1152
1206
|
}
|
1153
1207
|
|
1208
|
+
|
1154
1209
|
@Override
|
1155
1210
|
public void setParams(float[] source) {
|
1156
1211
|
if (family != PRIMITIVE) {
|
@@ -1163,11 +1218,12 @@ public class PShapeOpenGL extends PShape {
|
|
1163
1218
|
shapeCreated = true;
|
1164
1219
|
}
|
1165
1220
|
|
1221
|
+
|
1166
1222
|
@Override
|
1167
1223
|
public void setPath(int vcount, float[][] verts, int ccount, int[] codes) {
|
1168
1224
|
if (family != PATH) {
|
1169
|
-
PGraphics.showWarning("Vertex coordinates and codes can only be set to "
|
1170
|
-
|
1225
|
+
PGraphics.showWarning("Vertex coordinates and codes can only be set to " +
|
1226
|
+
"PATH shapes");
|
1171
1227
|
return;
|
1172
1228
|
}
|
1173
1229
|
|
@@ -1176,9 +1232,14 @@ public class PShapeOpenGL extends PShape {
|
|
1176
1232
|
shapeCreated = true;
|
1177
1233
|
}
|
1178
1234
|
|
1235
|
+
|
1179
1236
|
///////////////////////////////////////////////////////////
|
1237
|
+
|
1180
1238
|
//
|
1239
|
+
|
1181
1240
|
// Geometric transformations
|
1241
|
+
|
1242
|
+
|
1182
1243
|
@Override
|
1183
1244
|
public void translate(float tx, float ty) {
|
1184
1245
|
if (is3D) {
|
@@ -1188,36 +1249,43 @@ public class PShapeOpenGL extends PShape {
|
|
1188
1249
|
}
|
1189
1250
|
}
|
1190
1251
|
|
1252
|
+
|
1191
1253
|
@Override
|
1192
1254
|
public void translate(float tx, float ty, float tz) {
|
1193
1255
|
transform(TRANSLATE, tx, ty, tz);
|
1194
1256
|
}
|
1195
1257
|
|
1258
|
+
|
1196
1259
|
@Override
|
1197
1260
|
public void rotate(float angle) {
|
1198
1261
|
transform(ROTATE, angle);
|
1199
1262
|
}
|
1200
1263
|
|
1264
|
+
|
1201
1265
|
@Override
|
1202
1266
|
public void rotateX(float angle) {
|
1203
1267
|
rotate(angle, 1, 0, 0);
|
1204
1268
|
}
|
1205
1269
|
|
1270
|
+
|
1206
1271
|
@Override
|
1207
1272
|
public void rotateY(float angle) {
|
1208
1273
|
rotate(angle, 0, 1, 0);
|
1209
1274
|
}
|
1210
1275
|
|
1276
|
+
|
1211
1277
|
@Override
|
1212
1278
|
public void rotateZ(float angle) {
|
1213
1279
|
rotate(angle, 0, 0, 1);
|
1214
1280
|
}
|
1215
1281
|
|
1282
|
+
|
1216
1283
|
@Override
|
1217
1284
|
public void rotate(float angle, float v0, float v1, float v2) {
|
1218
1285
|
transform(ROTATE, angle, v0, v1, v2);
|
1219
1286
|
}
|
1220
1287
|
|
1288
|
+
|
1221
1289
|
@Override
|
1222
1290
|
public void scale(float s) {
|
1223
1291
|
if (is3D) {
|
@@ -1227,6 +1295,7 @@ public class PShapeOpenGL extends PShape {
|
|
1227
1295
|
}
|
1228
1296
|
}
|
1229
1297
|
|
1298
|
+
|
1230
1299
|
@Override
|
1231
1300
|
public void scale(float x, float y) {
|
1232
1301
|
if (is3D) {
|
@@ -1236,35 +1305,40 @@ public class PShapeOpenGL extends PShape {
|
|
1236
1305
|
}
|
1237
1306
|
}
|
1238
1307
|
|
1308
|
+
|
1239
1309
|
@Override
|
1240
1310
|
public void scale(float x, float y, float z) {
|
1241
1311
|
transform(SCALE, x, y, z);
|
1242
1312
|
}
|
1243
1313
|
|
1314
|
+
|
1244
1315
|
@Override
|
1245
1316
|
public void applyMatrix(PMatrix2D source) {
|
1246
1317
|
transform(MATRIX, source.m00, source.m01, source.m02,
|
1247
|
-
|
1318
|
+
source.m10, source.m11, source.m12);
|
1248
1319
|
}
|
1249
1320
|
|
1321
|
+
|
1250
1322
|
@Override
|
1251
1323
|
public void applyMatrix(float n00, float n01, float n02,
|
1252
|
-
|
1324
|
+
float n10, float n11, float n12) {
|
1253
1325
|
transform(MATRIX, n00, n01, n02,
|
1254
|
-
|
1326
|
+
n10, n11, n12);
|
1255
1327
|
}
|
1256
1328
|
|
1329
|
+
|
1257
1330
|
@Override
|
1258
1331
|
public void applyMatrix(float n00, float n01, float n02, float n03,
|
1259
|
-
|
1260
|
-
|
1261
|
-
|
1332
|
+
float n10, float n11, float n12, float n13,
|
1333
|
+
float n20, float n21, float n22, float n23,
|
1334
|
+
float n30, float n31, float n32, float n33) {
|
1262
1335
|
transform(MATRIX, n00, n01, n02, n03,
|
1263
|
-
|
1264
|
-
|
1265
|
-
|
1336
|
+
n10, n11, n12, n13,
|
1337
|
+
n20, n21, n22, n23,
|
1338
|
+
n30, n31, n32, n33);
|
1266
1339
|
}
|
1267
1340
|
|
1341
|
+
|
1268
1342
|
@Override
|
1269
1343
|
public void resetMatrix() {
|
1270
1344
|
if (shapeCreated && matrix != null && matrixInv != null) {
|
@@ -1279,6 +1353,7 @@ public class PShapeOpenGL extends PShape {
|
|
1279
1353
|
}
|
1280
1354
|
}
|
1281
1355
|
|
1356
|
+
|
1282
1357
|
protected void transform(int type, float... args) {
|
1283
1358
|
int dimensions = is3D ? 3 : 2;
|
1284
1359
|
boolean invertible = true;
|
@@ -1304,46 +1379,46 @@ public class PShapeOpenGL extends PShape {
|
|
1304
1379
|
}
|
1305
1380
|
|
1306
1381
|
switch (type) {
|
1307
|
-
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
|
1316
|
-
|
1317
|
-
|
1318
|
-
|
1319
|
-
|
1320
|
-
|
1321
|
-
|
1322
|
-
|
1323
|
-
|
1324
|
-
|
1325
|
-
|
1326
|
-
|
1327
|
-
|
1328
|
-
|
1329
|
-
|
1330
|
-
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
|
1337
|
-
|
1338
|
-
|
1339
|
-
|
1340
|
-
|
1341
|
-
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1382
|
+
case TRANSLATE:
|
1383
|
+
if (ncoords == 3) {
|
1384
|
+
transform.translate(args[0], args[1], args[2]);
|
1385
|
+
PGraphicsOpenGL.invTranslate((PMatrix3D)transformInv, args[0], args[1], args[2]);
|
1386
|
+
} else {
|
1387
|
+
transform.translate(args[0], args[1]);
|
1388
|
+
PGraphicsOpenGL.invTranslate((PMatrix2D)transformInv, args[0], args[1]);
|
1389
|
+
}
|
1390
|
+
break;
|
1391
|
+
case ROTATE:
|
1392
|
+
if (ncoords == 3) {
|
1393
|
+
transform.rotate(args[0], args[1], args[2], args[3]);
|
1394
|
+
PGraphicsOpenGL.invRotate((PMatrix3D)transformInv, args[0], args[1], args[2], args[3]);
|
1395
|
+
} else {
|
1396
|
+
transform.rotate(args[0]);
|
1397
|
+
PGraphicsOpenGL.invRotate((PMatrix2D)transformInv, -args[0]);
|
1398
|
+
}
|
1399
|
+
break;
|
1400
|
+
case SCALE:
|
1401
|
+
if (ncoords == 3) {
|
1402
|
+
transform.scale(args[0], args[1], args[2]);
|
1403
|
+
PGraphicsOpenGL.invScale((PMatrix3D)transformInv, args[0], args[1], args[2]);
|
1404
|
+
} else {
|
1405
|
+
transform.scale(args[0], args[1]);
|
1406
|
+
PGraphicsOpenGL.invScale((PMatrix2D)transformInv, args[0], args[1]);
|
1407
|
+
}
|
1408
|
+
break;
|
1409
|
+
case MATRIX:
|
1410
|
+
if (ncoords == 3) {
|
1411
|
+
transform.set(args[ 0], args[ 1], args[ 2], args[ 3],
|
1412
|
+
args[ 4], args[ 5], args[ 6], args[ 7],
|
1413
|
+
args[ 8], args[ 9], args[10], args[11],
|
1414
|
+
args[12], args[13], args[14], args[15]);
|
1415
|
+
} else {
|
1416
|
+
transform.set(args[0], args[1], args[2],
|
1417
|
+
args[3], args[4], args[5]);
|
1418
|
+
}
|
1419
|
+
transformInv.set(transform);
|
1420
|
+
invertible = transformInv.invert();
|
1421
|
+
break;
|
1347
1422
|
}
|
1348
1423
|
matrix.preApply(transform);
|
1349
1424
|
if (invertible) {
|
@@ -1351,15 +1426,14 @@ public class PShapeOpenGL extends PShape {
|
|
1351
1426
|
} else {
|
1352
1427
|
PGraphics.showWarning("Transformation applied on the shape cannot be inverted");
|
1353
1428
|
}
|
1354
|
-
if (tessellated)
|
1355
|
-
applyMatrixImpl(transform);
|
1356
|
-
}
|
1429
|
+
if (tessellated) applyMatrixImpl(transform);
|
1357
1430
|
}
|
1358
1431
|
|
1432
|
+
|
1359
1433
|
protected void applyMatrixImpl(PMatrix matrix) {
|
1360
1434
|
if (hasPolys) {
|
1361
1435
|
tessGeo.applyMatrixOnPolyGeometry(matrix,
|
1362
|
-
|
1436
|
+
firstPolyVertex, lastPolyVertex);
|
1363
1437
|
root.setModifiedPolyVertices(firstPolyVertex, lastPolyVertex);
|
1364
1438
|
root.setModifiedPolyNormals(firstPolyVertex, lastPolyVertex);
|
1365
1439
|
polyAttribs.values().stream().filter((attrib) -> (attrib.isPosition() || attrib.isNormal())).forEachOrdered((attrib) -> {
|
@@ -1370,20 +1444,21 @@ public class PShapeOpenGL extends PShape {
|
|
1370
1444
|
if (is3D()) {
|
1371
1445
|
if (hasLines) {
|
1372
1446
|
tessGeo.applyMatrixOnLineGeometry(matrix,
|
1373
|
-
|
1447
|
+
firstLineVertex, lastLineVertex);
|
1374
1448
|
root.setModifiedLineVertices(firstLineVertex, lastLineVertex);
|
1375
1449
|
root.setModifiedLineAttributes(firstLineVertex, lastLineVertex);
|
1376
1450
|
}
|
1377
1451
|
|
1378
1452
|
if (hasPoints) {
|
1379
1453
|
tessGeo.applyMatrixOnPointGeometry(matrix,
|
1380
|
-
|
1454
|
+
firstPointVertex, lastPointVertex);
|
1381
1455
|
root.setModifiedPointVertices(firstPointVertex, lastPointVertex);
|
1382
1456
|
root.setModifiedPointAttributes(firstPointVertex, lastPointVertex);
|
1383
1457
|
}
|
1384
1458
|
}
|
1385
1459
|
}
|
1386
1460
|
|
1461
|
+
|
1387
1462
|
@Override
|
1388
1463
|
protected void checkMatrix(int dimensions) {
|
1389
1464
|
if (matrix == null) {
|
@@ -1400,9 +1475,14 @@ public class PShapeOpenGL extends PShape {
|
|
1400
1475
|
}
|
1401
1476
|
}
|
1402
1477
|
|
1478
|
+
|
1403
1479
|
///////////////////////////////////////////////////////////
|
1480
|
+
|
1404
1481
|
//
|
1482
|
+
|
1405
1483
|
// Bezier curves
|
1484
|
+
|
1485
|
+
|
1406
1486
|
@Override
|
1407
1487
|
public void bezierDetail(int detail) {
|
1408
1488
|
bezierDetail = detail;
|
@@ -1412,61 +1492,72 @@ public class PShapeOpenGL extends PShape {
|
|
1412
1492
|
//pg.bezierDetail(detail); // setting the detail in the renderer, WTF??
|
1413
1493
|
}
|
1414
1494
|
|
1495
|
+
|
1415
1496
|
@Override
|
1416
1497
|
public void bezierVertex(float x2, float y2,
|
1417
|
-
|
1418
|
-
|
1498
|
+
float x3, float y3,
|
1499
|
+
float x4, float y4) {
|
1419
1500
|
bezierVertexImpl(x2, y2, 0,
|
1420
|
-
|
1421
|
-
|
1501
|
+
x3, y3, 0,
|
1502
|
+
x4, y4, 0);
|
1422
1503
|
}
|
1423
1504
|
|
1505
|
+
|
1424
1506
|
@Override
|
1425
1507
|
public void bezierVertex(float x2, float y2, float z2,
|
1426
|
-
|
1427
|
-
|
1508
|
+
float x3, float y3, float z3,
|
1509
|
+
float x4, float y4, float z4) {
|
1428
1510
|
bezierVertexImpl(x2, y2, z2,
|
1429
|
-
|
1430
|
-
|
1511
|
+
x3, y3, z3,
|
1512
|
+
x4, y4, z4);
|
1431
1513
|
}
|
1432
1514
|
|
1515
|
+
|
1433
1516
|
protected void bezierVertexImpl(float x2, float y2, float z2,
|
1434
|
-
|
1435
|
-
|
1517
|
+
float x3, float y3, float z3,
|
1518
|
+
float x4, float y4, float z4) {
|
1436
1519
|
inGeo.setMaterial(fillColor, strokeColor, strokeWeight,
|
1437
|
-
|
1520
|
+
ambientColor, specularColor, emissiveColor, shininess);
|
1438
1521
|
inGeo.setNormal(normalX, normalY, normalZ);
|
1439
1522
|
inGeo.addBezierVertex(x2, y2, z2,
|
1440
|
-
|
1441
|
-
|
1523
|
+
x3, y3, z3,
|
1524
|
+
x4, y4, z4, vertexBreak());
|
1442
1525
|
}
|
1443
1526
|
|
1527
|
+
|
1444
1528
|
@Override
|
1445
1529
|
public void quadraticVertex(float cx, float cy,
|
1446
|
-
|
1530
|
+
float x3, float y3) {
|
1447
1531
|
quadraticVertexImpl(cx, cy, 0,
|
1448
|
-
|
1532
|
+
x3, y3, 0);
|
1449
1533
|
}
|
1450
1534
|
|
1535
|
+
|
1451
1536
|
@Override
|
1452
1537
|
public void quadraticVertex(float cx, float cy, float cz,
|
1453
|
-
|
1538
|
+
float x3, float y3, float z3) {
|
1454
1539
|
quadraticVertexImpl(cx, cy, cz,
|
1455
|
-
|
1540
|
+
x3, y3, z3);
|
1456
1541
|
}
|
1457
1542
|
|
1543
|
+
|
1458
1544
|
protected void quadraticVertexImpl(float cx, float cy, float cz,
|
1459
|
-
|
1545
|
+
float x3, float y3, float z3) {
|
1460
1546
|
inGeo.setMaterial(fillColor, strokeColor, strokeWeight,
|
1461
|
-
|
1547
|
+
ambientColor, specularColor, emissiveColor, shininess);
|
1462
1548
|
inGeo.setNormal(normalX, normalY, normalZ);
|
1463
1549
|
inGeo.addQuadraticVertex(cx, cy, cz,
|
1464
|
-
|
1550
|
+
x3, y3, z3, vertexBreak());
|
1465
1551
|
}
|
1466
1552
|
|
1553
|
+
|
1467
1554
|
///////////////////////////////////////////////////////////
|
1555
|
+
|
1468
1556
|
//
|
1557
|
+
|
1469
1558
|
// Catmull-Rom curves
|
1559
|
+
|
1560
|
+
|
1470
1561
|
@Override
|
1471
1562
|
public void curveDetail(int detail) {
|
1472
1563
|
curveDetail = detail;
|
@@ -1476,6 +1567,7 @@ public class PShapeOpenGL extends PShape {
|
|
1476
1567
|
}
|
1477
1568
|
}
|
1478
1569
|
|
1570
|
+
|
1479
1571
|
@Override
|
1480
1572
|
public void curveTightness(float tightness) {
|
1481
1573
|
curveTightness = tightness;
|
@@ -1485,31 +1577,38 @@ public class PShapeOpenGL extends PShape {
|
|
1485
1577
|
}
|
1486
1578
|
}
|
1487
1579
|
|
1580
|
+
|
1488
1581
|
@Override
|
1489
1582
|
public void curveVertex(float x, float y) {
|
1490
1583
|
curveVertexImpl(x, y, 0);
|
1491
1584
|
}
|
1492
1585
|
|
1586
|
+
|
1493
1587
|
@Override
|
1494
1588
|
public void curveVertex(float x, float y, float z) {
|
1495
1589
|
curveVertexImpl(x, y, z);
|
1496
1590
|
}
|
1497
1591
|
|
1592
|
+
|
1498
1593
|
protected void curveVertexImpl(float x, float y, float z) {
|
1499
1594
|
inGeo.setMaterial(fillColor, strokeColor, strokeWeight,
|
1500
|
-
|
1595
|
+
ambientColor, specularColor, emissiveColor, shininess);
|
1501
1596
|
inGeo.setNormal(normalX, normalY, normalZ);
|
1502
1597
|
inGeo.addCurveVertex(x, y, z, vertexBreak());
|
1503
1598
|
}
|
1504
1599
|
|
1600
|
+
|
1505
1601
|
///////////////////////////////////////////////////////////
|
1602
|
+
|
1506
1603
|
//
|
1604
|
+
|
1507
1605
|
// Setters/getters of individual vertices
|
1606
|
+
|
1607
|
+
|
1508
1608
|
@Override
|
1509
1609
|
public int getVertexCount() {
|
1510
|
-
if (family == GROUP)
|
1511
|
-
|
1512
|
-
} else {
|
1610
|
+
if (family == GROUP) return 0; // Group shapes don't have vertices
|
1611
|
+
else {
|
1513
1612
|
if (family == PRIMITIVE || family == PATH) {
|
1514
1613
|
// the input geometry of primitive and path shapes is built during
|
1515
1614
|
// tessellation
|
@@ -1519,6 +1618,7 @@ public class PShapeOpenGL extends PShape {
|
|
1519
1618
|
}
|
1520
1619
|
}
|
1521
1620
|
|
1621
|
+
|
1522
1622
|
@Override
|
1523
1623
|
public PVector getVertex(int index, PVector vec) {
|
1524
1624
|
if (vec == null) {
|
@@ -1530,26 +1630,31 @@ public class PShapeOpenGL extends PShape {
|
|
1530
1630
|
return vec;
|
1531
1631
|
}
|
1532
1632
|
|
1633
|
+
|
1533
1634
|
@Override
|
1534
1635
|
public float getVertexX(int index) {
|
1535
1636
|
return inGeo.vertices[3 * index + 0];
|
1536
1637
|
}
|
1537
1638
|
|
1639
|
+
|
1538
1640
|
@Override
|
1539
1641
|
public float getVertexY(int index) {
|
1540
1642
|
return inGeo.vertices[3 * index + 1];
|
1541
1643
|
}
|
1542
1644
|
|
1645
|
+
|
1543
1646
|
@Override
|
1544
1647
|
public float getVertexZ(int index) {
|
1545
1648
|
return inGeo.vertices[3 * index + 2];
|
1546
1649
|
}
|
1547
1650
|
|
1651
|
+
|
1548
1652
|
@Override
|
1549
1653
|
public void setVertex(int index, float x, float y) {
|
1550
1654
|
setVertex(index, x, y, 0);
|
1551
1655
|
}
|
1552
1656
|
|
1657
|
+
|
1553
1658
|
@Override
|
1554
1659
|
public void setVertex(int index, float x, float y, float z) {
|
1555
1660
|
if (openShape) {
|
@@ -1563,8 +1668,8 @@ public class PShapeOpenGL extends PShape {
|
|
1563
1668
|
// situation, we would need a complete rethinking of the rendering architecture
|
1564
1669
|
// in Processing :-)
|
1565
1670
|
if (family == PATH) {
|
1566
|
-
if (vertexCodes != null && vertexCodeCount > 0
|
1567
|
-
|
1671
|
+
if (vertexCodes != null && vertexCodeCount > 0 &&
|
1672
|
+
vertexCodes[index] != VERTEX) {
|
1568
1673
|
PGraphics.showWarning(NOT_A_SIMPLE_VERTEX, "setVertex()");
|
1569
1674
|
return;
|
1570
1675
|
}
|
@@ -1582,6 +1687,7 @@ public class PShapeOpenGL extends PShape {
|
|
1582
1687
|
markForTessellation();
|
1583
1688
|
}
|
1584
1689
|
|
1690
|
+
|
1585
1691
|
@Override
|
1586
1692
|
public void setVertex(int index, PVector vec) {
|
1587
1693
|
if (openShape) {
|
@@ -1590,8 +1696,8 @@ public class PShapeOpenGL extends PShape {
|
|
1590
1696
|
}
|
1591
1697
|
|
1592
1698
|
if (family == PATH) {
|
1593
|
-
if (vertexCodes != null && vertexCodeCount > 0
|
1594
|
-
|
1699
|
+
if (vertexCodes != null && vertexCodeCount > 0 &&
|
1700
|
+
vertexCodes[index] != VERTEX) {
|
1595
1701
|
PGraphics.showWarning(NOT_A_SIMPLE_VERTEX, "setVertex()");
|
1596
1702
|
return;
|
1597
1703
|
}
|
@@ -1608,6 +1714,7 @@ public class PShapeOpenGL extends PShape {
|
|
1608
1714
|
markForTessellation();
|
1609
1715
|
}
|
1610
1716
|
|
1717
|
+
|
1611
1718
|
@Override
|
1612
1719
|
public PVector getNormal(int index, PVector vec) {
|
1613
1720
|
if (vec == null) {
|
@@ -1619,21 +1726,25 @@ public class PShapeOpenGL extends PShape {
|
|
1619
1726
|
return vec;
|
1620
1727
|
}
|
1621
1728
|
|
1729
|
+
|
1622
1730
|
@Override
|
1623
1731
|
public float getNormalX(int index) {
|
1624
1732
|
return inGeo.normals[3 * index + 0];
|
1625
1733
|
}
|
1626
1734
|
|
1735
|
+
|
1627
1736
|
@Override
|
1628
1737
|
public float getNormalY(int index) {
|
1629
1738
|
return inGeo.normals[3 * index + 1];
|
1630
1739
|
}
|
1631
1740
|
|
1741
|
+
|
1632
1742
|
@Override
|
1633
1743
|
public float getNormalZ(int index) {
|
1634
1744
|
return inGeo.normals[3 * index + 2];
|
1635
1745
|
}
|
1636
1746
|
|
1747
|
+
|
1637
1748
|
@Override
|
1638
1749
|
public void setNormal(int index, float nx, float ny, float nz) {
|
1639
1750
|
if (openShape) {
|
@@ -1647,6 +1758,7 @@ public class PShapeOpenGL extends PShape {
|
|
1647
1758
|
markForTessellation();
|
1648
1759
|
}
|
1649
1760
|
|
1761
|
+
|
1650
1762
|
@Override
|
1651
1763
|
public void setAttrib(String name, int index, float... values) {
|
1652
1764
|
if (openShape) {
|
@@ -1655,12 +1767,13 @@ public class PShapeOpenGL extends PShape {
|
|
1655
1767
|
}
|
1656
1768
|
|
1657
1769
|
VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, PGL.FLOAT,
|
1658
|
-
|
1770
|
+
values.length);
|
1659
1771
|
float[] array = inGeo.fattribs.get(name);
|
1660
1772
|
System.arraycopy(values, 0, array, attrib.size * index, values.length);
|
1661
1773
|
markForTessellation();
|
1662
1774
|
}
|
1663
1775
|
|
1776
|
+
|
1664
1777
|
@Override
|
1665
1778
|
public void setAttrib(String name, int index, int... values) {
|
1666
1779
|
if (openShape) {
|
@@ -1669,12 +1782,15 @@ public class PShapeOpenGL extends PShape {
|
|
1669
1782
|
}
|
1670
1783
|
|
1671
1784
|
VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, PGL.INT,
|
1672
|
-
|
1785
|
+
values.length);
|
1673
1786
|
int[] array = inGeo.iattribs.get(name);
|
1674
|
-
|
1787
|
+
for (int i = 0; i < values.length; i++) {
|
1788
|
+
array[attrib.size * index + i] = values[i];
|
1789
|
+
}
|
1675
1790
|
markForTessellation();
|
1676
1791
|
}
|
1677
1792
|
|
1793
|
+
|
1678
1794
|
@Override
|
1679
1795
|
public void setAttrib(String name, int index, boolean... values) {
|
1680
1796
|
if (openShape) {
|
@@ -1683,24 +1799,27 @@ public class PShapeOpenGL extends PShape {
|
|
1683
1799
|
}
|
1684
1800
|
|
1685
1801
|
VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, PGL.BOOL,
|
1686
|
-
|
1802
|
+
values.length);
|
1687
1803
|
byte[] array = inGeo.battribs.get(name);
|
1688
1804
|
for (int i = 0; i < values.length; i++) {
|
1689
|
-
array[attrib.size * index + i] = (byte)
|
1805
|
+
array[attrib.size * index + i] = (byte)(values[i]?1:0);
|
1690
1806
|
}
|
1691
1807
|
markForTessellation();
|
1692
1808
|
}
|
1693
1809
|
|
1810
|
+
|
1694
1811
|
@Override
|
1695
1812
|
public float getTextureU(int index) {
|
1696
1813
|
return inGeo.texcoords[2 * index + 0];
|
1697
1814
|
}
|
1698
1815
|
|
1816
|
+
|
1699
1817
|
@Override
|
1700
1818
|
public float getTextureV(int index) {
|
1701
1819
|
return inGeo.texcoords[2 * index + 1];
|
1702
1820
|
}
|
1703
1821
|
|
1822
|
+
|
1704
1823
|
@Override
|
1705
1824
|
public void setTextureUV(int index, float u, float v) {
|
1706
1825
|
if (openShape) {
|
@@ -1718,6 +1837,7 @@ public class PShapeOpenGL extends PShape {
|
|
1718
1837
|
markForTessellation();
|
1719
1838
|
}
|
1720
1839
|
|
1840
|
+
|
1721
1841
|
@Override
|
1722
1842
|
public int getFill(int index) {
|
1723
1843
|
if (family != GROUP && image == null) {
|
@@ -1727,6 +1847,7 @@ public class PShapeOpenGL extends PShape {
|
|
1727
1847
|
}
|
1728
1848
|
}
|
1729
1849
|
|
1850
|
+
|
1730
1851
|
@Override
|
1731
1852
|
public void setFill(boolean fill) {
|
1732
1853
|
if (openShape) {
|
@@ -1745,6 +1866,7 @@ public class PShapeOpenGL extends PShape {
|
|
1745
1866
|
this.fill = fill;
|
1746
1867
|
}
|
1747
1868
|
|
1869
|
+
|
1748
1870
|
@Override
|
1749
1871
|
public void setFill(int fill) {
|
1750
1872
|
if (openShape) {
|
@@ -1762,30 +1884,25 @@ public class PShapeOpenGL extends PShape {
|
|
1762
1884
|
}
|
1763
1885
|
}
|
1764
1886
|
|
1887
|
+
|
1765
1888
|
protected void setFillImpl(int fill) {
|
1766
|
-
if (fillColor == fill)
|
1767
|
-
return;
|
1768
|
-
}
|
1889
|
+
if (fillColor == fill) return;
|
1769
1890
|
fillColor = fill;
|
1770
1891
|
|
1771
1892
|
if (image == null) {
|
1772
1893
|
Arrays.fill(inGeo.colors, 0, inGeo.vertexCount,
|
1773
|
-
|
1894
|
+
PGL.javaToNativeARGB(fillColor));
|
1774
1895
|
if (shapeCreated && tessellated && hasPolys) {
|
1775
1896
|
if (is3D()) {
|
1776
1897
|
Arrays.fill(tessGeo.polyColors, firstPolyVertex, lastPolyVertex + 1,
|
1777
|
-
|
1898
|
+
PGL.javaToNativeARGB(fillColor));
|
1778
1899
|
root.setModifiedPolyColors(firstPolyVertex, lastPolyVertex);
|
1779
1900
|
} else if (is2D()) {
|
1780
1901
|
int last1 = lastPolyVertex + 1;
|
1781
|
-
if (-1 < firstLineVertex)
|
1782
|
-
|
1783
|
-
}
|
1784
|
-
if (-1 < firstPointVertex) {
|
1785
|
-
last1 = firstPointVertex;
|
1786
|
-
}
|
1902
|
+
if (-1 < firstLineVertex) last1 = firstLineVertex;
|
1903
|
+
if (-1 < firstPointVertex) last1 = firstPointVertex;
|
1787
1904
|
Arrays.fill(tessGeo.polyColors, firstPolyVertex, last1,
|
1788
|
-
|
1905
|
+
PGL.javaToNativeARGB(fillColor));
|
1789
1906
|
root.setModifiedPolyColors(firstPolyVertex, last1 - 1);
|
1790
1907
|
}
|
1791
1908
|
}
|
@@ -1801,6 +1918,7 @@ public class PShapeOpenGL extends PShape {
|
|
1801
1918
|
}
|
1802
1919
|
}
|
1803
1920
|
|
1921
|
+
|
1804
1922
|
@Override
|
1805
1923
|
public void setFill(int index, int fill) {
|
1806
1924
|
if (openShape) {
|
@@ -1814,6 +1932,7 @@ public class PShapeOpenGL extends PShape {
|
|
1814
1932
|
}
|
1815
1933
|
}
|
1816
1934
|
|
1935
|
+
|
1817
1936
|
@Override
|
1818
1937
|
public int getTint(int index) {
|
1819
1938
|
if (family != GROUP && image != null) {
|
@@ -1823,6 +1942,7 @@ public class PShapeOpenGL extends PShape {
|
|
1823
1942
|
}
|
1824
1943
|
}
|
1825
1944
|
|
1945
|
+
|
1826
1946
|
@Override
|
1827
1947
|
public void setTint(boolean tint) {
|
1828
1948
|
if (openShape) {
|
@@ -1841,6 +1961,7 @@ public class PShapeOpenGL extends PShape {
|
|
1841
1961
|
this.tint = tint;
|
1842
1962
|
}
|
1843
1963
|
|
1964
|
+
|
1844
1965
|
@Override
|
1845
1966
|
public void setTint(int tint) {
|
1846
1967
|
if (openShape) {
|
@@ -1858,36 +1979,32 @@ public class PShapeOpenGL extends PShape {
|
|
1858
1979
|
}
|
1859
1980
|
}
|
1860
1981
|
|
1982
|
+
|
1861
1983
|
protected void setTintImpl(int tint) {
|
1862
|
-
if (tintColor == tint)
|
1863
|
-
return;
|
1864
|
-
}
|
1984
|
+
if (tintColor == tint) return;
|
1865
1985
|
tintColor = tint;
|
1866
1986
|
|
1867
1987
|
if (image != null) {
|
1868
1988
|
Arrays.fill(inGeo.colors, 0, inGeo.vertexCount,
|
1869
|
-
|
1989
|
+
PGL.javaToNativeARGB(tintColor));
|
1870
1990
|
if (shapeCreated && tessellated && hasPolys) {
|
1871
1991
|
if (is3D()) {
|
1872
1992
|
Arrays.fill(tessGeo.polyColors, firstPolyVertex, lastPolyVertex + 1,
|
1873
|
-
|
1993
|
+
PGL.javaToNativeARGB(tintColor));
|
1874
1994
|
root.setModifiedPolyColors(firstPolyVertex, lastPolyVertex);
|
1875
1995
|
} else if (is2D()) {
|
1876
1996
|
int last1 = lastPolyVertex + 1;
|
1877
|
-
if (-1 < firstLineVertex)
|
1878
|
-
|
1879
|
-
}
|
1880
|
-
if (-1 < firstPointVertex) {
|
1881
|
-
last1 = firstPointVertex;
|
1882
|
-
}
|
1997
|
+
if (-1 < firstLineVertex) last1 = firstLineVertex;
|
1998
|
+
if (-1 < firstPointVertex) last1 = firstPointVertex;
|
1883
1999
|
Arrays.fill(tessGeo.polyColors, firstPolyVertex, last1,
|
1884
|
-
|
2000
|
+
PGL.javaToNativeARGB(tintColor));
|
1885
2001
|
root.setModifiedPolyColors(firstPolyVertex, last1 - 1);
|
1886
2002
|
}
|
1887
2003
|
}
|
1888
2004
|
}
|
1889
2005
|
}
|
1890
2006
|
|
2007
|
+
|
1891
2008
|
@Override
|
1892
2009
|
public void setTint(int index, int tint) {
|
1893
2010
|
if (openShape) {
|
@@ -1901,6 +2018,7 @@ public class PShapeOpenGL extends PShape {
|
|
1901
2018
|
}
|
1902
2019
|
}
|
1903
2020
|
|
2021
|
+
|
1904
2022
|
@Override
|
1905
2023
|
public int getStroke(int index) {
|
1906
2024
|
if (family != GROUP) {
|
@@ -1910,6 +2028,7 @@ public class PShapeOpenGL extends PShape {
|
|
1910
2028
|
}
|
1911
2029
|
}
|
1912
2030
|
|
2031
|
+
|
1913
2032
|
@Override
|
1914
2033
|
public void setStroke(boolean stroke) {
|
1915
2034
|
if (openShape) {
|
@@ -1928,6 +2047,7 @@ public class PShapeOpenGL extends PShape {
|
|
1928
2047
|
}
|
1929
2048
|
}
|
1930
2049
|
|
2050
|
+
|
1931
2051
|
protected void setStrokeImpl(boolean stroke) {
|
1932
2052
|
if (this.stroke != stroke) {
|
1933
2053
|
if (stroke) {
|
@@ -1941,13 +2061,14 @@ public class PShapeOpenGL extends PShape {
|
|
1941
2061
|
|
1942
2062
|
markForTessellation();
|
1943
2063
|
if (is2D() && parent != null) {
|
1944
|
-
((PShapeOpenGL)
|
2064
|
+
((PShapeOpenGL)parent).strokedTexture(stroke && image != null);
|
1945
2065
|
}
|
1946
2066
|
|
1947
2067
|
this.stroke = stroke;
|
1948
2068
|
}
|
1949
2069
|
}
|
1950
2070
|
|
2071
|
+
|
1951
2072
|
@Override
|
1952
2073
|
public void setStroke(int stroke) {
|
1953
2074
|
if (openShape) {
|
@@ -1965,40 +2086,40 @@ public class PShapeOpenGL extends PShape {
|
|
1965
2086
|
}
|
1966
2087
|
}
|
1967
2088
|
|
2089
|
+
|
1968
2090
|
protected void setStrokeImpl(int stroke) {
|
1969
|
-
if (strokeColor == stroke)
|
1970
|
-
return;
|
1971
|
-
}
|
2091
|
+
if (strokeColor == stroke) return;
|
1972
2092
|
strokeColor = stroke;
|
1973
2093
|
|
1974
2094
|
Arrays.fill(inGeo.strokeColors, 0, inGeo.vertexCount,
|
1975
|
-
|
2095
|
+
PGL.javaToNativeARGB(strokeColor));
|
1976
2096
|
if (shapeCreated && tessellated && (hasLines || hasPoints)) {
|
1977
2097
|
if (hasLines) {
|
1978
2098
|
if (is3D()) {
|
1979
2099
|
Arrays.fill(tessGeo.lineColors, firstLineVertex, lastLineVertex + 1,
|
1980
|
-
|
2100
|
+
PGL.javaToNativeARGB(strokeColor));
|
1981
2101
|
root.setModifiedLineColors(firstLineVertex, lastLineVertex);
|
1982
2102
|
} else if (is2D()) {
|
1983
2103
|
Arrays.fill(tessGeo.polyColors, firstLineVertex, lastLineVertex + 1,
|
1984
|
-
|
2104
|
+
PGL.javaToNativeARGB(strokeColor));
|
1985
2105
|
root.setModifiedPolyColors(firstLineVertex, lastLineVertex);
|
1986
2106
|
}
|
1987
2107
|
}
|
1988
2108
|
if (hasPoints) {
|
1989
2109
|
if (is3D()) {
|
1990
2110
|
Arrays.fill(tessGeo.pointColors, firstPointVertex, lastPointVertex + 1,
|
1991
|
-
|
2111
|
+
PGL.javaToNativeARGB(strokeColor));
|
1992
2112
|
root.setModifiedPointColors(firstPointVertex, lastPointVertex);
|
1993
2113
|
} else if (is2D()) {
|
1994
2114
|
Arrays.fill(tessGeo.polyColors, firstPointVertex, lastPointVertex + 1,
|
1995
|
-
|
2115
|
+
PGL.javaToNativeARGB(strokeColor));
|
1996
2116
|
root.setModifiedPolyColors(firstPointVertex, lastPointVertex);
|
1997
2117
|
}
|
1998
2118
|
}
|
1999
2119
|
}
|
2000
2120
|
}
|
2001
2121
|
|
2122
|
+
|
2002
2123
|
@Override
|
2003
2124
|
public void setStroke(int index, int stroke) {
|
2004
2125
|
if (openShape) {
|
@@ -2010,6 +2131,7 @@ public class PShapeOpenGL extends PShape {
|
|
2010
2131
|
markForTessellation();
|
2011
2132
|
}
|
2012
2133
|
|
2134
|
+
|
2013
2135
|
@Override
|
2014
2136
|
public float getStrokeWeight(int index) {
|
2015
2137
|
if (family != GROUP) {
|
@@ -2019,6 +2141,7 @@ public class PShapeOpenGL extends PShape {
|
|
2019
2141
|
}
|
2020
2142
|
}
|
2021
2143
|
|
2144
|
+
|
2022
2145
|
@Override
|
2023
2146
|
public void setStrokeWeight(float weight) {
|
2024
2147
|
if (openShape) {
|
@@ -2036,10 +2159,9 @@ public class PShapeOpenGL extends PShape {
|
|
2036
2159
|
}
|
2037
2160
|
}
|
2038
2161
|
|
2162
|
+
|
2039
2163
|
protected void setStrokeWeightImpl(float weight) {
|
2040
|
-
if (PGraphicsOpenGL.same(strokeWeight, weight))
|
2041
|
-
return;
|
2042
|
-
}
|
2164
|
+
if (PGraphicsOpenGL.same(strokeWeight, weight)) return;
|
2043
2165
|
float oldWeight = strokeWeight;
|
2044
2166
|
strokeWeight = weight;
|
2045
2167
|
|
@@ -2076,6 +2198,7 @@ public class PShapeOpenGL extends PShape {
|
|
2076
2198
|
}
|
2077
2199
|
}
|
2078
2200
|
|
2201
|
+
|
2079
2202
|
@Override
|
2080
2203
|
public void setStrokeWeight(int index, float weight) {
|
2081
2204
|
if (openShape) {
|
@@ -2087,6 +2210,7 @@ public class PShapeOpenGL extends PShape {
|
|
2087
2210
|
markForTessellation();
|
2088
2211
|
}
|
2089
2212
|
|
2213
|
+
|
2090
2214
|
@Override
|
2091
2215
|
public void setStrokeJoin(int join) {
|
2092
2216
|
if (openShape) {
|
@@ -2110,6 +2234,7 @@ public class PShapeOpenGL extends PShape {
|
|
2110
2234
|
}
|
2111
2235
|
}
|
2112
2236
|
|
2237
|
+
|
2113
2238
|
@Override
|
2114
2239
|
public void setStrokeCap(int cap) {
|
2115
2240
|
if (openShape) {
|
@@ -2133,6 +2258,7 @@ public class PShapeOpenGL extends PShape {
|
|
2133
2258
|
}
|
2134
2259
|
}
|
2135
2260
|
|
2261
|
+
|
2136
2262
|
@Override
|
2137
2263
|
public int getAmbient(int index) {
|
2138
2264
|
if (family != GROUP) {
|
@@ -2142,6 +2268,7 @@ public class PShapeOpenGL extends PShape {
|
|
2142
2268
|
}
|
2143
2269
|
}
|
2144
2270
|
|
2271
|
+
|
2145
2272
|
@Override
|
2146
2273
|
public void setAmbient(int ambient) {
|
2147
2274
|
if (openShape) {
|
@@ -2159,35 +2286,31 @@ public class PShapeOpenGL extends PShape {
|
|
2159
2286
|
}
|
2160
2287
|
}
|
2161
2288
|
|
2289
|
+
|
2162
2290
|
protected void setAmbientImpl(int ambient) {
|
2163
|
-
if (ambientColor == ambient)
|
2164
|
-
return;
|
2165
|
-
}
|
2291
|
+
if (ambientColor == ambient) return;
|
2166
2292
|
ambientColor = ambient;
|
2167
2293
|
|
2168
2294
|
Arrays.fill(inGeo.ambient, 0, inGeo.vertexCount,
|
2169
|
-
|
2295
|
+
PGL.javaToNativeARGB(ambientColor));
|
2170
2296
|
if (shapeCreated && tessellated && hasPolys) {
|
2171
2297
|
if (is3D()) {
|
2172
2298
|
Arrays.fill(tessGeo.polyAmbient, firstPolyVertex, lastPolyVertex + 1,
|
2173
|
-
|
2299
|
+
PGL.javaToNativeARGB(ambientColor));
|
2174
2300
|
root.setModifiedPolyAmbient(firstPolyVertex, lastPolyVertex);
|
2175
2301
|
} else if (is2D()) {
|
2176
2302
|
int last1 = lastPolyVertex + 1;
|
2177
|
-
if (-1 < firstLineVertex)
|
2178
|
-
|
2179
|
-
}
|
2180
|
-
if (-1 < firstPointVertex) {
|
2181
|
-
last1 = firstPointVertex;
|
2182
|
-
}
|
2303
|
+
if (-1 < firstLineVertex) last1 = firstLineVertex;
|
2304
|
+
if (-1 < firstPointVertex) last1 = firstPointVertex;
|
2183
2305
|
Arrays.fill(tessGeo.polyAmbient, firstPolyVertex, last1,
|
2184
|
-
|
2306
|
+
PGL.javaToNativeARGB(ambientColor));
|
2185
2307
|
root.setModifiedPolyColors(firstPolyVertex, last1 - 1);
|
2186
2308
|
}
|
2187
2309
|
}
|
2188
2310
|
setAmbient = true;
|
2189
2311
|
}
|
2190
2312
|
|
2313
|
+
|
2191
2314
|
@Override
|
2192
2315
|
public void setAmbient(int index, int ambient) {
|
2193
2316
|
if (openShape) {
|
@@ -2200,6 +2323,7 @@ public class PShapeOpenGL extends PShape {
|
|
2200
2323
|
setAmbient = true;
|
2201
2324
|
}
|
2202
2325
|
|
2326
|
+
|
2203
2327
|
@Override
|
2204
2328
|
public int getSpecular(int index) {
|
2205
2329
|
if (family == GROUP) {
|
@@ -2209,6 +2333,7 @@ public class PShapeOpenGL extends PShape {
|
|
2209
2333
|
}
|
2210
2334
|
}
|
2211
2335
|
|
2336
|
+
|
2212
2337
|
@Override
|
2213
2338
|
public void setSpecular(int specular) {
|
2214
2339
|
if (openShape) {
|
@@ -2226,34 +2351,30 @@ public class PShapeOpenGL extends PShape {
|
|
2226
2351
|
}
|
2227
2352
|
}
|
2228
2353
|
|
2354
|
+
|
2229
2355
|
protected void setSpecularImpl(int specular) {
|
2230
|
-
if (specularColor == specular)
|
2231
|
-
return;
|
2232
|
-
}
|
2356
|
+
if (specularColor == specular) return;
|
2233
2357
|
specularColor = specular;
|
2234
2358
|
|
2235
2359
|
Arrays.fill(inGeo.specular, 0, inGeo.vertexCount,
|
2236
|
-
|
2360
|
+
PGL.javaToNativeARGB(specularColor));
|
2237
2361
|
if (shapeCreated && tessellated && hasPolys) {
|
2238
2362
|
if (is3D()) {
|
2239
2363
|
Arrays.fill(tessGeo.polySpecular, firstPolyVertex, lastPolyVertex + 1,
|
2240
|
-
|
2364
|
+
PGL.javaToNativeARGB(specularColor));
|
2241
2365
|
root.setModifiedPolySpecular(firstPolyVertex, lastPolyVertex);
|
2242
2366
|
} else if (is2D()) {
|
2243
2367
|
int last1 = lastPolyVertex + 1;
|
2244
|
-
if (-1 < firstLineVertex)
|
2245
|
-
|
2246
|
-
}
|
2247
|
-
if (-1 < firstPointVertex) {
|
2248
|
-
last1 = firstPointVertex;
|
2249
|
-
}
|
2368
|
+
if (-1 < firstLineVertex) last1 = firstLineVertex;
|
2369
|
+
if (-1 < firstPointVertex) last1 = firstPointVertex;
|
2250
2370
|
Arrays.fill(tessGeo.polySpecular, firstPolyVertex, last1,
|
2251
|
-
|
2371
|
+
PGL.javaToNativeARGB(specularColor));
|
2252
2372
|
root.setModifiedPolyColors(firstPolyVertex, last1 - 1);
|
2253
2373
|
}
|
2254
2374
|
}
|
2255
2375
|
}
|
2256
2376
|
|
2377
|
+
|
2257
2378
|
@Override
|
2258
2379
|
public void setSpecular(int index, int specular) {
|
2259
2380
|
if (openShape) {
|
@@ -2265,6 +2386,7 @@ public class PShapeOpenGL extends PShape {
|
|
2265
2386
|
markForTessellation();
|
2266
2387
|
}
|
2267
2388
|
|
2389
|
+
|
2268
2390
|
@Override
|
2269
2391
|
public int getEmissive(int index) {
|
2270
2392
|
if (family == GROUP) {
|
@@ -2274,6 +2396,7 @@ public class PShapeOpenGL extends PShape {
|
|
2274
2396
|
}
|
2275
2397
|
}
|
2276
2398
|
|
2399
|
+
|
2277
2400
|
@Override
|
2278
2401
|
public void setEmissive(int emissive) {
|
2279
2402
|
if (openShape) {
|
@@ -2291,34 +2414,30 @@ public class PShapeOpenGL extends PShape {
|
|
2291
2414
|
}
|
2292
2415
|
}
|
2293
2416
|
|
2417
|
+
|
2294
2418
|
protected void setEmissiveImpl(int emissive) {
|
2295
|
-
if (emissiveColor == emissive)
|
2296
|
-
return;
|
2297
|
-
}
|
2419
|
+
if (emissiveColor == emissive) return;
|
2298
2420
|
emissiveColor = emissive;
|
2299
2421
|
|
2300
2422
|
Arrays.fill(inGeo.emissive, 0, inGeo.vertexCount,
|
2301
|
-
|
2423
|
+
PGL.javaToNativeARGB(emissiveColor));
|
2302
2424
|
if (shapeCreated && tessellated && 0 < tessGeo.polyVertexCount) {
|
2303
2425
|
if (is3D()) {
|
2304
2426
|
Arrays.fill(tessGeo.polyEmissive, firstPolyVertex, lastPolyVertex + 1,
|
2305
|
-
|
2427
|
+
PGL.javaToNativeARGB(emissiveColor));
|
2306
2428
|
root.setModifiedPolyEmissive(firstPolyVertex, lastPolyVertex);
|
2307
2429
|
} else if (is2D()) {
|
2308
2430
|
int last1 = lastPolyVertex + 1;
|
2309
|
-
if (-1 < firstLineVertex)
|
2310
|
-
|
2311
|
-
}
|
2312
|
-
if (-1 < firstPointVertex) {
|
2313
|
-
last1 = firstPointVertex;
|
2314
|
-
}
|
2431
|
+
if (-1 < firstLineVertex) last1 = firstLineVertex;
|
2432
|
+
if (-1 < firstPointVertex) last1 = firstPointVertex;
|
2315
2433
|
Arrays.fill(tessGeo.polyEmissive, firstPolyVertex, last1,
|
2316
|
-
|
2434
|
+
PGL.javaToNativeARGB(emissiveColor));
|
2317
2435
|
root.setModifiedPolyColors(firstPolyVertex, last1 - 1);
|
2318
2436
|
}
|
2319
2437
|
}
|
2320
2438
|
}
|
2321
2439
|
|
2440
|
+
|
2322
2441
|
@Override
|
2323
2442
|
public void setEmissive(int index, int emissive) {
|
2324
2443
|
if (openShape) {
|
@@ -2330,6 +2449,7 @@ public class PShapeOpenGL extends PShape {
|
|
2330
2449
|
markForTessellation();
|
2331
2450
|
}
|
2332
2451
|
|
2452
|
+
|
2333
2453
|
@Override
|
2334
2454
|
public float getShininess(int index) {
|
2335
2455
|
if (family == GROUP) {
|
@@ -2339,6 +2459,7 @@ public class PShapeOpenGL extends PShape {
|
|
2339
2459
|
}
|
2340
2460
|
}
|
2341
2461
|
|
2462
|
+
|
2342
2463
|
@Override
|
2343
2464
|
public void setShininess(float shininess) {
|
2344
2465
|
if (openShape) {
|
@@ -2356,32 +2477,28 @@ public class PShapeOpenGL extends PShape {
|
|
2356
2477
|
}
|
2357
2478
|
}
|
2358
2479
|
|
2480
|
+
|
2359
2481
|
protected void setShininessImpl(float shininess) {
|
2360
|
-
if (PGraphicsOpenGL.same(this.shininess, shininess))
|
2361
|
-
return;
|
2362
|
-
}
|
2482
|
+
if (PGraphicsOpenGL.same(this.shininess, shininess)) return;
|
2363
2483
|
this.shininess = shininess;
|
2364
2484
|
|
2365
2485
|
Arrays.fill(inGeo.shininess, 0, inGeo.vertexCount, shininess);
|
2366
2486
|
if (shapeCreated && tessellated && hasPolys) {
|
2367
2487
|
if (is3D()) {
|
2368
2488
|
Arrays.fill(tessGeo.polyShininess, firstPolyVertex, lastPolyVertex + 1,
|
2369
|
-
|
2489
|
+
shininess);
|
2370
2490
|
root.setModifiedPolyShininess(firstPolyVertex, lastPolyVertex);
|
2371
2491
|
} else if (is2D()) {
|
2372
2492
|
int last1 = lastPolyVertex + 1;
|
2373
|
-
if (-1 < firstLineVertex)
|
2374
|
-
|
2375
|
-
}
|
2376
|
-
if (-1 < firstPointVertex) {
|
2377
|
-
last1 = firstPointVertex;
|
2378
|
-
}
|
2493
|
+
if (-1 < firstLineVertex) last1 = firstLineVertex;
|
2494
|
+
if (-1 < firstPointVertex) last1 = firstPointVertex;
|
2379
2495
|
Arrays.fill(tessGeo.polyShininess, firstPolyVertex, last1, shininess);
|
2380
2496
|
root.setModifiedPolyColors(firstPolyVertex, last1 - 1);
|
2381
2497
|
}
|
2382
2498
|
}
|
2383
2499
|
}
|
2384
2500
|
|
2501
|
+
|
2385
2502
|
@Override
|
2386
2503
|
public void setShininess(int index, float shine) {
|
2387
2504
|
if (openShape) {
|
@@ -2394,30 +2511,31 @@ public class PShapeOpenGL extends PShape {
|
|
2394
2511
|
}
|
2395
2512
|
|
2396
2513
|
///////////////////////////////////////////////////////////
|
2514
|
+
|
2397
2515
|
//
|
2516
|
+
|
2398
2517
|
// Vertex codes
|
2518
|
+
|
2519
|
+
|
2399
2520
|
@Override
|
2400
2521
|
public int[] getVertexCodes() {
|
2401
|
-
if (family == GROUP)
|
2402
|
-
|
2403
|
-
} else {
|
2522
|
+
if (family == GROUP) return null;
|
2523
|
+
else {
|
2404
2524
|
if (family == PRIMITIVE || family == PATH) {
|
2405
2525
|
// the input geometry of primitive and path shapes is built during
|
2406
2526
|
// tessellation
|
2407
2527
|
updateTessellation();
|
2408
2528
|
}
|
2409
|
-
if (inGeo.codes == null)
|
2410
|
-
return null;
|
2411
|
-
}
|
2529
|
+
if (inGeo.codes == null) return null;
|
2412
2530
|
return inGeo.codes;
|
2413
2531
|
}
|
2414
2532
|
}
|
2415
2533
|
|
2534
|
+
|
2416
2535
|
@Override
|
2417
2536
|
public int getVertexCodeCount() {
|
2418
|
-
if (family == GROUP)
|
2419
|
-
|
2420
|
-
} else {
|
2537
|
+
if (family == GROUP) return 0;
|
2538
|
+
else {
|
2421
2539
|
if (family == PRIMITIVE || family == PATH) {
|
2422
2540
|
// the input geometry of primitive and path shapes is built during
|
2423
2541
|
// tessellation
|
@@ -2427,6 +2545,7 @@ public class PShapeOpenGL extends PShape {
|
|
2427
2545
|
}
|
2428
2546
|
}
|
2429
2547
|
|
2548
|
+
|
2430
2549
|
/**
|
2431
2550
|
* One of VERTEX, BEZIER_VERTEX, CURVE_VERTEX, or BREAK.
|
2432
2551
|
*/
|
@@ -2435,9 +2554,14 @@ public class PShapeOpenGL extends PShape {
|
|
2435
2554
|
return inGeo.codes[index];
|
2436
2555
|
}
|
2437
2556
|
|
2557
|
+
|
2438
2558
|
///////////////////////////////////////////////////////////
|
2559
|
+
|
2439
2560
|
//
|
2561
|
+
|
2440
2562
|
// Tessellated geometry getter.
|
2563
|
+
|
2564
|
+
|
2441
2565
|
@Override
|
2442
2566
|
public PShape getTessellation() {
|
2443
2567
|
updateTessellation();
|
@@ -2540,107 +2664,88 @@ public class PShapeOpenGL extends PShape {
|
|
2540
2664
|
public float[] getTessellation(int kind, int data) {
|
2541
2665
|
updateTessellation();
|
2542
2666
|
|
2543
|
-
|
2544
|
-
|
2545
|
-
|
2546
|
-
|
2547
|
-
|
2548
|
-
|
2549
|
-
|
2550
|
-
|
2551
|
-
|
2552
|
-
last1 = firstLineVertex;
|
2553
|
-
}
|
2554
|
-
if (-1 < firstPointVertex) {
|
2555
|
-
last1 = firstPointVertex;
|
2556
|
-
}
|
2557
|
-
root.setModifiedPolyVertices(firstPolyVertex, last1 - 1);
|
2558
|
-
}
|
2559
|
-
return tessGeo.polyVertices;
|
2560
|
-
case NORMAL:
|
2561
|
-
if (is3D()) {
|
2562
|
-
root.setModifiedPolyNormals(firstPolyVertex, lastPolyVertex);
|
2563
|
-
} else if (is2D()) {
|
2564
|
-
int last1 = lastPolyVertex + 1;
|
2565
|
-
if (-1 < firstLineVertex) {
|
2566
|
-
last1 = firstLineVertex;
|
2567
|
-
}
|
2568
|
-
if (-1 < firstPointVertex) {
|
2569
|
-
last1 = firstPointVertex;
|
2570
|
-
}
|
2571
|
-
root.setModifiedPolyNormals(firstPolyVertex, last1 - 1);
|
2572
|
-
}
|
2573
|
-
return tessGeo.polyNormals;
|
2574
|
-
case TEXCOORD:
|
2575
|
-
if (is3D()) {
|
2576
|
-
root.setModifiedPolyTexCoords(firstPolyVertex, lastPolyVertex);
|
2577
|
-
} else if (is2D()) {
|
2578
|
-
int last1 = lastPolyVertex + 1;
|
2579
|
-
if (-1 < firstLineVertex) {
|
2580
|
-
last1 = firstLineVertex;
|
2581
|
-
}
|
2582
|
-
if (-1 < firstPointVertex) {
|
2583
|
-
last1 = firstPointVertex;
|
2584
|
-
}
|
2585
|
-
root.setModifiedPolyTexCoords(firstPolyVertex, last1 - 1);
|
2586
|
-
}
|
2587
|
-
return tessGeo.polyTexCoords;
|
2588
|
-
default:
|
2589
|
-
break;
|
2667
|
+
if (kind == TRIANGLES) {
|
2668
|
+
if (data == POSITION) {
|
2669
|
+
if (is3D()) {
|
2670
|
+
root.setModifiedPolyVertices(firstPolyVertex, lastPolyVertex);
|
2671
|
+
} else if (is2D()) {
|
2672
|
+
int last1 = lastPolyVertex + 1;
|
2673
|
+
if (-1 < firstLineVertex) last1 = firstLineVertex;
|
2674
|
+
if (-1 < firstPointVertex) last1 = firstPointVertex;
|
2675
|
+
root.setModifiedPolyVertices(firstPolyVertex, last1 - 1);
|
2590
2676
|
}
|
2591
|
-
|
2592
|
-
|
2593
|
-
|
2594
|
-
|
2595
|
-
|
2596
|
-
|
2597
|
-
|
2598
|
-
|
2599
|
-
|
2600
|
-
return tessGeo.lineVertices;
|
2601
|
-
} else if (data == DIRECTION) {
|
2602
|
-
if (is2D()) {
|
2603
|
-
root.setModifiedLineAttributes(firstLineVertex, lastLineVertex);
|
2604
|
-
}
|
2605
|
-
return tessGeo.lineDirections;
|
2677
|
+
return tessGeo.polyVertices;
|
2678
|
+
} else if (data == NORMAL) {
|
2679
|
+
if (is3D()) {
|
2680
|
+
root.setModifiedPolyNormals(firstPolyVertex, lastPolyVertex);
|
2681
|
+
} else if (is2D()) {
|
2682
|
+
int last1 = lastPolyVertex + 1;
|
2683
|
+
if (-1 < firstLineVertex) last1 = firstLineVertex;
|
2684
|
+
if (-1 < firstPointVertex) last1 = firstPointVertex;
|
2685
|
+
root.setModifiedPolyNormals(firstPolyVertex, last1 - 1);
|
2606
2686
|
}
|
2607
|
-
|
2608
|
-
|
2609
|
-
if (
|
2610
|
-
|
2611
|
-
|
2612
|
-
|
2613
|
-
|
2614
|
-
|
2615
|
-
|
2616
|
-
} else if (data == OFFSET) {
|
2617
|
-
if (is2D()) {
|
2618
|
-
root.setModifiedPointAttributes(firstPointVertex, lastPointVertex);
|
2619
|
-
}
|
2620
|
-
return tessGeo.pointOffsets;
|
2687
|
+
return tessGeo.polyNormals;
|
2688
|
+
} else if (data == TEXCOORD) {
|
2689
|
+
if (is3D()) {
|
2690
|
+
root.setModifiedPolyTexCoords(firstPolyVertex, lastPolyVertex);
|
2691
|
+
} else if (is2D()) {
|
2692
|
+
int last1 = lastPolyVertex + 1;
|
2693
|
+
if (-1 < firstLineVertex) last1 = firstLineVertex;
|
2694
|
+
if (-1 < firstPointVertex) last1 = firstPointVertex;
|
2695
|
+
root.setModifiedPolyTexCoords(firstPolyVertex, last1 - 1);
|
2621
2696
|
}
|
2622
|
-
|
2623
|
-
|
2624
|
-
|
2697
|
+
return tessGeo.polyTexCoords;
|
2698
|
+
}
|
2699
|
+
} else if (kind == LINES) {
|
2700
|
+
if (data == POSITION) {
|
2701
|
+
if (is3D()) {
|
2702
|
+
root.setModifiedLineVertices(firstLineVertex, lastLineVertex);
|
2703
|
+
} else if (is2D()) {
|
2704
|
+
root.setModifiedPolyVertices(firstLineVertex, lastLineVertex);
|
2705
|
+
}
|
2706
|
+
return tessGeo.lineVertices;
|
2707
|
+
} else if (data == DIRECTION) {
|
2708
|
+
if (is2D()) {
|
2709
|
+
root.setModifiedLineAttributes(firstLineVertex, lastLineVertex);
|
2710
|
+
}
|
2711
|
+
return tessGeo.lineDirections;
|
2712
|
+
}
|
2713
|
+
} else if (kind == POINTS) {
|
2714
|
+
if (data == POSITION) {
|
2715
|
+
if (is3D()) {
|
2716
|
+
root.setModifiedPointVertices(firstPointVertex, lastPointVertex);
|
2717
|
+
} else if (is2D()) {
|
2718
|
+
root.setModifiedPolyVertices(firstPointVertex, lastPointVertex);
|
2719
|
+
}
|
2720
|
+
return tessGeo.pointVertices;
|
2721
|
+
} else if (data == OFFSET) {
|
2722
|
+
if (is2D()) {
|
2723
|
+
root.setModifiedPointAttributes(firstPointVertex, lastPointVertex);
|
2724
|
+
}
|
2725
|
+
return tessGeo.pointOffsets;
|
2726
|
+
}
|
2625
2727
|
}
|
2626
2728
|
return null;
|
2627
2729
|
}
|
2628
2730
|
|
2629
2731
|
///////////////////////////////////////////////////////////
|
2732
|
+
|
2630
2733
|
//
|
2734
|
+
|
2631
2735
|
// Geometry utils
|
2736
|
+
|
2632
2737
|
// http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
|
2633
2738
|
@Override
|
2634
2739
|
public boolean contains(float x, float y) {
|
2635
2740
|
if (family == PATH) {
|
2636
2741
|
boolean c = false;
|
2637
|
-
for (int i = 0, j = inGeo.vertexCount
|
2638
|
-
if (((inGeo.vertices[3 * i + 1] > y) != (inGeo.vertices[3 * j + 1] > y))
|
2639
|
-
|
2640
|
-
|
2641
|
-
|
2642
|
-
|
2643
|
-
|
2742
|
+
for (int i = 0, j = inGeo.vertexCount-1; i < inGeo.vertexCount; j = i++) {
|
2743
|
+
if (((inGeo.vertices[3 * i + 1] > y) != (inGeo.vertices[3 * j + 1] > y)) &&
|
2744
|
+
(x <
|
2745
|
+
(inGeo.vertices[3 * j]-inGeo.vertices[3 * i]) *
|
2746
|
+
(y-inGeo.vertices[3 * i + 1]) /
|
2747
|
+
(inGeo.vertices[3 * j + 1]-inGeo.vertices[3 * i + 1]) +
|
2748
|
+
inGeo.vertices[3 * i])) {
|
2644
2749
|
c = !c;
|
2645
2750
|
}
|
2646
2751
|
}
|
@@ -2650,9 +2755,14 @@ public class PShapeOpenGL extends PShape {
|
|
2650
2755
|
}
|
2651
2756
|
}
|
2652
2757
|
|
2758
|
+
|
2653
2759
|
///////////////////////////////////////////////////////////
|
2760
|
+
|
2654
2761
|
//
|
2762
|
+
|
2655
2763
|
// Tessellation
|
2764
|
+
|
2765
|
+
|
2656
2766
|
protected void updateTessellation() {
|
2657
2767
|
if (!root.tessellated) {
|
2658
2768
|
root.tessellate();
|
@@ -2662,11 +2772,13 @@ public class PShapeOpenGL extends PShape {
|
|
2662
2772
|
}
|
2663
2773
|
}
|
2664
2774
|
|
2775
|
+
|
2665
2776
|
protected void markForTessellation() {
|
2666
2777
|
root.tessellated = false;
|
2667
2778
|
tessellated = false;
|
2668
2779
|
}
|
2669
2780
|
|
2781
|
+
|
2670
2782
|
protected void initModified() {
|
2671
2783
|
modified = false;
|
2672
2784
|
|
@@ -2719,6 +2831,7 @@ public class PShapeOpenGL extends PShape {
|
|
2719
2831
|
lastModifiedPointAttribute = PConstants.MIN_INT;
|
2720
2832
|
}
|
2721
2833
|
|
2834
|
+
|
2722
2835
|
protected void tessellate() {
|
2723
2836
|
if (root == this && parent == null) { // Root shape
|
2724
2837
|
boolean initAttr = false;
|
@@ -2750,6 +2863,7 @@ public class PShapeOpenGL extends PShape {
|
|
2750
2863
|
}
|
2751
2864
|
}
|
2752
2865
|
|
2866
|
+
|
2753
2867
|
protected void collectPolyAttribs() {
|
2754
2868
|
AttributeMap rootAttribs = root.polyAttribs;
|
2755
2869
|
tessGeo = root.tessGeo;
|
@@ -2816,141 +2930,93 @@ public class PShapeOpenGL extends PShape {
|
|
2816
2930
|
tessellator.setTransform(matrix);
|
2817
2931
|
tessellator.set3D(is3D());
|
2818
2932
|
|
2819
|
-
|
2820
|
-
|
2821
|
-
|
2822
|
-
|
2823
|
-
|
2824
|
-
|
2825
|
-
|
2826
|
-
|
2827
|
-
|
2828
|
-
|
2829
|
-
|
2830
|
-
|
2831
|
-
|
2832
|
-
|
2833
|
-
|
2834
|
-
|
2835
|
-
|
2836
|
-
|
2837
|
-
|
2838
|
-
|
2839
|
-
|
2840
|
-
|
2841
|
-
|
2842
|
-
|
2843
|
-
|
2844
|
-
|
2845
|
-
|
2846
|
-
|
2847
|
-
|
2848
|
-
|
2849
|
-
|
2850
|
-
|
2851
|
-
|
2852
|
-
|
2853
|
-
|
2854
|
-
|
2855
|
-
|
2856
|
-
}
|
2857
|
-
if (normalMode == NORMAL_MODE_AUTO) {
|
2858
|
-
inGeo.calcTriangleStripNormals();
|
2859
|
-
}
|
2860
|
-
tessellator.tessellateTriangleStrip();
|
2861
|
-
break;
|
2862
|
-
case QUAD:
|
2863
|
-
case QUADS:
|
2864
|
-
if (stroke) {
|
2865
|
-
inGeo.addQuadsEdges();
|
2866
|
-
}
|
2867
|
-
if (normalMode == NORMAL_MODE_AUTO) {
|
2868
|
-
inGeo.calcQuadsNormals();
|
2869
|
-
}
|
2870
|
-
tessellator.tessellateQuads();
|
2871
|
-
break;
|
2872
|
-
case QUAD_STRIP:
|
2873
|
-
if (stroke) {
|
2874
|
-
inGeo.addQuadStripEdges();
|
2875
|
-
}
|
2876
|
-
if (normalMode == NORMAL_MODE_AUTO) {
|
2877
|
-
inGeo.calcQuadStripNormals();
|
2878
|
-
}
|
2879
|
-
tessellator.tessellateQuadStrip();
|
2880
|
-
break;
|
2881
|
-
case POLYGON:
|
2882
|
-
boolean bez = inGeo.hasBezierVertex();
|
2883
|
-
boolean quad = inGeo.hasQuadraticVertex();
|
2884
|
-
boolean curv = inGeo.hasCurveVertex();
|
2885
|
-
if (bez || quad) {
|
2886
|
-
saveBezierVertexSettings();
|
2887
|
-
}
|
2888
|
-
if (curv) {
|
2889
|
-
saveCurveVertexSettings();
|
2890
|
-
tessellator.resetCurveVertexCount();
|
2891
|
-
}
|
2892
|
-
tessellator.tessellatePolygon(solid, close,
|
2893
|
-
normalMode == NORMAL_MODE_AUTO);
|
2894
|
-
if (bez || quad) {
|
2895
|
-
restoreBezierVertexSettings();
|
2896
|
-
}
|
2897
|
-
if (curv) {
|
2898
|
-
restoreCurveVertexSettings();
|
2899
|
-
}
|
2900
|
-
break;
|
2901
|
-
default:
|
2902
|
-
break;
|
2933
|
+
if (family == GEOMETRY) {
|
2934
|
+
if (kind == POINTS) {
|
2935
|
+
tessellator.tessellatePoints();
|
2936
|
+
} else if (kind == LINES) {
|
2937
|
+
tessellator.tessellateLines();
|
2938
|
+
} else if (kind == LINE_STRIP) {
|
2939
|
+
tessellator.tessellateLineStrip();
|
2940
|
+
} else if (kind == LINE_LOOP) {
|
2941
|
+
tessellator.tessellateLineLoop();
|
2942
|
+
} else if (kind == TRIANGLE || kind == TRIANGLES) {
|
2943
|
+
if (stroke) inGeo.addTrianglesEdges();
|
2944
|
+
if (normalMode == NORMAL_MODE_AUTO) inGeo.calcTrianglesNormals();
|
2945
|
+
tessellator.tessellateTriangles();
|
2946
|
+
} else if (kind == TRIANGLE_FAN) {
|
2947
|
+
if (stroke) inGeo.addTriangleFanEdges();
|
2948
|
+
if (normalMode == NORMAL_MODE_AUTO) inGeo.calcTriangleFanNormals();
|
2949
|
+
tessellator.tessellateTriangleFan();
|
2950
|
+
} else if (kind == TRIANGLE_STRIP) {
|
2951
|
+
if (stroke) inGeo.addTriangleStripEdges();
|
2952
|
+
if (normalMode == NORMAL_MODE_AUTO) inGeo.calcTriangleStripNormals();
|
2953
|
+
tessellator.tessellateTriangleStrip();
|
2954
|
+
} else if (kind == QUAD || kind == QUADS) {
|
2955
|
+
if (stroke) inGeo.addQuadsEdges();
|
2956
|
+
if (normalMode == NORMAL_MODE_AUTO) inGeo.calcQuadsNormals();
|
2957
|
+
tessellator.tessellateQuads();
|
2958
|
+
} else if (kind == QUAD_STRIP) {
|
2959
|
+
if (stroke) inGeo.addQuadStripEdges();
|
2960
|
+
if (normalMode == NORMAL_MODE_AUTO) inGeo.calcQuadStripNormals();
|
2961
|
+
tessellator.tessellateQuadStrip();
|
2962
|
+
} else if (kind == POLYGON) {
|
2963
|
+
boolean bez = inGeo.hasBezierVertex();
|
2964
|
+
boolean quad = inGeo.hasQuadraticVertex();
|
2965
|
+
boolean curv = inGeo.hasCurveVertex();
|
2966
|
+
if (bez || quad) saveBezierVertexSettings();
|
2967
|
+
if (curv) {
|
2968
|
+
saveCurveVertexSettings();
|
2969
|
+
tessellator.resetCurveVertexCount();
|
2903
2970
|
}
|
2904
|
-
|
2905
|
-
|
2906
|
-
|
2907
|
-
|
2908
|
-
|
2909
|
-
|
2910
|
-
|
2911
|
-
|
2912
|
-
|
2913
|
-
|
2914
|
-
|
2915
|
-
|
2916
|
-
|
2917
|
-
|
2918
|
-
|
2919
|
-
|
2920
|
-
|
2921
|
-
|
2922
|
-
|
2923
|
-
|
2924
|
-
|
2925
|
-
|
2926
|
-
|
2927
|
-
|
2928
|
-
|
2929
|
-
|
2930
|
-
|
2931
|
-
|
2932
|
-
|
2933
|
-
|
2934
|
-
|
2935
|
-
|
2936
|
-
|
2937
|
-
|
2938
|
-
|
2939
|
-
|
2940
|
-
|
2941
|
-
|
2942
|
-
|
2943
|
-
|
2944
|
-
|
2945
|
-
|
2946
|
-
|
2947
|
-
|
2948
|
-
|
2949
|
-
break;
|
2971
|
+
tessellator.tessellatePolygon(solid, close,
|
2972
|
+
normalMode == NORMAL_MODE_AUTO);
|
2973
|
+
if (bez ||quad) restoreBezierVertexSettings();
|
2974
|
+
if (curv) restoreCurveVertexSettings();
|
2975
|
+
}
|
2976
|
+
} else if (family == PRIMITIVE) {
|
2977
|
+
// The input geometry needs to be cleared because the geometry
|
2978
|
+
// generation methods in InGeometry add the vertices of the
|
2979
|
+
// new primitive to what is already stored.
|
2980
|
+
inGeo.clear();
|
2981
|
+
|
2982
|
+
switch (kind) {
|
2983
|
+
case POINT:
|
2984
|
+
tessellatePoint();
|
2985
|
+
break;
|
2986
|
+
case LINE:
|
2987
|
+
tessellateLine();
|
2988
|
+
break;
|
2989
|
+
case TRIANGLE:
|
2990
|
+
tessellateTriangle();
|
2991
|
+
break;
|
2992
|
+
case QUAD:
|
2993
|
+
tessellateQuad();
|
2994
|
+
break;
|
2995
|
+
case RECT:
|
2996
|
+
tessellateRect();
|
2997
|
+
break;
|
2998
|
+
case ELLIPSE:
|
2999
|
+
tessellateEllipse();
|
3000
|
+
break;
|
3001
|
+
case ARC:
|
3002
|
+
tessellateArc();
|
3003
|
+
break;
|
3004
|
+
case BOX:
|
3005
|
+
tessellateBox();
|
3006
|
+
break;
|
3007
|
+
case SPHERE:
|
3008
|
+
tessellateSphere();
|
3009
|
+
break;
|
3010
|
+
default:
|
3011
|
+
break;
|
3012
|
+
}
|
3013
|
+
} else if (family == PATH) {
|
3014
|
+
inGeo.clear();
|
3015
|
+
tessellatePath();
|
2950
3016
|
}
|
2951
3017
|
|
2952
3018
|
if (image != null && parent != null) {
|
2953
|
-
((PShapeOpenGL)
|
3019
|
+
((PShapeOpenGL)parent).addTexture(image);
|
2954
3020
|
}
|
2955
3021
|
|
2956
3022
|
firstPolyIndexCache = tessellator.firstPolyIndexCache;
|
@@ -2969,6 +3035,7 @@ public class PShapeOpenGL extends PShape {
|
|
2969
3035
|
tessellated = true;
|
2970
3036
|
}
|
2971
3037
|
|
3038
|
+
|
2972
3039
|
protected void tessellatePoint() {
|
2973
3040
|
float x = 0, y = 0, z = 0;
|
2974
3041
|
if (params.length == 2) {
|
@@ -2982,12 +3049,13 @@ public class PShapeOpenGL extends PShape {
|
|
2982
3049
|
}
|
2983
3050
|
|
2984
3051
|
inGeo.setMaterial(fillColor, strokeColor, strokeWeight,
|
2985
|
-
|
3052
|
+
ambientColor, specularColor, emissiveColor, shininess);
|
2986
3053
|
inGeo.setNormal(normalX, normalY, normalZ);
|
2987
3054
|
inGeo.addPoint(x, y, z, fill, stroke);
|
2988
3055
|
tessellator.tessellatePoints();
|
2989
3056
|
}
|
2990
3057
|
|
3058
|
+
|
2991
3059
|
protected void tessellateLine() {
|
2992
3060
|
float x1 = 0, y1 = 0, z1 = 0;
|
2993
3061
|
float x2 = 0, y2 = 0, z2 = 0;
|
@@ -3006,14 +3074,15 @@ public class PShapeOpenGL extends PShape {
|
|
3006
3074
|
}
|
3007
3075
|
|
3008
3076
|
inGeo.setMaterial(fillColor, strokeColor, strokeWeight,
|
3009
|
-
|
3077
|
+
ambientColor, specularColor, emissiveColor, shininess);
|
3010
3078
|
inGeo.setNormal(normalX, normalY, normalZ);
|
3011
3079
|
inGeo.addLine(x1, y1, z1,
|
3012
|
-
|
3013
|
-
|
3080
|
+
x2, y2, z2,
|
3081
|
+
fill, stroke);
|
3014
3082
|
tessellator.tessellateLines();
|
3015
3083
|
}
|
3016
3084
|
|
3085
|
+
|
3017
3086
|
protected void tessellateTriangle() {
|
3018
3087
|
float x1 = 0, y1 = 0;
|
3019
3088
|
float x2 = 0, y2 = 0;
|
@@ -3028,15 +3097,16 @@ public class PShapeOpenGL extends PShape {
|
|
3028
3097
|
}
|
3029
3098
|
|
3030
3099
|
inGeo.setMaterial(fillColor, strokeColor, strokeWeight,
|
3031
|
-
|
3100
|
+
ambientColor, specularColor, emissiveColor, shininess);
|
3032
3101
|
inGeo.setNormal(normalX, normalY, normalZ);
|
3033
3102
|
inGeo.addTriangle(x1, y1, 0,
|
3034
|
-
|
3035
|
-
|
3036
|
-
|
3103
|
+
x2, y2, 0,
|
3104
|
+
x3, y3, 0,
|
3105
|
+
fill, stroke);
|
3037
3106
|
tessellator.tessellateTriangles();
|
3038
3107
|
}
|
3039
3108
|
|
3109
|
+
|
3040
3110
|
protected void tessellateQuad() {
|
3041
3111
|
float x1 = 0, y1 = 0;
|
3042
3112
|
float x2 = 0, y2 = 0;
|
@@ -3054,16 +3124,17 @@ public class PShapeOpenGL extends PShape {
|
|
3054
3124
|
}
|
3055
3125
|
|
3056
3126
|
inGeo.setMaterial(fillColor, strokeColor, strokeWeight,
|
3057
|
-
|
3127
|
+
ambientColor, specularColor, emissiveColor, shininess);
|
3058
3128
|
inGeo.setNormal(normalX, normalY, normalZ);
|
3059
3129
|
inGeo.addQuad(x1, y1, 0,
|
3060
|
-
|
3061
|
-
|
3062
|
-
|
3063
|
-
|
3130
|
+
x2, y2, 0,
|
3131
|
+
x3, y3, 0,
|
3132
|
+
x4, y4, 0,
|
3133
|
+
stroke);
|
3064
3134
|
tessellator.tessellateQuads();
|
3065
3135
|
}
|
3066
3136
|
|
3137
|
+
|
3067
3138
|
protected void tessellateRect() {
|
3068
3139
|
float a = 0, b = 0, c = 0, d = 0;
|
3069
3140
|
float tl = 0, tr = 0, br = 0, bl = 0;
|
@@ -3097,57 +3168,44 @@ public class PShapeOpenGL extends PShape {
|
|
3097
3168
|
|
3098
3169
|
float hradius, vradius;
|
3099
3170
|
switch (mode) {
|
3100
|
-
|
3101
|
-
|
3102
|
-
|
3103
|
-
|
3104
|
-
|
3105
|
-
|
3106
|
-
|
3107
|
-
|
3108
|
-
|
3109
|
-
|
3110
|
-
|
3111
|
-
|
3112
|
-
|
3113
|
-
|
3114
|
-
|
3115
|
-
|
3116
|
-
|
3117
|
-
|
3118
|
-
|
3119
|
-
|
3120
|
-
b -= vradius;
|
3171
|
+
case CORNERS:
|
3172
|
+
break;
|
3173
|
+
case CORNER:
|
3174
|
+
c += a; d += b;
|
3175
|
+
break;
|
3176
|
+
case RADIUS:
|
3177
|
+
hradius = c;
|
3178
|
+
vradius = d;
|
3179
|
+
c = a + hradius;
|
3180
|
+
d = b + vradius;
|
3181
|
+
a -= hradius;
|
3182
|
+
b -= vradius;
|
3183
|
+
break;
|
3184
|
+
case CENTER:
|
3185
|
+
hradius = c / 2.0f;
|
3186
|
+
vradius = d / 2.0f;
|
3187
|
+
c = a + hradius;
|
3188
|
+
d = b + vradius;
|
3189
|
+
a -= hradius;
|
3190
|
+
b -= vradius;
|
3121
3191
|
}
|
3122
3192
|
|
3123
3193
|
if (a > c) {
|
3124
|
-
float temp = a;
|
3125
|
-
a = c;
|
3126
|
-
c = temp;
|
3194
|
+
float temp = a; a = c; c = temp;
|
3127
3195
|
}
|
3128
3196
|
|
3129
3197
|
if (b > d) {
|
3130
|
-
float temp = b;
|
3131
|
-
b = d;
|
3132
|
-
d = temp;
|
3198
|
+
float temp = b; b = d; d = temp;
|
3133
3199
|
}
|
3134
3200
|
|
3135
3201
|
float maxRounding = PApplet.min((c - a) / 2, (d - b) / 2);
|
3136
|
-
if (tl > maxRounding)
|
3137
|
-
|
3138
|
-
|
3139
|
-
if (
|
3140
|
-
tr = maxRounding;
|
3141
|
-
}
|
3142
|
-
if (br > maxRounding) {
|
3143
|
-
br = maxRounding;
|
3144
|
-
}
|
3145
|
-
if (bl > maxRounding) {
|
3146
|
-
bl = maxRounding;
|
3147
|
-
}
|
3202
|
+
if (tl > maxRounding) tl = maxRounding;
|
3203
|
+
if (tr > maxRounding) tr = maxRounding;
|
3204
|
+
if (br > maxRounding) br = maxRounding;
|
3205
|
+
if (bl > maxRounding) bl = maxRounding;
|
3148
3206
|
|
3149
3207
|
inGeo.setMaterial(fillColor, strokeColor, strokeWeight,
|
3150
|
-
|
3208
|
+
ambientColor, specularColor, emissiveColor, shininess);
|
3151
3209
|
inGeo.setNormal(normalX, normalY, normalZ);
|
3152
3210
|
if (rounded) {
|
3153
3211
|
saveBezierVertexSettings();
|
@@ -3160,6 +3218,7 @@ public class PShapeOpenGL extends PShape {
|
|
3160
3218
|
}
|
3161
3219
|
}
|
3162
3220
|
|
3221
|
+
|
3163
3222
|
protected void tessellateEllipse() {
|
3164
3223
|
float a = 0, b = 0, c = 0, d = 0;
|
3165
3224
|
int mode = ellipseMode;
|
@@ -3176,19 +3235,23 @@ public class PShapeOpenGL extends PShape {
|
|
3176
3235
|
float w = c;
|
3177
3236
|
float h = d;
|
3178
3237
|
|
3179
|
-
|
3180
|
-
|
3181
|
-
|
3182
|
-
|
3183
|
-
|
3184
|
-
|
3185
|
-
|
3186
|
-
|
3187
|
-
|
3188
|
-
|
3189
|
-
|
3190
|
-
|
3191
|
-
|
3238
|
+
switch (mode) {
|
3239
|
+
case CORNERS:
|
3240
|
+
w = c - a;
|
3241
|
+
h = d - b;
|
3242
|
+
break;
|
3243
|
+
case RADIUS:
|
3244
|
+
x = a - c;
|
3245
|
+
y = b - d;
|
3246
|
+
w = c * 2;
|
3247
|
+
h = d * 2;
|
3248
|
+
break;
|
3249
|
+
case DIAMETER:
|
3250
|
+
x = a - c/2f;
|
3251
|
+
y = b - d/2f;
|
3252
|
+
break;
|
3253
|
+
default:
|
3254
|
+
break;
|
3192
3255
|
}
|
3193
3256
|
|
3194
3257
|
if (w < 0) { // undo negative width
|
@@ -3202,12 +3265,13 @@ public class PShapeOpenGL extends PShape {
|
|
3202
3265
|
}
|
3203
3266
|
|
3204
3267
|
inGeo.setMaterial(fillColor, strokeColor, strokeWeight,
|
3205
|
-
|
3268
|
+
ambientColor, specularColor, emissiveColor, shininess);
|
3206
3269
|
inGeo.setNormal(normalX, normalY, normalZ);
|
3207
3270
|
inGeo.addEllipse(x, y, w, h, fill, stroke);
|
3208
3271
|
tessellator.tessellateTriangleFan();
|
3209
3272
|
}
|
3210
3273
|
|
3274
|
+
|
3211
3275
|
protected void tessellateArc() {
|
3212
3276
|
float a = 0, b = 0, c = 0, d = 0;
|
3213
3277
|
float start = 0, stop = 0;
|
@@ -3222,7 +3286,7 @@ public class PShapeOpenGL extends PShape {
|
|
3222
3286
|
start = params[4];
|
3223
3287
|
stop = params[5];
|
3224
3288
|
if (params.length == 7) {
|
3225
|
-
arcMode = (int)
|
3289
|
+
arcMode = (int)(params[6]);
|
3226
3290
|
}
|
3227
3291
|
}
|
3228
3292
|
|
@@ -3231,23 +3295,19 @@ public class PShapeOpenGL extends PShape {
|
|
3231
3295
|
float w = c;
|
3232
3296
|
float h = d;
|
3233
3297
|
|
3234
|
-
|
3235
|
-
|
3236
|
-
|
3237
|
-
|
3238
|
-
|
3239
|
-
|
3240
|
-
|
3241
|
-
|
3242
|
-
|
3243
|
-
|
3244
|
-
|
3245
|
-
|
3246
|
-
|
3247
|
-
y = b - d / 2f;
|
3248
|
-
break;
|
3249
|
-
default:
|
3250
|
-
break;
|
3298
|
+
if (mode == CORNERS) {
|
3299
|
+
w = c - a;
|
3300
|
+
h = d - b;
|
3301
|
+
|
3302
|
+
} else if (mode == RADIUS) {
|
3303
|
+
x = a - c;
|
3304
|
+
y = b - d;
|
3305
|
+
w = c * 2;
|
3306
|
+
h = d * 2;
|
3307
|
+
|
3308
|
+
} else if (mode == CENTER) {
|
3309
|
+
x = a - c/2f;
|
3310
|
+
y = b - d/2f;
|
3251
3311
|
}
|
3252
3312
|
|
3253
3313
|
// make sure the loop will exit before starting while
|
@@ -3265,7 +3325,7 @@ public class PShapeOpenGL extends PShape {
|
|
3265
3325
|
stop = start + TWO_PI;
|
3266
3326
|
}
|
3267
3327
|
inGeo.setMaterial(fillColor, strokeColor, strokeWeight,
|
3268
|
-
|
3328
|
+
ambientColor, specularColor, emissiveColor, shininess);
|
3269
3329
|
inGeo.setNormal(normalX, normalY, normalZ);
|
3270
3330
|
inGeo.addArc(x, y, w, h, start, stop, fill, stroke, arcMode);
|
3271
3331
|
tessellator.tessellateTriangleFan();
|
@@ -3273,6 +3333,7 @@ public class PShapeOpenGL extends PShape {
|
|
3273
3333
|
}
|
3274
3334
|
}
|
3275
3335
|
|
3336
|
+
|
3276
3337
|
protected void tessellateBox() {
|
3277
3338
|
float w = 0, h = 0, d = 0;
|
3278
3339
|
if (params.length == 1) {
|
@@ -3284,11 +3345,12 @@ public class PShapeOpenGL extends PShape {
|
|
3284
3345
|
}
|
3285
3346
|
|
3286
3347
|
inGeo.setMaterial(fillColor, strokeColor, strokeWeight,
|
3287
|
-
|
3348
|
+
ambientColor, specularColor, emissiveColor, shininess);
|
3288
3349
|
inGeo.addBox(w, h, d, fill, stroke);
|
3289
3350
|
tessellator.tessellateQuads();
|
3290
3351
|
}
|
3291
3352
|
|
3353
|
+
|
3292
3354
|
protected void tessellateSphere() {
|
3293
3355
|
float r = 0;
|
3294
3356
|
int nu = sphereDetailU;
|
@@ -3296,10 +3358,10 @@ public class PShapeOpenGL extends PShape {
|
|
3296
3358
|
if (1 <= params.length) {
|
3297
3359
|
r = params[0];
|
3298
3360
|
if (params.length == 2) {
|
3299
|
-
nu = nv = (int)
|
3361
|
+
nu = nv = (int)params[1];
|
3300
3362
|
} else if (params.length == 3) {
|
3301
|
-
nu = (int)
|
3302
|
-
nv = (int)
|
3363
|
+
nu = (int)params[1];
|
3364
|
+
nv = (int)params[2];
|
3303
3365
|
}
|
3304
3366
|
}
|
3305
3367
|
|
@@ -3313,23 +3375,22 @@ public class PShapeOpenGL extends PShape {
|
|
3313
3375
|
}
|
3314
3376
|
|
3315
3377
|
inGeo.setMaterial(fillColor, strokeColor, strokeWeight,
|
3316
|
-
|
3378
|
+
ambientColor, specularColor, emissiveColor, shininess);
|
3317
3379
|
int[] indices = inGeo.addSphere(r, nu, nv, fill, stroke);
|
3318
3380
|
tessellator.tessellateTriangles(indices);
|
3319
3381
|
|
3320
|
-
if ((0 < savedDetailU && savedDetailU != nu)
|
3321
|
-
|
3382
|
+
if ((0 < savedDetailU && savedDetailU != nu) ||
|
3383
|
+
(0 < savedDetailV && savedDetailV != nv)) {
|
3322
3384
|
pg.sphereDetail(savedDetailU, savedDetailV);
|
3323
3385
|
}
|
3324
3386
|
}
|
3325
3387
|
|
3388
|
+
|
3326
3389
|
protected void tessellatePath() {
|
3327
|
-
if (vertices == null)
|
3328
|
-
return;
|
3329
|
-
}
|
3390
|
+
if (vertices == null) return;
|
3330
3391
|
|
3331
3392
|
inGeo.setMaterial(fillColor, strokeColor, strokeWeight,
|
3332
|
-
|
3393
|
+
ambientColor, specularColor, emissiveColor, shininess);
|
3333
3394
|
|
3334
3395
|
if (vertexCodeCount == 0) { // each point is a simple vertex
|
3335
3396
|
if (vertices[0].length == 2) { // tessellating 2D vertices
|
@@ -3339,7 +3400,7 @@ public class PShapeOpenGL extends PShape {
|
|
3339
3400
|
} else { // drawing 3D vertices
|
3340
3401
|
for (int i = 0; i < vertexCount; i++) {
|
3341
3402
|
inGeo.addVertex(vertices[i][X], vertices[i][Y], vertices[i][Z],
|
3342
|
-
|
3403
|
+
VERTEX, false);
|
3343
3404
|
}
|
3344
3405
|
}
|
3345
3406
|
} else { // coded set of vertices
|
@@ -3351,88 +3412,88 @@ public class PShapeOpenGL extends PShape {
|
|
3351
3412
|
for (int j = 0; j < vertexCodeCount; j++) {
|
3352
3413
|
switch (vertexCodes[j]) {
|
3353
3414
|
|
3354
|
-
|
3355
|
-
|
3356
|
-
|
3357
|
-
|
3358
|
-
|
3415
|
+
case VERTEX:
|
3416
|
+
inGeo.addVertex(vertices[idx][X], vertices[idx][Y], VERTEX, brk);
|
3417
|
+
brk = false;
|
3418
|
+
idx++;
|
3419
|
+
break;
|
3359
3420
|
|
3360
|
-
|
3361
|
-
|
3362
|
-
|
3363
|
-
|
3364
|
-
|
3365
|
-
|
3366
|
-
|
3421
|
+
case QUADRATIC_VERTEX:
|
3422
|
+
inGeo.addQuadraticVertex(vertices[idx+0][X], vertices[idx+0][Y], 0,
|
3423
|
+
vertices[idx+1][X], vertices[idx+1][Y], 0,
|
3424
|
+
brk);
|
3425
|
+
brk = false;
|
3426
|
+
idx += 2;
|
3427
|
+
break;
|
3367
3428
|
|
3368
|
-
|
3369
|
-
|
3370
|
-
|
3371
|
-
|
3372
|
-
|
3373
|
-
|
3374
|
-
|
3375
|
-
|
3429
|
+
case BEZIER_VERTEX:
|
3430
|
+
inGeo.addBezierVertex(vertices[idx+0][X], vertices[idx+0][Y], 0,
|
3431
|
+
vertices[idx+1][X], vertices[idx+1][Y], 0,
|
3432
|
+
vertices[idx+2][X], vertices[idx+2][Y], 0,
|
3433
|
+
brk);
|
3434
|
+
brk = false;
|
3435
|
+
idx += 3;
|
3436
|
+
break;
|
3376
3437
|
|
3377
|
-
|
3378
|
-
|
3379
|
-
|
3380
|
-
|
3381
|
-
|
3438
|
+
case CURVE_VERTEX:
|
3439
|
+
inGeo.addCurveVertex(vertices[idx][X], vertices[idx][Y], 0, brk);
|
3440
|
+
brk = false;
|
3441
|
+
idx++;
|
3442
|
+
break;
|
3382
3443
|
|
3383
|
-
|
3384
|
-
|
3444
|
+
case BREAK:
|
3445
|
+
brk = true;
|
3385
3446
|
}
|
3386
3447
|
}
|
3387
3448
|
} else { // tessellating a 3D path
|
3388
3449
|
for (int j = 0; j < vertexCodeCount; j++) {
|
3389
3450
|
switch (vertexCodes[j]) {
|
3390
3451
|
|
3391
|
-
|
3392
|
-
|
3393
|
-
|
3394
|
-
|
3395
|
-
|
3396
|
-
|
3452
|
+
case VERTEX:
|
3453
|
+
inGeo.addVertex(vertices[idx][X], vertices[idx][Y],
|
3454
|
+
vertices[idx][Z], brk);
|
3455
|
+
brk = false;
|
3456
|
+
idx++;
|
3457
|
+
break;
|
3397
3458
|
|
3398
|
-
|
3399
|
-
|
3400
|
-
|
3401
|
-
|
3402
|
-
|
3403
|
-
|
3404
|
-
|
3405
|
-
|
3406
|
-
|
3407
|
-
|
3408
|
-
|
3459
|
+
case QUADRATIC_VERTEX:
|
3460
|
+
inGeo.addQuadraticVertex(vertices[idx+0][X],
|
3461
|
+
vertices[idx+0][Y],
|
3462
|
+
vertices[idx+0][Z],
|
3463
|
+
vertices[idx+1][X],
|
3464
|
+
vertices[idx+1][Y],
|
3465
|
+
vertices[idx+0][Z],
|
3466
|
+
brk);
|
3467
|
+
brk = false;
|
3468
|
+
idx += 2;
|
3469
|
+
break;
|
3409
3470
|
|
3410
|
-
|
3411
|
-
|
3412
|
-
|
3413
|
-
|
3414
|
-
|
3415
|
-
|
3416
|
-
|
3417
|
-
|
3418
|
-
|
3419
|
-
|
3420
|
-
|
3421
|
-
|
3422
|
-
|
3423
|
-
|
3471
|
+
case BEZIER_VERTEX:
|
3472
|
+
inGeo.addBezierVertex(vertices[idx+0][X],
|
3473
|
+
vertices[idx+0][Y],
|
3474
|
+
vertices[idx+0][Z],
|
3475
|
+
vertices[idx+1][X],
|
3476
|
+
vertices[idx+1][Y],
|
3477
|
+
vertices[idx+1][Z],
|
3478
|
+
vertices[idx+2][X],
|
3479
|
+
vertices[idx+2][Y],
|
3480
|
+
vertices[idx+2][Z],
|
3481
|
+
brk);
|
3482
|
+
brk = false;
|
3483
|
+
idx += 3;
|
3484
|
+
break;
|
3424
3485
|
|
3425
|
-
|
3426
|
-
|
3427
|
-
|
3428
|
-
|
3429
|
-
|
3430
|
-
|
3431
|
-
|
3432
|
-
|
3486
|
+
case CURVE_VERTEX:
|
3487
|
+
inGeo.addCurveVertex(vertices[idx][X],
|
3488
|
+
vertices[idx][Y],
|
3489
|
+
vertices[idx][Z],
|
3490
|
+
brk);
|
3491
|
+
brk = false;
|
3492
|
+
idx++;
|
3493
|
+
break;
|
3433
3494
|
|
3434
|
-
|
3435
|
-
|
3495
|
+
case BREAK:
|
3496
|
+
brk = true;
|
3436
3497
|
}
|
3437
3498
|
}
|
3438
3499
|
}
|
@@ -3441,20 +3502,14 @@ public class PShapeOpenGL extends PShape {
|
|
3441
3502
|
boolean bez = inGeo.hasBezierVertex();
|
3442
3503
|
boolean quad = inGeo.hasQuadraticVertex();
|
3443
3504
|
boolean curv = inGeo.hasCurveVertex();
|
3444
|
-
if (bez || quad)
|
3445
|
-
saveBezierVertexSettings();
|
3446
|
-
}
|
3505
|
+
if (bez || quad) saveBezierVertexSettings();
|
3447
3506
|
if (curv) {
|
3448
3507
|
saveCurveVertexSettings();
|
3449
3508
|
tessellator.resetCurveVertexCount();
|
3450
3509
|
}
|
3451
3510
|
tessellator.tessellatePolygon(true, close, true);
|
3452
|
-
if (bez || quad)
|
3453
|
-
|
3454
|
-
}
|
3455
|
-
if (curv) {
|
3456
|
-
restoreCurveVertexSettings();
|
3457
|
-
}
|
3511
|
+
if (bez || quad) restoreBezierVertexSettings();
|
3512
|
+
if (curv) restoreCurveVertexSettings();
|
3458
3513
|
}
|
3459
3514
|
|
3460
3515
|
protected void saveBezierVertexSettings() {
|
@@ -3491,8 +3546,12 @@ public class PShapeOpenGL extends PShape {
|
|
3491
3546
|
}
|
3492
3547
|
|
3493
3548
|
///////////////////////////////////////////////////////////
|
3549
|
+
|
3494
3550
|
//
|
3551
|
+
|
3495
3552
|
// Aggregation
|
3553
|
+
|
3554
|
+
|
3496
3555
|
protected void aggregate() {
|
3497
3556
|
if (root == this && parent == null) {
|
3498
3557
|
// Initializing auxiliary variables in root node
|
@@ -3517,6 +3576,7 @@ public class PShapeOpenGL extends PShape {
|
|
3517
3576
|
}
|
3518
3577
|
}
|
3519
3578
|
|
3579
|
+
|
3520
3580
|
// This method is very important, as it is responsible of generating the
|
3521
3581
|
// correct vertex and index offsets for each level of the shape hierarchy.
|
3522
3582
|
// This is the core of the recursive algorithm that calculates the indices
|
@@ -3567,12 +3627,8 @@ public class PShapeOpenGL extends PShape {
|
|
3567
3627
|
updatePolyIndexCache();
|
3568
3628
|
}
|
3569
3629
|
if (is3D()) {
|
3570
|
-
if (hasLines)
|
3571
|
-
|
3572
|
-
}
|
3573
|
-
if (hasPoints) {
|
3574
|
-
updatePointIndexCache();
|
3575
|
-
}
|
3630
|
+
if (hasLines) updateLineIndexCache();
|
3631
|
+
if (hasPoints) updatePointIndexCache();
|
3576
3632
|
}
|
3577
3633
|
|
3578
3634
|
if (matrix != null) {
|
@@ -3580,21 +3636,22 @@ public class PShapeOpenGL extends PShape {
|
|
3580
3636
|
// this shape before tessellation, so they are applied now.
|
3581
3637
|
if (hasPolys) {
|
3582
3638
|
tessGeo.applyMatrixOnPolyGeometry(matrix,
|
3583
|
-
|
3639
|
+
firstPolyVertex, lastPolyVertex);
|
3584
3640
|
}
|
3585
3641
|
if (is3D()) {
|
3586
3642
|
if (hasLines) {
|
3587
3643
|
tessGeo.applyMatrixOnLineGeometry(matrix,
|
3588
|
-
|
3644
|
+
firstLineVertex, lastLineVertex);
|
3589
3645
|
}
|
3590
3646
|
if (hasPoints) {
|
3591
3647
|
tessGeo.applyMatrixOnPointGeometry(matrix,
|
3592
|
-
|
3648
|
+
firstPointVertex, lastPointVertex);
|
3593
3649
|
}
|
3594
3650
|
}
|
3595
3651
|
}
|
3596
3652
|
}
|
3597
3653
|
|
3654
|
+
|
3598
3655
|
// Updates the index cache for the range that corresponds to this shape.
|
3599
3656
|
protected void updatePolyIndexCache() {
|
3600
3657
|
IndexCache cache = tessGeo.polyIndexCache;
|
@@ -3610,6 +3667,7 @@ public class PShapeOpenGL extends PShape {
|
|
3610
3667
|
|
3611
3668
|
// The index ranges of the child shapes that share the vertex offset
|
3612
3669
|
// are unified into a single range in the parent level.
|
3670
|
+
|
3613
3671
|
firstPolyIndexCache = lastPolyIndexCache = -1;
|
3614
3672
|
int gindex = -1;
|
3615
3673
|
|
@@ -3630,7 +3688,7 @@ public class PShapeOpenGL extends PShape {
|
|
3630
3688
|
// This is a result of how the indices are updated for the
|
3631
3689
|
// leaf shapes.
|
3632
3690
|
cache.incCounts(gindex,
|
3633
|
-
|
3691
|
+
cache.indexCount[n], cache.vertexCount[n]);
|
3634
3692
|
} else {
|
3635
3693
|
gindex = cache.addNew(n);
|
3636
3694
|
}
|
@@ -3662,22 +3720,21 @@ public class PShapeOpenGL extends PShape {
|
|
3662
3720
|
// root shape. When this happens, the indices in the child shape need
|
3663
3721
|
// to be restarted as well to reflect the new index offset.
|
3664
3722
|
|
3665
|
-
firstPolyVertex = lastPolyVertex
|
3666
|
-
|
3723
|
+
firstPolyVertex = lastPolyVertex =
|
3724
|
+
cache.vertexOffset[firstPolyIndexCache];
|
3667
3725
|
for (int n = firstPolyIndexCache; n <= lastPolyIndexCache; n++) {
|
3668
3726
|
int ioffset = cache.indexOffset[n];
|
3669
3727
|
int icount = cache.indexCount[n];
|
3670
3728
|
int vcount = cache.vertexCount[n];
|
3671
3729
|
|
3672
|
-
if (PGL.MAX_VERTEX_INDEX1 <= root.polyVertexRel + vcount
|
3673
|
-
|
3674
|
-
(is2D() && startStrokedTex(n))) { // ... or, in 2D, the beginning of line or points.
|
3730
|
+
if (PGL.MAX_VERTEX_INDEX1 <= root.polyVertexRel + vcount || // Too many vertices already signal the start of a new cache...
|
3731
|
+
(is2D() && startStrokedTex(n))) { // ... or, in 2D, the beginning of line or points.
|
3675
3732
|
root.polyVertexRel = 0;
|
3676
3733
|
root.polyVertexOffset = root.polyVertexAbs;
|
3677
3734
|
cache.indexOffset[n] = root.polyIndexOffset;
|
3678
3735
|
} else {
|
3679
3736
|
tessGeo.incPolyIndices(ioffset, ioffset + icount - 1,
|
3680
|
-
|
3737
|
+
root.polyVertexRel);
|
3681
3738
|
}
|
3682
3739
|
cache.vertexOffset[n] = root.polyVertexOffset;
|
3683
3740
|
if (is2D()) {
|
@@ -3696,11 +3753,13 @@ public class PShapeOpenGL extends PShape {
|
|
3696
3753
|
}
|
3697
3754
|
}
|
3698
3755
|
|
3756
|
+
|
3699
3757
|
protected boolean startStrokedTex(int n) {
|
3700
|
-
return image != null && (n == firstLineIndexCache
|
3701
|
-
|
3758
|
+
return image != null && (n == firstLineIndexCache ||
|
3759
|
+
n == firstPointIndexCache);
|
3702
3760
|
}
|
3703
3761
|
|
3762
|
+
|
3704
3763
|
protected void setFirstStrokeVertex(int n, int vert) {
|
3705
3764
|
if (n == firstLineIndexCache && firstLineVertex == -1) {
|
3706
3765
|
firstLineVertex = lastLineVertex = vert;
|
@@ -3737,7 +3796,7 @@ public class PShapeOpenGL extends PShape {
|
|
3737
3796
|
} else {
|
3738
3797
|
if (cache.vertexOffset[gindex] == cache.vertexOffset[n]) {
|
3739
3798
|
cache.incCounts(gindex, cache.indexCount[n],
|
3740
|
-
|
3799
|
+
cache.vertexCount[n]);
|
3741
3800
|
} else {
|
3742
3801
|
gindex = cache.addNew(n);
|
3743
3802
|
}
|
@@ -3746,9 +3805,7 @@ public class PShapeOpenGL extends PShape {
|
|
3746
3805
|
|
3747
3806
|
// Updating the first and last line vertices for this group shape.
|
3748
3807
|
if (-1 < child.firstLineVertex) {
|
3749
|
-
if (firstLineVertex == -1)
|
3750
|
-
firstLineVertex = Integer.MAX_VALUE;
|
3751
|
-
}
|
3808
|
+
if (firstLineVertex == -1) firstLineVertex = Integer.MAX_VALUE;
|
3752
3809
|
firstLineVertex = PApplet.min(firstLineVertex, child.firstLineVertex);
|
3753
3810
|
}
|
3754
3811
|
if (-1 < child.lastLineVertex) {
|
@@ -3757,8 +3814,8 @@ public class PShapeOpenGL extends PShape {
|
|
3757
3814
|
}
|
3758
3815
|
lastLineIndexCache = gindex;
|
3759
3816
|
} else {
|
3760
|
-
firstLineVertex = lastLineVertex
|
3761
|
-
|
3817
|
+
firstLineVertex = lastLineVertex =
|
3818
|
+
cache.vertexOffset[firstLineIndexCache];
|
3762
3819
|
for (int n = firstLineIndexCache; n <= lastLineIndexCache; n++) {
|
3763
3820
|
int ioffset = cache.indexOffset[n];
|
3764
3821
|
int icount = cache.indexCount[n];
|
@@ -3770,7 +3827,7 @@ public class PShapeOpenGL extends PShape {
|
|
3770
3827
|
cache.indexOffset[n] = root.lineIndexOffset;
|
3771
3828
|
} else {
|
3772
3829
|
tessGeo.incLineIndices(ioffset, ioffset + icount - 1,
|
3773
|
-
|
3830
|
+
root.lineVertexRel);
|
3774
3831
|
}
|
3775
3832
|
cache.vertexOffset[n] = root.lineVertexOffset;
|
3776
3833
|
|
@@ -3783,6 +3840,7 @@ public class PShapeOpenGL extends PShape {
|
|
3783
3840
|
}
|
3784
3841
|
}
|
3785
3842
|
|
3843
|
+
|
3786
3844
|
protected void updatePointIndexCache() {
|
3787
3845
|
IndexCache cache = tessGeo.pointIndexCache;
|
3788
3846
|
if (family == GROUP) {
|
@@ -3806,7 +3864,7 @@ public class PShapeOpenGL extends PShape {
|
|
3806
3864
|
// This is a result of how the indices are updated for the
|
3807
3865
|
// leaf shapes in aggregateImpl().
|
3808
3866
|
cache.incCounts(gindex, cache.indexCount[n],
|
3809
|
-
|
3867
|
+
cache.vertexCount[n]);
|
3810
3868
|
} else {
|
3811
3869
|
gindex = cache.addNew(n);
|
3812
3870
|
}
|
@@ -3815,11 +3873,9 @@ public class PShapeOpenGL extends PShape {
|
|
3815
3873
|
|
3816
3874
|
// Updating the first and last point vertices for this group shape.
|
3817
3875
|
if (-1 < child.firstPointVertex) {
|
3818
|
-
if (firstPointVertex == -1)
|
3819
|
-
firstPointVertex = Integer.MAX_VALUE;
|
3820
|
-
}
|
3876
|
+
if (firstPointVertex == -1) firstPointVertex = Integer.MAX_VALUE;
|
3821
3877
|
firstPointVertex = PApplet.min(firstPointVertex,
|
3822
|
-
|
3878
|
+
child.firstPointVertex);
|
3823
3879
|
}
|
3824
3880
|
if (-1 < child.lastPointVertex) {
|
3825
3881
|
lastPointVertex = PApplet.max(lastPointVertex, child.lastPointVertex);
|
@@ -3827,8 +3883,8 @@ public class PShapeOpenGL extends PShape {
|
|
3827
3883
|
}
|
3828
3884
|
lastPointIndexCache = gindex;
|
3829
3885
|
} else {
|
3830
|
-
firstPointVertex = lastPointVertex
|
3831
|
-
|
3886
|
+
firstPointVertex = lastPointVertex =
|
3887
|
+
cache.vertexOffset[firstPointIndexCache];
|
3832
3888
|
for (int n = firstPointIndexCache; n <= lastPointIndexCache; n++) {
|
3833
3889
|
int ioffset = cache.indexOffset[n];
|
3834
3890
|
int icount = cache.indexCount[n];
|
@@ -3840,7 +3896,7 @@ public class PShapeOpenGL extends PShape {
|
|
3840
3896
|
cache.indexOffset[n] = root.pointIndexOffset;
|
3841
3897
|
} else {
|
3842
3898
|
tessGeo.incPointIndices(ioffset, ioffset + icount - 1,
|
3843
|
-
|
3899
|
+
root.pointVertexRel);
|
3844
3900
|
}
|
3845
3901
|
cache.vertexOffset[n] = root.pointVertexOffset;
|
3846
3902
|
|
@@ -3853,9 +3909,14 @@ public class PShapeOpenGL extends PShape {
|
|
3853
3909
|
}
|
3854
3910
|
}
|
3855
3911
|
|
3912
|
+
|
3856
3913
|
///////////////////////////////////////////////////////////
|
3914
|
+
|
3857
3915
|
//
|
3916
|
+
|
3858
3917
|
// Buffer initialization
|
3918
|
+
|
3919
|
+
|
3859
3920
|
protected void initBuffers() {
|
3860
3921
|
boolean outdated = contextIsOutdated();
|
3861
3922
|
context = pgl.getCurrentContext();
|
@@ -3875,186 +3936,171 @@ public class PShapeOpenGL extends PShape {
|
|
3875
3936
|
needBufferInit = false;
|
3876
3937
|
}
|
3877
3938
|
|
3939
|
+
|
3878
3940
|
protected void initPolyBuffers() {
|
3879
3941
|
int size = tessGeo.polyVertexCount;
|
3880
3942
|
int sizef = size * PGL.SIZEOF_FLOAT;
|
3881
3943
|
int sizei = size * PGL.SIZEOF_INT;
|
3882
3944
|
|
3883
3945
|
tessGeo.updatePolyVerticesBuffer();
|
3884
|
-
if (bufPolyVertex == null)
|
3946
|
+
if (bufPolyVertex == null)
|
3885
3947
|
bufPolyVertex = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 4, PGL.SIZEOF_FLOAT);
|
3886
|
-
}
|
3887
3948
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyVertex.glId);
|
3888
3949
|
pgl.bufferData(PGL.ARRAY_BUFFER, 4 * sizef,
|
3889
|
-
|
3950
|
+
tessGeo.polyVerticesBuffer, glUsage);
|
3890
3951
|
|
3891
3952
|
tessGeo.updatePolyColorsBuffer();
|
3892
|
-
if (bufPolyColor == null)
|
3953
|
+
if (bufPolyColor == null)
|
3893
3954
|
bufPolyColor = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 1, PGL.SIZEOF_INT);
|
3894
|
-
}
|
3895
3955
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyColor.glId);
|
3896
3956
|
pgl.bufferData(PGL.ARRAY_BUFFER, sizei,
|
3897
|
-
|
3957
|
+
tessGeo.polyColorsBuffer, glUsage);
|
3898
3958
|
|
3899
3959
|
tessGeo.updatePolyNormalsBuffer();
|
3900
|
-
if (bufPolyNormal == null)
|
3960
|
+
if (bufPolyNormal == null)
|
3901
3961
|
bufPolyNormal = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 3, PGL.SIZEOF_FLOAT);
|
3902
|
-
}
|
3903
3962
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyNormal.glId);
|
3904
3963
|
pgl.bufferData(PGL.ARRAY_BUFFER, 3 * sizef,
|
3905
|
-
|
3964
|
+
tessGeo.polyNormalsBuffer, glUsage);
|
3906
3965
|
|
3907
3966
|
tessGeo.updatePolyTexCoordsBuffer();
|
3908
|
-
if (bufPolyTexcoord == null)
|
3967
|
+
if (bufPolyTexcoord == null)
|
3909
3968
|
bufPolyTexcoord = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 2, PGL.SIZEOF_FLOAT);
|
3910
|
-
}
|
3911
3969
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyTexcoord.glId);
|
3912
3970
|
pgl.bufferData(PGL.ARRAY_BUFFER, 2 * sizef,
|
3913
|
-
|
3971
|
+
tessGeo.polyTexCoordsBuffer, glUsage);
|
3914
3972
|
|
3915
3973
|
tessGeo.updatePolyAmbientBuffer();
|
3916
|
-
if (bufPolyAmbient == null)
|
3974
|
+
if (bufPolyAmbient == null)
|
3917
3975
|
bufPolyAmbient = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 1, PGL.SIZEOF_INT);
|
3918
|
-
}
|
3919
3976
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyAmbient.glId);
|
3920
3977
|
pgl.bufferData(PGL.ARRAY_BUFFER, sizei,
|
3921
|
-
|
3978
|
+
tessGeo.polyAmbientBuffer, glUsage);
|
3922
3979
|
|
3923
3980
|
tessGeo.updatePolySpecularBuffer();
|
3924
|
-
if (bufPolySpecular == null)
|
3981
|
+
if (bufPolySpecular == null)
|
3925
3982
|
bufPolySpecular = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 1, PGL.SIZEOF_INT);
|
3926
|
-
}
|
3927
3983
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolySpecular.glId);
|
3928
3984
|
pgl.bufferData(PGL.ARRAY_BUFFER, sizei,
|
3929
|
-
|
3985
|
+
tessGeo.polySpecularBuffer, glUsage);
|
3930
3986
|
|
3931
3987
|
tessGeo.updatePolyEmissiveBuffer();
|
3932
|
-
if (bufPolyEmissive == null)
|
3988
|
+
if (bufPolyEmissive == null)
|
3933
3989
|
bufPolyEmissive = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 1, PGL.SIZEOF_INT);
|
3934
|
-
}
|
3935
3990
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyEmissive.glId);
|
3936
3991
|
pgl.bufferData(PGL.ARRAY_BUFFER, sizei,
|
3937
|
-
|
3992
|
+
tessGeo.polyEmissiveBuffer, glUsage);
|
3938
3993
|
|
3939
3994
|
tessGeo.updatePolyShininessBuffer();
|
3940
|
-
if (bufPolyShininess == null)
|
3995
|
+
if (bufPolyShininess == null)
|
3941
3996
|
bufPolyShininess = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 1, PGL.SIZEOF_FLOAT);
|
3942
|
-
}
|
3943
3997
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyShininess.glId);
|
3944
3998
|
pgl.bufferData(PGL.ARRAY_BUFFER, sizef,
|
3945
|
-
|
3999
|
+
tessGeo.polyShininessBuffer, glUsage);
|
3946
4000
|
|
3947
|
-
polyAttribs.keySet()
|
3948
|
-
VertexAttribute attrib = polyAttribs.get(
|
4001
|
+
for (String name: polyAttribs.keySet()) {
|
4002
|
+
VertexAttribute attrib = polyAttribs.get(name);
|
3949
4003
|
tessGeo.updateAttribBuffer(attrib.name);
|
3950
|
-
if (!attrib.bufferCreated())
|
3951
|
-
attrib.createBuffer(pgl);
|
3952
|
-
}
|
4004
|
+
if (!attrib.bufferCreated()) attrib.createBuffer(pgl);
|
3953
4005
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, attrib.buf.glId);
|
3954
4006
|
pgl.bufferData(PGL.ARRAY_BUFFER, attrib.sizeInBytes(size),
|
3955
|
-
|
3956
|
-
}
|
4007
|
+
tessGeo.polyAttribBuffers.get(name), glUsage);
|
4008
|
+
}
|
3957
4009
|
|
3958
4010
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
3959
4011
|
|
3960
4012
|
tessGeo.updatePolyIndicesBuffer();
|
3961
|
-
if (bufPolyIndex == null)
|
4013
|
+
if (bufPolyIndex == null)
|
3962
4014
|
bufPolyIndex = new VertexBuffer(pg, PGL.ELEMENT_ARRAY_BUFFER, 1, PGL.SIZEOF_INDEX, true);
|
3963
|
-
}
|
3964
4015
|
pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, bufPolyIndex.glId);
|
3965
4016
|
pgl.bufferData(PGL.ELEMENT_ARRAY_BUFFER,
|
3966
|
-
|
3967
|
-
|
4017
|
+
tessGeo.polyIndexCount * PGL.SIZEOF_INDEX,
|
4018
|
+
tessGeo.polyIndicesBuffer, glUsage);
|
3968
4019
|
|
3969
4020
|
pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, 0);
|
3970
4021
|
}
|
3971
4022
|
|
4023
|
+
|
3972
4024
|
protected void initLineBuffers() {
|
3973
4025
|
int size = tessGeo.lineVertexCount;
|
3974
4026
|
int sizef = size * PGL.SIZEOF_FLOAT;
|
3975
4027
|
int sizei = size * PGL.SIZEOF_INT;
|
3976
4028
|
|
3977
4029
|
tessGeo.updateLineVerticesBuffer();
|
3978
|
-
if (bufLineVertex == null)
|
4030
|
+
if (bufLineVertex == null)
|
3979
4031
|
bufLineVertex = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 4, PGL.SIZEOF_FLOAT);
|
3980
|
-
}
|
3981
4032
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufLineVertex.glId);
|
3982
4033
|
pgl.bufferData(PGL.ARRAY_BUFFER, 4 * sizef,
|
3983
|
-
|
4034
|
+
tessGeo.lineVerticesBuffer, glUsage);
|
3984
4035
|
|
3985
4036
|
tessGeo.updateLineColorsBuffer();
|
3986
|
-
if (bufLineColor == null)
|
4037
|
+
if (bufLineColor == null)
|
3987
4038
|
bufLineColor = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 1, PGL.SIZEOF_INT);
|
3988
|
-
}
|
3989
4039
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufLineColor.glId);
|
3990
4040
|
pgl.bufferData(PGL.ARRAY_BUFFER, sizei,
|
3991
|
-
|
4041
|
+
tessGeo.lineColorsBuffer, glUsage);
|
3992
4042
|
|
3993
4043
|
tessGeo.updateLineDirectionsBuffer();
|
3994
|
-
if (bufLineAttrib == null)
|
4044
|
+
if (bufLineAttrib == null)
|
3995
4045
|
bufLineAttrib = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 4, PGL.SIZEOF_FLOAT);
|
3996
|
-
}
|
3997
4046
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufLineAttrib.glId);
|
3998
4047
|
pgl.bufferData(PGL.ARRAY_BUFFER, 4 * sizef,
|
3999
|
-
|
4048
|
+
tessGeo.lineDirectionsBuffer, glUsage);
|
4000
4049
|
|
4001
4050
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4002
4051
|
|
4003
4052
|
tessGeo.updateLineIndicesBuffer();
|
4004
|
-
if (bufLineIndex == null)
|
4053
|
+
if (bufLineIndex == null)
|
4005
4054
|
bufLineIndex = new VertexBuffer(pg, PGL.ELEMENT_ARRAY_BUFFER, 1, PGL.SIZEOF_INDEX, true);
|
4006
|
-
}
|
4007
4055
|
pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, bufLineIndex.glId);
|
4008
4056
|
pgl.bufferData(PGL.ELEMENT_ARRAY_BUFFER,
|
4009
|
-
|
4010
|
-
|
4057
|
+
tessGeo.lineIndexCount * PGL.SIZEOF_INDEX,
|
4058
|
+
tessGeo.lineIndicesBuffer, glUsage);
|
4011
4059
|
|
4012
4060
|
pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, 0);
|
4013
4061
|
}
|
4014
4062
|
|
4063
|
+
|
4015
4064
|
protected void initPointBuffers() {
|
4016
4065
|
int size = tessGeo.pointVertexCount;
|
4017
4066
|
int sizef = size * PGL.SIZEOF_FLOAT;
|
4018
4067
|
int sizei = size * PGL.SIZEOF_INT;
|
4019
4068
|
|
4020
4069
|
tessGeo.updatePointVerticesBuffer();
|
4021
|
-
if (bufPointVertex == null)
|
4070
|
+
if (bufPointVertex == null)
|
4022
4071
|
bufPointVertex = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 4, PGL.SIZEOF_FLOAT);
|
4023
|
-
}
|
4024
4072
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPointVertex.glId);
|
4025
4073
|
pgl.bufferData(PGL.ARRAY_BUFFER, 4 * sizef,
|
4026
|
-
|
4074
|
+
tessGeo.pointVerticesBuffer, glUsage);
|
4027
4075
|
|
4028
4076
|
tessGeo.updatePointColorsBuffer();
|
4029
|
-
if (bufPointColor == null)
|
4077
|
+
if (bufPointColor == null)
|
4030
4078
|
bufPointColor = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 1, PGL.SIZEOF_INT);
|
4031
|
-
}
|
4032
4079
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPointColor.glId);
|
4033
4080
|
pgl.bufferData(PGL.ARRAY_BUFFER, sizei,
|
4034
|
-
|
4081
|
+
tessGeo.pointColorsBuffer, glUsage);
|
4035
4082
|
|
4036
4083
|
tessGeo.updatePointOffsetsBuffer();
|
4037
|
-
if (bufPointAttrib == null)
|
4084
|
+
if (bufPointAttrib == null)
|
4038
4085
|
bufPointAttrib = new VertexBuffer(pg, PGL.ARRAY_BUFFER, 2, PGL.SIZEOF_FLOAT);
|
4039
|
-
}
|
4040
4086
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPointAttrib.glId);
|
4041
4087
|
pgl.bufferData(PGL.ARRAY_BUFFER, 2 * sizef,
|
4042
|
-
|
4088
|
+
tessGeo.pointOffsetsBuffer, glUsage);
|
4043
4089
|
|
4044
4090
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4045
4091
|
|
4046
4092
|
tessGeo.updatePointIndicesBuffer();
|
4047
|
-
if (bufPointIndex == null)
|
4093
|
+
if (bufPointIndex == null)
|
4048
4094
|
bufPointIndex = new VertexBuffer(pg, PGL.ELEMENT_ARRAY_BUFFER, 1, PGL.SIZEOF_INDEX, true);
|
4049
|
-
}
|
4050
4095
|
pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, bufPointIndex.glId);
|
4051
4096
|
pgl.bufferData(PGL.ELEMENT_ARRAY_BUFFER,
|
4052
|
-
|
4053
|
-
|
4097
|
+
tessGeo.pointIndexCount * PGL.SIZEOF_INDEX,
|
4098
|
+
tessGeo.pointIndicesBuffer, glUsage);
|
4054
4099
|
|
4055
4100
|
pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, 0);
|
4056
4101
|
}
|
4057
4102
|
|
4103
|
+
|
4058
4104
|
protected boolean contextIsOutdated() {
|
4059
4105
|
boolean outdated = !pgl.contextIsCurrent(context);
|
4060
4106
|
if (outdated) {
|
@@ -4084,9 +4130,14 @@ public class PShapeOpenGL extends PShape {
|
|
4084
4130
|
return outdated;
|
4085
4131
|
}
|
4086
4132
|
|
4133
|
+
|
4087
4134
|
///////////////////////////////////////////////////////////
|
4135
|
+
|
4088
4136
|
//
|
4137
|
+
|
4089
4138
|
// Geometry update
|
4139
|
+
|
4140
|
+
|
4090
4141
|
protected void updateGeometry() {
|
4091
4142
|
root.initBuffers();
|
4092
4143
|
if (root.modified) {
|
@@ -4094,6 +4145,7 @@ public class PShapeOpenGL extends PShape {
|
|
4094
4145
|
}
|
4095
4146
|
}
|
4096
4147
|
|
4148
|
+
|
4097
4149
|
protected void updateGeometryImpl() {
|
4098
4150
|
if (modifiedPolyVertices) {
|
4099
4151
|
int offset = firstModifiedPolyVertex;
|
@@ -4159,20 +4211,17 @@ public class PShapeOpenGL extends PShape {
|
|
4159
4211
|
firstModifiedPolyShininess = PConstants.MAX_INT;
|
4160
4212
|
lastModifiedPolyShininess = PConstants.MIN_INT;
|
4161
4213
|
}
|
4162
|
-
|
4163
|
-
|
4164
|
-
|
4165
|
-
|
4166
|
-
|
4167
|
-
|
4168
|
-
|
4169
|
-
|
4170
|
-
|
4171
|
-
|
4172
|
-
|
4173
|
-
}).forEachOrdered((attrib) -> {
|
4174
|
-
attrib.lastModified = PConstants.MIN_INT;
|
4175
|
-
});
|
4214
|
+
for (String name: polyAttribs.keySet()) {
|
4215
|
+
VertexAttribute attrib = polyAttribs.get(name);
|
4216
|
+
if (attrib.modified) {
|
4217
|
+
int offset = firstModifiedPolyVertex;
|
4218
|
+
int size = lastModifiedPolyVertex - offset + 1;
|
4219
|
+
copyPolyAttrib(attrib, offset, size);
|
4220
|
+
attrib.modified = false;
|
4221
|
+
attrib.firstModified = PConstants.MAX_INT;
|
4222
|
+
attrib.lastModified = PConstants.MIN_INT;
|
4223
|
+
}
|
4224
|
+
}
|
4176
4225
|
|
4177
4226
|
if (modifiedLineVertices) {
|
4178
4227
|
int offset = firstModifiedLineVertex;
|
@@ -4227,325 +4276,300 @@ public class PShapeOpenGL extends PShape {
|
|
4227
4276
|
modified = false;
|
4228
4277
|
}
|
4229
4278
|
|
4279
|
+
|
4230
4280
|
protected void copyPolyVertices(int offset, int size) {
|
4231
4281
|
tessGeo.updatePolyVerticesBuffer(offset, size);
|
4232
4282
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyVertex.glId);
|
4233
4283
|
tessGeo.polyVerticesBuffer.position(4 * offset);
|
4234
4284
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, 4 * offset * PGL.SIZEOF_FLOAT,
|
4235
|
-
|
4285
|
+
4 * size * PGL.SIZEOF_FLOAT, tessGeo.polyVerticesBuffer);
|
4236
4286
|
tessGeo.polyVerticesBuffer.rewind();
|
4237
4287
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4238
4288
|
}
|
4239
4289
|
|
4290
|
+
|
4240
4291
|
protected void copyPolyColors(int offset, int size) {
|
4241
4292
|
tessGeo.updatePolyColorsBuffer(offset, size);
|
4242
4293
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyColor.glId);
|
4243
4294
|
tessGeo.polyColorsBuffer.position(offset);
|
4244
4295
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, offset * PGL.SIZEOF_INT,
|
4245
|
-
|
4296
|
+
size * PGL.SIZEOF_INT, tessGeo.polyColorsBuffer);
|
4246
4297
|
tessGeo.polyColorsBuffer.rewind();
|
4247
4298
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4248
4299
|
}
|
4249
4300
|
|
4301
|
+
|
4250
4302
|
protected void copyPolyNormals(int offset, int size) {
|
4251
4303
|
tessGeo.updatePolyNormalsBuffer(offset, size);
|
4252
4304
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyNormal.glId);
|
4253
4305
|
tessGeo.polyNormalsBuffer.position(3 * offset);
|
4254
4306
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, 3 * offset * PGL.SIZEOF_FLOAT,
|
4255
|
-
|
4307
|
+
3 * size * PGL.SIZEOF_FLOAT, tessGeo.polyNormalsBuffer);
|
4256
4308
|
tessGeo.polyNormalsBuffer.rewind();
|
4257
4309
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4258
4310
|
}
|
4259
4311
|
|
4312
|
+
|
4260
4313
|
protected void copyPolyTexCoords(int offset, int size) {
|
4261
4314
|
tessGeo.updatePolyTexCoordsBuffer(offset, size);
|
4262
4315
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyTexcoord.glId);
|
4263
4316
|
tessGeo.polyTexCoordsBuffer.position(2 * offset);
|
4264
4317
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, 2 * offset * PGL.SIZEOF_FLOAT,
|
4265
|
-
|
4318
|
+
2 * size * PGL.SIZEOF_FLOAT, tessGeo.polyTexCoordsBuffer);
|
4266
4319
|
tessGeo.polyTexCoordsBuffer.rewind();
|
4267
4320
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4268
4321
|
}
|
4269
4322
|
|
4323
|
+
|
4270
4324
|
protected void copyPolyAmbient(int offset, int size) {
|
4271
4325
|
tessGeo.updatePolyAmbientBuffer(offset, size);
|
4272
4326
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyAmbient.glId);
|
4273
4327
|
tessGeo.polyAmbientBuffer.position(offset);
|
4274
4328
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, offset * PGL.SIZEOF_INT,
|
4275
|
-
|
4329
|
+
size * PGL.SIZEOF_INT, tessGeo.polyAmbientBuffer);
|
4276
4330
|
tessGeo.polyAmbientBuffer.rewind();
|
4277
4331
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4278
4332
|
}
|
4279
4333
|
|
4334
|
+
|
4280
4335
|
protected void copyPolySpecular(int offset, int size) {
|
4281
4336
|
tessGeo.updatePolySpecularBuffer(offset, size);
|
4282
4337
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolySpecular.glId);
|
4283
4338
|
tessGeo.polySpecularBuffer.position(offset);
|
4284
4339
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, offset * PGL.SIZEOF_INT,
|
4285
|
-
|
4340
|
+
size * PGL.SIZEOF_INT, tessGeo.polySpecularBuffer);
|
4286
4341
|
tessGeo.polySpecularBuffer.rewind();
|
4287
4342
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4288
4343
|
}
|
4289
4344
|
|
4345
|
+
|
4290
4346
|
protected void copyPolyEmissive(int offset, int size) {
|
4291
4347
|
tessGeo.updatePolyEmissiveBuffer(offset, size);
|
4292
4348
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyEmissive.glId);
|
4293
4349
|
tessGeo.polyEmissiveBuffer.position(offset);
|
4294
4350
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, offset * PGL.SIZEOF_INT,
|
4295
|
-
|
4351
|
+
size * PGL.SIZEOF_INT, tessGeo.polyEmissiveBuffer);
|
4296
4352
|
tessGeo.polyEmissiveBuffer.rewind();
|
4297
4353
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4298
4354
|
}
|
4299
4355
|
|
4356
|
+
|
4300
4357
|
protected void copyPolyShininess(int offset, int size) {
|
4301
4358
|
tessGeo.updatePolyShininessBuffer(offset, size);
|
4302
4359
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPolyShininess.glId);
|
4303
4360
|
tessGeo.polyShininessBuffer.position(offset);
|
4304
4361
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, offset * PGL.SIZEOF_FLOAT,
|
4305
|
-
|
4362
|
+
size * PGL.SIZEOF_FLOAT, tessGeo.polyShininessBuffer);
|
4306
4363
|
tessGeo.polyShininessBuffer.rewind();
|
4307
4364
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4308
4365
|
}
|
4309
4366
|
|
4367
|
+
|
4310
4368
|
protected void copyPolyAttrib(VertexAttribute attrib, int offset, int size) {
|
4311
4369
|
tessGeo.updateAttribBuffer(attrib.name, offset, size);
|
4312
4370
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, attrib.buf.glId);
|
4313
4371
|
Buffer buf = tessGeo.polyAttribBuffers.get(attrib.name);
|
4314
4372
|
buf.position(attrib.size * offset);
|
4315
4373
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, attrib.sizeInBytes(offset),
|
4316
|
-
|
4374
|
+
attrib.sizeInBytes(size), buf);
|
4317
4375
|
buf.rewind();
|
4318
4376
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4319
4377
|
}
|
4320
4378
|
|
4379
|
+
|
4321
4380
|
protected void copyLineVertices(int offset, int size) {
|
4322
4381
|
tessGeo.updateLineVerticesBuffer(offset, size);
|
4323
4382
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufLineVertex.glId);
|
4324
4383
|
tessGeo.lineVerticesBuffer.position(4 * offset);
|
4325
4384
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, 4 * offset * PGL.SIZEOF_FLOAT,
|
4326
|
-
|
4385
|
+
4 * size * PGL.SIZEOF_FLOAT, tessGeo.lineVerticesBuffer);
|
4327
4386
|
tessGeo.lineVerticesBuffer.rewind();
|
4328
4387
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4329
4388
|
}
|
4330
4389
|
|
4390
|
+
|
4331
4391
|
protected void copyLineColors(int offset, int size) {
|
4332
4392
|
tessGeo.updateLineColorsBuffer(offset, size);
|
4333
4393
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufLineColor.glId);
|
4334
4394
|
tessGeo.lineColorsBuffer.position(offset);
|
4335
4395
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, offset * PGL.SIZEOF_INT,
|
4336
|
-
|
4396
|
+
size * PGL.SIZEOF_INT, tessGeo.lineColorsBuffer);
|
4337
4397
|
tessGeo.lineColorsBuffer.rewind();
|
4338
4398
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4339
4399
|
}
|
4340
4400
|
|
4401
|
+
|
4341
4402
|
protected void copyLineAttributes(int offset, int size) {
|
4342
4403
|
tessGeo.updateLineDirectionsBuffer(offset, size);
|
4343
4404
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufLineAttrib.glId);
|
4344
4405
|
tessGeo.lineDirectionsBuffer.position(4 * offset);
|
4345
4406
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, 4 * offset * PGL.SIZEOF_FLOAT,
|
4346
|
-
|
4407
|
+
4 * size * PGL.SIZEOF_FLOAT, tessGeo.lineDirectionsBuffer);
|
4347
4408
|
tessGeo.lineDirectionsBuffer.rewind();
|
4348
4409
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4349
4410
|
}
|
4350
4411
|
|
4412
|
+
|
4351
4413
|
protected void copyPointVertices(int offset, int size) {
|
4352
4414
|
tessGeo.updatePointVerticesBuffer(offset, size);
|
4353
4415
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPointVertex.glId);
|
4354
4416
|
tessGeo.pointVerticesBuffer.position(4 * offset);
|
4355
4417
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, 4 * offset * PGL.SIZEOF_FLOAT,
|
4356
|
-
|
4418
|
+
4 * size * PGL.SIZEOF_FLOAT, tessGeo.pointVerticesBuffer);
|
4357
4419
|
tessGeo.pointVerticesBuffer.rewind();
|
4358
4420
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4359
4421
|
}
|
4360
4422
|
|
4423
|
+
|
4361
4424
|
protected void copyPointColors(int offset, int size) {
|
4362
4425
|
tessGeo.updatePointColorsBuffer(offset, size);
|
4363
4426
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPointColor.glId);
|
4364
4427
|
tessGeo.pointColorsBuffer.position(offset);
|
4365
4428
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, offset * PGL.SIZEOF_INT,
|
4366
|
-
|
4429
|
+
size * PGL.SIZEOF_INT,tessGeo.pointColorsBuffer);
|
4367
4430
|
tessGeo.pointColorsBuffer.rewind();
|
4368
4431
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4369
4432
|
}
|
4370
4433
|
|
4434
|
+
|
4371
4435
|
protected void copyPointAttributes(int offset, int size) {
|
4372
4436
|
tessGeo.updatePointOffsetsBuffer(offset, size);
|
4373
4437
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, bufPointAttrib.glId);
|
4374
4438
|
tessGeo.pointOffsetsBuffer.position(2 * offset);
|
4375
4439
|
pgl.bufferSubData(PGL.ARRAY_BUFFER, 2 * offset * PGL.SIZEOF_FLOAT,
|
4376
|
-
|
4440
|
+
2 * size * PGL.SIZEOF_FLOAT, tessGeo.pointOffsetsBuffer);
|
4377
4441
|
tessGeo.pointOffsetsBuffer.rewind();
|
4378
4442
|
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
4379
4443
|
}
|
4380
4444
|
|
4445
|
+
|
4381
4446
|
protected void setModifiedPolyVertices(int first, int last) {
|
4382
|
-
if (first < firstModifiedPolyVertex)
|
4383
|
-
|
4384
|
-
}
|
4385
|
-
if (last > lastModifiedPolyVertex) {
|
4386
|
-
lastModifiedPolyVertex = last;
|
4387
|
-
}
|
4447
|
+
if (first < firstModifiedPolyVertex) firstModifiedPolyVertex = first;
|
4448
|
+
if (last > lastModifiedPolyVertex) lastModifiedPolyVertex = last;
|
4388
4449
|
modifiedPolyVertices = true;
|
4389
4450
|
modified = true;
|
4390
4451
|
}
|
4391
4452
|
|
4453
|
+
|
4392
4454
|
protected void setModifiedPolyColors(int first, int last) {
|
4393
|
-
if (first < firstModifiedPolyColor)
|
4394
|
-
|
4395
|
-
}
|
4396
|
-
if (last > lastModifiedPolyColor) {
|
4397
|
-
lastModifiedPolyColor = last;
|
4398
|
-
}
|
4455
|
+
if (first < firstModifiedPolyColor) firstModifiedPolyColor = first;
|
4456
|
+
if (last > lastModifiedPolyColor) lastModifiedPolyColor = last;
|
4399
4457
|
modifiedPolyColors = true;
|
4400
4458
|
modified = true;
|
4401
4459
|
}
|
4402
4460
|
|
4461
|
+
|
4403
4462
|
protected void setModifiedPolyNormals(int first, int last) {
|
4404
|
-
if (first < firstModifiedPolyNormal)
|
4405
|
-
|
4406
|
-
}
|
4407
|
-
if (last > lastModifiedPolyNormal) {
|
4408
|
-
lastModifiedPolyNormal = last;
|
4409
|
-
}
|
4463
|
+
if (first < firstModifiedPolyNormal) firstModifiedPolyNormal = first;
|
4464
|
+
if (last > lastModifiedPolyNormal) lastModifiedPolyNormal = last;
|
4410
4465
|
modifiedPolyNormals = true;
|
4411
4466
|
modified = true;
|
4412
4467
|
}
|
4413
4468
|
|
4469
|
+
|
4414
4470
|
protected void setModifiedPolyTexCoords(int first, int last) {
|
4415
|
-
if (first < firstModifiedPolyTexcoord)
|
4416
|
-
|
4417
|
-
}
|
4418
|
-
if (last > lastModifiedPolyTexcoord) {
|
4419
|
-
lastModifiedPolyTexcoord = last;
|
4420
|
-
}
|
4471
|
+
if (first < firstModifiedPolyTexcoord) firstModifiedPolyTexcoord = first;
|
4472
|
+
if (last > lastModifiedPolyTexcoord) lastModifiedPolyTexcoord = last;
|
4421
4473
|
modifiedPolyTexCoords = true;
|
4422
4474
|
modified = true;
|
4423
4475
|
}
|
4424
4476
|
|
4477
|
+
|
4425
4478
|
protected void setModifiedPolyAmbient(int first, int last) {
|
4426
|
-
if (first < firstModifiedPolyAmbient)
|
4427
|
-
|
4428
|
-
}
|
4429
|
-
if (last > lastModifiedPolyAmbient) {
|
4430
|
-
lastModifiedPolyAmbient = last;
|
4431
|
-
}
|
4479
|
+
if (first < firstModifiedPolyAmbient) firstModifiedPolyAmbient = first;
|
4480
|
+
if (last > lastModifiedPolyAmbient) lastModifiedPolyAmbient = last;
|
4432
4481
|
modifiedPolyAmbient = true;
|
4433
4482
|
modified = true;
|
4434
4483
|
}
|
4435
4484
|
|
4485
|
+
|
4436
4486
|
protected void setModifiedPolySpecular(int first, int last) {
|
4437
|
-
if (first < firstModifiedPolySpecular)
|
4438
|
-
|
4439
|
-
}
|
4440
|
-
if (last > lastModifiedPolySpecular) {
|
4441
|
-
lastModifiedPolySpecular = last;
|
4442
|
-
}
|
4487
|
+
if (first < firstModifiedPolySpecular) firstModifiedPolySpecular = first;
|
4488
|
+
if (last > lastModifiedPolySpecular) lastModifiedPolySpecular = last;
|
4443
4489
|
modifiedPolySpecular = true;
|
4444
4490
|
modified = true;
|
4445
4491
|
}
|
4446
4492
|
|
4493
|
+
|
4447
4494
|
protected void setModifiedPolyEmissive(int first, int last) {
|
4448
|
-
if (first < firstModifiedPolyEmissive)
|
4449
|
-
|
4450
|
-
}
|
4451
|
-
if (last > lastModifiedPolyEmissive) {
|
4452
|
-
lastModifiedPolyEmissive = last;
|
4453
|
-
}
|
4495
|
+
if (first < firstModifiedPolyEmissive) firstModifiedPolyEmissive = first;
|
4496
|
+
if (last > lastModifiedPolyEmissive) lastModifiedPolyEmissive = last;
|
4454
4497
|
modifiedPolyEmissive = true;
|
4455
4498
|
modified = true;
|
4456
4499
|
}
|
4457
4500
|
|
4501
|
+
|
4458
4502
|
protected void setModifiedPolyShininess(int first, int last) {
|
4459
|
-
if (first < firstModifiedPolyShininess)
|
4460
|
-
|
4461
|
-
}
|
4462
|
-
if (last > lastModifiedPolyShininess) {
|
4463
|
-
lastModifiedPolyShininess = last;
|
4464
|
-
}
|
4503
|
+
if (first < firstModifiedPolyShininess) firstModifiedPolyShininess = first;
|
4504
|
+
if (last > lastModifiedPolyShininess) lastModifiedPolyShininess = last;
|
4465
4505
|
modifiedPolyShininess = true;
|
4466
4506
|
modified = true;
|
4467
4507
|
}
|
4468
4508
|
|
4509
|
+
|
4469
4510
|
protected void setModifiedPolyAttrib(VertexAttribute attrib, int first, int last) {
|
4470
|
-
if (first < attrib.firstModified)
|
4471
|
-
|
4472
|
-
}
|
4473
|
-
if (last > attrib.lastModified) {
|
4474
|
-
attrib.lastModified = last;
|
4475
|
-
}
|
4511
|
+
if (first < attrib.firstModified) attrib.firstModified = first;
|
4512
|
+
if (last > attrib.lastModified) attrib.lastModified = last;
|
4476
4513
|
attrib.modified = true;
|
4477
4514
|
modified = true;
|
4478
4515
|
}
|
4479
4516
|
|
4517
|
+
|
4480
4518
|
protected void setModifiedLineVertices(int first, int last) {
|
4481
|
-
if (first < firstModifiedLineVertex)
|
4482
|
-
|
4483
|
-
}
|
4484
|
-
if (last > lastModifiedLineVertex) {
|
4485
|
-
lastModifiedLineVertex = last;
|
4486
|
-
}
|
4519
|
+
if (first < firstModifiedLineVertex) firstModifiedLineVertex = first;
|
4520
|
+
if (last > lastModifiedLineVertex) lastModifiedLineVertex = last;
|
4487
4521
|
modifiedLineVertices = true;
|
4488
4522
|
modified = true;
|
4489
4523
|
}
|
4490
4524
|
|
4525
|
+
|
4491
4526
|
protected void setModifiedLineColors(int first, int last) {
|
4492
|
-
if (first < firstModifiedLineColor)
|
4493
|
-
|
4494
|
-
}
|
4495
|
-
if (last > lastModifiedLineColor) {
|
4496
|
-
lastModifiedLineColor = last;
|
4497
|
-
}
|
4527
|
+
if (first < firstModifiedLineColor) firstModifiedLineColor = first;
|
4528
|
+
if (last > lastModifiedLineColor) lastModifiedLineColor = last;
|
4498
4529
|
modifiedLineColors = true;
|
4499
4530
|
modified = true;
|
4500
4531
|
}
|
4501
4532
|
|
4533
|
+
|
4502
4534
|
protected void setModifiedLineAttributes(int first, int last) {
|
4503
|
-
if (first < firstModifiedLineAttribute)
|
4504
|
-
|
4505
|
-
}
|
4506
|
-
if (last > lastModifiedLineAttribute) {
|
4507
|
-
lastModifiedLineAttribute = last;
|
4508
|
-
}
|
4535
|
+
if (first < firstModifiedLineAttribute) firstModifiedLineAttribute = first;
|
4536
|
+
if (last > lastModifiedLineAttribute) lastModifiedLineAttribute = last;
|
4509
4537
|
modifiedLineAttributes = true;
|
4510
4538
|
modified = true;
|
4511
4539
|
}
|
4512
4540
|
|
4541
|
+
|
4513
4542
|
protected void setModifiedPointVertices(int first, int last) {
|
4514
|
-
if (first < firstModifiedPointVertex)
|
4515
|
-
|
4516
|
-
}
|
4517
|
-
if (last > lastModifiedPointVertex) {
|
4518
|
-
lastModifiedPointVertex = last;
|
4519
|
-
}
|
4543
|
+
if (first < firstModifiedPointVertex) firstModifiedPointVertex = first;
|
4544
|
+
if (last > lastModifiedPointVertex) lastModifiedPointVertex = last;
|
4520
4545
|
modifiedPointVertices = true;
|
4521
4546
|
modified = true;
|
4522
4547
|
}
|
4523
4548
|
|
4549
|
+
|
4524
4550
|
protected void setModifiedPointColors(int first, int last) {
|
4525
|
-
if (first < firstModifiedPointColor)
|
4526
|
-
|
4527
|
-
}
|
4528
|
-
if (last > lastModifiedPointColor) {
|
4529
|
-
lastModifiedPointColor = last;
|
4530
|
-
}
|
4551
|
+
if (first < firstModifiedPointColor) firstModifiedPointColor = first;
|
4552
|
+
if (last > lastModifiedPointColor) lastModifiedPointColor = last;
|
4531
4553
|
modifiedPointColors = true;
|
4532
4554
|
modified = true;
|
4533
4555
|
}
|
4534
4556
|
|
4557
|
+
|
4535
4558
|
protected void setModifiedPointAttributes(int first, int last) {
|
4536
|
-
if (first < firstModifiedPointAttribute)
|
4537
|
-
|
4538
|
-
}
|
4539
|
-
if (last > lastModifiedPointAttribute) {
|
4540
|
-
lastModifiedPointAttribute = last;
|
4541
|
-
}
|
4559
|
+
if (first < firstModifiedPointAttribute) firstModifiedPointAttribute = first;
|
4560
|
+
if (last > lastModifiedPointAttribute) lastModifiedPointAttribute = last;
|
4542
4561
|
modifiedPointAttributes = true;
|
4543
4562
|
modified = true;
|
4544
4563
|
}
|
4545
4564
|
|
4565
|
+
|
4546
4566
|
///////////////////////////////////////////////////////////
|
4567
|
+
|
4547
4568
|
//
|
4569
|
+
|
4548
4570
|
// Style handling
|
4571
|
+
|
4572
|
+
|
4549
4573
|
@Override
|
4550
4574
|
public void disableStyle() {
|
4551
4575
|
if (openShape) {
|
@@ -4572,6 +4596,7 @@ public class PShapeOpenGL extends PShape {
|
|
4572
4596
|
super.disableStyle();
|
4573
4597
|
}
|
4574
4598
|
|
4599
|
+
|
4575
4600
|
@Override
|
4576
4601
|
public void enableStyle() {
|
4577
4602
|
if (savedStroke) {
|
@@ -4608,6 +4633,7 @@ public class PShapeOpenGL extends PShape {
|
|
4608
4633
|
super.enableStyle();
|
4609
4634
|
}
|
4610
4635
|
|
4636
|
+
|
4611
4637
|
@Override
|
4612
4638
|
protected void styles(PGraphics g) {
|
4613
4639
|
if (g instanceof PGraphicsOpenGL) {
|
@@ -4646,18 +4672,25 @@ public class PShapeOpenGL extends PShape {
|
|
4646
4672
|
}
|
4647
4673
|
}
|
4648
4674
|
|
4675
|
+
|
4649
4676
|
///////////////////////////////////////////////////////////
|
4677
|
+
|
4650
4678
|
//
|
4679
|
+
|
4651
4680
|
// Rendering methods
|
4681
|
+
|
4682
|
+
|
4652
4683
|
/*
|
4653
4684
|
public void draw() {
|
4654
4685
|
draw(pg);
|
4655
4686
|
}
|
4656
|
-
|
4687
|
+
*/
|
4688
|
+
|
4689
|
+
|
4657
4690
|
@Override
|
4658
4691
|
public void draw(PGraphics g) {
|
4659
4692
|
if (g instanceof PGraphicsOpenGL) {
|
4660
|
-
PGraphicsOpenGL gl = (PGraphicsOpenGL)
|
4693
|
+
PGraphicsOpenGL gl = (PGraphicsOpenGL)g;
|
4661
4694
|
if (visible) {
|
4662
4695
|
pre(gl);
|
4663
4696
|
|
@@ -4672,7 +4705,7 @@ public class PShapeOpenGL extends PShape {
|
|
4672
4705
|
} else {
|
4673
4706
|
PImage tex = null;
|
4674
4707
|
if (textures != null && textures.size() == 1) {
|
4675
|
-
tex = (PImage)
|
4708
|
+
tex = (PImage)textures.toArray()[0];
|
4676
4709
|
}
|
4677
4710
|
render(gl, tex);
|
4678
4711
|
}
|
@@ -4691,6 +4724,7 @@ public class PShapeOpenGL extends PShape {
|
|
4691
4724
|
}
|
4692
4725
|
}
|
4693
4726
|
|
4727
|
+
|
4694
4728
|
private void inGeoToVertices() {
|
4695
4729
|
vertexCount = 0;
|
4696
4730
|
vertexCodeCount = 0;
|
@@ -4698,7 +4732,7 @@ public class PShapeOpenGL extends PShape {
|
|
4698
4732
|
for (int i = 0; i < inGeo.vertexCount; i++) {
|
4699
4733
|
int index = 3 * i;
|
4700
4734
|
float x = inGeo.vertices[index++];
|
4701
|
-
float y = inGeo.vertices[index];
|
4735
|
+
float y = inGeo.vertices[index ];
|
4702
4736
|
super.vertex(x, y);
|
4703
4737
|
}
|
4704
4738
|
} else {
|
@@ -4712,63 +4746,63 @@ public class PShapeOpenGL extends PShape {
|
|
4712
4746
|
for (int j = 0; j < inGeo.codeCount; j++) {
|
4713
4747
|
switch (inGeo.codes[j]) {
|
4714
4748
|
|
4715
|
-
|
4716
|
-
|
4717
|
-
|
4718
|
-
|
4719
|
-
|
4749
|
+
case VERTEX:
|
4750
|
+
v = 3 * idx;
|
4751
|
+
x = inGeo.vertices[v++];
|
4752
|
+
y = inGeo.vertices[v ];
|
4753
|
+
super.vertex(x, y);
|
4720
4754
|
|
4721
|
-
|
4722
|
-
|
4755
|
+
idx++;
|
4756
|
+
break;
|
4723
4757
|
|
4724
|
-
|
4725
|
-
|
4726
|
-
|
4727
|
-
|
4758
|
+
case QUADRATIC_VERTEX:
|
4759
|
+
v = 3 * idx;
|
4760
|
+
cx = inGeo.vertices[v++];
|
4761
|
+
cy = inGeo.vertices[v];
|
4728
4762
|
|
4729
|
-
|
4730
|
-
|
4731
|
-
|
4763
|
+
v = 3 * (idx + 1);
|
4764
|
+
x3 = inGeo.vertices[v++];
|
4765
|
+
y3 = inGeo.vertices[v];
|
4732
4766
|
|
4733
|
-
|
4767
|
+
super.quadraticVertex(cx, cy, x3, y3);
|
4734
4768
|
|
4735
|
-
|
4736
|
-
|
4769
|
+
idx += 2;
|
4770
|
+
break;
|
4737
4771
|
|
4738
|
-
|
4739
|
-
|
4740
|
-
|
4741
|
-
|
4772
|
+
case BEZIER_VERTEX:
|
4773
|
+
v = 3 * idx;
|
4774
|
+
x2 = inGeo.vertices[v++];
|
4775
|
+
y2 = inGeo.vertices[v ];
|
4742
4776
|
|
4743
|
-
|
4744
|
-
|
4745
|
-
|
4777
|
+
v = 3 * (idx + 1);
|
4778
|
+
x3 = inGeo.vertices[v++];
|
4779
|
+
y3 = inGeo.vertices[v ];
|
4746
4780
|
|
4747
|
-
|
4748
|
-
|
4749
|
-
|
4781
|
+
v = 3 * (idx + 2);
|
4782
|
+
x4 = inGeo.vertices[v++];
|
4783
|
+
y4 = inGeo.vertices[v ];
|
4750
4784
|
|
4751
|
-
|
4785
|
+
super.bezierVertex(x2, y2, x3, y3, x4, y4);
|
4752
4786
|
|
4753
|
-
|
4754
|
-
|
4787
|
+
idx += 3;
|
4788
|
+
break;
|
4755
4789
|
|
4756
|
-
|
4757
|
-
|
4758
|
-
|
4759
|
-
|
4790
|
+
case CURVE_VERTEX:
|
4791
|
+
v = 3 * idx;
|
4792
|
+
x = inGeo.vertices[v++];
|
4793
|
+
y = inGeo.vertices[v ];
|
4760
4794
|
|
4761
|
-
|
4795
|
+
super.curveVertex(x, y);
|
4762
4796
|
|
4763
|
-
|
4764
|
-
|
4797
|
+
idx++;
|
4798
|
+
break;
|
4765
4799
|
|
4766
|
-
|
4767
|
-
|
4768
|
-
|
4769
|
-
|
4770
|
-
|
4771
|
-
|
4800
|
+
case BREAK:
|
4801
|
+
if (insideContour) {
|
4802
|
+
super.endContourImpl();
|
4803
|
+
}
|
4804
|
+
super.beginContourImpl();
|
4805
|
+
insideContour = true;
|
4772
4806
|
}
|
4773
4807
|
}
|
4774
4808
|
if (insideContour) {
|
@@ -4777,6 +4811,7 @@ public class PShapeOpenGL extends PShape {
|
|
4777
4811
|
}
|
4778
4812
|
}
|
4779
4813
|
|
4814
|
+
|
4780
4815
|
// Returns true if some child shapes below this one either
|
4781
4816
|
// use different texture maps (or only one texture is used by some while
|
4782
4817
|
// others are untextured), or have stroked textures,
|
@@ -4784,11 +4819,12 @@ public class PShapeOpenGL extends PShape {
|
|
4784
4819
|
// Or accurate 2D mode is enabled, which forces each
|
4785
4820
|
// shape to be rendered separately.
|
4786
4821
|
protected boolean fragmentedGroup(PGraphicsOpenGL g) {
|
4787
|
-
return g.getHint(DISABLE_OPTIMIZED_STROKE)
|
4788
|
-
|
4789
|
-
|
4822
|
+
return g.getHint(DISABLE_OPTIMIZED_STROKE) ||
|
4823
|
+
(textures != null && (1 < textures.size() || untexChild)) ||
|
4824
|
+
strokedTexture;
|
4790
4825
|
}
|
4791
4826
|
|
4827
|
+
|
4792
4828
|
@Override
|
4793
4829
|
protected void pre(PGraphics g) {
|
4794
4830
|
if (g instanceof PGraphicsOpenGL) {
|
@@ -4800,6 +4836,7 @@ public class PShapeOpenGL extends PShape {
|
|
4800
4836
|
}
|
4801
4837
|
}
|
4802
4838
|
|
4839
|
+
|
4803
4840
|
@Override
|
4804
4841
|
protected void post(PGraphics g) {
|
4805
4842
|
if (g instanceof PGraphicsOpenGL) {
|
@@ -4808,6 +4845,7 @@ public class PShapeOpenGL extends PShape {
|
|
4808
4845
|
}
|
4809
4846
|
}
|
4810
4847
|
|
4848
|
+
|
4811
4849
|
@Override
|
4812
4850
|
protected void drawGeometry(PGraphics g) {
|
4813
4851
|
vertexCount = inGeo.vertexCount;
|
@@ -4819,13 +4857,14 @@ public class PShapeOpenGL extends PShape {
|
|
4819
4857
|
vertices = null;
|
4820
4858
|
}
|
4821
4859
|
|
4860
|
+
|
4822
4861
|
// Render the geometry stored in the root shape as VBOs, for the vertices
|
4823
4862
|
// corresponding to this shape. Sometimes we can have root == this.
|
4824
4863
|
protected void render(PGraphicsOpenGL g, PImage texture) {
|
4825
4864
|
if (root == null) {
|
4826
4865
|
// Some error. Root should never be null. At least it should be 'this'.
|
4827
|
-
throw new RuntimeException("Error rendering PShapeOpenGL, root shape is "
|
4828
|
-
|
4866
|
+
throw new RuntimeException("Error rendering PShapeOpenGL, root shape is " +
|
4867
|
+
"null");
|
4829
4868
|
}
|
4830
4869
|
|
4831
4870
|
if (hasPolys) {
|
@@ -4854,6 +4893,7 @@ public class PShapeOpenGL extends PShape {
|
|
4854
4893
|
}
|
4855
4894
|
}
|
4856
4895
|
|
4896
|
+
|
4857
4897
|
protected void renderPolys(PGraphicsOpenGL g, PImage textureImage) {
|
4858
4898
|
boolean customShader = g.polyShader != null;
|
4859
4899
|
boolean needNormals = customShader ? g.polyShader.accessNormals() : false;
|
@@ -4865,10 +4905,10 @@ public class PShapeOpenGL extends PShape {
|
|
4865
4905
|
PShader shader = null;
|
4866
4906
|
IndexCache cache = tessGeo.polyIndexCache;
|
4867
4907
|
for (int n = firstPolyIndexCache; n <= lastPolyIndexCache; n++) {
|
4868
|
-
if (is3D() || (tex != null && (firstLineIndexCache == -1
|
4869
|
-
|
4870
|
-
|
4871
|
-
|
4908
|
+
if (is3D() || (tex != null && (firstLineIndexCache == -1 ||
|
4909
|
+
n < firstLineIndexCache) &&
|
4910
|
+
(firstPointIndexCache == -1 ||
|
4911
|
+
n < firstPointIndexCache))) {
|
4872
4912
|
// Rendering fill triangles, which can be lit and textured.
|
4873
4913
|
if (!renderingFill) {
|
4874
4914
|
shader = g.getPolyShader(g.lights, tex != null);
|
@@ -4902,56 +4942,53 @@ public class PShapeOpenGL extends PShape {
|
|
4902
4942
|
int voffset = cache.vertexOffset[n];
|
4903
4943
|
|
4904
4944
|
shader.setVertexAttribute(root.bufPolyVertex.glId, 4, PGL.FLOAT,
|
4905
|
-
|
4945
|
+
0, 4 * voffset * PGL.SIZEOF_FLOAT);
|
4906
4946
|
shader.setColorAttribute(root.bufPolyColor.glId, 4, PGL.UNSIGNED_BYTE,
|
4907
|
-
|
4947
|
+
0, 4 * voffset * PGL.SIZEOF_BYTE);
|
4908
4948
|
|
4909
4949
|
if (g.lights) {
|
4910
4950
|
shader.setNormalAttribute(root.bufPolyNormal.glId, 3, PGL.FLOAT,
|
4911
|
-
|
4951
|
+
0, 3 * voffset * PGL.SIZEOF_FLOAT);
|
4912
4952
|
shader.setAmbientAttribute(root.bufPolyAmbient.glId, 4, PGL.UNSIGNED_BYTE,
|
4913
|
-
|
4953
|
+
0, 4 * voffset * PGL.SIZEOF_BYTE);
|
4914
4954
|
shader.setSpecularAttribute(root.bufPolySpecular.glId, 4, PGL.UNSIGNED_BYTE,
|
4915
|
-
|
4955
|
+
0, 4 * voffset * PGL.SIZEOF_BYTE);
|
4916
4956
|
shader.setEmissiveAttribute(root.bufPolyEmissive.glId, 4, PGL.UNSIGNED_BYTE,
|
4917
|
-
|
4957
|
+
0, 4 * voffset * PGL.SIZEOF_BYTE);
|
4918
4958
|
shader.setShininessAttribute(root.bufPolyShininess.glId, 1, PGL.FLOAT,
|
4919
|
-
|
4959
|
+
0, voffset * PGL.SIZEOF_FLOAT);
|
4920
4960
|
}
|
4921
4961
|
if (g.lights || needNormals) {
|
4922
4962
|
shader.setNormalAttribute(root.bufPolyNormal.glId, 3, PGL.FLOAT,
|
4923
|
-
|
4963
|
+
0, 3 * voffset * PGL.SIZEOF_FLOAT);
|
4924
4964
|
}
|
4925
4965
|
|
4926
4966
|
if (tex != null || needTexCoords) {
|
4927
4967
|
shader.setTexcoordAttribute(root.bufPolyTexcoord.glId, 2, PGL.FLOAT,
|
4928
|
-
|
4968
|
+
0, 2 * voffset * PGL.SIZEOF_FLOAT);
|
4929
4969
|
shader.setTexture(tex);
|
4930
4970
|
}
|
4931
4971
|
|
4932
|
-
for (VertexAttribute attrib
|
4933
|
-
if (!attrib.active(shader))
|
4934
|
-
continue;
|
4935
|
-
}
|
4972
|
+
for (VertexAttribute attrib: polyAttribs.values()) {
|
4973
|
+
if (!attrib.active(shader)) continue;
|
4936
4974
|
attrib.bind(pgl);
|
4937
4975
|
shader.setAttributeVBO(attrib.glLoc, attrib.buf.glId,
|
4938
|
-
|
4939
|
-
|
4976
|
+
attrib.tessSize, attrib.type,
|
4977
|
+
attrib.isColor(), 0, attrib.sizeInBytes(voffset));
|
4940
4978
|
}
|
4941
4979
|
|
4942
4980
|
shader.draw(root.bufPolyIndex.glId, icount, ioffset);
|
4943
4981
|
}
|
4944
4982
|
|
4945
|
-
for (VertexAttribute attrib
|
4946
|
-
if (attrib.active(shader))
|
4947
|
-
attrib.unbind(pgl);
|
4948
|
-
}
|
4983
|
+
for (VertexAttribute attrib: polyAttribs.values()) {
|
4984
|
+
if (attrib.active(shader)) attrib.unbind(pgl);
|
4949
4985
|
}
|
4950
4986
|
if (shader != null && shader.bound()) {
|
4951
4987
|
shader.unbind();
|
4952
4988
|
}
|
4953
4989
|
}
|
4954
4990
|
|
4991
|
+
|
4955
4992
|
protected void rawPolys(PGraphicsOpenGL g, PImage textureImage) {
|
4956
4993
|
PGraphics raw = g.getRaw();
|
4957
4994
|
|
@@ -5046,6 +5083,7 @@ public class PShapeOpenGL extends PShape {
|
|
5046
5083
|
raw.endShape();
|
5047
5084
|
}
|
5048
5085
|
|
5086
|
+
|
5049
5087
|
protected void renderLines(PGraphicsOpenGL g) {
|
5050
5088
|
PShader shader = g.getLineShader();
|
5051
5089
|
shader.bind();
|
@@ -5057,11 +5095,11 @@ public class PShapeOpenGL extends PShape {
|
|
5057
5095
|
int voffset = cache.vertexOffset[n];
|
5058
5096
|
|
5059
5097
|
shader.setVertexAttribute(root.bufLineVertex.glId, 4, PGL.FLOAT,
|
5060
|
-
|
5098
|
+
0, 4 * voffset * PGL.SIZEOF_FLOAT);
|
5061
5099
|
shader.setColorAttribute(root.bufLineColor.glId, 4, PGL.UNSIGNED_BYTE,
|
5062
|
-
|
5100
|
+
0, 4 * voffset * PGL.SIZEOF_BYTE);
|
5063
5101
|
shader.setLineAttribute(root.bufLineAttrib.glId, 4, PGL.FLOAT,
|
5064
|
-
|
5102
|
+
0, 4 * voffset * PGL.SIZEOF_FLOAT);
|
5065
5103
|
|
5066
5104
|
shader.draw(root.bufLineIndex.glId, icount, ioffset);
|
5067
5105
|
}
|
@@ -5069,6 +5107,7 @@ public class PShapeOpenGL extends PShape {
|
|
5069
5107
|
shader.unbind();
|
5070
5108
|
}
|
5071
5109
|
|
5110
|
+
|
5072
5111
|
protected void rawLines(PGraphicsOpenGL g) {
|
5073
5112
|
PGraphics raw = g.getRaw();
|
5074
5113
|
|
@@ -5100,9 +5139,8 @@ public class PShapeOpenGL extends PShape {
|
|
5100
5139
|
float sw0 = 2 * attribs[4 * i0 + 3];
|
5101
5140
|
float sw1 = 2 * attribs[4 * i1 + 3];
|
5102
5141
|
|
5103
|
-
if (PGraphicsOpenGL.zero(sw0))
|
5104
|
-
|
5105
|
-
}
|
5142
|
+
if (PGraphicsOpenGL.zero(sw0)) continue; // Bevel triangles, skip.
|
5143
|
+
|
5106
5144
|
float[] src0 = {0, 0, 0, 0};
|
5107
5145
|
float[] src1 = {0, 0, 0, 0};
|
5108
5146
|
float[] pt0 = {0, 0, 0, 0};
|
@@ -5142,6 +5180,7 @@ public class PShapeOpenGL extends PShape {
|
|
5142
5180
|
raw.endShape();
|
5143
5181
|
}
|
5144
5182
|
|
5183
|
+
|
5145
5184
|
protected void renderPoints(PGraphicsOpenGL g) {
|
5146
5185
|
PShader shader = g.getPointShader();
|
5147
5186
|
shader.bind();
|
@@ -5153,11 +5192,11 @@ public class PShapeOpenGL extends PShape {
|
|
5153
5192
|
int voffset = cache.vertexOffset[n];
|
5154
5193
|
|
5155
5194
|
shader.setVertexAttribute(root.bufPointVertex.glId, 4, PGL.FLOAT,
|
5156
|
-
|
5195
|
+
0, 4 * voffset * PGL.SIZEOF_FLOAT);
|
5157
5196
|
shader.setColorAttribute(root.bufPointColor.glId, 4, PGL.UNSIGNED_BYTE,
|
5158
|
-
|
5197
|
+
0, 4 * voffset * PGL.SIZEOF_BYTE);
|
5159
5198
|
shader.setPointAttribute(root.bufPointAttrib.glId, 2, PGL.FLOAT,
|
5160
|
-
|
5199
|
+
0, 2 * voffset * PGL.SIZEOF_FLOAT);
|
5161
5200
|
|
5162
5201
|
shader.draw(root.bufPointIndex.glId, icount, ioffset);
|
5163
5202
|
}
|
@@ -5165,6 +5204,7 @@ public class PShapeOpenGL extends PShape {
|
|
5165
5204
|
shader.unbind();
|
5166
5205
|
}
|
5167
5206
|
|
5207
|
+
|
5168
5208
|
protected void rawPoints(PGraphicsOpenGL g) {
|
5169
5209
|
PGraphics raw = g.getRaw();
|
5170
5210
|
|
@@ -5192,9 +5232,9 @@ public class PShapeOpenGL extends PShape {
|
|
5192
5232
|
if (0 < size) { // round point
|
5193
5233
|
weight = +size / 0.5f;
|
5194
5234
|
perim = PApplet.min(PGraphicsOpenGL.MAX_POINT_ACCURACY,
|
5195
|
-
|
5196
|
-
|
5197
|
-
|
5235
|
+
PApplet.max(PGraphicsOpenGL.MIN_POINT_ACCURACY,
|
5236
|
+
(int) (TWO_PI * weight /
|
5237
|
+
PGraphicsOpenGL.POINT_ACCURACY_FACTOR))) + 1;
|
5198
5238
|
} else { // Square point
|
5199
5239
|
weight = -size / 0.5f;
|
5200
5240
|
perim = 5;
|