mirror of https://github.com/aap/librw.git
Implemented MatFX.
This commit is contained in:
parent
e373b47041
commit
e1bb20c800
|
@ -18,6 +18,9 @@ main(int argc, char *argv[])
|
||||||
|
|
||||||
// Rw::Version = 0x33002;
|
// Rw::Version = 0x33002;
|
||||||
|
|
||||||
|
Rw::RegisterMaterialRightsPlugin();
|
||||||
|
Rw::RegisterMatFXPlugin();
|
||||||
|
Rw::RegisterAtomicRightsPlugin();
|
||||||
Rw::RegisterNodeNamePlugin();
|
Rw::RegisterNodeNamePlugin();
|
||||||
Rw::RegisterBreakableModelPlugin();
|
Rw::RegisterBreakableModelPlugin();
|
||||||
Rw::RegisterExtraVertColorPlugin();
|
Rw::RegisterExtraVertColorPlugin();
|
||||||
|
@ -26,6 +29,7 @@ main(int argc, char *argv[])
|
||||||
Rw::RegisterNativeDataPlugin();
|
Rw::RegisterNativeDataPlugin();
|
||||||
// Rw::Ps2::RegisterNativeDataPlugin();
|
// Rw::Ps2::RegisterNativeDataPlugin();
|
||||||
Rw::RegisterMeshPlugin();
|
Rw::RegisterMeshPlugin();
|
||||||
|
|
||||||
Rw::Clump *c;
|
Rw::Clump *c;
|
||||||
|
|
||||||
// ifstream in(argv[1], ios::binary);
|
// ifstream in(argv[1], ios::binary);
|
||||||
|
@ -45,6 +49,7 @@ main(int argc, char *argv[])
|
||||||
in.open(data, len);
|
in.open(data, len);
|
||||||
|
|
||||||
Rw::FindChunk(&in, Rw::ID_CLUMP, NULL, NULL);
|
Rw::FindChunk(&in, Rw::ID_CLUMP, NULL, NULL);
|
||||||
|
Rw::DebugFile = argv[1];
|
||||||
c = Rw::Clump::streamRead(&in);
|
c = Rw::Clump::streamRead(&in);
|
||||||
assert(c != NULL);
|
assert(c != NULL);
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,9 @@ makeFrameList(Frame *frame, Frame **flist)
|
||||||
return flist;
|
return flist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Clump
|
||||||
|
//
|
||||||
|
|
||||||
Clump::Clump(void)
|
Clump::Clump(void)
|
||||||
{
|
{
|
||||||
|
@ -367,6 +369,9 @@ Clump::frameListStreamWrite(Stream *stream, Frame **frameList, int32 numFrames)
|
||||||
frameList[i]->streamWritePlugins(stream);
|
frameList[i]->streamWritePlugins(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Atomic
|
||||||
|
//
|
||||||
|
|
||||||
Atomic::Atomic(void)
|
Atomic::Atomic(void)
|
||||||
{
|
{
|
||||||
|
@ -430,6 +435,33 @@ Atomic::streamGetSize(void)
|
||||||
return 12 + 16 + 12 + this->streamGetPluginSize();
|
return 12 + 16 + 12 + this->streamGetPluginSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Atomic Rights plugin
|
||||||
|
|
||||||
|
static void
|
||||||
|
readAtomicRights(Stream *stream, int32, void *, int32, int32)
|
||||||
|
{
|
||||||
|
uint32 buffer[2];
|
||||||
|
uint32 version;
|
||||||
|
stream->seek(-4);
|
||||||
|
version = stream->readU32();
|
||||||
|
stream->read(buffer, 8);
|
||||||
|
// printf("atomicrights: %s %X %X %X\n", DebugFile, LibraryIDUnpackVersion(version), buffer[0], buffer[1]);
|
||||||
|
printf("atomicrights: %X %X %X\n", LibraryIDUnpackVersion(version), buffer[0], buffer[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
RegisterAtomicRightsPlugin(void)
|
||||||
|
{
|
||||||
|
Atomic::registerPlugin(0, ID_RIGHTTORENDER, NULL, NULL, NULL);
|
||||||
|
Atomic::registerPluginStream(ID_RIGHTTORENDER,
|
||||||
|
(StreamRead)readAtomicRights,
|
||||||
|
NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Light
|
||||||
|
//
|
||||||
|
|
||||||
Light::Light(void)
|
Light::Light(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -269,7 +269,9 @@ Geometry::addMorphTargets(int32 n)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Material
|
||||||
|
//
|
||||||
|
|
||||||
Material::Material(void)
|
Material::Material(void)
|
||||||
{
|
{
|
||||||
|
@ -383,7 +385,29 @@ Material::streamGetSize(void)
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Material Rights plugin
|
||||||
|
|
||||||
|
static void
|
||||||
|
readMaterialRights(Stream *stream, int32, void *, int32, int32)
|
||||||
|
{
|
||||||
|
uint32 buffer[2];
|
||||||
|
stream->read(buffer, 8);
|
||||||
|
printf("materialrights: %X %X\n", buffer[0], buffer[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
RegisterMaterialRightsPlugin(void)
|
||||||
|
{
|
||||||
|
Material::registerPlugin(0, ID_RIGHTTORENDER, NULL, NULL, NULL);
|
||||||
|
Material::registerPluginStream(ID_RIGHTTORENDER,
|
||||||
|
(StreamRead)readMaterialRights,
|
||||||
|
NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Texture
|
||||||
|
//
|
||||||
|
|
||||||
Texture::Texture(void)
|
Texture::Texture(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -229,12 +229,12 @@ destroySkin(void *object, int32 offset, int32)
|
||||||
static void*
|
static void*
|
||||||
copySkin(void *dst, void *src, int32 offset, int32)
|
copySkin(void *dst, void *src, int32 offset, int32)
|
||||||
{
|
{
|
||||||
Geometry *geometry = (Geometry*)src;
|
|
||||||
assert(geometry->instData == NULL);
|
|
||||||
assert(((Geometry*)src)->numVertices == ((Geometry*)dst)->numVertices);
|
|
||||||
Skin *srcskin = *PLUGINOFFSET(Skin*, src, offset);
|
Skin *srcskin = *PLUGINOFFSET(Skin*, src, offset);
|
||||||
if(srcskin == NULL)
|
if(srcskin == NULL)
|
||||||
return dst;
|
return dst;
|
||||||
|
Geometry *geometry = (Geometry*)src;
|
||||||
|
assert(geometry->instData == NULL);
|
||||||
|
assert(((Geometry*)src)->numVertices == ((Geometry*)dst)->numVertices);
|
||||||
Skin *dstskin = new Skin;
|
Skin *dstskin = new Skin;
|
||||||
*PLUGINOFFSET(Skin*, dst, offset) = dstskin;
|
*PLUGINOFFSET(Skin*, dst, offset) = dstskin;
|
||||||
dstskin->numBones = srcskin->numBones;
|
dstskin->numBones = srcskin->numBones;
|
||||||
|
@ -413,9 +413,330 @@ RegisterSkinPlugin(void)
|
||||||
Geometry::registerPlugin(sizeof(Skin*), ID_SKIN,
|
Geometry::registerPlugin(sizeof(Skin*), ID_SKIN,
|
||||||
createSkin, destroySkin, copySkin);
|
createSkin, destroySkin, copySkin);
|
||||||
Geometry::registerPluginStream(ID_SKIN,
|
Geometry::registerPluginStream(ID_SKIN,
|
||||||
(StreamRead)readSkin,
|
readSkin, writeSkin, getSizeSkin);
|
||||||
(StreamWrite)writeSkin,
|
}
|
||||||
(StreamGetSize)getSizeSkin);
|
|
||||||
|
// Atomic MatFX
|
||||||
|
|
||||||
|
static void*
|
||||||
|
createAtomicMatFX(void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
*PLUGINOFFSET(int32, object, offset) = 0;
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void*
|
||||||
|
copyAtomicMatFX(void *dst, void *src, int32 offset, int32)
|
||||||
|
{
|
||||||
|
*PLUGINOFFSET(int32, dst, offset) = *PLUGINOFFSET(int32, src, offset);
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
readAtomicMatFX(Stream *stream, int32, void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
int32 flag;
|
||||||
|
// uint32 version;
|
||||||
|
//stream->seek(-4);
|
||||||
|
//version = stream->readU32();
|
||||||
|
stream->read(&flag, 4);
|
||||||
|
//printf("atomicMatFX: %X %X\n", LibraryIDUnpackVersion(version), flag);
|
||||||
|
*PLUGINOFFSET(int32, object, offset) = flag;
|
||||||
|
// TODO: set Pipeline
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
writeAtomicMatFX(Stream *stream, int32, void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
int32 flag;
|
||||||
|
flag = *PLUGINOFFSET(int32, object, offset);
|
||||||
|
stream->writeI32(flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32
|
||||||
|
getSizeAtomicMatFX(void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
int32 flag;
|
||||||
|
flag = *PLUGINOFFSET(int32, object, offset);
|
||||||
|
return flag ? 4 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Material MatFX
|
||||||
|
|
||||||
|
// TODO: Frames and Matrices?
|
||||||
|
static void
|
||||||
|
clearMatFX(MatFX *matfx)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < 2; i++)
|
||||||
|
switch(matfx->fx[i].type){
|
||||||
|
case MatFX::BUMPMAP:
|
||||||
|
if(matfx->fx[i].bump.bumpedTex)
|
||||||
|
matfx->fx[i].bump.bumpedTex->decRef();
|
||||||
|
if(matfx->fx[i].bump.tex)
|
||||||
|
matfx->fx[i].bump.tex->decRef();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MatFX::ENVMAP:
|
||||||
|
if(matfx->fx[i].env.tex)
|
||||||
|
matfx->fx[i].env.tex->decRef();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MatFX::DUAL:
|
||||||
|
if(matfx->fx[i].dual.tex)
|
||||||
|
matfx->fx[i].dual.tex->decRef();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
memset(matfx, 0, sizeof(MatFX));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MatFX::setEffects(uint32 flags)
|
||||||
|
{
|
||||||
|
if(this->flags != 0 && this->flags != flags)
|
||||||
|
clearMatFX(this);
|
||||||
|
this->flags = flags;
|
||||||
|
switch(flags){
|
||||||
|
case BUMPMAP:
|
||||||
|
case ENVMAP:
|
||||||
|
case DUAL:
|
||||||
|
case UVTRANSFORM:
|
||||||
|
this->fx[0].type = flags;
|
||||||
|
this->fx[1].type = NOTHING;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BUMPENVMAP:
|
||||||
|
this->fx[0].type = BUMPMAP;
|
||||||
|
this->fx[1].type = ENVMAP;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DUALUVTRANSFORM:
|
||||||
|
this->fx[0].type = UVTRANSFORM;
|
||||||
|
this->fx[1].type = DUAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32
|
||||||
|
MatFX::getEffectIndex(uint32 type)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < 2; i++)
|
||||||
|
if(this->fx[i].type == type)
|
||||||
|
return i;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void*
|
||||||
|
createMaterialMatFX(void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
*PLUGINOFFSET(MatFX*, object, offset) = NULL;
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void*
|
||||||
|
destroyMaterialMatFX(void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
MatFX *matfx = *PLUGINOFFSET(MatFX*, object, offset);
|
||||||
|
if(matfx){
|
||||||
|
clearMatFX(matfx);
|
||||||
|
delete matfx;
|
||||||
|
}
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void*
|
||||||
|
copyMaterialMatFX(void *dst, void *src, int32 offset, int32)
|
||||||
|
{
|
||||||
|
MatFX *srcfx = *PLUGINOFFSET(MatFX*, src, offset);
|
||||||
|
if(srcfx == NULL)
|
||||||
|
return dst;
|
||||||
|
MatFX *dstfx = new MatFX;
|
||||||
|
*PLUGINOFFSET(MatFX*, dst, offset) = dstfx;
|
||||||
|
memcpy(dstfx, srcfx, sizeof(MatFX));
|
||||||
|
for(int i = 0; i < 2; i++)
|
||||||
|
switch(dstfx->fx[i].type){
|
||||||
|
case MatFX::BUMPMAP:
|
||||||
|
if(dstfx->fx[i].bump.bumpedTex)
|
||||||
|
dstfx->fx[i].bump.bumpedTex->refCount++;
|
||||||
|
if(dstfx->fx[i].bump.tex)
|
||||||
|
dstfx->fx[i].bump.tex->refCount++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MatFX::ENVMAP:
|
||||||
|
if(dstfx->fx[i].env.tex)
|
||||||
|
dstfx->fx[i].env.tex->refCount++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MatFX::DUAL:
|
||||||
|
if(dstfx->fx[i].dual.tex)
|
||||||
|
dstfx->fx[i].dual.tex->refCount++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
readMaterialMatFX(Stream *stream, int32, void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
Texture *tex, *bumpedTex;
|
||||||
|
float coefficient;
|
||||||
|
int32 fbAlpha;
|
||||||
|
int32 srcBlend, dstBlend;
|
||||||
|
int32 idx;
|
||||||
|
|
||||||
|
MatFX *matfx = new MatFX;
|
||||||
|
memset(matfx, 0, sizeof(MatFX));
|
||||||
|
*PLUGINOFFSET(MatFX*, object, offset) = matfx;
|
||||||
|
matfx->setEffects(stream->readU32());
|
||||||
|
|
||||||
|
for(int i = 0; i < 2; i++){
|
||||||
|
uint32 type = stream->readU32();
|
||||||
|
switch(type){
|
||||||
|
case MatFX::BUMPMAP:
|
||||||
|
coefficient = stream->readF32();
|
||||||
|
bumpedTex = tex = NULL;
|
||||||
|
if(stream->readI32()){
|
||||||
|
assert(FindChunk(stream, ID_TEXTURE,
|
||||||
|
NULL, NULL));
|
||||||
|
bumpedTex = Texture::streamRead(stream);
|
||||||
|
}
|
||||||
|
if(stream->readI32()){
|
||||||
|
assert(FindChunk(stream, ID_TEXTURE,
|
||||||
|
NULL, NULL));
|
||||||
|
tex = Texture::streamRead(stream);
|
||||||
|
}
|
||||||
|
idx = matfx->getEffectIndex(type);
|
||||||
|
assert(idx >= 0);
|
||||||
|
matfx->fx[idx].bump.bumpedTex = bumpedTex;
|
||||||
|
matfx->fx[idx].bump.tex = tex;
|
||||||
|
matfx->fx[idx].bump.coefficient = coefficient;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MatFX::ENVMAP:
|
||||||
|
coefficient = stream->readF32();
|
||||||
|
fbAlpha = stream->readI32();
|
||||||
|
tex = NULL;
|
||||||
|
if(stream->readI32()){
|
||||||
|
assert(FindChunk(stream, ID_TEXTURE,
|
||||||
|
NULL, NULL));
|
||||||
|
tex = Texture::streamRead(stream);
|
||||||
|
}
|
||||||
|
idx = matfx->getEffectIndex(type);
|
||||||
|
assert(idx >= 0);
|
||||||
|
matfx->fx[idx].env.tex = tex;
|
||||||
|
matfx->fx[idx].env.fbAlpha = fbAlpha;
|
||||||
|
matfx->fx[idx].env.coefficient = coefficient;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MatFX::DUAL:
|
||||||
|
srcBlend = stream->readI32();
|
||||||
|
dstBlend = stream->readI32();
|
||||||
|
tex = NULL;
|
||||||
|
if(stream->readI32()){
|
||||||
|
assert(FindChunk(stream, ID_TEXTURE,
|
||||||
|
NULL, NULL));
|
||||||
|
tex = Texture::streamRead(stream);
|
||||||
|
}
|
||||||
|
idx = matfx->getEffectIndex(type);
|
||||||
|
assert(idx >= 0);
|
||||||
|
matfx->fx[idx].dual.tex = tex;
|
||||||
|
matfx->fx[idx].dual.srcBlend = srcBlend;
|
||||||
|
matfx->fx[idx].dual.dstBlend = dstBlend;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
writeMaterialMatFX(Stream *stream, int32, void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
MatFX *matfx = *PLUGINOFFSET(MatFX*, object, offset);
|
||||||
|
|
||||||
|
stream->writeU32(matfx->flags);
|
||||||
|
for(int i = 0; i < 2; i++){
|
||||||
|
stream->writeU32(matfx->fx[i].type);
|
||||||
|
switch(matfx->fx[i].type){
|
||||||
|
case MatFX::BUMPMAP:
|
||||||
|
stream->writeF32(matfx->fx[i].bump.coefficient);
|
||||||
|
stream->writeI32(matfx->fx[i].bump.bumpedTex != NULL);
|
||||||
|
if(matfx->fx[i].bump.bumpedTex)
|
||||||
|
matfx->fx[i].bump.bumpedTex->streamWrite(stream);
|
||||||
|
stream->writeI32(matfx->fx[i].bump.tex != NULL);
|
||||||
|
if(matfx->fx[i].bump.tex)
|
||||||
|
matfx->fx[i].bump.tex->streamWrite(stream);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MatFX::ENVMAP:
|
||||||
|
stream->writeF32(matfx->fx[i].env.coefficient);
|
||||||
|
stream->writeI32(matfx->fx[i].env.fbAlpha);
|
||||||
|
stream->writeI32(matfx->fx[i].env.tex != NULL);
|
||||||
|
if(matfx->fx[i].env.tex)
|
||||||
|
matfx->fx[i].env.tex->streamWrite(stream);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MatFX::DUAL:
|
||||||
|
stream->writeI32(matfx->fx[i].dual.srcBlend);
|
||||||
|
stream->writeI32(matfx->fx[i].dual.dstBlend);
|
||||||
|
stream->writeI32(matfx->fx[i].dual.tex != NULL);
|
||||||
|
if(matfx->fx[i].dual.tex)
|
||||||
|
matfx->fx[i].dual.tex->streamWrite(stream);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32
|
||||||
|
getSizeMaterialMatFX(void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
MatFX *matfx = *PLUGINOFFSET(MatFX*, object, offset);
|
||||||
|
if(matfx == NULL)
|
||||||
|
return -1;
|
||||||
|
int32 size = 4 + 4 + 4;
|
||||||
|
|
||||||
|
for(int i = 0; i < 2; i++)
|
||||||
|
switch(matfx->fx[i].type){
|
||||||
|
case MatFX::BUMPMAP:
|
||||||
|
size += 4 + 4 + 4;
|
||||||
|
if(matfx->fx[i].bump.bumpedTex)
|
||||||
|
size += 12 +
|
||||||
|
matfx->fx[i].bump.bumpedTex->streamGetSize();
|
||||||
|
if(matfx->fx[i].bump.tex)
|
||||||
|
size += 12 +
|
||||||
|
matfx->fx[i].bump.tex->streamGetSize();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MatFX::ENVMAP:
|
||||||
|
size += 4 + 4 + 4;
|
||||||
|
if(matfx->fx[i].env.tex)
|
||||||
|
size += 12 +
|
||||||
|
matfx->fx[i].env.tex->streamGetSize();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MatFX::DUAL:
|
||||||
|
size += 4 + 4 + 4;
|
||||||
|
if(matfx->fx[i].dual.tex)
|
||||||
|
size += 12 +
|
||||||
|
matfx->fx[i].dual.tex->streamGetSize();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
RegisterMatFXPlugin(void)
|
||||||
|
{
|
||||||
|
Atomic::registerPlugin(sizeof(int32), ID_MATFX,
|
||||||
|
createAtomicMatFX, NULL, copyAtomicMatFX);
|
||||||
|
Atomic::registerPluginStream(ID_MATFX,
|
||||||
|
readAtomicMatFX,
|
||||||
|
writeAtomicMatFX,
|
||||||
|
getSizeAtomicMatFX);
|
||||||
|
Material::registerPlugin(sizeof(MatFX*), ID_MATFX,
|
||||||
|
createMaterialMatFX, destroyMaterialMatFX,
|
||||||
|
copyMaterialMatFX);
|
||||||
|
Material::registerPluginStream(ID_MATFX,
|
||||||
|
readMaterialMatFX,
|
||||||
|
writeMaterialMatFX,
|
||||||
|
getSizeMaterialMatFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ namespace Rw {
|
||||||
|
|
||||||
int Version = 0x36003;
|
int Version = 0x36003;
|
||||||
int Build = 0xFFFF;
|
int Build = 0xFFFF;
|
||||||
|
char *DebugFile = NULL;
|
||||||
|
|
||||||
int32
|
int32
|
||||||
Stream::writeI8(int8 val)
|
Stream::writeI8(int8 val)
|
||||||
|
|
|
@ -110,12 +110,16 @@ enum PluginID
|
||||||
ID_UVANIMDICT = 0x2B,
|
ID_UVANIMDICT = 0x2B,
|
||||||
|
|
||||||
ID_SKIN = 0x116,
|
ID_SKIN = 0x116,
|
||||||
|
ID_MATFX = 0x120,
|
||||||
|
ID_PDS = 0x131,
|
||||||
ID_ADC = 0x134,
|
ID_ADC = 0x134,
|
||||||
|
ID_MESH = 0x50E,
|
||||||
ID_NATIVEDATA = 0x510,
|
ID_NATIVEDATA = 0x510,
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int Version;
|
extern int Version;
|
||||||
extern int Build;
|
extern int Build;
|
||||||
|
extern char *DebugFile;
|
||||||
|
|
||||||
inline uint32
|
inline uint32
|
||||||
LibraryIDPack(int version, int build)
|
LibraryIDPack(int version, int build)
|
||||||
|
|
109
src/rwobjects.h
109
src/rwobjects.h
|
@ -1,5 +1,12 @@
|
||||||
namespace Rw {
|
namespace Rw {
|
||||||
|
|
||||||
|
// TODO: mostly
|
||||||
|
struct Pipeline
|
||||||
|
{
|
||||||
|
uint32 pluginID;
|
||||||
|
uint32 pluginData;
|
||||||
|
};
|
||||||
|
|
||||||
struct Object
|
struct Object
|
||||||
{
|
{
|
||||||
uint8 type;
|
uint8 type;
|
||||||
|
@ -8,6 +15,28 @@ struct Object
|
||||||
void *parent;
|
void *parent;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Frame : PluginBase<Frame>, Object
|
||||||
|
{
|
||||||
|
typedef Frame *(*Callback)(Frame *f, void *data);
|
||||||
|
float32 matrix[16];
|
||||||
|
float32 ltm[16];
|
||||||
|
|
||||||
|
Frame *child;
|
||||||
|
Frame *next;
|
||||||
|
Frame *root;
|
||||||
|
|
||||||
|
// temporary
|
||||||
|
int32 matflag;
|
||||||
|
|
||||||
|
Frame(void);
|
||||||
|
Frame(Frame *f);
|
||||||
|
~Frame(void);
|
||||||
|
Frame *addChild(Frame *f);
|
||||||
|
Frame *removeChild(void);
|
||||||
|
Frame *forAllChildren(Callback cb, void *data);
|
||||||
|
int32 count(void);
|
||||||
|
};
|
||||||
|
|
||||||
struct Image
|
struct Image
|
||||||
{
|
{
|
||||||
int32 flags;
|
int32 flags;
|
||||||
|
@ -74,6 +103,56 @@ struct Material : PluginBase<Material>
|
||||||
uint32 streamGetSize(void);
|
uint32 streamGetSize(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct MatFX
|
||||||
|
{
|
||||||
|
enum Flags {
|
||||||
|
NOTHING = 0,
|
||||||
|
BUMPMAP,
|
||||||
|
ENVMAP,
|
||||||
|
BUMPENVMAP,
|
||||||
|
DUAL,
|
||||||
|
UVTRANSFORM,
|
||||||
|
DUALUVTRANSFORM
|
||||||
|
};
|
||||||
|
struct Bump {
|
||||||
|
Frame *frame;
|
||||||
|
Texture *bumpedTex;
|
||||||
|
Texture *tex;
|
||||||
|
float coefficient;
|
||||||
|
};
|
||||||
|
struct Env {
|
||||||
|
Frame *frame;
|
||||||
|
Texture *tex;
|
||||||
|
float coefficient;
|
||||||
|
int32 fbAlpha;
|
||||||
|
};
|
||||||
|
struct Dual {
|
||||||
|
Texture *tex;
|
||||||
|
int32 srcBlend;
|
||||||
|
int32 dstBlend;
|
||||||
|
};
|
||||||
|
struct UVtransform {
|
||||||
|
float *baseTransform;
|
||||||
|
float *dualTransform;
|
||||||
|
};
|
||||||
|
struct {
|
||||||
|
uint32 type;
|
||||||
|
union {
|
||||||
|
Bump bump;
|
||||||
|
Env env;
|
||||||
|
Dual dual;
|
||||||
|
UVtransform uvtransform;
|
||||||
|
};
|
||||||
|
} fx[2];
|
||||||
|
uint32 flags;
|
||||||
|
|
||||||
|
void setEffects(uint32 flags);
|
||||||
|
int32 getEffectIndex(uint32 type);
|
||||||
|
};
|
||||||
|
|
||||||
|
void RegisterMaterialRightsPlugin(void);
|
||||||
|
void RegisterMatFXPlugin(void);
|
||||||
|
|
||||||
struct Mesh
|
struct Mesh
|
||||||
{
|
{
|
||||||
uint16 *indices;
|
uint16 *indices;
|
||||||
|
@ -160,27 +239,9 @@ struct Skin
|
||||||
uint8 *data; // only used by delete
|
uint8 *data; // only used by delete
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Frame : PluginBase<Frame>, Object
|
void RegisterMeshPlugin(void);
|
||||||
{
|
void RegisterNativeDataPlugin(void);
|
||||||
typedef Frame *(*Callback)(Frame *f, void *data);
|
void RegisterSkinPlugin(void);
|
||||||
float32 matrix[16];
|
|
||||||
float32 ltm[16];
|
|
||||||
|
|
||||||
Frame *child;
|
|
||||||
Frame *next;
|
|
||||||
Frame *root;
|
|
||||||
|
|
||||||
// temporary
|
|
||||||
int32 matflag;
|
|
||||||
|
|
||||||
Frame(void);
|
|
||||||
Frame(Frame *f);
|
|
||||||
~Frame(void);
|
|
||||||
Frame *addChild(Frame *f);
|
|
||||||
Frame *removeChild(void);
|
|
||||||
Frame *forAllChildren(Callback cb, void *data);
|
|
||||||
int32 count(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Clump;
|
struct Clump;
|
||||||
|
|
||||||
|
@ -216,6 +277,8 @@ struct Atomic : PluginBase<Atomic>, Object
|
||||||
uint32 streamGetSize(void);
|
uint32 streamGetSize(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void RegisterAtomicRightsPlugin(void);
|
||||||
|
|
||||||
struct Clump : PluginBase<Clump>, Object
|
struct Clump : PluginBase<Clump>, Object
|
||||||
{
|
{
|
||||||
int32 numAtomics;
|
int32 numAtomics;
|
||||||
|
@ -237,8 +300,4 @@ private:
|
||||||
void frameListStreamWrite(Stream *stream, Frame **flp, int32 nf);
|
void frameListStreamWrite(Stream *stream, Frame **flp, int32 nf);
|
||||||
};
|
};
|
||||||
|
|
||||||
void RegisterMeshPlugin(void);
|
|
||||||
void RegisterNativeDataPlugin(void);
|
|
||||||
void RegisterSkinPlugin(void);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,8 @@ PluginBase<T>::streamWritePlugins(Stream *stream)
|
||||||
int size = this->streamGetPluginSize();
|
int size = this->streamGetPluginSize();
|
||||||
Rw::WriteChunkHeader(stream, Rw::ID_EXTENSION, size);
|
Rw::WriteChunkHeader(stream, Rw::ID_EXTENSION, size);
|
||||||
for(Plugin *p = this->s_plugins; p; p = p->next){
|
for(Plugin *p = this->s_plugins; p; p = p->next){
|
||||||
if((size = p->getSize(this, p->offset, p->size)) < 0)
|
if(p->getSize == NULL ||
|
||||||
|
(size = p->getSize(this, p->offset, p->size)) < 0)
|
||||||
continue;
|
continue;
|
||||||
Rw::WriteChunkHeader(stream, p->id, size);
|
Rw::WriteChunkHeader(stream, p->id, size);
|
||||||
p->write(stream, size, this, p->offset, p->size);
|
p->write(stream, size, this, p->offset, p->size);
|
||||||
|
|
Loading…
Reference in New Issue