diff --git a/main.cpp b/main.cpp index 50a7aa2..c3fffe1 100644 --- a/main.cpp +++ b/main.cpp @@ -19,8 +19,8 @@ main(int argc, char *argv[]) // Rw::Build = 0; registerNodeNamePlugin(); - registerMeshPlugin(); registerNativeDataPlugin(); + registerMeshPlugin(); Rw::Clump *c; ifstream in(argv[1], ios::binary); diff --git a/plugins.cpp b/plugins.cpp index 3d90fbd..372951f 100644 --- a/plugins.cpp +++ b/plugins.cpp @@ -183,6 +183,17 @@ registerMeshPlugin(void) // Native Data +static void* +destroyNativeData(void *object, int32 offset, int32 size) +{ + Geometry *geometry = (Geometry*)object; + if(geometry->instData == NULL) + return object; + if(geometry->instData->platform == PLATFORM_PS2) + return DestroyNativeDataPS2(object, offset, size); + return object; +} + static void readNativeData(istream &stream, int32 len, void *object, int32 o, int32 s) { @@ -236,7 +247,7 @@ getSizeNativeData(void *object, int32 offset, int32 size) void registerNativeDataPlugin(void) { - Rw::Geometry::registerPlugin(0, 0x510, NULL, NULL, NULL); + Rw::Geometry::registerPlugin(0, 0x510, NULL, destroyNativeData, NULL); Rw::Geometry::registerPluginStream(0x510, (StreamRead)readNativeData, (StreamWrite)writeNativeData, (StreamGetSize)getSizeNativeData); diff --git a/ps2.cpp b/ps2.cpp index d2ffc6f..a000eb8 100644 --- a/ps2.cpp +++ b/ps2.cpp @@ -15,8 +15,22 @@ using namespace std; namespace Rw { +void* +DestroyNativeDataPS2(void *object, int32, int32) +{ + Geometry *geometry = (Geometry*)object; + assert(geometry->instData->platform == PLATFORM_PS2); + PS2InstanceDataHeader *header = + (PS2InstanceDataHeader*)geometry->instData; + for(uint32 i = 0; i < header->numMeshes; i++) + delete[] header->instanceMeshes[i].data; + delete[] header->instanceMeshes; + delete header; + return object; +} + void -ReadNativeDataPS2(istream &stream, int32 len, void *object, int32, int32) +ReadNativeDataPS2(istream &stream, int32, void *object, int32, int32) { Geometry *geometry = (Geometry*)object; assert(FindChunk(stream, ID_STRUCT, NULL, NULL)); @@ -43,7 +57,8 @@ WriteNativeDataPS2(ostream &stream, int32 len, void *object, int32, int32) { Geometry *geometry = (Geometry*)object; WriteChunkHeader(stream, ID_STRUCT, len-12); - writeUInt32(4, stream); + assert(geometry->instData->platform == PLATFORM_PS2); + writeUInt32(PLATFORM_PS2, stream); assert(geometry->instData != NULL); PS2InstanceDataHeader *header = (PS2InstanceDataHeader*)geometry->instData; @@ -62,6 +77,7 @@ GetSizeNativeDataPS2(void *object, int32, int32) { Geometry *geometry = (Geometry*)object; int32 size = 16; + assert(geometry->instData->platform == PLATFORM_PS2); assert(geometry->instData != NULL); PS2InstanceDataHeader *header = (PS2InstanceDataHeader*)geometry->instData; diff --git a/rwps2.h b/rwps2.h index 1fa370e..e3b2b8b 100644 --- a/rwps2.h +++ b/rwps2.h @@ -14,6 +14,7 @@ struct PS2InstanceDataHeader : InstanceDataHeader PS2InstanceData *instanceMeshes; }; +void *DestroyNativeDataPS2(void *object, int32, int32); void ReadNativeDataPS2(std::istream &stream, int32 len, void *object, int32, int32); void WriteNativeDataPS2(std::ostream &stream, int32 len, void *object, int32, int32); int32 GetSizeNativeDataPS2(void *object, int32, int32);