From 260ba1a70ea2f6c24731293d4d9ec6cbaa53c5d3 Mon Sep 17 00:00:00 2001 From: tom lee Date: Mon, 21 Mar 2022 16:55:36 +0800 Subject: [PATCH] Fix color mixing issue --- .../bufferBuilding/CubicLodTemplate.java | 18 +++++--- .../seibel/lod/core/render/LodRenderer.java | 2 +- .../com/seibel/lod/core/util/ColorUtil.java | 43 +++++++++++-------- .../lod/core/util/gridList/ArrayGridList.java | 7 +++ .../core/util/gridList/PosArrayGridList.java | 1 + 5 files changed, 47 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/CubicLodTemplate.java b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/CubicLodTemplate.java index 0e61e61c7..addfbb66c 100644 --- a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/CubicLodTemplate.java +++ b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/CubicLodTemplate.java @@ -19,6 +19,7 @@ package com.seibel.lod.core.builders.bufferBuilding; +import com.seibel.lod.core.api.ApiShared; import com.seibel.lod.core.enums.rendering.DebugMode; import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler; import com.seibel.lod.core.objects.opengl.LodBox; @@ -62,13 +63,18 @@ public class CubicLodTemplate } else { - double saturationMultiplier = CONFIG.client().graphics().advancedGraphics().getSaturationMultiplier(); - double brightnessMultiplier = CONFIG.client().graphics().advancedGraphics().getBrightnessMultiplier(); + float saturationMultiplier = (float)CONFIG.client().graphics().advancedGraphics().getSaturationMultiplier(); + float brightnessMultiplier = (float)CONFIG.client().graphics().advancedGraphics().getBrightnessMultiplier(); - float[] ahsv = ColorUtil.argbToAhsv(DataPointUtil.getColor(data)); - ahsv[2] *= saturationMultiplier; - ahsv[3] *= brightnessMultiplier; - color = ColorUtil.ahsvToArgb(ahsv[0], ahsv[1], ahsv[2], ahsv[3]); + if (saturationMultiplier == 1.0 && brightnessMultiplier == 1.0) { + color = DataPointUtil.getColor(data); + } else { + float[] ahsv = ColorUtil.argbToAhsv(DataPointUtil.getColor(data)); + color = ColorUtil.ahsvToArgb(ahsv[0], ahsv[1], ahsv[2] * saturationMultiplier, ahsv[3] * brightnessMultiplier); + //ApiShared.LOGGER.info("Raw color:[{}], AHSV:{}, Out color:[{}]", + // ColorUtil.toString(DataPointUtil.getColor(data)), + // ahsv, ColorUtil.toString(color)); + } } diff --git a/src/main/java/com/seibel/lod/core/render/LodRenderer.java b/src/main/java/com/seibel/lod/core/render/LodRenderer.java index b4360dbe9..b8e31fe2a 100644 --- a/src/main/java/com/seibel/lod/core/render/LodRenderer.java +++ b/src/main/java/com/seibel/lod/core/render/LodRenderer.java @@ -480,7 +480,7 @@ public class LodRenderer lodProj.setClipPlanes( calculateNearClipPlane( CONFIG.client().graphics().advancedGraphics().getUseExtendedNearClipPlane() ? - (vanillaBlockRenderedDistance-16) : 16, partialTicks), + Math.min((vanillaBlockRenderedDistance-16),8*8) : 16, partialTicks), (float)((farPlaneBlockDistance+LodUtil.REGION_WIDTH) * Math.sqrt(2))); lodProj.multiply(modelMat); diff --git a/src/main/java/com/seibel/lod/core/util/ColorUtil.java b/src/main/java/com/seibel/lod/core/util/ColorUtil.java index 0a12f03e5..fd509b13a 100644 --- a/src/main/java/com/seibel/lod/core/util/ColorUtil.java +++ b/src/main/java/com/seibel/lod/core/util/ColorUtil.java @@ -46,6 +46,10 @@ public class ColorUtil { return (alpha << 24) | (red << 16) | (green << 8) | blue; } + public static int rgbToInt(float alpha, float red, float green, float blue) + { + return rgbToInt((int)(alpha*255f), (int)(red*255f), (int)(green*255f), (int)(blue*255f)); + } /** Returns a value between 0 and 255 */ public static int getAlpha(int color) @@ -101,18 +105,18 @@ public class ColorUtil } // Below 2 functions are from: https://stackoverflow.com/questions/13806483/increase-or-decrease-color-saturation - // hue is in 0 to 360 degrees + // Alpha in [0.0,1.0], hue in [0.0,360.0], Sat in [0.0,1.0], Value in [0.0,1.0] public static float[] argbToAhsv(int color) { - float a = getAlpha(color); - float r = getRed(color); - float g = getGreen(color); - float b = getGreen(color); + float a = getAlpha(color) / 255f; + float r = getRed(color) / 255f; + float g = getGreen(color) / 255f; + float b = getBlue(color) / 255f; float h, s, v; float min = Math.min(Math.min( r, g), b ); float max = Math.max(Math.max( r, g), b ); - float delta = max - min; v = max; + float delta = max - min; if( max != 0f ) s = delta / max; // s else { @@ -131,25 +135,30 @@ public class ColorUtil } return new float[]{a,h,s,v}; } + // Alpha in [0.0,1.0], hue in [0.0,360.0], Sat in [0.0,1.0], Value in [0.0,1.0] public static int ahsvToArgb(float a, float h, float s, float v) { + if (a > 1.f) a = 1.f; + if (h > 360.f) h -= 350.f; + if (s > 1.f) s = 1.f; + if (v > 1.f) v = 1.f; + if(s == 0f) { // achromatic (grey) - return ColorUtil.rgbToInt((int) a, (int)v, (int)v, (int)v); + return ColorUtil.rgbToInt(a, v, v, v); } - if (s > 255f) s = 255f; - if (v > 255f) v = 255f; - int i = (int)(h/60f) % 6; - float f = h - i; // factorial part of h + h /= 60f; + int i = (int)(Math.floor(h)); + float f = h-i; // factorial part of h float p = v * ( 1f - s ); float q = v * ( 1f - s * f ); float t = v * ( 1f - s * ( 1f - f ) ); return switch (i) { - case 0 -> ColorUtil.rgbToInt((int) a, (int) v, (int) t, (int) p); - case 1 -> ColorUtil.rgbToInt((int) a, (int) q, (int) v, (int) p); - case 2 -> ColorUtil.rgbToInt((int) a, (int) p, (int) v, (int) t); - case 3 -> ColorUtil.rgbToInt((int) a, (int) p, (int) q, (int) v); - case 4 -> ColorUtil.rgbToInt((int) a, (int) t, (int) p, (int) v); - default -> ColorUtil.rgbToInt((int) a, (int) v, (int) p, (int) q); // case 5 + case 0 -> ColorUtil.rgbToInt(a, v, t, p); + case 1 -> ColorUtil.rgbToInt(a, q, v, p); + case 2 -> ColorUtil.rgbToInt(a, p, v, t); + case 3 -> ColorUtil.rgbToInt(a, p, q, v); + case 4 -> ColorUtil.rgbToInt(a, t, p, v); + default -> ColorUtil.rgbToInt(a, v, p, q); // case 5 }; } diff --git a/src/main/java/com/seibel/lod/core/util/gridList/ArrayGridList.java b/src/main/java/com/seibel/lod/core/util/gridList/ArrayGridList.java index eeca1db19..768d1a9e2 100644 --- a/src/main/java/com/seibel/lod/core/util/gridList/ArrayGridList.java +++ b/src/main/java/com/seibel/lod/core/util/gridList/ArrayGridList.java @@ -53,12 +53,19 @@ public class ArrayGridList extends ArrayList { return set(pos.x, pos.y, e); } public T get(int x, int y) { + if (!inRange(x,y)) return null; return get(_indexOf(x,y)); } public T set(int x, int y, T e) { + if (!inRange(x,y)) return null; return set(_indexOf(x, y), e); } + public boolean inRange(int x, int y) { + return (x>=0 && x=0 && y extends ArrayGridList { return offsetY; } + @Override public boolean inRange(int x, int y) { return (x>=offsetX && x=offsetY && y