propane 3.1.0.pre-java → 3.2.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.mvn/wrapper/maven-wrapper.properties +1 -0
- data/CHANGELOG.md +1 -5
- data/README.md +23 -12
- data/Rakefile +23 -12
- data/lib/propane/helpers/version_error.rb +6 -0
- data/lib/propane/runner.rb +12 -0
- data/lib/propane/version.rb +1 -1
- data/library/slider/slider.rb +1 -1
- data/mvnw +234 -0
- data/mvnw.cmd +145 -0
- data/pom.xml +28 -27
- data/propane.gemspec +2 -2
- data/src/main/java/japplemenubar/JAppleMenuBar.java +41 -47
- data/src/main/java/monkstone/ColorUtil.java +1 -1
- data/src/main/java/monkstone/MathToolModule.java +12 -11
- data/src/main/java/monkstone/PropaneLibrary.java +9 -10
- data/src/main/java/monkstone/core/LibraryProxy.java +124 -113
- data/src/main/java/monkstone/fastmath/Deglut.java +86 -89
- data/src/main/java/monkstone/filechooser/Chooser.java +7 -13
- data/src/main/java/monkstone/noise/SimplexNoise.java +0 -1
- data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +4 -4
- data/src/main/java/monkstone/slider/CustomVerticalSlider.java +1 -1
- data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +9 -9
- data/src/main/java/monkstone/slider/SimpleSlider.java +0 -9
- data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +11 -13
- data/src/main/java/monkstone/slider/Slider.java +1 -1
- data/src/main/java/monkstone/slider/SliderBar.java +1 -1
- data/src/main/java/monkstone/slider/SliderGroup.java +1 -1
- data/src/main/java/monkstone/slider/WheelHandler.java +8 -9
- data/src/main/java/monkstone/vecmath/AppRender.java +2 -2
- data/src/main/java/monkstone/vecmath/ShapeRender.java +2 -2
- data/src/main/java/monkstone/vecmath/package-info.java +2 -2
- data/src/main/java/monkstone/vecmath/vec2/Vec2.java +2 -2
- data/src/main/java/monkstone/vecmath/vec3/Vec3.java +1 -1
- data/src/main/java/monkstone/videoevent/VideoInterface.java +11 -5
- data/src/main/java/monkstone/videoevent/package-info.java +2 -2
- data/src/main/java/processing/awt/PGraphicsJava2D.java +1742 -2243
- data/src/main/java/processing/awt/PShapeJava2D.java +268 -270
- data/src/main/java/processing/awt/PSurfaceAWT.java +821 -920
- data/src/main/java/processing/core/DesktopHandler.java +94 -0
- data/src/main/java/processing/core/PApplet.java +14170 -14082
- data/src/main/java/processing/core/PConstants.java +447 -473
- data/src/main/java/processing/core/PFont.java +867 -873
- data/src/main/java/processing/core/PGraphics.java +7193 -7428
- data/src/main/java/processing/core/PImage.java +3051 -3117
- data/src/main/java/processing/core/PMatrix.java +159 -172
- data/src/main/java/processing/core/PMatrix2D.java +403 -444
- data/src/main/java/processing/core/PMatrix3D.java +735 -749
- data/src/main/java/processing/core/PShape.java +2651 -2793
- data/src/main/java/processing/core/PShapeOBJ.java +415 -422
- data/src/main/java/processing/core/PShapeSVG.java +1466 -1475
- data/src/main/java/processing/core/PStyle.java +37 -40
- data/src/main/java/processing/core/PSurface.java +98 -103
- data/src/main/java/processing/core/PSurfaceNone.java +208 -236
- data/src/main/java/processing/core/PVector.java +961 -990
- data/src/main/java/processing/data/DoubleDict.java +709 -753
- data/src/main/java/processing/data/DoubleList.java +695 -748
- data/src/main/java/processing/data/FloatDict.java +702 -746
- data/src/main/java/processing/data/FloatList.java +697 -751
- data/src/main/java/processing/data/IntDict.java +673 -718
- data/src/main/java/processing/data/IntList.java +633 -699
- data/src/main/java/processing/data/JSONArray.java +873 -931
- data/src/main/java/processing/data/JSONObject.java +1165 -1262
- data/src/main/java/processing/data/JSONTokener.java +341 -351
- data/src/main/java/processing/data/LongDict.java +662 -707
- data/src/main/java/processing/data/LongList.java +634 -700
- data/src/main/java/processing/data/Sort.java +41 -37
- data/src/main/java/processing/data/StringDict.java +486 -522
- data/src/main/java/processing/data/StringList.java +580 -624
- data/src/main/java/processing/data/Table.java +3508 -3686
- data/src/main/java/processing/data/TableRow.java +183 -182
- data/src/main/java/processing/data/XML.java +883 -957
- data/src/main/java/processing/event/Event.java +66 -87
- data/src/main/java/processing/event/KeyEvent.java +41 -48
- data/src/main/java/processing/event/MouseEvent.java +93 -103
- data/src/main/java/processing/event/TouchEvent.java +6 -10
- data/src/main/java/processing/javafx/PGraphicsFX2D.java +5 -69
- data/src/main/java/processing/javafx/PSurfaceFX.java +2 -7
- data/src/main/java/processing/opengl/FontTexture.java +270 -290
- data/src/main/java/processing/opengl/FrameBuffer.java +363 -375
- data/src/main/java/processing/opengl/LinePath.java +500 -543
- data/src/main/java/processing/opengl/LineStroker.java +582 -593
- data/src/main/java/processing/opengl/PGL.java +2881 -2904
- data/src/main/java/processing/opengl/PGraphics2D.java +315 -408
- data/src/main/java/processing/opengl/PGraphics3D.java +72 -107
- data/src/main/java/processing/opengl/PGraphicsOpenGL.java +12043 -12230
- data/src/main/java/processing/opengl/PJOGL.java +1681 -1745
- data/src/main/java/processing/opengl/PShader.java +1257 -1260
- data/src/main/java/processing/opengl/PShapeOpenGL.java +4599 -4662
- data/src/main/java/processing/opengl/PSurfaceJOGL.java +1030 -1047
- data/src/main/java/processing/opengl/Texture.java +1397 -1462
- data/src/main/java/processing/opengl/VertexBuffer.java +55 -57
- data/src/main/resources/icon/icon-1024.png +0 -0
- data/src/main/resources/icon/icon-128.png +0 -0
- data/src/main/resources/icon/icon-16.png +0 -0
- data/src/main/resources/icon/icon-256.png +0 -0
- data/src/main/resources/icon/icon-32.png +0 -0
- data/src/main/resources/icon/icon-48.png +0 -0
- data/src/main/resources/icon/icon-512.png +0 -0
- data/src/main/resources/icon/icon-64.png +0 -0
- data/vendors/Rakefile +1 -1
- metadata +12 -8
- data/src/main/java/processing/core/ThinkDifferent.java +0 -70
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
|
2
|
-
|
|
3
1
|
/*
|
|
4
2
|
Part of the Processing project - http://processing.org
|
|
5
3
|
|
|
@@ -20,8 +18,7 @@
|
|
|
20
18
|
Public License along with this library; if not, write to the
|
|
21
19
|
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
22
20
|
Boston, MA 02111-1307 USA
|
|
23
|
-
*/
|
|
24
|
-
|
|
21
|
+
*/
|
|
25
22
|
package processing.opengl;
|
|
26
23
|
|
|
27
24
|
import processing.core.*;
|
|
@@ -33,1446 +30,1446 @@ import java.nio.IntBuffer;
|
|
|
33
30
|
import java.util.HashMap;
|
|
34
31
|
|
|
35
32
|
/**
|
|
36
|
-
* This class encapsulates a GLSL shader program, including a vertex
|
|
37
|
-
*
|
|
38
|
-
*
|
|
33
|
+
* This class encapsulates a GLSL shader program, including a vertex and a
|
|
34
|
+
* fragment shader. Based on the GLSLShader class from GLGraphics, which in turn
|
|
35
|
+
* was originally based in the code by JohnG:
|
|
39
36
|
* http://processing.org/discourse/beta/num_1159494801.html
|
|
40
37
|
*
|
|
41
38
|
* @webref rendering:shaders
|
|
42
39
|
*/
|
|
43
40
|
public class PShader implements PConstants {
|
|
44
|
-
static protected final int POINT = 0;
|
|
45
|
-
static protected final int LINE = 1;
|
|
46
|
-
static protected final int POLY = 2;
|
|
47
|
-
static protected final int COLOR = 3;
|
|
48
|
-
static protected final int LIGHT = 4;
|
|
49
|
-
static protected final int TEXTURE = 5;
|
|
50
|
-
static protected final int TEXLIGHT = 6;
|
|
51
|
-
|
|
52
|
-
static protected String pointShaderAttrRegexp =
|
|
53
|
-
"attribute *vec2 *offset";
|
|
54
|
-
static protected String pointShaderInRegexp =
|
|
55
|
-
"in *vec2 *offset;";
|
|
56
|
-
static protected String lineShaderAttrRegexp =
|
|
57
|
-
"attribute *vec4 *direction";
|
|
58
|
-
static protected String lineShaderInRegexp =
|
|
59
|
-
"in *vec4 *direction";
|
|
60
|
-
static protected String pointShaderDefRegexp =
|
|
61
|
-
"#define *PROCESSING_POINT_SHADER";
|
|
62
|
-
static protected String lineShaderDefRegexp =
|
|
63
|
-
"#define *PROCESSING_LINE_SHADER";
|
|
64
|
-
static protected String colorShaderDefRegexp =
|
|
65
|
-
"#define *PROCESSING_COLOR_SHADER";
|
|
66
|
-
static protected String lightShaderDefRegexp =
|
|
67
|
-
"#define *PROCESSING_LIGHT_SHADER";
|
|
68
|
-
static protected String texShaderDefRegexp =
|
|
69
|
-
"#define *PROCESSING_TEXTURE_SHADER";
|
|
70
|
-
static protected String texlightShaderDefRegexp =
|
|
71
|
-
"#define *PROCESSING_TEXLIGHT_SHADER";
|
|
72
|
-
static protected String polyShaderDefRegexp =
|
|
73
|
-
"#define *PROCESSING_POLYGON_SHADER";
|
|
74
|
-
static protected String triShaderAttrRegexp =
|
|
75
|
-
"#define *PROCESSING_TRIANGLES_SHADER";
|
|
76
|
-
static protected String quadShaderAttrRegexp =
|
|
77
|
-
"#define *PROCESSING_QUADS_SHADER";
|
|
78
|
-
|
|
79
|
-
protected PApplet parent;
|
|
80
|
-
// The main renderer associated to the parent PApplet.
|
|
81
|
-
//protected PGraphicsOpenGL pgMain;
|
|
82
|
-
// We need a reference to the renderer since a shader might
|
|
83
|
-
// be called by different renderers within a single application
|
|
84
|
-
// (the one corresponding to the main surface, or other offscreen
|
|
85
|
-
// renderers).
|
|
86
|
-
protected PGraphicsOpenGL primaryPG;
|
|
87
|
-
protected PGraphicsOpenGL currentPG;
|
|
88
|
-
protected PGL pgl;
|
|
89
|
-
protected int context; // The context that created this shader.
|
|
90
|
-
|
|
91
|
-
// The shader type: POINT, LINE, POLY, etc.
|
|
92
|
-
protected int type;
|
|
93
|
-
|
|
94
|
-
public int glProgram;
|
|
95
|
-
public int glVertex;
|
|
96
|
-
public int glFragment;
|
|
97
|
-
private GLResourceShader glres;
|
|
98
|
-
|
|
99
|
-
protected URL vertexURL;
|
|
100
|
-
protected URL fragmentURL;
|
|
101
|
-
|
|
102
|
-
protected String vertexFilename;
|
|
103
|
-
protected String fragmentFilename;
|
|
104
|
-
|
|
105
|
-
protected String[] vertexShaderSource;
|
|
106
|
-
protected String[] fragmentShaderSource;
|
|
107
|
-
|
|
108
|
-
protected boolean bound;
|
|
109
|
-
|
|
110
|
-
protected HashMap<String, UniformValue> uniformValues = null;
|
|
111
|
-
|
|
112
|
-
protected HashMap<Integer, Texture> textures;
|
|
113
|
-
protected HashMap<Integer, Integer> texUnits;
|
|
114
|
-
|
|
115
|
-
// Direct buffers to pass shader data to GL
|
|
116
|
-
protected IntBuffer intBuffer;
|
|
117
|
-
protected FloatBuffer floatBuffer;
|
|
118
|
-
|
|
119
|
-
protected boolean loadedAttributes = false;
|
|
120
|
-
protected boolean loadedUniforms = false;
|
|
121
|
-
|
|
122
|
-
// Uniforms common to all shader types
|
|
123
|
-
protected int transformMatLoc;
|
|
124
|
-
protected int modelviewMatLoc;
|
|
125
|
-
protected int projectionMatLoc;
|
|
126
|
-
protected int ppixelsLoc;
|
|
127
|
-
protected int ppixelsUnit;
|
|
128
|
-
protected int viewportLoc;
|
|
129
|
-
protected int resolutionLoc;
|
|
130
|
-
|
|
131
|
-
// Uniforms only for lines and points
|
|
132
|
-
protected int perspectiveLoc;
|
|
133
|
-
protected int scaleLoc;
|
|
134
|
-
|
|
135
|
-
// Lighting uniforms
|
|
136
|
-
protected int lightCountLoc;
|
|
137
|
-
protected int lightPositionLoc;
|
|
138
|
-
protected int lightNormalLoc;
|
|
139
|
-
protected int lightAmbientLoc;
|
|
140
|
-
protected int lightDiffuseLoc;
|
|
141
|
-
protected int lightSpecularLoc;
|
|
142
|
-
protected int lightFalloffLoc;
|
|
143
|
-
protected int lightSpotLoc;
|
|
144
|
-
|
|
145
|
-
// Texturing uniforms
|
|
146
|
-
protected Texture texture;
|
|
147
|
-
protected int texUnit;
|
|
148
|
-
protected int textureLoc;
|
|
149
|
-
protected int texMatrixLoc;
|
|
150
|
-
protected int texOffsetLoc;
|
|
151
|
-
protected float[] tcmat;
|
|
152
|
-
|
|
153
|
-
// Vertex attributes
|
|
154
|
-
protected int vertexLoc;
|
|
155
|
-
protected int colorLoc;
|
|
156
|
-
protected int normalLoc;
|
|
157
|
-
protected int texCoordLoc;
|
|
158
|
-
protected int normalMatLoc;
|
|
159
|
-
protected int directionLoc;
|
|
160
|
-
protected int offsetLoc;
|
|
161
|
-
protected int ambientLoc;
|
|
162
|
-
protected int specularLoc;
|
|
163
|
-
protected int emissiveLoc;
|
|
164
|
-
protected int shininessLoc;
|
|
165
|
-
|
|
166
|
-
public PShader() {
|
|
167
|
-
parent = null;
|
|
168
|
-
pgl = null;
|
|
169
|
-
context = -1;
|
|
170
|
-
|
|
171
|
-
this.vertexURL = null;
|
|
172
|
-
this.fragmentURL = null;
|
|
173
|
-
this.vertexFilename = null;
|
|
174
|
-
this.fragmentFilename = null;
|
|
175
|
-
|
|
176
|
-
glProgram = 0;
|
|
177
|
-
glVertex = 0;
|
|
178
|
-
glFragment = 0;
|
|
179
|
-
|
|
180
|
-
intBuffer = PGL.allocateIntBuffer(1);
|
|
181
|
-
floatBuffer = PGL.allocateFloatBuffer(1);
|
|
182
|
-
|
|
183
|
-
bound = false;
|
|
184
|
-
|
|
185
|
-
type = -1;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
public PShader(PApplet parent) {
|
|
190
|
-
this();
|
|
191
|
-
this.parent = parent;
|
|
192
|
-
primaryPG = (PGraphicsOpenGL)parent.g;
|
|
193
|
-
pgl = primaryPG.pgl;
|
|
194
|
-
context = pgl.createEmptyContext();
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Creates a shader program using the specified vertex and fragment
|
|
200
|
-
* shaders.
|
|
201
|
-
*
|
|
202
|
-
* @param parent the parent program
|
|
203
|
-
* @param vertFilename name of the vertex shader
|
|
204
|
-
* @param fragFilename name of the fragment shader
|
|
205
|
-
*/
|
|
206
|
-
public PShader(PApplet parent, String vertFilename, String fragFilename) {
|
|
207
|
-
this.parent = parent;
|
|
208
|
-
primaryPG = (PGraphicsOpenGL)parent.g;
|
|
209
|
-
pgl = primaryPG.pgl;
|
|
210
|
-
|
|
211
|
-
this.vertexURL = null;
|
|
212
|
-
this.fragmentURL = null;
|
|
213
|
-
this.vertexFilename = vertFilename;
|
|
214
|
-
this.fragmentFilename = fragFilename;
|
|
215
|
-
fragmentShaderSource = pgl.loadFragmentShader(fragFilename);
|
|
216
|
-
vertexShaderSource = pgl.loadVertexShader(vertFilename);
|
|
217
|
-
|
|
218
|
-
glProgram = 0;
|
|
219
|
-
glVertex = 0;
|
|
220
|
-
glFragment = 0;
|
|
221
|
-
|
|
222
|
-
intBuffer = PGL.allocateIntBuffer(1);
|
|
223
|
-
floatBuffer = PGL.allocateFloatBuffer(1);
|
|
224
|
-
|
|
225
|
-
int vertType = getShaderType(vertexShaderSource, -1);
|
|
226
|
-
int fragType = getShaderType(fragmentShaderSource, -1);
|
|
227
|
-
if (vertType == -1 && fragType == -1) {
|
|
228
|
-
type = PShader.POLY;
|
|
229
|
-
} else if (vertType == -1) {
|
|
230
|
-
type = fragType;
|
|
231
|
-
} else if (fragType == -1) {
|
|
232
|
-
type = vertType;
|
|
233
|
-
} else if (fragType == vertType) {
|
|
234
|
-
type = vertType;
|
|
235
|
-
} else {
|
|
236
|
-
PGraphics.showWarning(PGraphicsOpenGL.INCONSISTENT_SHADER_TYPES);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* @param vertURL network location of the vertex shader
|
|
243
|
-
* @param fragURL network location of the fragment shader
|
|
244
|
-
*/
|
|
245
|
-
public PShader(PApplet parent, URL vertURL, URL fragURL) {
|
|
246
|
-
this.parent = parent;
|
|
247
|
-
primaryPG = (PGraphicsOpenGL)parent.g;
|
|
248
|
-
pgl = primaryPG.pgl;
|
|
249
|
-
|
|
250
|
-
this.vertexURL = vertURL;
|
|
251
|
-
this.fragmentURL = fragURL;
|
|
252
|
-
this.vertexFilename = null;
|
|
253
|
-
this.fragmentFilename = null;
|
|
254
|
-
fragmentShaderSource = pgl.loadFragmentShader(fragURL);
|
|
255
|
-
vertexShaderSource = pgl.loadVertexShader(vertURL);
|
|
256
|
-
|
|
257
|
-
glProgram = 0;
|
|
258
|
-
glVertex = 0;
|
|
259
|
-
glFragment = 0;
|
|
260
|
-
|
|
261
|
-
intBuffer = PGL.allocateIntBuffer(1);
|
|
262
|
-
floatBuffer = PGL.allocateFloatBuffer(1);
|
|
263
|
-
|
|
264
|
-
int vertType = getShaderType(vertexShaderSource, -1);
|
|
265
|
-
int fragType = getShaderType(fragmentShaderSource, -1);
|
|
266
|
-
if (vertType == -1 && fragType == -1) {
|
|
267
|
-
type = PShader.POLY;
|
|
268
|
-
} else if (vertType == -1) {
|
|
269
|
-
type = fragType;
|
|
270
|
-
} else if (fragType == -1) {
|
|
271
|
-
type = vertType;
|
|
272
|
-
} else if (fragType == vertType) {
|
|
273
|
-
type = vertType;
|
|
274
|
-
} else {
|
|
275
|
-
PGraphics.showWarning(PGraphicsOpenGL.INCONSISTENT_SHADER_TYPES);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
public PShader(PApplet parent, String[] vertSource, String[] fragSource) {
|
|
280
|
-
this.parent = parent;
|
|
281
|
-
primaryPG = (PGraphicsOpenGL)parent.g;
|
|
282
|
-
pgl = primaryPG.pgl;
|
|
283
|
-
|
|
284
|
-
this.vertexURL = null;
|
|
285
|
-
this.fragmentURL = null;
|
|
286
|
-
this.vertexFilename = null;
|
|
287
|
-
this.fragmentFilename = null;
|
|
288
|
-
vertexShaderSource = vertSource;
|
|
289
|
-
fragmentShaderSource = fragSource;
|
|
290
|
-
|
|
291
|
-
glProgram = 0;
|
|
292
|
-
glVertex = 0;
|
|
293
|
-
glFragment = 0;
|
|
294
|
-
|
|
295
|
-
intBuffer = PGL.allocateIntBuffer(1);
|
|
296
|
-
floatBuffer = PGL.allocateFloatBuffer(1);
|
|
297
|
-
|
|
298
|
-
int vertType = getShaderType(vertexShaderSource, -1);
|
|
299
|
-
int fragType = getShaderType(fragmentShaderSource, -1);
|
|
300
|
-
if (vertType == -1 && fragType == -1) {
|
|
301
|
-
type = PShader.POLY;
|
|
302
|
-
} else if (vertType == -1) {
|
|
303
|
-
type = fragType;
|
|
304
|
-
} else if (fragType == -1) {
|
|
305
|
-
type = vertType;
|
|
306
|
-
} else if (fragType == vertType) {
|
|
307
|
-
type = vertType;
|
|
308
|
-
} else {
|
|
309
|
-
PGraphics.showWarning(PGraphicsOpenGL.INCONSISTENT_SHADER_TYPES);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
public void setVertexShader(String vertFilename) {
|
|
315
|
-
this.vertexFilename = vertFilename;
|
|
316
|
-
vertexShaderSource = pgl.loadVertexShader(vertFilename);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
public void setVertexShader(URL vertURL) {
|
|
321
|
-
this.vertexURL = vertURL;
|
|
322
|
-
vertexShaderSource = pgl.loadVertexShader(vertURL);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
public void setVertexShader(String[] vertSource) {
|
|
327
|
-
vertexShaderSource = vertSource;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
public void setFragmentShader(String fragFilename) {
|
|
332
|
-
this.fragmentFilename = fragFilename;
|
|
333
|
-
fragmentShaderSource = pgl.loadFragmentShader(fragFilename);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
public void setFragmentShader(URL fragURL) {
|
|
338
|
-
this.fragmentURL = fragURL;
|
|
339
|
-
fragmentShaderSource = pgl.loadFragmentShader(fragURL);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
public void setFragmentShader(String[] fragSource) {
|
|
343
|
-
fragmentShaderSource = fragSource;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* Initializes (if needed) and binds the shader program.
|
|
349
|
-
*/
|
|
350
|
-
public void bind() {
|
|
351
|
-
init();
|
|
352
|
-
if (!bound) {
|
|
353
|
-
pgl.useProgram(glProgram);
|
|
354
|
-
bound = true;
|
|
355
|
-
consumeUniforms();
|
|
356
|
-
bindTextures();
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
if (hasType()) bindTyped();
|
|
360
|
-
}
|
|
361
41
|
|
|
42
|
+
static protected final int POINT = 0;
|
|
43
|
+
static protected final int LINE = 1;
|
|
44
|
+
static protected final int POLY = 2;
|
|
45
|
+
static protected final int COLOR = 3;
|
|
46
|
+
static protected final int LIGHT = 4;
|
|
47
|
+
static protected final int TEXTURE = 5;
|
|
48
|
+
static protected final int TEXLIGHT = 6;
|
|
49
|
+
|
|
50
|
+
static protected String pointShaderAttrRegexp
|
|
51
|
+
= "attribute *vec2 *offset";
|
|
52
|
+
static protected String pointShaderInRegexp
|
|
53
|
+
= "in *vec2 *offset;";
|
|
54
|
+
static protected String lineShaderAttrRegexp
|
|
55
|
+
= "attribute *vec4 *direction";
|
|
56
|
+
static protected String lineShaderInRegexp
|
|
57
|
+
= "in *vec4 *direction";
|
|
58
|
+
static protected String pointShaderDefRegexp
|
|
59
|
+
= "#define *PROCESSING_POINT_SHADER";
|
|
60
|
+
static protected String lineShaderDefRegexp
|
|
61
|
+
= "#define *PROCESSING_LINE_SHADER";
|
|
62
|
+
static protected String colorShaderDefRegexp
|
|
63
|
+
= "#define *PROCESSING_COLOR_SHADER";
|
|
64
|
+
static protected String lightShaderDefRegexp
|
|
65
|
+
= "#define *PROCESSING_LIGHT_SHADER";
|
|
66
|
+
static protected String texShaderDefRegexp
|
|
67
|
+
= "#define *PROCESSING_TEXTURE_SHADER";
|
|
68
|
+
static protected String texlightShaderDefRegexp
|
|
69
|
+
= "#define *PROCESSING_TEXLIGHT_SHADER";
|
|
70
|
+
static protected String polyShaderDefRegexp
|
|
71
|
+
= "#define *PROCESSING_POLYGON_SHADER";
|
|
72
|
+
static protected String triShaderAttrRegexp
|
|
73
|
+
= "#define *PROCESSING_TRIANGLES_SHADER";
|
|
74
|
+
static protected String quadShaderAttrRegexp
|
|
75
|
+
= "#define *PROCESSING_QUADS_SHADER";
|
|
76
|
+
|
|
77
|
+
protected PApplet parent;
|
|
78
|
+
// The main renderer associated to the parent PApplet.
|
|
79
|
+
//protected PGraphicsOpenGL pgMain;
|
|
80
|
+
// We need a reference to the renderer since a shader might
|
|
81
|
+
// be called by different renderers within a single application
|
|
82
|
+
// (the one corresponding to the main surface, or other offscreen
|
|
83
|
+
// renderers).
|
|
84
|
+
protected PGraphicsOpenGL primaryPG;
|
|
85
|
+
protected PGraphicsOpenGL currentPG;
|
|
86
|
+
protected PGL pgl;
|
|
87
|
+
protected int context; // The context that created this shader.
|
|
88
|
+
|
|
89
|
+
// The shader type: POINT, LINE, POLY, etc.
|
|
90
|
+
protected int type;
|
|
91
|
+
|
|
92
|
+
public int glProgram;
|
|
93
|
+
public int glVertex;
|
|
94
|
+
public int glFragment;
|
|
95
|
+
private GLResourceShader glres;
|
|
96
|
+
|
|
97
|
+
protected URL vertexURL;
|
|
98
|
+
protected URL fragmentURL;
|
|
99
|
+
|
|
100
|
+
protected String vertexFilename;
|
|
101
|
+
protected String fragmentFilename;
|
|
102
|
+
|
|
103
|
+
protected String[] vertexShaderSource;
|
|
104
|
+
protected String[] fragmentShaderSource;
|
|
105
|
+
|
|
106
|
+
protected boolean bound;
|
|
107
|
+
|
|
108
|
+
protected HashMap<String, UniformValue> uniformValues = null;
|
|
109
|
+
|
|
110
|
+
protected HashMap<Integer, Texture> textures;
|
|
111
|
+
protected HashMap<Integer, Integer> texUnits;
|
|
112
|
+
|
|
113
|
+
// Direct buffers to pass shader data to GL
|
|
114
|
+
protected IntBuffer intBuffer;
|
|
115
|
+
protected FloatBuffer floatBuffer;
|
|
116
|
+
|
|
117
|
+
protected boolean loadedAttributes = false;
|
|
118
|
+
protected boolean loadedUniforms = false;
|
|
119
|
+
|
|
120
|
+
// Uniforms common to all shader types
|
|
121
|
+
protected int transformMatLoc;
|
|
122
|
+
protected int modelviewMatLoc;
|
|
123
|
+
protected int projectionMatLoc;
|
|
124
|
+
protected int ppixelsLoc;
|
|
125
|
+
protected int ppixelsUnit;
|
|
126
|
+
protected int viewportLoc;
|
|
127
|
+
protected int resolutionLoc;
|
|
128
|
+
|
|
129
|
+
// Uniforms only for lines and points
|
|
130
|
+
protected int perspectiveLoc;
|
|
131
|
+
protected int scaleLoc;
|
|
132
|
+
|
|
133
|
+
// Lighting uniforms
|
|
134
|
+
protected int lightCountLoc;
|
|
135
|
+
protected int lightPositionLoc;
|
|
136
|
+
protected int lightNormalLoc;
|
|
137
|
+
protected int lightAmbientLoc;
|
|
138
|
+
protected int lightDiffuseLoc;
|
|
139
|
+
protected int lightSpecularLoc;
|
|
140
|
+
protected int lightFalloffLoc;
|
|
141
|
+
protected int lightSpotLoc;
|
|
142
|
+
|
|
143
|
+
// Texturing uniforms
|
|
144
|
+
protected Texture texture;
|
|
145
|
+
protected int texUnit;
|
|
146
|
+
protected int textureLoc;
|
|
147
|
+
protected int texMatrixLoc;
|
|
148
|
+
protected int texOffsetLoc;
|
|
149
|
+
protected float[] tcmat;
|
|
150
|
+
|
|
151
|
+
// Vertex attributes
|
|
152
|
+
protected int vertexLoc;
|
|
153
|
+
protected int colorLoc;
|
|
154
|
+
protected int normalLoc;
|
|
155
|
+
protected int texCoordLoc;
|
|
156
|
+
protected int normalMatLoc;
|
|
157
|
+
protected int directionLoc;
|
|
158
|
+
protected int offsetLoc;
|
|
159
|
+
protected int ambientLoc;
|
|
160
|
+
protected int specularLoc;
|
|
161
|
+
protected int emissiveLoc;
|
|
162
|
+
protected int shininessLoc;
|
|
163
|
+
|
|
164
|
+
public PShader() {
|
|
165
|
+
parent = null;
|
|
166
|
+
pgl = null;
|
|
167
|
+
context = -1;
|
|
168
|
+
|
|
169
|
+
this.vertexURL = null;
|
|
170
|
+
this.fragmentURL = null;
|
|
171
|
+
this.vertexFilename = null;
|
|
172
|
+
this.fragmentFilename = null;
|
|
173
|
+
|
|
174
|
+
glProgram = 0;
|
|
175
|
+
glVertex = 0;
|
|
176
|
+
glFragment = 0;
|
|
177
|
+
|
|
178
|
+
intBuffer = PGL.allocateIntBuffer(1);
|
|
179
|
+
floatBuffer = PGL.allocateFloatBuffer(1);
|
|
180
|
+
|
|
181
|
+
bound = false;
|
|
182
|
+
|
|
183
|
+
type = -1;
|
|
184
|
+
}
|
|
362
185
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
if (bound) {
|
|
370
|
-
unbindTextures();
|
|
371
|
-
pgl.useProgram(0);
|
|
372
|
-
bound = false;
|
|
186
|
+
public PShader(PApplet parent) {
|
|
187
|
+
this();
|
|
188
|
+
this.parent = parent;
|
|
189
|
+
primaryPG = (PGraphicsOpenGL) parent.g;
|
|
190
|
+
pgl = primaryPG.pgl;
|
|
191
|
+
context = pgl.createEmptyContext();
|
|
373
192
|
}
|
|
374
|
-
}
|
|
375
193
|
|
|
194
|
+
/**
|
|
195
|
+
* Creates a shader program using the specified vertex and fragment shaders.
|
|
196
|
+
*
|
|
197
|
+
* @param parent the parent program
|
|
198
|
+
* @param vertFilename name of the vertex shader
|
|
199
|
+
* @param fragFilename name of the fragment shader
|
|
200
|
+
*/
|
|
201
|
+
public PShader(PApplet parent, String vertFilename, String fragFilename) {
|
|
202
|
+
this.parent = parent;
|
|
203
|
+
primaryPG = (PGraphicsOpenGL) parent.g;
|
|
204
|
+
pgl = primaryPG.pgl;
|
|
205
|
+
|
|
206
|
+
this.vertexURL = null;
|
|
207
|
+
this.fragmentURL = null;
|
|
208
|
+
this.vertexFilename = vertFilename;
|
|
209
|
+
this.fragmentFilename = fragFilename;
|
|
210
|
+
fragmentShaderSource = pgl.loadFragmentShader(fragFilename);
|
|
211
|
+
vertexShaderSource = pgl.loadVertexShader(vertFilename);
|
|
212
|
+
|
|
213
|
+
glProgram = 0;
|
|
214
|
+
glVertex = 0;
|
|
215
|
+
glFragment = 0;
|
|
216
|
+
|
|
217
|
+
intBuffer = PGL.allocateIntBuffer(1);
|
|
218
|
+
floatBuffer = PGL.allocateFloatBuffer(1);
|
|
219
|
+
|
|
220
|
+
int vertType = getShaderType(vertexShaderSource, -1);
|
|
221
|
+
int fragType = getShaderType(fragmentShaderSource, -1);
|
|
222
|
+
if (vertType == -1 && fragType == -1) {
|
|
223
|
+
type = PShader.POLY;
|
|
224
|
+
} else if (vertType == -1) {
|
|
225
|
+
type = fragType;
|
|
226
|
+
} else if (fragType == -1) {
|
|
227
|
+
type = vertType;
|
|
228
|
+
} else if (fragType == vertType) {
|
|
229
|
+
type = vertType;
|
|
230
|
+
} else {
|
|
231
|
+
PGraphics.showWarning(PGraphicsOpenGL.INCONSISTENT_SHADER_TYPES);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
376
234
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
235
|
+
/**
|
|
236
|
+
* @param vertURL network location of the vertex shader
|
|
237
|
+
* @param fragURL network location of the fragment shader
|
|
238
|
+
*/
|
|
239
|
+
public PShader(PApplet parent, URL vertURL, URL fragURL) {
|
|
240
|
+
this.parent = parent;
|
|
241
|
+
primaryPG = (PGraphicsOpenGL) parent.g;
|
|
242
|
+
pgl = primaryPG.pgl;
|
|
243
|
+
|
|
244
|
+
this.vertexURL = vertURL;
|
|
245
|
+
this.fragmentURL = fragURL;
|
|
246
|
+
this.vertexFilename = null;
|
|
247
|
+
this.fragmentFilename = null;
|
|
248
|
+
fragmentShaderSource = pgl.loadFragmentShader(fragURL);
|
|
249
|
+
vertexShaderSource = pgl.loadVertexShader(vertURL);
|
|
250
|
+
|
|
251
|
+
glProgram = 0;
|
|
252
|
+
glVertex = 0;
|
|
253
|
+
glFragment = 0;
|
|
254
|
+
|
|
255
|
+
intBuffer = PGL.allocateIntBuffer(1);
|
|
256
|
+
floatBuffer = PGL.allocateFloatBuffer(1);
|
|
257
|
+
|
|
258
|
+
int vertType = getShaderType(vertexShaderSource, -1);
|
|
259
|
+
int fragType = getShaderType(fragmentShaderSource, -1);
|
|
260
|
+
if (vertType == -1 && fragType == -1) {
|
|
261
|
+
type = PShader.POLY;
|
|
262
|
+
} else if (vertType == -1) {
|
|
263
|
+
type = fragType;
|
|
264
|
+
} else if (fragType == -1) {
|
|
265
|
+
type = vertType;
|
|
266
|
+
} else if (fragType == vertType) {
|
|
267
|
+
type = vertType;
|
|
268
|
+
} else {
|
|
269
|
+
PGraphics.showWarning(PGraphicsOpenGL.INCONSISTENT_SHADER_TYPES);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
383
272
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
273
|
+
public PShader(PApplet parent, String[] vertSource, String[] fragSource) {
|
|
274
|
+
this.parent = parent;
|
|
275
|
+
primaryPG = (PGraphicsOpenGL) parent.g;
|
|
276
|
+
pgl = primaryPG.pgl;
|
|
277
|
+
|
|
278
|
+
this.vertexURL = null;
|
|
279
|
+
this.fragmentURL = null;
|
|
280
|
+
this.vertexFilename = null;
|
|
281
|
+
this.fragmentFilename = null;
|
|
282
|
+
vertexShaderSource = vertSource;
|
|
283
|
+
fragmentShaderSource = fragSource;
|
|
284
|
+
|
|
285
|
+
glProgram = 0;
|
|
286
|
+
glVertex = 0;
|
|
287
|
+
glFragment = 0;
|
|
288
|
+
|
|
289
|
+
intBuffer = PGL.allocateIntBuffer(1);
|
|
290
|
+
floatBuffer = PGL.allocateFloatBuffer(1);
|
|
291
|
+
|
|
292
|
+
int vertType = getShaderType(vertexShaderSource, -1);
|
|
293
|
+
int fragType = getShaderType(fragmentShaderSource, -1);
|
|
294
|
+
if (vertType == -1 && fragType == -1) {
|
|
295
|
+
type = PShader.POLY;
|
|
296
|
+
} else if (vertType == -1) {
|
|
297
|
+
type = fragType;
|
|
298
|
+
} else if (fragType == -1) {
|
|
299
|
+
type = vertType;
|
|
300
|
+
} else if (fragType == vertType) {
|
|
301
|
+
type = vertType;
|
|
302
|
+
} else {
|
|
303
|
+
PGraphics.showWarning(PGraphicsOpenGL.INCONSISTENT_SHADER_TYPES);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
393
306
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
setUniformImpl(name, UniformValue.INT2, new int[] { x, y });
|
|
399
|
-
}
|
|
307
|
+
public void setVertexShader(String vertFilename) {
|
|
308
|
+
this.vertexFilename = vertFilename;
|
|
309
|
+
vertexShaderSource = pgl.loadVertexShader(vertFilename);
|
|
310
|
+
}
|
|
400
311
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
setUniformImpl(name, UniformValue.INT3, new int[] { x, y, z });
|
|
406
|
-
}
|
|
312
|
+
public void setVertexShader(URL vertURL) {
|
|
313
|
+
this.vertexURL = vertURL;
|
|
314
|
+
vertexShaderSource = pgl.loadVertexShader(vertURL);
|
|
315
|
+
}
|
|
407
316
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
public void set(String name, int x, int y, int z, int w) {
|
|
412
|
-
setUniformImpl(name, UniformValue.INT4, new int[] { x, y, z, w });
|
|
413
|
-
}
|
|
317
|
+
public void setVertexShader(String[] vertSource) {
|
|
318
|
+
vertexShaderSource = vertSource;
|
|
319
|
+
}
|
|
414
320
|
|
|
321
|
+
public void setFragmentShader(String fragFilename) {
|
|
322
|
+
this.fragmentFilename = fragFilename;
|
|
323
|
+
fragmentShaderSource = pgl.loadFragmentShader(fragFilename);
|
|
324
|
+
}
|
|
415
325
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
326
|
+
public void setFragmentShader(URL fragURL) {
|
|
327
|
+
this.fragmentURL = fragURL;
|
|
328
|
+
fragmentShaderSource = pgl.loadFragmentShader(fragURL);
|
|
329
|
+
}
|
|
419
330
|
|
|
331
|
+
public void setFragmentShader(String[] fragSource) {
|
|
332
|
+
fragmentShaderSource = fragSource;
|
|
333
|
+
}
|
|
420
334
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
335
|
+
/**
|
|
336
|
+
* Initializes (if needed) and binds the shader program.
|
|
337
|
+
*/
|
|
338
|
+
public void bind() {
|
|
339
|
+
init();
|
|
340
|
+
if (!bound) {
|
|
341
|
+
pgl.useProgram(glProgram);
|
|
342
|
+
bound = true;
|
|
343
|
+
consumeUniforms();
|
|
344
|
+
bindTextures();
|
|
345
|
+
}
|
|
424
346
|
|
|
347
|
+
if (hasType()) {
|
|
348
|
+
bindTyped();
|
|
349
|
+
}
|
|
350
|
+
}
|
|
425
351
|
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
352
|
+
/**
|
|
353
|
+
* Unbinds the shader program.
|
|
354
|
+
*/
|
|
355
|
+
public void unbind() {
|
|
356
|
+
if (hasType()) {
|
|
357
|
+
unbindTyped();
|
|
358
|
+
}
|
|
429
359
|
|
|
360
|
+
if (bound) {
|
|
361
|
+
unbindTextures();
|
|
362
|
+
pgl.useProgram(0);
|
|
363
|
+
bound = false;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
430
366
|
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
367
|
+
/**
|
|
368
|
+
* Returns true if the shader is bound, false otherwise.
|
|
369
|
+
*/
|
|
370
|
+
public boolean bound() {
|
|
371
|
+
return bound;
|
|
372
|
+
}
|
|
434
373
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
374
|
+
/**
|
|
375
|
+
* @webref rendering:shaders
|
|
376
|
+
* @brief Sets a variable within the shader
|
|
377
|
+
* @param name the name of the uniform variable to modify
|
|
378
|
+
* @param x first component of the variable to modify
|
|
379
|
+
*/
|
|
380
|
+
public void set(String name, int x) {
|
|
381
|
+
setUniformImpl(name, UniformValue.INT1, new int[]{x});
|
|
382
|
+
}
|
|
442
383
|
|
|
384
|
+
/**
|
|
385
|
+
* @param y second component of the variable to modify. The variable has to
|
|
386
|
+
* be declared with an array/vector type in the shader (i.e.: int[2], vec2)
|
|
387
|
+
*/
|
|
388
|
+
public void set(String name, int x, int y) {
|
|
389
|
+
setUniformImpl(name, UniformValue.INT2, new int[]{x, y});
|
|
390
|
+
}
|
|
443
391
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
new int[] { (x)?1:0, (y)?1:0 });
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
public void set(String name, boolean x, boolean y, boolean z) {
|
|
456
|
-
setUniformImpl(name, UniformValue.INT3,
|
|
457
|
-
new int[] { (x)?1:0, (y)?1:0, (z)?1:0 });
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
public void set(String name, boolean x, boolean y, boolean z, boolean w) {
|
|
462
|
-
setUniformImpl(name, UniformValue.INT4,
|
|
463
|
-
new int[] { (x)?1:0, (y)?1:0, (z)?1:0, (w)?1:0 });
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
public void set(String name, int[] vec) {
|
|
468
|
-
set(name, vec, 1);
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
/**
|
|
473
|
-
* @param ncoords number of coordinates per element, max 4
|
|
474
|
-
*/
|
|
475
|
-
public void set(String name, int[] vec, int ncoords) {
|
|
476
|
-
if (ncoords == 1) {
|
|
477
|
-
setUniformImpl(name, UniformValue.INT1VEC, vec);
|
|
478
|
-
} else if (ncoords == 2) {
|
|
479
|
-
setUniformImpl(name, UniformValue.INT2VEC, vec);
|
|
480
|
-
} else if (ncoords == 3) {
|
|
481
|
-
setUniformImpl(name, UniformValue.INT3VEC, vec);
|
|
482
|
-
} else if (ncoords == 4) {
|
|
483
|
-
setUniformImpl(name, UniformValue.INT4VEC, vec);
|
|
484
|
-
} else if (4 < ncoords) {
|
|
485
|
-
PGraphics.showWarning("Only up to 4 coordinates per element are " +
|
|
486
|
-
"supported.");
|
|
487
|
-
} else {
|
|
488
|
-
PGraphics.showWarning("Wrong number of coordinates: it is negative!");
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
public void set(String name, float[] vec) {
|
|
494
|
-
set(name, vec, 1);
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
public void set(String name, float[] vec, int ncoords) {
|
|
499
|
-
if (ncoords == 1) {
|
|
500
|
-
setUniformImpl(name, UniformValue.FLOAT1VEC, vec);
|
|
501
|
-
} else if (ncoords == 2) {
|
|
502
|
-
setUniformImpl(name, UniformValue.FLOAT2VEC, vec);
|
|
503
|
-
} else if (ncoords == 3) {
|
|
504
|
-
setUniformImpl(name, UniformValue.FLOAT3VEC, vec);
|
|
505
|
-
} else if (ncoords == 4) {
|
|
506
|
-
setUniformImpl(name, UniformValue.FLOAT4VEC, vec);
|
|
507
|
-
} else if (4 < ncoords) {
|
|
508
|
-
PGraphics.showWarning("Only up to 4 coordinates per element are " +
|
|
509
|
-
"supported.");
|
|
510
|
-
} else {
|
|
511
|
-
PGraphics.showWarning("Wrong number of coordinates: it is negative!");
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
public void set(String name, boolean[] vec) {
|
|
517
|
-
set(name, vec, 1);
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
public void set(String name, boolean[] boolvec, int ncoords) {
|
|
522
|
-
int[] vec = new int[boolvec.length];
|
|
523
|
-
for (int i = 0; i < boolvec.length; i++) {
|
|
524
|
-
vec[i] = (boolvec[i])?1:0;
|
|
525
|
-
}
|
|
526
|
-
set(name, vec, ncoords);
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
/**
|
|
531
|
-
* @param mat matrix of values
|
|
532
|
-
*/
|
|
533
|
-
public void set(String name, PMatrix2D mat) {
|
|
534
|
-
float[] matv = { mat.m00, mat.m01,
|
|
535
|
-
mat.m10, mat.m11 };
|
|
536
|
-
setUniformImpl(name, UniformValue.MAT2, matv);
|
|
537
|
-
}
|
|
392
|
+
/**
|
|
393
|
+
* @param z third component of the variable to modify. The variable has to
|
|
394
|
+
* be declared with an array/vector type in the shader (i.e.: int[3], vec3)
|
|
395
|
+
*/
|
|
396
|
+
public void set(String name, int x, int y, int z) {
|
|
397
|
+
setUniformImpl(name, UniformValue.INT3, new int[]{x, y, z});
|
|
398
|
+
}
|
|
538
399
|
|
|
400
|
+
/**
|
|
401
|
+
* @param w fourth component of the variable to modify. The variable has to
|
|
402
|
+
* be declared with an array/vector type in the shader (i.e.: int[4], vec4)
|
|
403
|
+
*/
|
|
404
|
+
public void set(String name, int x, int y, int z, int w) {
|
|
405
|
+
setUniformImpl(name, UniformValue.INT4, new int[]{x, y, z, w});
|
|
406
|
+
}
|
|
539
407
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
408
|
+
public void set(String name, float x) {
|
|
409
|
+
setUniformImpl(name, UniformValue.FLOAT1, new float[]{x});
|
|
410
|
+
}
|
|
543
411
|
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
*/
|
|
547
|
-
public void set(String name, PMatrix3D mat, boolean use3x3) {
|
|
548
|
-
if (use3x3) {
|
|
549
|
-
float[] matv = { mat.m00, mat.m01, mat.m02,
|
|
550
|
-
mat.m10, mat.m11, mat.m12,
|
|
551
|
-
mat.m20, mat.m21, mat.m22 };
|
|
552
|
-
setUniformImpl(name, UniformValue.MAT3, matv);
|
|
553
|
-
} else {
|
|
554
|
-
float[] matv = { mat.m00, mat.m01, mat.m02, mat.m03,
|
|
555
|
-
mat.m10, mat.m11, mat.m12, mat.m13,
|
|
556
|
-
mat.m20, mat.m21, mat.m22, mat.m23,
|
|
557
|
-
mat.m30, mat.m31, mat.m32, mat.m33 };
|
|
558
|
-
setUniformImpl(name, UniformValue.MAT4, matv);
|
|
412
|
+
public void set(String name, float x, float y) {
|
|
413
|
+
setUniformImpl(name, UniformValue.FLOAT2, new float[]{x, y});
|
|
559
414
|
}
|
|
560
|
-
}
|
|
561
415
|
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
public void set(String name, PImage tex) {
|
|
566
|
-
setUniformImpl(name, UniformValue.SAMPLER2D, tex);
|
|
567
|
-
}
|
|
416
|
+
public void set(String name, float x, float y, float z) {
|
|
417
|
+
setUniformImpl(name, UniformValue.FLOAT3, new float[]{x, y, z});
|
|
418
|
+
}
|
|
568
419
|
|
|
420
|
+
public void set(String name, float x, float y, float z, float w) {
|
|
421
|
+
setUniformImpl(name, UniformValue.FLOAT4, new float[]{x, y, z, w});
|
|
422
|
+
}
|
|
569
423
|
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
424
|
+
/**
|
|
425
|
+
* @param vec modifies all the components of an array/vector uniform
|
|
426
|
+
* variable. PVector can only be used if the type of the variable is vec3.
|
|
427
|
+
*/
|
|
428
|
+
public void set(String name, PVector vec) {
|
|
429
|
+
setUniformImpl(name, UniformValue.FLOAT3,
|
|
430
|
+
new float[]{vec.x, vec.y, vec.z});
|
|
431
|
+
}
|
|
578
432
|
|
|
433
|
+
public void set(String name, boolean x) {
|
|
434
|
+
setUniformImpl(name, UniformValue.INT1, new int[]{(x) ? 1 : 0});
|
|
435
|
+
}
|
|
579
436
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, 0);
|
|
585
|
-
}
|
|
437
|
+
public void set(String name, boolean x, boolean y) {
|
|
438
|
+
setUniformImpl(name, UniformValue.INT2,
|
|
439
|
+
new int[]{(x) ? 1 : 0, (y) ? 1 : 0});
|
|
440
|
+
}
|
|
586
441
|
|
|
442
|
+
public void set(String name, boolean x, boolean y, boolean z) {
|
|
443
|
+
setUniformImpl(name, UniformValue.INT3,
|
|
444
|
+
new int[]{(x) ? 1 : 0, (y) ? 1 : 0, (z) ? 1 : 0});
|
|
445
|
+
}
|
|
587
446
|
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
* @return int
|
|
593
|
-
*/
|
|
594
|
-
protected int getAttributeLoc(String name) {
|
|
595
|
-
init();
|
|
596
|
-
return pgl.getAttribLocation(glProgram, name);
|
|
597
|
-
}
|
|
447
|
+
public void set(String name, boolean x, boolean y, boolean z, boolean w) {
|
|
448
|
+
setUniformImpl(name, UniformValue.INT4,
|
|
449
|
+
new int[]{(x) ? 1 : 0, (y) ? 1 : 0, (z) ? 1 : 0, (w) ? 1 : 0});
|
|
450
|
+
}
|
|
598
451
|
|
|
452
|
+
public void set(String name, int[] vec) {
|
|
453
|
+
set(name, vec, 1);
|
|
454
|
+
}
|
|
599
455
|
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
456
|
+
/**
|
|
457
|
+
* @param ncoords number of coordinates per element, max 4
|
|
458
|
+
*/
|
|
459
|
+
public void set(String name, int[] vec, int ncoords) {
|
|
460
|
+
if (ncoords == 1) {
|
|
461
|
+
setUniformImpl(name, UniformValue.INT1VEC, vec);
|
|
462
|
+
} else if (ncoords == 2) {
|
|
463
|
+
setUniformImpl(name, UniformValue.INT2VEC, vec);
|
|
464
|
+
} else if (ncoords == 3) {
|
|
465
|
+
setUniformImpl(name, UniformValue.INT3VEC, vec);
|
|
466
|
+
} else if (ncoords == 4) {
|
|
467
|
+
setUniformImpl(name, UniformValue.INT4VEC, vec);
|
|
468
|
+
} else if (4 < ncoords) {
|
|
469
|
+
PGraphics.showWarning("Only up to 4 coordinates per element are "
|
|
470
|
+
+ "supported.");
|
|
471
|
+
} else {
|
|
472
|
+
PGraphics.showWarning("Wrong number of coordinates: it is negative!");
|
|
473
|
+
}
|
|
474
|
+
}
|
|
610
475
|
|
|
476
|
+
public void set(String name, float[] vec) {
|
|
477
|
+
set(name, vec, 1);
|
|
478
|
+
}
|
|
611
479
|
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
480
|
+
public void set(String name, float[] vec, int ncoords) {
|
|
481
|
+
if (ncoords == 1) {
|
|
482
|
+
setUniformImpl(name, UniformValue.FLOAT1VEC, vec);
|
|
483
|
+
} else if (ncoords == 2) {
|
|
484
|
+
setUniformImpl(name, UniformValue.FLOAT2VEC, vec);
|
|
485
|
+
} else if (ncoords == 3) {
|
|
486
|
+
setUniformImpl(name, UniformValue.FLOAT3VEC, vec);
|
|
487
|
+
} else if (ncoords == 4) {
|
|
488
|
+
setUniformImpl(name, UniformValue.FLOAT4VEC, vec);
|
|
489
|
+
} else if (4 < ncoords) {
|
|
490
|
+
PGraphics.showWarning("Only up to 4 coordinates per element are "
|
|
491
|
+
+ "supported.");
|
|
492
|
+
} else {
|
|
493
|
+
PGraphics.showWarning("Wrong number of coordinates: it is negative!");
|
|
494
|
+
}
|
|
617
495
|
}
|
|
618
|
-
}
|
|
619
496
|
|
|
497
|
+
public void set(String name, boolean[] vec) {
|
|
498
|
+
set(name, vec, 1);
|
|
499
|
+
}
|
|
620
500
|
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
501
|
+
public void set(String name, boolean[] boolvec, int ncoords) {
|
|
502
|
+
int[] vec = new int[boolvec.length];
|
|
503
|
+
for (int i = 0; i < boolvec.length; i++) {
|
|
504
|
+
vec[i] = (boolvec[i]) ? 1 : 0;
|
|
505
|
+
}
|
|
506
|
+
set(name, vec, ncoords);
|
|
624
507
|
}
|
|
625
|
-
}
|
|
626
508
|
|
|
509
|
+
/**
|
|
510
|
+
* @param mat matrix of values
|
|
511
|
+
*/
|
|
512
|
+
public void set(String name, PMatrix2D mat) {
|
|
513
|
+
float[] matv = {mat.m00, mat.m01,
|
|
514
|
+
mat.m10, mat.m11};
|
|
515
|
+
setUniformImpl(name, UniformValue.MAT2, matv);
|
|
516
|
+
}
|
|
627
517
|
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
pgl.uniform2i(loc, x, y);
|
|
518
|
+
public void set(String name, PMatrix3D mat) {
|
|
519
|
+
set(name, mat, false);
|
|
631
520
|
}
|
|
632
|
-
}
|
|
633
521
|
|
|
522
|
+
/**
|
|
523
|
+
* @param use3x3 enforces the matrix is 3 x 3
|
|
524
|
+
*/
|
|
525
|
+
public void set(String name, PMatrix3D mat, boolean use3x3) {
|
|
526
|
+
if (use3x3) {
|
|
527
|
+
float[] matv = {mat.m00, mat.m01, mat.m02,
|
|
528
|
+
mat.m10, mat.m11, mat.m12,
|
|
529
|
+
mat.m20, mat.m21, mat.m22};
|
|
530
|
+
setUniformImpl(name, UniformValue.MAT3, matv);
|
|
531
|
+
} else {
|
|
532
|
+
float[] matv = {mat.m00, mat.m01, mat.m02, mat.m03,
|
|
533
|
+
mat.m10, mat.m11, mat.m12, mat.m13,
|
|
534
|
+
mat.m20, mat.m21, mat.m22, mat.m23,
|
|
535
|
+
mat.m30, mat.m31, mat.m32, mat.m33};
|
|
536
|
+
setUniformImpl(name, UniformValue.MAT4, matv);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
634
539
|
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
540
|
+
/**
|
|
541
|
+
* @param tex sets the sampler uniform variable to read from this image
|
|
542
|
+
* texture
|
|
543
|
+
*/
|
|
544
|
+
public void set(String name, PImage tex) {
|
|
545
|
+
setUniformImpl(name, UniformValue.SAMPLER2D, tex);
|
|
638
546
|
}
|
|
639
|
-
}
|
|
640
547
|
|
|
548
|
+
/**
|
|
549
|
+
* Extra initialization method that can be used by subclasses, called after
|
|
550
|
+
* compiling and attaching the vertex and fragment shaders, and before
|
|
551
|
+
* linking the shader program.
|
|
552
|
+
*
|
|
553
|
+
*/
|
|
554
|
+
protected void setup() {
|
|
555
|
+
}
|
|
641
556
|
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
557
|
+
protected void draw(int idxId, int count, int offset) {
|
|
558
|
+
pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, idxId);
|
|
559
|
+
pgl.drawElements(PGL.TRIANGLES, count, PGL.INDEX_TYPE,
|
|
560
|
+
offset * PGL.SIZEOF_INDEX);
|
|
561
|
+
pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, 0);
|
|
645
562
|
}
|
|
646
|
-
}
|
|
647
563
|
|
|
564
|
+
/**
|
|
565
|
+
* Returns the ID location of the attribute parameter given its name.
|
|
566
|
+
*
|
|
567
|
+
* @param name String
|
|
568
|
+
* @return int
|
|
569
|
+
*/
|
|
570
|
+
protected int getAttributeLoc(String name) {
|
|
571
|
+
init();
|
|
572
|
+
return pgl.getAttribLocation(glProgram, name);
|
|
573
|
+
}
|
|
648
574
|
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
575
|
+
/**
|
|
576
|
+
* Returns the ID location of the uniform parameter given its name.
|
|
577
|
+
*
|
|
578
|
+
* @param name String
|
|
579
|
+
* @return int
|
|
580
|
+
*/
|
|
581
|
+
protected int getUniformLoc(String name) {
|
|
582
|
+
init();
|
|
583
|
+
return pgl.getUniformLocation(glProgram, name);
|
|
652
584
|
}
|
|
653
|
-
}
|
|
654
585
|
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
586
|
+
protected void setAttributeVBO(int loc, int vboId, int size, int type,
|
|
587
|
+
boolean normalized, int stride, int offset) {
|
|
588
|
+
if (-1 < loc) {
|
|
589
|
+
pgl.bindBuffer(PGL.ARRAY_BUFFER, vboId);
|
|
590
|
+
pgl.vertexAttribPointer(loc, size, type, normalized, stride, offset);
|
|
591
|
+
}
|
|
658
592
|
}
|
|
659
|
-
}
|
|
660
593
|
|
|
594
|
+
protected void setUniformValue(int loc, int x) {
|
|
595
|
+
if (-1 < loc) {
|
|
596
|
+
pgl.uniform1i(loc, x);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
661
599
|
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
600
|
+
protected void setUniformValue(int loc, int x, int y) {
|
|
601
|
+
if (-1 < loc) {
|
|
602
|
+
pgl.uniform2i(loc, x, y);
|
|
603
|
+
}
|
|
665
604
|
}
|
|
666
|
-
}
|
|
667
605
|
|
|
606
|
+
protected void setUniformValue(int loc, int x, int y, int z) {
|
|
607
|
+
if (-1 < loc) {
|
|
608
|
+
pgl.uniform3i(loc, x, y, z);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
668
611
|
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
612
|
+
protected void setUniformValue(int loc, int x, int y, int z, int w) {
|
|
613
|
+
if (-1 < loc) {
|
|
614
|
+
pgl.uniform4i(loc, x, y, z, w);
|
|
615
|
+
}
|
|
672
616
|
}
|
|
673
|
-
}
|
|
674
617
|
|
|
618
|
+
protected void setUniformValue(int loc, float x) {
|
|
619
|
+
if (-1 < loc) {
|
|
620
|
+
pgl.uniform1f(loc, x);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
675
623
|
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
updateIntBuffer(vec);
|
|
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);
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
protected void setUniformVector(int loc, float[] vec, int ncoords,
|
|
694
|
-
int length) {
|
|
695
|
-
if (-1 < loc) {
|
|
696
|
-
updateFloatBuffer(vec);
|
|
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);
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
protected void setUniformMatrix(int loc, float[] mat) {
|
|
711
|
-
if (-1 < loc) {
|
|
712
|
-
updateFloatBuffer(mat);
|
|
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);
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
protected void setUniformTex(int loc, Texture tex) {
|
|
725
|
-
if (texUnits != null) {
|
|
726
|
-
Integer unit = texUnits.get(loc);
|
|
727
|
-
if (unit != null) {
|
|
728
|
-
pgl.activeTexture(PGL.TEXTURE0 + unit);
|
|
729
|
-
tex.bind();
|
|
730
|
-
} else {
|
|
731
|
-
throw new RuntimeException("Cannot find unit for texture " + tex);
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
protected void setUniformImpl(String name, int type, Object value) {
|
|
738
|
-
if (uniformValues == null) {
|
|
739
|
-
uniformValues = new HashMap<String, UniformValue>();
|
|
740
|
-
}
|
|
741
|
-
uniformValues.put(name, new UniformValue(type, value));
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
protected void consumeUniforms() {
|
|
746
|
-
if (uniformValues != null && 0 < uniformValues.size()) {
|
|
747
|
-
int unit = 0;
|
|
748
|
-
for (String name: uniformValues.keySet()) {
|
|
749
|
-
int loc = getUniformLoc(name);
|
|
750
|
-
if (loc == -1) {
|
|
751
|
-
PGraphics.showWarning("The shader doesn't have a uniform called \"" +
|
|
752
|
-
name + "\" OR the uniform was removed during " +
|
|
753
|
-
"compilation because it was unused.");
|
|
754
|
-
continue;
|
|
755
|
-
}
|
|
756
|
-
UniformValue val = uniformValues.get(name);
|
|
757
|
-
if (val.type == UniformValue.INT1) {
|
|
758
|
-
int[] v = ((int[])val.value);
|
|
759
|
-
pgl.uniform1i(loc, v[0]);
|
|
760
|
-
} else if (val.type == UniformValue.INT2) {
|
|
761
|
-
int[] v = ((int[])val.value);
|
|
762
|
-
pgl.uniform2i(loc, v[0], v[1]);
|
|
763
|
-
} else if (val.type == UniformValue.INT3) {
|
|
764
|
-
int[] v = ((int[])val.value);
|
|
765
|
-
pgl.uniform3i(loc, v[0], v[1], v[2]);
|
|
766
|
-
} else if (val.type == UniformValue.INT4) {
|
|
767
|
-
int[] v = ((int[])val.value);
|
|
768
|
-
pgl.uniform4i(loc, v[0], v[1], v[2], v[3]);
|
|
769
|
-
} else if (val.type == UniformValue.FLOAT1) {
|
|
770
|
-
float[] v = ((float[])val.value);
|
|
771
|
-
pgl.uniform1f(loc, v[0]);
|
|
772
|
-
} else if (val.type == UniformValue.FLOAT2) {
|
|
773
|
-
float[] v = ((float[])val.value);
|
|
774
|
-
pgl.uniform2f(loc, v[0], v[1]);
|
|
775
|
-
} else if (val.type == UniformValue.FLOAT3) {
|
|
776
|
-
float[] v = ((float[])val.value);
|
|
777
|
-
pgl.uniform3f(loc, v[0], v[1], v[2]);
|
|
778
|
-
} else if (val.type == UniformValue.FLOAT4) {
|
|
779
|
-
float[] v = ((float[])val.value);
|
|
780
|
-
pgl.uniform4f(loc, v[0], v[1], v[2], v[3]);
|
|
781
|
-
} else if (val.type == UniformValue.INT1VEC) {
|
|
782
|
-
int[] v = ((int[])val.value);
|
|
783
|
-
updateIntBuffer(v);
|
|
784
|
-
pgl.uniform1iv(loc, v.length, intBuffer);
|
|
785
|
-
} else if (val.type == UniformValue.INT2VEC) {
|
|
786
|
-
int[] v = ((int[])val.value);
|
|
787
|
-
updateIntBuffer(v);
|
|
788
|
-
pgl.uniform2iv(loc, v.length / 2, intBuffer);
|
|
789
|
-
} else if (val.type == UniformValue.INT3VEC) {
|
|
790
|
-
int[] v = ((int[])val.value);
|
|
791
|
-
updateIntBuffer(v);
|
|
792
|
-
pgl.uniform3iv(loc, v.length / 3, intBuffer);
|
|
793
|
-
} else if (val.type == UniformValue.INT4VEC) {
|
|
794
|
-
int[] v = ((int[])val.value);
|
|
795
|
-
updateIntBuffer(v);
|
|
796
|
-
pgl.uniform4iv(loc, v.length / 4, intBuffer);
|
|
797
|
-
} else if (val.type == UniformValue.FLOAT1VEC) {
|
|
798
|
-
float[] v = ((float[])val.value);
|
|
799
|
-
updateFloatBuffer(v);
|
|
800
|
-
pgl.uniform1fv(loc, v.length, floatBuffer);
|
|
801
|
-
} else if (val.type == UniformValue.FLOAT2VEC) {
|
|
802
|
-
float[] v = ((float[])val.value);
|
|
803
|
-
updateFloatBuffer(v);
|
|
804
|
-
pgl.uniform2fv(loc, v.length / 2, floatBuffer);
|
|
805
|
-
} else if (val.type == UniformValue.FLOAT3VEC) {
|
|
806
|
-
float[] v = ((float[])val.value);
|
|
807
|
-
updateFloatBuffer(v);
|
|
808
|
-
pgl.uniform3fv(loc, v.length / 3, floatBuffer);
|
|
809
|
-
} else if (val.type == UniformValue.FLOAT4VEC) {
|
|
810
|
-
float[] v = ((float[])val.value);
|
|
811
|
-
updateFloatBuffer(v);
|
|
812
|
-
pgl.uniform4fv(loc, v.length / 4, floatBuffer);
|
|
813
|
-
} else if (val.type == UniformValue.MAT2) {
|
|
814
|
-
float[] v = ((float[])val.value);
|
|
815
|
-
updateFloatBuffer(v);
|
|
816
|
-
pgl.uniformMatrix2fv(loc, 1, false, floatBuffer);
|
|
817
|
-
} else if (val.type == UniformValue.MAT3) {
|
|
818
|
-
float[] v = ((float[])val.value);
|
|
819
|
-
updateFloatBuffer(v);
|
|
820
|
-
pgl.uniformMatrix3fv(loc, 1, false, floatBuffer);
|
|
821
|
-
} else if (val.type == UniformValue.MAT4) {
|
|
822
|
-
float[] v = ((float[])val.value);
|
|
823
|
-
updateFloatBuffer(v);
|
|
824
|
-
pgl.uniformMatrix4fv(loc, 1, false, floatBuffer);
|
|
825
|
-
} else if (val.type == UniformValue.SAMPLER2D) {
|
|
826
|
-
PImage img = (PImage)val.value;
|
|
827
|
-
Texture tex = currentPG.getTexture(img);
|
|
828
|
-
|
|
829
|
-
if (textures == null) textures = new HashMap<Integer, Texture>();
|
|
830
|
-
textures.put(loc, tex);
|
|
831
|
-
|
|
832
|
-
if (texUnits == null) texUnits = new HashMap<Integer, Integer>();
|
|
833
|
-
if (texUnits.containsKey(loc)) {
|
|
834
|
-
unit = texUnits.get(loc);
|
|
835
|
-
pgl.uniform1i(loc, unit);
|
|
836
|
-
} else {
|
|
837
|
-
texUnits.put(loc, unit);
|
|
838
|
-
pgl.uniform1i(loc, unit);
|
|
839
|
-
}
|
|
840
|
-
unit++;
|
|
841
|
-
}
|
|
842
|
-
}
|
|
843
|
-
uniformValues.clear();
|
|
844
|
-
}
|
|
845
|
-
}
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
protected void updateIntBuffer(int[] vec) {
|
|
849
|
-
intBuffer = PGL.updateIntBuffer(intBuffer, vec, false);
|
|
850
|
-
}
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
protected void updateFloatBuffer(float[] vec) {
|
|
854
|
-
floatBuffer = PGL.updateFloatBuffer(floatBuffer, vec, false);
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
protected void bindTextures() {
|
|
859
|
-
if (textures != null && texUnits != null) {
|
|
860
|
-
for (int loc: textures.keySet()) {
|
|
861
|
-
Texture tex = textures.get(loc);
|
|
862
|
-
Integer unit = texUnits.get(loc);
|
|
863
|
-
if (unit != null) {
|
|
864
|
-
pgl.activeTexture(PGL.TEXTURE0 + unit);
|
|
865
|
-
tex.bind();
|
|
866
|
-
} else {
|
|
867
|
-
throw new RuntimeException("Cannot find unit for texture " + tex);
|
|
624
|
+
protected void setUniformValue(int loc, float x, float y) {
|
|
625
|
+
if (-1 < loc) {
|
|
626
|
+
pgl.uniform2f(loc, x, y);
|
|
868
627
|
}
|
|
869
|
-
}
|
|
870
628
|
}
|
|
871
|
-
}
|
|
872
629
|
|
|
630
|
+
protected void setUniformValue(int loc, float x, float y, float z) {
|
|
631
|
+
if (-1 < loc) {
|
|
632
|
+
pgl.uniform3f(loc, x, y, z);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
873
635
|
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
Texture tex = textures.get(loc);
|
|
878
|
-
Integer unit = texUnits.get(loc);
|
|
879
|
-
if (unit != null) {
|
|
880
|
-
pgl.activeTexture(PGL.TEXTURE0 + unit);
|
|
881
|
-
tex.unbind();
|
|
882
|
-
} else {
|
|
883
|
-
throw new RuntimeException("Cannot find unit for texture " + tex);
|
|
636
|
+
protected void setUniformValue(int loc, float x, float y, float z, float w) {
|
|
637
|
+
if (-1 < loc) {
|
|
638
|
+
pgl.uniform4f(loc, x, y, z, w);
|
|
884
639
|
}
|
|
885
|
-
}
|
|
886
|
-
pgl.activeTexture(PGL.TEXTURE0);
|
|
887
640
|
}
|
|
888
|
-
}
|
|
889
641
|
|
|
642
|
+
protected void setUniformVector(int loc, int[] vec, int ncoords,
|
|
643
|
+
int length) {
|
|
644
|
+
if (-1 < loc) {
|
|
645
|
+
updateIntBuffer(vec);
|
|
646
|
+
if (ncoords == 1) {
|
|
647
|
+
pgl.uniform1iv(loc, length, intBuffer);
|
|
648
|
+
} else if (ncoords == 2) {
|
|
649
|
+
pgl.uniform2iv(loc, length, intBuffer);
|
|
650
|
+
} else if (ncoords == 3) {
|
|
651
|
+
pgl.uniform3iv(loc, length, intBuffer);
|
|
652
|
+
} else if (ncoords == 4) {
|
|
653
|
+
pgl.uniform3iv(loc, length, intBuffer);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
}
|
|
890
657
|
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
658
|
+
protected void setUniformVector(int loc, float[] vec, int ncoords,
|
|
659
|
+
int length) {
|
|
660
|
+
if (-1 < loc) {
|
|
661
|
+
updateFloatBuffer(vec);
|
|
662
|
+
if (ncoords == 1) {
|
|
663
|
+
pgl.uniform1fv(loc, length, floatBuffer);
|
|
664
|
+
} else if (ncoords == 2) {
|
|
665
|
+
pgl.uniform2fv(loc, length, floatBuffer);
|
|
666
|
+
} else if (ncoords == 3) {
|
|
667
|
+
pgl.uniform3fv(loc, length, floatBuffer);
|
|
668
|
+
} else if (ncoords == 4) {
|
|
669
|
+
pgl.uniform4fv(loc, length, floatBuffer);
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
}
|
|
897
673
|
|
|
898
|
-
|
|
674
|
+
protected void setUniformMatrix(int loc, float[] mat) {
|
|
675
|
+
if (-1 < loc) {
|
|
676
|
+
updateFloatBuffer(mat);
|
|
677
|
+
if (mat.length == 4) {
|
|
678
|
+
pgl.uniformMatrix2fv(loc, 1, false, floatBuffer);
|
|
679
|
+
} else if (mat.length == 9) {
|
|
680
|
+
pgl.uniformMatrix3fv(loc, 1, false, floatBuffer);
|
|
681
|
+
} else if (mat.length == 16) {
|
|
682
|
+
pgl.uniformMatrix4fv(loc, 1, false, floatBuffer);
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
}
|
|
899
686
|
|
|
900
|
-
|
|
687
|
+
protected void setUniformTex(int loc, Texture tex) {
|
|
688
|
+
if (texUnits != null) {
|
|
689
|
+
Integer unit = texUnits.get(loc);
|
|
690
|
+
if (unit != null) {
|
|
691
|
+
pgl.activeTexture(PGL.TEXTURE0 + unit);
|
|
692
|
+
tex.bind();
|
|
693
|
+
} else {
|
|
694
|
+
throw new RuntimeException("Cannot find unit for texture " + tex);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
}
|
|
901
698
|
|
|
902
|
-
|
|
903
|
-
|
|
699
|
+
protected void setUniformImpl(String name, int type, Object value) {
|
|
700
|
+
if (uniformValues == null) {
|
|
701
|
+
uniformValues = new HashMap<String, UniformValue>();
|
|
702
|
+
}
|
|
703
|
+
uniformValues.put(name, new UniformValue(type, value));
|
|
904
704
|
}
|
|
905
|
-
}
|
|
906
705
|
|
|
706
|
+
protected void consumeUniforms() {
|
|
707
|
+
if (uniformValues != null && 0 < uniformValues.size()) {
|
|
708
|
+
int unit = 0;
|
|
709
|
+
for (String name : uniformValues.keySet()) {
|
|
710
|
+
int loc = getUniformLoc(name);
|
|
711
|
+
if (loc == -1) {
|
|
712
|
+
PGraphics.showWarning("The shader doesn't have a uniform called \""
|
|
713
|
+
+ name + "\" OR the uniform was removed during "
|
|
714
|
+
+ "compilation because it was unused.");
|
|
715
|
+
continue;
|
|
716
|
+
}
|
|
717
|
+
UniformValue val = uniformValues.get(name);
|
|
718
|
+
if (val.type == UniformValue.INT1) {
|
|
719
|
+
int[] v = ((int[]) val.value);
|
|
720
|
+
pgl.uniform1i(loc, v[0]);
|
|
721
|
+
} else if (val.type == UniformValue.INT2) {
|
|
722
|
+
int[] v = ((int[]) val.value);
|
|
723
|
+
pgl.uniform2i(loc, v[0], v[1]);
|
|
724
|
+
} else if (val.type == UniformValue.INT3) {
|
|
725
|
+
int[] v = ((int[]) val.value);
|
|
726
|
+
pgl.uniform3i(loc, v[0], v[1], v[2]);
|
|
727
|
+
} else if (val.type == UniformValue.INT4) {
|
|
728
|
+
int[] v = ((int[]) val.value);
|
|
729
|
+
pgl.uniform4i(loc, v[0], v[1], v[2], v[3]);
|
|
730
|
+
} else if (val.type == UniformValue.FLOAT1) {
|
|
731
|
+
float[] v = ((float[]) val.value);
|
|
732
|
+
pgl.uniform1f(loc, v[0]);
|
|
733
|
+
} else if (val.type == UniformValue.FLOAT2) {
|
|
734
|
+
float[] v = ((float[]) val.value);
|
|
735
|
+
pgl.uniform2f(loc, v[0], v[1]);
|
|
736
|
+
} else if (val.type == UniformValue.FLOAT3) {
|
|
737
|
+
float[] v = ((float[]) val.value);
|
|
738
|
+
pgl.uniform3f(loc, v[0], v[1], v[2]);
|
|
739
|
+
} else if (val.type == UniformValue.FLOAT4) {
|
|
740
|
+
float[] v = ((float[]) val.value);
|
|
741
|
+
pgl.uniform4f(loc, v[0], v[1], v[2], v[3]);
|
|
742
|
+
} else if (val.type == UniformValue.INT1VEC) {
|
|
743
|
+
int[] v = ((int[]) val.value);
|
|
744
|
+
updateIntBuffer(v);
|
|
745
|
+
pgl.uniform1iv(loc, v.length, intBuffer);
|
|
746
|
+
} else if (val.type == UniformValue.INT2VEC) {
|
|
747
|
+
int[] v = ((int[]) val.value);
|
|
748
|
+
updateIntBuffer(v);
|
|
749
|
+
pgl.uniform2iv(loc, v.length / 2, intBuffer);
|
|
750
|
+
} else if (val.type == UniformValue.INT3VEC) {
|
|
751
|
+
int[] v = ((int[]) val.value);
|
|
752
|
+
updateIntBuffer(v);
|
|
753
|
+
pgl.uniform3iv(loc, v.length / 3, intBuffer);
|
|
754
|
+
} else if (val.type == UniformValue.INT4VEC) {
|
|
755
|
+
int[] v = ((int[]) val.value);
|
|
756
|
+
updateIntBuffer(v);
|
|
757
|
+
pgl.uniform4iv(loc, v.length / 4, intBuffer);
|
|
758
|
+
} else if (val.type == UniformValue.FLOAT1VEC) {
|
|
759
|
+
float[] v = ((float[]) val.value);
|
|
760
|
+
updateFloatBuffer(v);
|
|
761
|
+
pgl.uniform1fv(loc, v.length, floatBuffer);
|
|
762
|
+
} else if (val.type == UniformValue.FLOAT2VEC) {
|
|
763
|
+
float[] v = ((float[]) val.value);
|
|
764
|
+
updateFloatBuffer(v);
|
|
765
|
+
pgl.uniform2fv(loc, v.length / 2, floatBuffer);
|
|
766
|
+
} else if (val.type == UniformValue.FLOAT3VEC) {
|
|
767
|
+
float[] v = ((float[]) val.value);
|
|
768
|
+
updateFloatBuffer(v);
|
|
769
|
+
pgl.uniform3fv(loc, v.length / 3, floatBuffer);
|
|
770
|
+
} else if (val.type == UniformValue.FLOAT4VEC) {
|
|
771
|
+
float[] v = ((float[]) val.value);
|
|
772
|
+
updateFloatBuffer(v);
|
|
773
|
+
pgl.uniform4fv(loc, v.length / 4, floatBuffer);
|
|
774
|
+
} else if (val.type == UniformValue.MAT2) {
|
|
775
|
+
float[] v = ((float[]) val.value);
|
|
776
|
+
updateFloatBuffer(v);
|
|
777
|
+
pgl.uniformMatrix2fv(loc, 1, false, floatBuffer);
|
|
778
|
+
} else if (val.type == UniformValue.MAT3) {
|
|
779
|
+
float[] v = ((float[]) val.value);
|
|
780
|
+
updateFloatBuffer(v);
|
|
781
|
+
pgl.uniformMatrix3fv(loc, 1, false, floatBuffer);
|
|
782
|
+
} else if (val.type == UniformValue.MAT4) {
|
|
783
|
+
float[] v = ((float[]) val.value);
|
|
784
|
+
updateFloatBuffer(v);
|
|
785
|
+
pgl.uniformMatrix4fv(loc, 1, false, floatBuffer);
|
|
786
|
+
} else if (val.type == UniformValue.SAMPLER2D) {
|
|
787
|
+
PImage img = (PImage) val.value;
|
|
788
|
+
Texture tex = currentPG.getTexture(img);
|
|
789
|
+
|
|
790
|
+
if (textures == null) {
|
|
791
|
+
textures = new HashMap<Integer, Texture>();
|
|
792
|
+
}
|
|
793
|
+
textures.put(loc, tex);
|
|
794
|
+
|
|
795
|
+
if (texUnits == null) {
|
|
796
|
+
texUnits = new HashMap<Integer, Integer>();
|
|
797
|
+
}
|
|
798
|
+
if (texUnits.containsKey(loc)) {
|
|
799
|
+
unit = texUnits.get(loc);
|
|
800
|
+
pgl.uniform1i(loc, unit);
|
|
801
|
+
} else {
|
|
802
|
+
texUnits.put(loc, unit);
|
|
803
|
+
pgl.uniform1i(loc, unit);
|
|
804
|
+
}
|
|
805
|
+
unit++;
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
uniformValues.clear();
|
|
809
|
+
}
|
|
810
|
+
}
|
|
907
811
|
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
}
|
|
812
|
+
protected void updateIntBuffer(int[] vec) {
|
|
813
|
+
intBuffer = PGL.updateIntBuffer(intBuffer, vec, false);
|
|
814
|
+
}
|
|
912
815
|
|
|
816
|
+
protected void updateFloatBuffer(float[] vec) {
|
|
817
|
+
floatBuffer = PGL.updateFloatBuffer(floatBuffer, vec, false);
|
|
818
|
+
}
|
|
913
819
|
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
820
|
+
protected void bindTextures() {
|
|
821
|
+
if (textures != null && texUnits != null) {
|
|
822
|
+
for (int loc : textures.keySet()) {
|
|
823
|
+
Texture tex = textures.get(loc);
|
|
824
|
+
Integer unit = texUnits.get(loc);
|
|
825
|
+
if (unit != null) {
|
|
826
|
+
pgl.activeTexture(PGL.TEXTURE0 + unit);
|
|
827
|
+
tex.bind();
|
|
828
|
+
} else {
|
|
829
|
+
throw new RuntimeException("Cannot find unit for texture " + tex);
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
}
|
|
920
833
|
}
|
|
921
834
|
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
835
|
+
protected void unbindTextures() {
|
|
836
|
+
if (textures != null && texUnits != null) {
|
|
837
|
+
for (int loc : textures.keySet()) {
|
|
838
|
+
Texture tex = textures.get(loc);
|
|
839
|
+
Integer unit = texUnits.get(loc);
|
|
840
|
+
if (unit != null) {
|
|
841
|
+
pgl.activeTexture(PGL.TEXTURE0 + unit);
|
|
842
|
+
tex.unbind();
|
|
843
|
+
} else {
|
|
844
|
+
throw new RuntimeException("Cannot find unit for texture " + tex);
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
pgl.activeTexture(PGL.TEXTURE0);
|
|
848
|
+
}
|
|
927
849
|
}
|
|
928
850
|
|
|
929
|
-
|
|
930
|
-
|
|
851
|
+
public void init() {
|
|
852
|
+
if (glProgram == 0 || contextIsOutdated()) {
|
|
853
|
+
create();
|
|
854
|
+
if (compile()) {
|
|
855
|
+
pgl.attachShader(glProgram, glVertex);
|
|
856
|
+
pgl.attachShader(glProgram, glFragment);
|
|
931
857
|
|
|
858
|
+
setup();
|
|
932
859
|
|
|
933
|
-
|
|
934
|
-
pgl.getProgramiv(glProgram, PGL.LINK_STATUS, intBuffer);
|
|
935
|
-
boolean linked = intBuffer.get(0) == 0 ? false : true;
|
|
936
|
-
if (!linked) {
|
|
937
|
-
PGraphics.showException("Cannot link shader program:\n" +
|
|
938
|
-
pgl.getProgramInfoLog(glProgram));
|
|
939
|
-
}
|
|
860
|
+
pgl.linkProgram(glProgram);
|
|
940
861
|
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
if (!validated) {
|
|
945
|
-
PGraphics.showException("Cannot validate shader program:\n" +
|
|
946
|
-
pgl.getProgramInfoLog(glProgram));
|
|
862
|
+
validate();
|
|
863
|
+
}
|
|
864
|
+
}
|
|
947
865
|
}
|
|
948
|
-
}
|
|
949
|
-
|
|
950
866
|
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
dispose();
|
|
867
|
+
protected void create() {
|
|
868
|
+
context = pgl.getCurrentContext();
|
|
869
|
+
glres = new GLResourceShader(this);
|
|
955
870
|
}
|
|
956
|
-
return outdated;
|
|
957
|
-
}
|
|
958
871
|
|
|
872
|
+
protected boolean compile() {
|
|
873
|
+
boolean vertRes = true;
|
|
874
|
+
if (hasVertexShader()) {
|
|
875
|
+
vertRes = compileVertexShader();
|
|
876
|
+
} else {
|
|
877
|
+
PGraphics.showException("Doesn't have a vertex shader");
|
|
878
|
+
}
|
|
959
879
|
|
|
880
|
+
boolean fragRes = true;
|
|
881
|
+
if (hasFragmentShader()) {
|
|
882
|
+
fragRes = compileFragmentShader();
|
|
883
|
+
} else {
|
|
884
|
+
PGraphics.showException("Doesn't have a fragment shader");
|
|
885
|
+
}
|
|
960
886
|
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
}
|
|
887
|
+
return vertRes && fragRes;
|
|
888
|
+
}
|
|
964
889
|
|
|
890
|
+
protected void validate() {
|
|
891
|
+
pgl.getProgramiv(glProgram, PGL.LINK_STATUS, intBuffer);
|
|
892
|
+
boolean linked = intBuffer.get(0) == 0 ? false : true;
|
|
893
|
+
if (!linked) {
|
|
894
|
+
PGraphics.showException("Cannot link shader program:\n"
|
|
895
|
+
+ pgl.getProgramInfoLog(glProgram));
|
|
896
|
+
}
|
|
965
897
|
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
898
|
+
pgl.validateProgram(glProgram);
|
|
899
|
+
pgl.getProgramiv(glProgram, PGL.VALIDATE_STATUS, intBuffer);
|
|
900
|
+
boolean validated = intBuffer.get(0) == 0 ? false : true;
|
|
901
|
+
if (!validated) {
|
|
902
|
+
PGraphics.showException("Cannot validate shader program:\n"
|
|
903
|
+
+ pgl.getProgramInfoLog(glProgram));
|
|
904
|
+
}
|
|
905
|
+
}
|
|
969
906
|
|
|
907
|
+
protected boolean contextIsOutdated() {
|
|
908
|
+
boolean outdated = !pgl.contextIsCurrent(context);
|
|
909
|
+
if (outdated) {
|
|
910
|
+
dispose();
|
|
911
|
+
}
|
|
912
|
+
return outdated;
|
|
913
|
+
}
|
|
970
914
|
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
protected boolean compileVertexShader() {
|
|
975
|
-
pgl.shaderSource(glVertex, PApplet.join(vertexShaderSource, "\n"));
|
|
976
|
-
pgl.compileShader(glVertex);
|
|
915
|
+
protected boolean hasVertexShader() {
|
|
916
|
+
return vertexShaderSource != null && 0 < vertexShaderSource.length;
|
|
917
|
+
}
|
|
977
918
|
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
if (!compiled) {
|
|
981
|
-
PGraphics.showException("Cannot compile vertex shader:\n" +
|
|
982
|
-
pgl.getShaderInfoLog(glVertex));
|
|
983
|
-
return false;
|
|
984
|
-
} else {
|
|
985
|
-
return true;
|
|
919
|
+
protected boolean hasFragmentShader() {
|
|
920
|
+
return fragmentShaderSource != null && 0 < fragmentShaderSource.length;
|
|
986
921
|
}
|
|
987
|
-
}
|
|
988
922
|
|
|
923
|
+
/**
|
|
924
|
+
* @param shaderSource a string containing the shader's code
|
|
925
|
+
*/
|
|
926
|
+
protected boolean compileVertexShader() {
|
|
927
|
+
pgl.shaderSource(glVertex, PApplet.join(vertexShaderSource, "\n"));
|
|
928
|
+
pgl.compileShader(glVertex);
|
|
929
|
+
|
|
930
|
+
pgl.getShaderiv(glVertex, PGL.COMPILE_STATUS, intBuffer);
|
|
931
|
+
boolean compiled = intBuffer.get(0) == 0 ? false : true;
|
|
932
|
+
if (!compiled) {
|
|
933
|
+
PGraphics.showException("Cannot compile vertex shader:\n"
|
|
934
|
+
+ pgl.getShaderInfoLog(glVertex));
|
|
935
|
+
return false;
|
|
936
|
+
} else {
|
|
937
|
+
return true;
|
|
938
|
+
}
|
|
939
|
+
}
|
|
989
940
|
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
941
|
+
/**
|
|
942
|
+
* @param shaderSource a string containing the shader's code
|
|
943
|
+
*/
|
|
944
|
+
protected boolean compileFragmentShader() {
|
|
945
|
+
pgl.shaderSource(glFragment, PApplet.join(fragmentShaderSource, "\n"));
|
|
946
|
+
pgl.compileShader(glFragment);
|
|
947
|
+
|
|
948
|
+
pgl.getShaderiv(glFragment, PGL.COMPILE_STATUS, intBuffer);
|
|
949
|
+
boolean compiled = intBuffer.get(0) == 0 ? false : true;
|
|
950
|
+
if (!compiled) {
|
|
951
|
+
PGraphics.showException("Cannot compile fragment shader:\n"
|
|
952
|
+
+ pgl.getShaderInfoLog(glFragment));
|
|
953
|
+
return false;
|
|
954
|
+
} else {
|
|
955
|
+
return true;
|
|
956
|
+
}
|
|
957
|
+
}
|
|
996
958
|
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
959
|
+
protected void dispose() {
|
|
960
|
+
if (glres != null) {
|
|
961
|
+
glres.dispose();
|
|
962
|
+
glVertex = 0;
|
|
963
|
+
glFragment = 0;
|
|
964
|
+
glProgram = 0;
|
|
965
|
+
glres = null;
|
|
966
|
+
}
|
|
1005
967
|
}
|
|
1006
|
-
}
|
|
1007
968
|
|
|
969
|
+
static protected int getShaderType(String[] source, int defaultType) {
|
|
970
|
+
for (int i = 0; i < source.length; i++) {
|
|
971
|
+
String line = source[i].trim();
|
|
972
|
+
|
|
973
|
+
if (PApplet.match(line, colorShaderDefRegexp) != null) {
|
|
974
|
+
return PShader.COLOR;
|
|
975
|
+
} else if (PApplet.match(line, lightShaderDefRegexp) != null) {
|
|
976
|
+
return PShader.LIGHT;
|
|
977
|
+
} else if (PApplet.match(line, texShaderDefRegexp) != null) {
|
|
978
|
+
return PShader.TEXTURE;
|
|
979
|
+
} else if (PApplet.match(line, texlightShaderDefRegexp) != null) {
|
|
980
|
+
return PShader.TEXLIGHT;
|
|
981
|
+
} else if (PApplet.match(line, polyShaderDefRegexp) != null) {
|
|
982
|
+
return PShader.POLY;
|
|
983
|
+
} else if (PApplet.match(line, triShaderAttrRegexp) != null) {
|
|
984
|
+
return PShader.POLY;
|
|
985
|
+
} else if (PApplet.match(line, quadShaderAttrRegexp) != null) {
|
|
986
|
+
return PShader.POLY;
|
|
987
|
+
} else if (PApplet.match(line, pointShaderDefRegexp) != null) {
|
|
988
|
+
return PShader.POINT;
|
|
989
|
+
} else if (PApplet.match(line, lineShaderDefRegexp) != null) {
|
|
990
|
+
return PShader.LINE;
|
|
991
|
+
} else if (PApplet.match(line, pointShaderAttrRegexp) != null) {
|
|
992
|
+
return PShader.POINT;
|
|
993
|
+
} else if (PApplet.match(line, pointShaderInRegexp) != null) {
|
|
994
|
+
return PShader.POINT;
|
|
995
|
+
} else if (PApplet.match(line, lineShaderAttrRegexp) != null) {
|
|
996
|
+
return PShader.LINE;
|
|
997
|
+
} else if (PApplet.match(line, lineShaderInRegexp) != null) {
|
|
998
|
+
return PShader.LINE;
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
return defaultType;
|
|
1002
|
+
}
|
|
1008
1003
|
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
glProgram = 0;
|
|
1015
|
-
glres = null;
|
|
1004
|
+
// ***************************************************************************
|
|
1005
|
+
//
|
|
1006
|
+
// Processing specific
|
|
1007
|
+
protected int getType() {
|
|
1008
|
+
return type;
|
|
1016
1009
|
}
|
|
1017
|
-
}
|
|
1018
1010
|
|
|
1011
|
+
protected void setType(int type) {
|
|
1012
|
+
this.type = type;
|
|
1013
|
+
}
|
|
1019
1014
|
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1015
|
+
protected boolean hasType() {
|
|
1016
|
+
return POINT <= type && type <= TEXLIGHT;
|
|
1017
|
+
}
|
|
1023
1018
|
|
|
1024
|
-
|
|
1025
|
-
return
|
|
1026
|
-
else if (PApplet.match(line, lightShaderDefRegexp) != null)
|
|
1027
|
-
return PShader.LIGHT;
|
|
1028
|
-
else if (PApplet.match(line, texShaderDefRegexp) != null)
|
|
1029
|
-
return PShader.TEXTURE;
|
|
1030
|
-
else if (PApplet.match(line, texlightShaderDefRegexp) != null)
|
|
1031
|
-
return PShader.TEXLIGHT;
|
|
1032
|
-
else if (PApplet.match(line, polyShaderDefRegexp) != null)
|
|
1033
|
-
return PShader.POLY;
|
|
1034
|
-
else if (PApplet.match(line, triShaderAttrRegexp) != null)
|
|
1035
|
-
return PShader.POLY;
|
|
1036
|
-
else if (PApplet.match(line, quadShaderAttrRegexp) != null)
|
|
1037
|
-
return PShader.POLY;
|
|
1038
|
-
else if (PApplet.match(line, pointShaderDefRegexp) != null)
|
|
1039
|
-
return PShader.POINT;
|
|
1040
|
-
else if (PApplet.match(line, lineShaderDefRegexp) != null)
|
|
1041
|
-
return PShader.LINE;
|
|
1042
|
-
else if (PApplet.match(line, pointShaderAttrRegexp) != null)
|
|
1043
|
-
return PShader.POINT;
|
|
1044
|
-
else if (PApplet.match(line, pointShaderInRegexp) != null)
|
|
1045
|
-
return PShader.POINT;
|
|
1046
|
-
else if (PApplet.match(line, lineShaderAttrRegexp) != null)
|
|
1047
|
-
return PShader.LINE;
|
|
1048
|
-
else if (PApplet.match(line, lineShaderInRegexp) != null)
|
|
1049
|
-
return PShader.LINE;
|
|
1019
|
+
protected boolean isPointShader() {
|
|
1020
|
+
return type == POINT;
|
|
1050
1021
|
}
|
|
1051
|
-
return defaultType;
|
|
1052
|
-
}
|
|
1053
1022
|
|
|
1023
|
+
protected boolean isLineShader() {
|
|
1024
|
+
return type == LINE;
|
|
1025
|
+
}
|
|
1054
1026
|
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1027
|
+
protected boolean isPolyShader() {
|
|
1028
|
+
return POLY <= type && type <= TEXLIGHT;
|
|
1029
|
+
}
|
|
1058
1030
|
|
|
1031
|
+
protected boolean checkPolyType(int type) {
|
|
1032
|
+
if (getType() == PShader.POLY) {
|
|
1033
|
+
return true;
|
|
1034
|
+
}
|
|
1059
1035
|
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1036
|
+
if (getType() != type) {
|
|
1037
|
+
if (type == TEXLIGHT) {
|
|
1038
|
+
PGraphics.showWarning(PGraphicsOpenGL.NO_TEXLIGHT_SHADER_ERROR);
|
|
1039
|
+
} else if (type == LIGHT) {
|
|
1040
|
+
PGraphics.showWarning(PGraphicsOpenGL.NO_LIGHT_SHADER_ERROR);
|
|
1041
|
+
} else if (type == TEXTURE) {
|
|
1042
|
+
PGraphics.showWarning(PGraphicsOpenGL.NO_TEXTURE_SHADER_ERROR);
|
|
1043
|
+
} else if (type == COLOR) {
|
|
1044
|
+
PGraphics.showWarning(PGraphicsOpenGL.NO_COLOR_SHADER_ERROR);
|
|
1045
|
+
}
|
|
1046
|
+
return false;
|
|
1047
|
+
}
|
|
1063
1048
|
|
|
1049
|
+
return true;
|
|
1050
|
+
}
|
|
1064
1051
|
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1052
|
+
protected int getLastTexUnit() {
|
|
1053
|
+
return texUnits == null ? -1 : texUnits.size() - 1;
|
|
1054
|
+
}
|
|
1068
1055
|
|
|
1056
|
+
protected void setRenderer(PGraphicsOpenGL pg) {
|
|
1057
|
+
this.currentPG = pg;
|
|
1058
|
+
}
|
|
1069
1059
|
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1060
|
+
protected void loadAttributes() {
|
|
1061
|
+
if (loadedAttributes) {
|
|
1062
|
+
return;
|
|
1063
|
+
}
|
|
1073
1064
|
|
|
1065
|
+
vertexLoc = getAttributeLoc("vertex");
|
|
1066
|
+
if (vertexLoc == -1) {
|
|
1067
|
+
vertexLoc = getAttributeLoc("position");
|
|
1068
|
+
}
|
|
1074
1069
|
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1070
|
+
colorLoc = getAttributeLoc("color");
|
|
1071
|
+
texCoordLoc = getAttributeLoc("texCoord");
|
|
1072
|
+
normalLoc = getAttributeLoc("normal");
|
|
1078
1073
|
|
|
1074
|
+
ambientLoc = getAttributeLoc("ambient");
|
|
1075
|
+
specularLoc = getAttributeLoc("specular");
|
|
1076
|
+
emissiveLoc = getAttributeLoc("emissive");
|
|
1077
|
+
shininessLoc = getAttributeLoc("shininess");
|
|
1079
1078
|
|
|
1080
|
-
|
|
1081
|
-
return type == LINE;
|
|
1082
|
-
}
|
|
1079
|
+
directionLoc = getAttributeLoc("direction");
|
|
1083
1080
|
|
|
1081
|
+
offsetLoc = getAttributeLoc("offset");
|
|
1084
1082
|
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
}
|
|
1083
|
+
directionLoc = getAttributeLoc("direction");
|
|
1084
|
+
offsetLoc = getAttributeLoc("offset");
|
|
1088
1085
|
|
|
1086
|
+
loadedAttributes = true;
|
|
1087
|
+
}
|
|
1089
1088
|
|
|
1090
|
-
|
|
1091
|
-
|
|
1089
|
+
protected void loadUniforms() {
|
|
1090
|
+
if (loadedUniforms) {
|
|
1091
|
+
return;
|
|
1092
|
+
}
|
|
1093
|
+
transformMatLoc = getUniformLoc("transform");
|
|
1094
|
+
if (transformMatLoc == -1) {
|
|
1095
|
+
transformMatLoc = getUniformLoc("transformMatrix");
|
|
1096
|
+
}
|
|
1092
1097
|
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
PGraphics.showWarning(PGraphicsOpenGL.NO_LIGHT_SHADER_ERROR);
|
|
1098
|
-
} else if (type == TEXTURE) {
|
|
1099
|
-
PGraphics.showWarning(PGraphicsOpenGL.NO_TEXTURE_SHADER_ERROR);
|
|
1100
|
-
} else if (type == COLOR) {
|
|
1101
|
-
PGraphics.showWarning(PGraphicsOpenGL.NO_COLOR_SHADER_ERROR);
|
|
1102
|
-
}
|
|
1103
|
-
return false;
|
|
1104
|
-
}
|
|
1098
|
+
modelviewMatLoc = getUniformLoc("modelview");
|
|
1099
|
+
if (modelviewMatLoc == -1) {
|
|
1100
|
+
modelviewMatLoc = getUniformLoc("modelviewMatrix");
|
|
1101
|
+
}
|
|
1105
1102
|
|
|
1106
|
-
|
|
1107
|
-
|
|
1103
|
+
projectionMatLoc = getUniformLoc("projection");
|
|
1104
|
+
if (projectionMatLoc == -1) {
|
|
1105
|
+
projectionMatLoc = getUniformLoc("projectionMatrix");
|
|
1106
|
+
}
|
|
1108
1107
|
|
|
1108
|
+
viewportLoc = getUniformLoc("viewport");
|
|
1109
|
+
resolutionLoc = getUniformLoc("resolution");
|
|
1110
|
+
ppixelsLoc = getUniformLoc("ppixels");
|
|
1109
1111
|
|
|
1110
|
-
|
|
1111
|
-
return texUnits == null ? -1 : texUnits.size() - 1;
|
|
1112
|
-
}
|
|
1112
|
+
normalMatLoc = getUniformLoc("normalMatrix");
|
|
1113
1113
|
|
|
1114
|
+
lightCountLoc = getUniformLoc("lightCount");
|
|
1115
|
+
lightPositionLoc = getUniformLoc("lightPosition");
|
|
1116
|
+
lightNormalLoc = getUniformLoc("lightNormal");
|
|
1117
|
+
lightAmbientLoc = getUniformLoc("lightAmbient");
|
|
1118
|
+
lightDiffuseLoc = getUniformLoc("lightDiffuse");
|
|
1119
|
+
lightSpecularLoc = getUniformLoc("lightSpecular");
|
|
1120
|
+
lightFalloffLoc = getUniformLoc("lightFalloff");
|
|
1121
|
+
lightSpotLoc = getUniformLoc("lightSpot");
|
|
1114
1122
|
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1123
|
+
textureLoc = getUniformLoc("texture");
|
|
1124
|
+
if (textureLoc == -1) {
|
|
1125
|
+
textureLoc = getUniformLoc("texMap");
|
|
1126
|
+
}
|
|
1118
1127
|
|
|
1128
|
+
texMatrixLoc = getUniformLoc("texMatrix");
|
|
1129
|
+
texOffsetLoc = getUniformLoc("texOffset");
|
|
1119
1130
|
|
|
1120
|
-
|
|
1121
|
-
|
|
1131
|
+
perspectiveLoc = getUniformLoc("perspective");
|
|
1132
|
+
scaleLoc = getUniformLoc("scale");
|
|
1133
|
+
loadedUniforms = true;
|
|
1134
|
+
}
|
|
1122
1135
|
|
|
1123
|
-
|
|
1124
|
-
|
|
1136
|
+
protected void setCommonUniforms() {
|
|
1137
|
+
if (-1 < transformMatLoc) {
|
|
1138
|
+
currentPG.updateGLProjmodelview();
|
|
1139
|
+
setUniformMatrix(transformMatLoc, currentPG.glProjmodelview);
|
|
1140
|
+
}
|
|
1125
1141
|
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1142
|
+
if (-1 < modelviewMatLoc) {
|
|
1143
|
+
currentPG.updateGLModelview();
|
|
1144
|
+
setUniformMatrix(modelviewMatLoc, currentPG.glModelview);
|
|
1145
|
+
}
|
|
1129
1146
|
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1147
|
+
if (-1 < projectionMatLoc) {
|
|
1148
|
+
currentPG.updateGLProjection();
|
|
1149
|
+
setUniformMatrix(projectionMatLoc, currentPG.glProjection);
|
|
1150
|
+
}
|
|
1134
1151
|
|
|
1135
|
-
|
|
1152
|
+
if (-1 < viewportLoc) {
|
|
1153
|
+
float x = currentPG.viewport.get(0);
|
|
1154
|
+
float y = currentPG.viewport.get(1);
|
|
1155
|
+
float w = currentPG.viewport.get(2);
|
|
1156
|
+
float h = currentPG.viewport.get(3);
|
|
1157
|
+
setUniformValue(viewportLoc, x, y, w, h);
|
|
1158
|
+
}
|
|
1136
1159
|
|
|
1137
|
-
|
|
1160
|
+
if (-1 < resolutionLoc) {
|
|
1161
|
+
float w = currentPG.viewport.get(2);
|
|
1162
|
+
float h = currentPG.viewport.get(3);
|
|
1163
|
+
setUniformValue(resolutionLoc, w, h);
|
|
1164
|
+
}
|
|
1138
1165
|
|
|
1139
|
-
|
|
1140
|
-
|
|
1166
|
+
if (-1 < ppixelsLoc) {
|
|
1167
|
+
ppixelsUnit = getLastTexUnit() + 1;
|
|
1168
|
+
setUniformValue(ppixelsLoc, ppixelsUnit);
|
|
1169
|
+
pgl.activeTexture(PGL.TEXTURE0 + ppixelsUnit);
|
|
1170
|
+
currentPG.bindFrontTexture();
|
|
1171
|
+
} else {
|
|
1172
|
+
ppixelsUnit = -1;
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1141
1175
|
|
|
1142
|
-
|
|
1143
|
-
|
|
1176
|
+
protected void bindTyped() {
|
|
1177
|
+
if (currentPG == null) {
|
|
1178
|
+
setRenderer(primaryPG.getCurrentPG());
|
|
1179
|
+
loadAttributes();
|
|
1180
|
+
loadUniforms();
|
|
1181
|
+
}
|
|
1182
|
+
setCommonUniforms();
|
|
1144
1183
|
|
|
1184
|
+
if (-1 < vertexLoc) {
|
|
1185
|
+
pgl.enableVertexAttribArray(vertexLoc);
|
|
1186
|
+
}
|
|
1187
|
+
if (-1 < colorLoc) {
|
|
1188
|
+
pgl.enableVertexAttribArray(colorLoc);
|
|
1189
|
+
}
|
|
1190
|
+
if (-1 < texCoordLoc) {
|
|
1191
|
+
pgl.enableVertexAttribArray(texCoordLoc);
|
|
1192
|
+
}
|
|
1193
|
+
if (-1 < normalLoc) {
|
|
1194
|
+
pgl.enableVertexAttribArray(normalLoc);
|
|
1195
|
+
}
|
|
1145
1196
|
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
transformMatLoc = getUniformLoc("transformMatrix");
|
|
1197
|
+
if (-1 < normalMatLoc) {
|
|
1198
|
+
currentPG.updateGLNormal();
|
|
1199
|
+
setUniformMatrix(normalMatLoc, currentPG.glNormal);
|
|
1200
|
+
}
|
|
1151
1201
|
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1202
|
+
if (-1 < ambientLoc) {
|
|
1203
|
+
pgl.enableVertexAttribArray(ambientLoc);
|
|
1204
|
+
}
|
|
1205
|
+
if (-1 < specularLoc) {
|
|
1206
|
+
pgl.enableVertexAttribArray(specularLoc);
|
|
1207
|
+
}
|
|
1208
|
+
if (-1 < emissiveLoc) {
|
|
1209
|
+
pgl.enableVertexAttribArray(emissiveLoc);
|
|
1210
|
+
}
|
|
1211
|
+
if (-1 < shininessLoc) {
|
|
1212
|
+
pgl.enableVertexAttribArray(shininessLoc);
|
|
1213
|
+
}
|
|
1155
1214
|
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1215
|
+
int count = currentPG.lightCount;
|
|
1216
|
+
setUniformValue(lightCountLoc, count);
|
|
1217
|
+
if (0 < count) {
|
|
1218
|
+
setUniformVector(lightPositionLoc, currentPG.lightPosition, 4, count);
|
|
1219
|
+
setUniformVector(lightNormalLoc, currentPG.lightNormal, 3, count);
|
|
1220
|
+
setUniformVector(lightAmbientLoc, currentPG.lightAmbient, 3, count);
|
|
1221
|
+
setUniformVector(lightDiffuseLoc, currentPG.lightDiffuse, 3, count);
|
|
1222
|
+
setUniformVector(lightSpecularLoc, currentPG.lightSpecular, 3, count);
|
|
1223
|
+
setUniformVector(lightFalloffLoc, currentPG.lightFalloffCoefficients,
|
|
1224
|
+
3, count);
|
|
1225
|
+
setUniformVector(lightSpotLoc, currentPG.lightSpotParameters, 2, count);
|
|
1226
|
+
}
|
|
1159
1227
|
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1228
|
+
if (-1 < directionLoc) {
|
|
1229
|
+
pgl.enableVertexAttribArray(directionLoc);
|
|
1230
|
+
}
|
|
1163
1231
|
|
|
1164
|
-
|
|
1232
|
+
if (-1 < offsetLoc) {
|
|
1233
|
+
pgl.enableVertexAttribArray(offsetLoc);
|
|
1234
|
+
}
|
|
1165
1235
|
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1236
|
+
if (-1 < perspectiveLoc) {
|
|
1237
|
+
if (currentPG.getHint(ENABLE_STROKE_PERSPECTIVE)
|
|
1238
|
+
&& currentPG.nonOrthoProjection()) {
|
|
1239
|
+
setUniformValue(perspectiveLoc, 1);
|
|
1240
|
+
} else {
|
|
1241
|
+
setUniformValue(perspectiveLoc, 0);
|
|
1242
|
+
}
|
|
1243
|
+
}
|
|
1174
1244
|
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1245
|
+
if (-1 < scaleLoc) {
|
|
1246
|
+
if (currentPG.getHint(DISABLE_OPTIMIZED_STROKE)) {
|
|
1247
|
+
setUniformValue(scaleLoc, 1.0f, 1.0f, 1.0f);
|
|
1248
|
+
} else {
|
|
1249
|
+
float f = PGL.STROKE_DISPLACEMENT;
|
|
1250
|
+
if (currentPG.orthoProjection()) {
|
|
1251
|
+
setUniformValue(scaleLoc, 1, 1, f);
|
|
1252
|
+
} else {
|
|
1253
|
+
setUniformValue(scaleLoc, f, f, f);
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1178
1257
|
}
|
|
1179
1258
|
|
|
1180
|
-
|
|
1181
|
-
|
|
1259
|
+
protected void unbindTyped() {
|
|
1260
|
+
if (-1 < offsetLoc) {
|
|
1261
|
+
pgl.disableVertexAttribArray(offsetLoc);
|
|
1262
|
+
}
|
|
1182
1263
|
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
}
|
|
1264
|
+
if (-1 < directionLoc) {
|
|
1265
|
+
pgl.disableVertexAttribArray(directionLoc);
|
|
1266
|
+
}
|
|
1187
1267
|
|
|
1268
|
+
if (-1 < textureLoc && texture != null) {
|
|
1269
|
+
pgl.activeTexture(PGL.TEXTURE0 + texUnit);
|
|
1270
|
+
texture.unbind();
|
|
1271
|
+
pgl.activeTexture(PGL.TEXTURE0);
|
|
1272
|
+
texture = null;
|
|
1273
|
+
}
|
|
1188
1274
|
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1275
|
+
if (-1 < ambientLoc) {
|
|
1276
|
+
pgl.disableVertexAttribArray(ambientLoc);
|
|
1277
|
+
}
|
|
1278
|
+
if (-1 < specularLoc) {
|
|
1279
|
+
pgl.disableVertexAttribArray(specularLoc);
|
|
1280
|
+
}
|
|
1281
|
+
if (-1 < emissiveLoc) {
|
|
1282
|
+
pgl.disableVertexAttribArray(emissiveLoc);
|
|
1283
|
+
}
|
|
1284
|
+
if (-1 < shininessLoc) {
|
|
1285
|
+
pgl.disableVertexAttribArray(shininessLoc);
|
|
1286
|
+
}
|
|
1194
1287
|
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1288
|
+
if (-1 < vertexLoc) {
|
|
1289
|
+
pgl.disableVertexAttribArray(vertexLoc);
|
|
1290
|
+
}
|
|
1291
|
+
if (-1 < colorLoc) {
|
|
1292
|
+
pgl.disableVertexAttribArray(colorLoc);
|
|
1293
|
+
}
|
|
1294
|
+
if (-1 < texCoordLoc) {
|
|
1295
|
+
pgl.disableVertexAttribArray(texCoordLoc);
|
|
1296
|
+
}
|
|
1297
|
+
if (-1 < normalLoc) {
|
|
1298
|
+
pgl.disableVertexAttribArray(normalLoc);
|
|
1299
|
+
}
|
|
1199
1300
|
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1301
|
+
if (-1 < ppixelsLoc) {
|
|
1302
|
+
pgl.enableFBOLayer();
|
|
1303
|
+
pgl.activeTexture(PGL.TEXTURE0 + ppixelsUnit);
|
|
1304
|
+
currentPG.unbindFrontTexture();
|
|
1305
|
+
pgl.activeTexture(PGL.TEXTURE0);
|
|
1306
|
+
}
|
|
1204
1307
|
|
|
1205
|
-
|
|
1206
|
-
float x = currentPG.viewport.get(0);
|
|
1207
|
-
float y = currentPG.viewport.get(1);
|
|
1208
|
-
float w = currentPG.viewport.get(2);
|
|
1209
|
-
float h = currentPG.viewport.get(3);
|
|
1210
|
-
setUniformValue(viewportLoc, x, y, w, h);
|
|
1308
|
+
pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
|
|
1211
1309
|
}
|
|
1212
1310
|
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1311
|
+
protected void setTexture(Texture tex) {
|
|
1312
|
+
texture = tex;
|
|
1313
|
+
|
|
1314
|
+
float scaleu = 1;
|
|
1315
|
+
float scalev = 1;
|
|
1316
|
+
float dispu = 0;
|
|
1317
|
+
float dispv = 0;
|
|
1318
|
+
|
|
1319
|
+
if (tex != null) {
|
|
1320
|
+
if (tex.invertedX()) {
|
|
1321
|
+
scaleu = -1;
|
|
1322
|
+
dispu = 1;
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
if (tex.invertedY()) {
|
|
1326
|
+
scalev = -1;
|
|
1327
|
+
dispv = 1;
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
scaleu *= tex.maxTexcoordU();
|
|
1331
|
+
dispu *= tex.maxTexcoordU();
|
|
1332
|
+
scalev *= tex.maxTexcoordV();
|
|
1333
|
+
dispv *= tex.maxTexcoordV();
|
|
1334
|
+
|
|
1335
|
+
setUniformValue(texOffsetLoc, 1.0f / tex.width, 1.0f / tex.height);
|
|
1336
|
+
|
|
1337
|
+
if (-1 < textureLoc) {
|
|
1338
|
+
texUnit = -1 < ppixelsUnit ? ppixelsUnit + 1 : getLastTexUnit() + 1;
|
|
1339
|
+
setUniformValue(textureLoc, texUnit);
|
|
1340
|
+
pgl.activeTexture(PGL.TEXTURE0 + texUnit);
|
|
1341
|
+
tex.bind();
|
|
1342
|
+
}
|
|
1343
|
+
}
|
|
1218
1344
|
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1345
|
+
if (-1 < texMatrixLoc) {
|
|
1346
|
+
if (tcmat == null) {
|
|
1347
|
+
tcmat = new float[16];
|
|
1348
|
+
}
|
|
1349
|
+
tcmat[0] = scaleu;
|
|
1350
|
+
tcmat[4] = 0;
|
|
1351
|
+
tcmat[8] = 0;
|
|
1352
|
+
tcmat[12] = dispu;
|
|
1353
|
+
tcmat[1] = 0;
|
|
1354
|
+
tcmat[5] = scalev;
|
|
1355
|
+
tcmat[9] = 0;
|
|
1356
|
+
tcmat[13] = dispv;
|
|
1357
|
+
tcmat[2] = 0;
|
|
1358
|
+
tcmat[6] = 0;
|
|
1359
|
+
tcmat[10] = 0;
|
|
1360
|
+
tcmat[14] = 0;
|
|
1361
|
+
tcmat[3] = 0;
|
|
1362
|
+
tcmat[7] = 0;
|
|
1363
|
+
tcmat[11] = 0;
|
|
1364
|
+
tcmat[15] = 0;
|
|
1365
|
+
setUniformMatrix(texMatrixLoc, tcmat);
|
|
1366
|
+
}
|
|
1226
1367
|
}
|
|
1227
|
-
}
|
|
1228
|
-
|
|
1229
1368
|
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
setRenderer(primaryPG.getCurrentPG());
|
|
1233
|
-
loadAttributes();
|
|
1234
|
-
loadUniforms();
|
|
1369
|
+
protected boolean supportsTexturing() {
|
|
1370
|
+
return -1 < textureLoc;
|
|
1235
1371
|
}
|
|
1236
|
-
setCommonUniforms();
|
|
1237
1372
|
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
if (-1 < texCoordLoc) pgl.enableVertexAttribArray(texCoordLoc);
|
|
1241
|
-
if (-1 < normalLoc) pgl.enableVertexAttribArray(normalLoc);
|
|
1242
|
-
|
|
1243
|
-
if (-1 < normalMatLoc) {
|
|
1244
|
-
currentPG.updateGLNormal();
|
|
1245
|
-
setUniformMatrix(normalMatLoc, currentPG.glNormal);
|
|
1373
|
+
protected boolean supportLighting() {
|
|
1374
|
+
return -1 < lightCountLoc || -1 < lightPositionLoc || -1 < lightNormalLoc;
|
|
1246
1375
|
}
|
|
1247
1376
|
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
if (-1 < emissiveLoc) pgl.enableVertexAttribArray(emissiveLoc);
|
|
1251
|
-
if (-1 < shininessLoc) pgl.enableVertexAttribArray(shininessLoc);
|
|
1252
|
-
|
|
1253
|
-
int count = currentPG.lightCount;
|
|
1254
|
-
setUniformValue(lightCountLoc, count);
|
|
1255
|
-
if (0 < count) {
|
|
1256
|
-
setUniformVector(lightPositionLoc, currentPG.lightPosition, 4, count);
|
|
1257
|
-
setUniformVector(lightNormalLoc, currentPG.lightNormal, 3, count);
|
|
1258
|
-
setUniformVector(lightAmbientLoc, currentPG.lightAmbient, 3, count);
|
|
1259
|
-
setUniformVector(lightDiffuseLoc, currentPG.lightDiffuse, 3, count);
|
|
1260
|
-
setUniformVector(lightSpecularLoc, currentPG.lightSpecular, 3, count);
|
|
1261
|
-
setUniformVector(lightFalloffLoc, currentPG.lightFalloffCoefficients,
|
|
1262
|
-
3, count);
|
|
1263
|
-
setUniformVector(lightSpotLoc, currentPG.lightSpotParameters, 2, count);
|
|
1377
|
+
protected boolean accessTexCoords() {
|
|
1378
|
+
return -1 < texCoordLoc;
|
|
1264
1379
|
}
|
|
1265
1380
|
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
if (-1 < offsetLoc) pgl.enableVertexAttribArray(offsetLoc);
|
|
1269
|
-
|
|
1270
|
-
if (-1 < perspectiveLoc) {
|
|
1271
|
-
if (currentPG.getHint(ENABLE_STROKE_PERSPECTIVE) &&
|
|
1272
|
-
currentPG.nonOrthoProjection()) {
|
|
1273
|
-
setUniformValue(perspectiveLoc, 1);
|
|
1274
|
-
} else {
|
|
1275
|
-
setUniformValue(perspectiveLoc, 0);
|
|
1276
|
-
}
|
|
1381
|
+
protected boolean accessNormals() {
|
|
1382
|
+
return -1 < normalLoc;
|
|
1277
1383
|
}
|
|
1278
1384
|
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
} else {
|
|
1283
|
-
float f = PGL.STROKE_DISPLACEMENT;
|
|
1284
|
-
if (currentPG.orthoProjection()) {
|
|
1285
|
-
setUniformValue(scaleLoc, 1, 1, f);
|
|
1286
|
-
} else {
|
|
1287
|
-
setUniformValue(scaleLoc, f, f, f);
|
|
1288
|
-
}
|
|
1289
|
-
}
|
|
1385
|
+
protected boolean accessLightAttribs() {
|
|
1386
|
+
return -1 < ambientLoc || -1 < specularLoc || -1 < emissiveLoc
|
|
1387
|
+
|| -1 < shininessLoc;
|
|
1290
1388
|
}
|
|
1291
|
-
}
|
|
1292
1389
|
|
|
1293
|
-
|
|
1294
|
-
|
|
1390
|
+
protected void setVertexAttribute(int vboId, int size, int type,
|
|
1391
|
+
int stride, int offset) {
|
|
1392
|
+
setAttributeVBO(vertexLoc, vboId, size, type, false, stride, offset);
|
|
1393
|
+
}
|
|
1295
1394
|
|
|
1296
|
-
|
|
1395
|
+
protected void setColorAttribute(int vboId, int size, int type,
|
|
1396
|
+
int stride, int offset) {
|
|
1397
|
+
setAttributeVBO(colorLoc, vboId, size, type, true, stride, offset);
|
|
1398
|
+
}
|
|
1297
1399
|
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
pgl.activeTexture(PGL.TEXTURE0);
|
|
1302
|
-
texture = null;
|
|
1400
|
+
protected void setNormalAttribute(int vboId, int size, int type,
|
|
1401
|
+
int stride, int offset) {
|
|
1402
|
+
setAttributeVBO(normalLoc, vboId, size, type, false, stride, offset);
|
|
1303
1403
|
}
|
|
1304
1404
|
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1405
|
+
protected void setTexcoordAttribute(int vboId, int size, int type,
|
|
1406
|
+
int stride, int offset) {
|
|
1407
|
+
setAttributeVBO(texCoordLoc, vboId, size, type, false, stride, offset);
|
|
1408
|
+
}
|
|
1309
1409
|
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1410
|
+
protected void setAmbientAttribute(int vboId, int size, int type,
|
|
1411
|
+
int stride, int offset) {
|
|
1412
|
+
setAttributeVBO(ambientLoc, vboId, size, type, true, stride, offset);
|
|
1413
|
+
}
|
|
1314
1414
|
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
currentPG.unbindFrontTexture();
|
|
1319
|
-
pgl.activeTexture(PGL.TEXTURE0);
|
|
1415
|
+
protected void setSpecularAttribute(int vboId, int size, int type,
|
|
1416
|
+
int stride, int offset) {
|
|
1417
|
+
setAttributeVBO(specularLoc, vboId, size, type, true, stride, offset);
|
|
1320
1418
|
}
|
|
1321
1419
|
|
|
1322
|
-
|
|
1323
|
-
|
|
1420
|
+
protected void setEmissiveAttribute(int vboId, int size, int type,
|
|
1421
|
+
int stride, int offset) {
|
|
1422
|
+
setAttributeVBO(emissiveLoc, vboId, size, type, true, stride, offset);
|
|
1423
|
+
}
|
|
1324
1424
|
|
|
1325
|
-
|
|
1326
|
-
|
|
1425
|
+
protected void setShininessAttribute(int vboId, int size, int type,
|
|
1426
|
+
int stride, int offset) {
|
|
1427
|
+
setAttributeVBO(shininessLoc, vboId, size, type, false, stride, offset);
|
|
1428
|
+
}
|
|
1327
1429
|
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1430
|
+
protected void setLineAttribute(int vboId, int size, int type,
|
|
1431
|
+
int stride, int offset) {
|
|
1432
|
+
setAttributeVBO(directionLoc, vboId, size, type, false, stride, offset);
|
|
1433
|
+
}
|
|
1332
1434
|
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
}
|
|
1338
|
-
|
|
1339
|
-
if (tex.invertedY()) {
|
|
1340
|
-
scalev = -1;
|
|
1341
|
-
dispv = 1;
|
|
1342
|
-
}
|
|
1435
|
+
protected void setPointAttribute(int vboId, int size, int type,
|
|
1436
|
+
int stride, int offset) {
|
|
1437
|
+
setAttributeVBO(offsetLoc, vboId, size, type, false, stride, offset);
|
|
1438
|
+
}
|
|
1343
1439
|
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
protected boolean accessTexCoords() {
|
|
1381
|
-
return -1 < texCoordLoc;
|
|
1382
|
-
}
|
|
1383
|
-
|
|
1384
|
-
protected boolean accessNormals() {
|
|
1385
|
-
return -1 < normalLoc;
|
|
1386
|
-
}
|
|
1387
|
-
|
|
1388
|
-
protected boolean accessLightAttribs() {
|
|
1389
|
-
return -1 < ambientLoc || -1 < specularLoc || -1 < emissiveLoc ||
|
|
1390
|
-
-1 < shininessLoc;
|
|
1391
|
-
}
|
|
1392
|
-
|
|
1393
|
-
protected void setVertexAttribute(int vboId, int size, int type,
|
|
1394
|
-
int stride, int offset) {
|
|
1395
|
-
setAttributeVBO(vertexLoc, vboId, size, type, false, stride, offset);
|
|
1396
|
-
}
|
|
1397
|
-
|
|
1398
|
-
protected void setColorAttribute(int vboId, int size, int type,
|
|
1399
|
-
int stride, int offset) {
|
|
1400
|
-
setAttributeVBO(colorLoc, vboId, size, type, true, stride, offset);
|
|
1401
|
-
}
|
|
1402
|
-
|
|
1403
|
-
protected void setNormalAttribute(int vboId, int size, int type,
|
|
1404
|
-
int stride, int offset) {
|
|
1405
|
-
setAttributeVBO(normalLoc, vboId, size, type, false, stride, offset);
|
|
1406
|
-
}
|
|
1407
|
-
|
|
1408
|
-
protected void setTexcoordAttribute(int vboId, int size, int type,
|
|
1409
|
-
int stride, int offset) {
|
|
1410
|
-
setAttributeVBO(texCoordLoc, vboId, size, type, false, stride, offset);
|
|
1411
|
-
}
|
|
1412
|
-
|
|
1413
|
-
protected void setAmbientAttribute(int vboId, int size, int type,
|
|
1414
|
-
int stride, int offset) {
|
|
1415
|
-
setAttributeVBO(ambientLoc, vboId, size, type, true, stride, offset);
|
|
1416
|
-
}
|
|
1417
|
-
|
|
1418
|
-
protected void setSpecularAttribute(int vboId, int size, int type,
|
|
1419
|
-
int stride, int offset) {
|
|
1420
|
-
setAttributeVBO(specularLoc, vboId, size, type, true, stride, offset);
|
|
1421
|
-
}
|
|
1422
|
-
|
|
1423
|
-
protected void setEmissiveAttribute(int vboId, int size, int type,
|
|
1424
|
-
int stride, int offset) {
|
|
1425
|
-
setAttributeVBO(emissiveLoc, vboId, size, type, true, stride, offset);
|
|
1426
|
-
}
|
|
1427
|
-
|
|
1428
|
-
protected void setShininessAttribute(int vboId, int size, int type,
|
|
1429
|
-
int stride, int offset) {
|
|
1430
|
-
setAttributeVBO(shininessLoc, vboId, size, type, false, stride, offset);
|
|
1431
|
-
}
|
|
1432
|
-
|
|
1433
|
-
protected void setLineAttribute(int vboId, int size, int type,
|
|
1434
|
-
int stride, int offset) {
|
|
1435
|
-
setAttributeVBO(directionLoc, vboId, size, type, false, stride, offset);
|
|
1436
|
-
}
|
|
1437
|
-
|
|
1438
|
-
protected void setPointAttribute(int vboId, int size, int type,
|
|
1439
|
-
int stride, int offset) {
|
|
1440
|
-
setAttributeVBO(offsetLoc, vboId, size, type, false, stride, offset);
|
|
1441
|
-
}
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
// ***************************************************************************
|
|
1445
|
-
//
|
|
1446
|
-
// Class to store a user-specified value for a uniform parameter
|
|
1447
|
-
// in the shader
|
|
1448
|
-
protected static class UniformValue {
|
|
1449
|
-
static final int INT1 = 0;
|
|
1450
|
-
static final int INT2 = 1;
|
|
1451
|
-
static final int INT3 = 2;
|
|
1452
|
-
static final int INT4 = 3;
|
|
1453
|
-
static final int FLOAT1 = 4;
|
|
1454
|
-
static final int FLOAT2 = 5;
|
|
1455
|
-
static final int FLOAT3 = 6;
|
|
1456
|
-
static final int FLOAT4 = 7;
|
|
1457
|
-
static final int INT1VEC = 8;
|
|
1458
|
-
static final int INT2VEC = 9;
|
|
1459
|
-
static final int INT3VEC = 10;
|
|
1460
|
-
static final int INT4VEC = 11;
|
|
1461
|
-
static final int FLOAT1VEC = 12;
|
|
1462
|
-
static final int FLOAT2VEC = 13;
|
|
1463
|
-
static final int FLOAT3VEC = 14;
|
|
1464
|
-
static final int FLOAT4VEC = 15;
|
|
1465
|
-
static final int MAT2 = 16;
|
|
1466
|
-
static final int MAT3 = 17;
|
|
1467
|
-
static final int MAT4 = 18;
|
|
1468
|
-
static final int SAMPLER2D = 19;
|
|
1469
|
-
|
|
1470
|
-
int type;
|
|
1471
|
-
Object value;
|
|
1472
|
-
|
|
1473
|
-
UniformValue(int type, Object value) {
|
|
1474
|
-
this.type = type;
|
|
1475
|
-
this.value = value;
|
|
1476
|
-
}
|
|
1477
|
-
}
|
|
1440
|
+
// ***************************************************************************
|
|
1441
|
+
//
|
|
1442
|
+
// Class to store a user-specified value for a uniform parameter
|
|
1443
|
+
// in the shader
|
|
1444
|
+
protected static class UniformValue {
|
|
1445
|
+
|
|
1446
|
+
static final int INT1 = 0;
|
|
1447
|
+
static final int INT2 = 1;
|
|
1448
|
+
static final int INT3 = 2;
|
|
1449
|
+
static final int INT4 = 3;
|
|
1450
|
+
static final int FLOAT1 = 4;
|
|
1451
|
+
static final int FLOAT2 = 5;
|
|
1452
|
+
static final int FLOAT3 = 6;
|
|
1453
|
+
static final int FLOAT4 = 7;
|
|
1454
|
+
static final int INT1VEC = 8;
|
|
1455
|
+
static final int INT2VEC = 9;
|
|
1456
|
+
static final int INT3VEC = 10;
|
|
1457
|
+
static final int INT4VEC = 11;
|
|
1458
|
+
static final int FLOAT1VEC = 12;
|
|
1459
|
+
static final int FLOAT2VEC = 13;
|
|
1460
|
+
static final int FLOAT3VEC = 14;
|
|
1461
|
+
static final int FLOAT4VEC = 15;
|
|
1462
|
+
static final int MAT2 = 16;
|
|
1463
|
+
static final int MAT3 = 17;
|
|
1464
|
+
static final int MAT4 = 18;
|
|
1465
|
+
static final int SAMPLER2D = 19;
|
|
1466
|
+
|
|
1467
|
+
int type;
|
|
1468
|
+
Object value;
|
|
1469
|
+
|
|
1470
|
+
UniformValue(int type, Object value) {
|
|
1471
|
+
this.type = type;
|
|
1472
|
+
this.value = value;
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1478
1475
|
}
|