1919import mekanism .client .render .armor .ISpecialGear ;
2020import mekanism .client .render .armor .MekaSuitArmor ;
2121import mekanism .client .render .hud .RadiationOverlay ;
22+ import mekanism .client .render .lib .Outlines ;
23+ import mekanism .client .render .lib .Outlines .Line ;
2224import mekanism .client .render .lib .Quad ;
2325import mekanism .client .render .lib .QuadUtils ;
2426import mekanism .client .render .lib .Vertex ;
9597import net .neoforged .neoforge .event .TickEvent .Phase ;
9698import org .jetbrains .annotations .NotNull ;
9799import org .jetbrains .annotations .Nullable ;
100+ import org .joml .Matrix3f ;
98101import org .joml .Matrix4f ;
99102import org .joml .Vector3f ;
100103import org .joml .Vector4f ;
@@ -103,7 +106,7 @@ public class RenderTickHandler {
103106
104107 public static final Minecraft minecraft = Minecraft .getInstance ();
105108
106- private static final Map <BlockState , List <Vertex [] >> cachedWireFrames = new HashMap <>();
109+ private static final Map <BlockState , List <Line >> cachedWireFrames = new HashMap <>();
107110 private static final Map <Direction , Map <TransmissionType , Model3D >> cachedOverlays = new EnumMap <>(Direction .class );
108111 private static final List <LazyRender > transparentRenderers = new ArrayList <>();
109112 private static final BoltRenderer boltRenderer = new BoltRenderer ();
@@ -401,9 +404,9 @@ public void onBlockHover(RenderHighlightEvent.Block event) {
401404 VertexConsumer buffer = renderer .getBuffer (RenderType .lines ());
402405 //0.4 Alpha
403406 if (wireFrameRenderer .isCombined ()) {
404- renderQuadsWireFrame (actualState , buffer , matrix , world .random , 0 , 0 , 0 , 0x66 );
407+ renderQuadsWireFrame (actualState , buffer , matrix , world .random );
405408 }
406- wireFrameRenderer .renderWireFrame (tile , event .getPartialTick (), matrix , buffer , 0 , 0 , 0 , 0x66 );
409+ wireFrameRenderer .renderWireFrame (tile , event .getPartialTick (), matrix , buffer , 0 , 0 , 0 , 102 );
407410 matrix .popPose ();
408411 shouldCancel = true ;
409412 }
@@ -414,7 +417,7 @@ public void onBlockHover(RenderHighlightEvent.Block event) {
414417 Vec3 viewPosition = info .getPosition ();
415418 matrix .translate (actualPos .getX () - viewPosition .x , actualPos .getY () - viewPosition .y , actualPos .getZ () - viewPosition .z );
416419 //0.4 Alpha
417- renderQuadsWireFrame (actualState , renderer .getBuffer (RenderType .lines ()), matrix , world .random , 0 , 0 , 0 , 0x66 );
420+ renderQuadsWireFrame (actualState , renderer .getBuffer (RenderType .lines ()), matrix , world .random );
418421 matrix .popPose ();
419422 shouldCancel = true ;
420423 }
@@ -465,53 +468,33 @@ public void onBlockHover(RenderHighlightEvent.Block event) {
465468 }
466469 }
467470
468- private void renderQuadsWireFrame (BlockState state , VertexConsumer buffer , PoseStack matrix , RandomSource rand , int red , int green , int blue , int alpha ) {
469- List <Vertex []> vertices = cachedWireFrames .get (state );
470- if (vertices == null ) {
471+ private void renderQuadsWireFrame (BlockState state , VertexConsumer buffer , PoseStack matrix , RandomSource rand ) {
472+ List <Line > lines = cachedWireFrames .get (state );
473+ if (lines == null ) {
471474 BakedModel bakedModel = Minecraft .getInstance ().getBlockRenderer ().getBlockModel (state );
472475 //TODO: Eventually we may want to add support for Model data and maybe render type
473476 ModelData modelData = ModelData .EMPTY ;
474- vertices = new ArrayList <>();
475- for (Direction direction : EnumUtils .DIRECTIONS ) {
476- for (Quad quad : QuadUtils .unpack (bakedModel .getQuads (state , direction , rand , modelData , null ))) {
477- vertices .add (quad .getVertices ());
478- }
479- }
480- for (Quad quad : QuadUtils .unpack (bakedModel .getQuads (state , null , rand , modelData , null ))) {
481- vertices .add (quad .getVertices ());
482- }
483- cachedWireFrames .put (state , vertices );
477+ lines = Outlines .extract (bakedModel , state , rand , modelData );
478+ cachedWireFrames .put (state , lines );
484479 }
485- renderVertexWireFrame (vertices , buffer , matrix .last ().pose (), red , green , blue , alpha );
480+ PoseStack .Pose pose = matrix .last ();
481+ renderVertexWireFrame (lines , buffer , pose .pose (), pose .normal ());
486482 }
487483
488- public static void renderVertexWireFrame (List <Vertex []> allVertices , VertexConsumer buffer , Matrix4f matrix , int red , int green , int blue , int alpha ) {
489- for (Vertex [] vertices : allVertices ) {
490- Vector4f vertex = getVertex (matrix , vertices [0 ]);
491- Vector3f normal = vertices [0 ].getNormal ();
492- Vector4f vertex2 = getVertex (matrix , vertices [1 ]);
493- Vector3f normal2 = vertices [1 ].getNormal ();
494- Vector4f vertex3 = getVertex (matrix , vertices [2 ]);
495- Vector3f normal3 = vertices [2 ].getNormal ();
496- Vector4f vertex4 = getVertex (matrix , vertices [3 ]);
497- Vector3f normal4 = vertices [3 ].getNormal ();
498- buffer .vertex (vertex .x (), vertex .y (), vertex .z ()).color (red , green , blue , alpha ).normal (normal .x (), normal .y (), normal .z ()).endVertex ();
499- buffer .vertex (vertex2 .x (), vertex2 .y (), vertex2 .z ()).color (red , green , blue , alpha ).normal (normal2 .x (), normal2 .y (), normal2 .z ()).endVertex ();
500-
501- buffer .vertex (vertex3 .x (), vertex3 .y (), vertex3 .z ()).color (red , green , blue , alpha ).normal (normal3 .x (), normal3 .y (), normal3 .z ()).endVertex ();
502- buffer .vertex (vertex4 .x (), vertex4 .y (), vertex4 .z ()).color (red , green , blue , alpha ).normal (normal4 .x (), normal4 .y (), normal4 .z ()).endVertex ();
503-
504- buffer .vertex (vertex2 .x (), vertex2 .y (), vertex2 .z ()).color (red , green , blue , alpha ).normal (normal2 .x (), normal2 .y (), normal2 .z ()).endVertex ();
505- buffer .vertex (vertex3 .x (), vertex3 .y (), vertex3 .z ()).color (red , green , blue , alpha ).normal (normal3 .x (), normal3 .y (), normal3 .z ()).endVertex ();
506-
507- buffer .vertex (vertex .x (), vertex .y (), vertex .z ()).color (red , green , blue , alpha ).normal (normal .x (), normal .y (), normal .z ()).endVertex ();
508- buffer .vertex (vertex4 .x (), vertex4 .y (), vertex4 .z ()).color (red , green , blue , alpha ).normal (normal4 .x (), normal4 .y (), normal4 .z ()).endVertex ();
509- }
510- }
484+ public static void renderVertexWireFrame (List <Line > lines , VertexConsumer buffer , Matrix4f pose , Matrix3f poseNormal ) {
485+ //tmp variables to avoid allocating each loop
486+ Vector4f pos = new Vector4f ();
487+ Vector3f normal = new Vector3f ();
488+
489+ for (Line line : lines ) {
490+ poseNormal .transform (line .nX (), line .nY (), line .nZ (), normal );
511491
512- private static Vector4f getVertex (Matrix4f matrix4f , Vertex vertex ) {
513- Vector4f vector4f = new Vector4f ((float ) vertex .getPos ().x (), (float ) vertex .getPos ().y (), (float ) vertex .getPos ().z (), 1 );
514- return vector4f .mul (matrix4f );
492+ pose .transform (line .x1 (), line .y1 (), line .z1 (), 1F , pos );
493+ buffer .vertex (pos .x , pos .y , pos .z ).color (0 , 0 , 0 , 102 ).normal (normal .x , normal .y , normal .z ).endVertex ();
494+
495+ pose .transform (line .x2 (), line .y2 (), line .z2 (), 1F , pos );
496+ buffer .vertex (pos .x , pos .y , pos .z ).color (0 , 0 , 0 , 102 ).normal (normal .x , normal .y , normal .z ).endVertex ();
497+ }
515498 }
516499
517500 private void renderJetpackSmoke (Level world , Vec3 pos , Vec3 motion ) {
0 commit comments