Possibly fixed a race condition NPE with panel models

This commit is contained in:
malte0811 2017-10-29 09:54:34 +01:00
parent 6000203141
commit e21684818f
4 changed files with 18 additions and 29 deletions

View file

@ -22,7 +22,6 @@ import blusunrize.immersiveengineering.api.IEApi;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.collect.ImmutableList;
import malte0811.industrialWires.IndustrialWires;
import malte0811.industrialWires.blocks.controlpanel.BlockTypes_Panel;
import malte0811.industrialWires.blocks.controlpanel.TileEntityPanel;
import malte0811.industrialWires.blocks.controlpanel.TileEntityUnfinishedPanel;

View file

@ -32,17 +32,29 @@ import net.minecraft.util.ResourceLocation;
import org.lwjgl.util.vector.Vector3f;
import javax.annotation.Nonnull;
import java.util.Map;
import java.util.WeakHashMap;
public class RawModelFontRenderer extends FontRenderer {
public static final ResourceLocation FONT = new ResourceLocation("minecraft", "textures/font/ascii.png");
private static final Map<Thread, RawModelFontRenderer> instances = new WeakHashMap<>();
float[] colorA = new float[4];
private ImmutableList.Builder<RawQuad> builder = ImmutableList.builder();
private final Vector3f normal = new Vector3f(0, 1, 0);
public final float scale;
public Matrix4 transform = null;
private TextureAtlasSprite sprite;
private static TextureAtlasSprite sprite = null;
public RawModelFontRenderer(GameSettings settings, ResourceLocation font, TextureManager manager, boolean isUnicode, float scale) {
public static RawModelFontRenderer get() {
Thread current = Thread.currentThread();
if (!instances.containsKey(current)) {
instances.put(current, new RawModelFontRenderer(Minecraft.getMinecraft().gameSettings, FONT, Minecraft.getMinecraft().getTextureManager(),
false, 1));
}
return instances.get(current);
}
private RawModelFontRenderer(GameSettings settings, ResourceLocation font, TextureManager manager, boolean isUnicode, float scale) {
super(settings, font, manager, isUnicode);
this.scale = scale / (9 * 16);
onResourceManagerReload(null);
@ -112,4 +124,4 @@ public class RawModelFontRenderer extends FontRenderer {
protected void bindTexture(@Nonnull ResourceLocation location) {
//NO-OP
}
}
}

View file

@ -23,14 +23,12 @@ import malte0811.industrialWires.blocks.controlpanel.TileEntityPanel;
import malte0811.industrialWires.client.RawQuad;
import malte0811.industrialWires.client.gui.GuiPanelCreator;
import malte0811.industrialWires.client.panelmodel.RawModelFontRenderer;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagString;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.fml.common.FMLCommonHandler;
@ -41,9 +39,7 @@ import javax.annotation.Nullable;
import java.util.List;
public class Label extends PanelComponent implements IConfigurableComponent {
public static final ResourceLocation FONT = new ResourceLocation("minecraft", "textures/font/ascii.png");
private String text = "Test";
private RawModelFontRenderer renderer;
private int color = 0x808080;
public Label(String text, int color) {
@ -70,7 +66,7 @@ public class Label extends PanelComponent implements IConfigurableComponent {
@Override
public List<RawQuad> getQuads() {
RawModelFontRenderer render = fontRenderer();
RawModelFontRenderer render = RawModelFontRenderer.get();
render.drawString(text, 0, 0, 0xff000000 | color);
return render.build();
}
@ -90,7 +86,7 @@ public class Label extends PanelComponent implements IConfigurableComponent {
public AxisAlignedBB getBlockRelativeAABB() {
if (aabb == null) {
if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) {
RawModelFontRenderer fr = fontRenderer();
RawModelFontRenderer fr = RawModelFontRenderer.get();
float width = fr.getStringWidth(text) * fr.scale;
float height = fr.FONT_HEIGHT * fr.scale;
aabb = new AxisAlignedBB(getX(), 0, getY(), getX() + width, 0, getY() + height);
@ -120,14 +116,6 @@ public class Label extends PanelComponent implements IConfigurableComponent {
return 0;
}
private RawModelFontRenderer fontRenderer() {
if (renderer == null) {
renderer = new RawModelFontRenderer(Minecraft.getMinecraft().gameSettings, FONT, Minecraft.getMinecraft().getTextureManager(),
false, 1);
}
return renderer;
}
@Override
public void renderInGUI(GuiPanelCreator gui) {
int left = (int) (gui.getX0() + getX() * gui.panelSize);

View file

@ -24,7 +24,6 @@ import malte0811.industrialWires.blocks.controlpanel.TileEntityPanel;
import malte0811.industrialWires.client.RawQuad;
import malte0811.industrialWires.client.gui.GuiPanelCreator;
import malte0811.industrialWires.client.panelmodel.RawModelFontRenderer;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.resources.I18n;
@ -114,7 +113,7 @@ public class PanelMeter extends PanelComponent implements IConfigurableComponent
PanelUtils.addColoredQuad(ret, new Vector3f(BORDER, antiZOffset, BORDER), new Vector3f(BORDER, antiZOffset, SIZE-BORDER),
new Vector3f(width-BORDER, antiZOffset, SIZE-BORDER), new Vector3f(width-BORDER, antiZOffset, BORDER), EnumFacing.UP, WHITE);
RawModelFontRenderer r = fontRenderer();
RawModelFontRenderer r = RawModelFontRenderer.get();
r.transform = new Matrix4();
for (int i = 0;i<=3;i++) {
transformNumber(r.transform, 5*17*i);
@ -134,15 +133,6 @@ public class PanelMeter extends PanelComponent implements IConfigurableComponent
return ret;
}
private RawModelFontRenderer renderer;
private RawModelFontRenderer fontRenderer() {
if (renderer == null) {
renderer = new RawModelFontRenderer(Minecraft.getMinecraft().gameSettings, Label.FONT, Minecraft.getMinecraft().getTextureManager(),
false, .5F);
}
return renderer;
}
private void transformNumber(Matrix4 mat, int value) {
if (wide) {
transformNeedle(mat, value);