fixed stuff

This commit is contained in:
aap 2015-12-19 15:40:34 +01:00
parent 5f2cd51ea1
commit 3aca9c9c7d
4 changed files with 29 additions and 10 deletions

View File

@ -335,16 +335,15 @@ writeUVAnim(Stream *stream, int32 size, void *object, int32 offset, int32)
} }
} }
// TODO: under what circumstance 0?
static int32 static int32
getSizeUVAnim(void *object, int32 offset, int32) getSizeUVAnim(void *object, int32 offset, int32)
{ {
UVAnim *uvanim = PLUGINOFFSET(UVAnim, object, offset); UVAnim *uvanim = PLUGINOFFSET(UVAnim, object, offset);
int32 size = 12 + 4; int32 size = 0;
for(int32 i = 0; i < 8; i++) for(int32 i = 0; i < 8; i++)
if(uvanim->interp[i]) if(uvanim->interp[i])
size += 32; size += 32;
return size; return size ? size + 12 + 4 : 0;
} }

View File

@ -243,7 +243,7 @@ getSizeBreakableModel(void *object, int32 offset, int32)
{ {
Breakable *breakable = *PLUGINOFFSET(Breakable*, object, offset); Breakable *breakable = *PLUGINOFFSET(Breakable*, object, offset);
if(breakable == NULL) if(breakable == NULL)
return 4; return 0; //4;
return 56 + breakable->numVertices*(12+8+4) + return 56 + breakable->numVertices*(12+8+4) +
breakable->numFaces*(6+2) + breakable->numFaces*(6+2) +
breakable->numMaterials*(32+32+12); breakable->numMaterials*(32+32+12);

View File

@ -27,7 +27,7 @@ int32 rslPluginOffset;
struct RslMesh struct RslMesh
{ {
float32 bound[4]; // ? float32 bound[4]; // ?
float32 uvOff[2]; // ? float32 uvScale[2];
uint32 unknown; uint32 unknown;
uint32 dmaOffset; uint32 dmaOffset;
uint16 numTriangles; uint16 numTriangles;
@ -50,6 +50,17 @@ struct RslGeometry
uint8 *data; uint8 *data;
}; };
float32
halfFloat(uint16 half)
{
uint32 f = (uint32)(half & 0x7fff) << 13;
uint32 sgn = (uint32)(half & 0x8000) << 16;
f += 0x38000000;
if(half & 0x7c00 == 0) f = 0;
f |= sgn;
return *(float32*)&f;
}
static uint32 static uint32
unpackSize(uint32 unpack) unpackSize(uint32 unpack)
{ {
@ -157,6 +168,9 @@ convertRslMesh(Geometry *g, RslGeometry *rg, Mesh *m, RslMesh *rm)
mask |= 0x10000; mask |= 0x10000;
} }
//float uScale = //halfFloat(rm->uvScale[0]);
//float vScale = //halfFloat(rm->uvScale[1]);
int16 *vuVerts = NULL; int16 *vuVerts = NULL;
int8 *vuNorms = NULL; int8 *vuNorms = NULL;
uint8 *vuTex = NULL; uint8 *vuTex = NULL;
@ -229,8 +243,8 @@ convertRslMesh(Geometry *g, RslGeometry *rg, Mesh *m, RslMesh *rm)
v.p[0] = vuVerts[0]/32768.0f*rg->scale[0] + rg->pos[0]; v.p[0] = vuVerts[0]/32768.0f*rg->scale[0] + rg->pos[0];
v.p[1] = vuVerts[1]/32768.0f*rg->scale[1] + rg->pos[1]; v.p[1] = vuVerts[1]/32768.0f*rg->scale[1] + rg->pos[1];
v.p[2] = vuVerts[2]/32768.0f*rg->scale[2] + rg->pos[2]; v.p[2] = vuVerts[2]/32768.0f*rg->scale[2] + rg->pos[2];
v.t[0] = vuTex[0]/255.0f*rm->uvOff[0]; v.t[0] = vuTex[0]/128.0f*rm->uvScale[0];
v.t[1] = vuTex[1]/255.0f*rm->uvOff[1]; v.t[1] = vuTex[1]/128.0f*rm->uvScale[1];
if(mask & 0x10){ if(mask & 0x10){
v.n[0] = vuNorms[0]/127.0f; v.n[0] = vuNorms[0]/127.0f;
v.n[1] = vuNorms[1]/127.0f; v.n[1] = vuNorms[1]/127.0f;
@ -240,7 +254,7 @@ convertRslMesh(Geometry *g, RslGeometry *rg, Mesh *m, RslMesh *rm)
v.c[0] = (vuCols[0] & 0x1f) * 255 / 0x1F; v.c[0] = (vuCols[0] & 0x1f) * 255 / 0x1F;
v.c[1] = (vuCols[0]>>5 & 0x1f) * 255 / 0x1F; v.c[1] = (vuCols[0]>>5 & 0x1f) * 255 / 0x1F;
v.c[2] = (vuCols[0]>>10 & 0x1f) * 255 / 0x1F; v.c[2] = (vuCols[0]>>10 & 0x1f) * 255 / 0x1F;
v.c[3] = vuCols[0]&0x80 ? 0xFF : 0; v.c[3] = vuCols[0]&0x8000 ? 0xFF : 0;
} }
if(mask & 0x10000){ if(mask & 0x10000){
for(int j = 0; j < 4; j++){ for(int j = 0; j < 4; j++){

View File

@ -16,8 +16,9 @@ main(int argc, char *argv[])
// rw::version = 0x31000; // rw::version = 0x31000;
// rw::build = 0; // rw::build = 0;
rw::version = 0;
// rw::version = 0x32000; // rw::version = 0x32000;
rw::version = 0x33002; // rw::version = 0x33002;
rw::platform = PLATFORM_D3D8; rw::platform = PLATFORM_D3D8;
// rw::version = 0x30200; // rw::version = 0x30200;
@ -31,6 +32,7 @@ main(int argc, char *argv[])
// rw::StreamFile in; // rw::StreamFile in;
// in.open(argv[1], "rb"); // in.open(argv[1], "rb");
ChunkHeaderInfo header;
if(0){ if(0){
FILE *cf = fopen(argv[1], "rb"); FILE *cf = fopen(argv[1], "rb");
assert(cf != NULL); assert(cf != NULL);
@ -57,7 +59,6 @@ main(int argc, char *argv[])
return 1; return 1;
} }
debugFile = argv[1]; debugFile = argv[1];
ChunkHeaderInfo header;
readChunkHeaderInfo(&in, &header); readChunkHeaderInfo(&in, &header);
if(header.type == ID_UVANIMDICT){ if(header.type == ID_UVANIMDICT){
UVAnimDictionary *dict = UVAnimDictionary::streamRead(&in); UVAnimDictionary *dict = UVAnimDictionary::streamRead(&in);
@ -76,6 +77,11 @@ main(int argc, char *argv[])
for(int32 i = 0; i < c->numAtomics; i++) for(int32 i = 0; i < c->numAtomics; i++)
convertRslGeometry(c->atomicList[i]->geometry); convertRslGeometry(c->atomicList[i]->geometry);
if(rw::version == 0){
rw::version = header.version;
rw::build = header.build;
}
// rw::Image::setSearchPath("./;/home/aap/gamedata/ps2/gtavc/MODELS/gta3_archive/txd_extracted/"); // rw::Image::setSearchPath("./;/home/aap/gamedata/ps2/gtavc/MODELS/gta3_archive/txd_extracted/");
/* /*