diff --git a/src/sbre/brender.cpp b/src/sbre/brender.cpp index 71c34a1..e54f0ef 100644 --- a/src/sbre/brender.cpp +++ b/src/sbre/brender.cpp @@ -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); +} + diff --git a/src/sbre/collfunc.cpp b/src/sbre/collfunc.cpp index 1f7ca19..2b25a88 100644 --- a/src/sbre/collfunc.cpp +++ b/src/sbre/collfunc.cpp @@ -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; diff --git a/src/sbre/primfunc.cpp b/src/sbre/primfunc.cpp index 23b0827..891597c 100644 --- a/src/sbre/primfunc.cpp +++ b/src/sbre/primfunc.cpp @@ -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; diff --git a/src/sbre/sbre.h b/src/sbre/sbre.h index 8c6ee81..36aa1c5 100644 --- a/src/sbre/sbre.h +++ b/src/sbre/sbre.h @@ -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);