diff --git a/fabric/src/main/java/com/lx862/jcm/mixin/modded/mtr/MainRendererMixin.java b/fabric/src/main/java/com/lx862/jcm/mixin/modded/mtr/MainRendererMixin.java index a59ec12d..a5780f37 100644 --- a/fabric/src/main/java/com/lx862/jcm/mixin/modded/mtr/MainRendererMixin.java +++ b/fabric/src/main/java/com/lx862/jcm/mixin/modded/mtr/MainRendererMixin.java @@ -1,8 +1,13 @@ package com.lx862.jcm.mixin.modded.mtr; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.lx862.mtrscripting.core.util.TimingJS; +import com.lx862.mtrscripting.mod.impl.mtr.vehicle.VehicleRenderDataCache; import org.mtr.mapping.holder.MinecraftClient; +import org.mtr.mapping.holder.Vector3d; import org.mtr.mod.render.MainRenderer; +import org.mtr.mod.render.RenderVehicles; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -10,6 +15,16 @@ @Mixin(value = MainRenderer.class, remap = false) public class MainRendererMixin { + @WrapOperation(method = "render(Lorg/mtr/mapping/mapper/GraphicsHolder;Lorg/mtr/mapping/holder/Vector3d;)V", at = @At(value = "INVOKE", target = "Lorg/mtr/mod/render/RenderVehicles;render(JLorg/mtr/mapping/holder/Vector3d;)V")) + private static void jsblock$cacheVehicleRenderData(long millisElapsed, Vector3d cameraShakeOffset, Operation original) { + VehicleRenderDataCache.startRendering(); + try { + original.call(millisElapsed, cameraShakeOffset); + } finally { + VehicleRenderDataCache.finishRendering(); + } + } + @Inject(method = "getMillisElapsed", at = @At("RETURN")) private static void incrementTimer(CallbackInfoReturnable ci) { long elapsedTime = ci.getReturnValueJ(); diff --git a/fabric/src/main/java/com/lx862/jcm/mixin/modded/mtr/ModelPropertiesPartMixin.java b/fabric/src/main/java/com/lx862/jcm/mixin/modded/mtr/ModelPropertiesPartMixin.java index dadc2b38..19b8d8e3 100644 --- a/fabric/src/main/java/com/lx862/jcm/mixin/modded/mtr/ModelPropertiesPartMixin.java +++ b/fabric/src/main/java/com/lx862/jcm/mixin/modded/mtr/ModelPropertiesPartMixin.java @@ -22,7 +22,7 @@ protected ModelPropertiesPartMixin(PartCondition condition, RenderStage renderSt @Inject(method = "render", at = @At("HEAD"), cancellable = true) private void jsblock$hideDisplayParts(Identifier texture, StoredMatrixTransformations storedMatrixTransformations, VehicleExtension vehicle, int carNumber, int[] scrollingDisplayIndexTracker, int light, ObjectArrayList> openDoorways, boolean fromResourcePackCreator, CallbackInfo ci) { - String vehicleId = vehicle.getVehicleCarsAndPositions().get(carNumber).left().getVehicleId(); + String vehicleId = vehicle.vehicleExtraData.immutableVehicleCars.get(carNumber).getVehicleId(); if(type == PartType.DISPLAY && MTRContentResourceManager.shouldHideDisplayParts(vehicleId)) { ci.cancel(); } diff --git a/fabric/src/main/java/com/lx862/jcm/mixin/modded/mtr/VehicleResourceMixin.java b/fabric/src/main/java/com/lx862/jcm/mixin/modded/mtr/VehicleResourceMixin.java index e4d6e215..c4d61bd7 100644 --- a/fabric/src/main/java/com/lx862/jcm/mixin/modded/mtr/VehicleResourceMixin.java +++ b/fabric/src/main/java/com/lx862/jcm/mixin/modded/mtr/VehicleResourceMixin.java @@ -5,6 +5,7 @@ import com.lx862.mtrscripting.mod.impl.mtr.MTRContentScripting; import com.lx862.mtrscripting.core.util.render.ScriptRenderManager; import com.lx862.mtrscripting.core.util.sound.ScriptSoundManager; +import com.lx862.mtrscripting.mod.impl.mtr.vehicle.VehicleRenderDataCache; import com.lx862.mtrscripting.mod.impl.mtr.vehicle.VehicleScriptInstance; import com.lx862.mtrscripting.core.primitive.ScriptInstance; import com.lx862.mtrscripting.core.primitive.UniqueKey; @@ -50,7 +51,7 @@ public abstract class VehicleResourceMixin { double x = 0, y = 0, z = 0; int total = 0; - ObjectArrayList> bogiePoses = vehicle.getVehicleCarsAndPositions().get(carNumber).right(); + ObjectArrayList> bogiePoses = VehicleRenderDataCache.getVehicleCarsAndPositions(vehicle).get(carNumber).right(); for(ObjectObjectImmutablePair bogiePos : bogiePoses) { x += bogiePos.left().x; y += bogiePos.left().y; diff --git a/fabric/src/main/java/com/lx862/jcm/mod/block/entity/SoundLooperBlockEntity.java b/fabric/src/main/java/com/lx862/jcm/mod/block/entity/SoundLooperBlockEntity.java index 5498949a..c58dfb95 100644 --- a/fabric/src/main/java/com/lx862/jcm/mod/block/entity/SoundLooperBlockEntity.java +++ b/fabric/src/main/java/com/lx862/jcm/mod/block/entity/SoundLooperBlockEntity.java @@ -51,14 +51,16 @@ public void blockEntityTick() { World world = getWorld2(); if(repeatTick > 0 && !soundID.isEmpty() && world != null && !world.isClient() && JCMServerStats.getGameTick() % repeatTick == 0) { - boolean bl1 = world.isEmittingRedstonePower(getPos2(), Direction.NORTH); - boolean bl2 = world.isEmittingRedstonePower(getPos2(), Direction.EAST); - boolean bl3 = world.isEmittingRedstonePower(getPos2(), Direction.SOUTH); - boolean bl4 = world.isEmittingRedstonePower(getPos2(), Direction.WEST); - boolean bl5 = world.isEmittingRedstonePower(getPos2(), Direction.UP); - boolean bl6 = world.isEmittingRedstonePower(getPos2(), Direction.DOWN); - boolean emittingRedstonePower = bl1 || bl2 || bl3 || bl4 || bl5 || bl6; - if(needRedstone && !emittingRedstonePower) return; + if(needRedstone) { + boolean bl1 = world.isEmittingRedstonePower(getPos2(), Direction.NORTH); + boolean bl2 = world.isEmittingRedstonePower(getPos2(), Direction.EAST); + boolean bl3 = world.isEmittingRedstonePower(getPos2(), Direction.SOUTH); + boolean bl4 = world.isEmittingRedstonePower(getPos2(), Direction.WEST); + boolean bl5 = world.isEmittingRedstonePower(getPos2(), Direction.UP); + boolean bl6 = world.isEmittingRedstonePower(getPos2(), Direction.DOWN); + boolean emittingRedstonePower = bl1 || bl2 || bl3 || bl4 || bl5 || bl6; + if(!emittingRedstonePower) return; + } final SoundCategory category = SOURCE_LIST[soundCategory]; Identifier identifier = null; diff --git a/fabric/src/main/java/com/lx862/mtrscripting/mod/impl/mtr/vehicle/VehicleRenderDataCache.java b/fabric/src/main/java/com/lx862/mtrscripting/mod/impl/mtr/vehicle/VehicleRenderDataCache.java new file mode 100644 index 00000000..d292f141 --- /dev/null +++ b/fabric/src/main/java/com/lx862/mtrscripting/mod/impl/mtr/vehicle/VehicleRenderDataCache.java @@ -0,0 +1,51 @@ +package com.lx862.mtrscripting.mod.impl.mtr.vehicle; + +import org.mtr.core.data.VehicleCar; +import org.mtr.core.tool.Vector; +import org.mtr.libraries.it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.mtr.libraries.it.unimi.dsi.fastutil.objects.ObjectObjectImmutablePair; +import org.mtr.mod.data.VehicleExtension; + +public final class VehicleRenderDataCache { + private static final Object LOCK = new Object(); + private static Thread renderingThread; + private static VehicleExtension cachedVehicle; + private static ObjectArrayList>>> cachedVehicleCarsAndPositions; + + private VehicleRenderDataCache() { + } + + public static void startRendering() { + synchronized (LOCK) { + renderingThread = Thread.currentThread(); + cachedVehicle = null; + cachedVehicleCarsAndPositions = null; + } + } + + public static ObjectArrayList>>> getVehicleCarsAndPositions(VehicleExtension vehicle) { + final Thread currentThread = Thread.currentThread(); + synchronized (LOCK) { + if (renderingThread == currentThread) { + if (cachedVehicle == vehicle && cachedVehicleCarsAndPositions != null) { + return cachedVehicleCarsAndPositions; + } + + cachedVehicleCarsAndPositions = vehicle.getVehicleCarsAndPositions(); + cachedVehicle = vehicle; + return cachedVehicleCarsAndPositions; + } + } + return vehicle.getVehicleCarsAndPositions(); + } + + public static void finishRendering() { + synchronized (LOCK) { + if (renderingThread == Thread.currentThread()) { + renderingThread = null; + cachedVehicle = null; + cachedVehicleCarsAndPositions = null; + } + } + } +}