mirror of
https://github.com/aap/librw.git
synced 2025-02-01 13:36:38 +00:00
read/write ADC data, cant convert yet
This commit is contained in:
parent
d04e97fb47
commit
3639ada1c3
14
TODO
14
TODO
@ -14,19 +14,19 @@ Clump & related:
|
|||||||
texcoord
|
texcoord
|
||||||
- implement plugins:
|
- implement plugins:
|
||||||
Clump
|
Clump
|
||||||
R* Collision
|
R* Collision 0x253F2FA
|
||||||
Animation (old III dffs)
|
Animation (old III dffs)
|
||||||
Atomic
|
Atomic
|
||||||
((Particles))
|
((Particles)) 0x118
|
||||||
R* Pipeline Set
|
R* Pipeline Set 0x253F2F3
|
||||||
Skin (old III dffs)
|
Skin (old III dffs)
|
||||||
Geometry
|
Geometry
|
||||||
((Morph))
|
((Morph)) 0x105
|
||||||
R* 2dfx
|
R* 2dfx 0x253F2F8
|
||||||
Material
|
Material
|
||||||
UV Anim
|
UV Anim 0x135
|
||||||
Texture
|
Texture
|
||||||
(Sky Mipmap Val)
|
(Sky Mipmap Val) 0x110
|
||||||
|
|
||||||
- PDS Pipelines
|
- PDS Pipelines
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ main(int argc, char *argv[])
|
|||||||
rw::registerAtomicRightsPlugin();
|
rw::registerAtomicRightsPlugin();
|
||||||
rw::registerHAnimPlugin();
|
rw::registerHAnimPlugin();
|
||||||
gta::registerNodeNamePlugin();
|
gta::registerNodeNamePlugin();
|
||||||
// gta::registerBreakableModelPlugin();
|
gta::registerBreakableModelPlugin();
|
||||||
gta::registerExtraVertColorPlugin();
|
gta::registerExtraVertColorPlugin();
|
||||||
rw::ps2::registerADCPlugin();
|
rw::ps2::registerADCPlugin();
|
||||||
rw::ps2::registerPDSPlugin();
|
rw::ps2::registerPDSPlugin();
|
||||||
|
@ -131,7 +131,8 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
ChunkHeaderInfo header;
|
ChunkHeaderInfo header;
|
||||||
readChunkHeaderInfo(&s, &header);
|
readChunkHeaderInfo(&s, &header);
|
||||||
readchunk(&s, &header, 0);
|
if(argc == 2)
|
||||||
|
readchunk(&s, &header, 0);
|
||||||
|
|
||||||
printf("%x %x %x\n", header.version, header.build,
|
printf("%x %x %x\n", header.version, header.build,
|
||||||
libraryIDPack(header.version, header.build));
|
libraryIDPack(header.version, header.build));
|
||||||
|
@ -24,6 +24,7 @@ Geometry::Geometry(int32 numVerts, int32 numTris, uint32 flags)
|
|||||||
this->numTriangles = numTris;
|
this->numTriangles = numTris;
|
||||||
this->numVertices = numVerts;
|
this->numVertices = numVerts;
|
||||||
this->numMorphTargets = 1;
|
this->numMorphTargets = 1;
|
||||||
|
printf("geometry: %X %X\n", this->numTriangles, this->numVertices);
|
||||||
|
|
||||||
this->colors = NULL;
|
this->colors = NULL;
|
||||||
for(int32 i = 0; i < this->numTexCoordSets; i++)
|
for(int32 i = 0; i < this->numTexCoordSets; i++)
|
||||||
|
@ -159,6 +159,7 @@ readMesh(Stream *stream, int32 len, void *object, int32, int32)
|
|||||||
geo->meshHeader->flags = buf[0];
|
geo->meshHeader->flags = buf[0];
|
||||||
geo->meshHeader->numMeshes = buf[1];
|
geo->meshHeader->numMeshes = buf[1];
|
||||||
geo->meshHeader->totalIndices = buf[2];
|
geo->meshHeader->totalIndices = buf[2];
|
||||||
|
printf("total: %X\n", geo->meshHeader->totalIndices);
|
||||||
geo->meshHeader->mesh = new Mesh[geo->meshHeader->numMeshes];
|
geo->meshHeader->mesh = new Mesh[geo->meshHeader->numMeshes];
|
||||||
Mesh *mesh = geo->meshHeader->mesh;
|
Mesh *mesh = geo->meshHeader->mesh;
|
||||||
bool hasData = len > 12+geo->meshHeader->numMeshes*8;
|
bool hasData = len > 12+geo->meshHeader->numMeshes*8;
|
||||||
@ -339,7 +340,7 @@ registerNativeDataPlugin(void)
|
|||||||
// Skin
|
// Skin
|
||||||
//
|
//
|
||||||
|
|
||||||
SkinGlobals skinGlobals = { 0, NULL };
|
SkinGlobals skinGlobals = { 0, { NULL } };
|
||||||
|
|
||||||
static void*
|
static void*
|
||||||
createSkin(void *object, int32 offset, int32)
|
createSkin(void *object, int32 offset, int32)
|
||||||
@ -637,7 +638,7 @@ getSizeAtomicMatFX(void *object, int32 offset, int32)
|
|||||||
|
|
||||||
// Material
|
// Material
|
||||||
|
|
||||||
MatFXGlobals matFXGlobals = { 0, 0, NULL };
|
MatFXGlobals matFXGlobals = { 0, 0, { NULL } };
|
||||||
|
|
||||||
// TODO: Frames and Matrices?
|
// TODO: Frames and Matrices?
|
||||||
static void
|
static void
|
||||||
|
67
src/ps2.cpp
67
src/ps2.cpp
@ -766,7 +766,7 @@ getSizeNativeSkin(void *object, int32 offset)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
skinInstanceCB(MatPipeline *pipe, Geometry *g, Mesh *m, uint8 **data, int32 n)
|
skinInstanceCB(MatPipeline *, Geometry *g, Mesh *m, uint8 **data, int32 n)
|
||||||
{
|
{
|
||||||
Skin *skin = *PLUGINOFFSET(Skin*, g, skinGlobals.offset);
|
Skin *skin = *PLUGINOFFSET(Skin*, g, skinGlobals.offset);
|
||||||
if(skin == NULL || n < 1)
|
if(skin == NULL || n < 1)
|
||||||
@ -798,6 +798,8 @@ skinInstanceCB(MatPipeline *pipe, Geometry *g, Mesh *m, uint8 **data, int32 n)
|
|||||||
|
|
||||||
// ADC
|
// ADC
|
||||||
|
|
||||||
|
// TODO: look at PC SA rccam.dff bloodrb.dff, Xbox csbigbear.dff
|
||||||
|
|
||||||
static void*
|
static void*
|
||||||
createADC(void *object, int32 offset, int32)
|
createADC(void *object, int32 offset, int32)
|
||||||
{
|
{
|
||||||
@ -812,40 +814,85 @@ copyADC(void *dst, void *src, int32 offset, int32)
|
|||||||
ADCData *dstadc = PLUGINOFFSET(ADCData, dst, offset);
|
ADCData *dstadc = PLUGINOFFSET(ADCData, dst, offset);
|
||||||
ADCData *srcadc = PLUGINOFFSET(ADCData, src, offset);
|
ADCData *srcadc = PLUGINOFFSET(ADCData, src, offset);
|
||||||
dstadc->adcFormatted = srcadc->adcFormatted;
|
dstadc->adcFormatted = srcadc->adcFormatted;
|
||||||
|
if(!dstadc->adcFormatted)
|
||||||
|
return dst;
|
||||||
|
dstadc->numBits = srcadc->numBits;
|
||||||
|
int32 size = dstadc->numBits+3 & ~3;
|
||||||
|
dstadc->adcBits = new int8[size];
|
||||||
|
memcpy(dstadc->adcBits, srcadc->adcBits, size);
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: look at PC SA rccam.dff bloodrb.dff
|
static void*
|
||||||
|
destroyADC(void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
ADCData *adc = PLUGINOFFSET(ADCData, object, offset);
|
||||||
|
if(adc->adcFormatted)
|
||||||
|
delete[] adc->adcBits;
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
readADC(Stream *stream, int32, void *object, int32 offset, int32)
|
readADC(Stream *stream, int32, void *object, int32 offset, int32)
|
||||||
{
|
{
|
||||||
ADCData *adc = PLUGINOFFSET(ADCData, object, offset);
|
ADCData *adc = PLUGINOFFSET(ADCData, object, offset);
|
||||||
stream->seek(12);
|
assert(findChunk(stream, ID_ADC, NULL, NULL));
|
||||||
uint32 x = stream->readU32();
|
adc->numBits = stream->readI32();
|
||||||
assert(x == 0);
|
if(adc->numBits == 0){
|
||||||
|
adc->adcFormatted = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
adc->adcFormatted = 1;
|
adc->adcFormatted = 1;
|
||||||
|
int32 size = adc->numBits+3 & ~3;
|
||||||
|
adc->adcBits = new int8[size];
|
||||||
|
stream->read(adc->adcBits, size);
|
||||||
|
|
||||||
|
Geometry *geometry = (Geometry*)object;
|
||||||
|
int ones = 0, zeroes = 0;
|
||||||
|
for(int i = 0; i < adc->numBits; i++)
|
||||||
|
if(adc->adcBits[i] == 0)
|
||||||
|
zeroes++;
|
||||||
|
else if(adc->adcBits[i] == 1)
|
||||||
|
ones++;
|
||||||
|
else
|
||||||
|
fprintf(stderr, "what the fuck man\n");
|
||||||
|
printf("%X %X %X\n", adc->numBits, zeroes, ones);
|
||||||
|
MeshHeader *meshHeader = geometry->meshHeader;
|
||||||
|
printf("%X\n", meshHeader->totalIndices);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
writeADC(Stream *stream, int32, void *, int32, int32)
|
writeADC(Stream *stream, int32 len, void *object, int32 offset, int32)
|
||||||
{
|
{
|
||||||
writeChunkHeader(stream, ID_ADC, 4);
|
ADCData *adc = PLUGINOFFSET(ADCData, object, offset);
|
||||||
stream->writeI32(0);
|
Geometry *geometry = (Geometry*)object;
|
||||||
|
writeChunkHeader(stream, ID_ADC, len-12);
|
||||||
|
if(geometry->geoflags & Geometry::NATIVE){
|
||||||
|
stream->writeI32(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
stream->writeI32(adc->numBits);
|
||||||
|
int32 size = adc->numBits+3 & ~3;
|
||||||
|
stream->write(adc->adcBits, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32
|
static int32
|
||||||
getSizeADC(void *object, int32 offset, int32)
|
getSizeADC(void *object, int32 offset, int32)
|
||||||
{
|
{
|
||||||
|
Geometry *geometry = (Geometry*)object;
|
||||||
ADCData *adc = PLUGINOFFSET(ADCData, object, offset);
|
ADCData *adc = PLUGINOFFSET(ADCData, object, offset);
|
||||||
return adc->adcFormatted ? 16 : -1;
|
if(!adc->adcFormatted)
|
||||||
|
return -1;
|
||||||
|
if(geometry->geoflags & Geometry::NATIVE)
|
||||||
|
return 16;
|
||||||
|
return 16 + (adc->numBits+3 & ~3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
registerADCPlugin(void)
|
registerADCPlugin(void)
|
||||||
{
|
{
|
||||||
Geometry::registerPlugin(sizeof(ADCData), ID_ADC,
|
Geometry::registerPlugin(sizeof(ADCData), ID_ADC,
|
||||||
createADC, NULL, copyADC);
|
createADC, destroyADC, copyADC);
|
||||||
Geometry::registerPluginStream(ID_ADC,
|
Geometry::registerPluginStream(ID_ADC,
|
||||||
readADC,
|
readADC,
|
||||||
writeADC,
|
writeADC,
|
||||||
|
@ -97,6 +97,7 @@ PluginBase<T>::streamReadPlugins(Stream *stream)
|
|||||||
(void*)this, p->offset, p->size);
|
(void*)this, p->offset, p->size);
|
||||||
goto cont;
|
goto cont;
|
||||||
}
|
}
|
||||||
|
// printf("skipping plugin %X\n", header.type);
|
||||||
stream->seek(header.length);
|
stream->seek(header.length);
|
||||||
cont:
|
cont:
|
||||||
length -= header.length;
|
length -= header.length;
|
||||||
|
@ -84,12 +84,15 @@ int32 getSizeNativeSkin(void *object, int32 offset);
|
|||||||
|
|
||||||
// ADC plugin
|
// ADC plugin
|
||||||
|
|
||||||
// The plugin is a little crippled due to lack of documentation
|
// Each element in adcBits corresponds to an index in Mesh->indices,
|
||||||
|
// this assumes the Mesh indices are ADC formatted.
|
||||||
|
// For some reason ADCData->numBits != Mesh->numIndices
|
||||||
|
|
||||||
struct ADCData
|
struct ADCData
|
||||||
{
|
{
|
||||||
// only information we can get from GTA DFFs :/
|
bool32 adcFormatted;
|
||||||
uint32 adcFormatted;
|
int8 *adcBits;
|
||||||
|
int32 numBits;
|
||||||
};
|
};
|
||||||
|
|
||||||
void registerADCPlugin(void);
|
void registerADCPlugin(void);
|
||||||
|
@ -239,6 +239,7 @@ static void
|
|||||||
readVertexFmt(Stream *stream, int32, void *object, int32 offset, int32)
|
readVertexFmt(Stream *stream, int32, void *object, int32 offset, int32)
|
||||||
{
|
{
|
||||||
uint32 fmt = stream->readU32();
|
uint32 fmt = stream->readU32();
|
||||||
|
printf("vertexfmt: %X\n", fmt);
|
||||||
*PLUGINOFFSET(uint32, object, offset) = fmt;
|
*PLUGINOFFSET(uint32, object, offset) = fmt;
|
||||||
// TODO: create and attach "vertex shader"
|
// TODO: create and attach "vertex shader"
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user