mirror of
https://github.com/aap/librw.git
synced 2025-02-19 18:55:19 +00:00
fix skin pipe rendering
This commit is contained in:
parent
fbb2d35fc4
commit
77b7229356
@ -236,31 +236,53 @@ uploadSkinMatrices(Atomic *a)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
Skin *skin = Skin::get(a->geometry);
|
Skin *skin = Skin::get(a->geometry);
|
||||||
HAnimHierarchy *hier = Skin::getHierarchy(a);
|
|
||||||
Matrix *invMats = (Matrix*)skin->inverseMatrices;
|
|
||||||
Matrix tmp, tmp2;
|
|
||||||
|
|
||||||
float *m = skinMatrices;
|
float *m = skinMatrices;
|
||||||
|
HAnimHierarchy *hier = Skin::getHierarchy(a);
|
||||||
|
|
||||||
if(hier->flags & HAnimHierarchy::LOCALSPACEMATRICES){
|
if(hier){
|
||||||
for(i = 0; i < hier->numNodes; i++){
|
Matrix *invMats = (Matrix*)skin->inverseMatrices;
|
||||||
invMats[i].flags = 0;
|
Matrix tmp, tmp2;
|
||||||
Matrix::mult(&tmp, &invMats[i], &hier->matrices[i]);
|
|
||||||
RawMatrix::transpose((RawMatrix*)m, (RawMatrix*)&tmp);
|
assert(skin->numBones == hier->numNodes);
|
||||||
m += 12;
|
if(hier->flags & HAnimHierarchy::LOCALSPACEMATRICES){
|
||||||
|
for(i = 0; i < hier->numNodes; i++){
|
||||||
|
invMats[i].flags = 0;
|
||||||
|
Matrix::mult(&tmp, &invMats[i], &hier->matrices[i]);
|
||||||
|
RawMatrix::transpose((RawMatrix*)m, (RawMatrix*)&tmp);
|
||||||
|
m += 12;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
Matrix invAtmMat;
|
||||||
|
Matrix::invert(&invAtmMat, a->getFrame()->getLTM());
|
||||||
|
for(i = 0; i < hier->numNodes; i++){
|
||||||
|
invMats[i].flags = 0;
|
||||||
|
Matrix::mult(&tmp, &hier->matrices[i], &invAtmMat);
|
||||||
|
Matrix::mult(&tmp2, &invMats[i], &tmp);
|
||||||
|
RawMatrix::transpose((RawMatrix*)m, (RawMatrix*)&tmp2);
|
||||||
|
m += 12;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
Matrix invAtmMat;
|
for(i = 0; i < skin->numBones; i++){
|
||||||
Matrix::invert(&invAtmMat, a->getFrame()->getLTM());
|
m[0] = 1.0f;
|
||||||
for(i = 0; i < hier->numNodes; i++){
|
m[1] = 0.0f;
|
||||||
invMats[i].flags = 0;
|
m[2] = 0.0f;
|
||||||
Matrix::mult(&tmp, &hier->matrices[i], &invAtmMat);
|
m[3] = 0.0f;
|
||||||
Matrix::mult(&tmp2, &invMats[i], &tmp);
|
|
||||||
RawMatrix::transpose((RawMatrix*)m, (RawMatrix*)&tmp2);
|
m[4] = 0.0f;
|
||||||
|
m[5] = 1.0f;
|
||||||
|
m[6] = 0.0f;
|
||||||
|
m[7] = 0.0f;
|
||||||
|
|
||||||
|
m[8] = 0.0f;
|
||||||
|
m[9] = 0.0f;
|
||||||
|
m[10] = 1.0f;
|
||||||
|
m[11] = 0.0f;
|
||||||
|
|
||||||
m += 12;
|
m += 12;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
d3ddevice->SetVertexShaderConstantF(VSLOC_boneMatrices, skinMatrices, hier->numNodes*3);
|
d3ddevice->SetVertexShaderConstantF(VSLOC_boneMatrices, skinMatrices, skin->numBones*3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -218,25 +218,33 @@ uploadSkinMatrices(Atomic *a)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
Skin *skin = Skin::get(a->geometry);
|
Skin *skin = Skin::get(a->geometry);
|
||||||
HAnimHierarchy *hier = Skin::getHierarchy(a);
|
|
||||||
Matrix *invMats = (Matrix*)skin->inverseMatrices;
|
|
||||||
Matrix tmp;
|
|
||||||
|
|
||||||
Matrix *m = (Matrix*)skinMatrices;
|
Matrix *m = (Matrix*)skinMatrices;
|
||||||
|
HAnimHierarchy *hier = Skin::getHierarchy(a);
|
||||||
|
|
||||||
if(hier->flags & HAnimHierarchy::LOCALSPACEMATRICES){
|
if(hier){
|
||||||
for(i = 0; i < hier->numNodes; i++){
|
Matrix *invMats = (Matrix*)skin->inverseMatrices;
|
||||||
invMats[i].flags = 0;
|
Matrix tmp;
|
||||||
Matrix::mult(m, &invMats[i], &hier->matrices[i]);
|
|
||||||
m++;
|
assert(skin->numBones == hier->numNodes);
|
||||||
|
if(hier->flags & HAnimHierarchy::LOCALSPACEMATRICES){
|
||||||
|
for(i = 0; i < hier->numNodes; i++){
|
||||||
|
invMats[i].flags = 0;
|
||||||
|
Matrix::mult(m, &invMats[i], &hier->matrices[i]);
|
||||||
|
m++;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
Matrix invAtmMat;
|
||||||
|
Matrix::invert(&invAtmMat, a->getFrame()->getLTM());
|
||||||
|
for(i = 0; i < hier->numNodes; i++){
|
||||||
|
invMats[i].flags = 0;
|
||||||
|
Matrix::mult(&tmp, &hier->matrices[i], &invAtmMat);
|
||||||
|
Matrix::mult(m, &invMats[i], &tmp);
|
||||||
|
m++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
Matrix invAtmMat;
|
for(i = 0; i < skin->numBones; i++){
|
||||||
Matrix::invert(&invAtmMat, a->getFrame()->getLTM());
|
m->setIdentity();
|
||||||
for(i = 0; i < hier->numNodes; i++){
|
|
||||||
invMats[i].flags = 0;
|
|
||||||
Matrix::mult(&tmp, &hier->matrices[i], &invAtmMat);
|
|
||||||
Matrix::mult(m, &invMats[i], &tmp);
|
|
||||||
m++;
|
m++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user