[Fix] Fixed CollMesh+Scale. ^.^

This commit is contained in:
Rtch90 2017-11-19 12:28:18 +00:00
parent 196e7345a1
commit 754e25f116
4 changed files with 42 additions and 9 deletions

View File

@ -256,27 +256,24 @@ void sbreGenCollMesh(CollMesh* pCMesh, int model, ObjParams* pParam, float s) {
void GenCollMeshInternal(Vector* pPos, Matrix* pOrient, int model, ObjParams* pParam,
float s, CollMesh* pCMesh) {
Model* pModel = ppModel[model];
s *= pModel->scale;
Matrix m = *pOrient;
m.x1 *= s; m.x2 *= s; m.x3 *= s;
m.y1 *= s; m.y2 *= s; m.y3 *= s;
m.z1 *= s; m.z2 *= s; m.z3 *= s;
Vector* pVtx = (Vector*)alloca(sizeof(Vector)*(pModel->cvStart+pModel->numCVtx));
ResolveVertices(pModel, pVtx, pParam);
#if 0
for(int i = 6; i < pModel->cvStart+pModel->numCVtx; i++) {
Vector tv;
MatVecMult(&m, pVtx+i, &tv);
VecAdd(&tv, pPos, pVtx+i);
if(i == pModel->numPVtx-1) i = pModel->cvStart-1;
}
#endif
RState rstate;
rstate.pVtx = pVtx;
rstate.objpos = *pPos;
rstate.objorient = *pOrient;
rstate.scale = s;
rstate.scale = s*pModel->scale;
rstate.pModel = pModel;
rstate.pObjParam = pParam;
MatTVecMult(pOrient, pPos, &rstate.campos);
@ -295,3 +292,24 @@ void GenCollMeshInternal(Vector* pPos, Matrix* pOrient, int model, ObjParams* pP
}
}
void sbreRenderCollMesh(CollMesh* pCMesh, Vector* pPos, Matrix* pOrient) {
float pMV[16];
pMV[ 0] = pOrient->x1; pMV[1] = pOrient->y1; pMV[ 2] = pOrient->z1; pMV[ 3] = 0.0f;
pMV[ 4] = pOrient->x2; pMV[5] = pOrient->y2; pMV[ 6] = pOrient->z2; pMV[ 7] = 0.0f;
pMV[ 8] = pOrient->x3; pMV[9] = pOrient->y3; pMV[10] = pOrient->z3; pMV[11] = 0.0f;
pMV[12] = pPos->x; pMV[13] = pPos->y; pMV[14] = pPos->z; pMV[15] = 1.0f;
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(pMV);
SetGeneralState();
SetTransState();
glDisable(GL_BLEND);
glColor3f(1.0f, 1.0f, 1.0f);
glVertexPointer(3, GL_FLOAT, sizeof(Vector), pCMesh->pVertex);
glDrawElements(GL_TRIANGLES, pCMesh->ni, GL_UNSIGNED_INT, pCMesh->pIndex);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glEnable(GL_CULL_FACE);
}

View File

@ -15,6 +15,13 @@ static void ExpandIndices(CollMesh* pCMesh, int n) {
pCMesh->pFlag = (int*)realloc(pCMesh->pFlag, sizeof(int) * n/3);
}
void ResolveVtx(Vector* pIn, Vector* pOut, RState* pState) {
Vector tv;
MatVecMult(&pState->objorient, pIn, &tv);
VecMul(&tv, pState->scale, &tv);
VecAdd(&tv, &pState->objpos, pOut);
}
static int CollFuncMatAnim(uint16* pData, Model* pMod, RState* pState) {
return 22;
}
@ -43,7 +50,7 @@ static int CollFuncTriFlat(uint16* pData, Model* pMod, RState* pState) {
pCMesh->pFlag[ni/3] = pCMesh->cflag;
for(int i = 0; i < 3; i++) {
pOut[nv] = pVtx[pData[i+1]];
ResolveVtx(pVtx+pData[i+1], pOut+nv, pState);
pIdx[ni++] = nv++;
}
@ -53,6 +60,7 @@ static int CollFuncTriFlat(uint16* pData, Model* pMod, RState* pState) {
for(int i = 0; i < 3; i++) {
Vector* pVec = pVtx + pData[3-i];
VecSet(-pVec->x, pVec->y, pVec->z, pOut+nv);
ResolveVtx(pOut+nv, pOut+nv, pState);
pIdx[ni++] = nv++;
}
}
@ -71,7 +79,7 @@ static int CollFuncQuadFlat(uint16* pData, Model* pMod, RState* pState) {
int* pIdx = pCMesh->pIndex;
pCMesh->pFlag[ni/3] = pCMesh->pFlag[1+ni/3] = pCMesh->cflag;
for(int i = 0; i < 4; i++) pOut[nv+i] = pVtx[pData[i+1]];
for(int i = 0; i < 4; i++) ResolveVtx(pVtx+pData[i+1], pOut+nv+i, pState);
pIdx[ni+0] = nv; pIdx[ni+1] = nv+1; pIdx[ni+2] = nv+2;
pIdx[ni+3] = nv; pIdx[ni+4] = nv+2; pIdx[ni+5] = nv+3;
ni += 6; nv += 4;
@ -82,6 +90,7 @@ static int CollFuncQuadFlat(uint16* pData, Model* pMod, RState* pState) {
for(int i = 0; i < 4; i++) {
Vector* pVec = pVtx + pData[i+1];
VecSet(-pVec->x, pVec->y, pVec->z, pOut+nv+i);
ResolveVtx(pOut+nv+i, pOut+nv+i, pState);
}
pIdx[ni+0] = nv; pIdx[ni+1] = nv+2; pIdx[ni+2] = nv + 1;
pIdx[ni+3] = nv; pIdx[ni+4] = nv+3; pIdx[ni+5] = nv + 2;
@ -102,7 +111,7 @@ static void ArrayCallback(int nv2, int ni2, Vector* pVertex, uint16* pIndex,
int* pIdx = pCMesh->pIndex;
int* pFlag = pCMesh->pFlag;
for(int i = 0; i < nv2; i++) pOut[nv+i] = pVertex[i*2];
for(int i = 0; i < nv2; i++) ResolveVtx(pVertex+i*2, pOut+nv+i, pState);
for(int i = 0; i < ni2; i++) pIdx[ni+i] = nv+pIndex[i];
for(int i = 0; i < ni2/3; i++) pFlag[ni/3+i] = pCMesh->cflag;
ni += ni2; nv += nv2;
@ -111,6 +120,8 @@ static void ArrayCallback(int nv2, int ni2, Vector* pVertex, uint16* pIndex,
for(int i = 0; i < nv2; i++) {
Vector* pVec = pVertex + i*2;
VecSet(-pVec->x, pVec->y, pVec->z, pOut+nv+i);
ResolveVtx(pOut+nv+i, pOut+nv+i, pState);
}
for(int i = 0; i < ni2; i += 3) {
pIdx[ni+i+0] = nv+pIndex[i];
@ -173,6 +184,7 @@ static int CollFuncSubObject(uint16* pData, Model* pMod, RState* pState) {
MatMatMult(&pState->objorient, &m, &orient);
MatVecMult(&pState->objorient, pState->pVtx+pData[3], &pos);
VecMul(&pos, pState->scale, &pos);
VecAdd(&pos, &pState->objpos, &pos);
float scale = pState->scale*pData[6]*0.01f;

View File

@ -535,6 +535,7 @@ static int PrimFuncSubObject (uint16 *pData, Model *pMod, RState *pState)
MatMatMult (&pState->objorient, &m, &orient);
MatVecMult (&pState->objorient, pState->pVtx+pData[3], &pos);
VecMul(&pos, pState->scale, &pos);
VecAdd (&pos, &pState->objpos, &pos);
float scale = pState->scale*pData[6]*0.01f;

View File

@ -54,6 +54,8 @@ void sbreRenderModel(Vector* pPos, Matrix* pOrient, int model, ObjParams* pParam
/*
* Will preserve and realloc pointers in pCMesh.
* maxv/maxi should match allocated sizes.
*/
void sbreGenCollMesh(CollMesh* pCMesh, int model, ObjParams* pParam, float s = 1.0f);
void sbreRenderCollMesh(CollMesh* pCMesh, Vector* pPos, Matrix* pOrient);