11package dev .compactmods .crafting .client .render ;
22
3+ import java .util .HashMap ;
4+ import java .util .Optional ;
35import java .util .Set ;
4- import java .util .stream .Collectors ;
56import com .mojang .blaze3d .matrix .MatrixStack ;
67import dev .compactmods .crafting .Registration ;
8+ import dev .compactmods .crafting .api .field .MiniaturizationFieldSize ;
79import dev .compactmods .crafting .capability .IProjectorRenderInfo ;
10+ import dev .compactmods .crafting .client .ClientConfig ;
811import dev .compactmods .crafting .projector .FieldProjectorBlock ;
912import dev .compactmods .crafting .projector .ProjectorHelper ;
13+ import net .minecraft .block .AbstractBlock ;
1014import net .minecraft .block .BlockState ;
15+ import net .minecraft .block .Blocks ;
1116import net .minecraft .client .Minecraft ;
1217import net .minecraft .client .renderer .ActiveRenderInfo ;
1318import net .minecraft .client .renderer .IRenderTypeBuffer ;
19+ import net .minecraft .client .world .ClientWorld ;
1420import net .minecraft .util .Direction ;
1521import net .minecraft .util .math .BlockPos ;
1622import net .minecraft .util .math .vector .Vector3d ;
1925public class ClientProjectorRenderInfo implements IProjectorRenderInfo {
2026
2127 private final BlockState baseState ;
22- private Set <BlockPos > remainingProjectors ;
28+ private final HashMap <BlockPos , Direction > remainingProjectors ;
2329 private int renderTime ;
2430
2531
2632 public ClientProjectorRenderInfo () {
33+ this .remainingProjectors = new HashMap <>(4 );
2734 this .baseState = Registration .FIELD_PROJECTOR_BLOCK .get ().defaultBlockState ();
2835 }
2936
3037 @ Override
3138 public Set <BlockPos > getMissingProjectors () {
32- return remainingProjectors ;
39+ return remainingProjectors . keySet () ;
3340 }
3441
3542 @ Override
@@ -39,48 +46,82 @@ public int getRenderTimeLeft() {
3946
4047 @ Override
4148 public void render (MatrixStack matrixStack ) {
42- if (this .renderTime == 0 ) return ;
43- if (this .remainingProjectors .isEmpty ()) return ;
49+ if (this .renderTime == 0 ) return ;
50+ if (this .remainingProjectors .isEmpty ()) return ;
4451
45- final IRenderTypeBuffer .Impl buffers = Minecraft .getInstance ().renderBuffers ().bufferSource ();
46- final ActiveRenderInfo mainCamera = Minecraft .getInstance ().gameRenderer .getMainCamera ();
52+ final Minecraft mc = Minecraft .getInstance ();
53+ final IRenderTypeBuffer .Impl buffers = mc .renderBuffers ().bufferSource ();
54+ final ActiveRenderInfo mainCamera = mc .gameRenderer .getMainCamera ();
55+ final ClientWorld level = mc .level ;
4756
4857 matrixStack .pushPose ();
4958 Vector3d projectedView = mainCamera .getPosition ();
5059 matrixStack .translate (-projectedView .x , -projectedView .y , -projectedView .z );
5160
52- remainingProjectors .forEach (pos -> {
61+ remainingProjectors .forEach (( pos , dir ) -> {
5362 matrixStack .pushPose ();
5463 matrixStack .translate (
55- (double ) pos .getX (),
56- (double ) pos .getY (),
57- (double ) pos .getZ ()
64+ (double ) pos .getX () + 0.05 ,
65+ (double ) pos .getY () + 0.05 ,
66+ (double ) pos .getZ () + 0.05
5867 );
5968
60- GhostRenderer .renderTransparentBlock (baseState , matrixStack , buffers );
69+ matrixStack .scale (0.9f , 0.9f , 0.9f );
70+
71+ GhostRenderer .renderTransparentBlock (baseState .setValue (FieldProjectorBlock .FACING , dir ), pos , matrixStack , buffers , renderTime );
6172 matrixStack .popPose ();
73+
74+ for (int y = -1 ; y > -10 ; y --) {
75+ BlockPos realPos = new BlockPos (pos .getX (), pos .getY () + y , pos .getZ ());
76+ if (!level .isStateAtPosition (realPos , AbstractBlock .AbstractBlockState ::isAir ))
77+ break ;
78+
79+ matrixStack .pushPose ();
80+ matrixStack .translate (
81+ (double ) pos .getX () + 0.15 ,
82+ (double ) pos .getY () + 0.15 + y ,
83+ (double ) pos .getZ () + 0.15
84+ );
85+
86+ matrixStack .scale (0.6f , 0.6f , 0.6f );
87+ GhostRenderer .renderTransparentBlock (Blocks .BLACK_STAINED_GLASS .defaultBlockState (), null , matrixStack , buffers , renderTime );
88+ matrixStack .popPose ();
89+ }
6290 });
6391
6492 matrixStack .popPose ();
93+ buffers .endBatch ();
6594 }
6695
6796 @ Override
6897 public void tick () {
69- if (renderTime > 0 )
70- this .renderTime --;
71- if (renderTime < 0 )
72- this .renderTime = 0 ;
98+ if (renderTime > 0 ) this .renderTime --;
99+ if (renderTime < 0 ) this .renderTime = 0 ;
73100 }
74101
75102 @ Override
76103 public void resetRenderTime () {
77- this .renderTime = 20 * 10 ;
104+ this .renderTime = ClientConfig . placementTime ;
78105 }
79106
80107 @ Override
81108 public void setProjector (World level , BlockPos initial ) {
82- this .remainingProjectors = ProjectorHelper .getMissingProjectors (level , initial ,
83- FieldProjectorBlock .getDirection (level , initial ).orElse (Direction .UP ))
84- .collect (Collectors .toSet ());
109+ remainingProjectors .clear ();
110+
111+ Optional <MiniaturizationFieldSize > fieldSize = ProjectorHelper .getClosestOppositeSize (level , initial );
112+ final Direction initialFacing = FieldProjectorBlock .getDirection (level , initial ).orElse (Direction .UP );
113+ if (fieldSize .isPresent ()) {
114+ final BlockPos center = fieldSize .get ().getCenterFromProjector (initial , initialFacing );
115+ Direction .Plane .HORIZONTAL .stream ()
116+ .forEach (dir -> {
117+ if (dir == initialFacing ) return ;
118+
119+ final BlockPos location = fieldSize .get ().getProjectorLocationForDirection (center , dir );
120+ remainingProjectors .put (location , dir .getOpposite ());
121+ });
122+ } else {
123+ ProjectorHelper .getValidOppositePositions (initial , initialFacing )
124+ .forEach (pos -> this .remainingProjectors .put (pos , initialFacing .getOpposite ()));
125+ }
85126 }
86127}
0 commit comments