Skip to content

Commit bb8628b

Browse files
committed
#61 refactoring
1 parent 6556eae commit bb8628b

File tree

5 files changed

+151
-48
lines changed

5 files changed

+151
-48
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ ChangeLog
206206

207207
- 3.4.1 (20/09/2022)
208208
- (f) bug fixing: lighting, textures, etc
209+
- (i) texture loading refactoring
209210
- 3.4.0 (17/09/2022)
210211
- (n) GLTF basic support
211212
- 3.3.1 (12/09/2022)

engine/src/main/java/org/andresoviedo/android_3d_model_engine/drawer/GLES20Renderer.java

Lines changed: 127 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import org.andresoviedo.util.android.GLUtil;
1212
import org.andresoviedo.util.io.IOUtils;
1313

14+
import java.io.ByteArrayInputStream;
15+
import java.io.IOException;
1416
import java.nio.Buffer;
1517
import java.nio.FloatBuffer;
1618
import java.nio.IntBuffer;
@@ -111,19 +113,7 @@ private GLES20Renderer(String id, String vertexShaderCode, String fragmentShader
111113
}
112114

113115
@Override
114-
public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int textureId, float[] lightPosInWorldSpace, float[] cameraPos) {
115-
this.draw(obj, pMatrix, vMatrix, obj.getDrawMode(), obj.getDrawSize(), textureId, lightPosInWorldSpace, null, cameraPos);
116-
}
117-
118-
@Override
119-
public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int textureId, float[] lightPosInWorldSpace, float[]
120-
colorMask, float[] cameraPos) {
121-
this.draw(obj, pMatrix, vMatrix, obj.getDrawMode(), obj.getDrawSize(), textureId, lightPosInWorldSpace, colorMask, cameraPos);
122-
}
123-
124-
@Override
125-
public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int drawMode, int drawSize, int textureId,
126-
float[] lightPosInWorldSpace, float[] colorMask, float[] cameraPos) {
116+
public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int textureId, float[] lightPosInWorldSpace, float[] colorMask, float[] cameraPos, int drawMode, int drawSize) {
127117

128118
// log event once
129119
// FIXME: this was flooding the system out!
@@ -150,7 +140,7 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int drawMod
150140

151141
// pass in normals buffer for lighting
152142
int mNormalHandle = -1;
153-
if (supportsNormals()) {
143+
if (supportsNormals() && obj.getNormalsBuffer() != null) {
154144
mNormalHandle = setVBO("a_Normal", obj.getNormalsBuffer(), COORDS_PER_VERTEX);
155145
}
156146

@@ -168,11 +158,77 @@ public void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int drawMod
168158
// pass in texture UV buffer
169159
int mTextureHandle = -1;
170160
if (supportsTextures()) {
161+
171162
setFeatureFlag("u_Textured", false);
172-
if (textureId != -1 && obj.getTextureBuffer() != null) {
173-
setTexture(textureId, "u_Texture", 0);
163+
164+
// load color map
165+
if (obj.getMaterial().getTextureId() == -1 &&
166+
obj.getMaterial().getColorTexture() != null){
167+
168+
// bind bitmap
169+
textureId = GLUtil.loadTexture(obj.getMaterial().getColorTexture());
170+
171+
obj.getMaterial().setTextureId(textureId);
172+
}
173+
174+
// load normal map
175+
if (obj.getMaterial().getNormalTextureId() == -1 &&
176+
obj.getMaterial().getNormalTexture() != null){
177+
178+
// log event
179+
Log.i("ModelRenderer", "Binding normal map... " + obj.getMaterial().getName());
180+
181+
// bind bitmap
182+
int handler = GLUtil.loadTexture(obj.getMaterial().getNormalTexture());
183+
184+
obj.getMaterial().setNormalTextureId(handler);
185+
}
186+
187+
// load emissive map
188+
if (obj.getMaterial().getEmissiveTextureId() == -1 &&
189+
obj.getMaterial().getEmissiveTexture() != null){
190+
191+
// log event
192+
Log.i("ModelRenderer", "Binding normal map... " + obj.getMaterial().getName());
193+
194+
// bind bitmap
195+
int handler = GLUtil.loadTexture(obj.getMaterial().getEmissiveTexture());
196+
197+
obj.getMaterial().setEmissiveTextureId(handler);
198+
}
199+
200+
if (obj.getMaterial().getTextureId() == -1 && obj.getTextureData() != null) {
201+
Log.i("ModelRenderer", "Loading texture for obj: '" + obj.getId() + "'... bytes: " + obj.getTextureData().length);
202+
ByteArrayInputStream textureIs = new ByteArrayInputStream(obj.getTextureData());
203+
textureId = GLUtil.loadTexture(textureIs);
204+
try {
205+
textureIs.close();
206+
} catch (IOException e) {
207+
e.printStackTrace();
208+
}
209+
obj.getMaterial().setTextureId(textureId);
210+
//textures.put(obj.getMaterial(), textureId);
211+
212+
Log.i("ModelRenderer", "Loaded texture OK. id: " + textureId);
213+
}
214+
215+
if (obj.getTextureBuffer() != null) {
174216
mTextureHandle = setVBO("a_TexCoordinate", obj.getTextureBuffer(), TEXTURE_COORDS_PER_VERTEX);
175-
setFeatureFlag("u_Textured", true);
217+
}
218+
219+
if (obj.getMaterial().getTextureId() != -1) {
220+
setTexture(obj.getMaterial().getTextureId(), "u_Texture", 0);
221+
setFeatureFlag("u_Textured",true);
222+
}
223+
224+
if (obj.getMaterial().getNormalTextureId() != -1) {
225+
setTexture(obj.getMaterial().getNormalTextureId(), "u_NormalTexture", 1);
226+
setFeatureFlag("u_NormalTextured",true);
227+
}
228+
229+
if (obj.getMaterial().getEmissiveTextureId() != -1){
230+
setTexture(obj.getMaterial().getEmissiveTextureId(), "u_EmissiveTexture", 2);
231+
setFeatureFlag("u_EmissiveTextured", true);
176232
}
177233
}
178234

@@ -288,20 +344,20 @@ private void setFeatureFlag(String variableName, boolean enabled) {
288344
GLUtil.checkGlError("glUniform1i");
289345
}
290346

291-
private void setTexture(int textureId, String variableName, int shaderIndex) {
347+
private void setTexture(int textureId, String variableName, int textureIndex) {
292348
int mTextureUniformHandle = GLES20.glGetUniformLocation(mProgram, variableName);
293349
GLUtil.checkGlError("glGetUniformLocation");
294350

295351
// Set the active texture unit to texture unit 0.
296-
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + shaderIndex);
352+
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + textureIndex);
297353
GLUtil.checkGlError("glActiveTexture");
298354

299355
// Bind to the texture in OpenGL
300356
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);
301357
GLUtil.checkGlError("glBindTexture");
302358

303359
// Tell the texture uniform sampler to use this texture in the shader by binding to texture unit 0.
304-
GLES20.glUniform1i(mTextureUniformHandle, shaderIndex);
360+
GLES20.glUniform1i(mTextureUniformHandle, textureIndex);
305361
GLUtil.checkGlError("glUniform1i");
306362
}
307363

@@ -491,6 +547,57 @@ private void drawObjectElement(Object3DData obj, int drawMode, int drawBufferTyp
491547
setUniform4(element.getMaterial().getColor() != null ? element.getMaterial().getColor() :
492548
obj.getColor() != null ? obj.getColor() : DEFAULT_COLOR, "vColor");
493549
}
550+
// load color map
551+
if (element.getMaterial().getTextureId() == -1 &&
552+
element.getMaterial().getColorTexture() != null){
553+
554+
// log event
555+
Log.i("ModelRenderer", "Binding texture map... " + element.getMaterial().getName());
556+
557+
// bind bitmap
558+
int handler = GLUtil.loadTexture(element.getMaterial().getColorTexture());
559+
560+
element.getMaterial().setTextureId(handler);
561+
}
562+
563+
// load normal map
564+
if (element.getMaterial().getNormalTextureId() == -1 &&
565+
element.getMaterial().getNormalTexture() != null){
566+
567+
// log event
568+
Log.i("ModelRenderer", "Binding normal map... " + element.getMaterial().getName());
569+
570+
// bind bitmap
571+
int handler = GLUtil.loadTexture(element.getMaterial().getNormalTexture());
572+
573+
element.getMaterial().setNormalTextureId(handler);
574+
}
575+
576+
// load emissive map
577+
if (element.getMaterial().getEmissiveTextureId() == -1 &&
578+
element.getMaterial().getEmissiveTexture() != null){
579+
580+
// log event
581+
Log.i("ModelRenderer", "Binding emmissive map... " + element.getMaterial().getName());
582+
583+
// bind bitmap
584+
int handler = GLUtil.loadTexture(element.getMaterial().getEmissiveTexture());
585+
586+
element.getMaterial().setEmissiveTextureId(handler);
587+
}
588+
589+
// load color map
590+
if (element.getMaterial().getTextureId() == -1 &&
591+
element.getMaterial().getTextureData() != null){
592+
593+
// log event
594+
Log.i("ModelRenderer", "Binding texture data... " + element.getMaterial().getName());
595+
596+
// bind bitmap
597+
int handler = GLUtil.loadTexture(element.getMaterial().getTextureData());
598+
599+
element.getMaterial().setTextureId(handler);
600+
}
494601
if (element.getMaterial().getTextureId() != -1 && supportsTextures()) {
495602
setTexture(element.getMaterial().getTextureId(), "u_Texture", 0);
496603
setFeatureFlag("u_Textured",true);

engine/src/main/java/org/andresoviedo/android_3d_model_engine/drawer/Renderer.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,5 @@
44

55
public interface Renderer {
66

7-
void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int textureId, float[] lightPosInWorldSpace, float[] cameraPos);
8-
9-
void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int textureId, float[] lightPosInWorldSpace, float[] colorMask, float[] cameraPos);
10-
11-
void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int drawType, int drawSize, int textureId, float[]
12-
lightPosInWorldSpace, float[] colorMask, float[] cameraPos);
7+
void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int textureId, float[] lightPosInWorldSpace, float[] colorMask, float[] cameraPos, int drawType, int drawSize);
138
}

engine/src/main/java/org/andresoviedo/android_3d_model_engine/gui/Widget.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ protected void renderImpl(RendererFactory rendererFactory, float[] lightPosInWor
359359
if (!isVisible()) return;
360360
onDrawFrame();
361361
Renderer drawer = rendererFactory.getDrawer(this, false, false, false, false, true);
362-
drawer.draw(this, projectionMatrix, viewMatrix, -1, lightPosInWorldSpace, colorMask, cameraPosition);
362+
drawer.draw(this, projectionMatrix, viewMatrix, -1, lightPosInWorldSpace, colorMask, cameraPosition, this.getDrawMode(), this.getDrawSize());
363363
}
364364

365365
public void onDrawFrame(){

engine/src/main/java/org/andresoviedo/android_3d_model_engine/view/ModelRenderer.java

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ private void onDrawFrame(float[] viewMatrix, float[] projectionMatrix, float[] v
525525
lightPosInWorldSpace[2] = tempVector4[2];
526526

527527
// Draw a point that represents the light bulb
528-
basicShader.draw(scene.getLightBulb(), projectionMatrix, viewMatrix, -1, lightPosInWorldSpace, colorMask, cameraPosInWorldSpace);
528+
basicShader.draw(scene.getLightBulb(), projectionMatrix, viewMatrix, -1, lightPosInWorldSpace, colorMask, cameraPosInWorldSpace,scene.getLightBulb().getDrawMode(), scene.getLightBulb().getDrawSize());
529529
//basicShader.draw(Point.build(lightPosInWorldSpace), projectionMatrix, viewMatrix, -1, lightPosInWorldSpace, colorMask, cameraPosInWorldSpace);
530530
} else {
531531
lightPosInWorldSpace[0] = cameraPosInWorldSpace[0];
@@ -535,11 +535,12 @@ private void onDrawFrame(float[] viewMatrix, float[] projectionMatrix, float[] v
535535

536536
// FIXME: memory leak
537537
if (scene.isDrawNormals()) {
538-
basicShader.draw(Line.build(new float[]{lightPosInWorldSpace[0],
539-
lightPosInWorldSpace[1], lightPosInWorldSpace[2], 0, 0, 0}).setId("light_line"), projectionMatrix,
538+
Object3DData light_line = Line.build(new float[]{lightPosInWorldSpace[0],
539+
lightPosInWorldSpace[1], lightPosInWorldSpace[2], 0, 0, 0}).setId("light_line");
540+
basicShader.draw(light_line, projectionMatrix,
540541
viewMatrix, -1,
541542
lightPosInWorldSpace,
542-
colorMask, cameraPosInWorldSpace);
543+
colorMask, cameraPosInWorldSpace, light_line.getDrawMode(), light_line.getDrawSize());
543544
}
544545
}
545546

@@ -604,7 +605,7 @@ else if (isDrawSkyBox && skyBoxId >= 0 && skyBoxId < skyBoxes3D.length) {
604605
}
605606
Renderer basicShader = drawer.getSkyBoxDrawer();
606607
skyBoxes3D[skyBoxId].setColor(Constants.COLOR_BIT_TRANSPARENT);
607-
basicShader.draw(skyBoxes3D[skyBoxId], projectionMatrixSkyBox, viewMatrix, skyBoxes3D[skyBoxId].getMaterial().getTextureId(), null, cameraPosInWorldSpace);
608+
basicShader.draw(skyBoxes3D[skyBoxId], projectionMatrixSkyBox, viewMatrix, skyBoxes3D[skyBoxId].getMaterial().getTextureId(), null, null, cameraPosInWorldSpace, skyBoxes3D[skyBoxId].getDrawMode(), skyBoxes3D[skyBoxId].getDrawSize());
608609

609610
// sensor stuff
610611
/*this.orientation.toRotationMatrix(viewMatrixSkyBox);
@@ -649,7 +650,7 @@ private void drawObject(float[] viewMatrix, float[] projectionMatrix, float[] li
649650
objData.setChanged(false);
650651

651652
// load textures
652-
Integer textureId = null;
653+
/*Integer textureId = null;
653654
if (drawTextures) {
654655
655656
// TODO: move texture loading to Renderer
@@ -736,15 +737,13 @@ else if (element.getMaterial().getTextureData() != null){
736737
Log.i("ModelRenderer", "Loaded texture OK. id: " + textureId);
737738
}
738739
}
739-
}
740-
if (textureId == null) {
741-
textureId = -1;
742-
}
740+
}*/
741+
Integer textureId = -1;
743742

744743
// draw points
745744
if (objData.getDrawMode() == GLES20.GL_POINTS) {
746745
Renderer basicDrawer = drawer.getBasicShader();
747-
basicDrawer.draw(objData, projectionMatrix, viewMatrix, GLES20.GL_POINTS, lightPosInWorldSpace, cameraPosInWorldSpace);
746+
basicDrawer.draw(objData, projectionMatrix, viewMatrix, GLES20.GL_POINTS, lightPosInWorldSpace, null, cameraPosInWorldSpace, objData.getDrawMode(), objData.getDrawSize());
748747
} else {
749748

750749
// draw wireframe
@@ -763,7 +762,7 @@ else if (element.getMaterial().getTextureData() != null){
763762
Log.i("ModelRenderer", "Wireframe build: " + wireframe);
764763
}
765764
animator.update(wireframe, scene.isShowBindPose());
766-
drawerObject.draw(wireframe, projectionMatrix, viewMatrix, wireframe.getDrawMode(), wireframe.getDrawSize(), textureId, lightPosInWorldSpace, colorMask, cameraPosInWorldSpace);
765+
drawerObject.draw(wireframe, projectionMatrix, viewMatrix, textureId, lightPosInWorldSpace, colorMask, cameraPosInWorldSpace, wireframe.getDrawMode(), wireframe.getDrawSize());
767766
//objData.render(drawer, lightPosInWorldSpace, colorMask);
768767
} catch (Error e) {
769768
Log.e("ModelRenderer", e.getMessage(), e);
@@ -773,8 +772,7 @@ else if (element.getMaterial().getTextureData() != null){
773772
// draw points
774773
else if (scene.isDrawPoints()) {
775774
drawerObject.draw(objData, projectionMatrix, viewMatrix
776-
, GLES20.GL_POINTS, objData.getDrawSize(),
777-
textureId, lightPosInWorldSpace, colorMask, cameraPosInWorldSpace);
775+
, textureId, lightPosInWorldSpace, colorMask, cameraPosInWorldSpace, GLES20.GL_POINTS, objData.getDrawSize());
778776
objData.render(drawer, scene.getCamera(), lightPosInWorldSpace, colorMask);
779777
}
780778

@@ -792,23 +790,24 @@ else if (scene.isDrawSkeleton() && objData instanceof AnimatedModel && ((Animate
792790
this.skeleton.put(objData, skeleton);
793791
}
794792
final Renderer skeletonDrawer = drawer.getDrawer(skeleton, false, false, drawLighting, doAnimation, drawColors);
795-
skeletonDrawer.draw(skeleton, projectionMatrix, viewMatrix, -1, lightPosInWorldSpace, colorMask, cameraPosInWorldSpace);
793+
skeletonDrawer.draw(skeleton, projectionMatrix, viewMatrix, -1, lightPosInWorldSpace, colorMask, cameraPosInWorldSpace, skeleton.getDrawMode(), skeleton.getDrawSize());
796794
//GLES20.glEnable(GLES20.GL_DEPTH_TEST);
797795

798796
// draw the original object a bit transparent
799-
drawerObject.draw(objData, projectionMatrix, viewMatrix, textureId, lightPosInWorldSpace, Constants.COLOR_HALF_TRANSPARENT, cameraPosInWorldSpace);
797+
drawerObject.draw(objData, projectionMatrix, viewMatrix, textureId, lightPosInWorldSpace, Constants.COLOR_HALF_TRANSPARENT, cameraPosInWorldSpace, objData.getDrawMode(), objData.getDrawSize());
800798
}
801799

802800
// draw solids
803801
else {
804802
if (!infoLogged.containsKey(objData.getId() + "render")) {
805803
Log.i("ModelRenderer", "Rendering object... " + objData.getId());
806-
Log.d("ModelRenderer", objData.getId()+": "+objData);
807-
Log.d("ModelRenderer",objData.getId()+": "+ drawerObject);
804+
Log.d("ModelRenderer", objData.toString());
805+
Log.d("ModelRenderer", drawerObject.toString());
808806
infoLogged.put(objData.getId() + "render", true);
809807
}
810808
drawerObject.draw(objData, projectionMatrix, viewMatrix,
811-
textureId, lightPosInWorldSpace, colorMask, cameraPosInWorldSpace);
809+
textureId, lightPosInWorldSpace, colorMask, cameraPosInWorldSpace,
810+
objData.getDrawMode(), objData.getDrawSize());
812811
objData.render(drawer, scene.getCamera(), lightPosInWorldSpace, colorMask);
813812
}
814813
}
@@ -834,7 +833,7 @@ else if (scene.isDrawSkeleton() && objData instanceof AnimatedModel && ((Animate
834833
false);
835834
animator.update(normalData, scene.isShowBindPose());
836835
normalsDrawer.draw(normalData, projectionMatrix, viewMatrix, -1, lightPosInWorldSpace, colorMask
837-
, cameraPosInWorldSpace);
836+
, cameraPosInWorldSpace, normalData.getDrawMode(), normalData.getDrawSize());
838837
}
839838
}
840839

@@ -864,7 +863,8 @@ private void drawBoundingBox(float[] viewMatrix, float[] projectionMatrix, float
864863
}
865864
Renderer boundingBoxDrawer = drawer.getBoundingBoxDrawer();
866865
boundingBoxDrawer.draw(boundingBoxData, projectionMatrix, viewMatrix, -1,
867-
lightPosInWorldSpace, colorMask, cameraPosInWorldSpace);
866+
lightPosInWorldSpace, colorMask, cameraPosInWorldSpace,
867+
boundingBoxData.getDrawMode(), boundingBoxData.getDrawSize());
868868
}
869869

870870
public int getWidth() {

0 commit comments

Comments
 (0)