[Fix] Fixed CollMesh+Scale. ^.^
This commit is contained in:
parent
196e7345a1
commit
754e25f116
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user