Try to fix rare download issues

This commit is contained in:
UnknownShadow200 2024-05-05 18:25:46 +10:00
parent ffa128c854
commit b55dadf50e
4 changed files with 43 additions and 34 deletions

View file

@ -132,7 +132,8 @@ enum CC_ERRORS {
HTTP_ERR_RELATIVE = 0xCCDED069UL, /* Unsupported relative URL format */ HTTP_ERR_RELATIVE = 0xCCDED069UL, /* Unsupported relative URL format */
HTTP_ERR_INVALID_BODY= 0xCCDED06AUL, /* HTTP message doesn't have Content-Length or use Chunked transfer encoding */ HTTP_ERR_INVALID_BODY= 0xCCDED06AUL, /* HTTP message doesn't have Content-Length or use Chunked transfer encoding */
HTTP_ERR_CHUNK_SIZE = 0xCCDED06BUL, /* HTTP message chunk has negative size/length */ HTTP_ERR_CHUNK_SIZE = 0xCCDED06BUL, /* HTTP message chunk has negative size/length */
HTTP_ERR_TRUNCATED = 0xCCDED06CUL, /* HTTP respone header was truncated due to being too long */ HTTP_ERR_TRUNCATED = 0xCCDED06CUL, /* HTTP response header was truncated due to being too long */
HTTP_ERR_NO_RESPONSE = 0xCCDED06DUL, /* First attempt to read response returned 0 bytes */
SSL_ERR_CONTEXT_DEAD = 0xCCDED070UL, /* Server shutdown the SSL context and it must be recreated */ SSL_ERR_CONTEXT_DEAD = 0xCCDED070UL, /* Server shutdown the SSL context and it must be recreated */
PNG_ERR_16BITSAMPLES = 0xCCDED071UL, /* Image uses 16 bit samples, which is unimplemented */ PNG_ERR_16BITSAMPLES = 0xCCDED071UL, /* Image uses 16 bit samples, which is unimplemented */

View file

@ -806,7 +806,7 @@ void Gfx_CalcOrthoMatrix(struct Matrix* matrix, float width, float height, float
matrix->row1.y = -2.0f / width; matrix->row1.y = -2.0f / width;
matrix->row4.y = 1.0f; matrix->row4.y = 1.0f;
matrix->row3.z = 1.0f / (zNear - zFar); matrix->row3.z = 1.0f / (zNear - zFar);
matrix->row4.z = 0.5f * (zNear + zFar) / (zNear - zFar) - 0.5f; matrix->row4.z = 0.5f * (zNear + zFar) / (zNear - zFar) - 0.5f;
matrix->row4.w = 1.0f; matrix->row4.w = 1.0f;
} }

View file

@ -558,6 +558,7 @@ static cc_result ConnectionPool_Open(struct HttpConnection** conn, const struct
*--------------------------------------------------------HttpClient-------------------------------------------------------* *--------------------------------------------------------HttpClient-------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
enum HTTP_RESPONSE_STATE { enum HTTP_RESPONSE_STATE {
HTTP_RESPONSE_STATE_INITIAL,
HTTP_RESPONSE_STATE_HEADER, HTTP_RESPONSE_STATE_HEADER,
HTTP_RESPONSE_STATE_DATA, HTTP_RESPONSE_STATE_DATA,
HTTP_RESPONSE_STATE_CHUNK_HEADER, HTTP_RESPONSE_STATE_CHUNK_HEADER,
@ -583,7 +584,7 @@ struct HttpClientState {
}; };
static void HttpClientState_Reset(struct HttpClientState* state) { static void HttpClientState_Reset(struct HttpClientState* state) {
state->state = HTTP_RESPONSE_STATE_HEADER; state->state = HTTP_RESPONSE_STATE_INITIAL;
state->chunked = 0; state->chunked = 0;
state->dataLeft = 0; state->dataLeft = 0;
state->autoClose = false; state->autoClose = false;
@ -705,6 +706,9 @@ static cc_result HttpClient_Process(struct HttpClientState* state, char* buffer,
while (offset < total) { while (offset < total) {
switch (state->state) { switch (state->state) {
case HTTP_RESPONSE_STATE_INITIAL:
state->state = HTTP_RESPONSE_STATE_HEADER;
break;
case HTTP_RESPONSE_STATE_HEADER: case HTTP_RESPONSE_STATE_HEADER:
{ {
@ -836,8 +840,8 @@ static cc_result HttpClient_ParseResponse(struct HttpClientState* state) {
if (res) return res; if (res) return res;
if (total == 0) { if (total == 0) {
Platform_LogConst("Http read unexpectedly returned 0"); Platform_Log1("Http read unexpectedly returned 0 in state %i", &state->state);
return ERR_END_OF_STREAM; return state->state == HTTP_RESPONSE_STATE_INITIAL ? HTTP_ERR_NO_RESPONSE : ERR_END_OF_STREAM;
} }
if (dst != buffer) { if (dst != buffer) {
@ -915,6 +919,11 @@ static cc_result HttpBackend_Do(struct HttpRequest* req, cc_string* urlStr) {
res = HttpBackend_PerformRequest(&state); res = HttpBackend_PerformRequest(&state);
retried = true; retried = true;
} }
if (res == HTTP_ERR_NO_RESPONSE && !retried) {
Platform_LogConst("Resetting connection due to empty response..");
res = HttpBackend_PerformRequest(&state);
retried = true;
}
if (res || !HttpClient_IsRedirect(req)) break; if (res || !HttpClient_IsRedirect(req)) break;
if (redirects >= 20) return HTTP_ERR_REDIRECTS; if (redirects >= 20) return HTTP_ERR_REDIRECTS;

View file

@ -210,36 +210,35 @@ cc_bool FrustumCulling_SphereInFrustum(float x, float y, float z, float radius)
} }
void FrustumCulling_CalcFrustumEquations(struct Matrix* projection, struct Matrix* modelView) { void FrustumCulling_CalcFrustumEquations(struct Matrix* projection, struct Matrix* modelView) {
struct Matrix clipMatrix; struct Matrix clip;
float* clip = (float*)&clipMatrix; Matrix_Mul(&clip, modelView, projection);
Matrix_Mul(&clipMatrix, modelView, projection);
/* Extract the numbers for the RIGHT plane */ /* Extract the RIGHT plane */
frustum00 = clip[3] - clip[0]; frustum00 = clip.row1.w - clip.row1.x;
frustum01 = clip[7] - clip[4]; frustum01 = clip.row2.w - clip.row2.x;
frustum02 = clip[11] - clip[8]; frustum02 = clip.row3.w - clip.row3.x;
frustum03 = clip[15] - clip[12]; frustum03 = clip.row4.w - clip.row4.x;
FrustumCulling_Normalise(&frustum00, &frustum01, &frustum02, &frustum03); FrustumCulling_Normalise(&frustum00, &frustum01, &frustum02, &frustum03);
/* Extract the numbers for the LEFT plane */ /* Extract the LEFT plane */
frustum10 = clip[3] + clip[0]; frustum10 = clip.row1.w + clip.row1.x;
frustum11 = clip[7] + clip[4]; frustum11 = clip.row2.w + clip.row2.x;
frustum12 = clip[11] + clip[8]; frustum12 = clip.row3.w + clip.row3.x;
frustum13 = clip[15] + clip[12]; frustum13 = clip.row4.w + clip.row4.x;
FrustumCulling_Normalise(&frustum10, &frustum11, &frustum12, &frustum13); FrustumCulling_Normalise(&frustum10, &frustum11, &frustum12, &frustum13);
/* Extract the BOTTOM plane */ /* Extract the BOTTOM plane */
frustum20 = clip[3] + clip[1]; frustum20 = clip.row1.w + clip.row1.y;
frustum21 = clip[7] + clip[5]; frustum21 = clip.row2.w + clip.row2.y;
frustum22 = clip[11] + clip[9]; frustum22 = clip.row3.w + clip.row3.y;
frustum23 = clip[15] + clip[13]; frustum23 = clip.row4.w + clip.row4.y;
FrustumCulling_Normalise(&frustum20, &frustum21, &frustum22, &frustum23); FrustumCulling_Normalise(&frustum20, &frustum21, &frustum22, &frustum23);
/* Extract the TOP plane */ /* Extract the TOP plane */
frustum30 = clip[3] - clip[1]; frustum30 = clip.row1.w - clip.row1.y;
frustum31 = clip[7] - clip[5]; frustum31 = clip.row2.w - clip.row2.y;
frustum32 = clip[11] - clip[9]; frustum32 = clip.row3.w - clip.row3.y;
frustum33 = clip[15] - clip[13]; frustum33 = clip.row4.w - clip.row4.y;
FrustumCulling_Normalise(&frustum30, &frustum31, &frustum32, &frustum33); FrustumCulling_Normalise(&frustum30, &frustum31, &frustum32, &frustum33);
/* Extract the FAR plane (Different for each graphics backend) */ /* Extract the FAR plane (Different for each graphics backend) */
@ -247,15 +246,15 @@ void FrustumCulling_CalcFrustumEquations(struct Matrix* projection, struct Matri
/* OpenGL and Direct3D require slightly different behaviour for NEAR clipping planes */ /* OpenGL and Direct3D require slightly different behaviour for NEAR clipping planes */
/* https://www.gamedevs.org/uploads/fast-extraction-viewing-frustum-planes-from-world-view-projection-matrix.pdf */ /* https://www.gamedevs.org/uploads/fast-extraction-viewing-frustum-planes-from-world-view-projection-matrix.pdf */
/* (and because reverse Z is used, 'NEAR' plane is actually the 'FAR' clipping plane) */ /* (and because reverse Z is used, 'NEAR' plane is actually the 'FAR' clipping plane) */
frustum40 = clip[2]; frustum40 = clip.row1.z;
frustum41 = clip[6]; frustum41 = clip.row2.z;
frustum42 = clip[10]; frustum42 = clip.row3.z;
frustum43 = clip[14]; frustum43 = clip.row4.z;
#else #else
frustum40 = clip[3] - clip[2]; frustum40 = clip.row1.w - clip.row1.z;
frustum41 = clip[7] - clip[6]; frustum41 = clip.row2.w - clip.row2.z;
frustum42 = clip[11] - clip[10]; frustum42 = clip.row3.w - clip.row3.z;
frustum43 = clip[15] - clip[14]; frustum43 = clip.row4.w - clip.row4.z;
#endif #endif
FrustumCulling_Normalise(&frustum40, &frustum41, &frustum42, &frustum43); FrustumCulling_Normalise(&frustum40, &frustum41, &frustum42, &frustum43);
} }