Skip to content

Commit

Permalink
impelmented #271, recursive material properties
Browse files Browse the repository at this point in the history
  • Loading branch information
i-make-robots committed Jan 21, 2024
1 parent 46953d3 commit f803e81
Show file tree
Hide file tree
Showing 16 changed files with 90 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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()) );
Expand All @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.prefs.Preferences;

/**
Expand Down Expand Up @@ -107,7 +108,7 @@ private void createShadowFBOandDepthMap(GL3 gl3) {
OpenGLHelper.checkGLError(gl3,logger);
}

private void generateDepthMap(GL3 gl3, List<MeshInstance> meshes) {
private void generateDepthMap(GL3 gl3, List<MeshMaterial> meshes) {
// before, set up the shadow FBO
gl3.glViewport(0,0,SHADOW_WIDTH,SHADOW_HEIGHT);
gl3.glBindFramebuffer(GL3.GL_FRAMEBUFFER, shadowFBO[0]);
Expand All @@ -119,7 +120,8 @@ private void generateDepthMap(GL3 gl3, List<MeshInstance> 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);
Expand Down Expand Up @@ -168,11 +170,11 @@ public void draw(Viewport viewport) {
if (camera == null) return;

GL3 gl3 = GLContext.getCurrentGL().getGL3();
List<MeshInstance> meshes = collectAllMeshes();
var meshMaterial = collectAllMeshes();

updateLightMatrix();
generateDepthMap(gl3,meshes);
drawAllMeshes(gl3,meshes,camera);
generateDepthMap(gl3,meshMaterial);
drawAllMeshes(gl3,meshMaterial,camera);
//drawShadowQuad(gl3,camera);
}

Expand All @@ -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);

Expand All @@ -207,25 +209,36 @@ private void drawShadowQuad(GL3 gl3, Camera camera) {
shadowQuad.render(gl3);
}

// find all MeshInstance nodes in Registry
private List<MeshInstance> collectAllMeshes() {
List<MeshInstance> meshes = new ArrayList<>();

List<Node> 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<MeshMaterial> collectAllMeshes() {
var meshMaterials = new ArrayList<MeshMaterial>();
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<MeshMaterial> 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<MeshInstance> meshes, Camera camera) {
private void drawAllMeshes(GL3 gl3, List<MeshMaterial> meshes, Camera camera) {
meshShader.use(gl3);
meshShader.set1i(gl3,"shadowMap",shadowMapUnit);
meshShader.setMatrix4d(gl3, "lightProjectionMatrix", lightProjection);
Expand All @@ -238,7 +251,7 @@ private void drawAllMeshes(GL3 gl3, List<MeshInstance> 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);

Expand All @@ -247,25 +260,23 @@ private void drawAllMeshes(GL3 gl3, List<MeshInstance> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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));
Expand Down
Original file line number Diff line number Diff line change
@@ -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) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);
Expand All @@ -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;
}
Loading

0 comments on commit f803e81

Please sign in to comment.