6
6
import android .util .SparseArray ;
7
7
8
8
import org .andresoviedo .android_3d_model_engine .model .AnimatedModel ;
9
+ import org .andresoviedo .android_3d_model_engine .model .Constants ;
9
10
import org .andresoviedo .android_3d_model_engine .model .Element ;
10
11
import org .andresoviedo .android_3d_model_engine .model .Object3DData ;
11
12
import org .andresoviedo .util .android .GLUtil ;
@@ -44,8 +45,8 @@ class GLES20Renderer implements Renderer {
44
45
private static final int TEXTURE_COORDS_PER_VERTEX = 2 ;
45
46
private static final int COLOR_COORDS_PER_VERTEX = 4 ;
46
47
47
- private final static float [] DEFAULT_COLOR = { 0.0f , 1.0f , 1.0f , 1.0f } ;
48
- private final static float [] NO_COLOR_MASK = { 1.0f , 1.0f , 1.0f , 1.0f } ;
48
+ private final static float [] DEFAULT_COLOR = Constants . COLOR_WHITE ;
49
+ private final static float [] NO_COLOR_MASK = Constants . COLOR_WHITE ;
49
50
50
51
// specification
51
52
private final String id ;
@@ -79,6 +80,8 @@ class GLES20Renderer implements Renderer {
79
80
private boolean lightingEnabled = true ;
80
81
private boolean animationEnabled = true ;
81
82
83
+ private boolean autoUseProgram = true ;
84
+
82
85
static GLES20Renderer getInstance (String id , String vertexShaderCode , String fragmentShaderCode ) {
83
86
Set <String > shaderFeatures = new HashSet <>();
84
87
testShaderFeature (shaderFeatures , vertexShaderCode , "u_MMatrix" );
@@ -87,9 +90,9 @@ static GLES20Renderer getInstance(String id, String vertexShaderCode, String fra
87
90
testShaderFeature (shaderFeatures , vertexShaderCode , "a_Color" );
88
91
testShaderFeature (shaderFeatures , vertexShaderCode , "a_TexCoordinate" );
89
92
testShaderFeature (shaderFeatures , vertexShaderCode , "u_LightPos" );
90
- testShaderFeature (shaderFeatures , fragmentShaderCode , "u_LightPos" );
91
93
testShaderFeature (shaderFeatures , vertexShaderCode , "in_jointIndices" );
92
94
testShaderFeature (shaderFeatures , vertexShaderCode , "in_weights" );
95
+ testShaderFeature (shaderFeatures , fragmentShaderCode , "u_LightPos" );
93
96
testShaderFeature (shaderFeatures , fragmentShaderCode , "u_TextureCube" );
94
97
return new GLES20Renderer (id , vertexShaderCode , fragmentShaderCode , shaderFeatures );
95
98
}
@@ -117,6 +120,25 @@ private GLES20Renderer(String id, String vertexShaderCode, String fragmentShader
117
120
Log .d ("GLES20Renderer" , "Compiled 3D Drawer (" + id + ") with id " + mProgram );
118
121
}
119
122
123
+ @ Override
124
+ public void setAutoUseProgram (boolean autoUseProgram ) {
125
+ this .autoUseProgram = autoUseProgram ;
126
+ }
127
+
128
+ @ Override
129
+ public void useProgram () {
130
+ // Add program to OpenGL environment
131
+ GLES20 .glUseProgram (mProgram );
132
+ if (GLUtil .checkGlError ("glUseProgram" )) {
133
+ //return;
134
+ }
135
+ }
136
+
137
+ @ Override
138
+ public int getProgram () {
139
+ return mProgram ;
140
+ }
141
+
120
142
public void setTexturesEnabled (boolean texturesEnabled ) {
121
143
this .texturesEnabled = texturesEnabled ;
122
144
}
@@ -139,10 +161,8 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
139
161
flags.put(obj.getId(), this.id);
140
162
}*/
141
163
142
- // Add program to OpenGL environment
143
- GLES20 .glUseProgram (mProgram );
144
- if (GLUtil .checkGlError ("glUseProgram" )) {
145
- return ;
164
+ if (this .autoUseProgram ){
165
+ useProgram ();
146
166
}
147
167
148
168
//setFeatureFlag("u_Debug",false);
@@ -164,15 +184,20 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
164
184
}
165
185
166
186
// pass in color or colors array
187
+ if (obj .getColor () != null ){
188
+ setUniform4 (obj .getColor (), "vColor" );
189
+ } else {
190
+ setUniform4 (DEFAULT_COLOR , "vColor" );
191
+ }
192
+
193
+ // colors
167
194
int mColorHandle = -1 ;
168
195
if (supportsColors ()){
169
196
setFeatureFlag ("u_Coloured" ,false );
170
197
if (obj .getColorsBuffer () != null ) {
171
198
mColorHandle = setVBO ("a_Color" , obj .getColorsBuffer (), COLOR_COORDS_PER_VERTEX );
172
199
setFeatureFlag ("u_Coloured" , true );
173
200
}
174
- } else {
175
- setUniform4 (obj .getColor () != null ? obj .getColor () : DEFAULT_COLOR ,"vColor" );
176
201
}
177
202
178
203
// pass in color mask - i.e. stereoscopic
@@ -182,12 +207,10 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
182
207
int mTextureHandle = -1 ;
183
208
if (supportsTextures ()) {
184
209
setFeatureFlag ("u_Textured" , texturesEnabled );
185
- }
186
- if (supportsTextures () && obj .getTextureBuffer () != null ) {
187
210
188
211
// load color map
189
212
if (obj .getMaterial ().getTextureId () == -1 &&
190
- obj .getMaterial ().getColorTexture () != null ){
213
+ obj .getMaterial ().getColorTexture () != null ) {
191
214
192
215
// bind bitmap
193
216
textureId = GLUtil .loadTexture (obj .getMaterial ().getColorTexture ());
@@ -197,7 +220,7 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
197
220
198
221
// load normal map
199
222
if (obj .getMaterial ().getNormalTextureId () == -1 &&
200
- obj .getMaterial ().getNormalTexture () != null ){
223
+ obj .getMaterial ().getNormalTexture () != null ) {
201
224
202
225
// log event
203
226
Log .i ("ModelRenderer" , "Binding normal map... " + obj .getMaterial ().getName ());
@@ -210,7 +233,7 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
210
233
211
234
// load emissive map
212
235
if (obj .getMaterial ().getEmissiveTextureId () == -1 &&
213
- obj .getMaterial ().getEmissiveTexture () != null ){
236
+ obj .getMaterial ().getEmissiveTexture () != null ) {
214
237
215
238
// log event
216
239
Log .i ("ModelRenderer" , "Binding normal map... " + obj .getMaterial ().getName ());
@@ -238,21 +261,22 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
238
261
239
262
if (obj .getTextureBuffer () != null ) {
240
263
mTextureHandle = setVBO ("a_TexCoordinate" , obj .getTextureBuffer (), TEXTURE_COORDS_PER_VERTEX );
241
- }
242
264
243
- if (obj .getMaterial ().getTextureId () != -1 ) {
244
- setTexture (obj .getMaterial ().getTextureId (), "u_Texture" , 0 );
245
- setFeatureFlag ("u_Textured" ,true );
246
- }
247
265
248
- if (obj .getMaterial ().getNormalTextureId () != -1 ) {
249
- setTexture (obj .getMaterial ().getNormalTextureId (), "u_NormalTexture " , 1 );
250
- setFeatureFlag ("u_NormalTextured" , true );
251
- }
266
+ if (obj .getMaterial ().getTextureId () != -1 ) {
267
+ setTexture (obj .getMaterial ().getTextureId (), "u_Texture " , 0 );
268
+ setFeatureFlag ("u_Textured" , true );
269
+ }
252
270
253
- if (obj .getMaterial ().getEmissiveTextureId () != -1 ){
254
- setTexture (obj .getMaterial ().getEmissiveTextureId (), "u_EmissiveTexture" , 2 );
255
- setFeatureFlag ("u_EmissiveTextured" , true );
271
+ if (obj .getMaterial ().getNormalTextureId () != -1 ) {
272
+ setTexture (obj .getMaterial ().getNormalTextureId (), "u_NormalTexture" , 1 );
273
+ setFeatureFlag ("u_NormalTextured" , true );
274
+ }
275
+
276
+ if (obj .getMaterial ().getEmissiveTextureId () != -1 ) {
277
+ setTexture (obj .getMaterial ().getEmissiveTextureId (), "u_EmissiveTexture" , 2 );
278
+ setFeatureFlag ("u_EmissiveTextured" , true );
279
+ }
256
280
}
257
281
}
258
282
@@ -273,7 +297,10 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
273
297
int in_weightsHandle = -1 ;
274
298
int in_jointIndicesHandle = -1 ;
275
299
if (supportsJoints ()){
276
- boolean toggle = this .animationEnabled && obj instanceof AnimatedModel ;
300
+ final boolean animationOK = obj instanceof AnimatedModel
301
+ && ((AnimatedModel ) obj ).getAnimation () != null
302
+ && (((AnimatedModel ) obj ).getAnimation ()).isInitialized ();
303
+ boolean toggle = this .animationEnabled && animationOK ;
277
304
if (toggle ) {
278
305
in_weightsHandle = setVBO ("in_weights" , ((AnimatedModel ) obj ).getVertexWeights (), COORDS_PER_VERTEX );
279
306
in_jointIndicesHandle = setVBO ("in_jointIndices" , ((AnimatedModel ) obj ).getJointIds (), COORDS_PER_VERTEX );
@@ -506,11 +533,11 @@ private void drawTrianglesUsingIndex(Object3DData obj, int drawMode, int drawSiz
506
533
}*/
507
534
508
535
int size = obj .getElements ().size ();
509
- if (id != flags .get (obj .getElements ())) {
536
+ /* if (id != flags.get(obj.getElements())) {
510
537
Log.i("GLES20Renderer", "Rendering elements... obj: " + obj.getId()
511
538
+ ", total:" + size);
512
539
flags.put(obj.getElements(), this.id);
513
- }
540
+ }*/
514
541
515
542
// draw rest
516
543
for (int i = 0 ; i < size ; i ++) {
@@ -563,14 +590,13 @@ private void drawObjectElement(Object3DData obj, int drawMode, int drawBufferTyp
563
590
Buffer drawOrderBuffer = element .getIndexBuffer ();
564
591
565
592
// log event
566
- if (id != flags .get (element )) {
593
+ /* if (id != flags.get(element)) {
567
594
Log.v("GLES20Renderer", "Rendering element " + i + ".... " + element);
568
- }
595
+ flags.put(element, id);
596
+ }*/
569
597
570
598
if (element .getMaterial () != null && element .getMaterial ().getColor () != null ){
571
599
setUniform4 (element .getMaterial ().getColor (), "vColor" );
572
- } else if (obj .getColor () != null ){
573
- setUniform4 (obj .getColor (), "vColor" );
574
600
} else {
575
601
setUniform4 (DEFAULT_COLOR , "vColor" );
576
602
}
@@ -678,10 +704,10 @@ private void drawObjectElement(Object3DData obj, int drawMode, int drawBufferTyp
678
704
}
679
705
680
706
// log event
681
- if (id != flags .get (element )) {
707
+ /* if (id != flags.get(element)) {
682
708
Log.i("GLES20Renderer", "Rendering element " + i + " finished");
683
709
flags.put(element, this.id);
684
- }
710
+ }*/
685
711
}
686
712
687
713
private void drawPolygonsUsingIndex (Buffer drawOrderBuffer , int drawBufferType , List <int []> polygonsList ) {
0 commit comments