From 9765da97a600c5bea6166cb0d717021add1ba6bf Mon Sep 17 00:00:00 2001 From: tom lee Date: Sun, 20 Feb 2022 17:34:24 +0800 Subject: [PATCH] Reorder lodData, now this is the new Version 9 --- .../seibel/lod/core/util/DataPointUtil.java | 92 +++++++++---------- 1 file changed, 44 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/seibel/lod/core/util/DataPointUtil.java b/src/main/java/com/seibel/lod/core/util/DataPointUtil.java index 72236b024..feb913838 100644 --- a/src/main/java/com/seibel/lod/core/util/DataPointUtil.java +++ b/src/main/java/com/seibel/lod/core/util/DataPointUtil.java @@ -32,47 +32,41 @@ import com.seibel.lod.core.enums.config.DistanceGenerationMode; public class DataPointUtil { /* - |a |a |a |a |r |r |r |r | - |r |r |r |r |g |g |g |g | - |g |g |g |g |b |b |b |b | - |b |b |b |b |h |h |h |h | + + |_ |g |g |g |a |a |a |a | + |r |r |r |r |r |r |r |r | + |g |g |g |g |g |g |g |g | + |b |b |b |b |b |b |b |b | + |h |h |h |h |h |h |h |h | + |h |h |h |h |d |d |d |d | |d |d |d |d |d |d |d |d | - |d |d |d |d |bl |bl |bl |bl | - |sl |sl |sl |sl |g |g |g |e | - */ + |bl |bl |bl |bl |sl |sl |sl |sl | + + */ // Reminder: bytes have range of [-128, 127]. // When converting to or from an int a 128 should be added or removed. // If there is a bug with color then it's probably caused by this. - //To be used in the future for negative value - //public final static int MIN_DEPTH = -64; - //public final static int MIN_HEIGHT = -64; public final static int EMPTY_DATA = 0; - //public static final short VERTICAL_OFFSET = -64; public static int WORLD_HEIGHT = 4096; public final static int ALPHA_DOWNSIZE_SHIFT = 4; - //public final static int BLUE_COLOR_SHIFT = 0; - //public final static int GREEN_COLOR_SHIFT = 8; - //public final static int RED_COLOR_SHIFT = 16; - //public final static int ALPHA_COLOR_SHIFT = 24; - - public final static int BLUE_SHIFT = 36; + + public final static int GEN_TYPE_SHIFT = 60; + + public final static int COLOR_SHIFT = 32; + public final static int BLUE_SHIFT = COLOR_SHIFT; public final static int GREEN_SHIFT = BLUE_SHIFT + 8; - public final static int RED_SHIFT = BLUE_SHIFT + 16; - public final static int ALPHA_SHIFT = BLUE_SHIFT + 24; + public final static int RED_SHIFT = GREEN_SHIFT + 8; + public final static int ALPHA_SHIFT = RED_SHIFT + 8; - public final static int COLOR_SHIFT = 36; - - public final static int HEIGHT_SHIFT = 24; - public final static int DEPTH_SHIFT = 12; - public final static int BLOCK_LIGHT_SHIFT = 8; - public final static int SKY_LIGHT_SHIFT = 4; - public final static int GEN_TYPE_SHIFT = 1; - public final static int EXISTENCE_SHIFT = 0; + public final static int HEIGHT_SHIFT = 20; + public final static int DEPTH_SHIFT = 8; + public final static int BLOCK_LIGHT_SHIFT = 4; + public final static int SKY_LIGHT_SHIFT = 0; public final static long ALPHA_MASK = 0xF; public final static long RED_MASK = 0xFF; @@ -85,17 +79,19 @@ public class DataPointUtil public final static long BLOCK_LIGHT_MASK = 0xF; public final static long SKY_LIGHT_MASK = 0xF; public final static long GEN_TYPE_MASK = 0b111; - public final static long EXISTENCE_MASK = 1; + public final static long COMPARE_SHIFT = GEN_TYPE_SHIFT; public final static long HEIGHT_SHIFTED_MASK = HEIGHT_MASK << HEIGHT_SHIFT; public final static long DEPTH_SHIFTED_MASK = DEPTH_MASK << DEPTH_SHIFT; + public final static long VOID_SETTER = HEIGHT_SHIFTED_MASK | DEPTH_SHIFTED_MASK; + public static long createVoidDataPoint(int generationMode) { long dataPoint = 0; dataPoint |= (generationMode & GEN_TYPE_MASK) << GEN_TYPE_SHIFT; - dataPoint |= EXISTENCE_MASK << EXISTENCE_SHIFT; + dataPoint |= VOID_SETTER; return dataPoint; } @@ -120,12 +116,12 @@ public class DataPointUtil | (lightBlock & BLOCK_LIGHT_MASK) << BLOCK_LIGHT_SHIFT | (lightSky & SKY_LIGHT_MASK) << SKY_LIGHT_SHIFT | (generationMode & GEN_TYPE_MASK) << GEN_TYPE_SHIFT - | EXISTENCE_MASK << EXISTENCE_SHIFT; + ; } public static long shiftHeightAndDepth(long dataPoint, short offset) { long height = (dataPoint + ((long) offset << HEIGHT_SHIFT)) & HEIGHT_SHIFTED_MASK; - long depth = (dataPoint + (offset << DEPTH_SHIFT)) & DEPTH_SHIFTED_MASK; + long depth = (dataPoint + (offset << DEPTH_SHIFT)) & DEPTH_SHIFTED_MASK; return dataPoint & ~(HEIGHT_SHIFTED_MASK | DEPTH_SHIFTED_MASK) | height | depth; } @@ -140,15 +136,21 @@ public class DataPointUtil |bl |bl |bl |bl |sl |sl |sl |sl | |l |l |f |g |g |g |v |e | */ - return //((dataPoint >>> 60) & 0xF) << ALPHA_SHIFT - //| ((dataPoint >>> 52) & 0xFF) << RED_SHIFT - //| ((dataPoint >>> 44) & 0xFF) << GREEN_SHIFT - ((dataPoint >>> 36) & 0xFFFFFFF) << BLUE_SHIFT + if ((dataPoint & 1) == 0) return 0; + + long height = (dataPoint >>> 26) & 0x3FF; + long depth = (dataPoint >>> 16) & 0x3FF; + if (height == depth || (dataPoint & 0b10)==1) { + return createVoidDataPoint((int) ((dataPoint >>> 2) & 0xFF)); + } + return ((dataPoint >>> 60) & 0xF) << ALPHA_SHIFT + | ((dataPoint >>> 52) & 0xFF) << RED_SHIFT + | ((dataPoint >>> 44) & 0xFF) << GREEN_SHIFT + | ((dataPoint >>> 36) & 0xFF) << BLUE_SHIFT | ((dataPoint >>> 26) & 0x3FF) << HEIGHT_SHIFT | ((dataPoint >>> 16) & 0x3FF) << DEPTH_SHIFT | ((dataPoint >>> 8) & 0xFF) << SKY_LIGHT_SHIFT - | ((dataPoint >>> 2) & 0xFF) << GEN_TYPE_SHIFT - | dataPoint & 0x1; + | ((dataPoint >>> 2) & 0xFF) << GEN_TYPE_SHIFT; } public static short getHeight(long dataPoint) @@ -200,18 +202,18 @@ public class DataPointUtil public static boolean isVoid(long dataPoint) { - return (((dataPoint >>> DEPTH_SHIFT) & HEIGHT_DEPTH_MASK) == 0); + return getHeight(dataPoint) == getDepth(dataPoint); } public static boolean doesItExist(long dataPoint) { - return (((dataPoint >>> EXISTENCE_SHIFT) & EXISTENCE_MASK) == 1); + return dataPoint!=0; } public static int getColor(long dataPoint) { - // TODO re-add transparency by replacing the color 255 with what is in comment - return (int) (((dataPoint >>> COLOR_SHIFT) & COLOR_MASK) | ((((dataPoint >>> ALPHA_SHIFT) & ALPHA_MASK) << ALPHA_DOWNSIZE_SHIFT) | 0xF) << 24); + long alpha = getAlpha(dataPoint); + return (int) (((dataPoint >>> COLOR_SHIFT) & COLOR_MASK) | (alpha << (ALPHA_SHIFT-COLOR_SHIFT))); } /** This is used to convert a dataPoint to string (useful for the print function) */ @@ -258,13 +260,7 @@ public class DataPointUtil /** Return (>0) if dataA should replace dataB, (0) if equal, (<0) if dataB should replace dataA */ public static int compareDatapointPriority(long dataA, long dataB) { - if (!doesItExist(dataA) || !doesItExist(dataB)) { - if (doesItExist(dataA)) return Integer.MAX_VALUE; - if (doesItExist(dataB)) return Integer.MIN_VALUE; - } - int genA = (int)getGenerationMode(dataA); - int genB = (int)getGenerationMode(dataB); - return genA-genB; + return (int) ((dataA >> COMPARE_SHIFT) - (dataB >> COMPARE_SHIFT)); } // Merge the newData data into the target data by comparing the Datapoint Priority.