Skip to content

Commit d5fbf9f

Browse files
committed
- Fix OredictCache deadlock.
- Fix MEBus deadlock (#89). - Extend the catch type of the try catch. - Fix BlockInfo#apply cause error. - BlockController#onNeighborChange -> BlockController#neighborChanged - Controller renderer code internal changes.
1 parent de2da1d commit d5fbf9f

File tree

14 files changed

+213
-207
lines changed

14 files changed

+213
-207
lines changed

src/main/java/com/cleanroommc/client/util/BlockInfo.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,16 +86,18 @@ public void apply(World world, BlockPos pos) {
8686
if (tileEntity == null) {
8787
return;
8888
}
89-
world.setTileEntity(pos, tileEntity);
89+
try {
90+
world.setTileEntity(pos, tileEntity);
91+
} catch (Throwable e) {
92+
return;
93+
}
9094
if (teTag == null) {
9195
return;
9296
}
9397
try {
9498
tileEntity.readFromNBT(teTag);
95-
} catch (Exception e) {
99+
} catch (Throwable e) {
96100
ModularMachinery.log.warn("Failed to apply NBT to TileEntity!", e);
97-
world.removeTileEntity(pos);
98-
world.setTileEntity(pos, blockState.getBlock().createTileEntity(world, blockState));
99101
}
100102
}
101103
}

src/main/java/github/kasuminova/mmce/client/renderer/GeoModelRenderTask.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,25 @@ public class GeoModelRenderTask extends RecursiveAction {
1414

1515
private final MachineControllerRenderer renderer;
1616
private final TileMultiblockMachineController ctrl;
17-
private final float partialTicks;
1817
private volatile BufferBuilder buffer;
1918
private volatile BufferBuilder emissiveBuffer;
2019

21-
public GeoModelRenderTask(final MachineControllerRenderer renderer, final TileMultiblockMachineController ctrl, final float partialTicks) {
20+
public GeoModelRenderTask(final MachineControllerRenderer renderer, final TileMultiblockMachineController ctrl) {
2221
this.renderer = renderer;
2322
this.ctrl = ctrl;
24-
this.partialTicks = partialTicks;
2523
this.buffer = BufferBuilderPool.borrowBuffer(1024);
2624
this.emissiveBuffer = BufferBuilderPool.borrowBuffer(128);
2725
}
2826

2927
@Override
30-
protected void compute() {
28+
protected synchronized void compute() {
3129
if (buffer == null) {
3230
buffer = BufferBuilderPool.borrowBuffer(1024);
3331
}
3432
if (emissiveBuffer == null) {
3533
emissiveBuffer = BufferBuilderPool.borrowBuffer(128);
3634
}
37-
renderer.renderAsync(ctrl, buffer, emissiveBuffer, partialTicks);
35+
renderer.renderAsync(ctrl, buffer, emissiveBuffer);
3836
}
3937

4038
public synchronized void draw() {
@@ -50,9 +48,14 @@ public synchronized void draw() {
5048

5149
@Override
5250
@SuppressWarnings("deprecation")
53-
protected synchronized void finalize() throws Throwable {
54-
try {
55-
Minecraft.getMinecraft().addScheduledTask(() -> {
51+
protected void finalize() throws Throwable {
52+
if (buffer == null && emissiveBuffer == null) {
53+
super.finalize();
54+
return;
55+
}
56+
57+
Minecraft.getMinecraft().addScheduledTask(() -> {
58+
synchronized (this) {
5659
if (buffer != null) {
5760
BufferBuilderPool.returnBuffer(buffer);
5861
buffer = null;
@@ -61,10 +64,10 @@ protected synchronized void finalize() throws Throwable {
6164
BufferBuilderPool.returnBuffer(emissiveBuffer);
6265
emissiveBuffer = null;
6366
}
64-
});
65-
} finally {
66-
super.finalize();
67-
}
67+
}
68+
});
69+
70+
super.finalize();
6871
}
6972

7073
}

src/main/java/github/kasuminova/mmce/client/renderer/MachineControllerRenderer.java

Lines changed: 52 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import hellfirepvp.modularmachinery.common.base.Mods;
88
import hellfirepvp.modularmachinery.common.data.Config;
99
import hellfirepvp.modularmachinery.common.tiles.base.TileMultiblockMachineController;
10+
import io.netty.util.internal.ThrowableUtil;
1011
import net.minecraft.client.Minecraft;
1112
import net.minecraft.client.renderer.BufferBuilder;
1213
import net.minecraft.client.renderer.GlStateManager;
@@ -21,7 +22,6 @@
2122
import software.bernie.geckolib3.core.IAnimatable;
2223
import software.bernie.geckolib3.core.IAnimatableModel;
2324
import software.bernie.geckolib3.core.controller.AnimationController;
24-
import software.bernie.geckolib3.core.util.Color;
2525
import software.bernie.geckolib3.geo.render.built.*;
2626

2727
import javax.vecmath.Vector3f;
@@ -30,7 +30,6 @@
3030
import java.util.WeakHashMap;
3131

3232
@SuppressWarnings({"unchecked", "rawtypes"})
33-
@Optional.Interface(iface = "software.bernie.geckolib3.renderers.geo.IGeoRenderer", modid = "geckolib3")
3433
public class MachineControllerRenderer extends TileEntitySpecialRenderer<TileMultiblockMachineController> {
3534

3635
public static final MachineControllerRenderer INSTANCE = new MachineControllerRenderer();
@@ -70,21 +69,14 @@ protected static void rotateBlock(EnumFacing facing) {
7069
}
7170
}
7271

73-
private static EnumFacing getFacing(TileMultiblockMachineController tile) {
74-
return tile.getControllerRotation();
75-
}
76-
77-
public static Color getRenderColor(TileMultiblockMachineController animatable, float partialTicks) {
78-
return Color.ofRGBA(255, 255, 255, 255);
79-
}
80-
81-
public static int getUniqueID(TileMultiblockMachineController animatable) {
82-
return animatable.hashCode();
83-
}
84-
8572
@Override
8673
public void render(TileMultiblockMachineController te, double x, double y, double z, float partialTicks, int destroyStage, float alpha) {
87-
this.render(te, x, y, z, partialTicks, destroyStage);
74+
try {
75+
this.render(te, x, y, z, partialTicks, destroyStage);
76+
} catch (Throwable e) {
77+
ModularMachinery.log.warn("Failed to render controller model!");
78+
ModularMachinery.log.warn(ThrowableUtil.stackTraceToString(e));
79+
}
8880
}
8981

9082
@Optional.Method(modid = "geckolib3")
@@ -102,40 +94,47 @@ public void render(TileMultiblockMachineController tile, double x, double y, dou
10294
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, lx, ly);
10395
GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit);
10496

105-
GlStateManager.pushMatrix();
106-
GlStateManager.translate(x, y, z);
107-
GlStateManager.translate(0, 0.01f, 0);
108-
GlStateManager.translate(0.5, 0, 0.5);
109-
110-
rotateBlock(getFacing(tile));
111-
11297
Minecraft.getMinecraft().renderEngine.bindTexture(modelProvider.getTextureLocation());
113-
render(modelProvider, tile, partialTicks);
114-
GlStateManager.popMatrix();
98+
render(modelProvider, tile, x, y, z, partialTicks);
11599
}
116100

117101
@Optional.Method(modid = "geckolib3")
118102
public void render(final MachineControllerModel modelProvider,
119103
final TileMultiblockMachineController tile,
104+
double x, double y, double z,
120105
final float partialTicks)
121106
{
122107
GlStateManager.disableCull();
123108
GlStateManager.enableRescaleNormal();
109+
GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
110+
GlStateManager.alphaFunc(516, 0.1F);
111+
GlStateManager.enableBlend();
112+
GlStateManager.depthMask(true);
113+
GlStateManager.shadeModel(7425);
114+
115+
GlStateManager.pushMatrix();
116+
GlStateManager.translate(x, y, z);
117+
GlStateManager.translate(0, 0.01f, 0);
118+
GlStateManager.translate(0.5, 0, 0.5);
119+
rotateBlock(tile.getControllerRotation());
124120

125121
if (Config.asyncControllerModelRender) {
126-
renderWithBuffer(tile, partialTicks);
122+
renderWithBuffer(tile);
127123
} else {
128-
renderWithDefault(modelProvider, tile, partialTicks);
124+
renderWithDefault(modelProvider, tile);
129125
}
130126

127+
GlStateManager.popMatrix();
128+
GlStateManager.resetColor();
131129
GlStateManager.disableRescaleNormal();
132130
GlStateManager.enableCull();
133131
}
134132

135-
private void renderWithBuffer(final TileMultiblockMachineController animatable, final float partialTicks) {
133+
@Optional.Method(modid = "geckolib3")
134+
private void renderWithBuffer(final TileMultiblockMachineController animatable) {
136135
GeoModelRenderTask task = TASKS.get(animatable);
137136
if (task == null) {
138-
task = new GeoModelRenderTask(this, animatable, partialTicks);
137+
task = new GeoModelRenderTask(this, animatable);
139138
task.compute();
140139
} else if (!task.isDone()) {
141140
long current = System.currentTimeMillis();
@@ -146,73 +145,57 @@ private void renderWithBuffer(final TileMultiblockMachineController animatable,
146145
}
147146
}
148147

149-
GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
150-
GlStateManager.alphaFunc(516, 0.1F);
151-
GlStateManager.enableBlend();
152-
GlStateManager.depthMask(true);
153-
GlStateManager.shadeModel(7425);
154-
155148
task.draw();
156-
157-
GlStateManager.resetColor();
158-
159149
task.reinitialize();
160150
TASKS.put(animatable, (GeoModelRenderTask) TaskExecutor.FORK_JOIN_POOL.submit(task));
161151
}
162152

153+
@Optional.Method(modid = "geckolib3")
163154
private void renderWithDefault(final MachineControllerModel modelProvider,
164-
final TileMultiblockMachineController tile,
165-
final float partialTicks)
155+
final TileMultiblockMachineController ctrl)
166156
{
167157
GeoModel model = modelProvider.getModel();
168-
modelProvider.setLivingAnimations(tile, getUniqueID(tile));
158+
modelProvider.setLivingAnimations(ctrl, ctrl.hashCode());
169159

170160
BufferBuilder builder = Tessellator.getInstance().getBuffer();
171-
172161
builder.begin(GL11.GL_QUADS, VERTEX_FORMAT);
173162

174-
Color renderColor = getRenderColor(tile, partialTicks);
175-
float r = (float) renderColor.getRed() / 255f;
176-
float g = (float) renderColor.getGreen() / 255f;
177-
float b = (float) renderColor.getBlue() / 255f;
178-
float a = (float) renderColor.getAlpha() / 255f;
179-
180163
// Render all top level bones
181164
for (GeoBone group : model.topLevelBones) {
182-
renderRecursively(builder, group, r, g, b, a);
165+
renderRecursively(builder, group, 1F, 1F, 1F, 1F);
183166
}
184167

185168
Tessellator.getInstance().draw();
186169
}
187170

188-
public void renderAsync(TileMultiblockMachineController tile, BufferBuilder buffer, BufferBuilder emissiveBuffer, float partialTicks) {
171+
@Optional.Method(modid = "geckolib3")
172+
public void renderAsync(TileMultiblockMachineController tile,
173+
BufferBuilder buffer, BufferBuilder emissiveBuffer)
174+
{
189175
MachineControllerModel modelProvider = tile.getCurrentModel();
190176
if (modelProvider == null) {
191177
return;
192178
}
193179
GeoModel model = modelProvider.getModel();
194180
synchronized (model) {
195-
modelProvider.setLivingAnimations(tile, getUniqueID(tile));
196-
181+
modelProvider.setLivingAnimations(tile, tile.hashCode());
197182
buffer.begin(GL11.GL_QUADS, VERTEX_FORMAT);
198-
199-
Color renderColor = getRenderColor(tile, partialTicks);
200-
float r = (float) renderColor.getRed() / 255f;
201-
float g = (float) renderColor.getGreen() / 255f;
202-
float b = (float) renderColor.getBlue() / 255f;
203-
float a = (float) renderColor.getAlpha() / 255f;
183+
emissiveBuffer.begin(GL11.GL_QUADS, VERTEX_FORMAT);
204184

205185
// Render all top level bones
206186
for (GeoBone group : model.topLevelBones) {
207-
renderRecursively(buffer, emissiveBuffer, group, r, g, b, a);
187+
renderRecursively(buffer, emissiveBuffer, group, 1F, 1F, 1F, 1F);
208188
}
209189

190+
emissiveBuffer.finishDrawing();
210191
buffer.finishDrawing();
211192
}
212193
}
213194

214195
@Optional.Method(modid = "geckolib3")
215-
public void renderRecursively(BufferBuilder buffer, GeoBone bone, float red, float green, float blue, float alpha) {
196+
public void renderRecursively(BufferBuilder buffer, GeoBone bone,
197+
float red, float green, float blue, float alpha)
198+
{
216199
boolean emissive = bone.name.equals("emissive");
217200
float lastBrightnessX = 0;
218201
float lastBrightnessY = 0;
@@ -221,7 +204,7 @@ public void renderRecursively(BufferBuilder buffer, GeoBone bone, float red, flo
221204
lastBrightnessX = OpenGlHelper.lastBrightnessX;
222205
lastBrightnessY = OpenGlHelper.lastBrightnessY;
223206
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240f, 240f);
224-
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR_NORMAL);
207+
buffer.begin(GL11.GL_QUADS, VERTEX_FORMAT);
225208
}
226209

227210
MatrixStack matrixStack = MATRIX_STACK.get();
@@ -250,12 +233,15 @@ public void renderRecursively(BufferBuilder buffer, GeoBone bone, float red, flo
250233
if (emissive) {
251234
Tessellator.getInstance().draw();
252235
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, lastBrightnessX, lastBrightnessY);
253-
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR_NORMAL);
236+
buffer.begin(GL11.GL_QUADS, VERTEX_FORMAT);
254237
}
255238
}
256239

257240
@Optional.Method(modid = "geckolib3")
258-
public void renderRecursively(BufferBuilder buffer, BufferBuilder emissiveBuffer, GeoBone bone, float red, float green, float blue, float alpha) {
241+
public void renderRecursively(BufferBuilder buffer, BufferBuilder emissiveBuffer,
242+
GeoBone bone,
243+
float red, float green, float blue, float alpha)
244+
{
259245
boolean emissive = bone.name.equals("emissive");
260246

261247
MatrixStack matrixStack = MATRIX_STACK.get();
@@ -284,7 +270,10 @@ public void renderRecursively(BufferBuilder buffer, BufferBuilder emissiveBuffer
284270
}
285271

286272
@Optional.Method(modid = "geckolib3")
287-
public void renderCube(final BufferBuilder builder, final GeoCube cube, final float red, final float green, final float blue, final float alpha) {
273+
public void renderCube(final BufferBuilder builder,
274+
final GeoCube cube,
275+
final float red, final float green, final float blue, final float alpha)
276+
{
288277
MatrixStack matrixStack = MATRIX_STACK.get();
289278
matrixStack.moveToPivot(cube);
290279
matrixStack.rotate(cube);

src/main/java/github/kasuminova/mmce/client/util/MatrixStack.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
import javax.vecmath.Matrix3f;
88
import javax.vecmath.Matrix4f;
99
import javax.vecmath.Vector3f;
10-
import java.util.LinkedList;
10+
import java.util.ArrayDeque;
1111

1212
public class MatrixStack {
13-
private final LinkedList<Matrix4f> model = new LinkedList<>();
14-
private final LinkedList<Matrix3f> normal = new LinkedList<>();
13+
private final ArrayDeque<Matrix4f> model = new ArrayDeque<>();
14+
private final ArrayDeque<Matrix3f> normal = new ArrayDeque<>();
1515

1616
private final Matrix4f tempModelMatrix = new Matrix4f();
1717
private final Matrix3f tempNormalMatrix = new Matrix3f();

src/main/java/github/kasuminova/mmce/common/concurrent/TaskExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ private int executeMainThreadActions() {
143143
while ((action = mainThreadActions.poll()) != null) {
144144
try {
145145
action.doAction();
146-
} catch (Exception e) {
146+
} catch (Throwable e) {
147147
ModularMachinery.log.warn("An error occurred during synchronous task execution!");
148148
ModularMachinery.log.warn(ThrowableUtil.stackTraceToString(e));
149149
}

0 commit comments

Comments
 (0)