Fix edge/sides of air not working. (thanks tornato)

This commit is contained in:
UnknownShadow200 2018-11-15 11:45:42 +11:00
parent 0c2af35687
commit 15f9ee0365
7 changed files with 54 additions and 33 deletions

View File

@ -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;

View File

@ -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 */

View File

@ -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();

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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);