mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-18 20:15:35 -04:00
Fix edge/sides of air not working. (thanks tornato)
This commit is contained in:
parent
0c2af35687
commit
15f9ee0365
@ -701,7 +701,6 @@ void NormalBuilder_SetActive(void) {
|
|||||||
*-------------------------------------------------Advanced mesh builder---------------------------------------------------*
|
*-------------------------------------------------Advanced mesh builder---------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
static Vector3 adv_minBB, adv_maxBB;
|
static Vector3 adv_minBB, adv_maxBB;
|
||||||
static bool adv_isTranslucent;
|
|
||||||
static int adv_initBitFlags, adv_lightFlags, adv_baseOffset;
|
static int adv_initBitFlags, adv_lightFlags, adv_baseOffset;
|
||||||
static int* adv_bitFlags;
|
static int* adv_bitFlags;
|
||||||
static float adv_x1, adv_y1, adv_z1, adv_x2, adv_y2, adv_z2;
|
static float adv_x1, adv_y1, adv_z1, adv_x2, adv_y2, adv_z2;
|
||||||
|
@ -427,11 +427,17 @@ static void Inflate_InflateFast(struct InflateState* state) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Inflate_Process(struct InflateState* state) {
|
void Inflate_Process(struct InflateState* state) {
|
||||||
|
uint32_t len, dist, nlen;
|
||||||
|
uint32_t count, bits;
|
||||||
|
uint32_t blockHeader;
|
||||||
|
uint32_t copyLen, windowCopyLen;
|
||||||
|
uint32_t distIdx, lenIdx;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
switch (state->State) {
|
switch (state->State) {
|
||||||
case INFLATE_STATE_HEADER: {
|
case INFLATE_STATE_HEADER: {
|
||||||
Inflate_EnsureBits(state, 3);
|
Inflate_EnsureBits(state, 3);
|
||||||
uint32_t blockHeader = Inflate_ReadBits(state, 3);
|
blockHeader = Inflate_ReadBits(state, 3);
|
||||||
state->LastBlock = blockHeader & 1;
|
state->LastBlock = blockHeader & 1;
|
||||||
|
|
||||||
switch (blockHeader >> 1) {
|
switch (blockHeader >> 1) {
|
||||||
@ -460,8 +466,8 @@ void Inflate_Process(struct InflateState* state) {
|
|||||||
|
|
||||||
case INFLATE_STATE_UNCOMPRESSED_HEADER: {
|
case INFLATE_STATE_UNCOMPRESSED_HEADER: {
|
||||||
Inflate_EnsureBits(state, 32);
|
Inflate_EnsureBits(state, 32);
|
||||||
uint32_t len = Inflate_ReadBits(state, 16);
|
len = Inflate_ReadBits(state, 16);
|
||||||
uint32_t nlen = Inflate_ReadBits(state, 16);
|
nlen = Inflate_ReadBits(state, 16);
|
||||||
|
|
||||||
if (len != (nlen ^ 0xFFFFUL)) {
|
if (len != (nlen ^ 0xFFFFUL)) {
|
||||||
ErrorHandler_Fail("DEFLATE - Uncompressed block LEN check failed");
|
ErrorHandler_Fail("DEFLATE - Uncompressed block LEN check failed");
|
||||||
@ -481,11 +487,11 @@ void Inflate_Process(struct InflateState* state) {
|
|||||||
}
|
}
|
||||||
if (!state->AvailIn || !state->AvailOut) return;
|
if (!state->AvailIn || !state->AvailOut) return;
|
||||||
|
|
||||||
uint32_t copyLen = min(state->AvailIn, state->AvailOut);
|
copyLen = min(state->AvailIn, state->AvailOut);
|
||||||
copyLen = min(copyLen, state->Index);
|
copyLen = min(copyLen, state->Index);
|
||||||
if (copyLen > 0) {
|
if (copyLen > 0) {
|
||||||
Mem_Copy(state->Output, state->NextIn, copyLen);
|
Mem_Copy(state->Output, state->NextIn, copyLen);
|
||||||
uint32_t windowCopyLen = INFLATE_WINDOW_SIZE - state->WindowIndex;
|
windowCopyLen = INFLATE_WINDOW_SIZE - state->WindowIndex;
|
||||||
windowCopyLen = min(windowCopyLen, copyLen);
|
windowCopyLen = min(windowCopyLen, copyLen);
|
||||||
|
|
||||||
Mem_Copy(&state->Window[state->WindowIndex], state->Output, windowCopyLen);
|
Mem_Copy(&state->Window[state->WindowIndex], state->Output, windowCopyLen);
|
||||||
@ -496,7 +502,7 @@ void Inflate_Process(struct InflateState* state) {
|
|||||||
|
|
||||||
state->WindowIndex = (state->WindowIndex + copyLen) & INFLATE_WINDOW_MASK;
|
state->WindowIndex = (state->WindowIndex + copyLen) & INFLATE_WINDOW_MASK;
|
||||||
state->Output += copyLen; state->AvailOut -= copyLen; state->Index -= copyLen;
|
state->Output += copyLen; state->AvailOut -= copyLen; state->Index -= copyLen;
|
||||||
state->NextIn += copyLen; state->AvailIn -= copyLen;
|
state->NextIn += copyLen; state->AvailIn -= copyLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!state->Index) { state->State = Inflate_NextBlockState(state); }
|
if (!state->Index) { state->State = Inflate_NextBlockState(state); }
|
||||||
@ -530,7 +536,7 @@ void Inflate_Process(struct InflateState* state) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case INFLATE_STATE_DYNAMIC_LITSDISTS: {
|
case INFLATE_STATE_DYNAMIC_LITSDISTS: {
|
||||||
uint32_t count = state->NumLits + state->NumDists;
|
count = state->NumLits + state->NumDists;
|
||||||
while (state->Index < count) {
|
while (state->Index < count) {
|
||||||
int bits = Huffman_Decode(state, &state->Table.CodeLens);
|
int bits = Huffman_Decode(state, &state->Table.CodeLens);
|
||||||
if (bits < 16) {
|
if (bits < 16) {
|
||||||
@ -578,7 +584,7 @@ void Inflate_Process(struct InflateState* state) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t count = state->NumLits + state->NumDists;
|
count = state->NumLits + state->NumDists;
|
||||||
if (state->Index + repeatCount > count) {
|
if (state->Index + repeatCount > count) {
|
||||||
ErrorHandler_Fail("DEFLATE - Tried to repeat past end");
|
ErrorHandler_Fail("DEFLATE - Tried to repeat past end");
|
||||||
}
|
}
|
||||||
@ -605,16 +611,16 @@ void Inflate_Process(struct InflateState* state) {
|
|||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
state->TmpLit = lit - 257;
|
state->TmpLit = lit - 257;
|
||||||
state->State = INFLATE_STATE_COMPRESSED_LITREPEAT;
|
state->State = INFLATE_STATE_COMPRESSED_LITREPEAT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case INFLATE_STATE_COMPRESSED_LITREPEAT: {
|
case INFLATE_STATE_COMPRESSED_LITREPEAT: {
|
||||||
uint32_t lenIdx = state->TmpLit;
|
lenIdx = state->TmpLit;
|
||||||
uint32_t bits = len_bits[lenIdx];
|
bits = len_bits[lenIdx];
|
||||||
Inflate_EnsureBits(state, bits);
|
Inflate_EnsureBits(state, bits);
|
||||||
state->TmpLit = len_base[lenIdx] + Inflate_ReadBits(state, bits);
|
state->TmpLit = len_base[lenIdx] + Inflate_ReadBits(state, bits);
|
||||||
state->State = INFLATE_STATE_COMPRESSED_DIST;
|
state->State = INFLATE_STATE_COMPRESSED_DIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
case INFLATE_STATE_COMPRESSED_DIST: {
|
case INFLATE_STATE_COMPRESSED_DIST: {
|
||||||
@ -624,16 +630,16 @@ void Inflate_Process(struct InflateState* state) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case INFLATE_STATE_COMPRESSED_DISTREPEAT: {
|
case INFLATE_STATE_COMPRESSED_DISTREPEAT: {
|
||||||
uint32_t distIdx = state->TmpDist;
|
distIdx = state->TmpDist;
|
||||||
uint32_t bits = dist_bits[distIdx];
|
bits = dist_bits[distIdx];
|
||||||
Inflate_EnsureBits(state, bits);
|
Inflate_EnsureBits(state, bits);
|
||||||
state->TmpDist = dist_base[distIdx] + Inflate_ReadBits(state, bits);
|
state->TmpDist = dist_base[distIdx] + Inflate_ReadBits(state, bits);
|
||||||
state->State = INFLATE_STATE_COMPRESSED_DATA;
|
state->State = INFLATE_STATE_COMPRESSED_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
case INFLATE_STATE_COMPRESSED_DATA: {
|
case INFLATE_STATE_COMPRESSED_DATA: {
|
||||||
if (!state->AvailOut) return;
|
if (!state->AvailOut) return;
|
||||||
uint32_t len = state->TmpLit, dist = state->TmpDist;
|
len = state->TmpLit; dist = state->TmpDist;
|
||||||
len = min(len, state->AvailOut);
|
len = min(len, state->AvailOut);
|
||||||
|
|
||||||
/* TODO: Should we test outside of the loop, whether a masking will be required or not? */
|
/* TODO: Should we test outside of the loop, whether a masking will be required or not? */
|
||||||
@ -647,7 +653,7 @@ void Inflate_Process(struct InflateState* state) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
state->WindowIndex = (curIdx + len) & INFLATE_WINDOW_MASK;
|
state->WindowIndex = (curIdx + len) & INFLATE_WINDOW_MASK;
|
||||||
state->TmpLit -= len;
|
state->TmpLit -= len;
|
||||||
state->AvailOut -= len;
|
state->AvailOut -= len;
|
||||||
if (!state->TmpLit) { state->State = Inflate_NextCompressState(state); }
|
if (!state->TmpLit) { state->State = Inflate_NextCompressState(state); }
|
||||||
break;
|
break;
|
||||||
@ -847,8 +853,12 @@ static ReturnCode Deflate_FlushBlock(struct DeflateState* state, int len) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static ReturnCode Deflate_StreamWrite(struct Stream* stream, uint8_t* data, uint32_t count, uint32_t* modified) {
|
static ReturnCode Deflate_StreamWrite(struct Stream* stream, uint8_t* data, uint32_t count, uint32_t* modified) {
|
||||||
struct DeflateState* state = stream->Meta.Inflate;
|
struct DeflateState* state;
|
||||||
|
ReturnCode res;
|
||||||
|
|
||||||
|
state = stream->Meta.Inflate;
|
||||||
*modified = 0;
|
*modified = 0;
|
||||||
|
|
||||||
while (count > 0) {
|
while (count > 0) {
|
||||||
uint8_t* dst = &state->Input[state->InputPosition];
|
uint8_t* dst = &state->Input[state->InputPosition];
|
||||||
uint32_t toWrite = count;
|
uint32_t toWrite = count;
|
||||||
@ -863,7 +873,7 @@ static ReturnCode Deflate_StreamWrite(struct Stream* stream, uint8_t* data, uint
|
|||||||
data += toWrite;
|
data += toWrite;
|
||||||
|
|
||||||
if (state->InputPosition == DEFLATE_BUFFER_SIZE) {
|
if (state->InputPosition == DEFLATE_BUFFER_SIZE) {
|
||||||
ReturnCode res = Deflate_FlushBlock(state, DEFLATE_BUFFER_SIZE);
|
res = Deflate_FlushBlock(state, DEFLATE_BUFFER_SIZE);
|
||||||
if (res) return res;
|
if (res) return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -871,8 +881,11 @@ static ReturnCode Deflate_StreamWrite(struct Stream* stream, uint8_t* data, uint
|
|||||||
}
|
}
|
||||||
|
|
||||||
static ReturnCode Deflate_StreamClose(struct Stream* stream) {
|
static ReturnCode Deflate_StreamClose(struct Stream* stream) {
|
||||||
struct DeflateState* state = stream->Meta.Inflate;
|
struct DeflateState* state;
|
||||||
ReturnCode res = Deflate_FlushBlock(state, state->InputPosition);
|
ReturnCode res;
|
||||||
|
|
||||||
|
state = stream->Meta.Inflate;
|
||||||
|
res = Deflate_FlushBlock(state, state->InputPosition);
|
||||||
if (res) return res;
|
if (res) return res;
|
||||||
|
|
||||||
/* Write huffman encoded "literal 256" to terminate symbols */
|
/* Write huffman encoded "literal 256" to terminate symbols */
|
||||||
|
@ -30,7 +30,7 @@ static float EnvRenderer_BlendFactor(float x) {
|
|||||||
|
|
||||||
#define EnvRenderer_AxisSize() (EnvRenderer_Legacy ? 128 : 65536)
|
#define EnvRenderer_AxisSize() (EnvRenderer_Legacy ? 128 : 65536)
|
||||||
/* Returns the number of vertices needed to subdivide a quad */
|
/* Returns the number of vertices needed to subdivide a quad */
|
||||||
int EnvRenderer_Vertices(int axis1Len, int axis2Len) {
|
static int EnvRenderer_Vertices(int axis1Len, int axis2Len) {
|
||||||
int axisSize = EnvRenderer_AxisSize();
|
int axisSize = EnvRenderer_AxisSize();
|
||||||
return Math_CeilDiv(axis1Len, axisSize) * Math_CeilDiv(axis2Len, axisSize) * 4;
|
return Math_CeilDiv(axis1Len, axisSize) * Math_CeilDiv(axis2Len, axisSize) * 4;
|
||||||
}
|
}
|
||||||
@ -871,8 +871,10 @@ static void EnvRenderer_ViewDistanceChanged(void* obj) {
|
|||||||
static void EnvRenderer_EnvVariableChanged(void* obj, int envVar) {
|
static void EnvRenderer_EnvVariableChanged(void* obj, int envVar) {
|
||||||
if (envVar == ENV_VAR_EDGE_BLOCK) {
|
if (envVar == ENV_VAR_EDGE_BLOCK) {
|
||||||
EnvRenderer_MakeBorderTex(&edges_tex, Env_EdgeBlock);
|
EnvRenderer_MakeBorderTex(&edges_tex, Env_EdgeBlock);
|
||||||
|
EnvRenderer_UpdateMapEdges();
|
||||||
} else if (envVar == ENV_VAR_SIDES_BLOCK) {
|
} else if (envVar == ENV_VAR_SIDES_BLOCK) {
|
||||||
EnvRenderer_MakeBorderTex(&sides_tex, Env_SidesBlock);
|
EnvRenderer_MakeBorderTex(&sides_tex, Env_SidesBlock);
|
||||||
|
EnvRenderer_UpdateMapSides();
|
||||||
} else if (envVar == ENV_VAR_EDGE_HEIGHT || envVar == ENV_VAR_SIDES_OFFSET) {
|
} else if (envVar == ENV_VAR_EDGE_HEIGHT || envVar == ENV_VAR_SIDES_OFFSET) {
|
||||||
EnvRenderer_UpdateMapEdges();
|
EnvRenderer_UpdateMapEdges();
|
||||||
EnvRenderer_UpdateMapSides();
|
EnvRenderer_UpdateMapSides();
|
||||||
|
@ -71,6 +71,7 @@ struct Widget { Widget_Layout };
|
|||||||
void Widget_SetLocation(void* widget, uint8_t horAnchor, uint8_t verAnchor, int xOffset, int yOffset);
|
void Widget_SetLocation(void* widget, uint8_t horAnchor, uint8_t verAnchor, int xOffset, int yOffset);
|
||||||
void Widget_CalcPosition(void* widget);
|
void Widget_CalcPosition(void* widget);
|
||||||
void Widget_Reset(void* widget);
|
void Widget_Reset(void* widget);
|
||||||
|
/* Whether the given point is located within the bounds of the widget. */
|
||||||
bool Widget_Contains(void* widget, int x, int y);
|
bool Widget_Contains(void* widget, int x, int y);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1604,12 +1604,12 @@ static void KeyBindingsScreen_GetText(struct KeyBindingsScreen* s, int i, String
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void KeyBindingsScreen_OnBindingClick(void* screen, void* widget) {
|
static void KeyBindingsScreen_OnBindingClick(void* screen, void* widget) {
|
||||||
|
String text; char textBuffer[STRING_SIZE];
|
||||||
struct KeyBindingsScreen* s = screen;
|
struct KeyBindingsScreen* s = screen;
|
||||||
struct ButtonWidget* btn = widget;
|
struct ButtonWidget* btn = widget;
|
||||||
struct ButtonWidget* cur;
|
struct ButtonWidget* cur;
|
||||||
char textBuffer[STRING_SIZE];
|
|
||||||
String text = String_FromArray(textBuffer);
|
|
||||||
|
|
||||||
|
String_InitArray(text, textBuffer);
|
||||||
/* previously selected a different button for binding */
|
/* previously selected a different button for binding */
|
||||||
if (s->CurI >= 0) {
|
if (s->CurI >= 0) {
|
||||||
KeyBindingsScreen_GetText(s, s->CurI, &text);
|
KeyBindingsScreen_GetText(s, s->CurI, &text);
|
||||||
|
@ -880,6 +880,10 @@ void Font_GetNames(StringsBuffer* buffer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Font_Make(FontDesc* desc, const String* fontName, int size, int style) {
|
void Font_Make(FontDesc* desc, const String* fontName, int size, int style) {
|
||||||
|
StringsBuffer* entries;
|
||||||
|
int idx;
|
||||||
|
String path;
|
||||||
|
|
||||||
FT_Stream stream;
|
FT_Stream stream;
|
||||||
FT_Open_Args args;
|
FT_Open_Args args;
|
||||||
FT_Face face;
|
FT_Face face;
|
||||||
@ -889,8 +893,8 @@ void Font_Make(FontDesc* desc, const String* fontName, int size, int style) {
|
|||||||
desc->Style = style;
|
desc->Style = style;
|
||||||
if (!norm_fonts.Count) Font_Init();
|
if (!norm_fonts.Count) Font_Init();
|
||||||
|
|
||||||
int idx = -1;
|
idx = -1;
|
||||||
StringsBuffer* entries = &bold_fonts;
|
entries = &bold_fonts;
|
||||||
if (style & FONT_STYLE_BOLD) { idx = Font_Find(fontName, entries); }
|
if (style & FONT_STYLE_BOLD) { idx = Font_Find(fontName, entries); }
|
||||||
|
|
||||||
if (idx == -1) {
|
if (idx == -1) {
|
||||||
@ -899,7 +903,7 @@ void Font_Make(FontDesc* desc, const String* fontName, int size, int style) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (idx == -1) ErrorHandler_Fail("Unknown font");
|
if (idx == -1) ErrorHandler_Fail("Unknown font");
|
||||||
String path = StringsBuffer_UNSAFE_Get(entries, idx - 1);
|
path = StringsBuffer_UNSAFE_Get(entries, idx - 1);
|
||||||
|
|
||||||
stream = Mem_AllocCleared(1, sizeof(FT_StreamRec), "leaky font"); /* TODO: LEAKS MEMORY!!! */
|
stream = Mem_AllocCleared(1, sizeof(FT_StreamRec), "leaky font"); /* TODO: LEAKS MEMORY!!! */
|
||||||
if (!Font_MakeArgs(&path, stream, &args)) return;
|
if (!Font_MakeArgs(&path, stream, &args)) return;
|
||||||
|
@ -993,7 +993,10 @@ static bool ChatScreen_MouseScroll(void* screen, float delta) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool ChatScreen_MouseDown(void* screen, int x, int y, MouseButton btn) {
|
static bool ChatScreen_MouseDown(void* screen, int x, int y, MouseButton btn) {
|
||||||
|
String text; char textBuffer[STRING_SIZE * 4];
|
||||||
struct ChatScreen* s = screen;
|
struct ChatScreen* s = screen;
|
||||||
|
struct Screen* overlay;
|
||||||
|
int height, chatY;
|
||||||
if (!s->HandlesAllInput || Game_HideGui) return false;
|
if (!s->HandlesAllInput || Game_HideGui) return false;
|
||||||
|
|
||||||
if (!Widget_Contains(&s->Chat, x, y)) {
|
if (!Widget_Contains(&s->Chat, x, y)) {
|
||||||
@ -1006,17 +1009,16 @@ static bool ChatScreen_MouseDown(void* screen, int x, int y, MouseButton btn) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int height = TextGroupWidget_UsedHeight(&s->Chat);
|
height = TextGroupWidget_UsedHeight(&s->Chat);
|
||||||
int chatY = s->Chat.Y + s->Chat.Height - height;
|
chatY = s->Chat.Y + s->Chat.Height - height;
|
||||||
if (!Gui_Contains(s->Chat.X, chatY, s->Chat.Width, height, x, y)) return false;
|
if (!Gui_Contains(s->Chat.X, chatY, s->Chat.Width, height, x, y)) return false;
|
||||||
|
|
||||||
char textBuffer[STRING_SIZE * 4];
|
String_InitArray(text, textBuffer);
|
||||||
String text = String_FromArray(textBuffer);
|
|
||||||
TextGroupWidget_GetSelected(&s->Chat, &text, x, y);
|
TextGroupWidget_GetSelected(&s->Chat, &text, x, y);
|
||||||
if (!text.length) return false;
|
if (!text.length) return false;
|
||||||
|
|
||||||
if (Utils_IsUrlPrefix(&text, 0)) {
|
if (Utils_IsUrlPrefix(&text, 0)) {
|
||||||
struct Screen* overlay = UrlWarningOverlay_MakeInstance(&text);
|
overlay = UrlWarningOverlay_MakeInstance(&text);
|
||||||
Gui_ShowOverlay(overlay, false);
|
Gui_ShowOverlay(overlay, false);
|
||||||
} else if (Game_ClickableChat) {
|
} else if (Game_ClickableChat) {
|
||||||
InputWidget_AppendString(&s->Input.Base, &text);
|
InputWidget_AppendString(&s->Input.Base, &text);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user