mirror of
https://github.com/GTNewHorizons/CodeChickenCore.git
synced 2026-10-26 22:33:58 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
740686ac61 | ||
|
|
b738e8e073 | ||
|
|
a385d29ab3 | ||
|
|
60d44f3c7b | ||
|
|
6209831d08 |
No files matched your search
@@ -6,3 +6,10 @@ minecraft {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
test {
|
||||
useJUnitPlatform()
|
||||
testLogging {
|
||||
events "passed", "skipped", "failed"
|
||||
}
|
||||
}
|
||||
+3
-1
@@ -1,5 +1,7 @@
|
||||
// Add your dependencies here
|
||||
|
||||
dependencies {
|
||||
shadowImplementation("com.github.GTNewHorizons:GTNHLib:0.11.5")
|
||||
testImplementation(platform('org.junit:junit-bom:5.14.1'))
|
||||
testImplementation('org.junit.jupiter:junit-jupiter')
|
||||
testRuntimeOnly('org.junit.platform:junit-platform-launcher')
|
||||
}
|
||||
+1
-1
@@ -133,7 +133,7 @@ forceEnableMixins = false
|
||||
|
||||
# If enabled, you may use 'shadowCompile' for dependencies. They will be integrated into your jar. It is your
|
||||
# responsibility to check the license and request permission for distribution if required.
|
||||
usesShadowedDependencies = true
|
||||
usesShadowedDependencies = false
|
||||
|
||||
# If disabled, won't remove unused classes from shadowed dependencies. Some libraries use reflection to access
|
||||
# their own classes, making the minimization unreliable.
|
||||
|
||||
@@ -116,6 +116,7 @@ public class ClassDiscoverer {
|
||||
while (zipEntries.hasMoreElements()) {
|
||||
ZipEntry zipentry = zipEntries.nextElement();
|
||||
String fullname = zipentry.getName().replace('\\', '/');
|
||||
if (fullname.startsWith("META-INF/versions/")) continue;
|
||||
int pos = fullname.lastIndexOf('/');
|
||||
String name = pos == -1 ? fullname : fullname.substring(pos + 1);
|
||||
if (!zipentry.isDirectory() && matcher.matches(name)) {
|
||||
|
||||
@@ -2,12 +2,16 @@ package codechicken.core;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.client.resources.IReloadableResourceManager;
|
||||
import net.minecraft.client.resources.IResourceManager;
|
||||
import net.minecraft.client.resources.IResourceManagerReloadListener;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import codechicken.core.internal.CCCEventHandler;
|
||||
import codechicken.lib.colour.LocalizedColours;
|
||||
import cpw.mods.fml.common.FMLCommonHandler;
|
||||
import cpw.mods.fml.common.ModContainer;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
@@ -65,4 +69,16 @@ public class ClientUtils extends CommonUtils {
|
||||
.replace("Supporters:", EnumChatFormatting.AQUA + "Supporters:");
|
||||
GuiModListScroll.register(mod);
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public static void registerLocalizedColourReloadListener() {
|
||||
((IReloadableResourceManager) mc().getResourceManager())
|
||||
.registerReloadListener(new IResourceManagerReloadListener() {
|
||||
|
||||
@Override
|
||||
public void onResourceManagerReload(IResourceManager resourceManager) {
|
||||
LocalizedColours.reloadLocalizedColours();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -36,7 +36,7 @@ import org.lwjgl.input.Keyboard;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import codechicken.core.launch.CodeChickenCorePlugin;
|
||||
import codechicken.lib.colour.ColorUtils;
|
||||
import codechicken.lib.colour.LocalizedColours;
|
||||
import codechicken.lib.gui.GuiDraw;
|
||||
import codechicken.lib.vec.Rectangle4i;
|
||||
import cpw.mods.fml.client.GuiModList;
|
||||
@@ -149,12 +149,11 @@ public class GuiModListScroll {
|
||||
double dy = scroll % (height + 20);
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslated(0, -dy, 0);
|
||||
GuiDraw.fontRenderer
|
||||
.drawSplitString(description, x1, y1draw, x2 - x1, ColorUtils.modDescriptionText.getColor());
|
||||
GuiDraw.fontRenderer.drawSplitString(description, x1, y1draw, x2 - x1, LocalizedColours.MOD_DESCRIPTION_TEXT);
|
||||
if (needsScroll) {
|
||||
GL11.glTranslated(0, height + 20, 0);
|
||||
GuiDraw.fontRenderer
|
||||
.drawSplitString(description, x1, y1draw, x2 - x1, ColorUtils.modDescriptionText.getColor());
|
||||
.drawSplitString(description, x1, y1draw, x2 - x1, LocalizedColours.MOD_DESCRIPTION_TEXT);
|
||||
}
|
||||
GL11.glPopMatrix();
|
||||
|
||||
|
||||
@@ -65,6 +65,8 @@ public class CodeChickenCoreModContainer extends DummyModContainer {
|
||||
public void init(FMLInitializationEvent event) {
|
||||
if (event.getSide().isClient()) {
|
||||
ClientUtils.enhanceSupportersList("CodeChickenCore");
|
||||
ClientUtils.registerLocalizedColourReloadListener();
|
||||
|
||||
FMLCommonHandler.instance().bus().register(new CCCEventHandler());
|
||||
MinecraftForge.EVENT_BUS.register(new CCCEventHandler());
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import net.minecraft.util.ResourceLocation;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import codechicken.lib.colour.ColorUtils;
|
||||
import codechicken.lib.colour.LocalizedColours;
|
||||
|
||||
public class GuiCCButton extends GuiWidget {
|
||||
|
||||
@@ -75,9 +75,8 @@ public class GuiCCButton extends GuiWidget {
|
||||
}
|
||||
|
||||
public int getTextColour(int mousex, int mousey) {
|
||||
return !isEnabled ? ColorUtils.buttonTextDisabled.getColor()
|
||||
: pointInside(mousex, mousey) ? ColorUtils.buttonTextHover.getColor()
|
||||
: ColorUtils.buttonText.getColor();
|
||||
return !isEnabled ? LocalizedColours.BUTTON_TEXT_DISABLED
|
||||
: pointInside(mousex, mousey) ? LocalizedColours.BUTTON_TEXT_HOVER : LocalizedColours.BUTTON_TEXT;
|
||||
}
|
||||
|
||||
public GuiCCButton setActionCommand(String string) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import net.minecraft.util.ChatAllowedCharacters;
|
||||
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
import codechicken.lib.colour.ColorUtils;
|
||||
import codechicken.lib.colour.LocalizedColours;
|
||||
|
||||
public class GuiCCTextField extends GuiWidget {
|
||||
|
||||
@@ -122,8 +122,8 @@ public class GuiCCTextField extends GuiWidget {
|
||||
}
|
||||
|
||||
public void drawBackground() {
|
||||
drawRect(x - 1, y - 1, x + width + 1, y + height + 1, ColorUtils.textFieldBorder.getColor());
|
||||
drawRect(x, y, x + width, y + height, ColorUtils.textFieldBackground.getColor());
|
||||
drawRect(x - 1, y - 1, x + width + 1, y + height + 1, LocalizedColours.TEXT_FIELD_BORDER);
|
||||
drawRect(x, y, x + width, y + height, LocalizedColours.TEXT_FIELD_BACKGROUND);
|
||||
}
|
||||
|
||||
public String getDrawText() {
|
||||
@@ -137,7 +137,7 @@ public class GuiCCTextField extends GuiWidget {
|
||||
}
|
||||
|
||||
public int getTextColour() {
|
||||
return isEnabled ? ColorUtils.textFieldText.getColor() : ColorUtils.textFieldTextDisabled.getColor();
|
||||
return isEnabled ? LocalizedColours.TEXT_FIELD_TEXT : LocalizedColours.TEXT_FIELD_TEXT_DISABLED;
|
||||
}
|
||||
|
||||
public GuiCCTextField setMaxStringLength(int i) {
|
||||
|
||||
@@ -3,7 +3,7 @@ package codechicken.core.gui;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Rectangle;
|
||||
|
||||
import codechicken.lib.colour.ColorUtils;
|
||||
import codechicken.lib.colour.LocalizedColours;
|
||||
import codechicken.lib.math.MathHelper;
|
||||
import codechicken.lib.vec.Rectangle4i;
|
||||
|
||||
@@ -185,29 +185,29 @@ public abstract class GuiScrollPane extends GuiWidget {
|
||||
}
|
||||
|
||||
public void drawBackground(float frame) {
|
||||
drawRect(x, y, x + width, y + height, ColorUtils.scrollPaneBackground.getColor());
|
||||
drawRect(x, y, x + width, y + height, LocalizedColours.SCROLL_PANE_BACKGROUND);
|
||||
}
|
||||
|
||||
public abstract void drawContent(int mx, int my, float frame);
|
||||
|
||||
public void drawOverlay(float frame) {
|
||||
// outlines
|
||||
drawRect(x, y - 1, x + width, y, ColorUtils.scrollPaneOverlayTop.getColor());
|
||||
drawRect(x, y + height, x + width, y + height + 1, ColorUtils.scrollPaneOverlayBottom.getColor());
|
||||
drawRect(x - 1, y - 1, x, y + height + 1, ColorUtils.scrollPaneOverlayLeft.getColor());
|
||||
drawRect(x + width, y - 1, x + width + 1, y + height + 1, ColorUtils.scrollPaneOverlayRight.getColor());
|
||||
drawRect(x, y - 1, x + width, y, LocalizedColours.SCROLL_PANE_OVERLAY_TOP);
|
||||
drawRect(x, y + height, x + width, y + height + 1, LocalizedColours.SCROLL_PANE_OVERLAY_BOTTOM);
|
||||
drawRect(x - 1, y - 1, x, y + height + 1, LocalizedColours.SCROLL_PANE_OVERLAY_LEFT);
|
||||
drawRect(x + width, y - 1, x + width + 1, y + height + 1, LocalizedColours.SCROLL_PANE_OVERLAY_RIGHT);
|
||||
}
|
||||
|
||||
public void drawScrollbar(float frame) {
|
||||
Rectangle r = scrollbarBounds();
|
||||
|
||||
drawRect(r.x, r.y, r.x + r.width, r.y + r.height, ColorUtils.scrollbarCorners.getColor());
|
||||
drawRect(r.x, r.y, r.x + r.width - 1, r.y + r.height - 1, ColorUtils.scrollbarTopLeft.getColor());
|
||||
drawRect(r.x + 1, r.y + 1, r.x + r.width, r.y + r.height, ColorUtils.scrollbarBottomRight.getColor());
|
||||
drawRect(r.x + 1, r.y + 1, r.x + r.width - 1, r.y + r.height - 1, ColorUtils.scrollbarFill.getColor());
|
||||
drawRect(r.x, r.y, r.x + r.width, r.y + r.height, LocalizedColours.SCROLLBAR_CORNERS);
|
||||
drawRect(r.x, r.y, r.x + r.width - 1, r.y + r.height - 1, LocalizedColours.SCROLLBAR_TOP_LEFT);
|
||||
drawRect(r.x + 1, r.y + 1, r.x + r.width, r.y + r.height, LocalizedColours.SCROLLBAR_BOTTOM_RIGHT);
|
||||
drawRect(r.x + 1, r.y + 1, r.x + r.width - 1, r.y + r.height - 1, LocalizedColours.SCROLLBAR_FILL);
|
||||
|
||||
int algn = scrollbarGuideAlignment();
|
||||
if (algn != 0)
|
||||
drawRect(algn > 0 ? r.x + r.width : r.x - 1, y, r.x, y + height, ColorUtils.scrollbarGuide.getColor());
|
||||
drawRect(algn > 0 ? r.x + r.width : r.x - 1, y, r.x, y + height, LocalizedColours.SCROLLBAR_GUIDE);
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
package codechicken.lib.colour;
|
||||
|
||||
import com.gtnewhorizon.gtnhlib.color.ColorResource;
|
||||
|
||||
public class ColorUtils {
|
||||
|
||||
private static final ColorResource.Factory color = new ColorResource.Factory("codechickencore");
|
||||
|
||||
public static final ColorResource
|
||||
// spotless:off
|
||||
|
||||
textFieldText = color.rgb("textFieldText", "0xE0E0E0"),
|
||||
textFieldTextDisabled = color.rgb("textFieldTextDisabled", "0x707070"),
|
||||
itemQuantityText = color.rgb("itemQuantityText", "0xFFFFFF"),
|
||||
modDescriptionText = color.rgb("modDescriptionText", "0xDDDDDD"),
|
||||
|
||||
buttonTextDisabled = color.argb("buttonTextDisabled", "0xFFA0A0A0"),
|
||||
buttonTextHover = color.argb("buttonTextHover", "0xFFFFFFA0"),
|
||||
buttonText = color.argb("buttonText", "0xFFE0E0E0"),
|
||||
textFieldBorder = color.argb("textFieldBorder", "0xFFA0A0A0"),
|
||||
textFieldBackground = color.argb("textFieldBackground", "0xFF000000"),
|
||||
scrollPaneBackground = color.argb("background", "0xFF000000"),
|
||||
scrollPaneOverlayTop = color.argb("overlayTop", "0xFFA0A0A0"),
|
||||
scrollPaneOverlayBottom = color.argb("overlayBottom", "0xFFA0A0A0"),
|
||||
scrollPaneOverlayLeft = color.argb("overlayLeft", "0xFFA0A0A0"),
|
||||
scrollPaneOverlayRight = color.argb("overlayRight", "0xFFA0A0A0"),
|
||||
scrollbarCorners = color.argb("scrollbarCorners", "0xFF8B8B8B"),
|
||||
scrollbarTopLeft = color.argb("scrollbarTopLeft", "0xFFF0F0F0"),
|
||||
scrollbarBottomRight = color.argb("scrollbarBottomRight", "0xFF555555"),
|
||||
scrollbarFill = color.argb("scrollbarFill", "0xFFC6C6C6"),
|
||||
scrollbarGuide = color.argb("scrollbarGuide", "0xFF808080"),
|
||||
tooltipBgStart = color.argb("tooltipBgStart", "0xF0100010"),
|
||||
tooltipBgEnd = color.argb("tooltipBgEnd", "0xF0100010"),
|
||||
tooltipBorderStart = color.argb("tooltipBorderStart", "0x505000FF"),
|
||||
tooltipBorderEnd = color.argb("tooltipBorderEnd", "0x5028007F"),
|
||||
tooltipText = color.argb("tooltipText", "0xFFFFFFFF");
|
||||
// spotless:on
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package codechicken.lib.colour;
|
||||
|
||||
import net.minecraft.util.StatCollector;
|
||||
|
||||
public final class LocalizedColours {
|
||||
|
||||
private static final String KEY_PREFIX = "codechickencore.color.";
|
||||
|
||||
public static int BUTTON_TEXT_DISABLED = 0xFFA0A0A0;
|
||||
public static int BUTTON_TEXT_HOVER = 0xFFFFFFA0;
|
||||
public static int BUTTON_TEXT = 0xFFE0E0E0;
|
||||
public static int TEXT_FIELD_BORDER = 0xFFA0A0A0;
|
||||
public static int TEXT_FIELD_BACKGROUND = 0xFF000000;
|
||||
public static int TEXT_FIELD_TEXT = 0xE0E0E0;
|
||||
public static int TEXT_FIELD_TEXT_DISABLED = 0x707070;
|
||||
public static int SCROLL_PANE_BACKGROUND = 0xFF000000;
|
||||
public static int SCROLL_PANE_OVERLAY_TOP = 0xFFA0A0A0;
|
||||
public static int SCROLL_PANE_OVERLAY_BOTTOM = 0xFFA0A0A0;
|
||||
public static int SCROLL_PANE_OVERLAY_LEFT = 0xFFA0A0A0;
|
||||
public static int SCROLL_PANE_OVERLAY_RIGHT = 0xFFA0A0A0;
|
||||
public static int SCROLLBAR_CORNERS = 0xFF8B8B8B;
|
||||
public static int SCROLLBAR_TOP_LEFT = 0xFFF0F0F0;
|
||||
public static int SCROLLBAR_BOTTOM_RIGHT = 0xFF555555;
|
||||
public static int SCROLLBAR_FILL = 0xFFC6C6C6;
|
||||
public static int SCROLLBAR_GUIDE = 0xFF808080;
|
||||
public static int TOOLTIP_BG_START = 0xF0100010;
|
||||
public static int TOOLTIP_BG_END = 0xF0100010;
|
||||
public static int TOOLTIP_BORDER_START = 0x505000FF;
|
||||
public static int TOOLTIP_BORDER_END = 0x5028007F;
|
||||
public static int TOOLTIP_TEXT = 0xFFFFFFFF;
|
||||
public static int ITEM_QUANTITY_TEXT = 0xFFFFFF;
|
||||
public static int MOD_DESCRIPTION_TEXT = 0xDDDDDD;
|
||||
|
||||
private LocalizedColours() {}
|
||||
|
||||
public static void reloadLocalizedColours() {
|
||||
BUTTON_TEXT_DISABLED = getLocalizedColor("buttonTextDisabled", BUTTON_TEXT_DISABLED);
|
||||
BUTTON_TEXT_HOVER = getLocalizedColor("buttonTextHover", BUTTON_TEXT_HOVER);
|
||||
BUTTON_TEXT = getLocalizedColor("buttonText", BUTTON_TEXT);
|
||||
TEXT_FIELD_BORDER = getLocalizedColor("textFieldBorder", TEXT_FIELD_BORDER);
|
||||
TEXT_FIELD_BACKGROUND = getLocalizedColor("textFieldBackground", TEXT_FIELD_BACKGROUND);
|
||||
TEXT_FIELD_TEXT = getLocalizedColor("textFieldText", TEXT_FIELD_TEXT);
|
||||
TEXT_FIELD_TEXT_DISABLED = getLocalizedColor("textFieldTextDisabled", TEXT_FIELD_TEXT_DISABLED);
|
||||
SCROLL_PANE_BACKGROUND = getLocalizedColor("background", SCROLL_PANE_BACKGROUND);
|
||||
SCROLL_PANE_OVERLAY_TOP = getLocalizedColor("overlayTop", SCROLL_PANE_OVERLAY_TOP);
|
||||
SCROLL_PANE_OVERLAY_BOTTOM = getLocalizedColor("overlayBottom", SCROLL_PANE_OVERLAY_BOTTOM);
|
||||
SCROLL_PANE_OVERLAY_LEFT = getLocalizedColor("overlayLeft", SCROLL_PANE_OVERLAY_LEFT);
|
||||
SCROLL_PANE_OVERLAY_RIGHT = getLocalizedColor("overlayRight", SCROLL_PANE_OVERLAY_RIGHT);
|
||||
SCROLLBAR_CORNERS = getLocalizedColor("scrollbarCorners", SCROLLBAR_CORNERS);
|
||||
SCROLLBAR_TOP_LEFT = getLocalizedColor("scrollbarTopLeft", SCROLLBAR_TOP_LEFT);
|
||||
SCROLLBAR_BOTTOM_RIGHT = getLocalizedColor("scrollbarBottomRight", SCROLLBAR_BOTTOM_RIGHT);
|
||||
SCROLLBAR_FILL = getLocalizedColor("scrollbarFill", SCROLLBAR_FILL);
|
||||
SCROLLBAR_GUIDE = getLocalizedColor("scrollbarGuide", SCROLLBAR_GUIDE);
|
||||
TOOLTIP_BG_START = getLocalizedColor("tooltipBgStart", TOOLTIP_BG_START);
|
||||
TOOLTIP_BG_END = getLocalizedColor("tooltipBgEnd", TOOLTIP_BG_END);
|
||||
TOOLTIP_BORDER_START = getLocalizedColor("tooltipBorderStart", TOOLTIP_BORDER_START);
|
||||
TOOLTIP_BORDER_END = getLocalizedColor("tooltipBorderEnd", TOOLTIP_BORDER_END);
|
||||
TOOLTIP_TEXT = getLocalizedColor("tooltipText", TOOLTIP_TEXT);
|
||||
ITEM_QUANTITY_TEXT = getLocalizedColor("itemQuantityText", ITEM_QUANTITY_TEXT);
|
||||
MOD_DESCRIPTION_TEXT = getLocalizedColor("modDescriptionText", MOD_DESCRIPTION_TEXT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve a optional localized ARGB color from lang files. Expected value format: AARRGGBB (for example FF555555).
|
||||
*/
|
||||
private static int getLocalizedColor(String key, int defaultColor) {
|
||||
String fullKey = KEY_PREFIX + key;
|
||||
if (!StatCollector.canTranslate(fullKey)) {
|
||||
return defaultColor;
|
||||
}
|
||||
|
||||
String raw = StatCollector.translateToLocal(fullKey);
|
||||
String hex = raw.trim();
|
||||
if (hex.startsWith("0x") || hex.startsWith("0X")) {
|
||||
hex = hex.substring(2);
|
||||
} else if (hex.startsWith("#")) {
|
||||
hex = hex.substring(1);
|
||||
}
|
||||
|
||||
try {
|
||||
return (int) Long.parseLong(hex, 16);
|
||||
} catch (NumberFormatException ignored) {
|
||||
return defaultColor;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ import org.lwjgl.input.Mouse;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.lwjgl.opengl.GL12;
|
||||
|
||||
import codechicken.lib.colour.ColorUtils;
|
||||
import codechicken.lib.colour.LocalizedColours;
|
||||
import codechicken.lib.math.MathHelper;
|
||||
import codechicken.lib.render.CCRenderState;
|
||||
|
||||
@@ -168,10 +168,10 @@ public class GuiDraw {
|
||||
x,
|
||||
y,
|
||||
list,
|
||||
ColorUtils.tooltipBgStart.getColor(),
|
||||
ColorUtils.tooltipBgEnd.getColor(),
|
||||
ColorUtils.tooltipBorderStart.getColor(),
|
||||
ColorUtils.tooltipBorderEnd.getColor());
|
||||
LocalizedColours.TOOLTIP_BG_START,
|
||||
LocalizedColours.TOOLTIP_BG_END,
|
||||
LocalizedColours.TOOLTIP_BORDER_START,
|
||||
LocalizedColours.TOOLTIP_BORDER_END);
|
||||
}
|
||||
|
||||
public static void drawMultilineTip(FontRenderer font, int x, int y, List<String> list, int bgStart, int bgEnd,
|
||||
@@ -210,7 +210,7 @@ public class GuiDraw {
|
||||
line.draw(x, y);
|
||||
y += line.getSize().height;
|
||||
} else {
|
||||
font.drawStringWithShadow(s, x, y, ColorUtils.tooltipText.getColor());
|
||||
font.drawStringWithShadow(s, x, y, LocalizedColours.TOOLTIP_TEXT);
|
||||
y += s.endsWith(TOOLTIP_LINESPACE) ? 12 : 10;
|
||||
}
|
||||
}
|
||||
@@ -229,10 +229,10 @@ public class GuiDraw {
|
||||
y,
|
||||
w,
|
||||
h,
|
||||
ColorUtils.tooltipBgStart.getColor(),
|
||||
ColorUtils.tooltipBgEnd.getColor(),
|
||||
ColorUtils.tooltipBorderStart.getColor(),
|
||||
ColorUtils.tooltipBorderEnd.getColor());
|
||||
LocalizedColours.TOOLTIP_BG_START,
|
||||
LocalizedColours.TOOLTIP_BG_END,
|
||||
LocalizedColours.TOOLTIP_BORDER_START,
|
||||
LocalizedColours.TOOLTIP_BORDER_END);
|
||||
}
|
||||
|
||||
public static void drawTooltipBox(int x, int y, int w, int h, int bgStart, int bgEnd, int borderStart,
|
||||
|
||||
@@ -12,7 +12,12 @@ import codechicken.lib.vec.BlockCoord;
|
||||
public class SimpleBrightnessModel implements CCRenderState.IVertexOperation {
|
||||
|
||||
public static final int operationIndex = CCRenderState.registerOperation();
|
||||
public static SimpleBrightnessModel instance = new SimpleBrightnessModel();
|
||||
private static final ThreadLocal<SimpleBrightnessModel> instances = ThreadLocal
|
||||
.withInitial(SimpleBrightnessModel::new);
|
||||
|
||||
public static SimpleBrightnessModel instance() {
|
||||
return instances.get();
|
||||
}
|
||||
|
||||
public IBlockAccess access;
|
||||
public BlockCoord pos = new BlockCoord();
|
||||
|
||||
@@ -466,7 +466,7 @@ public final class PacketCustom implements MCDataInput, MCDataOutput {
|
||||
|
||||
public FluidStack readFluidStack() {
|
||||
Fluid fluid = FluidRegistry.getFluid(readShort());
|
||||
if (fluid == null) fluid = FluidRegistry.WATER;
|
||||
if (fluid == null) return null;
|
||||
|
||||
return new FluidStack(fluid, readVarInt(), readNBTTagCompound());
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package codechicken.lib.render;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.OpenGlHelper;
|
||||
@@ -38,9 +39,9 @@ public class CCRenderState {
|
||||
return instances.get();
|
||||
}
|
||||
|
||||
private static int nextOperationIndex;
|
||||
private static volatile int nextOperationIndex;
|
||||
|
||||
public static int registerOperation() {
|
||||
public static synchronized int registerOperation() {
|
||||
return nextOperationIndex++;
|
||||
}
|
||||
|
||||
@@ -87,15 +88,52 @@ public class CCRenderState {
|
||||
int operationID();
|
||||
}
|
||||
|
||||
private static ArrayList<VertexAttribute<?>> vertexAttributes = new ArrayList<>();
|
||||
public static final class AttributeKey<T> {
|
||||
|
||||
private static int registerVertexAttribute(VertexAttribute<?> attr) {
|
||||
vertexAttributes.add(attr);
|
||||
return vertexAttributes.size() - 1;
|
||||
private static final HashMap<String, AttributeKey<?>> nameMap = new HashMap<>();
|
||||
private static final ArrayList<AttributeKey<?>> attributeKeys = new ArrayList<>();
|
||||
private static int nextLegacyId;
|
||||
|
||||
public final String name;
|
||||
public final int attributeKeyIndex;
|
||||
public final int operationIndex;
|
||||
private VertexAttribute<T> canonical;
|
||||
|
||||
private AttributeKey(String name) {
|
||||
this.name = name;
|
||||
this.attributeKeyIndex = attributeKeys.size();
|
||||
this.operationIndex = registerOperation();
|
||||
attributeKeys.add(this);
|
||||
nameMap.put(name, this);
|
||||
}
|
||||
|
||||
public static synchronized <T> AttributeKey<T> create(String name) {
|
||||
if (nameMap.containsKey(name))
|
||||
throw new IllegalArgumentException("Duplicate registration of attribute with name: " + name);
|
||||
return new AttributeKey<>(name);
|
||||
}
|
||||
|
||||
static synchronized <T> AttributeKey<T> createLegacy() {
|
||||
return new AttributeKey<>("legacy#" + nextLegacyId++);
|
||||
}
|
||||
|
||||
synchronized void setCanonical(VertexAttribute<T> attr) {
|
||||
if (canonical == null) canonical = attr;
|
||||
}
|
||||
|
||||
static synchronized AttributeKey<?> get(int index) {
|
||||
return attributeKeys.get(index);
|
||||
}
|
||||
}
|
||||
|
||||
private static final AttributeKey<Vector3[]> NORMAL_KEY = AttributeKey.create("normal");
|
||||
private static final AttributeKey<int[]> COLOUR_KEY = AttributeKey.create("colour");
|
||||
private static final AttributeKey<int[]> LIGHTING_KEY = AttributeKey.create("lighting");
|
||||
private static final AttributeKey<int[]> SIDE_KEY = AttributeKey.create("side");
|
||||
private static final AttributeKey<LC[]> LC_KEY = AttributeKey.create("lc");
|
||||
|
||||
public static VertexAttribute<?> getAttribute(int index) {
|
||||
return vertexAttributes.get(index);
|
||||
return AttributeKey.get(index).canonical;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -106,14 +144,26 @@ public class CCRenderState {
|
||||
*/
|
||||
public abstract static class VertexAttribute<T> implements IVertexOperation {
|
||||
|
||||
public final int attributeIndex = registerVertexAttribute(this);
|
||||
private final int operationIndex = registerOperation();
|
||||
public final int attributeIndex;
|
||||
private final int operationIndex;
|
||||
/**
|
||||
* Set to true when the attrute is part of the pipeline. Should only be managed by CCRenderState when
|
||||
* constructing the pipeline
|
||||
*/
|
||||
public boolean active = false;
|
||||
|
||||
protected VertexAttribute(AttributeKey<T> key) {
|
||||
attributeIndex = key.attributeKeyIndex;
|
||||
operationIndex = key.operationIndex;
|
||||
key.setCanonical(this);
|
||||
}
|
||||
|
||||
/** @deprecated keyless attributes get a per-construction index that is threadsafe */
|
||||
@Deprecated
|
||||
protected VertexAttribute() {
|
||||
this(AttributeKey.createLegacy());
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new array for storage of vertex attrutes in a model
|
||||
*/
|
||||
@@ -189,7 +239,7 @@ public class CCRenderState {
|
||||
return instances.get().lightingAttrib;
|
||||
}
|
||||
|
||||
public VertexAttribute<Vector3[]> normalAttrib = new VertexAttribute<>() {
|
||||
public VertexAttribute<Vector3[]> normalAttrib = new VertexAttribute<>(NORMAL_KEY) {
|
||||
|
||||
private Vector3[] normalRef;
|
||||
|
||||
@@ -217,7 +267,7 @@ public class CCRenderState {
|
||||
else state.setNormalInstance(Rotation.axes[state.side]);
|
||||
}
|
||||
};
|
||||
public VertexAttribute<int[]> colourAttrib = new VertexAttribute<>() {
|
||||
public VertexAttribute<int[]> colourAttrib = new VertexAttribute<>(COLOUR_KEY) {
|
||||
|
||||
private int[] colourRef;
|
||||
|
||||
@@ -239,7 +289,7 @@ public class CCRenderState {
|
||||
else state.setColourInstance(state.baseColour);
|
||||
}
|
||||
};
|
||||
public VertexAttribute<int[]> lightingAttrib = new VertexAttribute<>() {
|
||||
public VertexAttribute<int[]> lightingAttrib = new VertexAttribute<>(LIGHTING_KEY) {
|
||||
|
||||
private int[] colourRef;
|
||||
|
||||
@@ -265,7 +315,7 @@ public class CCRenderState {
|
||||
state.setColourInstance(ColourRGBA.multiply(state.colour, colourRef[state.vertexIndex]));
|
||||
}
|
||||
};
|
||||
public VertexAttribute<int[]> sideAttrib = new VertexAttribute<>() {
|
||||
public VertexAttribute<int[]> sideAttrib = new VertexAttribute<>(SIDE_KEY) {
|
||||
|
||||
private int[] sideRef;
|
||||
|
||||
@@ -292,7 +342,7 @@ public class CCRenderState {
|
||||
/**
|
||||
* Uses the position of the lightmatrix to compute LC if not provided
|
||||
*/
|
||||
public VertexAttribute<LC[]> lightCoordAttrib = new VertexAttribute<>() {
|
||||
public VertexAttribute<LC[]> lightCoordAttrib = new VertexAttribute<>(LC_KEY) {
|
||||
|
||||
private LC[] lcRef;
|
||||
private final Vector3 vec = new Vector3(); // for computation
|
||||
|
||||
@@ -6,7 +6,7 @@ import net.minecraft.item.ItemStack;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import codechicken.lib.colour.ColorUtils;
|
||||
import codechicken.lib.colour.LocalizedColours;
|
||||
|
||||
public class FontUtils {
|
||||
|
||||
@@ -55,7 +55,7 @@ public class FontUtils {
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslated(x + 16 - swidth, y + 16 - sheight, 0);
|
||||
GL11.glScaled(scale, scale, 1);
|
||||
fontRenderer.drawStringWithShadow(quantity, 0, 0, ColorUtils.itemQuantityText.getColor());
|
||||
fontRenderer.drawStringWithShadow(quantity, 0, 0, LocalizedColours.ITEM_QUANTITY_TEXT);
|
||||
GL11.glPopMatrix();
|
||||
GL11.glEnable(GL11.GL_LIGHTING);
|
||||
GL11.glEnable(GL11.GL_DEPTH_TEST);
|
||||
|
||||
@@ -55,7 +55,10 @@ public class WorldExtensionManager {
|
||||
public void onChunkUnLoad(ChunkEvent.Unload event) {
|
||||
if (event.getChunk() instanceof EmptyChunk) return;
|
||||
|
||||
for (WorldExtension extension : worldMap.get(event.world)) extension.unloadChunk(event.getChunk());
|
||||
WorldExtension[] extensions = worldMap.get(event.world);
|
||||
if (extensions == null) return;
|
||||
|
||||
for (WorldExtension extension : extensions) extension.unloadChunk(event.getChunk());
|
||||
|
||||
if (event.world.isRemote) removeChunk(event.world, event.getChunk());
|
||||
}
|
||||
|
||||
@@ -1 +1,26 @@
|
||||
codechickencore.update=Version %s of %s is available
|
||||
codechickencore.update=Version %s of %s is available
|
||||
|
||||
codechickencore.color.buttonTextDisabled=FFA0A0A0
|
||||
codechickencore.color.buttonTextHover=FFFFFFA0
|
||||
codechickencore.color.buttonText=FFE0E0E0
|
||||
codechickencore.color.textFieldBorder=FFA0A0A0
|
||||
codechickencore.color.textFieldBackground=FF000000
|
||||
codechickencore.color.textFieldText=E0E0E0
|
||||
codechickencore.color.textFieldTextDisabled=707070
|
||||
codechickencore.color.background=FF000000
|
||||
codechickencore.color.overlayTop=FFA0A0A0
|
||||
codechickencore.color.overlayBottom=FFA0A0A0
|
||||
codechickencore.color.overlayLeft=FFA0A0A0
|
||||
codechickencore.color.overlayRight=FFA0A0A0
|
||||
codechickencore.color.scrollbarCorners=FF8B8B8B
|
||||
codechickencore.color.scrollbarTopLeft=FFF0F0F0
|
||||
codechickencore.color.scrollbarBottomRight=FF555555
|
||||
codechickencore.color.scrollbarFill=FFC6C6C6
|
||||
codechickencore.color.scrollbarGuide=FF808080
|
||||
codechickencore.color.tooltipBgStart=F0100010
|
||||
codechickencore.color.tooltipBgEnd=F0100010
|
||||
codechickencore.color.tooltipBorderStart=505000FF
|
||||
codechickencore.color.tooltipBorderEnd=5028007F
|
||||
codechickencore.color.tooltipText=FFFFFFFF
|
||||
codechickencore.color.itemQuantityText=FFFFFF
|
||||
codechickencore.color.modDescriptionText=DDDDDD
|
||||
@@ -0,0 +1,102 @@
|
||||
package codechicken.lib.render;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CyclicBarrier;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import codechicken.lib.vec.Vector3;
|
||||
|
||||
public class CCRenderStateThreadingTest {
|
||||
|
||||
private static int[] attribIndices() {
|
||||
return new int[] { CCRenderState.normalAttrib().attributeIndex, CCRenderState.colourAttrib().attributeIndex,
|
||||
CCRenderState.lightingAttrib().attributeIndex, CCRenderState.sideAttrib().attributeIndex,
|
||||
CCRenderState.lightCoordAttrib().attributeIndex };
|
||||
}
|
||||
|
||||
@Test
|
||||
public void attributeIndicesStableAcrossThreads() throws Exception {
|
||||
int[] main = attribIndices();
|
||||
assertEquals(5, Arrays.stream(main).distinct().count());
|
||||
|
||||
ExecutorService pool = Executors.newFixedThreadPool(8);
|
||||
try {
|
||||
List<Future<int[]>> futures = new ArrayList<>();
|
||||
for (int i = 0; i < 8; i++) futures.add(pool.submit(CCRenderStateThreadingTest::attribIndices));
|
||||
for (Future<int[]> f : futures) assertArrayEquals(main, f.get(10, TimeUnit.SECONDS));
|
||||
} finally {
|
||||
pool.shutdownNow();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void modelBakedOnOneThreadIsReadableOnAnother() throws Exception {
|
||||
ExecutorService bakeThread = Executors.newSingleThreadExecutor();
|
||||
ExecutorService renderThread = Executors.newSingleThreadExecutor();
|
||||
try {
|
||||
CCModel model = bakeThread.submit(() -> {
|
||||
CCModel m = CCModel.quadModel(4);
|
||||
m.verts[0] = new Vertex5(0, 1, 0, 0, 0);
|
||||
m.verts[1] = new Vertex5(0, 1, 1, 0, 1);
|
||||
m.verts[2] = new Vertex5(1, 1, 1, 1, 1);
|
||||
m.verts[3] = new Vertex5(1, 1, 0, 1, 0);
|
||||
return m.computeNormals();
|
||||
}).get(10, TimeUnit.SECONDS);
|
||||
|
||||
int side = renderThread.submit(() -> {
|
||||
assertTrue(
|
||||
model.hasAttribute(CCRenderState.normalAttrib()),
|
||||
"normals baked on another thread not visible under this thread's attributeIndex");
|
||||
Vector3[] normals = model.getAttributes(CCRenderState.normalAttrib());
|
||||
assertNotNull(normals);
|
||||
return CCModel.findSide(normals[0]);
|
||||
}).get(10, TimeUnit.SECONDS);
|
||||
|
||||
assertEquals(1, side);
|
||||
assertEquals(1, CCModel.findSide(model.getAttributes(CCRenderState.normalAttrib())[0]));
|
||||
} finally {
|
||||
bakeThread.shutdownNow();
|
||||
renderThread.shutdownNow();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void concurrentFirstUseKeepsIndicesConsistent() throws Exception {
|
||||
int threads = 16;
|
||||
CyclicBarrier barrier = new CyclicBarrier(threads);
|
||||
ExecutorService pool = Executors.newFixedThreadPool(threads);
|
||||
try {
|
||||
List<Future<int[]>> futures = new ArrayList<>();
|
||||
for (int i = 0; i < threads; i++) futures.add(pool.submit(() -> {
|
||||
barrier.await(10, TimeUnit.SECONDS);
|
||||
return attribIndices();
|
||||
}));
|
||||
int[] expected = attribIndices();
|
||||
for (Future<int[]> f : futures) assertArrayEquals(expected, f.get(10, TimeUnit.SECONDS));
|
||||
} finally {
|
||||
pool.shutdownNow();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAttributeReturnsCanonicalForIndex() {
|
||||
int normalIndex = CCRenderState.normalAttrib().attributeIndex;
|
||||
CCRenderState.VertexAttribute<?> canonical = CCRenderState.getAttribute(normalIndex);
|
||||
assertNotNull(canonical);
|
||||
assertEquals(normalIndex, canonical.attributeIndex);
|
||||
assertSame(canonical, CCRenderState.getAttribute(normalIndex));
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user