From 754e25f116b001f6f511082fd99d8234c89cb616 Mon Sep 17 00:00:00 2001
From: Rtch90 <ritchie.cunningham@protonmail.com>
Date: Sun, 19 Nov 2017 12:28:18 +0000
Subject: [PATCH] [Fix] Fixed CollMesh+Scale. ^.^

---
 src/sbre/brender.cpp  | 30 ++++++++++++++++++++++++------
 src/sbre/collfunc.cpp | 18 +++++++++++++++---
 src/sbre/primfunc.cpp |  1 +
 src/sbre/sbre.h       |  2 ++
 4 files changed, 42 insertions(+), 9 deletions(-)

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);