mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-18 12:05:14 -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---------------------------------------------------*
|
||||
*#########################################################################################################################*/
|
||||
static Vector3 adv_minBB, adv_maxBB;
|
||||
static bool adv_isTranslucent;
|
||||
static int adv_initBitFlags, adv_lightFlags, adv_baseOffset;
|
||||
static int* adv_bitFlags;
|
||||
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) {
|
||||
uint32_t len, dist, nlen;
|
||||
uint32_t count, bits;
|
||||
uint32_t blockHeader;
|
||||
uint32_t copyLen, windowCopyLen;
|
||||
uint32_t distIdx, lenIdx;
|
||||
|
||||
for (;;) {
|
||||
switch (state->State) {
|
||||
case INFLATE_STATE_HEADER: {
|
||||
Inflate_EnsureBits(state, 3);
|
||||
uint32_t blockHeader = Inflate_ReadBits(state, 3);
|
||||
blockHeader = Inflate_ReadBits(state, 3);
|
||||
state->LastBlock = blockHeader & 1;
|
||||
|
||||
switch (blockHeader >> 1) {
|
||||
@ -460,8 +466,8 @@ void Inflate_Process(struct InflateState* state) {
|
||||
|
||||
case INFLATE_STATE_UNCOMPRESSED_HEADER: {
|
||||
Inflate_EnsureBits(state, 32);
|
||||
uint32_t len = Inflate_ReadBits(state, 16);
|
||||
uint32_t nlen = Inflate_ReadBits(state, 16);
|
||||
len = Inflate_ReadBits(state, 16);
|
||||
nlen = Inflate_ReadBits(state, 16);
|
||||
|
||||
if (len != (nlen ^ 0xFFFFUL)) {
|
||||
ErrorHandler_Fail("DEFLATE - Uncompressed block LEN check failed");
|
||||
@ -481,11 +487,11 @@ void Inflate_Process(struct InflateState* state) {
|
||||
}
|
||||
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);
|
||||
if (copyLen > 0) {
|
||||
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);
|
||||
|
||||
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->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); }
|
||||
@ -530,7 +536,7 @@ void Inflate_Process(struct InflateState* state) {
|
||||
}
|
||||
|
||||
case INFLATE_STATE_DYNAMIC_LITSDISTS: {
|
||||
uint32_t count = state->NumLits + state->NumDists;
|
||||
count = state->NumLits + state->NumDists;
|
||||
while (state->Index < count) {
|
||||
int bits = Huffman_Decode(state, &state->Table.CodeLens);
|
||||
if (bits < 16) {
|
||||
@ -578,7 +584,7 @@ void Inflate_Process(struct InflateState* state) {
|
||||
break;
|
||||
}
|
||||
|
||||
uint32_t count = state->NumLits + state->NumDists;
|
||||
count = state->NumLits + state->NumDists;
|
||||
if (state->Index + repeatCount > count) {
|
||||
ErrorHandler_Fail("DEFLATE - Tried to repeat past end");
|
||||
}
|
||||
@ -605,16 +611,16 @@ void Inflate_Process(struct InflateState* state) {
|
||||
break;
|
||||
} else {
|
||||
state->TmpLit = lit - 257;
|
||||
state->State = INFLATE_STATE_COMPRESSED_LITREPEAT;
|
||||
state->State = INFLATE_STATE_COMPRESSED_LITREPEAT;
|
||||
}
|
||||
}
|
||||
|
||||
case INFLATE_STATE_COMPRESSED_LITREPEAT: {
|
||||
uint32_t lenIdx = state->TmpLit;
|
||||
uint32_t bits = len_bits[lenIdx];
|
||||
lenIdx = state->TmpLit;
|
||||
bits = len_bits[lenIdx];
|
||||
Inflate_EnsureBits(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: {
|
||||
@ -624,16 +630,16 @@ void Inflate_Process(struct InflateState* state) {
|
||||
}
|
||||
|
||||
case INFLATE_STATE_COMPRESSED_DISTREPEAT: {
|
||||
uint32_t distIdx = state->TmpDist;
|
||||
uint32_t bits = dist_bits[distIdx];
|
||||
distIdx = state->TmpDist;
|
||||
bits = dist_bits[distIdx];
|
||||
Inflate_EnsureBits(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: {
|
||||
if (!state->AvailOut) return;
|
||||
uint32_t len = state->TmpLit, dist = state->TmpDist;
|
||||
len = state->TmpLit; dist = state->TmpDist;
|
||||
len = min(len, state->AvailOut);
|
||||
|
||||
/* 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->TmpLit -= len;
|
||||
state->TmpLit -= len;
|
||||
state->AvailOut -= len;
|
||||
if (!state->TmpLit) { state->State = Inflate_NextCompressState(state); }
|
||||
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) {
|
||||
struct DeflateState* state = stream->Meta.Inflate;
|
||||
struct DeflateState* state;
|
||||
ReturnCode res;
|
||||
|
||||
state = stream->Meta.Inflate;
|
||||
*modified = 0;
|
||||
|
||||
while (count > 0) {
|
||||
uint8_t* dst = &state->Input[state->InputPosition];
|
||||
uint32_t toWrite = count;
|
||||
@ -863,7 +873,7 @@ static ReturnCode Deflate_StreamWrite(struct Stream* stream, uint8_t* data, uint
|
||||
data += toWrite;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -871,8 +881,11 @@ static ReturnCode Deflate_StreamWrite(struct Stream* stream, uint8_t* data, uint
|
||||
}
|
||||
|
||||
static ReturnCode Deflate_StreamClose(struct Stream* stream) {
|
||||
struct DeflateState* state = stream->Meta.Inflate;
|
||||
ReturnCode res = Deflate_FlushBlock(state, state->InputPosition);
|
||||
struct DeflateState* state;
|
||||
ReturnCode res;
|
||||
|
||||
state = stream->Meta.Inflate;
|
||||
res = Deflate_FlushBlock(state, state->InputPosition);
|
||||
if (res) return res;
|
||||
|
||||
/* 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)
|
||||
/* 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();
|
||||
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) {
|
||||
if (envVar == ENV_VAR_EDGE_BLOCK) {
|
||||
EnvRenderer_MakeBorderTex(&edges_tex, Env_EdgeBlock);
|
||||
EnvRenderer_UpdateMapEdges();
|
||||
} else if (envVar == ENV_VAR_SIDES_BLOCK) {
|
||||
EnvRenderer_MakeBorderTex(&sides_tex, Env_SidesBlock);
|
||||
EnvRenderer_UpdateMapSides();
|
||||
} else if (envVar == ENV_VAR_EDGE_HEIGHT || envVar == ENV_VAR_SIDES_OFFSET) {
|
||||
EnvRenderer_UpdateMapEdges();
|
||||
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_CalcPosition(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);
|
||||
|
||||
|
||||
|
@ -1604,12 +1604,12 @@ static void KeyBindingsScreen_GetText(struct KeyBindingsScreen* s, int i, String
|
||||
}
|
||||
|
||||
static void KeyBindingsScreen_OnBindingClick(void* screen, void* widget) {
|
||||
String text; char textBuffer[STRING_SIZE];
|
||||
struct KeyBindingsScreen* s = screen;
|
||||
struct ButtonWidget* btn = widget;
|
||||
struct ButtonWidget* cur;
|
||||
char textBuffer[STRING_SIZE];
|
||||
String text = String_FromArray(textBuffer);
|
||||
|
||||
String_InitArray(text, textBuffer);
|
||||
/* previously selected a different button for binding */
|
||||
if (s->CurI >= 0) {
|
||||
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) {
|
||||
StringsBuffer* entries;
|
||||
int idx;
|
||||
String path;
|
||||
|
||||
FT_Stream stream;
|
||||
FT_Open_Args args;
|
||||
FT_Face face;
|
||||
@ -889,8 +893,8 @@ void Font_Make(FontDesc* desc, const String* fontName, int size, int style) {
|
||||
desc->Style = style;
|
||||
if (!norm_fonts.Count) Font_Init();
|
||||
|
||||
int idx = -1;
|
||||
StringsBuffer* entries = &bold_fonts;
|
||||
idx = -1;
|
||||
entries = &bold_fonts;
|
||||
if (style & FONT_STYLE_BOLD) { idx = Font_Find(fontName, entries); }
|
||||
|
||||
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");
|
||||
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!!! */
|
||||
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) {
|
||||
String text; char textBuffer[STRING_SIZE * 4];
|
||||
struct ChatScreen* s = screen;
|
||||
struct Screen* overlay;
|
||||
int height, chatY;
|
||||
if (!s->HandlesAllInput || Game_HideGui) return false;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
int height = TextGroupWidget_UsedHeight(&s->Chat);
|
||||
int chatY = s->Chat.Y + s->Chat.Height - height;
|
||||
height = TextGroupWidget_UsedHeight(&s->Chat);
|
||||
chatY = s->Chat.Y + s->Chat.Height - height;
|
||||
if (!Gui_Contains(s->Chat.X, chatY, s->Chat.Width, height, x, y)) return false;
|
||||
|
||||
char textBuffer[STRING_SIZE * 4];
|
||||
String text = String_FromArray(textBuffer);
|
||||
String_InitArray(text, textBuffer);
|
||||
TextGroupWidget_GetSelected(&s->Chat, &text, x, y);
|
||||
if (!text.length) return false;
|
||||
|
||||
if (Utils_IsUrlPrefix(&text, 0)) {
|
||||
struct Screen* overlay = UrlWarningOverlay_MakeInstance(&text);
|
||||
overlay = UrlWarningOverlay_MakeInstance(&text);
|
||||
Gui_ShowOverlay(overlay, false);
|
||||
} else if (Game_ClickableChat) {
|
||||
InputWidget_AppendString(&s->Input.Base, &text);
|
||||
|
Loading…
x
Reference in New Issue
Block a user