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

View File

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

View File

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

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

View File

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

View File

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

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