mirror of
https://github.com/aap/librw.git
synced 2025-02-16 17:26:18 +00:00
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 {
|
struct RslStream {
|
||||||
uint32 ident;
|
uint32 ident;
|
||||||
bool32 isMulti;
|
bool32 isMulti;
|
||||||
uint32 fileSize;
|
uint32 fileSize;
|
||||||
uint32 dataSize;
|
uint32 dataSize;
|
||||||
@ -263,10 +269,104 @@ struct RslPS2InstanceData {
|
|||||||
float32 bound[4]; // ?
|
float32 bound[4]; // ?
|
||||||
float32 uvScale[2];
|
float32 uvScale[2];
|
||||||
int32 unk1;
|
int32 unk1;
|
||||||
uint8 *dmaPacket;
|
uint32 dmaPacket;
|
||||||
uint16 numTriangles;
|
uint16 numTriangles;
|
||||||
int16 matID;
|
int16 matID;
|
||||||
void *unk2;
|
int16 min[3]; // bounding box
|
||||||
void *unk3;
|
int16 max[3];
|
||||||
void *unk4;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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);
|
assert(sizeof(void*) == 4);
|
||||||
|
|
||||||
if(argc < 2){
|
if(argc < 2){
|
||||||
printf("usage: %s [-u] in.dff\n", argv[0]);
|
printf("usage: %s in\n", argv[0]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,8 +112,71 @@ main(int argc, char *argv[])
|
|||||||
stream.close();
|
stream.close();
|
||||||
rslstr->relocate();
|
rslstr->relocate();
|
||||||
|
|
||||||
|
int largefile = rslstr->dataSize > 0x100000;
|
||||||
|
|
||||||
|
World *world;
|
||||||
RslClump *clump;
|
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;
|
uint8 *p = *rslstr->hashTab;
|
||||||
p -= 0x24;
|
p -= 0x24;
|
||||||
RslAtomic *a = (RslAtomic*)p;
|
RslAtomic *a = (RslAtomic*)p;
|
||||||
|
@ -51,6 +51,7 @@
|
|||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user