mirror of https://github.com/aap/librw.git
Implemented R* env and spec plugins.
This commit is contained in:
parent
8cd30a4dfd
commit
542e56d7a2
3
TODO
3
TODO
|
@ -24,12 +24,11 @@ Clump & related:
|
||||||
-Skin
|
-Skin
|
||||||
R* 2dfx
|
R* 2dfx
|
||||||
Material
|
Material
|
||||||
R* Reflection mat
|
|
||||||
R* Specular Mat
|
|
||||||
UV Anim
|
UV Anim
|
||||||
Texture
|
Texture
|
||||||
(Sky Mipmap Val)
|
(Sky Mipmap Val)
|
||||||
|
|
||||||
|
- PDS Pipelines (at least dummies)
|
||||||
|
|
||||||
- UV Anim Dict
|
- UV Anim Dict
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,9 @@ main(int argc, char *argv[])
|
||||||
|
|
||||||
// Rw::Version = 0x33002;
|
// Rw::Version = 0x33002;
|
||||||
|
|
||||||
Rw::RegisterMaterialRightsPlugin();
|
Rw::RegisterEnvSpecPlugin();
|
||||||
Rw::RegisterMatFXPlugin();
|
Rw::RegisterMatFXPlugin();
|
||||||
|
Rw::RegisterMaterialRightsPlugin();
|
||||||
Rw::RegisterAtomicRightsPlugin();
|
Rw::RegisterAtomicRightsPlugin();
|
||||||
Rw::RegisterHAnimPlugin();
|
Rw::RegisterHAnimPlugin();
|
||||||
Rw::RegisterNodeNamePlugin();
|
Rw::RegisterNodeNamePlugin();
|
||||||
|
|
172
src/gtaplg.cpp
172
src/gtaplg.cpp
|
@ -263,11 +263,181 @@ RegisterExtraVertColorPlugin(void)
|
||||||
ExtraVertColorOffset = Geometry::registerPlugin(sizeof(ExtraVertColors),
|
ExtraVertColorOffset = Geometry::registerPlugin(sizeof(ExtraVertColors),
|
||||||
ID_EXTRAVERTCOLORS,
|
ID_EXTRAVERTCOLORS,
|
||||||
createExtraVertColors,
|
createExtraVertColors,
|
||||||
destroyExtraVertColors, NULL);
|
destroyExtraVertColors,
|
||||||
|
NULL);
|
||||||
Geometry::registerPluginStream(ID_EXTRAVERTCOLORS,
|
Geometry::registerPluginStream(ID_EXTRAVERTCOLORS,
|
||||||
readExtraVertColors,
|
readExtraVertColors,
|
||||||
writeExtraVertColors,
|
writeExtraVertColors,
|
||||||
getSizeExtraVertColors);
|
getSizeExtraVertColors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Environment mat
|
||||||
|
|
||||||
|
int32 EnvMatOffset;
|
||||||
|
|
||||||
|
static void*
|
||||||
|
createEnvMat(void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
*PLUGINOFFSET(EnvMat*, object, offset) = NULL;
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void*
|
||||||
|
destroyEnvMat(void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
EnvMat **envmat = PLUGINOFFSET(EnvMat*, object, offset);
|
||||||
|
delete *envmat;
|
||||||
|
*envmat = NULL;
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void*
|
||||||
|
copyEnvMat(void *dst, void *src, int32 offset, int32)
|
||||||
|
{
|
||||||
|
EnvMat *srcenv = *PLUGINOFFSET(EnvMat*, src, offset);
|
||||||
|
if(srcenv == NULL)
|
||||||
|
return dst;
|
||||||
|
EnvMat *dstenv = new EnvMat;
|
||||||
|
dstenv->scaleX = srcenv->scaleX;
|
||||||
|
dstenv->scaleY = srcenv->scaleY;
|
||||||
|
dstenv->transScaleX = srcenv->transScaleX;
|
||||||
|
dstenv->transScaleY = srcenv->transScaleY;
|
||||||
|
dstenv->shininess = srcenv->shininess;
|
||||||
|
dstenv->texture = NULL;
|
||||||
|
*PLUGINOFFSET(EnvMat*, dst, offset) = dstenv;
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct EnvStream {
|
||||||
|
float scaleX, scaleY;
|
||||||
|
float transScaleX, transScaleY;
|
||||||
|
float shininess;
|
||||||
|
int32 zero;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
readEnvMat(Stream *stream, int32, void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
EnvStream buf;
|
||||||
|
EnvMat *env = new EnvMat;
|
||||||
|
*PLUGINOFFSET(EnvMat*, object, offset) = env;
|
||||||
|
stream->read(&buf, sizeof(buf));
|
||||||
|
env->scaleX = (int8)(buf.scaleX*8.0f);
|
||||||
|
env->scaleY = (int8)(buf.scaleY*8.0f);
|
||||||
|
env->transScaleX = (int8)(buf.transScaleX*8.0f);
|
||||||
|
env->transScaleY = (int8)(buf.transScaleY*8.0f);
|
||||||
|
env->shininess = (int8)(buf.shininess*255.0f);
|
||||||
|
env->texture = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
writeEnvMat(Stream *stream, int32, void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
EnvStream buf;
|
||||||
|
EnvMat *env = *PLUGINOFFSET(EnvMat*, object, offset);
|
||||||
|
buf.scaleX = env->scaleX/8.0f;
|
||||||
|
buf.scaleY = env->scaleY/8.0f;
|
||||||
|
buf.transScaleX = env->transScaleX/8.0f;
|
||||||
|
buf.transScaleY = env->transScaleY/8.0f;
|
||||||
|
buf.shininess = env->shininess/8.0f;
|
||||||
|
buf.zero = 0;
|
||||||
|
stream->write(&buf, sizeof(buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32
|
||||||
|
getSizeEnvMat(void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
EnvMat *env = *PLUGINOFFSET(EnvMat*, object, offset);
|
||||||
|
return env ? sizeof(EnvStream) : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Specular mat
|
||||||
|
|
||||||
|
int32 SpecMatOffset;
|
||||||
|
|
||||||
|
static void*
|
||||||
|
createSpecMat(void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
*PLUGINOFFSET(SpecMat*, object, offset) = NULL;
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void*
|
||||||
|
destroySpecMat(void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
SpecMat **specmat = PLUGINOFFSET(SpecMat*, object, offset);
|
||||||
|
if((*specmat)->texture)
|
||||||
|
(*specmat)->texture->decRef();
|
||||||
|
delete *specmat;
|
||||||
|
*specmat = NULL;
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void*
|
||||||
|
copySpecMat(void *dst, void *src, int32 offset, int32)
|
||||||
|
{
|
||||||
|
SpecMat *srcspec = *PLUGINOFFSET(SpecMat*, src, offset);
|
||||||
|
if(srcspec == NULL)
|
||||||
|
return dst;
|
||||||
|
SpecMat *dstspec = new SpecMat;
|
||||||
|
*PLUGINOFFSET(SpecMat*, dst, offset) = dstspec;
|
||||||
|
dstspec->specularity = srcspec->specularity;
|
||||||
|
dstspec->texture = srcspec->texture;
|
||||||
|
dstspec->texture->refCount++;
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SpecStream {
|
||||||
|
float specularity;
|
||||||
|
char texname[24];
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
readSpecMat(Stream *stream, int32, void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
SpecStream buf;
|
||||||
|
SpecMat *spec = new SpecMat;
|
||||||
|
*PLUGINOFFSET(SpecMat*, object, offset) = spec;
|
||||||
|
stream->read(&buf, sizeof(buf));
|
||||||
|
spec->specularity = buf.specularity;
|
||||||
|
spec->texture = new Texture;
|
||||||
|
strncpy(spec->texture->name, buf.texname, 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
writeSpecMat(Stream *stream, int32, void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
SpecStream buf;
|
||||||
|
SpecMat *spec = *PLUGINOFFSET(SpecMat*, object, offset);
|
||||||
|
buf.specularity = spec->specularity;
|
||||||
|
strncpy(buf.texname, spec->texture->name, 24);
|
||||||
|
stream->write(&buf, sizeof(buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32
|
||||||
|
getSizeSpecMat(void *object, int32 offset, int32)
|
||||||
|
{
|
||||||
|
SpecMat *spec = *PLUGINOFFSET(SpecMat*, object, offset);
|
||||||
|
return spec ? sizeof(SpecStream) : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
RegisterEnvSpecPlugin(void)
|
||||||
|
{
|
||||||
|
SpecMatOffset = Material::registerPlugin(sizeof(SpecMat*), ID_SPECMAT,
|
||||||
|
createSpecMat,
|
||||||
|
destroySpecMat,
|
||||||
|
copySpecMat);
|
||||||
|
Material::registerPluginStream(ID_SPECMAT, readSpecMat,
|
||||||
|
writeSpecMat,
|
||||||
|
getSizeSpecMat);
|
||||||
|
EnvMatOffset = Material::registerPlugin(sizeof(EnvMat*), ID_ENVMAT,
|
||||||
|
createEnvMat,
|
||||||
|
destroyEnvMat,
|
||||||
|
copyEnvMat);
|
||||||
|
Material::registerPluginStream(ID_ENVMAT, readEnvMat,
|
||||||
|
writeEnvMat,
|
||||||
|
getSizeEnvMat);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
32
src/gtaplg.h
32
src/gtaplg.h
|
@ -2,14 +2,20 @@ namespace Rw {
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
ID_SPECMAT = 0x253f2f6,
|
||||||
ID_EXTRAVERTCOLORS = 0x253f2f9,
|
ID_EXTRAVERTCOLORS = 0x253f2f9,
|
||||||
|
ID_ENVMAT = 0x253f2fc,
|
||||||
ID_BREAKABLE = 0x253f2fd,
|
ID_BREAKABLE = 0x253f2fd,
|
||||||
ID_NODENAME = 0x253f2fe
|
ID_NODENAME = 0x253f2fe
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Node name
|
||||||
|
|
||||||
extern int32 NodeNameOffset;
|
extern int32 NodeNameOffset;
|
||||||
void RegisterNodeNamePlugin(void);
|
void RegisterNodeNamePlugin(void);
|
||||||
|
|
||||||
|
// Breakable model
|
||||||
|
|
||||||
struct Breakable
|
struct Breakable
|
||||||
{
|
{
|
||||||
uint32 position;
|
uint32 position;
|
||||||
|
@ -30,6 +36,8 @@ struct Breakable
|
||||||
extern int32 BreakableOffset;
|
extern int32 BreakableOffset;
|
||||||
void RegisterBreakableModelPlugin(void);
|
void RegisterBreakableModelPlugin(void);
|
||||||
|
|
||||||
|
// Extra vert colors
|
||||||
|
|
||||||
struct ExtraVertColors
|
struct ExtraVertColors
|
||||||
{
|
{
|
||||||
uint8 *nightColors;
|
uint8 *nightColors;
|
||||||
|
@ -40,4 +48,28 @@ struct ExtraVertColors
|
||||||
extern int32 ExtraVertColorOffset;
|
extern int32 ExtraVertColorOffset;
|
||||||
void RegisterExtraVertColorPlugin(void);
|
void RegisterExtraVertColorPlugin(void);
|
||||||
|
|
||||||
|
// Environment mat
|
||||||
|
|
||||||
|
struct EnvMat
|
||||||
|
{
|
||||||
|
int8 scaleX, scaleY;
|
||||||
|
int8 transScaleX, transScaleY;
|
||||||
|
int8 shininess;
|
||||||
|
Texture *texture;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int32 EnvMatOffset;
|
||||||
|
|
||||||
|
// Specular mat
|
||||||
|
|
||||||
|
struct SpecMat
|
||||||
|
{
|
||||||
|
float specularity;
|
||||||
|
Texture *texture;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int32 SpecMatOffset;
|
||||||
|
|
||||||
|
void RegisterEnvSpecPlugin(void);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue