diff --git a/engine/include/GearSrc/Log.h b/engine/include/GearSrc/Log.h index ab2e505..6ed098b 100644 --- a/engine/include/GearSrc/Log.h +++ b/engine/include/GearSrc/Log.h @@ -15,7 +15,7 @@ enum GSLogLevel { GSLogDebug }; -GSDECL void GSLog(int level, const char* fmt, ...); +GSDECL void GSLog(GSEngine engine, int level, const char* fmt, ...); #ifdef __cplusplus } diff --git a/engine/include/GearSrc/Math.h b/engine/include/GearSrc/Math.h index 65c7b9a..3c7d834 100644 --- a/engine/include/GearSrc/Math.h +++ b/engine/include/GearSrc/Math.h @@ -11,6 +11,7 @@ extern "C" { #define GSMathPi 3.14159265358979323846 GSDECL void GSMathCross3(GSVector3 r, GSVector3 v0, GSVector3 v1); +GSDECL GSNumber GSMathInner3(GSVector3 v0, GSVector3 v1); GSDECL void GSMathNormalize3(GSVector3 vec); GSDECL void GSMathSubtract3(GSVector3 r, GSVector3 v0, GSVector3 v1); GSDECL void GSMathAdd3(GSVector3 r, GSVector3 v0, GSVector3 v1); diff --git a/engine/include/GearSrc/TypeDefs.h b/engine/include/GearSrc/TypeDefs.h index 072e3e8..f7ea5f1 100644 --- a/engine/include/GearSrc/TypeDefs.h +++ b/engine/include/GearSrc/TypeDefs.h @@ -202,6 +202,8 @@ struct _GSFile { }; struct _GSResource { + GSEngine engine; + GSFile file; }; #endif diff --git a/engine/src/client.c b/engine/src/client.c index 7955b00..a1fd595 100644 --- a/engine/src/client.c +++ b/engine/src/client.c @@ -68,7 +68,7 @@ GSClient GSClientCreate(GSEngine engine) { } } - GSLog(GSLogInfo, "Created client"); + GSLog(engine, GSLogInfo, "Created client"); return client; } @@ -79,9 +79,9 @@ void GSClientDestroy(GSClient client) { GSGLDestroy(client->gl); - free(client); + GSLog(client->engine, GSLogInfo, "Destroyed client"); - GSLog(GSLogInfo, "Destroyed client"); + free(client); } static void scene(GSClient client) { diff --git a/engine/src/core.c b/engine/src/core.c index 6138657..7cc1718 100644 --- a/engine/src/core.c +++ b/engine/src/core.c @@ -14,7 +14,7 @@ void GSInit(void) { GSVersionGet(&version); - GSLog(GSLogInfo, "GearSrc Engine %s", version.string); + GSLog(NULL, GSLogInfo, "GearSrc Engine %s", version.string); } GSBool GSEngineRegisterResource(GSEngine engine, const char* name, const char* path) { @@ -22,7 +22,7 @@ GSBool GSEngineRegisterResource(GSEngine engine, const char* name, const char* p if((resource = GSResourceOpen(engine, path)) != NULL) { shput(engine->resource, name, resource); - GSLog(GSLogInfo, "Registered resource %s as %s", path, name); + GSLog(engine, GSLogInfo, "Registered resource %s as %s", path, name); return GSTrue; } @@ -36,7 +36,7 @@ void GSEngineUnregisterResource(GSEngine engine, const char* name) { if(ind != -1) { GSResourceClose(engine->resource[ind].value); - GSLog(GSLogInfo, "Unregistered resource %s", name); + GSLog(engine, GSLogInfo, "Unregistered resource %s", name); shdel(engine->resource, name); } @@ -65,7 +65,7 @@ GSEngine GSEngineCreate(GSEngineParam* param) { GSEngineRegisterResource(engine, "game", "game.gsp"); if(engine != NULL && param->client && (engine->client = GSClientCreate(engine)) == NULL) { - GSLog(GSLogError, "Failed to create client"); + GSLog(engine, GSLogError, "Failed to create client"); GSEngineDestroy(engine); @@ -73,7 +73,7 @@ GSEngine GSEngineCreate(GSEngineParam* param) { } if(engine != NULL && param->server && (engine->server = GSServerCreate(engine)) == NULL) { - GSLog(GSLogError, "Failed to create server"); + GSLog(engine, GSLogError, "Failed to create server"); GSEngineDestroy(engine); @@ -81,7 +81,7 @@ GSEngine GSEngineCreate(GSEngineParam* param) { } if(engine == NULL) { - GSLog(GSLogError, "Failed to create engine"); + GSLog(engine, GSLogError, "Failed to create engine"); } return engine; @@ -121,8 +121,8 @@ void GSEngineLoop(GSEngine engine) { long wait = 1000 / tps; if(engine->param->sleep == NULL || engine->param->get_tick == NULL) { - GSLog(GSLogWarn, "sleep and/or get_tick parameter are missing!"); - GSLog(GSLogWarn, "This will result game to be crazy fast!!!"); + GSLog(engine, GSLogWarn, "sleep and/or get_tick parameter are missing!"); + GSLog(engine, GSLogWarn, "This will result game to be crazy fast!!!"); } else { t = engine->param->get_tick(); diff --git a/engine/src/file.c b/engine/src/file.c index 2282f7d..a3c33ed 100644 --- a/engine/src/file.c +++ b/engine/src/file.c @@ -20,7 +20,7 @@ GSFile GSFileOpen(GSEngine engine, const char* path) { file->size = ftell(file->fp); fseek(file->fp, 0, SEEK_SET); - GSLog(GSLogInfo, "Opened %s", path); + GSLog(engine, GSLogInfo, "Opened %s", path); return file; } @@ -37,7 +37,7 @@ GSFile GSFileOpen(GSEngine engine, const char* path) { if((file->data = GSResourceGet(engine->resource[i].value, nam, &file->size)) != NULL) { free(s); - GSLog(GSLogInfo, "Opened %s", path); + GSLog(engine, GSLogInfo, "Opened %s", path); return file; } break; @@ -46,7 +46,7 @@ GSFile GSFileOpen(GSEngine engine, const char* path) { } free(s); - GSLog(GSLogError, "Could not open %s", path); + GSLog(engine, GSLogError, "Could not open %s", path); GSFileClose(file); return NULL; } diff --git a/engine/src/gl_shader.c b/engine/src/gl_shader.c index b7a0783..594c3b0 100644 --- a/engine/src/gl_shader.c +++ b/engine/src/gl_shader.c @@ -3,7 +3,7 @@ #include #include -static void err(const char* path, GLuint shader) { +static void err(GSEngine engine, const char* path, GLuint shader) { GLint len, ret; char* e; @@ -14,7 +14,7 @@ static void err(const char* path, GLuint shader) { glGetShaderInfoLog(shader, len, &ret, e); - GSLog(GSLogError, "%s: %s\n", path, e); + GSLog(engine, GSLogError, "%s: %s\n", path, e); free(e); } @@ -66,7 +66,7 @@ GSBool GSGLShaderPrepare(GSGL gl, GLuint* shader, const char* vs, const char* fs glCompileShader(vsi); glGetShaderiv(vsi, GL_COMPILE_STATUS, &st); if(!st) { - err(vs, vsi); + err(gl->engine, vs, vsi); glDeleteShader(vsi); glDeleteShader(fsi); @@ -78,7 +78,7 @@ GSBool GSGLShaderPrepare(GSGL gl, GLuint* shader, const char* vs, const char* fs glCompileShader(fsi); glGetShaderiv(fsi, GL_COMPILE_STATUS, &st); if(!st) { - err(fs, fsi); + err(gl->engine, fs, fsi); glDeleteShader(vsi); glDeleteShader(fsi); diff --git a/engine/src/log.c b/engine/src/log.c index 8e9fab4..a90d7fd 100644 --- a/engine/src/log.c +++ b/engine/src/log.c @@ -1,6 +1,6 @@ #include -void GSLog(int level, const char* fmt, ...) { +void GSLog(GSEngine engine, int level, const char* fmt, ...) { va_list va; FILE* out = stdout; diff --git a/engine/src/math.c b/engine/src/math.c index dcc606e..a26b894 100644 --- a/engine/src/math.c +++ b/engine/src/math.c @@ -6,6 +6,15 @@ void GSMathCross3(GSVector3 r, GSVector3 v0, GSVector3 v1) { r[2] = v0[0] * v1[1] - v0[1] * v1[0]; } +GSNumber GSMathInner3(GSVector3 v0, GSVector3 v1) { + GSNumber r = 0; + int i; + + for(i = 0; i < 3; i++) r += v0[i] * v1[i]; + + return r; +} + void GSMathNormalize3(GSVector3 vec) { GSNumber l = 0; int i; diff --git a/engine/src/model.c b/engine/src/model.c index 2037981..624b1a2 100644 --- a/engine/src/model.c +++ b/engine/src/model.c @@ -270,7 +270,7 @@ GSModel GSModelOpen(GSEngine engine, const char* path) { GSEngineUnregisterResource(engine, "model-ws"); - GSLog(GSLogInfo, "Opened model %s, %d vertexes, %d faces", path, arrlen(model->vertex), arrlen(model->face)); + GSLog(engine, GSLogInfo, "Opened model %s, %d vertexes, %d faces", path, arrlen(model->vertex), arrlen(model->face)); /* TODO: check for animation */ if(gl != NULL) { diff --git a/engine/src/resource.c b/engine/src/resource.c index dbaa1d3..ec6d4a6 100644 --- a/engine/src/resource.c +++ b/engine/src/resource.c @@ -39,6 +39,8 @@ GSResource GSResourceOpen(GSEngine engine, const char* path) { memset(resource, 0, sizeof(*resource)); + resource->engine = engine; + if((resource->file = GSFileOpen(engine, path)) == NULL) { GSResourceClose(resource); return NULL; @@ -50,7 +52,7 @@ GSResource GSResourceOpen(GSEngine engine, const char* path) { } if(memcmp(sig, res_sig, 4) != 0) { - GSLog(GSLogError, "%s: Resource has wrong signature", path); + GSLog(engine, GSLogError, "%s: Resource has wrong signature", path); GSResourceClose(resource); return NULL; } @@ -58,7 +60,7 @@ GSResource GSResourceOpen(GSEngine engine, const char* path) { return resource; } -int find_entry(GSFile f, const char* name, int max, GSU32* totsz, GSU32* actsz, GSU32* cmpsz, GSU32* seekpos) { +int find_entry(GSEngine engine, GSFile f, const char* name, int max, GSU32* totsz, GSU32* actsz, GSU32* cmpsz, GSU32* seekpos) { GSU32 crc = GSEndianSwapU32BE(GSCRC32((void*)name, strlen(name))); int i; @@ -101,7 +103,7 @@ int find_entry(GSFile f, const char* name, int max, GSU32* totsz, GSU32* actsz, if(totsz != NULL) *totsz = tsz; if(crc == t && strcmp(fn, name) == 0) { - GSLog(GSLogDebug, "Directory %s/ found", fn); + GSLog(engine, GSLogDebug, "Directory %s/ found", fn); free(fn); return n; } @@ -128,7 +130,7 @@ int find_entry(GSFile f, const char* name, int max, GSU32* totsz, GSU32* actsz, *seekpos = GSEndianSwapU32BE(*seekpos); if(crc == t && strcmp(fn, name) == 0) { - GSLog(GSLogDebug, "File %s found", fn); + GSLog(engine, GSLogDebug, "File %s found", fn); free(fn); return -2; } @@ -158,7 +160,7 @@ void* GSResourceGet(GSResource resource, const char* name, unsigned int* size) { if(s != NULL) s[0] = 0; - m = find_entry(resource->file, f, m, strlen(f) == 0 ? &totsz : NULL, &actsz, &cmpsz, &seekpos); + m = find_entry(resource->engine, resource->file, f, m, strlen(f) == 0 ? &totsz : NULL, &actsz, &cmpsz, &seekpos); if(m == -1) break; if(m == -2) { unsigned char* cmp = malloc(cmpsz); diff --git a/engine/src/server.c b/engine/src/server.c index e69ead1..96d1a2d 100644 --- a/engine/src/server.c +++ b/engine/src/server.c @@ -9,15 +9,15 @@ GSServer GSServerCreate(GSEngine engine) { server->engine = engine; - GSLog(GSLogInfo, "Created server"); + GSLog(engine, GSLogInfo, "Created server"); return server; } void GSServerDestroy(GSServer server) { - free(server); + GSLog(server->engine, GSLogInfo, "Destroyed server"); - GSLog(GSLogInfo, "Destroyed server"); + free(server); } void GSServerStep(GSServer server) {