Skip to content

Commit a639beb

Browse files
authored
Merge pull request #217 from the3deers/fix/shadow
Fix/shadow
2 parents dd982da + c75f168 commit a639beb

22 files changed

+1369
-86
lines changed

engine/src/main/java/de/javagl/jgltf/impl/v1/MeshPrimitive.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
/*
2-
* glTF JSON model
3-
*
4-
* Do not modify this class. It is automatically generated
5-
* with JsonModelGen (https://github.com/javagl/JsonModelGen)
6-
* Copyright (c) 2016 Marco Hutter - http://www.javagl.de
7-
*/
1+
/*
2+
* glTF JSON model
3+
*
4+
* Do not modify this class. It is automatically generated
5+
* with JsonModelGen (https://github.com/javagl/JsonModelGen)
6+
* Copyright (c) 2016 Marco Hutter - http://www.javagl.de
7+
*/
88

99
package de.javagl.jgltf.impl.v1;
1010

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

Lines changed: 61 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import android.util.SparseArray;
77

88
import org.andresoviedo.android_3d_model_engine.model.AnimatedModel;
9+
import org.andresoviedo.android_3d_model_engine.model.Constants;
910
import org.andresoviedo.android_3d_model_engine.model.Element;
1011
import org.andresoviedo.android_3d_model_engine.model.Object3DData;
1112
import 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) {

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,10 @@
55
public interface Renderer {
66

77
void draw(Object3DData obj, float[] pMatrix, float[] vMatrix, int textureId, float[] lightPosInWorldSpace, float[] colorMask, float[] cameraPos, int drawType, int drawSize);
8+
9+
void setAutoUseProgram(boolean autoUseProgram);
10+
11+
void useProgram();
12+
13+
int getProgram();
814
}

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

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,24 @@ public RendererFactory(Context context) throws IllegalAccessException, IOExcepti
5757
Log.i("RendererFactory", "Shaders loaded: " + shadersIds.size());
5858
}
5959

60-
public Renderer getDrawer(Object3DData obj, boolean usingSkyBox, boolean usingTextures, boolean usingLights, boolean usingAnimation) {
60+
public Renderer getDrawer(Object3DData obj, boolean usingSkyBox,
61+
boolean usingTextures, boolean usingLights,
62+
boolean usingAnimation, boolean isShadow, boolean isUsingShadows) {
6163

6264
// double check features
6365
final boolean animationOK = obj instanceof AnimatedModel
6466
&& ((AnimatedModel) obj).getAnimation() != null
6567
&& (((AnimatedModel) obj).getAnimation()).isInitialized();
66-
final boolean isAnimated = usingAnimation && animationOK;
67-
final boolean isLighted = usingLights && obj.getNormalsBuffer() != null;
68-
final boolean isTextured = usingTextures && obj.getTextureBuffer() != null;
68+
final boolean isAnimated = usingAnimation && (obj == null || animationOK);
69+
final boolean isLighted = usingLights && obj != null && obj.getNormalsBuffer() != null;
70+
final boolean isTextured = usingTextures && obj != null && obj.getTextureBuffer() != null;
6971

7072
// match shaders
7173
final Shader shader;
7274
if (usingSkyBox){
7375
shader = Shader.SKYBOX;
7476
} else {
75-
shader = getShader(isTextured, isLighted, isAnimated);
77+
shader = getShader(isTextured, isLighted, isAnimated, isShadow, isUsingShadows);
7678
}
7779

7880
// get cached shaders
@@ -112,10 +114,14 @@ public Renderer getDrawer(Object3DData obj, boolean usingSkyBox, boolean usingTe
112114
}
113115

114116
@NonNull
115-
private Shader getShader(boolean isTextured, boolean isLighted, boolean isAnimated) {
117+
private Shader getShader(boolean isTextured, boolean isLighted, boolean isAnimated, boolean isShadow, boolean isUsingShadows) {
116118

117119
final Shader ret;
118-
if (isAnimated || isTextured || isLighted){
120+
if (isShadow) {
121+
return Shader.SHADOW;
122+
} else if (isUsingShadows){
123+
return Shader.SHADOWED;
124+
} else if (isAnimated || isTextured || isLighted){
119125
ret = Shader.ANIMATED;
120126
} else {
121127
ret = Shader.BASIC;
@@ -124,18 +130,27 @@ private Shader getShader(boolean isTextured, boolean isLighted, boolean isAnimat
124130
}
125131

126132
public Renderer getBoundingBoxDrawer() {
127-
return getDrawer(null, false, false, false, false);
133+
return getDrawer(null, false, false, false, false, false, false);
128134
}
129135

130136
public Renderer getFaceNormalsDrawer() {
131-
return getDrawer(null, false, false, false, false);
137+
return getDrawer(null, false, false, false, false, false, false);
132138
}
133139

134140
public Renderer getBasicShader() {
135-
return getDrawer(null, false, false, false, false);
141+
return getDrawer(null, false, false, false, false, false, false);
136142
}
137143

138144
public Renderer getSkyBoxDrawer() {
139-
return getDrawer(null, true, false, false, false);
145+
return getDrawer(null, true, false, false, false, false, false);
140146
}
147+
148+
public Renderer getShadowRenderer(){
149+
return getDrawer(null, false, false, false, true, true, false);
150+
}
151+
152+
public Renderer getShadowRenderer2(Object3DData obj){
153+
return getDrawer(obj, false, true, true, true, false, true);
154+
}
155+
141156
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ public enum Shader {
77

88
SKYBOX("skybox", R.raw.shader_skybox_vert, R.raw.shader_skybox_frag),
99
BASIC("basic", R.raw.shader_basic_vert, R.raw.shader_basic_frag),
10-
ANIMATED("animated", R.raw.shader_animated_vert, R.raw.shader_animated_frag);
10+
ANIMATED("animated", R.raw.shader_animated_vert, R.raw.shader_animated_frag),
11+
SHADOW("shadow", R.raw.shader_v_depth_map, R.raw.shader_f_depth_map),
12+
SHADOWED("shadowed", R.raw.shader_v_with_shadow, R.raw.shader_f_with_simple_shadow);
1113

1214
String id;
1315
int vertexShaderResourceId = -1;

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
@@ -358,7 +358,7 @@ public void render(RendererFactory rendererFactory, Camera camera, float[] light
358358
protected void renderImpl(RendererFactory rendererFactory, float[] lightPosInWorldSpace, float[] colorMask) {
359359
if (!isVisible()) return;
360360
onDrawFrame();
361-
Renderer drawer = rendererFactory.getDrawer(this, false, false, false, false);
361+
Renderer drawer = rendererFactory.getDrawer(this, false, false, false, false, false, false);
362362
drawer.draw(this, projectionMatrix, viewMatrix, -1, lightPosInWorldSpace, colorMask, cameraPosition, this.getDrawMode(), this.getDrawSize());
363363
}
364364

engine/src/main/java/org/andresoviedo/android_3d_model_engine/model/Material.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66

77
public class Material {
88

9-
// constants
10-
private static final float[] COLOR_WHITE = {1f, 1f, 1f, 1f};
11-
129
// material name
1310
private String name;
1411

@@ -155,7 +152,7 @@ public void setEmissiveTextureId(int emissiveTextureId) {
155152

156153
public float[] getColor(){
157154
if (this.color == null){
158-
this.color = new float[]{1f,1f,1f,1f};
155+
this.color = Constants.COLOR_WHITE.clone();
159156
}
160157
if (this.diffuse != null){
161158
this.color[0] = this.diffuse[0];

0 commit comments

Comments
 (0)