mirror of
https://github.com/aap/librw.git
synced 2025-12-20 01:19:51 +00:00
made (most of) streaming work on big endian
This commit is contained in:
@@ -101,6 +101,7 @@ destroyNativeData(void *object, int32, int32)
|
||||
Stream*
|
||||
readNativeData(Stream *stream, int32, void *object, int32, int32)
|
||||
{
|
||||
ASSERTLITTLE;
|
||||
Geometry *geometry = (Geometry*)object;
|
||||
uint32 platform;
|
||||
if(!findChunk(stream, ID_STRUCT, nil, nil)){
|
||||
@@ -118,7 +119,7 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
||||
|
||||
int32 size = stream->readI32();
|
||||
uint8 *data = rwNewT(uint8, size, MEMDUR_FUNCTION | ID_GEOMETRY);
|
||||
stream->read(data, size);
|
||||
stream->read8(data, size);
|
||||
uint8 *p = data;
|
||||
header->serialNumber = *(uint16*)p; p += 2;
|
||||
header->numMeshes = *(uint16*)p; p += 2;
|
||||
@@ -149,14 +150,14 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
||||
assert(inst->indexBuffer == nil);
|
||||
inst->indexBuffer = createIndexBuffer(inst->numIndices*2, false);
|
||||
uint16 *indices = lockIndices(inst->indexBuffer, 0, 0, 0);
|
||||
stream->read(indices, 2*inst->numIndices);
|
||||
stream->read8(indices, 2*inst->numIndices);
|
||||
unlockIndices(inst->indexBuffer);
|
||||
|
||||
inst->managed = 1;
|
||||
assert(inst->vertexBuffer == nil);
|
||||
inst->vertexBuffer = createVertexBuffer(inst->stride*inst->numVertices, 0, false);
|
||||
uint8 *verts = lockVertices(inst->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
|
||||
stream->read(verts, inst->stride*inst->numVertices);
|
||||
stream->read8(verts, inst->stride*inst->numVertices);
|
||||
unlockVertices(inst->vertexBuffer);
|
||||
|
||||
inst++;
|
||||
@@ -167,6 +168,7 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
||||
Stream*
|
||||
writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
|
||||
{
|
||||
ASSERTLITTLE;
|
||||
Geometry *geometry = (Geometry*)object;
|
||||
writeChunkHeader(stream, ID_STRUCT, len-12);
|
||||
if(geometry->instData == nil ||
|
||||
@@ -200,17 +202,17 @@ writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
|
||||
*p++ = inst->remapped;
|
||||
inst++;
|
||||
}
|
||||
stream->write(data, size);
|
||||
stream->write8(data, size);
|
||||
rwFree(data);
|
||||
|
||||
inst = header->inst;
|
||||
for(uint32 i = 0; i < header->numMeshes; i++){
|
||||
uint16 *indices = lockIndices(inst->indexBuffer, 0, 0, 0);
|
||||
stream->write(indices, 2*inst->numIndices);
|
||||
stream->write8(indices, 2*inst->numIndices);
|
||||
unlockIndices(inst->indexBuffer);
|
||||
|
||||
uint8 *verts = lockVertices(inst->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
|
||||
stream->write(verts, inst->stride*inst->numVertices);
|
||||
stream->write8(verts, inst->stride*inst->numVertices);
|
||||
unlockVertices(inst->vertexBuffer);
|
||||
inst++;
|
||||
}
|
||||
@@ -448,10 +450,10 @@ readAsImage(Stream *stream, int32 width, int32 height, int32 depth, int32 format
|
||||
|
||||
if(format & Raster::PAL4){
|
||||
pallen = 16;
|
||||
stream->read(palette, 4*32);
|
||||
stream->read8(palette, 4*32);
|
||||
}else if(format & Raster::PAL8){
|
||||
pallen = 256;
|
||||
stream->read(palette, 4*256);
|
||||
stream->read8(palette, 4*256);
|
||||
}
|
||||
if(!Raster::formatHasAlpha(format))
|
||||
for(int32 i = 0; i < pallen; i++)
|
||||
@@ -462,7 +464,7 @@ readAsImage(Stream *stream, int32 width, int32 height, int32 depth, int32 format
|
||||
uint32 size = stream->readU32();
|
||||
if(i == 0){
|
||||
data = rwNewT(uint8, size, MEMDUR_FUNCTION | ID_IMAGE);
|
||||
stream->read(data, size);
|
||||
stream->read8(data, size);
|
||||
}else
|
||||
stream->seek(size);
|
||||
}
|
||||
@@ -509,8 +511,8 @@ readNativeTexture(Stream *stream)
|
||||
|
||||
// Texture
|
||||
tex->filterAddressing = stream->readU32();
|
||||
stream->read(tex->name, 32);
|
||||
stream->read(tex->mask, 32);
|
||||
stream->read8(tex->name, 32);
|
||||
stream->read8(tex->mask, 32);
|
||||
|
||||
// Raster
|
||||
uint32 format = stream->readU32();
|
||||
@@ -547,7 +549,7 @@ readNativeTexture(Stream *stream)
|
||||
// TODO: check if format supported and convert if necessary
|
||||
|
||||
if(pallength != 0)
|
||||
stream->read(ras->palette, 4*pallength);
|
||||
stream->read8(ras->palette, 4*pallength);
|
||||
|
||||
uint32 size;
|
||||
uint8 *data;
|
||||
@@ -555,7 +557,7 @@ readNativeTexture(Stream *stream)
|
||||
size = stream->readU32();
|
||||
if(i < raster->getNumLevels()){
|
||||
data = raster->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH);
|
||||
stream->read(data, size);
|
||||
stream->read8(data, size);
|
||||
raster->unlock(i);
|
||||
}else
|
||||
stream->seek(size);
|
||||
@@ -572,8 +574,8 @@ writeNativeTexture(Texture *tex, Stream *stream)
|
||||
|
||||
// Texture
|
||||
stream->writeU32(tex->filterAddressing);
|
||||
stream->write(tex->name, 32);
|
||||
stream->write(tex->mask, 32);
|
||||
stream->write8(tex->name, 32);
|
||||
stream->write8(tex->mask, 32);
|
||||
|
||||
// Raster
|
||||
Raster *raster = tex->raster;
|
||||
@@ -608,9 +610,9 @@ writeNativeTexture(Texture *tex, Stream *stream)
|
||||
stream->writeU8(compression);
|
||||
|
||||
if(raster->format & Raster::PAL4)
|
||||
stream->write(ras->palette, 4*32);
|
||||
stream->write8(ras->palette, 4*32);
|
||||
else if(raster->format & Raster::PAL8)
|
||||
stream->write(ras->palette, 4*256);
|
||||
stream->write8(ras->palette, 4*256);
|
||||
|
||||
uint32 size;
|
||||
uint8 *data;
|
||||
@@ -618,7 +620,7 @@ writeNativeTexture(Texture *tex, Stream *stream)
|
||||
size = getLevelSize(raster, i);
|
||||
stream->writeU32(size);
|
||||
data = raster->lock(i, Raster::LOCKREAD);
|
||||
stream->write(data, size);
|
||||
stream->write8(data, size);
|
||||
raster->unlock(i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,6 +149,7 @@ destroyNativeData(void *object, int32, int32)
|
||||
Stream*
|
||||
readNativeData(Stream *stream, int32, void *object, int32, int32)
|
||||
{
|
||||
ASSERTLITTLE;
|
||||
Geometry *geometry = (Geometry*)object;
|
||||
uint32 platform;
|
||||
if(!findChunk(stream, ID_STRUCT, nil, nil)){
|
||||
@@ -166,7 +167,7 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
||||
|
||||
int32 size = stream->readI32();
|
||||
uint8 *data = rwNewT(uint8, size, MEMDUR_FUNCTION | ID_GEOMETRY);
|
||||
stream->read(data, size);
|
||||
stream->read8(data, size);
|
||||
uint8 *p = data;
|
||||
header->serialNumber = *(uint32*)p; p += 4;
|
||||
header->numMeshes = *(uint32*)p; p += 4;
|
||||
@@ -196,19 +197,19 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
||||
|
||||
VertexElement elements[NUMDECLELT];
|
||||
uint32 numDeclarations = stream->readU32();
|
||||
stream->read(elements, numDeclarations*8);
|
||||
stream->read8(elements, numDeclarations*8);
|
||||
header->vertexDeclaration = createVertexDeclaration(elements);
|
||||
|
||||
assert(header->indexBuffer == nil);
|
||||
header->indexBuffer = createIndexBuffer(header->totalNumIndex*2, false);
|
||||
uint16 *indices = lockIndices(header->indexBuffer, 0, 0, 0);
|
||||
stream->read(indices, 2*header->totalNumIndex);
|
||||
stream->read8(indices, 2*header->totalNumIndex);
|
||||
unlockIndices(header->indexBuffer);
|
||||
|
||||
VertexStream *s;
|
||||
p = data;
|
||||
for(int i = 0; i < 2; i++){
|
||||
stream->read(p, 16);
|
||||
stream->read8(p, 16);
|
||||
s = &header->vertexStream[i];
|
||||
s->vertexBuffer = (void*)(uintptr)*(uint32*)p; p += 4;
|
||||
s->offset = 0; p += 4;
|
||||
@@ -223,7 +224,7 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
||||
assert(s->vertexBuffer == nil);
|
||||
s->vertexBuffer = createVertexBuffer(s->stride*header->totalNumVertex, 0, false);
|
||||
uint8 *verts = lockVertices(s->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
|
||||
stream->read(verts, s->stride*header->totalNumVertex);
|
||||
stream->read8(verts, s->stride*header->totalNumVertex);
|
||||
unlockVertices(s->vertexBuffer);
|
||||
}
|
||||
|
||||
@@ -241,6 +242,7 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
||||
Stream*
|
||||
writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
|
||||
{
|
||||
ASSERTLITTLE;
|
||||
Geometry *geometry = (Geometry*)object;
|
||||
writeChunkHeader(stream, ID_STRUCT, len-12);
|
||||
if(geometry->instData == nil ||
|
||||
@@ -277,15 +279,15 @@ writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
|
||||
*(uint32*)p = inst->numPrimitives; p += 4;
|
||||
inst++;
|
||||
}
|
||||
stream->write(data, size);
|
||||
stream->write8(data, size);
|
||||
|
||||
VertexElement elements[NUMDECLELT];
|
||||
uint32 numElt = getDeclaration(header->vertexDeclaration, elements);
|
||||
stream->writeU32(numElt);
|
||||
stream->write(elements, 8*numElt);
|
||||
stream->write8(elements, 8*numElt);
|
||||
|
||||
uint16 *indices = lockIndices(header->indexBuffer, 0, 0, 0);
|
||||
stream->write(indices, 2*header->totalNumIndex);
|
||||
stream->write8(indices, 2*header->totalNumIndex);
|
||||
unlockIndices(header->indexBuffer);
|
||||
|
||||
VertexStream *s;
|
||||
@@ -298,12 +300,12 @@ writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
|
||||
*(uint16*)p = s->geometryFlags; p += 2;
|
||||
*p++ = s->managed;
|
||||
*p++ = s->dynamicLock;
|
||||
stream->write(data, 16);
|
||||
stream->write8(data, 16);
|
||||
|
||||
if(s->vertexBuffer == nil)
|
||||
continue;
|
||||
uint8 *verts = lockVertices(s->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
|
||||
stream->write(verts, s->stride*header->totalNumVertex);
|
||||
stream->write8(verts, s->stride*header->totalNumVertex);
|
||||
unlockVertices(s->vertexBuffer);
|
||||
}
|
||||
|
||||
@@ -708,8 +710,8 @@ readNativeTexture(Stream *stream)
|
||||
|
||||
// Texture
|
||||
tex->filterAddressing = stream->readU32();
|
||||
stream->read(tex->name, 32);
|
||||
stream->read(tex->mask, 32);
|
||||
stream->read8(tex->name, 32);
|
||||
stream->read8(tex->mask, 32);
|
||||
|
||||
// Raster
|
||||
int32 format = stream->readI32();
|
||||
@@ -756,9 +758,9 @@ readNativeTexture(Stream *stream)
|
||||
// TODO: check if format supported and convert if necessary
|
||||
|
||||
if(raster->format & Raster::PAL4)
|
||||
stream->read(ext->palette, 4*32);
|
||||
stream->read8(ext->palette, 4*32);
|
||||
else if(raster->format & Raster::PAL8)
|
||||
stream->read(ext->palette, 4*256);
|
||||
stream->read8(ext->palette, 4*256);
|
||||
|
||||
uint32 size;
|
||||
uint8 *data;
|
||||
@@ -766,7 +768,7 @@ readNativeTexture(Stream *stream)
|
||||
size = stream->readU32();
|
||||
if(i < raster->getNumLevels()){
|
||||
data = raster->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH);
|
||||
stream->read(data, size);
|
||||
stream->read8(data, size);
|
||||
raster->unlock(i);
|
||||
}else
|
||||
stream->seek(size);
|
||||
@@ -783,8 +785,8 @@ writeNativeTexture(Texture *tex, Stream *stream)
|
||||
|
||||
// Texture
|
||||
stream->writeU32(tex->filterAddressing);
|
||||
stream->write(tex->name, 32);
|
||||
stream->write(tex->mask, 32);
|
||||
stream->write8(tex->name, 32);
|
||||
stream->write8(tex->mask, 32);
|
||||
|
||||
// Raster
|
||||
Raster *raster = tex->raster;
|
||||
@@ -806,9 +808,9 @@ writeNativeTexture(Texture *tex, Stream *stream)
|
||||
stream->writeU8(flags);
|
||||
|
||||
if(raster->format & Raster::PAL4)
|
||||
stream->write(ext->palette, 4*32);
|
||||
stream->write8(ext->palette, 4*32);
|
||||
else if(raster->format & Raster::PAL8)
|
||||
stream->write(ext->palette, 4*256);
|
||||
stream->write8(ext->palette, 4*256);
|
||||
|
||||
uint32 size;
|
||||
uint8 *data;
|
||||
@@ -816,7 +818,7 @@ writeNativeTexture(Texture *tex, Stream *stream)
|
||||
size = getLevelSize(raster, i);
|
||||
stream->writeU32(size);
|
||||
data = raster->lock(i, Raster::LOCKREAD);
|
||||
stream->write(data, size);
|
||||
stream->write8(data, size);
|
||||
raster->unlock(i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,6 +67,7 @@ destroyNativeData(void *object, int32, int32)
|
||||
Stream*
|
||||
readNativeData(Stream *stream, int32, void *object, int32, int32)
|
||||
{
|
||||
ASSERTLITTLE;
|
||||
Geometry *geometry = (Geometry*)object;
|
||||
uint32 vers;
|
||||
uint32 platform;
|
||||
@@ -92,7 +93,7 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
||||
// We don't have it but it's used for alignment.
|
||||
header->data = rwNewT(uint8, size + 0x18, MEMDUR_EVENT | ID_GEOMETRY);
|
||||
uint8 *p = header->data+0x18+4;
|
||||
stream->read(p, size-4);
|
||||
stream->read8(p, size-4);
|
||||
|
||||
header->size = size;
|
||||
header->serialNumber = *(uint16*)p; p += 2;
|
||||
@@ -120,13 +121,14 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
||||
header->end = inst;
|
||||
|
||||
header->vertexBuffer = rwNewT(uint8, header->stride*header->numVertices, MEMDUR_EVENT | ID_GEOMETRY);
|
||||
stream->read(header->vertexBuffer, header->stride*header->numVertices);
|
||||
stream->read8(header->vertexBuffer, header->stride*header->numVertices);
|
||||
return stream;
|
||||
}
|
||||
|
||||
Stream*
|
||||
writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
|
||||
{
|
||||
ASSERTLITTLE;
|
||||
Geometry *geometry = (Geometry*)object;
|
||||
writeChunkHeader(stream, ID_STRUCT, len-12);
|
||||
if(geometry->instData == nil ||
|
||||
@@ -160,8 +162,8 @@ writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
|
||||
inst++;
|
||||
}
|
||||
|
||||
stream->write(header->data+0x18, header->size);
|
||||
stream->write(header->vertexBuffer, header->stride*header->numVertices);
|
||||
stream->write8(header->data+0x18, header->size);
|
||||
stream->write8(header->vertexBuffer, header->stride*header->numVertices);
|
||||
return stream;
|
||||
}
|
||||
|
||||
@@ -823,8 +825,8 @@ readNativeTexture(Stream *stream)
|
||||
|
||||
// Texture
|
||||
tex->filterAddressing = stream->readU32();
|
||||
stream->read(tex->name, 32);
|
||||
stream->read(tex->mask, 32);
|
||||
stream->read8(tex->name, 32);
|
||||
stream->read8(tex->mask, 32);
|
||||
|
||||
// Raster
|
||||
int32 format = stream->readI32();
|
||||
@@ -856,13 +858,13 @@ readNativeTexture(Stream *stream)
|
||||
tex->raster = raster;
|
||||
|
||||
if(raster->format & Raster::PAL4)
|
||||
stream->read(ras->palette, 4*32);
|
||||
stream->read8(ras->palette, 4*32);
|
||||
else if(raster->format & Raster::PAL8)
|
||||
stream->read(ras->palette, 4*256);
|
||||
stream->read8(ras->palette, 4*256);
|
||||
|
||||
// exploit the fact that mipmaps are allocated consecutively
|
||||
uint8 *data = raster->lock(0, Raster::LOCKWRITE|Raster::LOCKNOFETCH);
|
||||
stream->read(data, totalSize);
|
||||
stream->read8(data, totalSize);
|
||||
raster->unlock(0);
|
||||
|
||||
return tex;
|
||||
@@ -877,8 +879,8 @@ writeNativeTexture(Texture *tex, Stream *stream)
|
||||
|
||||
// Texture
|
||||
stream->writeU32(tex->filterAddressing);
|
||||
stream->write(tex->name, 32);
|
||||
stream->write(tex->mask, 32);
|
||||
stream->write8(tex->name, 32);
|
||||
stream->write8(tex->mask, 32);
|
||||
|
||||
// Raster
|
||||
Raster *raster = tex->raster;
|
||||
@@ -901,13 +903,13 @@ writeNativeTexture(Texture *tex, Stream *stream)
|
||||
stream->writeI32(totalSize);
|
||||
|
||||
if(raster->format & Raster::PAL4)
|
||||
stream->write(ras->palette, 4*32);
|
||||
stream->write8(ras->palette, 4*32);
|
||||
else if(raster->format & Raster::PAL8)
|
||||
stream->write(ras->palette, 4*256);
|
||||
stream->write8(ras->palette, 4*256);
|
||||
|
||||
// exploit the fact that mipmaps are allocated consecutively
|
||||
uint8 *data = raster->lock(0, Raster::LOCKREAD);
|
||||
stream->write(data, totalSize);
|
||||
stream->write8(data, totalSize);
|
||||
raster->unlock(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ struct NativeSkin
|
||||
Stream*
|
||||
readNativeSkin(Stream *stream, int32, void *object, int32 offset)
|
||||
{
|
||||
ASSERTLITTLE;
|
||||
Geometry *geometry = (Geometry*)object;
|
||||
uint32 vers, platform;
|
||||
if(!findChunk(stream, ID_STRUCT, nil, &vers)){
|
||||
@@ -53,16 +54,16 @@ readNativeSkin(Stream *stream, int32, void *object, int32 offset)
|
||||
skin->init(numBones, 0, 0);
|
||||
NativeSkin *natskin = rwNewT(NativeSkin, 1, MEMDUR_EVENT | ID_SKIN);
|
||||
skin->platformData = natskin;
|
||||
stream->read(natskin->table1, 256*sizeof(int32));
|
||||
stream->read(natskin->table2, 256*sizeof(int32));
|
||||
stream->read32(natskin->table1, 256*sizeof(int32));
|
||||
stream->read32(natskin->table2, 256*sizeof(int32));
|
||||
natskin->numUsedBones = stream->readI32();
|
||||
skin->numWeights = stream->readI32();
|
||||
stream->seek(4); // skip pointer to vertexBuffer
|
||||
natskin->stride = stream->readI32();
|
||||
int32 size = geometry->numVertices*natskin->stride;
|
||||
natskin->vertexBuffer = rwNewT(uint8, size, MEMDUR_EVENT | ID_SKIN);
|
||||
stream->read(natskin->vertexBuffer, size);
|
||||
stream->read(skin->inverseMatrices, skin->numBones*64);
|
||||
stream->read8(natskin->vertexBuffer, size);
|
||||
stream->read32(skin->inverseMatrices, skin->numBones*64);
|
||||
|
||||
readSkinSplitData(stream, skin);
|
||||
return stream;
|
||||
@@ -71,6 +72,7 @@ readNativeSkin(Stream *stream, int32, void *object, int32 offset)
|
||||
Stream*
|
||||
writeNativeSkin(Stream *stream, int32 len, void *object, int32 offset)
|
||||
{
|
||||
ASSERTLITTLE;
|
||||
Geometry *geometry = (Geometry*)object;
|
||||
Skin *skin = *PLUGINOFFSET(Skin*, object, offset);
|
||||
assert(skin->platformData);
|
||||
@@ -80,15 +82,15 @@ writeNativeSkin(Stream *stream, int32 len, void *object, int32 offset)
|
||||
writeChunkHeader(stream, ID_STRUCT, len-12);
|
||||
stream->writeU32(PLATFORM_XBOX);
|
||||
stream->writeI32(skin->numBones);
|
||||
stream->write(natskin->table1, 256*sizeof(int32));
|
||||
stream->write(natskin->table2, 256*sizeof(int32));
|
||||
stream->write32(natskin->table1, 256*sizeof(int32));
|
||||
stream->write32(natskin->table2, 256*sizeof(int32));
|
||||
stream->writeI32(natskin->numUsedBones);
|
||||
stream->writeI32(skin->numWeights);
|
||||
stream->writeU32(0xBADEAFFE); // pointer to vertexBuffer
|
||||
stream->writeI32(natskin->stride);
|
||||
stream->write(natskin->vertexBuffer,
|
||||
stream->write8(natskin->vertexBuffer,
|
||||
geometry->numVertices*natskin->stride);
|
||||
stream->write(skin->inverseMatrices, skin->numBones*64);
|
||||
stream->write32(skin->inverseMatrices, skin->numBones*64);
|
||||
|
||||
writeSkinSplitData(stream, skin);
|
||||
return stream;
|
||||
|
||||
Reference in New Issue
Block a user