From 3271713d1689d24fbacdf637d450646e567b9105 Mon Sep 17 00:00:00 2001 From: aap Date: Tue, 21 Jun 2016 23:16:09 +0200 Subject: [PATCH] some renaming, frame synching, camera update --- src/camera.cpp | 48 ++++++++++++++++++ src/clump.cpp | 8 ++- src/d3d.cpp | 52 ++++++++++--------- src/d3d8.cpp | 2 +- src/d3d9.cpp | 2 +- src/d3ddriver.cpp | 8 +-- src/engine.cpp | 11 +++- src/frame.cpp | 124 +++++++++++++++++++++++++++++++++++----------- src/image.cpp | 10 ++-- src/light.cpp | 6 +++ src/pds.cpp | 6 +-- src/pipeline.cpp | 41 ++++++++++----- src/plugins.cpp | 98 ++++++++++++++++++------------------ src/ps2.cpp | 2 +- src/ps2raster.cpp | 10 ++-- src/rwbase.cpp | 31 ++++++------ src/rwbase.h | 2 +- src/rwengine.h | 19 ++++++- src/rwobjects.h | 35 +++++++++---- src/rwpipeline.h | 1 + src/rwplg.h | 16 +++--- src/wdgl.cpp | 20 ++++---- src/xbox.cpp | 42 ++++++++-------- 23 files changed, 387 insertions(+), 207 deletions(-) diff --git a/src/camera.cpp b/src/camera.cpp index 2e8e7cc..12beb7b 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -6,11 +6,31 @@ #include "rwplg.h" #include "rwpipeline.h" #include "rwobjects.h" +#include "rwengine.h" #define PLUGIN_ID 0 namespace rw { +void +defaultBeginUpdateCB(Camera *cam) +{ + engine.currentCamera = cam; + Frame::syncDirty(); + DRIVER.beginUpdate(cam); +} + +void +defaultEndUpdateCB(Camera *cam) +{ + DRIVER.endUpdate(cam); +} + +static void +cameraSync(ObjectWithFrame*) +{ +} + Camera* Camera::create(void) { @@ -20,6 +40,7 @@ Camera::create(void) return nil; } cam->object.object.init(Camera::ID, 0); + cam->object.syncCB = cameraSync; cam->viewWindow.set(1.0f, 1.0f); cam->viewOffset.set(0.0f, 0.0f); cam->nearPlane = 0.05f; @@ -28,6 +49,10 @@ Camera::create(void) cam->projection = Camera::PERSPECTIVE; cam->clump = nil; cam->inClump.init(); + + cam->beginUpdateCB = defaultBeginUpdateCB; + cam->endUpdateCB = defaultEndUpdateCB; + cam->constructPlugins(); return cam; } @@ -153,6 +178,29 @@ Camera::updateProjectionMatrix(void) this->projMat[14] = -this->nearPlane*this->projMat[10]; this->projMat[15] = 1.0f; } + }else if(rw::platform == PLATFORM_WDGL || rw::platform == PLATFORM_GL3){ + this->projMat[0] = invwx; + this->projMat[1] = 0.0f; + this->projMat[2] = 0.0f; + this->projMat[3] = 0.0f; + + this->projMat[4] = 0.0f; + this->projMat[5] = invwy; + this->projMat[6] = 0.0f; + this->projMat[7] = 0.0f; + + if(this->projection == PERSPECTIVE){ + this->projMat[8] = this->viewOffset.x*invwx; + this->projMat[9] = this->viewOffset.y*invwy; + this->projMat[10] = (this->farPlane+this->nearPlane)*invz; + this->projMat[11] = 1.0f; + + this->projMat[12] = 0.0f; + this->projMat[13] = 0.0f; + this->projMat[14] = -2.0f*this->nearPlane*this->farPlane*invz; + this->projMat[15] = 0.0f; + }else{ + } } } diff --git a/src/clump.cpp b/src/clump.cpp index c69d18c..9f8d69b 100644 --- a/src/clump.cpp +++ b/src/clump.cpp @@ -315,6 +315,11 @@ Clump::render(void) // Atomic // +static void +atomicSync(ObjectWithFrame*) +{ +} + Atomic* Atomic::create(void) { @@ -324,6 +329,7 @@ Atomic::create(void) return nil; } atomic->object.object.init(Atomic::ID, 0); + atomic->object.syncCB = atomicSync; atomic->geometry = nil; atomic->worldBoundingSphere.center.set(0.0f, 0.0f, 0.0f); atomic->worldBoundingSphere.radius = 0.0f; @@ -491,7 +497,7 @@ Atomic::getPipeline(void) { return this->pipeline ? this->pipeline : - engine[platform].defaultPipeline; + driver[platform].defaultPipeline; } void diff --git a/src/d3d.cpp b/src/d3d.cpp index 2165591..c050a9d 100644 --- a/src/d3d.cpp +++ b/src/d3d.cpp @@ -10,15 +10,13 @@ #include "rwengine.h" #include "rwd3d.h" -using namespace std; - namespace rw { namespace d3d { bool32 isP8supported = 1; #ifdef RW_D3D9 -IDirect3DDevice9 *device = NULL; +IDirect3DDevice9 *device = nil; #else #define MAKEFOURCC(ch0, ch1, ch2, ch3) \ ((uint32)(uint8)(ch0) | ((uint32)(uint8)(ch1) << 8) | \ @@ -198,8 +196,8 @@ createIndexBuffer(uint32 length) uint16* lockIndices(void *indexBuffer, uint32 offset, uint32 size, uint32 flags) { - if(indexBuffer == NULL) - return NULL; + if(indexBuffer == nil) + return nil; #ifdef RW_D3D9 uint16 *indices; IDirect3DIndexBuffer9 *ibuf = (IDirect3DIndexBuffer9*)indexBuffer; @@ -216,7 +214,7 @@ lockIndices(void *indexBuffer, uint32 offset, uint32 size, uint32 flags) void unlockIndices(void *indexBuffer) { - if(indexBuffer == NULL) + if(indexBuffer == nil) return; #ifdef RW_D3D9 IDirect3DIndexBuffer9 *ibuf = (IDirect3DIndexBuffer9*)indexBuffer; @@ -241,8 +239,8 @@ createVertexBuffer(uint32 length, uint32 fvf, int32 pool) uint8* lockVertices(void *vertexBuffer, uint32 offset, uint32 size, uint32 flags) { - if(vertexBuffer == NULL) - return NULL; + if(vertexBuffer == nil) + return nil; #ifdef RW_D3D9 uint8 *verts; IDirect3DVertexBuffer9 *vertbuf = (IDirect3DVertexBuffer9*)vertexBuffer; @@ -259,7 +257,7 @@ lockVertices(void *vertexBuffer, uint32 offset, uint32 size, uint32 flags) void unlockVertices(void *vertexBuffer) { - if(vertexBuffer == NULL) + if(vertexBuffer == nil) return; #ifdef RW_D3D9 IDirect3DVertexBuffer9 *vertbuf = (IDirect3DVertexBuffer9*)vertexBuffer; @@ -273,7 +271,7 @@ createTexture(int32 width, int32 height, int32 numlevels, uint32 format) #ifdef RW_D3D9 IDirect3DTexture9 *tex; device->CreateTexture(width, height, numlevels, 0, - (D3DFORMAT)format, D3DPOOL_MANAGED, &tex, NULL); + (D3DFORMAT)format, D3DPOOL_MANAGED, &tex, nil); return tex; #else int32 w = width; @@ -336,7 +334,7 @@ unlockTexture(void *texture, int32 level) void deleteObject(void *object) { - if(object == NULL) + if(object == nil) return; #ifdef RW_D3D9 IUnknown *unk = (IUnknown*)object; @@ -560,8 +558,8 @@ static void* createNativeRaster(void *object, int32 offset, int32) { D3dRaster *raster = PLUGINOFFSET(D3dRaster, object, offset); - raster->texture = NULL; - raster->palette = NULL; + raster->texture = nil; + raster->palette = nil; raster->format = 0; raster->hasAlpha = 0; raster->customFormat = 0; @@ -580,8 +578,8 @@ static void* copyNativeRaster(void *dst, void *, int32 offset, int32) { D3dRaster *raster = PLUGINOFFSET(D3dRaster, dst, offset); - raster->texture = NULL; - raster->palette = NULL; + raster->texture = nil; + raster->palette = nil; raster->format = 0; raster->hasAlpha = 0; raster->customFormat = 0; @@ -596,19 +594,19 @@ registerNativeRaster(void) createNativeRaster, destroyNativeRaster, copyNativeRaster); - engine[PLATFORM_D3D8].rasterNativeOffset = nativeRasterOffset; - engine[PLATFORM_D3D8].rasterCreate = rasterCreate; - engine[PLATFORM_D3D8].rasterLock = rasterLock; - engine[PLATFORM_D3D8].rasterUnlock = rasterUnlock; - engine[PLATFORM_D3D8].rasterNumLevels = rasterNumLevels; - engine[PLATFORM_D3D8].rasterFromImage = rasterFromImage; + driver[PLATFORM_D3D8].rasterNativeOffset = nativeRasterOffset; + driver[PLATFORM_D3D8].rasterCreate = rasterCreate; + driver[PLATFORM_D3D8].rasterLock = rasterLock; + driver[PLATFORM_D3D8].rasterUnlock = rasterUnlock; + driver[PLATFORM_D3D8].rasterNumLevels = rasterNumLevels; + driver[PLATFORM_D3D8].rasterFromImage = rasterFromImage; - engine[PLATFORM_D3D9].rasterNativeOffset = nativeRasterOffset; - engine[PLATFORM_D3D9].rasterCreate = rasterCreate; - engine[PLATFORM_D3D9].rasterLock = rasterLock; - engine[PLATFORM_D3D9].rasterUnlock = rasterUnlock; - engine[PLATFORM_D3D9].rasterNumLevels = rasterNumLevels; - engine[PLATFORM_D3D9].rasterFromImage = rasterFromImage; + driver[PLATFORM_D3D9].rasterNativeOffset = nativeRasterOffset; + driver[PLATFORM_D3D9].rasterCreate = rasterCreate; + driver[PLATFORM_D3D9].rasterLock = rasterLock; + driver[PLATFORM_D3D9].rasterUnlock = rasterUnlock; + driver[PLATFORM_D3D9].rasterNumLevels = rasterNumLevels; + driver[PLATFORM_D3D9].rasterFromImage = rasterFromImage; } } diff --git a/src/d3d8.cpp b/src/d3d8.cpp index 5c96fe9..ce4fd75 100644 --- a/src/d3d8.cpp +++ b/src/d3d8.cpp @@ -21,7 +21,7 @@ using namespace d3d; void initializePlatform(void) { - engine[PLATFORM_D3D8].defaultPipeline = makeDefaultPipeline(); + driver[PLATFORM_D3D8].defaultPipeline = makeDefaultPipeline(); } uint32 diff --git a/src/d3d9.cpp b/src/d3d9.cpp index bc20984..b09156a 100644 --- a/src/d3d9.cpp +++ b/src/d3d9.cpp @@ -28,7 +28,7 @@ using namespace d3d; void initializePlatform(void) { - engine[PLATFORM_D3D9].defaultPipeline = makeDefaultPipeline(); + driver[PLATFORM_D3D9].defaultPipeline = makeDefaultPipeline(); } void* diff --git a/src/d3ddriver.cpp b/src/d3ddriver.cpp index de921c9..c6d652a 100644 --- a/src/d3ddriver.cpp +++ b/src/d3ddriver.cpp @@ -110,14 +110,14 @@ setSamplerState(uint32 stage, uint32 type, uint32 value) void setRasterStage(uint32 stage, Raster *raster) { - D3dRaster *d3draster = NULL; + D3dRaster *d3draster = nil; if(raster != d3dRaster[stage]){ d3dRaster[stage] = raster; if(raster){ d3draster = PLUGINOFFSET(D3dRaster, raster, nativeRasterOffset); device->SetTexture(stage, (IDirect3DTexture9*)d3draster->texture); }else - device->SetTexture(stage, NULL); + device->SetTexture(stage, nil); } } @@ -133,8 +133,8 @@ setTexture(uint32 stage, Texture *tex) 0, D3DTADDRESS_WRAP, D3DTADDRESS_MIRROR, D3DTADDRESS_CLAMP, D3DTADDRESS_BORDER }; - if(tex == NULL){ - setRasterStage(stage, NULL); + if(tex == nil){ + setRasterStage(stage, nil); return; } if(tex->raster){ diff --git a/src/engine.cpp b/src/engine.cpp index 3257ea1..866dde3 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -10,10 +10,17 @@ namespace rw { -Engine engine[NUM_PLATFORMS]; +Engine engine; + +Driver driver[NUM_PLATFORMS]; namespace null { +void beginUpdate(Camera*) { } + +void endUpdate(Camera*) { } + + void rasterCreate(Raster*) { @@ -24,7 +31,7 @@ uint8* rasterLock(Raster*, int32) { assert(0 && "lockRaster not implemented"); - return NULL; + return nil; } void diff --git a/src/frame.cpp b/src/frame.cpp index dbefcd2..1f9bc12 100644 --- a/src/frame.cpp +++ b/src/frame.cpp @@ -17,14 +17,14 @@ Frame* Frame::create(void) { Frame *f = (Frame*)malloc(PluginBase::s_size); - if(f == NULL){ + if(f == nil){ RWERROR((ERR_ALLOC, PluginBase::s_size)); - return NULL; + return nil; } f->object.init(Frame::ID, 0); f->objectList.init(); - f->child = NULL; - f->next = NULL; + f->child = nil; + f->next = nil; f->root = f; f->matrix.setIdentity(); f->ltm.setIdentity(); @@ -35,7 +35,7 @@ Frame::create(void) Frame* Frame::cloneHierarchy(void) { - Frame *frame = this->cloneAndLink(NULL); + Frame *frame = this->cloneAndLink(nil); frame->purgeClone(); return frame; } @@ -56,12 +56,12 @@ Frame::destroy(void) ; child->next = this->next; } - this->object.parent = NULL; + this->object.parent = nil; // Doesn't seem to make much sense, blame criterion. this->setHierarchyRoot(this); } for(Frame *f = this->child; f; f = f->next) - f->object.parent = NULL; + f->object.parent = nil; free(this); } @@ -84,13 +84,13 @@ Frame::addChild(Frame *child, bool32 append) if(child->getParent()) child->removeChild(); if(append){ - if(this->child == NULL) + if(this->child == nil) this->child = child; else{ for(c = this->child; c->next; c = c->next); c->next = child; } - child->next = NULL; + child->next = nil; }else{ child->next = this->child; this->child = child; @@ -99,6 +99,7 @@ Frame::addChild(Frame *child, bool32 append) child->root = this->root; for(c = child->child; c; c = c->next) c->setHierarchyRoot(this); + // If the child was a root, remove from dirty list if(child->object.privateFlags & Frame::HIERARCHYSYNC){ child->inDirtyList.remove(); child->object.privateFlags &= ~Frame::HIERARCHYSYNC; @@ -119,7 +120,7 @@ Frame::removeChild(void) child = child->next; child->next = this->next; } - this->object.parent = this->next = NULL; + this->object.parent = this->next = nil; this->root = this; for(child = this->child; child; child = child->next) child->setHierarchyRoot(this); @@ -151,36 +152,74 @@ Frame::count(void) return count; } +/* + * Synching is a bit complicated. If anything in the hierarchy is not synched, + * the root of the hierarchy is marked with the HIERARCHYSYNC flags. + * Every unsynched frame is marked with the SUBTREESYNC flags. + * If the LTM is not synched, the LTM flags are set. + * If attached objects need synching, the OBJ flags are set. + */ + +/* Synch just LTM matrices in a hierarchy */ static void -syncRecurse(Frame *frame, uint8 flags) +syncLTMRecurse(Frame *frame, uint8 hierarchyFlags) { - uint8 flg; for(; frame; frame = frame->next){ - flg = flags | frame->object.privateFlags; - if(flg & Frame::SUBTREESYNCLTM){ + // If frame is dirty or any parent was dirty, update LTM + hierarchyFlags |= frame->object.privateFlags; + if(hierarchyFlags & Frame::SUBTREESYNCLTM){ Matrix::mult(&frame->ltm, &frame->getParent()->ltm, &frame->matrix); frame->object.privateFlags &= ~Frame::SUBTREESYNCLTM; } - syncRecurse(frame->child, flg); + // And synch all children + syncLTMRecurse(frame->child, hierarchyFlags); } } +/* Synch just objects in a hierarchy */ +static void +syncObjRecurse(Frame *frame) +{ + for(; frame; frame = frame->next){ + // Synch attached objects + FORLIST(lnk, frame->objectList) + ObjectWithFrame::fromFrame(lnk)->sync(); + frame->object.privateFlags &= ~Frame::SUBTREESYNCOBJ; + // And synch all children + syncObjRecurse(frame->child); + } +} + +/* Synch LTM and objects */ +static void +syncRecurse(Frame *frame, uint8 hierarchyFlags) +{ + for(; frame; frame = frame->next){ + // If frame is dirty or any parent was dirty, update LTM + hierarchyFlags |= frame->object.privateFlags; + if(hierarchyFlags & Frame::SUBTREESYNCLTM) + Matrix::mult(&frame->ltm, &frame->getParent()->ltm, + &frame->matrix); + // Synch attached objects + FORLIST(lnk, frame->objectList) + ObjectWithFrame::fromFrame(lnk)->sync(); + frame->object.privateFlags &= ~Frame::SUBTREESYNC; + // And synch all children + syncRecurse(frame->child, hierarchyFlags); + } +} + +/* Sync the LTMs of the hierarchy of which 'this' is the root */ void Frame::syncHierarchyLTM(void) { - Frame *child; - uint8 flg; + // Sync root's LTM if(this->object.privateFlags & Frame::SUBTREESYNCLTM) this->ltm = this->matrix; - for(child = this->child; child; child = child->next){ - flg = this->object.privateFlags | child->object.privateFlags; - if(flg & Frame::SUBTREESYNCLTM){ - Matrix::mult(&child->ltm, &this->ltm, &child->matrix); - child->object.privateFlags &= ~Frame::SUBTREESYNCLTM; - } - syncRecurse(child, flg); - } + // ...and children + syncLTMRecurse(this->child, this->object.privateFlags); + // all clean now this->object.privateFlags &= ~Frame::SYNCLTM; } @@ -192,12 +231,42 @@ Frame::getLTM(void) return &this->ltm; } +/* Synch all dirty frames; LTMs and objects */ +void +Frame::syncDirty(void) +{ + Frame *frame; + FORLIST(lnk, Frame::dirtyList){ + frame = LLLinkGetData(lnk, Frame, inDirtyList); + if(frame->object.privateFlags & Frame::HIERARCHYSYNCLTM){ + // Sync root's LTM + if(frame->object.privateFlags & Frame::SUBTREESYNCLTM) + frame->ltm = frame->matrix; + // Synch attached objects + FORLIST(lnk, frame->objectList) + ObjectWithFrame::fromFrame(lnk)->sync(); + // ...and children + syncRecurse(frame->child, frame->object.privateFlags); + }else{ + // LTMs are clean, just synch objects + FORLIST(lnk, frame->objectList) + ObjectWithFrame::fromFrame(lnk)->sync(); + syncObjRecurse(frame->child); + } + // all clean now + frame->object.privateFlags &= ~(Frame::SYNCLTM | Frame::SYNCOBJ); + } + Frame::dirtyList.init(); +} + void 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->inDirtyList); + Frame::dirtyList.add(&this->root->inDirtyList); this->root->object.privateFlags |= HIERARCHYSYNC; + // Mark subtree as dirty as well this->object.privateFlags |= SUBTREESYNC; } @@ -214,11 +283,10 @@ Frame* Frame::cloneAndLink(Frame *clonedroot) { Frame *frame = Frame::create(); - if(clonedroot == NULL) + if(clonedroot == nil) clonedroot = frame; frame->object.copy(&this->object); frame->matrix = this->matrix; - //memcpy(frame->matrix, this->matrix, sizeof(this->matrix)); frame->root = clonedroot; this->root = frame; // Remember cloned frame for(Frame *child = this->child; child; child = child->next){ diff --git a/src/image.cpp b/src/image.cpp index 5365136..2e03e6e 100755 --- a/src/image.cpp +++ b/src/image.cpp @@ -691,7 +691,7 @@ Raster::create(int32 width, int32 height, int32 depth, int32 format, int32 platf raster->texels = raster->palette = nil; raster->constructPlugins(); - engine[raster->platform].rasterCreate(raster); + driver[raster->platform].rasterCreate(raster); return raster; } @@ -707,19 +707,19 @@ Raster::destroy(void) uint8* Raster::lock(int32 level) { - return engine[this->platform].rasterLock(this, level); + return driver[this->platform].rasterLock(this, level); } void Raster::unlock(int32 level) { - engine[this->platform].rasterUnlock(this, level); + driver[this->platform].rasterUnlock(this, level); } int32 Raster::getNumLevels(void) { - return engine[this->platform].rasterNumLevels(this); + return driver[this->platform].rasterNumLevels(this); } int32 @@ -737,7 +737,7 @@ Raster::createFromImage(Image *image) { Raster *raster = Raster::create(image->width, image->height, image->depth, 4 | 0x80); - engine[raster->platform].rasterFromImage(raster, image); + driver[raster->platform].rasterFromImage(raster, image); return raster; } diff --git a/src/light.cpp b/src/light.cpp index 5013e7e..6b30957 100644 --- a/src/light.cpp +++ b/src/light.cpp @@ -11,6 +11,11 @@ namespace rw { +static void +lightSync(ObjectWithFrame*) +{ +} + Light* Light::create(int32 type) { @@ -20,6 +25,7 @@ Light::create(int32 type) return nil; } light->object.object.init(Light::ID, type); + light->object.syncCB = lightSync; light->radius = 0.0f; light->color.red = 1.0f; light->color.green = 1.0f; diff --git a/src/pds.cpp b/src/pds.cpp index 13415dd..581fe8a 100644 --- a/src/pds.cpp +++ b/src/pds.cpp @@ -28,7 +28,7 @@ getPDSPipe(uint32 data) for(int32 i = 0; i < pdsGlobals.numPipes; i++) if(pdsGlobals.pipes[i]->pluginData == data) return pdsGlobals.pipes[i]; - return NULL; + return nil; } void @@ -60,10 +60,10 @@ registerPDSPlugin(int32 n) pdsGlobals.maxPipes = n; pdsGlobals.numPipes = 0; pdsGlobals.pipes = new Pipeline*[n]; - Atomic::registerPlugin(0, ID_PDS, NULL, NULL, NULL); + Atomic::registerPlugin(0, ID_PDS, nil, nil, nil); Atomic::setStreamRightsCallback(ID_PDS, atomicPDSRights); - Material::registerPlugin(0, ID_PDS, NULL, NULL, NULL); + Material::registerPlugin(0, ID_PDS, nil, nil, nil); Material::setStreamRightsCallback(ID_PDS, materialPDSRights); } diff --git a/src/pipeline.cpp b/src/pipeline.cpp index a9c3284..e466762 100644 --- a/src/pipeline.cpp +++ b/src/pipeline.cpp @@ -12,8 +12,6 @@ #define COLOR_ARGB(a,r,g,b) \ ((uint32)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff))) -using namespace std; - namespace rw { static void nothing(ObjPipeline *, Atomic*) {} @@ -47,8 +45,10 @@ findMinVertAndNumVertices(uint16 *indices, uint32 numIndices, uint32 *minVert, i max = *indices; indices++; } - *minVert = min; - *numVertices = max - min + 1; + if(minVert) + *minVert = min; + if(numVertices) + *numVertices = max - min + 1; } void @@ -128,16 +128,31 @@ uninstV2d(int type, float *dst, uint8 *src, uint32 numVertices, uint32 stride) bool32 instColor(int type, uint8 *dst, uint8 *src, uint32 numVertices, uint32 stride) { - assert(type == VERT_ARGB); bool32 hasAlpha = 0; - for(uint32 i = 0; i < numVertices; i++){ - dst[0] = src[2]; - dst[1] = src[1]; - dst[2] = src[0]; - dst[3] = src[3]; - dst += stride; - src += 4; - } + if(type == VERT_ARGB){ + for(uint32 i = 0; i < numVertices; i++){ + dst[0] = src[2]; + dst[1] = src[1]; + dst[2] = src[0]; + dst[3] = src[3]; + if(dst[3] != 0xFF) + hasAlpha = 1; + dst += stride; + src += 4; + } + }else if(type == VERT_RGBA){ + for(uint32 i = 0; i < numVertices; i++){ + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + if(dst[3] != 0xFF) + hasAlpha = 1; + dst += stride; + src += 4; + } + }else + assert(0 && "unsupported color type"); return hasAlpha; } diff --git a/src/plugins.cpp b/src/plugins.cpp index a23ae18..4bcdc95 100644 --- a/src/plugins.cpp +++ b/src/plugins.cpp @@ -35,10 +35,10 @@ HAnimHierarchy::create(int32 numNodes, int32 *nodeFlags, int32 *nodeIDs, int32 f hier->numNodes = numNodes; hier->flags = flags; hier->maxInterpKeyFrameSize = maxKeySize; - hier->parentFrame = NULL; + hier->parentFrame = nil; hier->parentHierarchy = hier; if(hier->flags & 2) - hier->matrices = hier->matricesUnaligned = NULL; + hier->matrices = hier->matricesUnaligned = nil; else{ hier->matricesUnaligned = (float*) new uint8[hier->numNodes*64 + 15]; @@ -50,7 +50,7 @@ HAnimHierarchy::create(int32 numNodes, int32 *nodeFlags, int32 *nodeIDs, int32 f hier->nodeInfo[i].id = nodeIDs[i]; hier->nodeInfo[i].index = i; hier->nodeInfo[i].flags = nodeFlags[i]; - hier->nodeInfo[i].frame = NULL; + hier->nodeInfo[i].frame = nil; } return hier; } @@ -66,7 +66,7 @@ HAnimHierarchy::destroy(void) static Frame* findById(Frame *f, int32 id) { - if(f == NULL) return NULL; + if(f == nil) return nil; HAnimData *hanim = HAnimData::get(f); if(hanim->id >= 0 && hanim->id == id) return f; Frame *ff = findById(f->next, id); @@ -107,7 +107,7 @@ HAnimHierarchy::get(Frame *f) HAnimHierarchy* HAnimHierarchy::find(Frame *f) { - if(f == NULL) return NULL; + if(f == nil) return nil; HAnimHierarchy *hier = HAnimHierarchy::get(f); if(hier) return hier; hier = HAnimHierarchy::find(f->next); @@ -126,7 +126,7 @@ createHAnim(void *object, int32 offset, int32) { HAnimData *hanim = PLUGINOFFSET(HAnimData, object, offset); hanim->id = -1; - hanim->hierarchy = NULL; + hanim->hierarchy = nil; return object; } @@ -137,7 +137,7 @@ destroyHAnim(void *object, int32 offset, int32) if(hanim->hierarchy) hanim->hierarchy->destroy(); hanim->id = -1; - hanim->hierarchy = NULL; + hanim->hierarchy = nil; return object; } @@ -148,7 +148,7 @@ copyHAnim(void *dst, void *src, int32 offset, int32) HAnimData *srchanim = PLUGINOFFSET(HAnimData, src, offset); dsthanim->id = srchanim->id; // TODO - dsthanim->hierarchy = NULL; + dsthanim->hierarchy = nil; return dst; } @@ -186,7 +186,7 @@ writeHAnim(Stream *stream, int32, void *object, int32 offset, int32) HAnimData *hanim = PLUGINOFFSET(HAnimData, object, offset); stream->writeI32(256); stream->writeI32(hanim->id); - if(hanim->hierarchy == NULL){ + if(hanim->hierarchy == nil){ stream->writeI32(0); return stream; } @@ -207,7 +207,7 @@ getSizeHAnim(void *object, int32 offset, int32) { HAnimData *hanim = PLUGINOFFSET(HAnimData, object, offset); if(!hAnimDoStream || - version >= 0x35000 && hanim->id == -1 && hanim->hierarchy == NULL) + version >= 0x35000 && hanim->id == -1 && hanim->hierarchy == nil) return 0; if(hanim->hierarchy) return 12 + 8 + hanim->hierarchy->numNodes*12; @@ -287,14 +287,14 @@ readMesh(Stream *stream, int32 len, void *object, int32, int32) geo->meshHeader->mesh = new Mesh[geo->meshHeader->numMeshes]; Mesh *mesh = geo->meshHeader->mesh; bool hasData = len > 12+geo->meshHeader->numMeshes*8; - uint16 *p = NULL; + uint16 *p = nil; if(!(geo->geoflags & Geometry::NATIVE) || hasData) p = new uint16[geo->meshHeader->totalIndices]; for(uint32 i = 0; i < geo->meshHeader->numMeshes; i++){ stream->read(buf, 8); mesh->numIndices = buf[0]; mesh->material = geo->materialList[buf[1]]; - mesh->indices = NULL; + mesh->indices = nil; if(geo->geoflags & Geometry::NATIVE){ // OpenGL stores uint16 indices here if(hasData){ @@ -339,7 +339,7 @@ writeMesh(Stream *stream, int32, void *object, int32, int32) geo->numMaterials); stream->write(buf, 8); if(geo->geoflags & Geometry::NATIVE){ - assert(geo->instData != NULL); + assert(geo->instData != nil); if(geo->instData->platform == PLATFORM_WDGL) stream->write(mesh->indices, mesh->numIndices*2); @@ -363,11 +363,11 @@ static int32 getSizeMesh(void *object, int32, int32) { Geometry *geo = (Geometry*)object; - if(geo->meshHeader == NULL) + if(geo->meshHeader == nil) return -1; int32 size = 12 + geo->meshHeader->numMeshes*8; if(geo->geoflags & Geometry::NATIVE){ - assert(geo->instData != NULL); + assert(geo->instData != nil); if(geo->instData->platform == PLATFORM_WDGL) size += geo->meshHeader->totalIndices*2; }else{ @@ -379,7 +379,7 @@ getSizeMesh(void *object, int32, int32) void registerMeshPlugin(void) { - Geometry::registerPlugin(0, 0x50E, NULL, NULL, NULL); + Geometry::registerPlugin(0, 0x50E, nil, nil, nil); Geometry::registerPluginStream(0x50E, readMesh, writeMesh, getSizeMesh); } @@ -408,7 +408,7 @@ static void* destroyNativeData(void *object, int32 offset, int32 size) { Geometry *geometry = (Geometry*)object; - if(geometry->instData == NULL) + if(geometry->instData == nil) return object; if(geometry->instData->platform == PLATFORM_PS2) return ps2::destroyNativeData(object, offset, size); @@ -460,7 +460,7 @@ static Stream* writeNativeData(Stream *stream, int32 len, void *object, int32 o, int32 s) { Geometry *geometry = (Geometry*)object; - if(geometry->instData == NULL) + if(geometry->instData == nil) return stream; if(geometry->instData->platform == PLATFORM_PS2) return ps2::writeNativeData(stream, len, object, o, s); @@ -479,7 +479,7 @@ static int32 getSizeNativeData(void *object, int32 offset, int32 size) { Geometry *geometry = (Geometry*)object; - if(geometry->instData == NULL) + if(geometry->instData == nil) return 0; if(geometry->instData->platform == PLATFORM_PS2) return ps2::getSizeNativeData(object, offset, size); @@ -498,7 +498,7 @@ void registerNativeDataPlugin(void) { Geometry::registerPlugin(0, ID_NATIVEDATA, - NULL, destroyNativeData, NULL); + nil, destroyNativeData, nil); Geometry::registerPluginStream(ID_NATIVEDATA, readNativeData, writeNativeData, @@ -509,12 +509,12 @@ registerNativeDataPlugin(void) // Skin // -SkinGlobals skinGlobals = { 0, { NULL } }; +SkinGlobals skinGlobals = { 0, { nil } }; static void* createSkin(void *object, int32 offset, int32) { - *PLUGINOFFSET(Skin*, object, offset) = NULL; + *PLUGINOFFSET(Skin*, object, offset) = nil; return object; } @@ -534,10 +534,10 @@ static void* copySkin(void *dst, void *src, int32 offset, int32) { Skin *srcskin = *PLUGINOFFSET(Skin*, src, offset); - if(srcskin == NULL) + if(srcskin == nil) return dst; Geometry *geometry = (Geometry*)src; - assert(geometry->instData == NULL); + assert(geometry->instData == nil); assert(((Geometry*)src)->numVertices == ((Geometry*)dst)->numVertices); Skin *dstskin = new Skin; *PLUGINOFFSET(Skin*, dst, offset) = dstskin; @@ -695,7 +695,7 @@ getSizeSkin(void *object, int32 offset, int32) } Skin *skin = *PLUGINOFFSET(Skin*, object, offset); - if(skin == NULL) + if(skin == nil) return -1; int32 size = 4 + geometry->numVertices*(16+4) + @@ -717,7 +717,7 @@ skinRights(void *object, int32, int32, uint32) void registerSkinPlugin(void) { - ObjPipeline *defpipe = new ObjPipeline(PLATFORM_NULL); + ObjPipeline *defpipe = new ObjPipeline(PLATFORM_nil); defpipe->pluginID = ID_SKIN; defpipe->pluginData = 1; for(uint i = 0; i < nelem(skinGlobals.pipelines); i++) @@ -739,7 +739,7 @@ registerSkinPlugin(void) copySkin); Geometry::registerPluginStream(ID_SKIN, readSkin, writeSkin, getSizeSkin); - Atomic::registerPlugin(0, ID_SKIN, NULL, NULL, NULL); + Atomic::registerPlugin(0, ID_SKIN, nil, nil, nil); Atomic::setStreamRightsCallback(ID_SKIN, skinRights); } @@ -754,30 +754,30 @@ Skin::init(int32 numBones, int32 numUsedBones, int32 numVertices) this->data = new uint8[size]; uint8 *p = this->data; - this->usedBones = NULL; + this->usedBones = nil; if(this->numUsedBones){ this->usedBones = p; p += this->numUsedBones; } p = (uint8*)(((uintptr)p + 0xF) & ~0xF); - this->inverseMatrices = NULL; + this->inverseMatrices = nil; if(this->numBones){ this->inverseMatrices = (float*)p; p += 64*this->numBones; } - this->indices = NULL; + this->indices = nil; if(numVertices){ this->indices = p; p += 4*numVertices; } - this->weights = NULL; + this->weights = nil; if(numVertices) this->weights = (float*)p; - this->platformData = NULL; + this->platformData = nil; } void @@ -871,7 +871,7 @@ getSizeAtomicMatFX(void *object, int32 offset, int32) // Material -MatFXGlobals matFXGlobals = { 0, 0, { NULL } }; +MatFXGlobals matFXGlobals = { 0, 0, { nil } }; // TODO: Frames and Matrices? static void @@ -1003,7 +1003,7 @@ MatFX::setDualDestBlend(int32 blend) static void* createMaterialMatFX(void *object, int32 offset, int32) { - *PLUGINOFFSET(MatFX*, object, offset) = NULL; + *PLUGINOFFSET(MatFX*, object, offset) = nil; return object; } @@ -1022,7 +1022,7 @@ static void* copyMaterialMatFX(void *dst, void *src, int32 offset, int32) { MatFX *srcfx = *PLUGINOFFSET(MatFX*, src, offset); - if(srcfx == NULL) + if(srcfx == nil) return dst; MatFX *dstfx = new MatFX; *PLUGINOFFSET(MatFX*, dst, offset) = dstfx; @@ -1068,10 +1068,10 @@ readMaterialMatFX(Stream *stream, int32, void *object, int32 offset, int32) switch(type){ case MatFX::BUMPMAP: coefficient = stream->readF32(); - bumpedTex = tex = NULL; + bumpedTex = tex = nil; if(stream->readI32()){ if(!findChunk(stream, ID_TEXTURE, - NULL, NULL)){ + nil, nil)){ RWERROR((ERR_CHUNK, "TEXTURE")); return nil; } @@ -1079,7 +1079,7 @@ readMaterialMatFX(Stream *stream, int32, void *object, int32 offset, int32) } if(stream->readI32()){ if(!findChunk(stream, ID_TEXTURE, - NULL, NULL)){ + nil, nil)){ RWERROR((ERR_CHUNK, "TEXTURE")); return nil; } @@ -1095,10 +1095,10 @@ readMaterialMatFX(Stream *stream, int32, void *object, int32 offset, int32) case MatFX::ENVMAP: coefficient = stream->readF32(); fbAlpha = stream->readI32(); - tex = NULL; + tex = nil; if(stream->readI32()){ if(!findChunk(stream, ID_TEXTURE, - NULL, NULL)){ + nil, nil)){ RWERROR((ERR_CHUNK, "TEXTURE")); return nil; } @@ -1114,10 +1114,10 @@ readMaterialMatFX(Stream *stream, int32, void *object, int32 offset, int32) case MatFX::DUAL: srcBlend = stream->readI32(); dstBlend = stream->readI32(); - tex = NULL; + tex = nil; if(stream->readI32()){ if(!findChunk(stream, ID_TEXTURE, - NULL, NULL)){ + nil, nil)){ RWERROR((ERR_CHUNK, "TEXTURE")); return nil; } @@ -1145,10 +1145,10 @@ writeMaterialMatFX(Stream *stream, int32, void *object, int32 offset, int32) switch(matfx->fx[i].type){ case MatFX::BUMPMAP: stream->writeF32(matfx->fx[i].bump.coefficient); - stream->writeI32(matfx->fx[i].bump.bumpedTex != NULL); + stream->writeI32(matfx->fx[i].bump.bumpedTex != nil); if(matfx->fx[i].bump.bumpedTex) matfx->fx[i].bump.bumpedTex->streamWrite(stream); - stream->writeI32(matfx->fx[i].bump.tex != NULL); + stream->writeI32(matfx->fx[i].bump.tex != nil); if(matfx->fx[i].bump.tex) matfx->fx[i].bump.tex->streamWrite(stream); break; @@ -1156,7 +1156,7 @@ writeMaterialMatFX(Stream *stream, int32, void *object, int32 offset, int32) case MatFX::ENVMAP: stream->writeF32(matfx->fx[i].env.coefficient); stream->writeI32(matfx->fx[i].env.fbAlpha); - stream->writeI32(matfx->fx[i].env.tex != NULL); + stream->writeI32(matfx->fx[i].env.tex != nil); if(matfx->fx[i].env.tex) matfx->fx[i].env.tex->streamWrite(stream); break; @@ -1164,7 +1164,7 @@ writeMaterialMatFX(Stream *stream, int32, void *object, int32 offset, int32) case MatFX::DUAL: stream->writeI32(matfx->fx[i].dual.srcBlend); stream->writeI32(matfx->fx[i].dual.dstBlend); - stream->writeI32(matfx->fx[i].dual.tex != NULL); + stream->writeI32(matfx->fx[i].dual.tex != nil); if(matfx->fx[i].dual.tex) matfx->fx[i].dual.tex->streamWrite(stream); break; @@ -1177,7 +1177,7 @@ static int32 getSizeMaterialMatFX(void *object, int32 offset, int32) { MatFX *matfx = *PLUGINOFFSET(MatFX*, object, offset); - if(matfx == NULL) + if(matfx == nil) return -1; int32 size = 4 + 4 + 4; @@ -1220,7 +1220,7 @@ MatFX::enableEffects(Atomic *atomic) void registerMatFXPlugin(void) { - ObjPipeline *defpipe = new ObjPipeline(PLATFORM_NULL); + ObjPipeline *defpipe = new ObjPipeline(PLATFORM_nil); defpipe->pluginID = 0; //ID_MATFX; defpipe->pluginData = 0; for(uint i = 0; i < nelem(matFXGlobals.pipelines); i++) @@ -1238,7 +1238,7 @@ registerMatFXPlugin(void) matFXGlobals.atomicOffset = Atomic::registerPlugin(sizeof(int32), ID_MATFX, - createAtomicMatFX, NULL, copyAtomicMatFX); + createAtomicMatFX, nil, copyAtomicMatFX); Atomic::registerPluginStream(ID_MATFX, readAtomicMatFX, writeAtomicMatFX, diff --git a/src/ps2.cpp b/src/ps2.cpp index 28ccc4f..a2ea4f7 100644 --- a/src/ps2.cpp +++ b/src/ps2.cpp @@ -21,7 +21,7 @@ namespace ps2 { void initializePlatform(void) { - engine[PLATFORM_PS2].defaultPipeline = makeDefaultPipeline(); + driver[PLATFORM_PS2].defaultPipeline = makeDefaultPipeline(); } ObjPipeline *defaultObjPipe; diff --git a/src/ps2raster.cpp b/src/ps2raster.cpp index 2802894..4da707a 100644 --- a/src/ps2raster.cpp +++ b/src/ps2raster.cpp @@ -484,11 +484,11 @@ registerNativeRaster(void) createNativeRaster, destroyNativeRaster, copyNativeRaster); - engine[PLATFORM_PS2].rasterNativeOffset = nativeRasterOffset; - engine[PLATFORM_PS2].rasterCreate = rasterCreate; - engine[PLATFORM_PS2].rasterLock = rasterLock; - engine[PLATFORM_PS2].rasterUnlock = rasterUnlock; - engine[PLATFORM_PS2].rasterNumLevels = rasterNumLevels; + driver[PLATFORM_PS2].rasterNativeOffset = nativeRasterOffset; + driver[PLATFORM_PS2].rasterCreate = rasterCreate; + driver[PLATFORM_PS2].rasterLock = rasterLock; + driver[PLATFORM_PS2].rasterUnlock = rasterUnlock; + driver[PLATFORM_PS2].rasterNumLevels = rasterNumLevels; Texture::registerPlugin(0, ID_SKYMIPMAP, nil, nil, nil); Texture::registerPluginStream(ID_SKYMIPMAP, readMipmap, writeMipmap, getSizeMipmap); diff --git a/src/rwbase.cpp b/src/rwbase.cpp index 3a936f2..3aad377 100644 --- a/src/rwbase.cpp +++ b/src/rwbase.cpp @@ -18,8 +18,6 @@ #include "rwd3d9.h" #include "rwwdgl.h" -using namespace std; - namespace rw { #define PLUGIN_ID 0 @@ -33,9 +31,9 @@ int32 build = 0xFFFF; #elif RW_D3D9 int32 platform = PLATFORM_D3D9; #else - int32 platform = PLATFORM_NULL; + int32 platform = PLATFORM_nil; #endif -char *debugFile = NULL; +char *debugFile = nil; // TODO: comparison tolerances @@ -55,15 +53,18 @@ static Matrix3 identMat3 = { void initialize(void) { - ObjPipeline *defpipe = new ObjPipeline(PLATFORM_NULL); + ObjPipeline *defpipe = new ObjPipeline(PLATFORM_nil); for(uint i = 0; i < NUM_PLATFORMS; i++){ - engine[i].defaultPipeline = defpipe; + driver[i].defaultPipeline = defpipe; - engine[i].rasterCreate = null::rasterCreate; - engine[i].rasterLock = null::rasterLock; - engine[i].rasterUnlock = null::rasterUnlock; - engine[i].rasterNumLevels = null::rasterNumLevels; - engine[i].rasterFromImage = null::rasterFromImage; + driver[i].beginUpdate = null::beginUpdate; + driver[i].endUpdate = null::endUpdate; + + driver[i].rasterCreate = null::rasterCreate; + driver[i].rasterLock = null::rasterLock; + driver[i].rasterUnlock = null::rasterUnlock; + driver[i].rasterNumLevels = null::rasterNumLevels; + driver[i].rasterFromImage = null::rasterFromImage; } @@ -668,9 +669,9 @@ StreamFile* StreamFile::open(const char *path, const char *mode) { this->file = fopen(path, mode); - if(this->file == NULL){ + if(this->file == nil){ RWERROR((ERR_FILE, path)); - return NULL; + return nil; } return this; } @@ -732,7 +733,7 @@ readChunkHeaderInfo(Stream *s, ChunkHeaderInfo *header) s->read(&buf, 12); if(s->eof()) return false; - assert(header != NULL); + assert(header != nil); header->type = buf.type; header->length = buf.size; header->version = libraryIDUnpackVersion(buf.id); @@ -773,7 +774,7 @@ uint8* getFileContents(char *name, uint32 *len) { FILE *cf = fopen(name, "rb"); - assert(cf != NULL); + assert(cf != nil); fseek(cf, 0, SEEK_END); *len = ftell(cf); fseek(cf, 0, SEEK_SET); diff --git a/src/rwbase.h b/src/rwbase.h index d8ea4d9..261847b 100644 --- a/src/rwbase.h +++ b/src/rwbase.h @@ -227,7 +227,7 @@ public: enum Platform { - PLATFORM_NULL = 0, + PLATFORM_nil = 0, // D3D7 PLATFORM_GL = 2, // MAC diff --git a/src/rwengine.h b/src/rwengine.h index 9afae03..742563c 100644 --- a/src/rwengine.h +++ b/src/rwengine.h @@ -1,10 +1,23 @@ namespace rw { +// TODO: move more stuff into this + struct Engine +{ + Camera *currentCamera; +}; + +extern Engine engine; + + +struct Driver { ObjPipeline *defaultPipeline; int32 rasterNativeOffset; + void (*beginUpdate)(Camera*); + void (*endUpdate)(Camera*); + void (*rasterCreate)(Raster*); uint8 *(*rasterLock)(Raster*, int32 level); void (*rasterUnlock)(Raster*, int32 level); @@ -12,9 +25,13 @@ struct Engine void (*rasterFromImage)(Raster*, Image*); }; -extern Engine engine[NUM_PLATFORMS]; +extern Driver driver[NUM_PLATFORMS]; +#define DRIVER driver[rw::platform] namespace null { + void beginUpdate(Camera*); + void endUpdate(Camera*); + void rasterCreate(Raster*); uint8 *rasterLock(Raster*, int32 level); void rasterUnlock(Raster*, int32 level); diff --git a/src/rwobjects.h b/src/rwobjects.h index 60d32b6..9b5d090 100644 --- a/src/rwobjects.h +++ b/src/rwobjects.h @@ -7,8 +7,8 @@ struct LLLink LLLink *next; LLLink *prev; void init(void){ - this->next = NULL; - this->prev = NULL; + this->next = nil; + this->prev = nil; } void remove(void){ this->prev->next = this->next; @@ -21,7 +21,7 @@ struct LLLink // Have to be careful since the link might be deleted. #define FORLIST(_link, _list) \ - for(rw::LLLink *_next = NULL, *_link = (_list).link.next; \ + for(rw::LLLink *_next = nil, *_link = (_list).link.next; \ _next = (_link)->next, (_link) != (_list).end(); \ (_link) = _next) @@ -71,14 +71,14 @@ struct Object this->subType = subType; this->flags = 0; this->privateFlags = 0; - this->parent = NULL; + this->parent = nil; } void copy(Object *o){ this->type = o->type; this->subType = o->subType; this->flags = o->flags; this->privateFlags = o->privateFlags; - this->parent = NULL; + this->parent = nil; } }; @@ -86,10 +86,12 @@ struct Frame : PluginBase { typedef Frame *(*Callback)(Frame *f, void *data); enum { ID = 0 }; - enum { // private flags - HIERARCHYSYNCLTM = 0x01, - HIERARCHYSYNCOBJ = 0x02, + enum { // private flags + // The hierarchy has unsynched frames + HIERARCHYSYNCLTM = 0x01, // LTM not synched + HIERARCHYSYNCOBJ = 0x02, // attached objects not synched HIERARCHYSYNC = HIERARCHYSYNCLTM | HIERARCHYSYNCOBJ, + // This frame is not synched SUBTREESYNCLTM = 0x04, SUBTREESYNCOBJ = 0x08, SUBTREESYNC = SUBTREESYNCLTM | SUBTREESYNCOBJ, @@ -107,8 +109,6 @@ struct Frame : PluginBase Frame *next; Frame *root; - static LinkList dirtyList; - static Frame *create(void); Frame *cloneHierarchy(void); void destroy(void); @@ -124,10 +124,15 @@ struct Frame : PluginBase Matrix *getLTM(void); void updateObjects(void); + void syncHierarchyLTM(void); void setHierarchyRoot(Frame *root); Frame *cloneAndLink(Frame *clonedroot); void purgeClone(void); + + + static LinkList dirtyList; + static void syncDirty(void); }; struct FrameList_ @@ -145,6 +150,8 @@ struct ObjectWithFrame { Object object; LLLink inFrame; + void (*syncCB)(ObjectWithFrame*); + void setFrame(Frame *f){ if(this->object.parent) this->inFrame.remove(); @@ -152,6 +159,7 @@ struct ObjectWithFrame if(f) f->objectList.add(&this->inFrame); } + void sync(void){ this->syncCB(this); } static ObjectWithFrame *fromFrame(LLLink *lnk){ return LLLinkGetData(lnk, ObjectWithFrame, inFrame); } @@ -380,7 +388,7 @@ struct Geometry : PluginBase void calculateBoundingSphere(void); bool32 hasColoredMaterial(void); void allocateData(void); - void generateTriangles(int8 *adc = NULL); + void generateTriangles(int8 *adc = nil); void buildMeshes(void); void removeUnusedMaterials(void); @@ -503,6 +511,9 @@ struct Camera : PluginBase Clump *clump; LLLink inClump; + void (*beginUpdateCB)(Camera*); + void (*endUpdateCB)(Camera*); + static Camera *create(void); Camera *clone(void); void destroy(void); @@ -510,6 +521,8 @@ struct Camera : PluginBase Frame *getFrame(void){ return (Frame*)this->object.object.parent; } static Camera *fromClump(LLLink *lnk){ return LLLinkGetData(lnk, Camera, inClump); } + void beginUpdate(void) { this->beginUpdateCB(this); } + void endUpdate(void) { this->endUpdateCB(this); } static Camera *streamRead(Stream *stream); bool streamWrite(Stream *stream); uint32 streamGetSize(void); diff --git a/src/rwpipeline.h b/src/rwpipeline.h index 076395a..870c5bc 100644 --- a/src/rwpipeline.h +++ b/src/rwpipeline.h @@ -42,6 +42,7 @@ enum { VERT_FLOAT2, VERT_FLOAT3, VERT_ARGB, + VERT_RGBA, VERT_COMPNORM }; diff --git a/src/rwplg.h b/src/rwplg.h index 5682265..00b4a58 100644 --- a/src/rwplg.h +++ b/src/rwplg.h @@ -86,7 +86,7 @@ PluginBase::streamReadPlugins(Stream *stream) { int32 length; ChunkHeaderInfo header; - if(!findChunk(stream, ID_EXTENSION, (uint32*)&length, NULL)) + if(!findChunk(stream, ID_EXTENSION, (uint32*)&length, nil)) return false; while(length > 0){ if(!readChunkHeaderInfo(stream, &header)) @@ -112,7 +112,7 @@ PluginBase::streamWritePlugins(Stream *stream) int size = this->streamGetPluginSize(); writeChunkHeader(stream, ID_EXTENSION, size); for(Plugin *p = this->s_plugins; p; p = p->next){ - if(p->getSize == NULL || + if(p->getSize == nil || (size = p->getSize(this, p->offset, p->size)) <= 0) continue; writeChunkHeader(stream, p->id, size); @@ -157,16 +157,16 @@ PluginBase::registerPlugin(int32 size, uint32 id, p->constructor = ctor; p->copy = cctor; p->destructor = dtor; - p->read = NULL; - p->write = NULL; - p->getSize = NULL; - p->rightsCallback = NULL; + p->read = nil; + p->write = nil; + p->getSize = nil; + p->rightsCallback = nil; Plugin **next; for(next = &s_plugins; *next; next = &(*next)->next) ; *next = p; - p->next = NULL; + p->next = nil; return p->offset; } @@ -208,7 +208,7 @@ template void* PluginBase::operator new(size_t) { abort(); - return NULL; + return nil; } template void diff --git a/src/wdgl.cpp b/src/wdgl.cpp index 1f14602..628bc8b 100644 --- a/src/wdgl.cpp +++ b/src/wdgl.cpp @@ -24,7 +24,7 @@ namespace wdgl { void initializePlatform(void) { - engine[PLATFORM_WDGL].defaultPipeline = makeDefaultPipeline(); + driver[PLATFORM_WDGL].defaultPipeline = makeDefaultPipeline(); } @@ -223,7 +223,7 @@ destroyNativeData(void *object, int32, int32) return object; InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - geometry->instData = NULL; + geometry->instData = nil; // TODO: delete ibo and vbo delete[] header->attribs; delete[] header->data; @@ -279,7 +279,7 @@ void registerNativeDataPlugin(void) { Geometry::registerPlugin(0, ID_NATIVEDATA, - NULL, destroyNativeData, NULL); + nil, destroyNativeData, nil); Geometry::registerPluginStream(ID_NATIVEDATA, readNativeData, writeNativeData, @@ -290,7 +290,7 @@ void printPipeinfo(Atomic *a) { Geometry *g = a->geometry; - if(g->instData == NULL || g->instData->platform != PLATFORM_WDGL) + if(g->instData == nil || g->instData->platform != PLATFORM_WDGL) return; int32 plgid = 0; if(a->pipeline) @@ -436,7 +436,7 @@ uninstance(rw::ObjPipeline *rwpipe, Atomic *atomic) Geometry *geo = atomic->geometry; if((geo->geoflags & Geometry::NATIVE) == 0) return; - assert(geo->instData != NULL); + assert(geo->instData != nil); assert(geo->instData->platform == PLATFORM_WDGL); geo->geoflags &= ~Geometry::NATIVE; geo->allocateData(); @@ -507,8 +507,8 @@ ObjPipeline::ObjPipeline(uint32 platform) this->numCustomAttribs = 0; this->impl.instance = wdgl::instance; this->impl.uninstance = wdgl::uninstance; - this->instanceCB = NULL; - this->uninstanceCB = NULL; + this->instanceCB = nil; + this->uninstanceCB = nil; } ObjPipeline* @@ -558,7 +558,7 @@ int32 getSizeNativeSkin(void *object, int32 offset) { Skin *skin = *PLUGINOFFSET(Skin*, object, offset); - if(skin == NULL) + if(skin == nil) return -1; int32 size = 12 + 4 + 4 + skin->numBones*64; return size; @@ -590,7 +590,7 @@ skinInstanceCB(Geometry *g, int32 i, uint32 offset) header->data = new uint8[header->dataSize]; Skin *skin = *PLUGINOFFSET(Skin*, g, skinGlobals.offset); - if(skin == NULL) + if(skin == nil) return 8; a = &header->attribs[i]; @@ -618,7 +618,7 @@ skinUninstanceCB(Geometry *geo) InstanceDataHeader *header = (InstanceDataHeader*)geo->instData; Skin *skin = *PLUGINOFFSET(Skin*, geo, skinGlobals.offset); - if(skin == NULL) + if(skin == nil) return; uint8 *data = skin->data; diff --git a/src/xbox.cpp b/src/xbox.cpp index 6266010..f0c1699 100644 --- a/src/xbox.cpp +++ b/src/xbox.cpp @@ -20,7 +20,7 @@ namespace xbox { void initializePlatform(void) { - engine[PLATFORM_XBOX].defaultPipeline = makeDefaultPipeline(); + driver[PLATFORM_XBOX].defaultPipeline = makeDefaultPipeline(); } void* @@ -32,7 +32,7 @@ destroyNativeData(void *object, int32, int32) return object; InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData; - geometry->instData = NULL; + geometry->instData = nil; delete[] (uint8*)header->vertexBuffer; delete[] header->begin; delete[] header->data; @@ -156,7 +156,7 @@ void registerNativeDataPlugin(void) { Geometry::registerPlugin(0, ID_NATIVEDATA, - NULL, destroyNativeData, NULL); + nil, destroyNativeData, nil); Geometry::registerPluginStream(ID_NATIVEDATA, readNativeData, writeNativeData, @@ -195,7 +195,7 @@ instance(rw::ObjPipeline *rwpipe, Atomic *atomic) header->vertexAlpha = 0; // set by the instanceCB header->stride = 0; - header->vertexBuffer = NULL; + header->vertexBuffer = nil; InstanceData *inst = new InstanceData[header->numMeshes]; header->begin = inst; @@ -225,7 +225,7 @@ uninstance(rw::ObjPipeline *rwpipe, Atomic *atomic) Geometry *geo = atomic->geometry; if((geo->geoflags & Geometry::NATIVE) == 0) return; - assert(geo->instData != NULL); + assert(geo->instData != nil); assert(geo->instData->platform == PLATFORM_XBOX); geo->geoflags &= ~Geometry::NATIVE; geo->allocateData(); @@ -251,8 +251,8 @@ ObjPipeline::ObjPipeline(uint32 platform) { this->impl.instance = xbox::instance; this->impl.uninstance = xbox::uninstance; - this->instanceCB = NULL; - this->uninstanceCB = NULL; + this->instanceCB = nil; + this->uninstanceCB = nil; } @@ -435,9 +435,9 @@ getSizeNativeSkin(void *object, int32 offset) { Geometry *geometry = (Geometry*)object; Skin *skin = *PLUGINOFFSET(Skin*, object, offset); - if(skin == NULL) + if(skin == nil) return -1; - if(skin->platformData == NULL) + if(skin->platformData == nil) return -1; NativeSkin *natskin = (NativeSkin*)skin->platformData; return 12 + 8 + 2*256*4 + 4*4 + @@ -450,7 +450,7 @@ skinInstanceCB(Geometry *geo, InstanceDataHeader *header) defaultInstanceCB(geo, header); Skin *skin = *PLUGINOFFSET(Skin*, geo, skinGlobals.offset); - if(skin == NULL) + if(skin == nil) return; NativeSkin *natskin = new NativeSkin; skin->platformData = natskin; @@ -504,7 +504,7 @@ skinUninstanceCB(Geometry *geo, InstanceDataHeader *header) defaultUninstanceCB(geo, header); Skin *skin = *PLUGINOFFSET(Skin*, geo, skinGlobals.offset); - if(skin == NULL) + if(skin == nil) return; NativeSkin *natskin = (NativeSkin*)skin->platformData; @@ -660,7 +660,7 @@ void registerVertexFormatPlugin(void) { vertexFmtOffset = Geometry::registerPlugin(sizeof(uint32), ID_VERTEXFMT, - createVertexFmt, NULL, copyVertexFmt); + createVertexFmt, nil, copyVertexFmt); Geometry::registerPluginStream(ID_VERTEXFMT, readVertexFmt, writeVertexFmt, @@ -872,8 +872,8 @@ static void* createNativeRaster(void *object, int32 offset, int32) { XboxRaster *raster = PLUGINOFFSET(XboxRaster, object, offset); - raster->texture = NULL; - raster->palette = NULL; + raster->texture = nil; + raster->palette = nil; raster->format = 0; raster->hasAlpha = 0; raster->unknownFlag = 0; @@ -891,8 +891,8 @@ static void* copyNativeRaster(void *dst, void *, int32 offset, int32) { XboxRaster *raster = PLUGINOFFSET(XboxRaster, dst, offset); - raster->texture = NULL; - raster->palette = NULL; + raster->texture = nil; + raster->palette = nil; raster->format = 0; raster->hasAlpha = 0; raster->unknownFlag = 0; @@ -907,11 +907,11 @@ registerNativeRaster(void) createNativeRaster, destroyNativeRaster, copyNativeRaster); - engine[PLATFORM_XBOX].rasterNativeOffset = nativeRasterOffset; - engine[PLATFORM_XBOX].rasterCreate = rasterCreate; - engine[PLATFORM_XBOX].rasterLock = rasterLock; - engine[PLATFORM_XBOX].rasterUnlock = rasterUnlock; - engine[PLATFORM_XBOX].rasterNumLevels = rasterNumLevels; + driver[PLATFORM_XBOX].rasterNativeOffset = nativeRasterOffset; + driver[PLATFORM_XBOX].rasterCreate = rasterCreate; + driver[PLATFORM_XBOX].rasterLock = rasterLock; + driver[PLATFORM_XBOX].rasterUnlock = rasterUnlock; + driver[PLATFORM_XBOX].rasterNumLevels = rasterNumLevels; } Texture*