1414import net .minecraft .client .renderer .tileentity .TileEntityRendererDispatcher ;
1515import net .minecraft .util .Direction ;
1616import net .minecraft .util .math .AxisAlignedBB ;
17+ import net .minecraft .util .math .BlockPos ;
1718import net .minecraft .util .math .vector .Vector3d ;
1819import net .minecraft .util .math .vector .Vector3f ;
20+ import net .minecraft .util .math .vector .Vector3i ;
1921import net .minecraftforge .client .model .ModelDataManager ;
2022import net .minecraftforge .client .model .data .IModelData ;
2123
2224import java .awt .*;
25+ import java .util .Optional ;
2326
2427import 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}
0 commit comments