mirror of https://github.com/aap/librw.git
worked on LCS world
This commit is contained in:
parent
aed3fefd01
commit
040d167da0
|
@ -1,5 +1,11 @@
|
|||
enum {
|
||||
TEX_IDENT = 0x00746578,
|
||||
MDL_IDENT = 0x006D646C,
|
||||
WRLD_IDENT = 0x57524C44
|
||||
};
|
||||
|
||||
struct RslStream {
|
||||
uint32 ident;
|
||||
uint32 ident;
|
||||
bool32 isMulti;
|
||||
uint32 fileSize;
|
||||
uint32 dataSize;
|
||||
|
@ -263,10 +269,104 @@ struct RslPS2InstanceData {
|
|||
float32 bound[4]; // ?
|
||||
float32 uvScale[2];
|
||||
int32 unk1;
|
||||
uint8 *dmaPacket;
|
||||
uint32 dmaPacket;
|
||||
uint16 numTriangles;
|
||||
int16 matID;
|
||||
void *unk2;
|
||||
void *unk3;
|
||||
void *unk4;
|
||||
int16 min[3]; // bounding box
|
||||
int16 max[3];
|
||||
};
|
||||
|
||||
struct RslStreamHeader {
|
||||
uint32 ident;
|
||||
uint32 unk;
|
||||
uint32 fileEnd; //
|
||||
uint32 dataEnd; // relative to beginning of header
|
||||
uint32 reloc; //
|
||||
uint32 relocSize;
|
||||
uint32 root; // absolute
|
||||
uint16 zero;
|
||||
uint16 numAtomics;
|
||||
};
|
||||
|
||||
struct RslWorldGeometry {
|
||||
uint16 numMeshes;
|
||||
uint16 size;
|
||||
// array of numMeshes RslWorldMesh
|
||||
// dma data
|
||||
};
|
||||
|
||||
struct RslWorldMesh {
|
||||
uint16 texID; // index into resource table
|
||||
uint16 dmaSize;
|
||||
uint16 uvScale[2]; // half precision float
|
||||
uint16 unk1;
|
||||
int16 min[3]; // bounding box
|
||||
int16 max[3];
|
||||
};
|
||||
|
||||
struct Resource {
|
||||
union {
|
||||
RslRaster *raster;
|
||||
RslWorldGeometry *geometry;
|
||||
uint8 *raw;
|
||||
};
|
||||
uint32 *dma;
|
||||
};
|
||||
|
||||
struct OverlayResource {
|
||||
int32 id;
|
||||
union {
|
||||
RslRaster *raster;
|
||||
RslWorldGeometry *geometry;
|
||||
uint8 *raw;
|
||||
};
|
||||
};
|
||||
|
||||
struct Placement {
|
||||
uint16 id;
|
||||
uint16 resId;
|
||||
int16 bound[4];
|
||||
int32 pad;
|
||||
float matrix[16];
|
||||
};
|
||||
|
||||
struct Sector {
|
||||
OverlayResource *resources;
|
||||
uint16 numResources;
|
||||
uint16 unk1;
|
||||
Placement *sectionA;
|
||||
Placement *sectionB;
|
||||
Placement *sectionC;
|
||||
Placement *sectionD;
|
||||
Placement *sectionE;
|
||||
Placement *sectionF;
|
||||
Placement *sectionG;
|
||||
Placement *sectionEnd;
|
||||
uint16 unk2;
|
||||
uint16 unk3;
|
||||
uint32 unk4;
|
||||
};
|
||||
|
||||
struct SectorEntry {
|
||||
RslStreamHeader *sector;
|
||||
uint32 num;
|
||||
};
|
||||
|
||||
struct World {
|
||||
Resource *resources;
|
||||
SectorEntry sectors[47];
|
||||
uint32 numResources;
|
||||
uint8 pad[0x180];
|
||||
|
||||
uint32 numX;
|
||||
void *tabX; // size 0x4
|
||||
|
||||
uint32 numY;
|
||||
void *tabY; // size 0x30
|
||||
|
||||
uint32 numZ;
|
||||
void *tabZ; // size 0x6
|
||||
|
||||
uint32 numTextures;
|
||||
RslStreamHeader *textures; // stream headers
|
||||
};
|
|
@ -99,7 +99,7 @@ main(int argc, char *argv[])
|
|||
assert(sizeof(void*) == 4);
|
||||
|
||||
if(argc < 2){
|
||||
printf("usage: %s [-u] in.dff\n", argv[0]);
|
||||
printf("usage: %s in\n", argv[0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -112,8 +112,71 @@ main(int argc, char *argv[])
|
|||
stream.close();
|
||||
rslstr->relocate();
|
||||
|
||||
int largefile = rslstr->dataSize > 0x100000;
|
||||
|
||||
World *world;
|
||||
RslClump *clump;
|
||||
if(rslstr->numAtomics){
|
||||
Sector *sector;
|
||||
if(rslstr->ident = WRLD_IDENT && largefile){ // hack
|
||||
world = (World*)rslstr->data;
|
||||
|
||||
int len = strlen(argv[1])+1;
|
||||
char filename[1024];
|
||||
strncpy(filename, argv[1], len);
|
||||
filename[len-3] = 'i';
|
||||
filename[len-2] = 'm';
|
||||
filename[len-1] = 'g';
|
||||
filename[len] = '\0';
|
||||
assert(stream.open(filename, "rb"));
|
||||
filename[len-4] = '\\';
|
||||
filename[len-3] = '\0';
|
||||
|
||||
char name[1024];
|
||||
uint8 *data;
|
||||
StreamFile outf;
|
||||
RslStreamHeader *h;
|
||||
int i = 0;
|
||||
for(h = world->sectors->sector; h->ident == WRLD_IDENT; h++){
|
||||
sprintf(name, "world%04d.wrld", i++);
|
||||
strcat(filename, name);
|
||||
assert(outf.open(filename, "wb"));
|
||||
data = new uint8[h->fileEnd];
|
||||
memcpy(data, h, 0x20);
|
||||
stream.seek(h->root, 0);
|
||||
stream.read(data+0x20, h->fileEnd-0x20);
|
||||
outf.write(data, h->fileEnd);
|
||||
outf.close();
|
||||
filename[len-3] = '\0';
|
||||
}
|
||||
// radar textures
|
||||
h = world->textures;
|
||||
for(i = 0; i < world->numTextures; i++){
|
||||
sprintf(name, "txd%04d.chk", i);
|
||||
strcat(filename, name);
|
||||
assert(outf.open(filename, "wb"));
|
||||
data = new uint8[h->fileEnd];
|
||||
memcpy(data, h, 0x20);
|
||||
stream.seek(h->root, 0);
|
||||
stream.read(data+0x20, h->fileEnd-0x20);
|
||||
outf.write(data, h->fileEnd);
|
||||
outf.close();
|
||||
filename[len-3] = '\0';
|
||||
h++;
|
||||
}
|
||||
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");
|
||||
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]);
|
||||
}
|
||||
}else if(rslstr->ident = MDL_IDENT){
|
||||
uint8 *p = *rslstr->hashTab;
|
||||
p -= 0x24;
|
||||
RslAtomic *a = (RslAtomic*)p;
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
|
|
Loading…
Reference in New Issue