From ea48c140c1d42a9ddfc94cd1d0e97b5c9b890408 Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 26 Aug 2017 20:08:23 +0200 Subject: [PATCH] improved engine init and plugin registration --- src/anim.cpp | 2 ++ src/d3d/d3d8.cpp | 6 ++--- src/d3d/d3d9.cpp | 6 ++--- src/d3d/rwd3d8.h | 2 +- src/d3d/rwd3d9.h | 2 +- src/d3d/rwxbox.h | 2 +- src/d3d/xbox.cpp | 6 ++--- src/engine.cpp | 47 +++++++++++++++++++++-------------- src/frame.cpp | 11 ++++++--- src/geoplg.cpp | 4 +-- src/gl/gl3.cpp | 16 +++--------- src/gl/gl3device.cpp | 53 +++++++++++++++++++++++++++------------- src/gl/gl3plugins.cpp | 36 ++++++++++++++------------- src/gl/gl3render.cpp | 6 ++--- src/gl/gl3shader.cpp | 14 ++++++++--- src/gl/rwgl3.h | 6 ++++- src/gl/rwgl3shader.h | 12 ++++----- src/gl/rwwdgl.h | 2 +- src/gl/wdgl.cpp | 6 ++--- src/hanim.cpp | 27 ++++++++++++-------- src/matfx.cpp | 17 +++++++++++-- src/ps2/pds.cpp | 14 ++++++++++- src/ps2/ps2.cpp | 6 ++--- src/ps2/rwps2.h | 2 +- src/rwbase.h | 6 +++++ src/rwengine.h | 10 +++++++- src/rwobjects.h | 6 +++-- src/skin.cpp | 17 +++++++++++-- src/uvanim.cpp | 9 ++++++- tools/clumpview/main.cpp | 17 +++++++++++++ 30 files changed, 246 insertions(+), 124 deletions(-) diff --git a/src/anim.cpp b/src/anim.cpp index b6fcb3c..ee6e923 100644 --- a/src/anim.cpp +++ b/src/anim.cpp @@ -24,6 +24,8 @@ namespace rw { static AnimInterpolatorInfo *interpInfoList[MAXINTERPINFO]; +// TODO MEMORY: also clean it up again + void AnimInterpolatorInfo::registerInterp(AnimInterpolatorInfo *interpInfo) { diff --git a/src/d3d/d3d8.cpp b/src/d3d/d3d8.cpp index 265dad3..7b41500 100644 --- a/src/d3d/d3d8.cpp +++ b/src/d3d/d3d8.cpp @@ -20,7 +20,7 @@ namespace rw { namespace d3d8 { using namespace d3d; -void* +static void* driverOpen(void *o, int32, int32) { engine->driver[PLATFORM_D3D8]->defaultPipeline = makeDefaultPipeline(); @@ -35,14 +35,14 @@ driverOpen(void *o, int32, int32) return o; } -void* +static void* driverClose(void *o, int32, int32) { return o; } void -initializePlatform(void) +registerPlatformPlugins(void) { Driver::registerPlugin(PLATFORM_D3D8, 0, PLATFORM_D3D8, driverOpen, driverClose); diff --git a/src/d3d/d3d9.cpp b/src/d3d/d3d9.cpp index 9e15456..73162c1 100644 --- a/src/d3d/d3d9.cpp +++ b/src/d3d/d3d9.cpp @@ -28,7 +28,7 @@ static VertexElement _d3ddec_end = {0xFF,0,D3DDECLTYPE_UNUSED,0,0,0}; #define NUMDECLELT 12 -void* +static void* driverOpen(void *o, int32, int32) { engine->driver[PLATFORM_D3D9]->defaultPipeline = makeDefaultPipeline(); @@ -43,14 +43,14 @@ driverOpen(void *o, int32, int32) return o; } -void* +static void* driverClose(void *o, int32, int32) { return o; } void -initializePlatform(void) +registerPlatformPlugins(void) { Driver::registerPlugin(PLATFORM_D3D9, 0, PLATFORM_D3D9, driverOpen, driverClose); diff --git a/src/d3d/rwd3d8.h b/src/d3d/rwd3d8.h index 6a7de5f..4f06cd0 100644 --- a/src/d3d/rwd3d8.h +++ b/src/d3d/rwd3d8.h @@ -1,7 +1,7 @@ namespace rw { namespace d3d8 { -void initializePlatform(void); +void registerPlatformPlugins(void); struct InstanceData { diff --git a/src/d3d/rwd3d9.h b/src/d3d/rwd3d9.h index 91ebd82..8176d64 100644 --- a/src/d3d/rwd3d9.h +++ b/src/d3d/rwd3d9.h @@ -1,7 +1,7 @@ namespace rw { namespace d3d9 { -void initializePlatform(void); +void registerPlatformPlugins(void); struct VertexElement { diff --git a/src/d3d/rwxbox.h b/src/d3d/rwxbox.h index 6f59c31..ac24af7 100644 --- a/src/d3d/rwxbox.h +++ b/src/d3d/rwxbox.h @@ -1,7 +1,7 @@ namespace rw { namespace xbox { -void initializePlatform(void); +void registerPlatformPlugins(void); struct InstanceData { diff --git a/src/d3d/xbox.cpp b/src/d3d/xbox.cpp index 6bfc33b..7bf698d 100644 --- a/src/d3d/xbox.cpp +++ b/src/d3d/xbox.cpp @@ -18,7 +18,7 @@ namespace rw { namespace xbox { -void* +static void* driverOpen(void *o, int32, int32) { engine->driver[PLATFORM_XBOX]->defaultPipeline = makeDefaultPipeline(); @@ -33,14 +33,14 @@ driverOpen(void *o, int32, int32) return o; } -void* +static void* driverClose(void *o, int32, int32) { return o; } void -initializePlatform(void) +registerPlatformPlugins(void) { Driver::registerPlugin(PLATFORM_XBOX, 0, PLATFORM_XBOX, driverOpen, driverClose); diff --git a/src/engine.cpp b/src/engine.cpp index 50ef83e..b5c5366 100755 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -29,9 +29,10 @@ namespace rw { Engine *engine; -PluginList Driver::s_plglist[NUM_PLATFORMS]; +PluginList Engine::s_plglist; Engine::State Engine::state = Dead; MemoryFunctions Engine::memfuncs; +PluginList Driver::s_plglist[NUM_PLATFORMS]; void *malloc_h(size_t sz, uint32 hint) { if(sz == 0) return nil; return malloc(sz); } void *realloc_h(void *p, size_t sz, uint32 hint) { return realloc(p, sz); } @@ -58,9 +59,6 @@ void *mustrealloc_h(void *p, size_t sz, uint32 hint) } // This function mainly registers engine plugins -// RW initializes memory related things here too and -// uses more plugins -// TODO: do this^ ? bool32 Engine::init(void) { @@ -69,6 +67,7 @@ Engine::init(void) return 0; } + // TODO: make this an argument memfuncs.rwmalloc = malloc_h; memfuncs.rwrealloc = realloc_h; memfuncs.rwfree = free; @@ -78,22 +77,28 @@ Engine::init(void) PluginList init = { sizeof(Driver), sizeof(Driver), nil, nil }; for(uint i = 0; i < NUM_PLATFORMS; i++) Driver::s_plglist[i] = init; + Engine::s_plglist.size = sizeof(Engine); + Engine::s_plglist.defaultSize = sizeof(Engine); + Engine::s_plglist.first = nil; + Engine::s_plglist.last = nil; - // Register plugins - // TODO: these are wrong - ps2::initializePlatform(); - xbox::initializePlatform(); - d3d8::initializePlatform(); - d3d9::initializePlatform(); - wdgl::initializePlatform(); - gl3::initializePlatform(); + // core plugin attach here + Engine::registerPlugin(0, ID_FRAMEMODULE, Frame::_open, Frame::_close); + + // driver plugin attach + ps2::registerPlatformPlugins(); + xbox::registerPlatformPlugins(); + d3d8::registerPlatformPlugins(); + d3d9::registerPlatformPlugins(); + wdgl::registerPlatformPlugins(); + gl3::registerPlatformPlugins(); Engine::state = Initialized; return 1; } // This is where RW allocates the engine and e.g. opens d3d -// TODO: this will take an argument with device specific data (HWND &c.) +// TODO: this will probably take an argument with device specific data bool32 Engine::open(void) { @@ -103,7 +108,7 @@ Engine::open(void) } // Allocate engine - engine = rwNewT(Engine, 1, MEMDUR_GLOBAL); + engine = (Engine*)rwNew(Engine::s_plglist.size, MEMDUR_GLOBAL); engine->currentCamera = nil; engine->currentWorld = nil; engine->currentTexDictionary = nil; @@ -155,16 +160,14 @@ Engine::start(EngineStartParams *p) return 0; } - // Start device engine->device.system(DEVICESTART, (void*)p); engine->device.system(DEVICEINIT, nil); - // TODO: construct engine plugins - Frame::dirtyList.init(); + Engine::s_plglist.construct(engine); for(uint i = 0; i < NUM_PLATFORMS; i++) Driver::s_plglist[i].construct(rw::engine->driver[i]); - // TODO: finalize device start + engine->device.system(DEVICEFINALIZE, nil); Engine::state = Started; return 1; @@ -174,19 +177,27 @@ void Engine::term(void) { // TODO + for(uint i = 0; i < NUM_PLATFORMS; i++) + Driver::s_plglist[i].destruct(rw::engine->driver[i]); + Engine::s_plglist.destruct(engine); + Engine::state = Opened; } void Engine::close(void) { // TODO + for(uint i = 0; i < NUM_PLATFORMS; i++) + rwFree(rw::engine->driver[i]); rwFree(engine); + Engine::state = Initialized; } void Engine::stop(void) { engine->device.system(DEVICESTOP, nil); + Engine::state = Dead; } namespace null { diff --git a/src/frame.cpp b/src/frame.cpp index 357dc82..7e92c4e 100644 --- a/src/frame.cpp +++ b/src/frame.cpp @@ -12,8 +12,11 @@ namespace rw { -LinkList Frame::dirtyList; PluginList Frame::s_plglist = { sizeof(Frame), sizeof(Frame), nil, nil }; +void *Frame::_open(void *object, int32 offset, int32 size) { engine->frameDirtyList.init(); return object; } +void *Frame::_close(void *object, int32 offset, int32 size) { return object; } + + Frame* Frame::create(void) @@ -227,7 +230,7 @@ void Frame::syncDirty(void) { Frame *frame; - FORLIST(lnk, Frame::dirtyList){ + FORLIST(lnk, engine->frameDirtyList){ frame = LLLinkGetData(lnk, Frame, inDirtyList); if(frame->object.privateFlags & Frame::HIERARCHYSYNCLTM){ // Sync root's LTM @@ -247,7 +250,7 @@ Frame::syncDirty(void) // all clean now frame->object.privateFlags &= ~(Frame::SYNCLTM | Frame::SYNCOBJ); } - Frame::dirtyList.init(); + engine->frameDirtyList.init(); } void @@ -283,7 +286,7 @@ Frame::updateObjects(void) { // Mark root as dirty and insert into dirty list if necessary if((this->root->object.privateFlags & HIERARCHYSYNC) == 0) - Frame::dirtyList.add(&this->root->inDirtyList); + engine->frameDirtyList.add(&this->root->inDirtyList); this->root->object.privateFlags |= HIERARCHYSYNC; // Mark subtree as dirty as well this->object.privateFlags |= SUBTREESYNC; diff --git a/src/geoplg.cpp b/src/geoplg.cpp index 749c330..2083b23 100644 --- a/src/geoplg.cpp +++ b/src/geoplg.cpp @@ -210,8 +210,8 @@ getSizeMesh(void *object, int32, int32) void registerMeshPlugin(void) { - Geometry::registerPlugin(0, 0x50E, nil, nil, nil); - Geometry::registerPluginStream(0x50E, readMesh, writeMesh, getSizeMesh); + Geometry::registerPlugin(0, ID_MESH, nil, nil, nil); + Geometry::registerPluginStream(ID_MESH, readMesh, writeMesh, getSizeMesh); } // Returns the maximum number of triangles. Just so diff --git a/src/gl/gl3.cpp b/src/gl/gl3.cpp index d4d8f1f..076064c 100644 --- a/src/gl/gl3.cpp +++ b/src/gl/gl3.cpp @@ -22,7 +22,7 @@ namespace gl3 { // TODO: make some of these things platform-independent -void* +static void* driverOpen(void *o, int32, int32) { #ifdef RW_OPENGL @@ -38,28 +38,18 @@ driverOpen(void *o, int32, int32) return o; } -void* +static void* driverClose(void *o, int32, int32) { return o; } void -initializePlatform(void) +registerPlatformPlugins(void) { Driver::registerPlugin(PLATFORM_GL3, 0, PLATFORM_GL3, driverOpen, driverClose); - registerNativeRaster(); - -#ifdef RW_OPENGL - // uniforms need to be registered before any shaders are created - registerBlock("Scene"); - registerBlock("Object"); - registerBlock("State"); - registerUniform("u_matColor"); - registerUniform("u_surfaceProps"); -#endif } } diff --git a/src/gl/gl3device.cpp b/src/gl/gl3device.cpp index 4060eee..538787d 100755 --- a/src/gl/gl3device.cpp +++ b/src/gl/gl3device.cpp @@ -60,12 +60,16 @@ struct UniformObject UniformLight lights[MAX_LIGHTS]; }; -GLuint vao; -GLuint ubo_state, ubo_scene, ubo_object; -GLuint whitetex; -UniformState uniformState; -UniformScene uniformScene; -UniformObject uniformObject; +static GLuint vao; +static GLuint ubo_state, ubo_scene, ubo_object; +static GLuint whitetex; +static UniformState uniformState; +static UniformScene uniformScene; +static UniformObject uniformObject; + +int32 u_matColor; +int32 u_surfaceProps; + Shader *simpleShader; @@ -501,8 +505,11 @@ stopGLFW(void) static int initOpenGL(void) { -#include "shaders/simple_gl3.inc" - simpleShader = Shader::fromStrings(simple_vert_src, simple_frag_src); + registerBlock("Scene"); + registerBlock("Object"); + registerBlock("State"); + u_matColor = registerUniform("u_matColor"); + u_surfaceProps = registerUniform("u_surfaceProps"); glClearColor(0.25, 0.25, 0.25, 1.0); @@ -511,6 +518,25 @@ initOpenGL(void) glGenVertexArrays(1, &vao); glBindVertexArray(vao); + byte whitepixel[4] = {0xFF, 0xFF, 0xFF, 0xFF}; + glGenTextures(1, &whitetex); + glBindTexture(GL_TEXTURE_2D, whitetex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, + 0, GL_RGBA, GL_UNSIGNED_BYTE, &whitepixel); + + im2DInit(); + + return 1; +} + +static int +finalizeOpenGL(void) +{ +#include "shaders/simple_gl3.inc" + simpleShader = Shader::fromStrings(simple_vert_src, simple_frag_src); + glGenBuffers(1, &ubo_state); glBindBuffer(GL_UNIFORM_BUFFER, ubo_state); glBindBufferBase(GL_UNIFORM_BUFFER, gl3::findBlock("State"), ubo_state); @@ -532,15 +558,6 @@ initOpenGL(void) GL_DYNAMIC_DRAW); glBindBuffer(GL_UNIFORM_BUFFER, 0); - byte whitepixel[4] = {0xFF, 0xFF, 0xFF, 0xFF}; - glGenTextures(1, &whitetex); - glBindTexture(GL_TEXTURE_2D, whitetex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, - 0, GL_RGBA, GL_UNSIGNED_BYTE, &whitepixel); - - im2DInit(); return 1; } @@ -552,6 +569,8 @@ deviceSystem(DeviceReq req, void *arg0) return startGLFW((EngineStartParams*)arg0); case DEVICEINIT: return initOpenGL(); + case DEVICEFINALIZE: + return finalizeOpenGL(); case DEVICESTOP: return stopGLFW(); } diff --git a/src/gl/gl3plugins.cpp b/src/gl/gl3plugins.cpp index 9aea327..d716f6c 100644 --- a/src/gl/gl3plugins.cpp +++ b/src/gl/gl3plugins.cpp @@ -25,13 +25,19 @@ namespace gl3 { #ifdef RW_OPENGL +#define U(i) currentShader->uniformLocations[i] + // MatFX -Shader *envShader; +static Shader *envShader; +static int32 u_texMatrix; +static int32 u_coefficient; static void* matfxOpen(void *o, int32, int32) { + u_texMatrix = registerUniform("u_texMatrix"); + u_coefficient = registerUniform("u_coefficient"); #include "shaders/matfx_gl3.inc" matFXGlobals.pipelines[PLATFORM_GL3] = makeMatFXPipeline(); envShader = Shader::fromStrings(matfx_env_vert_src, matfx_env_frag_src); @@ -49,11 +55,8 @@ initMatFX(void) { Driver::registerPlugin(PLATFORM_GL3, 0, ID_MATFX, matfxOpen, matfxClose); - registerUniform("u_texMatrix"); - registerUniform("u_coefficient"); } -#define U(s) currentShader->uniformLocations[findUniform(s)] void matfxDefaultRender(InstanceDataHeader *header, InstanceData *inst) @@ -66,13 +69,13 @@ matfxDefaultRender(InstanceDataHeader *header, InstanceData *inst) simpleShader->use(); convColor(&col, &m->color); - glUniform4fv(U("u_matColor"), 1, (GLfloat*)&col); + glUniform4fv(U(u_matColor), 1, (GLfloat*)&col); surfProps[0] = m->surfaceProps.ambient; surfProps[1] = m->surfaceProps.specular; surfProps[2] = m->surfaceProps.diffuse; surfProps[3] = 0.0f; - glUniform4fv(U("u_surfaceProps"), 1, surfProps); + glUniform4fv(U(u_surfaceProps), 1, surfProps); setTexture(0, m->texture); @@ -160,18 +163,18 @@ matfxEnvRender(InstanceDataHeader *header, InstanceData *inst) envShader->use(); convColor(&col, &m->color); - glUniform4fv(U("u_matColor"), 1, (GLfloat*)&col); + glUniform4fv(U(u_matColor), 1, (GLfloat*)&col); surfProps[0] = m->surfaceProps.ambient; surfProps[1] = m->surfaceProps.specular; surfProps[2] = m->surfaceProps.diffuse; surfProps[3] = 0.0f; - glUniform4fv(U("u_surfaceProps"), 1, surfProps); + glUniform4fv(U(u_surfaceProps), 1, surfProps); - glUniform1fv(U("u_coefficient"), 1, &env->coefficient); + glUniform1fv(U(u_coefficient), 1, &env->coefficient); calcEnvTexMatrix(env->frame, texMat); - glUniformMatrix4fv(U("u_texMatrix"), 1, GL_FALSE, texMat); + glUniformMatrix4fv(U(u_texMatrix), 1, GL_FALSE, texMat); setTexture(0, env->tex); @@ -232,11 +235,13 @@ makeMatFXPipeline(void) // Skin -Shader *skinShader; +static Shader *skinShader; +static int32 u_boneMatrices; static void* skinOpen(void *o, int32, int32) { + u_boneMatrices = registerUniform("u_boneMatrices"); #include "shaders/simple_gl3.inc" #include "shaders/skin_gl3.inc" skinGlobals.pipelines[PLATFORM_GL3] = makeSkinPipeline(); @@ -255,7 +260,6 @@ initSkin(void) { Driver::registerPlugin(PLATFORM_GL3, 0, ID_SKIN, skinOpen, skinClose); - registerUniform("u_boneMatrices"); } enum @@ -416,8 +420,6 @@ skinUninstanceCB(Geometry *geo, InstanceDataHeader *header) assert(0 && "can't uninstance"); } -#define U(s) currentShader->uniformLocations[findUniform(s)] - static float skinMatrices[64*16]; void @@ -464,20 +466,20 @@ skinRenderCB(Atomic *atomic, InstanceDataHeader *header) skinShader->use(); updateSkinMatrices(atomic); - glUniformMatrix4fv(U("u_boneMatrices"), 64, GL_FALSE, + glUniformMatrix4fv(U(u_boneMatrices), 64, GL_FALSE, (GLfloat*)skinMatrices); while(n--){ m = inst->material; convColor(&col, &m->color); - glUniform4fv(U("u_matColor"), 1, (GLfloat*)&col); + glUniform4fv(U(u_matColor), 1, (GLfloat*)&col); surfProps[0] = m->surfaceProps.ambient; surfProps[1] = m->surfaceProps.specular; surfProps[2] = m->surfaceProps.diffuse; surfProps[3] = 0.0f; - glUniform4fv(U("u_surfaceProps"), 1, surfProps); + glUniform4fv(U(u_surfaceProps), 1, surfProps); setTexture(0, m->texture); diff --git a/src/gl/gl3render.cpp b/src/gl/gl3render.cpp index fd345a7..16ac580 100644 --- a/src/gl/gl3render.cpp +++ b/src/gl/gl3render.cpp @@ -64,7 +64,7 @@ lightingCB(void) setAmbientLight(&ambLight); } -#define U(s) currentShader->uniformLocations[findUniform(s)] +#define U(i) currentShader->uniformLocations[i] void defaultRenderCB(Atomic *atomic, InstanceDataHeader *header) @@ -90,13 +90,13 @@ defaultRenderCB(Atomic *atomic, InstanceDataHeader *header) m = inst->material; convColor(&col, &m->color); - glUniform4fv(U("u_matColor"), 1, (GLfloat*)&col); + glUniform4fv(U(u_matColor), 1, (GLfloat*)&col); surfProps[0] = m->surfaceProps.ambient; surfProps[1] = m->surfaceProps.specular; surfProps[2] = m->surfaceProps.diffuse; surfProps[3] = 0.0f; - glUniform4fv(U("u_surfaceProps"), 1, surfProps); + glUniform4fv(U(u_surfaceProps), 1, surfProps); setTexture(0, m->texture); diff --git a/src/gl/gl3shader.cpp b/src/gl/gl3shader.cpp index dc14dc6..457f855 100644 --- a/src/gl/gl3shader.cpp +++ b/src/gl/gl3shader.cpp @@ -18,17 +18,20 @@ namespace gl3 { UniformRegistry uniformRegistry; -int +int32 registerUniform(const char *name) { int i; i = findUniform(name); if(i >= 0) return i; + // TODO: print error + if(uniformRegistry.numUniforms+1 >= MAX_UNIFORMS) + return -1; uniformRegistry.uniformNames[uniformRegistry.numUniforms] = strdup(name); return uniformRegistry.numUniforms++; } -int +int32 findUniform(const char *name) { int i; @@ -38,17 +41,20 @@ findUniform(const char *name) return -1; } -int +int32 registerBlock(const char *name) { int i; i = findBlock(name); if(i >= 0) return i; + // TODO: print error + if(uniformRegistry.numBlocks+1 >= MAX_BLOCKS) + return -1; uniformRegistry.blockNames[uniformRegistry.numBlocks] = strdup(name); return uniformRegistry.numBlocks++; } -int +int32 findBlock(const char *name) { int i; diff --git a/src/gl/rwgl3.h b/src/gl/rwgl3.h index 313ea6d..d7d817f 100644 --- a/src/gl/rwgl3.h +++ b/src/gl/rwgl3.h @@ -16,7 +16,7 @@ struct EngineStartParams namespace gl3 { -void initializePlatform(void); +void registerPlatformPlugins(void); extern Device renderdevice; @@ -46,6 +46,10 @@ enum AttribIndices ATTRIB_TEXCOORDS7, }; +// default uniform indices +extern int32 u_matColor; +extern int32 u_surfaceProps; + struct InstanceData { uint32 numIndex; diff --git a/src/gl/rwgl3shader.h b/src/gl/rwgl3shader.h index 70134ff..1da5335 100644 --- a/src/gl/rwgl3shader.h +++ b/src/gl/rwgl3shader.h @@ -11,17 +11,17 @@ enum { struct UniformRegistry { - int numUniforms; + int32 numUniforms; char *uniformNames[MAX_UNIFORMS]; - int numBlocks; + int32 numBlocks; char *blockNames[MAX_BLOCKS]; }; -int registerUniform(const char *name); -int findUniform(const char *name); -int registerBlock(const char *name); -int findBlock(const char *name); +int32 registerUniform(const char *name); +int32 findUniform(const char *name); +int32 registerBlock(const char *name); +int32 findBlock(const char *name); extern UniformRegistry uniformRegistry; diff --git a/src/gl/rwwdgl.h b/src/gl/rwwdgl.h index b9cf02d..cda69a6 100644 --- a/src/gl/rwwdgl.h +++ b/src/gl/rwwdgl.h @@ -4,7 +4,7 @@ namespace wdgl { // NOTE: This is not really RW OpenGL! It's specific to WarDrum's GTA ports -void initializePlatform(void); +void registerPlatformPlugins(void); struct AttribDesc { diff --git a/src/gl/wdgl.cpp b/src/gl/wdgl.cpp index ffeb7ea..7f95ecf 100644 --- a/src/gl/wdgl.cpp +++ b/src/gl/wdgl.cpp @@ -22,21 +22,21 @@ namespace rw { namespace wdgl { -void* +static void* driverOpen(void *o, int32, int32) { engine->driver[PLATFORM_WDGL]->defaultPipeline = makeDefaultPipeline(); return o; } -void* +static void* driverClose(void *o, int32, int32) { return o; } void -initializePlatform(void) +registerPlatformPlugins(void) { Driver::registerPlugin(PLATFORM_WDGL, 0, PLATFORM_WDGL, driverOpen, driverClose); diff --git a/src/hanim.cpp b/src/hanim.cpp index 57379c3..d576c36 100644 --- a/src/hanim.cpp +++ b/src/hanim.cpp @@ -315,17 +315,9 @@ assert(t >= in1->time && t <= in2->time); out->q = slerp(in1->q, in2->q, a); } -void -registerHAnimPlugin(void) +static void* +hanimOpen(void *object, int32 offset, int32 size) { - hAnimOffset = Frame::registerPlugin(sizeof(HAnimData), ID_HANIM, - createHAnim, - destroyHAnim, copyHAnim); - Frame::registerPluginStream(ID_HANIM, - readHAnim, - writeHAnim, - getSizeHAnim); - AnimInterpolatorInfo *info = rwNewT(AnimInterpolatorInfo, 1, MEMDUR_GLOBAL | ID_HANIM); info->id = 1; info->interpKeyFrameSize = sizeof(HAnimInterpFrame); @@ -340,6 +332,21 @@ registerHAnimPlugin(void) info->streamWrite = hAnimFrameWrite; info->streamGetSize = hAnimFrameGetSize; AnimInterpolatorInfo::registerInterp(info); + return object; } +static void *hanimClose(void *object, int32 offset, int32 size) { return object; } + + +void +registerHAnimPlugin(void) +{ + Engine::registerPlugin(0, ID_HANIM, hanimOpen, hanimClose); + hAnimOffset = Frame::registerPlugin(sizeof(HAnimData), ID_HANIM, + createHAnim, + destroyHAnim, copyHAnim); + Frame::registerPluginStream(ID_HANIM, + readHAnim, + writeHAnim, + getSizeHAnim);} } diff --git a/src/matfx.cpp b/src/matfx.cpp index b0875bf..aa7a258 100755 --- a/src/matfx.cpp +++ b/src/matfx.cpp @@ -437,8 +437,8 @@ MatFX::enableEffects(Atomic *atomic) atomic->pipeline = matFXGlobals.pipelines[rw::platform]; } -void -registerMatFXPlugin(void) +static void* +matfxOpen(void *o, int32, int32) { // init dummy pipelines ObjPipeline *defpipe = new ObjPipeline(PLATFORM_NULL); @@ -446,7 +446,20 @@ registerMatFXPlugin(void) defpipe->pluginData = 0; for(uint i = 0; i < nelem(matFXGlobals.pipelines); i++) matFXGlobals.pipelines[i] = defpipe; + return o; +} +static void* +matfxClose(void *o, int32, int32) +{ + return o; +} + +void +registerMatFXPlugin(void) +{ + Driver::registerPlugin(PLATFORM_NULL, 0, ID_MATFX, + matfxOpen, matfxClose); ps2::initMatFX(); xbox::initMatFX(); d3d8::initMatFX(); diff --git a/src/ps2/pds.cpp b/src/ps2/pds.cpp index cf75eef..67f4fc9 100755 --- a/src/ps2/pds.cpp +++ b/src/ps2/pds.cpp @@ -36,6 +36,8 @@ getPDSPipe(uint32 data) void registerPDSPipe(Pipeline *pipe) { + if(pdsGlobals.pipes == nil) + pdsGlobals.pipes = rwNewT(Pipeline*, pdsGlobals.maxPipes, MEMDUR_GLOBAL | ID_PDS); assert(pdsGlobals.numPipes < pdsGlobals.maxPipes); pdsGlobals.pipes[pdsGlobals.numPipes++] = pipe; } @@ -56,12 +58,22 @@ materialPDSRights(void *object, int32, int32, uint32 data) // printf("mat pds: %x %x %x\n", data, m->pipeline->pluginID, m->pipeline->pluginData); } +static void *pdsOpen(void *object, int32 offset, int32 size) { return object; } +static void* +pdsClose(void *object, int32 offset, int32 size) +{ + // TODO MEMORY: free registered pipelines + rwFree(pdsGlobals.pipes); + return object; +} + void registerPDSPlugin(int32 n) { pdsGlobals.maxPipes = n; pdsGlobals.numPipes = 0; - pdsGlobals.pipes = rwNewT(Pipeline*, n, MEMDUR_GLOBAL | ID_PDS); + pdsGlobals.pipes = nil; + Engine::registerPlugin(0, ID_PDS, pdsOpen, pdsClose); Atomic::registerPlugin(0, ID_PDS, nil, nil, nil); Atomic::setStreamRightsCallback(ID_PDS, atomicPDSRights); diff --git a/src/ps2/ps2.cpp b/src/ps2/ps2.cpp index a89fb5a..2d9e74a 100755 --- a/src/ps2/ps2.cpp +++ b/src/ps2/ps2.cpp @@ -21,7 +21,7 @@ namespace rw { namespace ps2 { -void* +static void* driverOpen(void *o, int32, int32) { engine->driver[PLATFORM_PS2]->defaultPipeline = makeDefaultPipeline(); @@ -34,14 +34,14 @@ driverOpen(void *o, int32, int32) return o; } -void* +static void* driverClose(void *o, int32, int32) { return o; } void -initializePlatform(void) +registerPlatformPlugins(void) { Driver::registerPlugin(PLATFORM_PS2, 0, PLATFORM_PS2, driverOpen, driverClose); diff --git a/src/ps2/rwps2.h b/src/ps2/rwps2.h index f98f4a2..f580d5f 100755 --- a/src/ps2/rwps2.h +++ b/src/ps2/rwps2.h @@ -8,7 +8,7 @@ struct EngineStartParams namespace ps2 { -void initializePlatform(void); +void registerPlatformPlugins(void); extern Device renderdevice; diff --git a/src/rwbase.h b/src/rwbase.h index e7b2888..e221c30 100644 --- a/src/rwbase.h +++ b/src/rwbase.h @@ -463,6 +463,12 @@ enum PluginID ID_DRIVER = MAKEPLUGINID(VEND_DRIVER, 0), }; +enum CoreModuleID +{ + ID_NAMODULE = MAKEPLUGINID(VEND_CRITERIONINT, 0x00), + ID_FRAMEMODULE = MAKEPLUGINID(VEND_CRITERIONINT, 0x03), +}; + #define ECODE(c, s) c, enum Errors diff --git a/src/rwengine.h b/src/rwengine.h index f52165f..42af5f5 100755 --- a/src/rwengine.h +++ b/src/rwengine.h @@ -49,6 +49,8 @@ enum DeviceReq DEVICESTART, // Device initialization before Engine/Driver plugins are opened DEVICEINIT, + // Device initialization after plugins are opened + DEVICEFINALIZE, // Device/Context shutdown DEVICESTOP, }; @@ -120,7 +122,6 @@ struct MemoryFunctions // This is for platform independent things // TODO: move more stuff into this -// TODO: make this have plugins and allocate in Engine::open struct Engine { enum State { @@ -132,6 +133,7 @@ struct Engine void *currentCamera; void *currentWorld; Texture *imtexture; + LinkList frameDirtyList; TexDictionary *currentTexDictionary; // load textures from files @@ -152,6 +154,12 @@ struct Engine static void term(void); static void close(void); static void stop(void); + + static PluginList s_plglist; + static int32 registerPlugin(int32 size, uint32 id, + Constructor ctor, Destructor dtor){ + return s_plglist.registerPlugin(size, id, ctor, dtor, nil); + } }; extern Engine *engine; diff --git a/src/rwobjects.h b/src/rwobjects.h index 993d6b5..89f12fb 100755 --- a/src/rwobjects.h +++ b/src/rwobjects.h @@ -136,8 +136,10 @@ struct Frame Frame *cloneAndLink(Frame *clonedroot); void purgeClone(void); - - static LinkList dirtyList; +#ifndef RWPUBLIC + static void *_open(void*, int32, int32); + static void *_close(void*, int32, int32); +#endif static void syncDirty(void); }; diff --git a/src/skin.cpp b/src/skin.cpp index 3a83faf..7d019b0 100644 --- a/src/skin.cpp +++ b/src/skin.cpp @@ -278,8 +278,8 @@ copySkinAtm(void *dst, void *src, int32 offset, int32) return dst; } -void -registerSkinPlugin(void) +static void* +skinOpen(void *o, int32, int32) { // init dummy pipelines ObjPipeline *defpipe = new ObjPipeline(PLATFORM_NULL); @@ -287,7 +287,20 @@ registerSkinPlugin(void) defpipe->pluginData = 1; for(uint i = 0; i < nelem(skinGlobals.pipelines); i++) skinGlobals.pipelines[i] = defpipe; + return o; +} +static void* +skinClose(void *o, int32, int32) +{ + return o; +} + +void +registerSkinPlugin(void) +{ + Driver::registerPlugin(PLATFORM_NULL, 0, ID_SKIN, + skinOpen, skinClose); ps2::initSkin(); xbox::initSkin(); d3d8::initSkin(); diff --git a/src/uvanim.cpp b/src/uvanim.cpp index d666c14..c3a569b 100644 --- a/src/uvanim.cpp +++ b/src/uvanim.cpp @@ -337,11 +337,18 @@ getSizeUVAnim(void *object, int32 offset, int32) return size ? size + 12 + 4 : 0; } +static void* +uvanimOpen(void *object, int32 offset, int32 size) +{ + registerUVAnimInterpolator(); + return object; +} +static void *uvanimClose(void *object, int32 offset, int32 size) { return object; } void registerUVAnimPlugin(void) { - registerUVAnimInterpolator(); + Engine::registerPlugin(0, ID_UVANIMATION, uvanimOpen, uvanimClose); uvAnimOffset = Material::registerPlugin(sizeof(UVAnim), ID_UVANIMATION, createUVAnim, destroyUVAnim, copyUVAnim); Material::registerPluginStream(ID_UVANIMATION, diff --git a/tools/clumpview/main.cpp b/tools/clumpview/main.cpp index 37eae49..c56eab0 100644 --- a/tools/clumpview/main.cpp +++ b/tools/clumpview/main.cpp @@ -201,6 +201,22 @@ InitRW(void) return true; } +void +im2dtest(void) +{ + static rw::gl3::Im2DVertex verts[] = { + { -0.5, -0.5, 0.0, 255, 0, 0, 255, 0.0, 0.0 }, + { 0.5, -0.5, 0.0, 0, 255, 0, 255, 0.0, 0.0 }, + { -0.5, 0.5, 0.0, 0, 0, 255, 255, 0.0, 0.0 }, + { 0.5, 0.5, 0.0, 0, 255, 255, 255, 0.0, 0.0 }, + }; + static short indices[] = { + 0, 1, 2, 3 + }; + rw::engine->device.im2DRenderIndexedPrimitive(rw::PRIMTYPETRISTRIP, + &verts, 4, &indices, 4); +} + void Draw(float timeDelta) { @@ -210,6 +226,7 @@ Draw(float timeDelta) camera->m_rwcam->beginUpdate(); clump->render(); + im2dtest(); camera->m_rwcam->endUpdate(); camera->m_rwcam->showRaster();