33import java .util .List ;
44import java .util .Map .Entry ;
55
6+ import org .joml .FrustumIntersection ;
67import org .joml .Matrix4f ;
78
89import com .mojang .blaze3d .vertex .PoseStack ;
@@ -52,25 +53,33 @@ protected void renderSafe(ChainConveyorBlockEntity be, float partialTicks, PoseS
5253 super .renderSafe (be , partialTicks , ms , buffer , light , overlay );
5354 BlockPos pos = be .getBlockPos ();
5455
55- renderChains (be , ms , buffer , light , overlay );
56+ FrustumIntersection frustum = null ;
57+ Vec3 camPos = null ;
58+ if (Minecraft .getInstance ().level == be .getLevel ())
59+ {
60+ frustum = getFrustumIntersection ();
61+ camPos = Minecraft .getInstance ().gameRenderer .getMainCamera ().getPosition ();
62+ }
63+ renderChains (be , ms , buffer , light , overlay , frustum , camPos );
5664
5765 if (VisualizationManager .supportsVisualization (be .getLevel ()))
5866 return ;
5967
60- CachedBuffers .partial (AllPartialModels .CHAIN_CONVEYOR_WHEEL , be .getBlockState ())
61- .light (light )
62- .overlay (overlay )
63- .renderInto (ms , buffer .getBuffer (RenderType .cutoutMipped ()));
68+ if (frustum != null && frustum .testAab (pos .getX () - 2 - (float ) camPos .x , pos .getY () - (float ) camPos .y , pos .getZ () - 2 - (float ) camPos .z , pos .getX () + 2 - (float ) camPos .x , pos .getY () + 1 - (float ) camPos .y , pos .getZ () + 2 - (float ) camPos .z ))
69+ CachedBuffers .partial (AllPartialModels .CHAIN_CONVEYOR_WHEEL , be .getBlockState ())
70+ .light (light )
71+ .overlay (overlay )
72+ .renderInto (ms , buffer .getBuffer (RenderType .cutoutMipped ()));
6473
6574 for (ChainConveyorPackage box : be .loopingPackages )
66- renderBox (be , ms , buffer , overlay , pos , box , partialTicks );
75+ renderBox (be , ms , buffer , overlay , pos , box , partialTicks , frustum , camPos );
6776 for (Entry <BlockPos , List <ChainConveyorPackage >> entry : be .travellingPackages .entrySet ())
6877 for (ChainConveyorPackage box : entry .getValue ())
69- renderBox (be , ms , buffer , overlay , pos , box , partialTicks );
78+ renderBox (be , ms , buffer , overlay , pos , box , partialTicks , frustum , camPos );
7079 }
7180
7281 private void renderBox (ChainConveyorBlockEntity be , PoseStack ms , MultiBufferSource buffer , int overlay ,
73- BlockPos pos , ChainConveyorPackage box , float partialTicks ) {
82+ BlockPos pos , ChainConveyorPackage box , float partialTicks , FrustumIntersection frustum , Vec3 camPos ) {
7483 if (box .worldPosition == null )
7584 return ;
7685 if (box .item == null || box .item .isEmpty ())
@@ -82,6 +91,9 @@ private void renderBox(ChainConveyorBlockEntity be, PoseStack ms, MultiBufferSou
8291
8392 Vec3 position = physicsData .prevPos .lerp (physicsData .pos , partialTicks );
8493 Vec3 targetPosition = physicsData .prevTargetPos .lerp (physicsData .targetPos , partialTicks );
94+ if (frustum != null && !frustum .testSphere ((float ) (targetPosition .x - camPos .x ), (float ) (targetPosition .y - camPos .y ), (float ) (targetPosition .z - camPos .z ), 1 ))
95+ return ;
96+
8597 float yaw = AngleHelper .angleLerp (partialTicks , physicsData .prevYaw , physicsData .yaw );
8698 Vec3 offset =
8799 new Vec3 (targetPosition .x - pos .getX (), targetPosition .y - pos .getY (), targetPosition .z - pos .getZ ());
@@ -141,7 +153,7 @@ private static Vec3 getClosestPointOnChain(Vec3 cam, Vec3 start, Vec3 end) {
141153 }
142154
143155 private void renderChains (ChainConveyorBlockEntity be , PoseStack ms , MultiBufferSource buffer , int light ,
144- int overlay ) {
156+ int overlay , FrustumIntersection frustum , Vec3 camPos ) {
145157 float time = AnimationTickHolder .getRenderTime (be .getLevel ()) / (360f / Math .abs (be .getSpeed ()));
146158 time %= 1 ;
147159 if (time < 0 )
@@ -154,6 +166,10 @@ private void renderChains(ChainConveyorBlockEntity be, PoseStack ms, MultiBuffer
154166 if (stats == null )
155167 continue ;
156168
169+ if (frustum != null && !frustum .testLineSegment ((float ) (stats .start ().x - camPos .x ), (float ) (stats .start ().y - camPos .y ), (float ) (stats .start ().z - camPos .z ),
170+ (float ) (stats .end ().x - camPos .x ), (float ) (stats .end ().y - camPos .y ), (float ) (stats .end ().z - camPos .z ))) {
171+ continue ;
172+ }
157173 Vec3 diff = stats .end ()
158174 .subtract (stats .start ());
159175 double yaw = (float ) Mth .RAD_TO_DEG * Mth .atan2 (diff .x , diff .z );
@@ -193,9 +209,7 @@ private void renderChains(ChainConveyorBlockEntity be, PoseStack ms, MultiBuffer
193209 level .getBrightness (LightLayer .SKY , tilePos .offset (blockPos )));
194210
195211 boolean far = false ;
196- if (Minecraft .getInstance ().level == be .getLevel ()) {
197- Vec3 camPos = Minecraft .getInstance ()
198- .getBlockEntityRenderDispatcher ().camera .getPosition ();
212+ if (frustum != null ) {
199213 Vec3 closest = getClosestPointOnChain (camPos , stats .start (), stats .end ());
200214 if (closest .distanceToSqr (camPos ) > MIP_DISTANCE_SQR )
201215 far = true ;
0 commit comments