mirror of
https://github.com/GTNewHorizons/CodeChickenCore.git
synced 2026-11-12 08:17:42 +00:00
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
This commit is contained in:
1 parent
97cb16586a
commit
09bf91715b
7 files changed
+93
-41
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -206,55 +206,55 @@ public class CCModel implements CCRenderState.IVertexSource, Copyable<CCModel>
|
||||
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<CCModel>
|
||||
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]);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -180,6 +180,32 @@ public class CCRenderState
|
||||
setColour(baseColour);
|
||||
}
|
||||
};
|
||||
public static VertexAttribute<int[]> lightingAttrib = new VertexAttribute<int[]>() {
|
||||
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<int[]> sideAttrib = new VertexAttribute<int[]>() {
|
||||
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));
|
||||
}
|
||||
|
||||
@@ -30,8 +30,13 @@ public class Vertex5 implements Copyable<Vertex5>
|
||||
{
|
||||
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));
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user