From efd41771a0c925871313acd9200cf44392d1a777 Mon Sep 17 00:00:00 2001 From: aap Date: Mon, 11 Jan 2016 11:23:26 +0100 Subject: [PATCH] started implementing linked lists --- librw.sln | 3 + src/clump.cpp | 56 ++++++++++------- src/geometry.cpp | 1 + src/image.cpp | 1 + src/rwobjects.h | 96 +++++++++++++++++++++++++---- tools/dffwrite/dffwrite.cpp | 57 +---------------- tools/dumprwtree/dumprwtree.vcxproj | 1 + tools/rsltest/rsl.cpp | 45 +++++--------- tools/rsltest/rsl.h | 45 +++++++++----- tools/rsltest/rsltest.cpp | 33 +++++----- 10 files changed, 188 insertions(+), 150 deletions(-) diff --git a/librw.sln b/librw.sln index 521ed17..440aafe 100644 --- a/librw.sln +++ b/librw.sln @@ -58,6 +58,7 @@ Global {30552BB0-3B19-49A4-ABF4-87CF68AF9E38}.Release|x64.ActiveCfg = Release|x64 {30552BB0-3B19-49A4-ABF4-87CF68AF9E38}.Release|x64.Build.0 = Release|x64 {B487F101-0C2B-4F99-A1E0-B0B0C0F3FE7E}.Debug - null|Win32.ActiveCfg = Debug - null|Win32 + {B487F101-0C2B-4F99-A1E0-B0B0C0F3FE7E}.Debug - null|Win32.Build.0 = Debug - null|Win32 {B487F101-0C2B-4F99-A1E0-B0B0C0F3FE7E}.Debug - null|x64.ActiveCfg = Debug - null|x64 {B487F101-0C2B-4F99-A1E0-B0B0C0F3FE7E}.Debug|Win32.ActiveCfg = Debug|Win32 {B487F101-0C2B-4F99-A1E0-B0B0C0F3FE7E}.Debug|x64.ActiveCfg = Debug|x64 @@ -66,6 +67,7 @@ Global {B487F101-0C2B-4F99-A1E0-B0B0C0F3FE7E}.Release|Win32.Build.0 = Release|Win32 {B487F101-0C2B-4F99-A1E0-B0B0C0F3FE7E}.Release|x64.ActiveCfg = Release|x64 {85F56A7D-6EA2-4B9B-806A-87AF6C577FDF}.Debug - null|Win32.ActiveCfg = Debug - null|Win32 + {85F56A7D-6EA2-4B9B-806A-87AF6C577FDF}.Debug - null|Win32.Build.0 = Debug - null|Win32 {85F56A7D-6EA2-4B9B-806A-87AF6C577FDF}.Debug - null|x64.ActiveCfg = Debug - null|x64 {85F56A7D-6EA2-4B9B-806A-87AF6C577FDF}.Debug|Win32.ActiveCfg = Debug|Win32 {85F56A7D-6EA2-4B9B-806A-87AF6C577FDF}.Debug|x64.ActiveCfg = Debug|x64 @@ -92,6 +94,7 @@ Global {E5D477C8-4CAF-43BF-B7E3-6689503D469F}.Release|Win32.Build.0 = Release|Win32 {E5D477C8-4CAF-43BF-B7E3-6689503D469F}.Release|x64.ActiveCfg = Release|x64 {403C35A9-6D06-4261-B305-9ED000F00136}.Debug - null|Win32.ActiveCfg = Debug - null|Win32 + {403C35A9-6D06-4261-B305-9ED000F00136}.Debug - null|Win32.Build.0 = Debug - null|Win32 {403C35A9-6D06-4261-B305-9ED000F00136}.Debug - null|x64.ActiveCfg = Debug - null|x64 {403C35A9-6D06-4261-B305-9ED000F00136}.Debug|Win32.ActiveCfg = Debug|Win32 {403C35A9-6D06-4261-B305-9ED000F00136}.Debug|x64.ActiveCfg = Debug|x64 diff --git a/src/clump.cpp b/src/clump.cpp index 8697963..2af4982 100644 --- a/src/clump.cpp +++ b/src/clump.cpp @@ -21,7 +21,8 @@ namespace rw { Frame::Frame(void) { - this->parent = NULL; + this->object.init(0, 0); + this->objectList.init(); this->child = NULL; this->next = NULL; this->root = NULL; @@ -58,7 +59,7 @@ Frame::addChild(Frame *child) f->next = child; } child->next = NULL; - child->parent = this; + child->object.parent = this; child->root = this->root; return this; } @@ -66,7 +67,7 @@ Frame::addChild(Frame *child) Frame* Frame::removeChild(void) { - Frame *parent = (Frame*)this->parent; + Frame *parent = (Frame*)this->object.parent; if(parent->child == this) parent->child = this->next; else{ @@ -78,7 +79,7 @@ Frame::removeChild(void) found: f->next = f->next->next; } - this->parent = NULL; + this->object.parent = NULL; this->next = this->root = NULL; return this; } @@ -112,7 +113,7 @@ Frame::updateLTM(void) { if(!this->dirty) return; - Frame *parent = (Frame*)this->parent; + Frame *parent = (Frame*)this->object.parent; if(parent){ parent->updateLTM(); matrixMult(this->ltm, parent->ltm, this->matrix); @@ -163,6 +164,7 @@ makeFrameList(Frame *frame, Frame **flist) Clump::Clump(void) { + this->object.init(2, 0); this->numAtomics = 0; this->numLights = 0; this->numCameras = 0; @@ -206,7 +208,7 @@ Clump::streamRead(Stream *stream) Frame **frameList; int32 numFrames; clump->frameListStreamRead(stream, &frameList, &numFrames); - clump->parent = (void*)frameList[0]; + clump->object.parent = (void*)frameList[0]; Geometry **geometryList = 0; if(version >= 0x30400){ @@ -242,7 +244,7 @@ Clump::streamRead(Stream *stream) frm = stream->readI32(); assert(findChunk(stream, ID_LIGHT, NULL, NULL)); clump->lightList[i] = Light::streamRead(stream); - clump->lightList[i]->frame = frameList[frm]; + clump->lightList[i]->setFrame(frameList[frm]); clump->lightList[i]->clump = clump; } @@ -262,9 +264,9 @@ Clump::streamWrite(Stream *stream) writeChunkHeader(stream, ID_STRUCT, size); stream->write(buf, size); - int32 numFrames = ((Frame*)this->parent)->count(); + int32 numFrames = ((Frame*)this->object.parent)->count(); Frame **flist = new Frame*[numFrames]; - makeFrameList((Frame*)this->parent, flist); + makeFrameList((Frame*)this->object.parent, flist); this->frameListStreamWrite(stream, flist, numFrames); @@ -285,7 +287,7 @@ Clump::streamWrite(Stream *stream) for(int32 i = 0; i < this->numLights; i++){ Light *l = this->lightList[i]; - int frm = findPointer((void*)l->frame, (void**)flist,numFrames); + int frm = findPointer((void*)l->object.parent, (void**)flist,numFrames); if(frm < 0) return false; writeChunkHeader(stream, ID_STRUCT, 4); @@ -317,9 +319,9 @@ Clump::streamGetSize(void) size += 8; // numLights, numCameras // frame list - int32 numFrames = ((Frame*)this->parent)->count(); + int32 numFrames = ((Frame*)this->object.parent)->count(); size += 12 + 12 + 4 + numFrames*(sizeof(FrameStreamData)+12); - sizeCB((Frame*)this->parent, (void*)&size); + sizeCB((Frame*)this->object.parent, (void*)&size); if(rw::version >= 0x30400){ // geometry list @@ -409,7 +411,7 @@ Clump::frameListStreamWrite(Stream *stream, Frame **frameList, int32 numFrames) buf.pos[0] = f->matrix[12]; buf.pos[1] = f->matrix[13]; buf.pos[2] = f->matrix[14]; - buf.parent = findPointer((void*)f->parent, (void**)frameList, + buf.parent = findPointer((void*)f->object.parent, (void**)frameList, numFrames); buf.matflag = f->matflag; stream->write(&buf, sizeof(buf)); @@ -424,7 +426,7 @@ Clump::frameListStreamWrite(Stream *stream, Frame **frameList, int32 numFrames) Atomic::Atomic(void) { - this->frame = NULL; + this->object.init(1, 0); this->geometry = NULL; this->pipeline = NULL; constructPlugins(); @@ -453,7 +455,7 @@ Atomic::streamReadClump(Stream *stream, assert(findChunk(stream, ID_STRUCT, NULL, &version)); stream->read(buf, version < 0x30400 ? 12 : 16); Atomic *atomic = new Atomic; - atomic->frame = frameList[buf[0]]; + atomic->setFrame(frameList[buf[0]]); if(version < 0x30400){ assert(findChunk(stream, ID_GEOMETRY, NULL, NULL)); atomic->geometry = Geometry::streamRead(stream); @@ -476,7 +478,7 @@ Atomic::streamWriteClump(Stream *stream, Frame **frameList, int32 numFrames) return false; writeChunkHeader(stream, ID_ATOMIC, this->streamGetSize()); writeChunkHeader(stream, ID_STRUCT, rw::version < 0x30400 ? 12 : 16); - buf[0] = findPointer((void*)this->frame, (void**)frameList, numFrames); + buf[0] = findPointer((void*)this->object.parent, (void**)frameList, numFrames); if(version < 0x30400){ stream->write(buf, sizeof(int[3])); @@ -576,9 +578,18 @@ registerAtomicRightsPlugin(void) // Light // -Light::Light(void) +Light::Light(int32 type) { - this->frame = NULL; + this->object.init(3, type); + this->radius = 0.0f; + this->color[0] = 1.0f; + this->color[1] = 1.0f; + this->color[2] = 1.0f; + this->color[3] = 1.0f; + this->minusCosAngle = 1.0f; + this->object.privateFlags = 1; + this->object.flags = 1 | 2; + Clump *clump; constructPlugins(); } @@ -607,16 +618,15 @@ Light::streamRead(Stream *stream) { LightChunkData buf; assert(findChunk(stream, ID_STRUCT, NULL, NULL)); - Light *light = new Light; stream->read(&buf, sizeof(LightChunkData)); + Light *light = new Light(buf.type); light->radius = buf.radius; light->color[0] = buf.red; light->color[1] = buf.green; light->color[2] = buf.blue; light->color[3] = 1.0f; light->minusCosAngle = buf.minusCosAngle; - light->flags = (uint8)buf.flags; - light->subType = (uint8)buf.type; + light->object.flags = (uint8)buf.flags; light->streamReadPlugins(stream); return light; @@ -633,8 +643,8 @@ Light::streamWrite(Stream *stream) buf.green = this->color[1]; buf.blue = this->color[2]; buf.minusCosAngle = this->minusCosAngle; - buf.flags = this->flags; - buf.type = this->subType; + buf.flags = this->object.flags; + buf.type = this->object.subType; stream->write(&buf, sizeof(LightChunkData)); this->streamWritePlugins(stream); diff --git a/src/geometry.cpp b/src/geometry.cpp index 4348069..1542f85 100644 --- a/src/geometry.cpp +++ b/src/geometry.cpp @@ -17,6 +17,7 @@ namespace rw { Geometry::Geometry(int32 numVerts, int32 numTris, uint32 flags) { + this->object.init(8, 0); this->geoflags = flags & 0xFF00FFFF; this->numTexCoordSets = (flags & 0xFF0000) >> 16; if(this->numTexCoordSets == 0) diff --git a/src/image.cpp b/src/image.cpp index 3e1f273..1c034b8 100755 --- a/src/image.cpp +++ b/src/image.cpp @@ -31,6 +31,7 @@ TexDictionary *currentTexDictionary; TexDictionary::TexDictionary(void) { + this->object.init(6, 0); this->first = NULL; } diff --git a/src/rwobjects.h b/src/rwobjects.h index f5f9157..4b3c137 100644 --- a/src/rwobjects.h +++ b/src/rwobjects.h @@ -1,17 +1,66 @@ namespace rw { +struct LLLink +{ + LLLink *next; + LLLink *prev; + void init(void){ + this->next = NULL; + this->prev = NULL; + } + void remove(void){ + this->prev->next = this->next; + this->next->prev = this->prev; + } +}; + +#define LLLinkGetData(linkvar,type,entry) \ + ((type*)(((uint8*)(linkvar))-offsetof(type,entry))) + +struct LinkList +{ + LLLink link; + void init(void){ + this->link.next = &this->link; + this->link.prev = &this->link; + } + bool32 isEmpty(void){ + return this->link.next == &this->link; + } + void add(LLLink *link){ + link->next = this->link.next; + link->prev = &this->link; + this->link.next->prev = link; + this->link.next = link; + } + LLLink *end(void){ + return &this->link; + } +}; + struct Object { uint8 type; uint8 subType; uint8 flags; + uint8 privateFlags; void *parent; + + void init(uint8 type, uint8 subType){ + this->type = type; + this->subType = subType; + this->flags = 0; + this->privateFlags = 0; + this->parent = NULL; + } }; -// TODO: missing: list of attached objects -struct Frame : PluginBase, Object +struct Frame : PluginBase { typedef Frame *(*Callback)(Frame *f, void *data); + + Object object; + LinkList objectList; float32 matrix[16]; float32 ltm[16]; @@ -36,6 +85,18 @@ struct Frame : PluginBase, Object Frame **makeFrameList(Frame *frame, Frame **flist); +struct ObjectWithFrame : Object +{ + LLLink inFrame; + void setFrame(Frame *f){ + if(this->parent) + this->inFrame.remove(); + this->parent = f; + if(f) + f->objectList.add(&this->inFrame); + } +}; + struct HAnimKeyFrame { HAnimKeyFrame *prev; @@ -168,10 +229,11 @@ struct NativeRaster // TODO: link into texdict struct Texture : PluginBase { + Raster *raster; + // TODO: pointer to txd and link char name[32]; char mask[32]; uint32 filterAddressing; // VVVVUUUU FFFFFFFF - Raster *raster; int32 refCount; // temporary - pointer to next tex in dictionary @@ -319,9 +381,10 @@ struct InstanceDataHeader uint32 platform; }; -struct Geometry : PluginBase, Object +struct Geometry : PluginBase { - uint32 geoflags; + Object object; + uint32 geoflags; // TODO: rename int32 numTriangles; int32 numVertices; int32 numMorphTargets; @@ -333,6 +396,7 @@ struct Geometry : PluginBase, Object MorphTarget *morphTargets; + // TODO: struct int32 numMaterials; Material **materialList; @@ -399,25 +463,28 @@ void registerSkinPlugin(void); struct Clump; -struct Light : PluginBase, Object +struct Light : PluginBase { - Frame *frame; + ObjectWithFrame object; float32 radius; float32 color[4]; float32 minusCosAngle; + + // clump link handled by plugin in RW Clump *clump; - Light(void); + Light(int32 type); Light(Light *l); ~Light(void); + void setFrame(Frame *f) { this->object.setFrame(f); } static Light *streamRead(Stream *stream); bool streamWrite(Stream *stream); uint32 streamGetSize(void); }; -struct Atomic : PluginBase, Object +struct Atomic : PluginBase { - Frame *frame; + ObjectWithFrame object; Geometry *geometry; Clump *clump; ObjPipeline *pipeline; @@ -425,10 +492,11 @@ struct Atomic : PluginBase, Object Atomic(void); Atomic(Atomic *a); ~Atomic(void); + void setFrame(Frame *f) { this->object.setFrame(f); } static Atomic *streamReadClump(Stream *stream, - Frame **frameList, Geometry **geometryList); + Frame **frameList, Geometry **geometryList); bool streamWriteClump(Stream *stream, - Frame **frameList, int32 numFrames); + Frame **frameList, int32 numFrames); uint32 streamGetSize(void); ObjPipeline *getPipeline(void); @@ -439,8 +507,9 @@ extern ObjPipeline *defaultPipelines[NUM_PLATFORMS]; void registerAtomicRightsPlugin(void); -struct Clump : PluginBase, Object +struct Clump : PluginBase { + Object object; int32 numAtomics; Atomic **atomicList; int32 numLights; @@ -461,6 +530,7 @@ struct Clump : PluginBase, Object struct TexDictionary : PluginBase { + Object object; Texture *first; TexDictionary(void); diff --git a/tools/dffwrite/dffwrite.cpp b/tools/dffwrite/dffwrite.cpp index a711cfc..e4daeb8 100644 --- a/tools/dffwrite/dffwrite.cpp +++ b/tools/dffwrite/dffwrite.cpp @@ -11,37 +11,6 @@ using namespace std; using namespace rw; -Frame* -findHierCB(Frame *f, void *p) -{ - HAnimData *hanim = PLUGINOFFSET(HAnimData, f, hAnimOffset); - if(hanim->hierarchy){ - *(HAnimHierarchy**)p = hanim->hierarchy; - return NULL; - } - f->forAllChildren(findHierCB, p); - return f; -} - -HAnimHierarchy* -getHierarchy(Clump *c) -{ - HAnimHierarchy *hier = NULL; - findHierCB((Frame*)c->parent, &hier); - return hier; -} - -void -fixLcsHier(HAnimHierarchy *hier) -{ - hier->maxInterpKeyFrameSize = findAnimInterpolatorInfo(1)->keyFrameSize; - for(int32 i = 0; i < hier->numNodes; i++){ - int32 id = hier->nodeInfo[i].id; - if(id == 255) hier->nodeInfo[i].id = -1; - else if(id > 0x80) hier->nodeInfo[i].id |= 0x1300; - } -} - int main(int argc, char *argv[]) { @@ -54,10 +23,6 @@ main(int argc, char *argv[]) rw::platform = PLATFORM_D3D8; // rw::version = 0x30200; - int lcs = 1; - matFXGlobals.hack = lcs; - skinGlobals.forceSkipUsedBones = lcs; - gta::attachPlugins(); rw::Clump *c; @@ -104,25 +69,10 @@ main(int argc, char *argv[]) readChunkHeaderInfo(&in, &header); } assert(header.type == ID_CLUMP); - if(lcs) - c = clumpStreamReadRsl(&in); - else - c = Clump::streamRead(&in); + c = Clump::streamRead(&in); assert(c != NULL); } - if(lcs){ - HAnimHierarchy *hier = getHierarchy(c); - if(hier) - fixLcsHier(hier); - for(int32 i = 0; i < c->numAtomics; i++){ - Skin *skin = *PLUGINOFFSET(Skin*, c->atomicList[i]->geometry, skinGlobals.offset); - convertRslGeometry(c->atomicList[i]->geometry); - if(skin) - c->atomicList[i]->pipeline = skinGlobals.pipelines[rw::platform]; - } - } - if(rw::version == 0){ rw::version = header.version; rw::build = header.build; @@ -159,10 +109,7 @@ main(int argc, char *argv[]) out.open(argv[2], "wb"); else out.open("out.dff", "wb"); -// if(lcs) -// clumpStreamWriteRsl(&out, c); -// else - c->streamWrite(&out); + c->streamWrite(&out); out.close(); } diff --git a/tools/dumprwtree/dumprwtree.vcxproj b/tools/dumprwtree/dumprwtree.vcxproj index e2027de..8ee740a 100644 --- a/tools/dumprwtree/dumprwtree.vcxproj +++ b/tools/dumprwtree/dumprwtree.vcxproj @@ -142,6 +142,7 @@ Level3 Disabled true + MultiThreadedDebug true diff --git a/tools/rsltest/rsl.cpp b/tools/rsltest/rsl.cpp index b232135..463a137 100644 --- a/tools/rsltest/rsl.cpp +++ b/tools/rsltest/rsl.cpp @@ -28,17 +28,11 @@ RslMatrixSetIdentity(RslMatrix *matrix) void rslObjectHasFrameSetFrame(RslObjectHasFrame *object, RslFrame *f) { - if(object->object.parent){ - object->lFrame.prev->next = object->lFrame.next; - object->lFrame.next->prev = object->lFrame.prev; - } - object->object.parent = f; + if(object->object.parent) + rslLinkListRemoveLLLink(&object->lFrame); + rslObjectSetParent(object, f); if(f){ - object->lFrame.prev = &f->objectList.link; - object->lFrame.next = f->objectList.link.next; - f->objectList.link.next->prev = &object->lFrame; - f->objectList.link.next = &object->lFrame; - + rslLinkListAddLLLink(&f->objectList, &object->lFrame); f->root->object.privateFlags |= 1; f->object.privateFlags |= 2; } @@ -49,8 +43,7 @@ RslFrameCreate(void) { RslFrame *f = new RslFrame; rslObjectInitialize(&f->object, 0, 0); - f->objectList.link.prev = &f->objectList.link; - f->objectList.link.next = &f->objectList.link; + rslLinkListInitialize(&f->objectList); RslMatrixSetIdentity(&f->modelling); RslMatrixSetIdentity(&f->ltm); f->child = NULL; @@ -327,8 +320,7 @@ RslClumpCreate(void) { RslClump *clump = new RslClump; rslObjectInitialize(&clump->object, 2, 0); - clump->atomicList.link.prev = &clump->atomicList.link; - clump->atomicList.link.next = &clump->atomicList.link; + rslLinkListInitialize(&clump->atomicList); return clump; } @@ -373,10 +365,7 @@ RslClumpStreamRead(Stream *stream) RslClump* RslClumpAddAtomic(RslClump *clump, RslAtomic *a) { - a->inClumpLink.prev = &clump->atomicList.link; - a->inClumpLink.next = clump->atomicList.link.next; - clump->atomicList.link.next->prev = &a->inClumpLink; - clump->atomicList.link.next = &a->inClumpLink; + rslLinkListAddLLLink(&clump->atomicList, &a->inClumpLink); a->clump = clump; return clump; } @@ -387,7 +376,7 @@ RslClumpForAllAtomics(RslClump *clump, RslAtomicCallBack callback, void *pData) RslAtomic *a; RslLLLink *link; for(link = rslLLLinkGetNext(&clump->atomicList.link); - link != &clump->atomicList.link; + link != rslLinkListGetTerminator(&clump->atomicList); link = link->next){ a = rslLLLinkGetData(link, RslAtomic, inClumpLink); if(callback(a, pData) == NULL) @@ -402,7 +391,7 @@ RslClumpGetNumAtomics(RslClump *clump) int32 n = 0; RslLLLink *link; for(link = rslLLLinkGetNext(&clump->atomicList.link); - link != &clump->atomicList.link; + link != rslLinkListGetTerminator(&clump->atomicList); link = link->next) n++; return n; @@ -561,23 +550,17 @@ RslTexDictionaryCreate(void) RslTexDictionary *dict = new RslTexDictionary; memset(dict, 0, sizeof(RslTexDictionary)); rslObjectInitialize(&dict->object, 6, 0); - dict->texturesInDict.link.prev = &dict->texturesInDict.link; - dict->texturesInDict.link.next = &dict->texturesInDict.link; + rslLinkListInitialize(&dict->texturesInDict); return dict; } RslTexture* RslTexDictionaryAddTexture(RslTexDictionary *dict, RslTexture *tex) { - if(tex->dict){ - tex->lInDictionary.prev->next = tex->lInDictionary.next; - tex->lInDictionary.next->prev = tex->lInDictionary.prev; - } + if(tex->dict) + rslLinkListRemoveLLLink(&tex->lInDictionary); tex->dict = dict; - tex->lInDictionary.prev = &dict->texturesInDict.link; - tex->lInDictionary.next = dict->texturesInDict.link.next; - dict->texturesInDict.link.next->prev = &tex->lInDictionary; - dict->texturesInDict.link.next = &tex->lInDictionary; + rslLinkListAddLLLink(&dict->texturesInDict, &tex->lInDictionary); return tex; } @@ -587,7 +570,7 @@ RslTexDictionaryForAllTextures(RslTexDictionary *dict, RslTextureCallBack fpCall RslTexture *t; RslLLLink *link; for(link = rslLLLinkGetNext(&dict->texturesInDict.link); - link != &dict->texturesInDict.link; + link != rslLinkListGetTerminator(&dict->texturesInDict); link = link->next){ t = rslLLLinkGetData(link, RslTexture, lInDictionary); if(fpCallBack(t, pData) == NULL) diff --git a/tools/rsltest/rsl.h b/tools/rsltest/rsl.h index 08c23ac..1f5734a 100644 --- a/tools/rsltest/rsl.h +++ b/tools/rsltest/rsl.h @@ -75,26 +75,43 @@ struct RslLLLink RslLLLink *prev; }; +#define rslLLLinkGetData(linkvar,type,entry) \ + ((type*)(((uint8*)(linkvar))-offsetof(type,entry))) +#define rslLLLinkGetNext(linkvar) \ + ((linkvar)->next) +#define rslLLLinkGetPrevious(linkvar) \ + ((linkvar)->prev) +#define rslLLLinkInitialize(linkvar) \ + ((linkvar)->prev = (RslLLLink*)NULL, \ + (linkvar)->next = (RslLLLink*)NULL) +#define rslLLLinkAttached(linkvar) \ + ((linkvar)->next) + struct RslLinkList { RslLLLink link; }; -#define rslLLLinkGetData(linkvar,type,entry) \ - ((type *)(((uint8 *)(linkvar))-offsetof(type,entry))) +#define rslLinkListInitialize(list) \ + ((list)->link.next = ((RslLLLink*)(list)), \ + (list)->link.prev = ((RslLLLink*)(list))) +#define rslLinkListEmpty(list) \ + (((list)->link.next) == (&(list)->link)) +#define rslLinkListAddLLLink(list, linkvar) \ + ((linkvar)->next = (list)->link.next, \ + (linkvar)->prev = (&(list)->link), \ + ((list)->link.next)->prev = (linkvar), \ + (list)->link.next = (linkvar) ) +#define rslLinkListRemoveLLLink(linkvar) \ + (((linkvar)->prev)->next = (linkvar)->next, \ + ((linkvar)->next)->prev = (linkvar)->prev) +#define rslLinkListGetFirstLLLink(list) \ + ((list)->link.next) +#define rslLinkListGetLastLLLink(list) \ + ((list)->link.prev) +#define rslLinkListGetTerminator(list) \ + (&((list)->link)) -#define rslLLLinkGetNext(linkvar) \ - ((linkvar)->next) - -#define rslLLLinkGetPrevious(linkvar) \ - ((linkvar)->prev) - -#define rslLLLinkInitialize(linkvar) \ - ( (linkvar)->prev = (RslLLLink *)NULL, \ - (linkvar)->next = (RslLLLink *)NULL ) - -#define rslLLLinkAttached(linkvar) \ - ((linkvar)->next) struct RslObject { uint8 type; diff --git a/tools/rsltest/rsltest.cpp b/tools/rsltest/rsltest.cpp index c96d857..582e5b4 100644 --- a/tools/rsltest/rsltest.cpp +++ b/tools/rsltest/rsltest.cpp @@ -407,7 +407,7 @@ convertClump(RslClump *c) if(parent >= 0) rwframes[parent]->addChild(rwf); } - rwc->parent = rwframes[0]; + rwc->object.parent = rwframes[0]; rwc->numAtomics = RslClumpGetNumAtomics(c); rwc->atomicList = new Atomic*[rwc->numAtomics]; @@ -418,7 +418,7 @@ convertClump(RslClump *c) rwa = convertAtomic(alist[i]); rwc->atomicList[i] = rwa; int32 fi = findPointer(alist[i]->object.object.parent, (void**)frameList.frames, frameList.numFrames); - rwa->frame = rwframes[fi]; + rwa->object.parent = rwframes[fi]; rwa->clump = rwc; } @@ -823,14 +823,14 @@ main(int argc, char *argv[]) rslstr->relocate(); bool32 largefile; - largefile = rslstr->dataSize > 0x100000; + largefile = rslstr->dataSize > 0x1000000; if(rslstr->ident == WRLD_IDENT && largefile){ // hack world = (World*)rslstr->data; - int len = strlen(argv[1])+1; + int len = strlen(argv[0])+1; char filename[1024]; - strncpy(filename, argv[1], len); + strncpy(filename, argv[0], len); filename[len-3] = 'i'; filename[len-2] = 'm'; filename[len-1] = 'g'; @@ -874,16 +874,21 @@ main(int argc, char *argv[]) stream.close(); }else if(rslstr->ident == WRLD_IDENT){ // sector sector = (Sector*)rslstr->data; - printf("resources\n"); - for(uint32 i = 0; i < sector->numResources; i++){ - OverlayResource *r = §or->resources[i]; - printf(" %d %p\n", r->id, r->raw); - } - printf("placement\n"); + fprintf(stderr, "%d\n",sector->unk1); + //printf("resources\n"); + //for(uint32 i = 0; i < sector->numResources; i++){ + // OverlayResource *r = §or->resources[i]; + // printf(" %d %p\n", r->id, r->raw); + //} + //printf("placement\n"); + if(sector->unk1 == 0) + return 0; Placement *p; - for(p = sector->sectionA; p < sector->sectionEnd; p++){ - printf(" %d, %d, %f %f %f\n", p->id &0x7FFF, p->resId, p->matrix[12], p->matrix[13], p->matrix[14]); - } + //for(p = sector->sectionA; p < sector->sectionEnd; p++){ + // printf(" %d, %d, %f %f %f\n", p->id &0x7FFF, p->resId, p->matrix[12], p->matrix[13], p->matrix[14]); + //} + for(p = sector->sectionA; p < sector->sectionEnd; p++) + printf("%f %f %f\n", p->matrix[12], p->matrix[13], p->matrix[14]); }else if(rslstr->ident == MDL_IDENT){ uint8 *p; p = *rslstr->hashTab;