Skip to content

Commit aeac9fc

Browse files
committed
First success in rendering scan lines and field box
1 parent 980864e commit aeac9fc

File tree

2 files changed

+160
-90
lines changed

2 files changed

+160
-90
lines changed

src/main/java/com/robotgryphon/compactcrafting/client/render/FieldProjectorRenderer.java

Lines changed: 150 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,15 @@
1414
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
1515
import net.minecraft.util.Direction;
1616
import net.minecraft.util.math.AxisAlignedBB;
17+
import net.minecraft.util.math.BlockPos;
1718
import net.minecraft.util.math.vector.Vector3d;
1819
import net.minecraft.util.math.vector.Vector3f;
20+
import net.minecraft.util.math.vector.Vector3i;
1921
import net.minecraftforge.client.model.ModelDataManager;
2022
import net.minecraftforge.client.model.data.IModelData;
2123

2224
import java.awt.*;
25+
import java.util.Optional;
2326

2427
import static net.minecraft.client.renderer.RenderType.makeType;
2528

@@ -48,11 +51,21 @@ public FieldProjectorRenderer(TileEntityRendererDispatcher rendererDispatcherIn)
4851
}
4952

5053
@Override
51-
public void render(FieldProjectorTile tileEntityIn, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int combinedLightIn, int combinedOverlayIn) {
52-
renderDish(tileEntityIn, matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn);
54+
public void render(FieldProjectorTile tile, float partialTicks, MatrixStack matrixStack, IRenderTypeBuffer buffers, int combinedLightIn, int combinedOverlayIn) {
55+
renderDish(tile, matrixStack, buffers, combinedLightIn, combinedOverlayIn);
5356

54-
AxisAlignedBB cube = new AxisAlignedBB(tileEntityIn.getPos()).grow(3);
55-
renderFaces(tileEntityIn, matrixStackIn, bufferIn, cube, 0);
57+
Optional<BlockPos> c = tile.getCenter();
58+
if(c.isPresent()) {
59+
BlockPos center = c.get();
60+
AxisAlignedBB cube = new AxisAlignedBB(center).grow(2);
61+
62+
renderFaces(tile, matrixStack, buffers, cube, 0);
63+
64+
if(tile.isMainProjector()) {
65+
drawScanLines(tile, matrixStack, buffers, cube, 2);
66+
renderProjectionCube(tile, matrixStack, buffers, cube, 2);
67+
}
68+
}
5669
}
5770

5871
private IBakedModel getModel() {
@@ -124,38 +137,80 @@ private void renderDish(FieldProjectorTile te, MatrixStack mx, IRenderTypeBuffer
124137
* TODO - render projection arc connecting projector to large cube
125138
*/
126139

140+
private void translateRendererToCube(FieldProjectorTile tile, MatrixStack mx, AxisAlignedBB cube, int cubeSize) {
141+
Optional<BlockPos> c = tile.getCenter();
142+
if(!c.isPresent())
143+
return;
144+
145+
BlockPos center = c.get();
146+
147+
// Center on projector
148+
mx.translate(-cube.minX, -cube.minY, -cube.minZ);
149+
mx.translate(-cubeSize, -cubeSize, -cubeSize);
150+
151+
// Now move to actual center
152+
BlockPos projectorPos = tile.getPos();
153+
BlockPos offsetToCenter = center.subtract(projectorPos);
154+
155+
mx.translate(offsetToCenter.getX(), offsetToCenter.getY(), offsetToCenter.getZ());
156+
}
127157
/**
128158
* Handles rendering the main projection cube in the center of the projection area.
129159
* Should only be called by the main projector (typically the NORTH projector)
130160
*/
131-
private void renderProjectionCube() {
132-
// Draw the faces
133-
// buffer.pos(x1, y1, z1).color(cR, cG, cB, cA).endVertex();
134-
// buffer.pos(x1, y2, z1).color(cR, cG, cB, cA).endVertex();
135-
// buffer.pos(x2, y2, z1).color(cR, cG, cB, cA).endVertex();
136-
// buffer.pos(x2, y1, z1).color(cR, cG, cB, cA).endVertex();
137-
// buffer.pos(x1, y1, z2).color(cR, cG, cB, cA).endVertex();
138-
// buffer.pos(x2, y1, z2).color(cR, cG, cB, cA).endVertex();
139-
// buffer.pos(x2, y2, z2).color(cR, cG, cB, cA).endVertex();
140-
// buffer.pos(x1, y2, z2).color(cR, cG, cB, cA).endVertex();
141-
//
142-
// buffer.pos(x1, y1, z1).color(cR, cG, cB, cA).endVertex();
143-
// buffer.pos(x2, y1, z1).color(cR, cG, cB, cA).endVertex();
144-
// buffer.pos(x2, y1, z2).color(cR, cG, cB, cA).endVertex();
145-
// buffer.pos(x1, y1, z2).color(cR, cG, cB, cA).endVertex();
146-
// buffer.pos(x1, y2, z1).color(cR, cG, cB, cA).endVertex();
147-
// buffer.pos(x1, y2, z2).color(cR, cG, cB, cA).endVertex();
148-
// buffer.pos(x2, y2, z2).color(cR, cG, cB, cA).endVertex();
149-
// buffer.pos(x2, y2, z1).color(cR, cG, cB, cA).endVertex();
150-
//
151-
// buffer.pos(x1, y1, z1).color(cR, cG, cB, cA).endVertex();
152-
// buffer.pos(x1, y1, z2).color(cR, cG, cB, cA).endVertex();
153-
// buffer.pos(x1, y2, z2).color(cR, cG, cB, cA).endVertex();
154-
// buffer.pos(x1, y2, z1).color(cR, cG, cB, cA).endVertex();
155-
// buffer.pos(x2, y1, z1).color(cR, cG, cB, cA).endVertex();
156-
// buffer.pos(x2, y2, z1).color(cR, cG, cB, cA).endVertex();
157-
// buffer.pos(x2, y2, z2).color(cR, cG, cB, cA).endVertex();
158-
// buffer.pos(x2, y1, z2).color(cR, cG, cB, cA).endVertex();
161+
private void renderProjectionCube(FieldProjectorTile tile, MatrixStack mx, IRenderTypeBuffer buffers, AxisAlignedBB cube, int cubeSize) {
162+
mx.push();
163+
164+
translateRendererToCube(tile, mx, cube, cubeSize);
165+
166+
IVertexBuilder builder = buffers.getBuffer(RenderTypesExtensions.PROJECTION_FIELD_RENDERTYPE);
167+
168+
Color bounds = new Color(255, 106, 0, 100);
169+
170+
// Draw bounds of projection cube
171+
172+
// North face
173+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.minX, (float) cube.minY, (float) cube.minZ));
174+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.minX, (float) cube.maxY, (float) cube.minZ));
175+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.maxX, (float) cube.maxY, (float) cube.minZ));
176+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.maxX, (float) cube.minY, (float) cube.minZ));
177+
178+
// South face
179+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.maxX, (float) cube.minY, (float) cube.maxZ));
180+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.maxX, (float) cube.maxY, (float) cube.maxZ));
181+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.minX, (float) cube.maxY, (float) cube.maxZ));
182+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.minX, (float) cube.minY, (float) cube.maxZ));
183+
184+
// West face
185+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.minX, (float) cube.minY, (float) cube.maxZ));
186+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.minX, (float) cube.maxY, (float) cube.maxZ));
187+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.minX, (float) cube.maxY, (float) cube.minZ));
188+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.minX, (float) cube.minY, (float) cube.minZ));
189+
190+
// East face
191+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.maxX, (float) cube.minY, (float) cube.minZ));
192+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.maxX, (float) cube.maxY, (float) cube.minZ));
193+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.maxX, (float) cube.maxY, (float) cube.maxZ));
194+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.maxX, (float) cube.minY, (float) cube.maxZ));
195+
196+
// Top face
197+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.minX, (float) cube.maxY, (float) cube.minZ));
198+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.minX, (float) cube.maxY, (float) cube.maxZ));
199+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.maxX, (float) cube.maxY, (float) cube.maxZ));
200+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.maxX, (float) cube.maxY, (float) cube.minZ));
201+
202+
// Bottom face
203+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.minX, (float) cube.minY, (float) cube.maxZ));
204+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.minX, (float) cube.minY, (float) cube.minZ));
205+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.maxX, (float) cube.minY, (float) cube.minZ));
206+
addColoredVertex(builder, mx, bounds, new Vector3f((float) cube.maxX, (float) cube.minY, (float) cube.maxZ));
207+
208+
209+
210+
211+
212+
213+
mx.pop();
159214
}
160215

161216
/**
@@ -204,40 +259,41 @@ private void drawProjectorArcs() {
204259
* Handles drawing the brighter "scan line" around the main projection cube. These lines show visibly
205260
* where the projection arcs meet the main projection cube.
206261
*/
207-
private void drawScanLines() {
208-
// Tessellator tessellator = Tessellator.getInstance();
209-
// BufferBuilder buffer = tessellator.getBuffer();
210-
// buffer.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR);
211-
//
212-
// int color = 0xFF6A00;
213-
// float cR = (color >> 16 & 255) / 255.0f;
214-
// float cG = (color >> 8 & 255) / 255.0f;
215-
// float cB = (color & 255) / 255.0f;
216-
// float cA = 0.5f;
217-
//
218-
// double x1 = cube.minX;
219-
// double x2 = cube.maxX;
220-
// double y1 = cube.minY;
221-
// double y2 = cube.maxY;
222-
// double z1 = cube.minZ;
223-
// double z2 = cube.maxZ;
224-
//
225-
// // Draw the up and down bouncing lines on the sides
226-
// double zAngle = ((Math.sin(Math.toDegrees(RenderTickCounter.renderTicks) / -5000) + 1.0d) / 2) * (y2 - y1);
227-
// double y3 = y1 + zAngle;
228-
// buffer.pos(x1, y3, z1).color(cR, cG, cB, cA).endVertex();
229-
// buffer.pos(x2, y3, z1).color(cR, cG, cB, cA).endVertex();
230-
//
231-
// buffer.pos(x1, y3, z1).color(cR, cG, cB, cA).endVertex();
232-
// buffer.pos(x1, y3, z2).color(cR, cG, cB, cA).endVertex();
233-
//
234-
// buffer.pos(x2, y3, z2).color(cR, cG, cB, cA).endVertex();
235-
// buffer.pos(x2, y3, z1).color(cR, cG, cB, cA).endVertex();
236-
//
237-
// buffer.pos(x1, y3, z2).color(cR, cG, cB, cA).endVertex();
238-
// buffer.pos(x2, y3, z2).color(cR, cG, cB, cA).endVertex();
239-
//
240-
// tessellator.draw();
262+
private void drawScanLines(FieldProjectorTile tile, MatrixStack mx, IRenderTypeBuffer buffers, AxisAlignedBB cube, int cubeSize) {
263+
mx.push();
264+
265+
translateRendererToCube(tile, mx, cube, cubeSize);
266+
267+
IVertexBuilder builder = buffers.getBuffer(RenderType.getLines());
268+
Color fieldColor = new Color(255, 106, 0, 200);
269+
270+
float x1 = (float) cube.minX;
271+
float x2 = (float) cube.maxX;
272+
float y1 = (float) cube.minY;
273+
float y2 = (float) cube.maxY;
274+
float z1 = (float) cube.minZ;
275+
float z2 = (float) cube.maxZ;
276+
277+
// Draw the up and down bouncing lines on the sides
278+
double zAngle = ((Math.sin(Math.toDegrees(RenderTickCounter.renderTicks) / -5000) + 1.0d) / 2) * (y2 - y1);
279+
float y3 = (float) (y1 + zAngle);
280+
281+
282+
283+
// Scan Lines
284+
addColoredVertex(builder, mx, fieldColor, new Vector3f(x1, y3, z1));
285+
addColoredVertex(builder, mx, fieldColor, new Vector3f(x2, y3, z1));
286+
287+
addColoredVertex(builder, mx, fieldColor, new Vector3f(x1, y3, z1));
288+
addColoredVertex(builder, mx, fieldColor, new Vector3f(x1, y3, z2));
289+
290+
addColoredVertex(builder, mx, fieldColor, new Vector3f(x2, y3, z2));
291+
addColoredVertex(builder, mx, fieldColor, new Vector3f(x2, y3, z1));
292+
293+
addColoredVertex(builder, mx, fieldColor, new Vector3f(x1, y3, z2));
294+
addColoredVertex(builder, mx, fieldColor, new Vector3f(x2, y3, z2));
295+
296+
mx.pop();
241297
}
242298

243299
/**
@@ -255,8 +311,7 @@ private void renderFaces(FieldProjectorTile tile, MatrixStack mx, IRenderTypeBuf
255311
try {
256312
IVertexBuilder builder = buffer.getBuffer(RenderTypesExtensions.PROJECTION_FIELD_RENDERTYPE);
257313

258-
int color = 0x88FF6A00;
259-
Color fieldColor = new Color(color, true);
314+
Color fieldColor = new Color(0x88FF6A00, true);
260315

261316
// Draw the faces
262317
Vector3d start = new Vector3d(cube.minX, cube.minY, cube.minZ);
@@ -285,30 +340,30 @@ private void renderFaces(FieldProjectorTile tile, MatrixStack mx, IRenderTypeBuf
285340
// addColoredVertex(builder, mx, fieldColor, new Vector3f(1, 0, .5f));
286341
// addColoredVertex(builder, mx, fieldColor, new Vector3f(0, 0, .5f));
287342

288-
// lines.pos(x2, y2, z1).color(cR, cG, cB, cA).endVertex();
289-
// lines.pos(x2, y1, z1).color(cR, cG, cB, cA).endVertex();
290-
// lines.pos(x1, y1, z2).color(cR, cG, cB, cA).endVertex();
291-
// lines.pos(x2, y1, z2).color(cR, cG, cB, cA).endVertex();
292-
// lines.pos(x2, y2, z2).color(cR, cG, cB, cA).endVertex();
293-
// lines.pos(x1, y2, z2).color(cR, cG, cB, cA).endVertex();
343+
// lines.pos(x2, y2, z1).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
344+
// lines.pos(x2, y1, z1).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
345+
// lines.pos(x1, y1, z2).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
346+
// lines.pos(x2, y1, z2).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
347+
// lines.pos(x2, y2, z2).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
348+
// lines.pos(x1, y2, z2).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
294349
//
295-
// lines.pos(x1, y1, z1).color(cR, cG, cB, cA).endVertex();
296-
// lines.pos(x2, y1, z1).color(cR, cG, cB, cA).endVertex();
297-
// lines.pos(x2, y1, z2).color(cR, cG, cB, cA).endVertex();
298-
// lines.pos(x1, y1, z2).color(cR, cG, cB, cA).endVertex();
299-
// lines.pos(x1, y2, z1).color(cR, cG, cB, cA).endVertex();
300-
// lines.pos(x1, y2, z2).color(cR, cG, cB, cA).endVertex();
301-
// lines.pos(x2, y2, z2).color(cR, cG, cB, cA).endVertex();w
302-
// lines.pos(x2, y2, z1).color(cR, cG, cB, cA).endVertex();
350+
// lines.pos(x1, y1, z1).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
351+
// lines.pos(x2, y1, z1).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
352+
// lines.pos(x2, y1, z2).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
353+
// lines.pos(x1, y1, z2).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
354+
// lines.pos(x1, y2, z1).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
355+
// lines.pos(x1, y2, z2).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
356+
// lines.pos(x2, y2, z2).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();w
357+
// lines.pos(x2, y2, z1).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
303358
//
304-
// lines.pos(x1, y1, z1).color(cR, cG, cB, cA).endVertex();
305-
// lines.pos(x1, y1, z2).color(cR, cG, cB, cA).endVertex();
306-
// lines.pos(x1, y2, z2).color(cR, cG, cB, cA).endVertex();
307-
// lines.pos(x1, y2, z1).color(cR, cG, cB, cA).endVertex();
308-
// lines.pos(x2, y1, z1).color(cR, cG, cB, cA).endVertex();
309-
// lines.pos(x2, y2, z1).color(cR, cG, cB, cA).endVertex();
310-
// lines.pos(x2, y2, z2).color(cR, cG, cB, cA).endVertex();
311-
// lines.pos(x2, y1, z2).color(cR, cG, cB, cA).endVertex();
359+
// lines.pos(x1, y1, z1).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
360+
// lines.pos(x1, y1, z2).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
361+
// lines.pos(x1, y2, z2).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
362+
// lines.pos(x1, y2, z1).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
363+
// lines.pos(x2, y1, z1).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
364+
// lines.pos(x2, y2, z1).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
365+
// lines.pos(x2, y2, z2).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
366+
// lines.pos(x2, y1, z2).color(fieldColor.getRed(), fieldColor.getGreen(), fieldColor.getBlue(), fieldColor.getAlpha()).endVertex();
312367
} catch (Exception ex) {
313368
}
314369

@@ -346,4 +401,9 @@ private void renderFaces(FieldProjectorTile tile, MatrixStack mx, IRenderTypeBuf
346401

347402
// GlStateManager.enableCull();
348403
}
404+
405+
@Override
406+
public boolean isGlobalRenderer(FieldProjectorTile te) {
407+
return true;
408+
}
349409
}

src/main/java/com/robotgryphon/compactcrafting/client/render/RenderTypesExtensions.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,14 @@ public RenderTypesExtensions(String name, VertexFormat format, int p_i225992_3_,
3434
.writeMask(COLOR_WRITE)
3535
.depthTest(DepthTestState.DEPTH_LEQUAL) // Default, but let's make sure it stays that way
3636
.build(false));
37+
38+
public static final RenderType FIELD_PROJECTION_ARC = makeType("projection_field_arc",
39+
DefaultVertexFormats.POSITION_COLOR, GL11.GL_QUADS, 256,
40+
RenderType.State.getBuilder()
41+
.transparency(PROJECTION_TRANSPARENCY)
42+
.target(RenderState.MAIN_TARGET)
43+
.cull(RenderState.CULL_DISABLED)
44+
.writeMask(COLOR_WRITE)
45+
.depthTest(DepthTestState.DEPTH_LEQUAL) // Default, but let's make sure it stays that way
46+
.build(false));
3747
}

0 commit comments

Comments
 (0)