diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/Viewport.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/Viewport.java index b7365280e..3a82e685d 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/Viewport.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/Viewport.java @@ -468,7 +468,7 @@ private void renderViewportTools() { toolShader.setVector3d(gl3, "lightPos", cameraWorldPos); // Light position in world space toolShader.setColor(gl3, "lightColor", Color.WHITE); - toolShader.setColor(gl3, "objectColor", Color.WHITE); + toolShader.setColor(gl3, "diffuseColor", Color.WHITE); toolShader.setColor(gl3, "specularColor", Color.WHITE); toolShader.setColor(gl3,"ambientColor",Color.BLACK); diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawBackground.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawBackground.java index 4261bd487..9d8ca337f 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawBackground.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawBackground.java @@ -161,7 +161,7 @@ private void drawSkybox(GL3 gl3, Camera camera) { shader.setVector3d(gl3,"cameraPos",cameraWorldPos); // Camera position in world space shader.setVector3d(gl3,"lightPos",cameraWorldPos); // Light position in world space shader.setColor(gl3,"lightColor", Color.WHITE); - shader.setColor(gl3,"objectColor",Color.WHITE); + shader.setColor(gl3,"diffuseColor",Color.WHITE); shader.setColor(gl3,"specularColor",Color.BLACK); shader.setColor(gl3,"ambientColor",Color.BLACK); shader.set1i(gl3,"useVertexColor",0); diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawBoundingBoxes.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawBoundingBoxes.java index f87ed801e..bb389f817 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawBoundingBoxes.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawBoundingBoxes.java @@ -138,7 +138,7 @@ public void draw(Viewport viewport) { shader.setMatrix4d(gl3,"modelMatrix",w); // highlight selected items - shader.setColor(gl3,"objectColor", list.contains(meshInstance) ? selected : unselected ); + shader.setColor(gl3,"diffuseColor", list.contains(meshInstance) ? selected : unselected ); // draw it mesh.render(gl3); } diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawCameras.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawCameras.java index 417df38fd..bcfeb3976 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawCameras.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawCameras.java @@ -125,13 +125,13 @@ public void draw(Viewport viewport) { // position and draw the ray from the camera. Matrix4d w = MatrixHelper.createIdentityMatrix4(); shader.setMatrix4d(gl3, "modelMatrix", w); - shader.setColor(gl3,"objectColor",selected ? Color.GREEN : Color.DARK_GRAY); + shader.setColor(gl3,"diffuseColor",selected ? Color.GREEN : Color.DARK_GRAY); Ray ray = viewport.getRayThroughPoint(cam,normalizedCoordinates.x,normalizedCoordinates.y); changeRayMesh(gl3, ray); rayMesh.render(gl3); // scale and draw the view cones - shader.setColor(gl3,"objectColor",selected ? Color.WHITE : Color.BLACK); + shader.setColor(gl3,"diffuseColor",selected ? Color.WHITE : Color.BLACK); w = cam.getWorld(); Matrix4d scale = MatrixHelper.createIdentityMatrix4(); scale.m00 *= canvasWidth * coneScale; diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawDHParameters.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawDHParameters.java index 0d5cfb4a1..9c24c8ab1 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawDHParameters.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawDHParameters.java @@ -79,7 +79,7 @@ public void draw(Viewport viewport) { shader.setVector3d(gl3,"cameraPos",cameraWorldPos); // Camera position in world space shader.setVector3d(gl3,"lightPos",cameraWorldPos); // Light position in world space shader.setColor(gl3,"lightColor", Color.WHITE); - shader.setColor(gl3,"objectColor",Color.WHITE); + shader.setColor(gl3,"diffuseColor",Color.WHITE); shader.setColor(gl3,"specularColor",Color.DARK_GRAY); shader.setColor(gl3,"ambientColor",Color.BLACK); shader.set1i(gl3,"useVertexColor",1); @@ -101,7 +101,7 @@ public void draw(Viewport viewport) { if(!(node instanceof DHParameter parameter)) continue; if(getActiveStatus()==SOMETIMES && !list.contains(parameter)) continue; - shader.setColor(gl3,"objectColor",list.contains(parameter) ? Color.WHITE : Color.GRAY); + shader.setColor(gl3,"diffuseColor",list.contains(parameter) ? Color.WHITE : Color.GRAY); double d = parameter.getD(); mesh.setVertex(1,0,0,d); diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawGroundPlane.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawGroundPlane.java index 99da12ed4..beb2b6ae1 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawGroundPlane.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawGroundPlane.java @@ -73,7 +73,7 @@ public void draw(Viewport viewport) { shader.setVector3d(gl3,"cameraPos",cameraWorldPos); // Camera position in world space shader.setVector3d(gl3,"lightPos",cameraWorldPos); // Light position in world space shader.setColor(gl3,"lightColor", Color.WHITE); - shader.setColor(gl3,"objectColor",new Color(255,255,255,128)); + shader.setColor(gl3,"diffuseColor",new Color(255,255,255,128)); shader.setColor(gl3,"specularColor",Color.GRAY); shader.setColor(gl3,"ambientColor",Color.WHITE); shader.set1i(gl3,"useVertexColor",1); @@ -92,7 +92,7 @@ public void draw(Viewport viewport) { w.transpose(); shader.setMatrix4d(gl3,"modelMatrix",w); shader.set1i(gl3,"useVertexColor",0); - shader.setColor(gl3,"objectColor",new Color(255,255,255,8)); + shader.setColor(gl3,"diffuseColor",new Color(255,255,255,8)); gridMesh.render(gl3); } } diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawHingeJoints.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawHingeJoints.java index 8a4a58db6..53e19d7df 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawHingeJoints.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawHingeJoints.java @@ -106,7 +106,7 @@ public void draw(Viewport viewport) { w.mul(rZ); w.mul(w,MatrixHelper.createScaleMatrix4(scale)); w.transpose(); - shader.setColor(gl3,"objectColor",new Color(255,255,0,64)); + shader.setColor(gl3,"diffuseColor",new Color(255,255,0,64)); shader.setMatrix4d(gl3,"modelMatrix",w); // draw the range fan int range = Math.max(0, (int)(joint.getMaxAngle()-joint.getMinAngle()) ); @@ -118,7 +118,7 @@ public void draw(Viewport viewport) { w.mul(rZ); w.mul(w,MatrixHelper.createScaleMatrix4(scale)); w.transpose(); - shader.setColor(gl3,"objectColor",Color.WHITE); + shader.setColor(gl3,"diffuseColor",Color.WHITE); shader.setMatrix4d(gl3,"modelMatrix",w); currentAngleMesh.render(gl3); } diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawMeshes.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawMeshes.java index 15b3de5d7..d9aea370b 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawMeshes.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawMeshes.java @@ -23,6 +23,7 @@ import java.awt.*; import java.util.ArrayList; import java.util.List; +import java.util.Stack; import java.util.prefs.Preferences; /** @@ -107,7 +108,7 @@ private void createShadowFBOandDepthMap(GL3 gl3) { OpenGLHelper.checkGLError(gl3,logger); } - private void generateDepthMap(GL3 gl3, List meshes) { + private void generateDepthMap(GL3 gl3, List meshes) { // before, set up the shadow FBO gl3.glViewport(0,0,SHADOW_WIDTH,SHADOW_HEIGHT); gl3.glBindFramebuffer(GL3.GL_FRAMEBUFFER, shadowFBO[0]); @@ -119,7 +120,8 @@ private void generateDepthMap(GL3 gl3, List meshes) { shadowShader.setMatrix4d(gl3, "lightProjectionMatrix", lightProjection); shadowShader.setMatrix4d(gl3, "lightViewMatrix", lightView); - for(MeshInstance meshInstance : meshes) { + for(MeshMaterial meshMaterial : meshes) { + MeshInstance meshInstance = meshMaterial.meshInstance(); Matrix4d w = meshInstance.getWorld(); w.transpose(); shadowShader.setMatrix4d(gl3,"modelMatrix",w); @@ -168,11 +170,11 @@ public void draw(Viewport viewport) { if (camera == null) return; GL3 gl3 = GLContext.getCurrentGL().getGL3(); - List meshes = collectAllMeshes(); + var meshMaterial = collectAllMeshes(); updateLightMatrix(); - generateDepthMap(gl3,meshes); - drawAllMeshes(gl3,meshes,camera); + generateDepthMap(gl3,meshMaterial); + drawAllMeshes(gl3,meshMaterial,camera); //drawShadowQuad(gl3,camera); } @@ -185,7 +187,7 @@ private void drawShadowQuad(GL3 gl3, Camera camera) { meshShader.setVector3d(gl3, "lightPos", cameraWorldPos); // Light position in world space meshShader.setColor(gl3, "lightColor", Color.WHITE); - meshShader.setColor(gl3, "objectColor", Color.WHITE); + meshShader.setColor(gl3, "diffuseColor", Color.WHITE); meshShader.setColor(gl3, "specularColor", Color.WHITE); meshShader.setColor(gl3,"ambientColor",Color.BLACK); @@ -207,25 +209,36 @@ private void drawShadowQuad(GL3 gl3, Camera camera) { shadowQuad.render(gl3); } - // find all MeshInstance nodes in Registry - private List collectAllMeshes() { - List meshes = new ArrayList<>(); - - List toScan = new ArrayList<>(Registry.getScene().getChildren()); - while(!toScan.isEmpty()) { - Node node = toScan.remove(0); - toScan.addAll(node.getChildren()); + /** + * find all MeshInstance nodes in the scene and the Material that is closest to the MeshInstance. + * @return a list of MeshInstance and Material pairs. + */ + private List collectAllMeshes() { + var meshMaterials = new ArrayList(); + collAllMeshesRecursively(Registry.getScene(),meshMaterials,new Material()); + return meshMaterials; + } - if (node instanceof MeshInstance meshInstance) { - // if they have a mesh, draw it. - Mesh mesh = meshInstance.getMesh(); - if (mesh != null) meshes.add(meshInstance); + private void collAllMeshesRecursively(Node node, List meshMaterials, Material lastMaterialSeen) { + if (node instanceof MeshInstance meshInstance) { + // if they have a mesh, draw it. + Mesh mesh = meshInstance.getMesh(); + if (mesh != null) { + meshMaterials.add(new MeshMaterial(meshInstance,lastMaterialSeen)); } } - return meshes; + + Material found = node.findFirstChild(Material.class); + if(found != null) { + lastMaterialSeen = found; + } + + for(Node child : node.getChildren()) { + collAllMeshesRecursively(child,meshMaterials,lastMaterialSeen); + } } - private void drawAllMeshes(GL3 gl3, List meshes, Camera camera) { + private void drawAllMeshes(GL3 gl3, List meshes, Camera camera) { meshShader.use(gl3); meshShader.set1i(gl3,"shadowMap",shadowMapUnit); meshShader.setMatrix4d(gl3, "lightProjectionMatrix", lightProjection); @@ -238,7 +251,7 @@ private void drawAllMeshes(GL3 gl3, List meshes, Camera camera) { meshShader.setVector3d(gl3, "lightPos", sunlightSource); // Light position in world space meshShader.setColor(gl3, "lightColor", sunlightColor); - meshShader.setColor(gl3, "objectColor", Color.WHITE); + meshShader.setColor(gl3, "diffuseColor", Color.WHITE); meshShader.setColor(gl3, "specularColor", Color.WHITE); meshShader.setColor(gl3,"ambientColor",Color.LIGHT_GRAY); @@ -247,25 +260,23 @@ private void drawAllMeshes(GL3 gl3, List meshes, Camera camera) { meshShader.set1i(gl3, "diffuseTexture", 0); OpenGLHelper.checkGLError(gl3, logger); - for(MeshInstance meshInstance : meshes) { + Material lastSeen = null; + TextureWithMetadata texture = null; + + for(MeshMaterial meshMaterial : meshes) { + MeshInstance meshInstance = meshMaterial.meshInstance(); + Material material = meshMaterial.material(); Mesh mesh = meshInstance.getMesh(); - TextureWithMetadata texture = null; // set the texture to the first sibling that is a material and has a texture - Material material = meshInstance.findFirstSibling(Material.class); - if(material!=null) { - if(material.getTexture()!=null) { - texture = material.getTexture(); - } - meshShader.setColor(gl3,"objectColor",material.getDiffuseColor()); + if( material != lastSeen ) { + lastSeen = material; + texture = material.getTexture(); + meshShader.setColor(gl3,"diffuseColor",material.getDiffuseColor()); meshShader.setColor(gl3,"specularColor",material.getSpecularColor()); + meshShader.setColor(gl3,"emissionColor",material.getEmissionColor()); meshShader.set1i(gl3,"useLighting",material.isLit() ? 1 : 0); meshShader.set1i(gl3,"shininess",material.getShininess()); - } else { - meshShader.setColor(gl3,"objectColor",Color.WHITE); - meshShader.setColor(gl3,"specularColor",Color.WHITE); - meshShader.set1i(gl3,"useLighting",1); - meshShader.set1i(gl3,"shininess",0); } if(texture == null) { gl3.glDisable(GL3.GL_TEXTURE_2D); diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawPoses.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawPoses.java index 065e3c9f3..037a11533 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawPoses.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/DrawPoses.java @@ -64,7 +64,7 @@ public void draw(Viewport viewport) { shader.setVector3d(gl3,"cameraPos",cameraWorldPos); // Camera position in world space shader.setVector3d(gl3,"lightPos",cameraWorldPos); // Light position in world space shader.setColor(gl3,"lightColor", Color.WHITE); - shader.setColor(gl3,"objectColor",Color.WHITE); + shader.setColor(gl3,"diffuseColor",Color.WHITE); shader.setColor(gl3,"specularColor",Color.DARK_GRAY); shader.setColor(gl3,"ambientColor",Color.BLACK); shader.set1i(gl3,"useVertexColor",1); @@ -86,7 +86,7 @@ public void draw(Viewport viewport) { boolean selected = list.contains(pose); if (getActiveStatus() == SOMETIMES && !selected) continue; - shader.setColor(gl3, "objectColor", selected ? Color.WHITE : Color.GRAY); + shader.setColor(gl3, "diffuseColor", selected ? Color.WHITE : Color.GRAY); Matrix4d w = pose.getWorld(); w.mul(w, MatrixHelper.createScaleMatrix4(selected ? 2 : 1)); diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/MeshMaterial.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/MeshMaterial.java new file mode 100644 index 000000000..cbd83c704 --- /dev/null +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/renderpasses/MeshMaterial.java @@ -0,0 +1,7 @@ +package com.marginallyclever.ro3.apps.viewport.renderpasses; + +import com.marginallyclever.ro3.node.nodes.Material; +import com.marginallyclever.ro3.node.nodes.pose.poses.MeshInstance; + +public record MeshMaterial(MeshInstance meshInstance, Material material) { +} diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/Compass3D.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/Compass3D.java index 1d6c29375..44350b5d0 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/Compass3D.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/Compass3D.java @@ -134,7 +134,7 @@ public void render(GL3 gl3, ShaderProgram shaderProgram) { // for the gizmo, set the model matrix to be the identity matrix. Matrix4d model = MatrixHelper.createScaleMatrix4(handleLength-handleRadius); model.transpose(); - shaderProgram.setColor(gl3,"objectColor",Color.WHITE); + shaderProgram.setColor(gl3,"diffuseColor",Color.WHITE); shaderProgram.setMatrix4d(gl3,"modelMatrix",model); // and use vertex colors. shaderProgram.set1i(gl3,"useVertexColor",1); @@ -167,7 +167,7 @@ private void drawWhiteCircle(GL3 gl3, ShaderProgram shaderProgram, Vector3d z) { model.transpose(); shaderProgram.setMatrix4d(gl3, "modelMatrix", model); shaderProgram.set1i(gl3, "useVertexColor", 0); - shaderProgram.setColor(gl3, "objectColor", new Color(255, 255, 255, 64)); + shaderProgram.setColor(gl3, "diffuseColor", new Color(255, 255, 255, 64)); circleMesh.render(gl3); } } diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/move/RotateToolOneAxis.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/move/RotateToolOneAxis.java index 8fab83131..26988c186 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/move/RotateToolOneAxis.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/move/RotateToolOneAxis.java @@ -357,7 +357,7 @@ public void render(GL3 gl, ShaderProgram shaderProgram) { drawMainRingAndHandles(gl,shaderProgram); if(dragging) { - shaderProgram.set4f(gl, "objectColor", 1,1,1,1); + shaderProgram.set4f(gl, "diffuseColor", 1,1,1,1); drawWhileDragging(gl,shaderProgram); } } @@ -397,7 +397,7 @@ private void drawMainRingAndHandles(GL3 gl,ShaderProgram shaderProgram) { float red = color.red * colorScale / 255f; float green = color.green * colorScale / 255f; float blue = color.blue * colorScale / 255f; - shaderProgram.set4f(gl, "objectColor", red, green, blue, 1.0f); + shaderProgram.set4f(gl, "diffuseColor", red, green, blue, 1.0f); ringMesh.render(gl,1,360); m.transpose(); diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/move/TranslateToolOneAxis.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/move/TranslateToolOneAxis.java index 257d3637a..0cde652f8 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/move/TranslateToolOneAxis.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/move/TranslateToolOneAxis.java @@ -251,10 +251,10 @@ public void render(GL3 gl, ShaderProgram shaderProgram) { float red = color.red * colorScale / 255f; float green = color.green * colorScale / 255f; float blue = color.blue * colorScale / 255f; - shaderProgram.set4f(gl,"objectColor",red, green, blue, 1.0f); + shaderProgram.set4f(gl,"diffuseColor",red, green, blue, 1.0f); */ shaderProgram.set1i(gl,"useTexture",0); - shaderProgram.set4f(gl,"objectColor",0,0,0, 1.0f); + shaderProgram.set4f(gl,"diffuseColor",0,0,0, 1.0f); // handle Matrix4d m = new Matrix4d(pivotMatrix); @@ -284,7 +284,7 @@ public void render(GL3 gl, ShaderProgram shaderProgram) { shaderProgram.setMatrix4d(gl,"modelMatrix",model); shaderProgram.set1i(gl,"diffuseTexture",0); - shaderProgram.set4f(gl,"objectColor",1,1,1, 1.0f); + shaderProgram.set4f(gl,"diffuseColor",1,1,1, 1.0f); shaderProgram.set1i(gl,"useTexture",1); texture.use(shaderProgram); quad.render(gl); diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/move/TranslateToolTwoAxis.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/move/TranslateToolTwoAxis.java index 7d401ccda..1bf5f87dc 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/move/TranslateToolTwoAxis.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/viewporttools/move/TranslateToolTwoAxis.java @@ -222,12 +222,12 @@ public void render(GL3 gl, ShaderProgram shaderProgram) { gl.glDisable(GL3.GL_CULL_FACE); // fill - shaderProgram.set4f(gl, "objectColor", red, green, blue, 0.5f); + shaderProgram.set4f(gl, "diffuseColor", red, green, blue, 0.5f); quadMesh.setRenderStyle(GL3.GL_TRIANGLE_FAN); quadMesh.render(gl); // edge - shaderProgram. set4f(gl, "objectColor", red, green, blue, 1.0f); + shaderProgram. set4f(gl, "diffuseColor", red, green, blue, 1.0f); quadMesh.setRenderStyle(GL3.GL_LINE_LOOP); quadMesh.render(gl); diff --git a/src/main/resources/com/marginallyclever/ro3/apps/viewport/default.frag b/src/main/resources/com/marginallyclever/ro3/apps/viewport/default.frag index 8224f046f..6e9d050c4 100644 --- a/src/main/resources/com/marginallyclever/ro3/apps/viewport/default.frag +++ b/src/main/resources/com/marginallyclever/ro3/apps/viewport/default.frag @@ -9,7 +9,8 @@ out vec4 finalColor; uniform vec4 specularColor = vec4(0.5, 0.5, 0.5,1); uniform vec4 ambientColor = vec4(0.2, 0.2, 0.2,1); -uniform vec4 objectColor = vec4(1,1,1,1); +uniform vec4 diffuseColor = vec4(1,1,1,1); +uniform vec4 emissionColor = vec4(0,0,0,1); uniform vec4 lightColor = vec4(1,1,1,1); uniform int shininess = 32; @@ -23,11 +24,11 @@ uniform bool useLighting; uniform bool useVertexColor; // per-vertex color void main() { - vec4 diffuseColor = objectColor; - if(useVertexColor) diffuseColor *= fragmentColor; - if(useTexture) diffuseColor *= texture(diffuseTexture, textureCoord); + vec4 myColor = diffuseColor; + if(useVertexColor) myColor *= fragmentColor; + if(useTexture) myColor *= texture(diffuseTexture, textureCoord); - vec4 result = vec4(diffuseColor); + vec4 result = myColor; if(useLighting) { vec3 norm = normalize(normalVector); @@ -45,9 +46,10 @@ void main() { // put it all together. result *= ambientColor + diffuseLight + specularLight; + result += emissionColor; } //finalColor = vec4(textureCoord.x,textureCoord.y,0,1); // for testing texture coordinates finalColor = result; - finalColor.a = diffuseColor.a; + finalColor.a = myColor.a; } diff --git a/src/main/resources/com/marginallyclever/ro3/apps/viewport/renderpasses/mesh.frag b/src/main/resources/com/marginallyclever/ro3/apps/viewport/renderpasses/mesh.frag index a154d5da6..69de12e29 100644 --- a/src/main/resources/com/marginallyclever/ro3/apps/viewport/renderpasses/mesh.frag +++ b/src/main/resources/com/marginallyclever/ro3/apps/viewport/renderpasses/mesh.frag @@ -10,9 +10,10 @@ in VS_OUT { vec4 fragPosLightSpace; } fs_in; -uniform vec4 specularColor = vec4(0, 0, 0, 1); uniform vec4 ambientColor = vec4(0, 0, 0, 1); -uniform vec4 objectColor = vec4(1,1,1,1); +uniform vec4 diffuseColor = vec4(1,1,1,1); +uniform vec4 emissionColor = vec4(0,0,0,1); +uniform vec4 specularColor = vec4(0, 0, 0, 1); uniform vec4 lightColor = vec4(1,1,1,1); uniform int shininess = 0; uniform float specularStrength = 0.5; @@ -54,11 +55,11 @@ float ShadowCalculation(vec4 fragPosLightSpace,vec3 normal,vec3 lightDir) { } void main() { - vec4 diffuseColor = objectColor; - if(useVertexColor) diffuseColor *= fs_in.fragmentColor; - if(useTexture) diffuseColor *= texture(diffuseTexture, fs_in.textureCoord); + vec4 myColor = diffuseColor; + if(useVertexColor) myColor *= fs_in.fragmentColor; + if(useTexture) myColor *= texture(diffuseTexture, fs_in.textureCoord); - vec4 result = diffuseColor; + vec4 result = myColor; if(useLighting) { vec3 norm = normalize(fs_in.normalVector); @@ -79,6 +80,7 @@ void main() { // put it all together. result *= ambientColor + (diffuseLight + specularLight) * (1.0 - shadow); + result += emissionColor; } //finalColor = vec4(fs_in.textureCoord.x,fs_in.textureCoord.y,0,1); // for testing texture coordinates