mirror of
https://github.com/aap/librw.git
synced 2025-02-16 17:26:18 +00:00
implemented some PDS pipelines used by Bully
This commit is contained in:
parent
0c77e505f0
commit
ee726b90a2
@ -47,26 +47,26 @@ static D3DMATERIAL9 d3dmaterial;
|
|||||||
void
|
void
|
||||||
setRenderState(uint32 state, uint32 value)
|
setRenderState(uint32 state, uint32 value)
|
||||||
{
|
{
|
||||||
if(stateCache[state].value != value){
|
if(stateCache[state].value != value){
|
||||||
stateCache[state].value = value;
|
stateCache[state].value = value;
|
||||||
if(!stateCache[state].dirty){
|
if(!stateCache[state].dirty){
|
||||||
stateCache[state].dirty = 1;
|
stateCache[state].dirty = 1;
|
||||||
dirtyStates[numDirtyStates++] = state;
|
dirtyStates[numDirtyStates++] = state;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
setTextureStageState(uint32 stage, uint32 type, uint32 value)
|
setTextureStageState(uint32 stage, uint32 type, uint32 value)
|
||||||
{
|
{
|
||||||
if(textureStageStateCache[type][stage].value != value){
|
if(textureStageStateCache[type][stage].value != value){
|
||||||
textureStageStateCache[type][stage].value = value;
|
textureStageStateCache[type][stage].value = value;
|
||||||
if(!textureStageStateCache[type][stage].dirty){
|
if(!textureStageStateCache[type][stage].dirty){
|
||||||
textureStageStateCache[type][stage].dirty = 1;
|
textureStageStateCache[type][stage].dirty = 1;
|
||||||
dirtyTextureStageStates[numDirtyTextureStageStates].stage = stage;
|
dirtyTextureStageStates[numDirtyTextureStageStates].stage = stage;
|
||||||
dirtyTextureStageStates[numDirtyTextureStageStates].type = type;
|
dirtyTextureStageStates[numDirtyTextureStageStates].type = type;
|
||||||
numDirtyTextureStageStates++;
|
numDirtyTextureStageStates++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
22
src/pds.cpp
22
src/pds.cpp
@ -40,16 +40,16 @@ static void
|
|||||||
atomicPDSRights(void *object, int32, int32, uint32 data)
|
atomicPDSRights(void *object, int32, int32, uint32 data)
|
||||||
{
|
{
|
||||||
Atomic *a = (Atomic*)object;
|
Atomic *a = (Atomic*)object;
|
||||||
//printf("atm pds: %x\n", data);
|
|
||||||
a->pipeline = (ObjPipeline*)getPDSPipe(data);
|
a->pipeline = (ObjPipeline*)getPDSPipe(data);
|
||||||
|
// printf("atm pds: %x %x %x\n", data, a->pipeline->pluginID, a->pipeline->pluginData);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
materialPDSRights(void *object, int32, int32, uint32 data)
|
materialPDSRights(void *object, int32, int32, uint32 data)
|
||||||
{
|
{
|
||||||
Material *m = (Material*)object;
|
Material *m = (Material*)object;
|
||||||
//printf("mat pds: %x\n", data);
|
|
||||||
m->pipeline = (ObjPipeline*)getPDSPipe(data);
|
m->pipeline = (ObjPipeline*)getPDSPipe(data);
|
||||||
|
// printf("mat pds: %x %x %x\n", data, m->pipeline->pluginID, m->pipeline->pluginData);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -81,7 +81,7 @@ registerPluginPDSPipes(void)
|
|||||||
pipe->setTriBufferSizes(5, vertCount);
|
pipe->setTriBufferSizes(5, vertCount);
|
||||||
pipe->vifOffset = pipe->inputStride*vertCount;
|
pipe->vifOffset = pipe->inputStride*vertCount;
|
||||||
pipe->instanceCB = skinInstanceCB;
|
pipe->instanceCB = skinInstanceCB;
|
||||||
pipe->uninstanceCB = skinUninstanceCB;
|
pipe->uninstanceCB = genericUninstanceCB;
|
||||||
pipe->preUninstCB = skinPreCB;
|
pipe->preUninstCB = skinPreCB;
|
||||||
pipe->postUninstCB = skinPostCB;
|
pipe->postUninstCB = skinPostCB;
|
||||||
registerPDSPipe(pipe);
|
registerPDSPipe(pipe);
|
||||||
@ -104,7 +104,7 @@ registerPluginPDSPipes(void)
|
|||||||
vertCount = MatPipeline::getVertCount(0x3C5, 4, 3, 3);
|
vertCount = MatPipeline::getVertCount(0x3C5, 4, 3, 3);
|
||||||
pipe->setTriBufferSizes(4, vertCount);
|
pipe->setTriBufferSizes(4, vertCount);
|
||||||
pipe->vifOffset = pipe->inputStride*vertCount;
|
pipe->vifOffset = pipe->inputStride*vertCount;
|
||||||
pipe->uninstanceCB = defaultUninstanceCB;
|
pipe->uninstanceCB = genericUninstanceCB;
|
||||||
registerPDSPipe(pipe);
|
registerPDSPipe(pipe);
|
||||||
|
|
||||||
// rwPDS_G3_MatfxUV1_GrpAtmPipeID
|
// rwPDS_G3_MatfxUV1_GrpAtmPipeID
|
||||||
@ -125,7 +125,7 @@ registerPluginPDSPipes(void)
|
|||||||
vertCount = MatPipeline::getVertCount(0x3C5, 4, 3, 3);
|
vertCount = MatPipeline::getVertCount(0x3C5, 4, 3, 3);
|
||||||
pipe->setTriBufferSizes(4, vertCount);
|
pipe->setTriBufferSizes(4, vertCount);
|
||||||
pipe->vifOffset = pipe->inputStride*vertCount;
|
pipe->vifOffset = pipe->inputStride*vertCount;
|
||||||
pipe->uninstanceCB = defaultUninstanceCB;
|
pipe->uninstanceCB = genericUninstanceCB;
|
||||||
registerPDSPipe(pipe);
|
registerPDSPipe(pipe);
|
||||||
|
|
||||||
// rwPDS_G3_MatfxUV2_GrpAtmPipeID
|
// rwPDS_G3_MatfxUV2_GrpAtmPipeID
|
||||||
@ -141,14 +141,12 @@ registerPluginPDSPipes(void)
|
|||||||
opipe = new ObjPipeline(PLATFORM_PS2);
|
opipe = new ObjPipeline(PLATFORM_PS2);
|
||||||
opipe->pluginID = ID_PDS;
|
opipe->pluginID = ID_PDS;
|
||||||
opipe->pluginData = 0x50001;
|
opipe->pluginData = 0x50001;
|
||||||
opipe->groupPipeline = pipe;
|
|
||||||
registerPDSPipe(opipe);
|
registerPDSPipe(opipe);
|
||||||
|
|
||||||
// rwPDS_G3x_Skin_AtmPipeID
|
// rwPDS_G3x_Skin_AtmPipeID
|
||||||
opipe = new ObjPipeline(PLATFORM_PS2);
|
opipe = new ObjPipeline(PLATFORM_PS2);
|
||||||
opipe->pluginID = ID_PDS;
|
opipe->pluginID = ID_PDS;
|
||||||
opipe->pluginData = 0x5000b;
|
opipe->pluginData = 0x5000b;
|
||||||
opipe->groupPipeline = pipe;
|
|
||||||
registerPDSPipe(opipe);
|
registerPDSPipe(opipe);
|
||||||
|
|
||||||
// rwPDS_G3xd_A4D_MatPipeID
|
// rwPDS_G3xd_A4D_MatPipeID
|
||||||
@ -161,8 +159,8 @@ registerPluginPDSPipes(void)
|
|||||||
vertCount = 0x50;
|
vertCount = 0x50;
|
||||||
pipe->setTriBufferSizes(3, vertCount);
|
pipe->setTriBufferSizes(3, vertCount);
|
||||||
pipe->vifOffset = pipe->inputStride*vertCount;
|
pipe->vifOffset = pipe->inputStride*vertCount;
|
||||||
// TODO:
|
pipe->uninstanceCB = genericUninstanceCB;
|
||||||
//pipe->uninstanceCB = defaultUninstanceCB;
|
pipe->preUninstCB = genericPreCB;
|
||||||
registerPDSPipe(pipe);
|
registerPDSPipe(pipe);
|
||||||
|
|
||||||
// rwPDS_G3xd_A4DSkin_MatPipeID
|
// rwPDS_G3xd_A4DSkin_MatPipeID
|
||||||
@ -176,8 +174,10 @@ registerPluginPDSPipes(void)
|
|||||||
vertCount = 0x30;
|
vertCount = 0x30;
|
||||||
pipe->setTriBufferSizes(4, vertCount);
|
pipe->setTriBufferSizes(4, vertCount);
|
||||||
pipe->vifOffset = pipe->inputStride*vertCount;
|
pipe->vifOffset = pipe->inputStride*vertCount;
|
||||||
// TODO:
|
pipe->instanceCB = skinInstanceCB;
|
||||||
//pipe->uninstanceCB = skinUninstanceCB;
|
pipe->uninstanceCB = genericUninstanceCB;
|
||||||
|
pipe->preUninstCB = genericPreCB;
|
||||||
|
pipe->postUninstCB = skinPostCB;
|
||||||
registerPDSPipe(pipe);
|
registerPDSPipe(pipe);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
127
src/ps2.cpp
127
src/ps2.cpp
@ -675,7 +675,7 @@ MatPipeline::collectData(Geometry *g, InstanceData *inst, Mesh *m, uint8 *data[]
|
|||||||
uint32 asz = attribSize(a->attrib);
|
uint32 asz = attribSize(a->attrib);
|
||||||
p += 4;
|
p += 4;
|
||||||
if((p[-1] & 0xff004000) != a->attrib){
|
if((p[-1] & 0xff004000) != a->attrib){
|
||||||
fprintf(stderr, "unexpected unpack xx: %08x %08x\n", p[-1], a->attrib);
|
fprintf(stderr, "unexpected unpack: %08x %08x\n", p[-1], a->attrib);
|
||||||
assert(0 && "unexpected unpack\n");
|
assert(0 && "unexpected unpack\n");
|
||||||
}
|
}
|
||||||
memcpy(datap[i], p, asz*nverts);
|
memcpy(datap[i], p, asz*nverts);
|
||||||
@ -822,6 +822,7 @@ ObjPipeline::ObjPipeline(uint32 platform)
|
|||||||
this->impl.uninstance = objUninstance;
|
this->impl.uninstance = objUninstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
int32
|
int32
|
||||||
findVertex(Geometry *g, uint32 flags[], uint32 mask, Vertex *v)
|
findVertex(Geometry *g, uint32 flags[], uint32 mask, Vertex *v)
|
||||||
{
|
{
|
||||||
@ -857,6 +858,7 @@ findVertex(Geometry *g, uint32 flags[], uint32 mask, Vertex *v)
|
|||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
insertVertex(Geometry *geo, int32 i, uint32 mask, Vertex *v)
|
insertVertex(Geometry *geo, int32 i, uint32 mask, Vertex *v)
|
||||||
@ -874,17 +876,99 @@ insertVertex(Geometry *geo, int32 i, uint32 mask, Vertex *v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
genericUninstanceCB(MatPipeline *pipe, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[])
|
genericPreCB(MatPipeline *pipe, Geometry *geo)
|
||||||
{
|
{
|
||||||
//extern PipeAttribute attribXYZ;
|
PipeAttribute *a;
|
||||||
//extern PipeAttribute attribXYZW;
|
for(int32 i = 0; i < nelem(pipe->attribs); i++)
|
||||||
//extern PipeAttribute attribUV;
|
if(a = pipe->attribs[i])
|
||||||
//extern PipeAttribute attribUV2;
|
if(a == &attribXYZW){
|
||||||
//extern PipeAttribute attribRGBA;
|
allocateADC(geo);
|
||||||
//extern PipeAttribute attribNormal;
|
break;
|
||||||
//extern PipeAttribute attribWeights;
|
}
|
||||||
|
skinPreCB(pipe, geo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
genericUninstanceCB(MatPipeline *pipe, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[])
|
||||||
|
{
|
||||||
|
float32 *xyz = NULL, *xyzw = NULL;
|
||||||
|
float32 *uv = NULL, *uv2 = NULL;
|
||||||
|
uint8 *rgba = NULL;
|
||||||
|
int8 *normals = NULL;
|
||||||
|
uint32 *weights = NULL;
|
||||||
|
int8 *adc = NULL;
|
||||||
|
Skin *skin = NULL;
|
||||||
|
if(skinGlobals.offset)
|
||||||
|
skin = *PLUGINOFFSET(Skin*, geo, skinGlobals.offset);
|
||||||
|
|
||||||
|
PipeAttribute *a;
|
||||||
|
for(int32 i = 0; i < nelem(pipe->attribs); i++)
|
||||||
|
if(a = pipe->attribs[i]){
|
||||||
|
if(a == &attribXYZ) xyz = (float32*)data[i];
|
||||||
|
else if(a == &attribXYZW) xyzw = (float32*)data[i];
|
||||||
|
else if(a == &attribUV) uv = (float32*)data[i];
|
||||||
|
else if(a == &attribUV2) uv2 = (float32*)data[i];
|
||||||
|
else if(a == &attribRGBA) rgba = data[i];
|
||||||
|
else if(a == &attribNormal) normals = (int8*)data[i];
|
||||||
|
else if(a == &attribWeights) weights = (uint32*)data[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 mask = 0x1; // vertices
|
||||||
|
if(normals && geo->geoflags & Geometry::NORMALS)
|
||||||
|
mask |= 0x10;
|
||||||
|
if(rgba && geo->geoflags & Geometry::PRELIT)
|
||||||
|
mask |= 0x100;
|
||||||
|
if((uv || uv2) && geo->numTexCoordSets > 0)
|
||||||
|
mask |= 0x1000;
|
||||||
|
if(uv2 && geo->numTexCoordSets > 1)
|
||||||
|
mask |= 0x2000;
|
||||||
|
if(weights && skin)
|
||||||
|
mask |= 0x10000;
|
||||||
|
if(xyzw)
|
||||||
|
adc = getADCbitsForMesh(geo, mesh);
|
||||||
|
|
||||||
|
Vertex v;
|
||||||
|
for(uint32 i = 0; i < mesh->numIndices; i++){
|
||||||
|
if(mask & 0x1)
|
||||||
|
memcpy(&v.p, xyz ? xyz : xyzw, 12);
|
||||||
|
if(mask & 0x10){
|
||||||
|
// TODO: figure out scaling :/
|
||||||
|
v.n[0] = normals[0]/128.0f;
|
||||||
|
v.n[1] = normals[1]/128.0f;
|
||||||
|
v.n[2] = normals[2]/128.0f;
|
||||||
|
}
|
||||||
|
if(mask & 0x100)
|
||||||
|
memcpy(&v.c, rgba, 4);
|
||||||
|
if(mask & 0x1000)
|
||||||
|
memcpy(&v.t, uv ? uv : uv2, 8);
|
||||||
|
if(mask & 0x2000)
|
||||||
|
memcpy(&v.t1, uv2 + 2, 8);
|
||||||
|
if(mask & 0x10000)
|
||||||
|
for(int j = 0; j < 4; j++){
|
||||||
|
((uint32*)v.w)[j] = weights[j] & ~0x3FF;
|
||||||
|
v.i[j] = (weights[j] & 0x3FF) >> 2;
|
||||||
|
if(v.i[j]) v.i[j]--;
|
||||||
|
if(v.w[j] == 0.0f) v.i[j] = 0;
|
||||||
|
}
|
||||||
|
int32 idx = findVertexSkin(geo, flags, mask, &v);
|
||||||
|
if(idx < 0)
|
||||||
|
idx = geo->numVertices++;
|
||||||
|
mesh->indices[i] = idx;
|
||||||
|
if(adc)
|
||||||
|
adc[i] = xyzw[3] != 0.0f;
|
||||||
|
flags[idx] = mask;
|
||||||
|
insertVertexSkin(geo, idx, mask, &v);
|
||||||
|
if(xyz) xyz += 3;
|
||||||
|
if(xyzw) xyzw += 4;
|
||||||
|
if(uv) uv += 2;
|
||||||
|
if(uv2) uv2 += 4;
|
||||||
|
rgba += 4;
|
||||||
|
normals += 3;
|
||||||
|
weights += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
void
|
void
|
||||||
defaultUninstanceCB(MatPipeline *pipe, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[])
|
defaultUninstanceCB(MatPipeline *pipe, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[])
|
||||||
{
|
{
|
||||||
@ -931,6 +1015,7 @@ defaultUninstanceCB(MatPipeline *pipe, Geometry *geo, uint32 flags[], Mesh *mesh
|
|||||||
norms += 3;
|
norms += 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
#undef QWC
|
#undef QWC
|
||||||
|
|
||||||
@ -946,7 +1031,7 @@ makeDefaultPipeline(void)
|
|||||||
uint32 vertCount = MatPipeline::getVertCount(VU_Lights,4,3,2);
|
uint32 vertCount = MatPipeline::getVertCount(VU_Lights,4,3,2);
|
||||||
pipe->setTriBufferSizes(4, vertCount);
|
pipe->setTriBufferSizes(4, vertCount);
|
||||||
pipe->vifOffset = pipe->inputStride*vertCount;
|
pipe->vifOffset = pipe->inputStride*vertCount;
|
||||||
pipe->uninstanceCB = defaultUninstanceCB;
|
pipe->uninstanceCB = genericUninstanceCB;
|
||||||
defaultMatPipe = pipe;
|
defaultMatPipe = pipe;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -972,7 +1057,7 @@ makeSkinPipeline(void)
|
|||||||
pipe->setTriBufferSizes(5, vertCount);
|
pipe->setTriBufferSizes(5, vertCount);
|
||||||
pipe->vifOffset = pipe->inputStride*vertCount;
|
pipe->vifOffset = pipe->inputStride*vertCount;
|
||||||
pipe->instanceCB = skinInstanceCB;
|
pipe->instanceCB = skinInstanceCB;
|
||||||
pipe->uninstanceCB = skinUninstanceCB;
|
pipe->uninstanceCB = genericUninstanceCB;
|
||||||
pipe->preUninstCB = skinPreCB;
|
pipe->preUninstCB = skinPreCB;
|
||||||
pipe->postUninstCB = skinPostCB;
|
pipe->postUninstCB = skinPostCB;
|
||||||
|
|
||||||
@ -996,7 +1081,7 @@ makeMatFXPipeline(void)
|
|||||||
uint32 vertCount = MatPipeline::getVertCount(0x3C5, 4, 3, 3);
|
uint32 vertCount = MatPipeline::getVertCount(0x3C5, 4, 3, 3);
|
||||||
pipe->setTriBufferSizes(4, vertCount);
|
pipe->setTriBufferSizes(4, vertCount);
|
||||||
pipe->vifOffset = pipe->inputStride*vertCount;
|
pipe->vifOffset = pipe->inputStride*vertCount;
|
||||||
pipe->uninstanceCB = defaultUninstanceCB;
|
pipe->uninstanceCB = genericUninstanceCB;
|
||||||
|
|
||||||
ObjPipeline *opipe = new ObjPipeline(PLATFORM_PS2);
|
ObjPipeline *opipe = new ObjPipeline(PLATFORM_PS2);
|
||||||
opipe->pluginID = ID_MATFX;
|
opipe->pluginID = ID_MATFX;
|
||||||
@ -1119,7 +1204,7 @@ skinInstanceCB(MatPipeline *, Geometry *g, Mesh *m, uint8 **data)
|
|||||||
|
|
||||||
// TODO: call base function perhaps?
|
// TODO: call base function perhaps?
|
||||||
int32
|
int32
|
||||||
findVertexSkin(Geometry *g, uint32 flags[], uint32 mask, SkinVertex *v)
|
findVertexSkin(Geometry *g, uint32 flags[], uint32 mask, Vertex *v)
|
||||||
{
|
{
|
||||||
Skin *skin = *PLUGINOFFSET(Skin*, g, skinGlobals.offset);
|
Skin *skin = *PLUGINOFFSET(Skin*, g, skinGlobals.offset);
|
||||||
float32 *wghts = NULL;
|
float32 *wghts = NULL;
|
||||||
@ -1131,6 +1216,7 @@ findVertexSkin(Geometry *g, uint32 flags[], uint32 mask, SkinVertex *v)
|
|||||||
|
|
||||||
float32 *verts = g->morphTargets[0].vertices;
|
float32 *verts = g->morphTargets[0].vertices;
|
||||||
float32 *tex = g->texCoords[0];
|
float32 *tex = g->texCoords[0];
|
||||||
|
float32 *tex1 = g->texCoords[1];
|
||||||
float32 *norms = g->morphTargets[0].normals;
|
float32 *norms = g->morphTargets[0].normals;
|
||||||
uint8 *cols = g->colors;
|
uint8 *cols = g->colors;
|
||||||
|
|
||||||
@ -1148,6 +1234,9 @@ findVertexSkin(Geometry *g, uint32 flags[], uint32 mask, SkinVertex *v)
|
|||||||
if(mask & flag & 0x1000 &&
|
if(mask & flag & 0x1000 &&
|
||||||
!(tex[0] == v->t[0] && tex[1] == v->t[1]))
|
!(tex[0] == v->t[0] && tex[1] == v->t[1]))
|
||||||
goto cont;
|
goto cont;
|
||||||
|
if(mask & flag & 0x2000 &&
|
||||||
|
!(tex1[0] == v->t1[0] && tex1[1] == v->t1[1]))
|
||||||
|
goto cont;
|
||||||
if(mask & flag & 0x10000 &&
|
if(mask & flag & 0x10000 &&
|
||||||
!(wghts[0] == v->w[0] && wghts[1] == v->w[1] &&
|
!(wghts[0] == v->w[0] && wghts[1] == v->w[1] &&
|
||||||
wghts[2] == v->w[2] && wghts[3] == v->w[3] &&
|
wghts[2] == v->w[2] && wghts[3] == v->w[3] &&
|
||||||
@ -1167,7 +1256,7 @@ findVertexSkin(Geometry *g, uint32 flags[], uint32 mask, SkinVertex *v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
insertVertexSkin(Geometry *geo, int32 i, uint32 mask, SkinVertex *v)
|
insertVertexSkin(Geometry *geo, int32 i, uint32 mask, Vertex *v)
|
||||||
{
|
{
|
||||||
Skin *skin = *PLUGINOFFSET(Skin*, geo, skinGlobals.offset);
|
Skin *skin = *PLUGINOFFSET(Skin*, geo, skinGlobals.offset);
|
||||||
insertVertex(geo, i, mask, v);
|
insertVertex(geo, i, mask, v);
|
||||||
@ -1177,6 +1266,7 @@ insertVertexSkin(Geometry *geo, int32 i, uint32 mask, SkinVertex *v)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
void
|
void
|
||||||
skinUninstanceCB(MatPipeline*, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[])
|
skinUninstanceCB(MatPipeline*, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[])
|
||||||
{
|
{
|
||||||
@ -1194,7 +1284,7 @@ skinUninstanceCB(MatPipeline*, Geometry *geo, uint32 flags[], Mesh *mesh, uint8
|
|||||||
mask |= 0x1000;
|
mask |= 0x1000;
|
||||||
mask |= 0x10000;
|
mask |= 0x10000;
|
||||||
|
|
||||||
SkinVertex v;
|
Vertex v;
|
||||||
for(uint32 i = 0; i < mesh->numIndices; i++){
|
for(uint32 i = 0; i < mesh->numIndices; i++){
|
||||||
if(mask & 0x1)
|
if(mask & 0x1)
|
||||||
memcpy(&v.p, verts, 12);
|
memcpy(&v.p, verts, 12);
|
||||||
@ -1226,6 +1316,7 @@ skinUninstanceCB(MatPipeline*, Geometry *geo, uint32 flags[], Mesh *mesh, uint8
|
|||||||
wghts += 4;
|
wghts += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
skinPreCB(MatPipeline*, Geometry *geo)
|
skinPreCB(MatPipeline*, Geometry *geo)
|
||||||
@ -1245,8 +1336,10 @@ void
|
|||||||
skinPostCB(MatPipeline*, Geometry *geo)
|
skinPostCB(MatPipeline*, Geometry *geo)
|
||||||
{
|
{
|
||||||
Skin *skin = *PLUGINOFFSET(Skin*, geo, skinGlobals.offset);
|
Skin *skin = *PLUGINOFFSET(Skin*, geo, skinGlobals.offset);
|
||||||
skin->findNumWeights(geo->numVertices);
|
if(skin){
|
||||||
skin->findUsedBones(geo->numVertices);
|
skin->findNumWeights(geo->numVertices);
|
||||||
|
skin->findUsedBones(geo->numVertices);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ADC
|
// ADC
|
||||||
|
18
src/rwps2.h
18
src/rwps2.h
@ -124,6 +124,9 @@ struct Vertex {
|
|||||||
float32 t1[2];
|
float32 t1[2];
|
||||||
uint8 c[4];
|
uint8 c[4];
|
||||||
float32 n[3];
|
float32 n[3];
|
||||||
|
// skin
|
||||||
|
float32 w[4];
|
||||||
|
uint8 i[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
void insertVertex(Geometry *geo, int32 i, uint32 mask, Vertex *v);
|
void insertVertex(Geometry *geo, int32 i, uint32 mask, Vertex *v);
|
||||||
@ -131,9 +134,11 @@ void insertVertex(Geometry *geo, int32 i, uint32 mask, Vertex *v);
|
|||||||
extern ObjPipeline *defaultObjPipe;
|
extern ObjPipeline *defaultObjPipe;
|
||||||
extern MatPipeline *defaultMatPipe;
|
extern MatPipeline *defaultMatPipe;
|
||||||
|
|
||||||
void defaultUninstanceCB(MatPipeline *pipe, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[]);
|
void genericUninstanceCB(MatPipeline *pipe, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[]);
|
||||||
|
void genericPreCB(MatPipeline *pipe, Geometry *geo); // skin and ADC
|
||||||
|
//void defaultUninstanceCB(MatPipeline *pipe, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[]);
|
||||||
void skinInstanceCB(MatPipeline *, Geometry *g, Mesh *m, uint8 **data);
|
void skinInstanceCB(MatPipeline *, Geometry *g, Mesh *m, uint8 **data);
|
||||||
void skinUninstanceCB(MatPipeline*, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[]);
|
//void skinUninstanceCB(MatPipeline*, Geometry *geo, uint32 flags[], Mesh *mesh, uint8 *data[]);
|
||||||
|
|
||||||
ObjPipeline *makeDefaultPipeline(void);
|
ObjPipeline *makeDefaultPipeline(void);
|
||||||
ObjPipeline *makeSkinPipeline(void);
|
ObjPipeline *makeSkinPipeline(void);
|
||||||
@ -142,13 +147,8 @@ void dumpPipeline(rw::Pipeline *pipe);
|
|||||||
|
|
||||||
// Skin plugin
|
// Skin plugin
|
||||||
|
|
||||||
struct SkinVertex : Vertex {
|
void insertVertexSkin(Geometry *geo, int32 i, uint32 mask, Vertex *v);
|
||||||
float32 w[4];
|
int32 findVertexSkin(Geometry *g, uint32 flags[], uint32 mask, Vertex *v);
|
||||||
uint8 i[4];
|
|
||||||
};
|
|
||||||
|
|
||||||
void insertVertexSkin(Geometry *geo, int32 i, uint32 mask, SkinVertex *v);
|
|
||||||
int32 findVertexSkin(Geometry *g, uint32 flags[], uint32 mask, SkinVertex *v);
|
|
||||||
|
|
||||||
void readNativeSkin(Stream *stream, int32, void *object, int32 offset);
|
void readNativeSkin(Stream *stream, int32, void *object, int32 offset);
|
||||||
void writeNativeSkin(Stream *stream, int32 len, void *object, int32 offset);
|
void writeNativeSkin(Stream *stream, int32 len, void *object, int32 offset);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user