66import android .util .SparseArray ;
77
88import org .andresoviedo .android_3d_model_engine .model .AnimatedModel ;
9+ import org .andresoviedo .android_3d_model_engine .model .Constants ;
910import org .andresoviedo .android_3d_model_engine .model .Element ;
1011import org .andresoviedo .android_3d_model_engine .model .Object3DData ;
1112import org .andresoviedo .util .android .GLUtil ;
@@ -44,8 +45,8 @@ class GLES20Renderer implements Renderer {
4445 private static final int TEXTURE_COORDS_PER_VERTEX = 2 ;
4546 private static final int COLOR_COORDS_PER_VERTEX = 4 ;
4647
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 ;
4950
5051 // specification
5152 private final String id ;
@@ -79,6 +80,8 @@ class GLES20Renderer implements Renderer {
7980 private boolean lightingEnabled = true ;
8081 private boolean animationEnabled = true ;
8182
83+ private boolean autoUseProgram = true ;
84+
8285 static GLES20Renderer getInstance (String id , String vertexShaderCode , String fragmentShaderCode ) {
8386 Set <String > shaderFeatures = new HashSet <>();
8487 testShaderFeature (shaderFeatures , vertexShaderCode , "u_MMatrix" );
@@ -87,9 +90,9 @@ static GLES20Renderer getInstance(String id, String vertexShaderCode, String fra
8790 testShaderFeature (shaderFeatures , vertexShaderCode , "a_Color" );
8891 testShaderFeature (shaderFeatures , vertexShaderCode , "a_TexCoordinate" );
8992 testShaderFeature (shaderFeatures , vertexShaderCode , "u_LightPos" );
90- testShaderFeature (shaderFeatures , fragmentShaderCode , "u_LightPos" );
9193 testShaderFeature (shaderFeatures , vertexShaderCode , "in_jointIndices" );
9294 testShaderFeature (shaderFeatures , vertexShaderCode , "in_weights" );
95+ testShaderFeature (shaderFeatures , fragmentShaderCode , "u_LightPos" );
9396 testShaderFeature (shaderFeatures , fragmentShaderCode , "u_TextureCube" );
9497 return new GLES20Renderer (id , vertexShaderCode , fragmentShaderCode , shaderFeatures );
9598 }
@@ -117,6 +120,25 @@ private GLES20Renderer(String id, String vertexShaderCode, String fragmentShader
117120 Log .d ("GLES20Renderer" , "Compiled 3D Drawer (" + id + ") with id " + mProgram );
118121 }
119122
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+
120142 public void setTexturesEnabled (boolean texturesEnabled ) {
121143 this .texturesEnabled = texturesEnabled ;
122144 }
@@ -139,10 +161,8 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
139161 flags.put(obj.getId(), this.id);
140162 }*/
141163
142- // Add program to OpenGL environment
143- GLES20 .glUseProgram (mProgram );
144- if (GLUtil .checkGlError ("glUseProgram" )) {
145- return ;
164+ if (this .autoUseProgram ){
165+ useProgram ();
146166 }
147167
148168 //setFeatureFlag("u_Debug",false);
@@ -164,15 +184,20 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
164184 }
165185
166186 // 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
167194 int mColorHandle = -1 ;
168195 if (supportsColors ()){
169196 setFeatureFlag ("u_Coloured" ,false );
170197 if (obj .getColorsBuffer () != null ) {
171198 mColorHandle = setVBO ("a_Color" , obj .getColorsBuffer (), COLOR_COORDS_PER_VERTEX );
172199 setFeatureFlag ("u_Coloured" , true );
173200 }
174- } else {
175- setUniform4 (obj .getColor () != null ? obj .getColor () : DEFAULT_COLOR ,"vColor" );
176201 }
177202
178203 // pass in color mask - i.e. stereoscopic
@@ -182,12 +207,10 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
182207 int mTextureHandle = -1 ;
183208 if (supportsTextures ()) {
184209 setFeatureFlag ("u_Textured" , texturesEnabled );
185- }
186- if (supportsTextures () && obj .getTextureBuffer () != null ) {
187210
188211 // load color map
189212 if (obj .getMaterial ().getTextureId () == -1 &&
190- obj .getMaterial ().getColorTexture () != null ){
213+ obj .getMaterial ().getColorTexture () != null ) {
191214
192215 // bind bitmap
193216 textureId = GLUtil .loadTexture (obj .getMaterial ().getColorTexture ());
@@ -197,7 +220,7 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
197220
198221 // load normal map
199222 if (obj .getMaterial ().getNormalTextureId () == -1 &&
200- obj .getMaterial ().getNormalTexture () != null ){
223+ obj .getMaterial ().getNormalTexture () != null ) {
201224
202225 // log event
203226 Log .i ("ModelRenderer" , "Binding normal map... " + obj .getMaterial ().getName ());
@@ -210,7 +233,7 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
210233
211234 // load emissive map
212235 if (obj .getMaterial ().getEmissiveTextureId () == -1 &&
213- obj .getMaterial ().getEmissiveTexture () != null ){
236+ obj .getMaterial ().getEmissiveTexture () != null ) {
214237
215238 // log event
216239 Log .i ("ModelRenderer" , "Binding normal map... " + obj .getMaterial ().getName ());
@@ -238,21 +261,22 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
238261
239262 if (obj .getTextureBuffer () != null ) {
240263 mTextureHandle = setVBO ("a_TexCoordinate" , obj .getTextureBuffer (), TEXTURE_COORDS_PER_VERTEX );
241- }
242264
243- if (obj .getMaterial ().getTextureId () != -1 ) {
244- setTexture (obj .getMaterial ().getTextureId (), "u_Texture" , 0 );
245- setFeatureFlag ("u_Textured" ,true );
246- }
247265
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+ }
252270
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+ }
256280 }
257281 }
258282
@@ -273,7 +297,10 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int texture
273297 int in_weightsHandle = -1 ;
274298 int in_jointIndicesHandle = -1 ;
275299 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 ;
277304 if (toggle ) {
278305 in_weightsHandle = setVBO ("in_weights" , ((AnimatedModel ) obj ).getVertexWeights (), COORDS_PER_VERTEX );
279306 in_jointIndicesHandle = setVBO ("in_jointIndices" , ((AnimatedModel ) obj ).getJointIds (), COORDS_PER_VERTEX );
@@ -506,11 +533,11 @@ private void drawTrianglesUsingIndex(Object3DData obj, int drawMode, int drawSiz
506533 }*/
507534
508535 int size = obj .getElements ().size ();
509- if (id != flags .get (obj .getElements ())) {
536+ /* if (id != flags.get(obj.getElements())) {
510537 Log.i("GLES20Renderer", "Rendering elements... obj: " + obj.getId()
511538 + ", total:" + size);
512539 flags.put(obj.getElements(), this.id);
513- }
540+ }*/
514541
515542 // draw rest
516543 for (int i = 0 ; i < size ; i ++) {
@@ -563,14 +590,13 @@ private void drawObjectElement(Object3DData obj, int drawMode, int drawBufferTyp
563590 Buffer drawOrderBuffer = element .getIndexBuffer ();
564591
565592 // log event
566- if (id != flags .get (element )) {
593+ /* if (id != flags.get(element)) {
567594 Log.v("GLES20Renderer", "Rendering element " + i + ".... " + element);
568- }
595+ flags.put(element, id);
596+ }*/
569597
570598 if (element .getMaterial () != null && element .getMaterial ().getColor () != null ){
571599 setUniform4 (element .getMaterial ().getColor (), "vColor" );
572- } else if (obj .getColor () != null ){
573- setUniform4 (obj .getColor (), "vColor" );
574600 } else {
575601 setUniform4 (DEFAULT_COLOR , "vColor" );
576602 }
@@ -678,10 +704,10 @@ private void drawObjectElement(Object3DData obj, int drawMode, int drawBufferTyp
678704 }
679705
680706 // log event
681- if (id != flags .get (element )) {
707+ /* if (id != flags.get(element)) {
682708 Log.i("GLES20Renderer", "Rendering element " + i + " finished");
683709 flags.put(element, this.id);
684- }
710+ }*/
685711 }
686712
687713 private void drawPolygonsUsingIndex (Buffer drawOrderBuffer , int drawBufferType , List <int []> polygonsList ) {
0 commit comments