Skip to content

Commit 397b825

Browse files
committed
- Optifine completely destroys the preview cache, so structures can only be rendered in the worst possible way.
- Fix the issue where the catalyst is bound to be consumed.
1 parent eceba8d commit 397b825

File tree

9 files changed

+131
-45
lines changed

9 files changed

+131
-45
lines changed

src/main/java/com/cleanroommc/client/preview/renderer/scene/WorldSceneRenderer.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.cleanroommc.client.util.*;
44
import com.cleanroommc.client.util.world.LRDummyWorld;
55
import github.kasuminova.mmce.client.util.BufferBuilderPool;
6-
import it.unimi.dsi.fastutil.objects.Object2IntArrayMap;
76
import it.unimi.dsi.fastutil.objects.Object2IntMap;
87
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
98
import net.minecraft.block.Block;
@@ -107,17 +106,19 @@ public WorldSceneRenderer(LRDummyWorld world) {
107106
}
108107

109108
public WorldSceneRenderer useCacheBuffer(boolean useCache) {
110-
if (this.useCache || !OpenGlHelper.useVbo() || !Minecraft.getMinecraft().isCallingFromMinecraftThread()) return this;
109+
if (this.useCache == useCache || !Minecraft.getMinecraft().isCallingFromMinecraftThread()) {
110+
return this;
111+
}
111112
deleteCacheBuffer();
112-
if (useCache) {
113+
if (useCache && OpenGlHelper.useVbo()) {
113114
this.setVertexBuffers(new VertexBuffer[BlockRenderLayer.values().length]);
114115
for (int j = 0; j < BlockRenderLayer.values().length; ++j) {
115116
this.vertexBuffers.getBuffer()[j] = new VertexBuffer(DefaultVertexFormats.BLOCK);
116117
this.vertexBuffers.getAnotherBuffer()[j] = new VertexBuffer(DefaultVertexFormats.BLOCK);
117118
}
118119
stopCompileCache();
119-
cacheState.set(CacheState.NEED);
120120
}
121+
cacheState.set(useCache ? CacheState.NEED : CacheState.UNUSED);
121122
this.useCache = useCache;
122123
return this;
123124
}
@@ -142,14 +143,16 @@ public WorldSceneRenderer deleteCacheBuffer() {
142143
} catch (InterruptedException ignored) {
143144
}
144145
}
145-
for (int i = 0; i < BlockRenderLayer.values().length; ++i) {
146-
if (bufferRef[i] != null) {
147-
bufferRef[i].deleteGlBuffers();
148-
}
149-
if (anotherBufferRef[i] != null) {
150-
anotherBufferRef[i].deleteGlBuffers();
146+
Minecraft.getMinecraft().addScheduledTask(() -> {
147+
for (int i = 0; i < BlockRenderLayer.values().length; ++i) {
148+
if (bufferRef[i] != null) {
149+
bufferRef[i].deleteGlBuffers();
150+
}
151+
if (anotherBufferRef[i] != null) {
152+
anotherBufferRef[i].deleteGlBuffers();
153+
}
151154
}
152-
}
155+
});
153156
layerBufferBuilders.values().stream()
154157
.filter(buffer -> buffer != null)
155158
.forEach(BufferBuilderPool::returnBuffer);
@@ -167,7 +170,7 @@ public WorldSceneRenderer needCompileCache() {
167170
stopCompileCache();
168171
cacheState.set(CacheState.NEED);
169172
} else {
170-
switchLRRenderer(Minecraft.getMinecraft());
173+
switchLRRenderer();
171174
}
172175
return this;
173176
}
@@ -584,12 +587,12 @@ private void compileCache(final Minecraft mc, final BlockRenderLayer oldRenderLa
584587
cacheState.set(CacheState.COMPILED);
585588
maxProgress = -1;
586589

587-
switchLRRenderer(mc);
590+
switchLRRenderer();
588591

589592
thread = null;
590593
}
591594

592-
protected void switchLRRenderer(final Minecraft mc) {
595+
public void switchLRRenderer() {
593596
dummyWorld.setUseLeft(!dummyWorld.isUseLeft());
594597
vertexBuffers.setUseLeft(!vertexBuffers.isUseLeft());
595598
renderedBlocksMap.setUseLeft(!renderedBlocksMap.isUseLeft());
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.cleanroommc.client.shader;
2+
3+
import net.minecraft.client.renderer.OpenGlHelper;
4+
import net.minecraftforge.fml.relauncher.Side;
5+
import net.minecraftforge.fml.relauncher.SideOnly;
6+
7+
import java.lang.reflect.Field;
8+
import java.util.function.BooleanSupplier;
9+
10+
@SideOnly(Side.CLIENT)
11+
public class ShaderManager {
12+
13+
private static final BooleanSupplier optifine$shaderPackLoaded;
14+
15+
static {
16+
Field shaderPackLoadedField = null;
17+
try {
18+
Class<?> shadersClass = Class.forName("net.optifine.shaders.Shaders");
19+
shaderPackLoadedField = shadersClass.getDeclaredField("shaderPackLoaded");
20+
} catch (Exception ignored) {
21+
}
22+
if (shaderPackLoadedField == null) {
23+
optifine$shaderPackLoaded = () -> false;
24+
} else {
25+
Field finalShaderPackLoadedField = shaderPackLoadedField;
26+
optifine$shaderPackLoaded = () -> {
27+
try {
28+
return finalShaderPackLoadedField.getBoolean(null);
29+
} catch (IllegalAccessException ignored) {
30+
}
31+
return false;
32+
};
33+
}
34+
}
35+
36+
public static boolean isOptifineShaderPackLoaded() {
37+
return OpenGlHelper.areShadersSupported() && optifine$shaderPackLoaded.getAsBoolean();
38+
}
39+
40+
}

src/main/java/github/kasuminova/mmce/client/gui/widget/HorizontalLine.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ public class HorizontalLine extends DynamicWidget {
1313

1414
@Override
1515
public void render(final WidgetGui gui, final RenderSize renderSize, final RenderPos renderPos, final MousePos mousePos) {
16-
GuiContainer.drawRect(renderPos.posX(), renderPos.posY(), renderPos.posX() + width, renderPos.posY() + height, color);
17-
GlStateManager.color(1f, 1f, 1f, 1f);
16+
if (width > 0) {
17+
GuiContainer.drawRect(renderPos.posX(), renderPos.posY(), renderPos.posX() + width, renderPos.posY() + height, color);
18+
GlStateManager.color(1f, 1f, 1f, 1f);
19+
}
1820
}
1921

2022
public int getColor() {

src/main/java/github/kasuminova/mmce/client/gui/widget/preview/MachineStructurePreviewPanel.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ public MachineStructurePreviewPanel(final DynamicMachine machine) {
5454
// Title, at panel top...
5555
StructurePreviewTitle title = new StructurePreviewTitle(machine);
5656

57-
// Compiler progress bar, at renderer top...
58-
PreviewCompilerProgressbar compilerProgressbar = new PreviewCompilerProgressbar(renderer);
57+
// Preview Status Bar, at renderer top...
58+
PreviewStatusBar previewStatusBar = new PreviewStatusBar(renderer);
5959

6060
// Buttons, at preview bottom...
6161
Button5State menuBtn = new Button5State();
@@ -86,7 +86,7 @@ public MachineStructurePreviewPanel(final DynamicMachine machine) {
8686
// ====================
8787
title.setAbsXY(5, 5);
8888

89-
compilerProgressbar.setMaxWidth(172)
89+
previewStatusBar.setMaxWidth(172)
9090
.setAbsXY(6, 26);
9191

9292
menuBtn.setClickedTextureXY(184 + 15 + 15, 15)
@@ -151,7 +151,7 @@ public MachineStructurePreviewPanel(final DynamicMachine machine) {
151151
? Collections.singletonList(I18n.format("gui.preview.button.toggle_unformed.tip"))
152152
: Collections.singletonList(I18n.format("gui.preview.button.toggle_formed.tip")))
153153
.setWidthHeight(13, 13);
154-
showUpgrades.setClickedTextureXY(184 + 15 + 15 + 15, 90)
154+
showUpgrades.setClickedTextureXY(184 + 15 + 15, 90)
155155
.setMouseDownTextureXY(184 + 15 + 15, 90)
156156
.setHoveredTextureXY(184 + 15, 90)
157157
.setTextureXY(184, 90)
@@ -206,7 +206,7 @@ public MachineStructurePreviewPanel(final DynamicMachine machine) {
206206
// Add all widgets to preview panel...
207207
addWidgets(
208208
title,
209-
compilerProgressbar,
209+
previewStatusBar,
210210
rightTopMenu, bottomMenu,
211211
ingredientList,
212212
selectedBlockIngredientMain.setDisabled(true), selectedBlockIngredientList.setDisabled(true),
@@ -274,6 +274,9 @@ protected List<String> getMachineExtraInfo(final DynamicMachine machine) {
274274
if (!machine.getDynamicPatterns().isEmpty()) {
275275
tips.add(I18n.format("gui.preview.button.machine_info.dynamic_pattern"));
276276
}
277+
if (machine.isRequiresBlueprint()) {
278+
tips.add(I18n.format("gui.preview.button.machine_info.requires_blueprint"));
279+
}
277280
return tips;
278281
}
279282

src/main/java/github/kasuminova/mmce/client/gui/widget/preview/PreviewCompilerProgressbar.java renamed to src/main/java/github/kasuminova/mmce/client/gui/widget/preview/PreviewStatusBar.java

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package github.kasuminova.mmce.client.gui.widget.preview;
22

3+
import com.cleanroommc.client.shader.ShaderManager;
34
import github.kasuminova.mmce.client.gui.widget.HorizontalLine;
45
import github.kasuminova.mmce.client.gui.widget.MultiLineLabel;
56
import github.kasuminova.mmce.client.gui.widget.base.WidgetGui;
67
import github.kasuminova.mmce.client.gui.widget.container.Column;
78
import hellfirepvp.modularmachinery.common.util.MiscUtils;
9+
import net.minecraft.client.renderer.OpenGlHelper;
810
import net.minecraft.client.resources.I18n;
911

12+
import java.util.ArrayList;
1013
import java.util.Collections;
14+
import java.util.List;
1115

12-
public class PreviewCompilerProgressbar extends Column {
16+
public class PreviewStatusBar extends Column {
1317

1418
protected final WorldSceneRendererWidget renderer;
1519

@@ -18,9 +22,10 @@ public class PreviewCompilerProgressbar extends Column {
1822

1923
protected int maxWidth = 0;
2024

21-
protected boolean hasProgress = false;
25+
protected boolean shaderPackLoaded = false;
26+
protected boolean vboUnsupported = false;
2227

23-
public PreviewCompilerProgressbar(WorldSceneRendererWidget renderer) {
28+
public PreviewStatusBar(WorldSceneRendererWidget renderer) {
2429
this.renderer = renderer;
2530
}
2631

@@ -33,30 +38,41 @@ public void initWidget(final WidgetGui gui) {
3338
.setMarginLeft(22);
3439
progressLine.setColor(0xFF87CEFA)
3540
.setHeight(2);
41+
addWidgets(progressLine, messageLabel);
3642
}
3743

3844
@Override
3945
public void update(final WidgetGui gui) {
4046
super.update(gui);
4147
float progress = renderer.getWorldRenderer().getCompileProgress();
42-
if (progress <= 0) {
43-
if (hasProgress) {
44-
getWidgets().clear();
45-
hasProgress = false;
46-
}
47-
return;
48+
49+
if (ShaderManager.isOptifineShaderPackLoaded()) {
50+
shaderPackLoaded = true;
51+
} else if (!OpenGlHelper.useVbo()) {
52+
vboUnsupported = true;
53+
}
54+
55+
if (progress > 0) {
56+
progressLine.setWidth((int) Math.floor(maxWidth * progress));
57+
} else {
58+
progressLine.setWidth(0);
59+
}
60+
61+
List<String> contents = new ArrayList<>();
62+
if (progress > 0) {
63+
contents.add(I18n.format("gui.preview.compiling.progress",
64+
MiscUtils.formatFloat(progress * 100f, 1)));
65+
}
66+
if (shaderPackLoaded) {
67+
contents.add(I18n.format("gui.preview.optifine_shader_pack_warn"));
4868
}
49-
if (!hasProgress) {
50-
addWidgets(progressLine, messageLabel);
51-
hasProgress = true;
69+
if (vboUnsupported) {
70+
contents.add(I18n.format("gui.preview.vbo_unsupported_warn"));
5271
}
53-
messageLabel.setContents(Collections.singletonList(I18n.format(
54-
"gui.preview.compiling.progress", MiscUtils.formatFloat(progress * 100f, 1)))
55-
);
56-
progressLine.setWidth((int) Math.floor(maxWidth * progress));
72+
messageLabel.setContents(contents);
5773
}
5874

59-
public PreviewCompilerProgressbar setMaxWidth(final int maxWidth) {
75+
public PreviewStatusBar setMaxWidth(final int maxWidth) {
6076
this.maxWidth = maxWidth;
6177
this.messageLabel.setWidth(maxWidth - messageLabel.getMarginLeft() - messageLabel.getMarginRight());
6278
return this;

src/main/java/github/kasuminova/mmce/client/gui/widget/preview/WorldSceneRendererWidget.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.cleanroommc.client.preview.renderer.scene.ISceneRenderHook;
44
import com.cleanroommc.client.preview.renderer.scene.ImmediateWorldSceneRenderer;
55
import com.cleanroommc.client.preview.renderer.scene.WorldSceneRenderer;
6+
import com.cleanroommc.client.shader.ShaderManager;
67
import com.cleanroommc.client.util.BlockInfo;
78
import com.cleanroommc.client.util.TrackedDummyWorld;
89
import com.cleanroommc.client.util.world.LRDummyWorld;
@@ -11,6 +12,7 @@
1112
import github.kasuminova.mmce.client.gui.util.RenderPos;
1213
import github.kasuminova.mmce.client.gui.util.RenderSize;
1314
import github.kasuminova.mmce.client.gui.widget.base.DynamicWidget;
15+
import github.kasuminova.mmce.client.gui.widget.base.WidgetController;
1416
import github.kasuminova.mmce.client.gui.widget.base.WidgetGui;
1517
import github.kasuminova.mmce.client.gui.widget.event.GuiEvent;
1618
import github.kasuminova.mmce.client.gui.widget.event.WorldRendererCacheCleanEvent;
@@ -25,6 +27,7 @@
2527
import hellfirepvp.modularmachinery.common.util.IBlockStateDescriptor;
2628
import net.minecraft.block.Block;
2729
import net.minecraft.block.state.IBlockState;
30+
import net.minecraft.client.renderer.OpenGlHelper;
2831
import net.minecraft.tileentity.TileEntity;
2932
import net.minecraft.util.EnumFacing;
3033
import net.minecraft.util.math.BlockPos;
@@ -213,9 +216,20 @@ public void preRender(final WidgetGui gui, final RenderSize renderSize, final Re
213216
final int guiTop = gui.getGuiTop();
214217

215218
RenderPos renderOffset = new RenderPos(guiLeft, guiTop);
216-
RenderPos realRenderPos = renderPos.add(renderOffset);
219+
RenderPos realRenderPos = renderPos.add(WidgetController.TRANSLATE_STATE.get());
217220
MousePos realMousePos = mousePos.add(renderPos).add(renderOffset);
218221

222+
// Optifine is broken everything we have.
223+
boolean shaderPackLoaded = ShaderManager.isOptifineShaderPackLoaded();
224+
if (shaderPackLoaded) {
225+
if (renderer.isUseCache()) {
226+
renderer.useCacheBuffer(false);
227+
renderer.switchLRRenderer();
228+
}
229+
} else if (!renderer.isUseCache() && OpenGlHelper.useVbo()) {
230+
renderer.useCacheBuffer(true);
231+
}
232+
219233
renderer.render(
220234
realRenderPos.posX(), realRenderPos.posY(),
221235
renderSize.width(), renderSize.height(),

src/main/java/hellfirepvp/modularmachinery/common/crafting/requirement/RequirementIngredientArray.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ public RequirementIngredientArray deepCopyModified(List<RecipeModifier> modifier
8888
copiedIngredients.add(copied);
8989
});
9090

91-
return new RequirementIngredientArray(copiedIngredients, getActionType());
91+
RequirementIngredientArray requirement = new RequirementIngredientArray(copiedIngredients, getActionType());
92+
requirement.chance = RecipeModifier.applyModifiers(modifiers, RequirementTypesMM.REQUIREMENT_ITEM, actionType, chance, true);
93+
return requirement;
9294
}
9395

9496
@Nonnull

src/main/resources/assets/modularmachinery/lang/en_US.lang

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ gui.preview.button.machine_info.max_parallelism=Max Parallelism:§a%s§f
8181
gui.preview.button.machine_info.max_threads=Max Threads(Only Factory Controller):§b%s§f
8282
gui.preview.button.machine_info.core_threads=Special Threads(Only Factory Controller):§9%s§f
8383
gui.preview.button.machine_info.dynamic_pattern=§eDynamic structures exist.
84+
gui.preview.button.machine_info.requires_blueprint=§cRequires blueprint.
8485
gui.preview.button.toggle_layer_render.tip=Click to switch to slice preview mode.
8586
gui.preview.button.toggle_3d_render.tip=Click to switch to 3D preview mode.
8687
gui.preview.button.place_world_preview.tip=Click to project the current preview to the world.
@@ -91,13 +92,15 @@ gui.preview.button.dynamic_pattern_plus.tip=Click to reduce the size of the dyna
9192
gui.preview.button.dynamic_pattern_subtract.tip=Click to increase the size of the dynamic structure. (Current: §a%s§f)
9293
gui.preview.button.toggle_unformed.tip=Click to switch the structure to the unformed state.
9394
gui.preview.button.toggle_formed.tip=Click to switch the structure to the formed state.
94-
gui.preview.button.toggle_upgrade_display.enable.tip=Click to switch the structure to the unformed state.
95-
gui.preview.button.toggle_upgrade_display.disable.tip=Click to switch the structure to the formed state.
95+
gui.preview.button.toggle_upgrade_display.enable.tip=(WIP) Click to switch the structure to the unformed state.
96+
gui.preview.button.toggle_upgrade_display.disable.tip=(WIP) Click to switch the structure to the formed state.
9697
gui.preview.button.layer_render_scrollbar.up.tip=Click on the square one level up from the preview structure.
9798
gui.preview.button.layer_render_scrollbar.down.tip=Click on the square one layer below the preview structure.
9899
gui.preview.button.layer_render_scrollbar.tip=Hold and drag to quickly adjust the layer of squares you want to preview.
99100
gui.preview.button.layer_render_scrollbar.state.tip=Current/Total number of levels: §a%s§f / §e%s§f
100101
gui.preview.compiling.progress=Renderer is pre compiling! (Progress:%s%%)
102+
gui.preview.optifine_shader_pack_warn=§4Optifine Shader is not compatible! Perf will drop dramatically.
103+
gui.preview.vbo_unsupported_warn=§4GPU is not compatible with VBO! Perf will drop dramatically.
101104

102105
top.recipe.progress=Progress
103106
top.machine.owner=Owner:

src/main/resources/assets/modularmachinery/lang/zh_CN.lang

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ gui.preview.button.machine_info.max_parallelism=最大并行数:§a%s§f
8080
gui.preview.button.machine_info.max_threads=基础线程数(仅集成控制器):§b%s§f
8181
gui.preview.button.machine_info.core_threads=特殊线程数(仅集成控制器):§9%s§f
8282
gui.preview.button.machine_info.dynamic_pattern=§e存在动态结构。
83+
gui.preview.button.machine_info.requires_blueprint=§c需要蓝图。
8384
gui.preview.button.toggle_layer_render.tip=点击切换至片式预览模式。
8485
gui.preview.button.toggle_3d_render.tip=点击切换至 3D 预览模式。
8586
gui.preview.button.place_world_preview.tip=点击将当前预览投影至世界。
@@ -90,13 +91,15 @@ gui.preview.button.dynamic_pattern_plus.tip=点击增加动态结构的大小。
9091
gui.preview.button.dynamic_pattern_subtract.tip=点击减小动态结构的大小。(当前:§a%s§f)
9192
gui.preview.button.toggle_unformed.tip=点击将结构切换至未成型状态。
9293
gui.preview.button.toggle_formed.tip=点击将结构切换至成型状态。
93-
gui.preview.button.toggle_upgrade_display.enable.tip=点击将高亮此机械的可用升级。
94-
gui.preview.button.toggle_upgrade_display.disable.tip=点击将停止高亮此机械的可用升级。
94+
gui.preview.button.toggle_upgrade_display.enable.tip=(WIP)点击将高亮此机械的可用升级。
95+
gui.preview.button.toggle_upgrade_display.disable.tip=(WIP)点击将停止高亮此机械的可用升级。
9596
gui.preview.button.layer_render_scrollbar.up.tip=点击预览结构上一层的方块。
9697
gui.preview.button.layer_render_scrollbar.down.tip=点击预览结构下一层的方块。
9798
gui.preview.button.layer_render_scrollbar.tip=按住并拖动来快速调整想要预览的方块层。
98-
gui.preview.button.layer_render_scrollbar.state.tip=当前层数(相对于控制器)/总层数:§a%s§f / §a%s§f
99+
gui.preview.button.layer_render_scrollbar.state.tip=当前层数(相对于控制器)/ 总层数:§a%s§f / §a%s§f
99100
gui.preview.compiling.progress=渲染器预编译中!(进度:%s%%)
101+
gui.preview.optifine_shader_pack_warn=§4Optifine 光影不兼容!预览性能将大幅下降。
102+
gui.preview.vbo_unsupported_warn=§4显卡不兼容 VBO!预览性能将大幅下降。
100103

101104
gui.blueprint.popout.info=潜行以将当前预览锁定在当前世界中。
102105
gui.blueprint.popout.place=右击以显示预览;远离或放置其他结构预览(蓝图)将会清除此前世界中的结构预览。

0 commit comments

Comments
 (0)