From 09bf91715beaf08b4406ba8099f63f8ae12f163f Mon Sep 17 00:00:00 2001 From: Chicken-Bomes Date: Sun, 15 Jun 2014 02:07:20 +1000 Subject: [PATCH] Seperate colour and lighting a bit. Made baking colours easier and the distinction between dynamic and static rendering easier to manage. Fixed invalid u coords in generateBlock --- src/codechicken/lib/lighting/LightMatrix.java | 3 + src/codechicken/lib/lighting/LightModel.java | 3 + .../lib/lighting/PlanarLightModel.java | 3 + src/codechicken/lib/render/CCModel.java | 74 +++++++++---------- .../lib/render/CCRenderPipeline.java | 4 +- src/codechicken/lib/render/CCRenderState.java | 40 +++++++++- src/codechicken/lib/render/Vertex5.java | 7 +- 7 files changed, 93 insertions(+), 41 deletions(-) diff --git a/src/codechicken/lib/lighting/LightMatrix.java b/src/codechicken/lib/lighting/LightMatrix.java index 5eb6fff..1962eb0 100644 --- a/src/codechicken/lib/lighting/LightMatrix.java +++ b/src/codechicken/lib/lighting/LightMatrix.java @@ -139,6 +139,9 @@ public class LightMatrix implements CCRenderState.IVertexOperation @Override public boolean load() { + if(!CCRenderState.computeLighting) + return false; + CCRenderState.pipeline.addDependency(CCRenderState.colourAttrib); CCRenderState.pipeline.addDependency(CCRenderState.lightCoordAttrib); return true; diff --git a/src/codechicken/lib/lighting/LightModel.java b/src/codechicken/lib/lighting/LightModel.java index aa33a80..eca2f9d 100644 --- a/src/codechicken/lib/lighting/LightModel.java +++ b/src/codechicken/lib/lighting/LightModel.java @@ -82,6 +82,9 @@ public class LightModel implements CCRenderState.IVertexOperation @Override public boolean load() { + if(!CCRenderState.computeLighting) + return false; + CCRenderState.pipeline.addDependency(CCRenderState.normalAttrib); CCRenderState.pipeline.addDependency(CCRenderState.colourAttrib); return true; diff --git a/src/codechicken/lib/lighting/PlanarLightModel.java b/src/codechicken/lib/lighting/PlanarLightModel.java index 942521f..3923198 100644 --- a/src/codechicken/lib/lighting/PlanarLightModel.java +++ b/src/codechicken/lib/lighting/PlanarLightModel.java @@ -18,6 +18,9 @@ public class PlanarLightModel implements CCRenderState.IVertexOperation @Override public boolean load() { + if(!CCRenderState.computeLighting) + return false; + CCRenderState.pipeline.addDependency(CCRenderState.sideAttrib); CCRenderState.pipeline.addDependency(CCRenderState.colourAttrib); return true; diff --git a/src/codechicken/lib/render/CCModel.java b/src/codechicken/lib/render/CCModel.java index d6b2c8e..09eb602 100644 --- a/src/codechicken/lib/render/CCModel.java +++ b/src/codechicken/lib/render/CCModel.java @@ -206,55 +206,55 @@ public class CCModel implements CCRenderState.IVertexSource, Copyable if((mask&1) == 0) {//bottom face u1 = x1; v1 = z1; u2 = x2; v2 = z2; - verts[i++] = new Vertex5(x1, y1, z2, u1, v2); - verts[i++] = new Vertex5(x1, y1, z1, u1, v1); - verts[i++] = new Vertex5(x2, y1, z1, u2, v1); - verts[i++] = new Vertex5(x2, y1, z2, u2, v2); + verts[i++] = new Vertex5(x1, y1, z2, u1, v2, 0); + verts[i++] = new Vertex5(x1, y1, z1, u1, v1, 0); + verts[i++] = new Vertex5(x2, y1, z1, u2, v1, 0); + verts[i++] = new Vertex5(x2, y1, z2, u2, v2, 0); } if((mask&2) == 0) {//top face - u1 = x1+2; v1 = z1; - u2 = x2+2; v2 = z2; - verts[i++] = new Vertex5(x2, y2, z2, u2, v2); - verts[i++] = new Vertex5(x2, y2, z1, u2, v1); - verts[i++] = new Vertex5(x1, y2, z1, u1, v1); - verts[i++] = new Vertex5(x1, y2, z2, u1, v2); + u1 = x1; v1 = z1; + u2 = x2; v2 = z2; + verts[i++] = new Vertex5(x2, y2, z2, u2, v2, 1); + verts[i++] = new Vertex5(x2, y2, z1, u2, v1, 1); + verts[i++] = new Vertex5(x1, y2, z1, u1, v1, 1); + verts[i++] = new Vertex5(x1, y2, z2, u1, v2, 1); } if((mask&4) == 0) {//east face - u1 = 1-x1+4; v1 = 1-y2; - u2 = 1-x2+4; v2 = 1-y1; - verts[i++] = new Vertex5(x1, y1, z1, u1, v2); - verts[i++] = new Vertex5(x1, y2, z1, u1, v1); - verts[i++] = new Vertex5(x2, y2, z1, u2, v1); - verts[i++] = new Vertex5(x2, y1, z1, u2, v2); + u1 = 1-x1; v1 = 1-y2; + u2 = 1-x2; v2 = 1-y1; + verts[i++] = new Vertex5(x1, y1, z1, u1, v2, 2); + verts[i++] = new Vertex5(x1, y2, z1, u1, v1, 2); + verts[i++] = new Vertex5(x2, y2, z1, u2, v1, 2); + verts[i++] = new Vertex5(x2, y1, z1, u2, v2, 2); } if((mask&8) == 0) {//west face - u1 = x1+6; v1 = 1-y2; - u2 = x2+6; v2 = 1-y1; - verts[i++] = new Vertex5(x2, y1, z2, u2, v2); - verts[i++] = new Vertex5(x2, y2, z2, u2, v1); - verts[i++] = new Vertex5(x1, y2, z2, u1, v1); - verts[i++] = new Vertex5(x1, y1, z2, u1, v2); + u1 = x1; v1 = 1-y2; + u2 = x2; v2 = 1-y1; + verts[i++] = new Vertex5(x2, y1, z2, u2, v2, 3); + verts[i++] = new Vertex5(x2, y2, z2, u2, v1, 3); + verts[i++] = new Vertex5(x1, y2, z2, u1, v1, 3); + verts[i++] = new Vertex5(x1, y1, z2, u1, v2, 3); } if((mask&0x10) == 0) {//north face - u1 = z1+8; v1 = 1-y2; - u2 = z2+8; v2 = 1-y1; - verts[i++] = new Vertex5(x1, y1, z2, u2, v2); - verts[i++] = new Vertex5(x1, y2, z2, u2, v1); - verts[i++] = new Vertex5(x1, y2, z1, u1, v1); - verts[i++] = new Vertex5(x1, y1, z1, u1, v2); + u1 = z1; v1 = 1-y2; + u2 = z2; v2 = 1-y1; + verts[i++] = new Vertex5(x1, y1, z2, u2, v2, 4); + verts[i++] = new Vertex5(x1, y2, z2, u2, v1, 4); + verts[i++] = new Vertex5(x1, y2, z1, u1, v1, 4); + verts[i++] = new Vertex5(x1, y1, z1, u1, v2, 4); } if((mask&0x20) == 0) {//south face - u1 = 1-z1+10; v1 = 1-y2; - u2 = 1-z2+10; v2 = 1-y1; - verts[i++] = new Vertex5(x2, y1, z1, u1, v2); - verts[i++] = new Vertex5(x2, y2, z1, u1, v1); - verts[i++] = new Vertex5(x2, y2, z2, u2, v1); - verts[i++] = new Vertex5(x2, y1, z2, u2, v2); + u1 = 1-z1; v1 = 1-y2; + u2 = 1-z2; v2 = 1-y1; + verts[i++] = new Vertex5(x2, y1, z1, u1, v2, 5); + verts[i++] = new Vertex5(x2, y2, z1, u1, v1, 5); + verts[i++] = new Vertex5(x2, y2, z2, u2, v1, 5); + verts[i++] = new Vertex5(x2, y1, z2, u2, v2, 5); } return this; @@ -299,10 +299,10 @@ public class CCModel implements CCRenderState.IVertexSource, Copyable public CCModel computeLighting(LightModel light) { Vector3[] normals = normals(); - int[] colours = getAttributes(CCRenderState.colourAttrib); + int[] colours = getAttributes(CCRenderState.lightingAttrib); if(colours == null) { - setColour(-1); - colours = getAttributes(CCRenderState.colourAttrib); + colours = getOrAllocate(CCRenderState.lightingAttrib); + Arrays.fill(colours, -1); } for(int k = 0; k < verts.length; k++) colours[k] = light.apply(colours[k], normals[k]); diff --git a/src/codechicken/lib/render/CCRenderPipeline.java b/src/codechicken/lib/render/CCRenderPipeline.java index 915cfc5..72fb2b3 100644 --- a/src/codechicken/lib/render/CCRenderPipeline.java +++ b/src/codechicken/lib/render/CCRenderPipeline.java @@ -84,8 +84,10 @@ public class CCRenderPipeline if(CCRenderState.useNormals) addAttribute(CCRenderState.normalAttrib); - if(CCRenderState.hasColour) + if(CCRenderState.useColour) addAttribute(CCRenderState.colourAttrib); + if(CCRenderState.computeLighting) + addAttribute(CCRenderState.lightingAttrib); for(int i = 0; i < ops.size(); i++) { IVertexOperation op = ops.get(i); diff --git a/src/codechicken/lib/render/CCRenderState.java b/src/codechicken/lib/render/CCRenderState.java index 9234837..624244d 100644 --- a/src/codechicken/lib/render/CCRenderState.java +++ b/src/codechicken/lib/render/CCRenderState.java @@ -180,6 +180,32 @@ public class CCRenderState setColour(baseColour); } }; + public static VertexAttribute lightingAttrib = new VertexAttribute() { + private int[] colourRef; + + @Override + public int[] newArray(int length) { + return new int[length]; + } + + @Override + public boolean load() { + if(!computeLighting || !hasColour || !model.hasAttribute(this)) + return false; + + colourRef = model.getAttributes(this); + if(colourRef != null) { + pipeline.addDependency(colourAttrib); + return true; + } + return false; + } + + @Override + public void operate() { + setColour(ColourRGBA.multiply(colour, colourRef[vertexIndex])); + } + }; public static VertexAttribute sideAttrib = new VertexAttribute() { private int[] sideRef; @@ -251,6 +277,8 @@ public class CCRenderState public static int baseColour; public static int alphaOverride; public static boolean useNormals; + public static boolean computeLighting; + public static boolean useColour; public static LightMatrix lightMatrix = new LightMatrix(); //vertex outputs @@ -269,8 +297,8 @@ public class CCRenderState public static void reset() { model = null; pipeline.reset(); - hasNormal = hasBrightness = false; - hasColour = true; + useNormals = hasNormal = hasBrightness = hasColour = false; + useColour = computeLighting = true; baseColour = alphaOverride = -1; } @@ -362,6 +390,14 @@ public class CCRenderState setBrightness((int)OpenGlHelper.lastBrightnessY << 16 | (int)OpenGlHelper.lastBrightnessX); } + /** + * Compact helper for setting dynamic rendering context. Uses normals and doesn't compute lighting + */ + public static void setDynamic() { + useNormals = true; + computeLighting = false; + } + public static void changeTexture(String texture) { changeTexture(new ResourceLocation(texture)); } diff --git a/src/codechicken/lib/render/Vertex5.java b/src/codechicken/lib/render/Vertex5.java index 358b1f8..0339a4f 100644 --- a/src/codechicken/lib/render/Vertex5.java +++ b/src/codechicken/lib/render/Vertex5.java @@ -30,8 +30,13 @@ public class Vertex5 implements Copyable { this(vert, new UV(u, v)); } - + public Vertex5(double x, double y, double z, double u, double v) + { + this(x, y, z, u, v, 0); + } + + public Vertex5(double x, double y, double z, double u, double v, int tex) { this(new Vector3(x, y, z), new UV(u, v)); }