mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-15 02:25:32 -04:00
Unify auto rotate group finding code
This commit is contained in:
parent
f8e1df2e21
commit
0d3a1dda46
69
src/Block.c
69
src/Block.c
@ -526,6 +526,30 @@ void Block_UpdateCulling(BlockID block) {
|
|||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
cc_bool AutoRotate_Enabled;
|
cc_bool AutoRotate_Enabled;
|
||||||
|
|
||||||
|
#define AR_GROUP_CORNERS 0
|
||||||
|
#define AR_GROUP_VERTICAL 1
|
||||||
|
#define AR_GROUP_DIRECTION 2
|
||||||
|
#define AR_GROUP_PILLAR 3
|
||||||
|
|
||||||
|
#define AR_EQ1(x) (dir0 == x && dir1 == '\0')
|
||||||
|
#define AR_EQ2(x, y) (dir0 == x && dir1 == y)
|
||||||
|
static int AR_CalcGroup(const cc_string* dir) {
|
||||||
|
char dir0, dir1;
|
||||||
|
dir0 = dir->length > 1 ? dir->buffer[1] : '\0'; Char_MakeLower(dir0);
|
||||||
|
dir1 = dir->length > 2 ? dir->buffer[2] : '\0'; Char_MakeLower(dir1);
|
||||||
|
|
||||||
|
if (AR_EQ2('n','w') || AR_EQ2('n','e') || AR_EQ2('s','w') || AR_EQ2('s','e')) {
|
||||||
|
return AR_GROUP_CORNERS;
|
||||||
|
} else if (AR_EQ1('u') || AR_EQ1('d')) {
|
||||||
|
return AR_GROUP_VERTICAL;
|
||||||
|
} else if (AR_EQ1('n') || AR_EQ1('w') || AR_EQ1('s') || AR_EQ1('e')) {
|
||||||
|
return AR_GROUP_DIRECTION;
|
||||||
|
} else if (AR_EQ2('u','d') || AR_EQ2('w','e') || AR_EQ2('n','s')) {
|
||||||
|
return AR_GROUP_PILLAR;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* replaces a portion of a string, appends otherwise */
|
/* replaces a portion of a string, appends otherwise */
|
||||||
static void AutoRotate_Insert(cc_string* str, int offset, const char* suffix) {
|
static void AutoRotate_Insert(cc_string* str, int offset, const char* suffix) {
|
||||||
int i = str->length - offset;
|
int i = str->length - offset;
|
||||||
@ -618,31 +642,24 @@ static int RotateDirection(cc_string* name, int offset) {
|
|||||||
return GetRotated(name, offset);
|
return GetRotated(name, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define AR_EQ1(s, x) (dir0 == x && dir1 == '\0')
|
|
||||||
#define AR_EQ2(s, x, y) (dir0 == x && dir1 == y)
|
|
||||||
static int FindRotated(cc_string* name, int offset) {
|
static int FindRotated(cc_string* name, int offset) {
|
||||||
cc_string dir;
|
cc_string dir;
|
||||||
char dir0, dir1;
|
int group;
|
||||||
|
|
||||||
int dirIndex = String_LastIndexOfAt(name, offset, '-');
|
int dirIndex = String_LastIndexOfAt(name, offset, '-');
|
||||||
if (dirIndex == -1) return -1; /* not a directional block */
|
if (dirIndex == -1) return -1; /* not a directional block */
|
||||||
|
|
||||||
dir = String_UNSAFE_SubstringAt(name, dirIndex);
|
dir = String_UNSAFE_SubstringAt(name, dirIndex);
|
||||||
dir.length -= offset;
|
dir.length -= offset;
|
||||||
if (dir.length > 3) return -1;
|
if (dir.length > 3) return -1;
|
||||||
|
|
||||||
offset += dir.length;
|
offset += dir.length;
|
||||||
|
group = AR_CalcGroup(&dir);
|
||||||
|
|
||||||
/* e.g. -D or -ns */
|
if (group == AR_GROUP_CORNERS) return RotateCorner(name, offset);
|
||||||
dir0 = dir.length > 1 ? dir.buffer[1] : '\0'; Char_MakeLower(dir0);
|
if (group == AR_GROUP_VERTICAL) return RotateVertical(name, offset);
|
||||||
dir1 = dir.length > 2 ? dir.buffer[2] : '\0'; Char_MakeLower(dir1);
|
if (group == AR_GROUP_DIRECTION) return RotateDirection(name, offset);
|
||||||
|
|
||||||
if (AR_EQ2(dir, 'n','w') || AR_EQ2(dir, 'n','e') || AR_EQ2(dir, 's','w') || AR_EQ2(dir, 's','e')) {
|
if (group == AR_GROUP_PILLAR) {
|
||||||
return RotateCorner(name, offset);
|
|
||||||
} else if (AR_EQ1(dir, 'u') || AR_EQ1(dir, 'd')) {
|
|
||||||
return RotateVertical(name, offset);
|
|
||||||
} else if (AR_EQ1(dir, 'n') || AR_EQ1(dir, 'w') || AR_EQ1(dir, 's') || AR_EQ1(dir, 'e')) {
|
|
||||||
return RotateDirection(name, offset);
|
|
||||||
} else if (AR_EQ2(dir, 'u','d') || AR_EQ2(dir, 'w','e') || AR_EQ2(dir, 'n','s')) {
|
|
||||||
AutoRotate_Insert(name, offset, "-UD");
|
AutoRotate_Insert(name, offset, "-UD");
|
||||||
if (Block_FindID(name) == -1) {
|
if (Block_FindID(name) == -1) {
|
||||||
return RotateFence(name, offset);
|
return RotateFence(name, offset);
|
||||||
@ -667,26 +684,6 @@ BlockID AutoRotate_RotateBlock(BlockID block) {
|
|||||||
return rotated == -1 ? block : (BlockID)rotated;
|
return rotated == -1 ? block : (BlockID)rotated;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int FindAutoRotateType(cc_string* dir) {
|
|
||||||
char dir0, dir1;
|
|
||||||
|
|
||||||
dir0 = dir->length > 1 ? dir->buffer[1] : '\0'; Char_MakeLower(dir0);
|
|
||||||
dir1 = dir->length > 2 ? dir->buffer[2] : '\0'; Char_MakeLower(dir1);
|
|
||||||
if (AR_EQ2(dir, 'n', 'w') || AR_EQ2(dir, 'n', 'e') || AR_EQ2(dir, 's', 'w') || AR_EQ2(dir, 's', 'e')) {
|
|
||||||
return 0; /* corner */
|
|
||||||
}
|
|
||||||
else if (AR_EQ1(dir, 'u') || AR_EQ1(dir, 'd')) {
|
|
||||||
return 1; /* up/down */
|
|
||||||
}
|
|
||||||
else if (AR_EQ1(dir, 'n') || AR_EQ1(dir, 'w') || AR_EQ1(dir, 's') || AR_EQ1(dir, 'e')) {
|
|
||||||
return 2; /* directional */
|
|
||||||
}
|
|
||||||
else if (AR_EQ2(dir, 'u', 'd') || AR_EQ2(dir, 'w', 'e') || AR_EQ2(dir, 'n', 's')) {
|
|
||||||
return 3; /* pillar */
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void GetAutoRotateTypes(cc_string* blockName, int* dirType, int* dirType2, int* suffixIndex) {
|
static void GetAutoRotateTypes(cc_string* blockName, int* dirType, int* dirType2, int* suffixIndex) {
|
||||||
*dirType = -1;
|
*dirType = -1;
|
||||||
*dirType2 = -1;
|
*dirType2 = -1;
|
||||||
@ -702,7 +699,7 @@ static void GetAutoRotateTypes(cc_string* blockName, int* dirType, int* dirType2
|
|||||||
cc_string dir;
|
cc_string dir;
|
||||||
dir = String_UNSAFE_SubstringAt(blockName, dirIndex);
|
dir = String_UNSAFE_SubstringAt(blockName, dirIndex);
|
||||||
|
|
||||||
*dirType = FindAutoRotateType(&dir);
|
*dirType = AR_CalcGroup(&dir);
|
||||||
|
|
||||||
/* index of next rightmost group separated by dashes */
|
/* index of next rightmost group separated by dashes */
|
||||||
int dirIndex2 = String_NthIndexOfFromRight(blockName, '-', 2);
|
int dirIndex2 = String_NthIndexOfFromRight(blockName, '-', 2);
|
||||||
@ -714,7 +711,7 @@ static void GetAutoRotateTypes(cc_string* blockName, int* dirType, int* dirType2
|
|||||||
/* chop off the rightmost group by subtracting its length */
|
/* chop off the rightmost group by subtracting its length */
|
||||||
dir2.length -= dir.length;
|
dir2.length -= dir.length;
|
||||||
|
|
||||||
*dirType2 = FindAutoRotateType(&dir2);
|
*dirType2 = AR_CalcGroup(&dir2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,7 +141,7 @@ CC_API cc_uint64 Stopwatch_Measure(void);
|
|||||||
/* Returns total elapsed microseconds between two stopwatch measurements. */
|
/* Returns total elapsed microseconds between two stopwatch measurements. */
|
||||||
CC_API cc_uint64 Stopwatch_ElapsedMicroseconds(cc_uint64 beg, cc_uint64 end);
|
CC_API cc_uint64 Stopwatch_ElapsedMicroseconds(cc_uint64 beg, cc_uint64 end);
|
||||||
/* Returns total elapsed milliseconds between two stopwatch measurements. */
|
/* Returns total elapsed milliseconds between two stopwatch measurements. */
|
||||||
CC_API int Stopwatch_ElapsedMilliseconds(cc_uint64 beg, cc_uint64 end);
|
int Stopwatch_ElapsedMilliseconds(cc_uint64 beg, cc_uint64 end);
|
||||||
|
|
||||||
/* Returns non-zero if the given directory exists. */
|
/* Returns non-zero if the given directory exists. */
|
||||||
CC_API int Directory_Exists(const cc_string* path);
|
CC_API int Directory_Exists(const cc_string* path);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user