CFixVector CFace::CalcCenter (CModel* po) { CFloatVector cf; CFixVector c; cf = CalcCenterf (po); c.Assign (cf); return c; }
void DrawOutline (int nVertices, g3sPoint **pointList) { int i; GLint depthFunc; g3sPoint center, Normal; CFixVector n; CFloatVector *nf; #if 1 //!DBG if (gameStates.render.bQueryOcclusion) { tRgbaColorf outlineColor = {1, 1, 0, -1}; G3DrawPolyAlpha (nVertices, pointList, &outlineColor, 1, -1); return; } #endif glGetIntegerv (GL_DEPTH_FUNC, &depthFunc); glDepthFunc (GL_ALWAYS); CCanvas::Current ()->SetColorRGB (255, 255, 255, 255); center.p3_vec.SetZero (); for (i = 0; i < nVertices; i++) { G3DrawLine (pointList [i], pointList [(i + 1) % nVertices]); center.p3_vec += pointList [i]->p3_vec; nf = &pointList [i]->p3_normal.vNormal; /* n[X] = (fix) (nf->x() * 65536.0f); n[Y] = (fix) (nf->y() * 65536.0f); n[Z] = (fix) (nf->z() * 65536.0f); */ n.Assign (*nf); transformation.Rotate(n, n, 0); Normal.p3_vec = pointList[i]->p3_vec + n * (I2X (10)); G3DrawLine (pointList [i], &Normal); } #if 0 VmVecNormal (&Normal.p3_vec, &pointList [0]->p3_vec, &pointList [1]->p3_vec, &pointList [2]->p3_vec); VmVecInc (&Normal.p3_vec, ¢er.p3_vec); VmVecScale (&Normal.p3_vec, I2X (10)); G3DrawLine (¢er, &Normal); #endif glDepthFunc (depthFunc); }
int CTriMeshBuilder::InsertTriangles (void) { tTriangle* triP = &m_triangles [0]; tFaceTriangle* grsTriP = TRIANGLES.Buffer (); CSegFace* m_faceP = NULL; CFixVector vNormal; int h, i, nFace = -1; GLuint nIndex = 0; PrintLog (" inserting new triangles\n"); QSortTriangles (0, m_nTriangles - 1); ResetVertexNormals (); for (h = 0; h < m_nTriangles; h++, triP++, grsTriP++) { grsTriP->nFace = triP->nFace; if (grsTriP->nFace == nFace) m_faceP->nTris++; else { if (m_faceP) m_faceP++; else m_faceP = FACES.faces.Buffer (); nFace = grsTriP->nFace; #if DBG if (m_faceP - FACES.faces != nFace) return 0; #endif m_faceP->nFrame = -1; m_faceP->nIndex = nIndex; m_faceP->nTriIndex = h; m_faceP->nTris = 1; #if USE_RANGE_ELEMENTS m_faceP->vertIndex = FACES.vertIndex + nIndex; #endif } grsTriP->nIndex = nIndex; memcpy (grsTriP->index, triP->index, sizeof (triP->index)); for (i = 0; i < 3; i++) FACES.vertices [nIndex + i].Assign (gameData.segs.fVertices [triP->index [i]]); FACES.normals [nIndex] = CFloatVector3::Normal (FACES.vertices [nIndex], FACES.vertices [nIndex + 1], FACES.vertices [nIndex + 2]); #if DBG if (FACES.normals [nIndex].Mag () == 0) m_faceP = m_faceP; #endif vNormal.Assign (FACES.normals [nIndex]); for (i = 1; i < 3; i++) FACES.normals [nIndex + i] = FACES.normals [nIndex]; memcpy (FACES.texCoord + nIndex, triP->texCoord, sizeof (triP->texCoord)); memcpy (FACES.ovlTexCoord + nIndex, triP->ovlTexCoord, sizeof (triP->ovlTexCoord)); memcpy (FACES.color + nIndex, triP->color, sizeof (triP->color)); #if USE_RANGE_ELEMENTS for (i = 0; i < 3; i++, nIndex++) FACES.vertIndex [nIndex] = nIndex; #else nIndex += 3; #endif } gameData.segs.nTris = m_nTriangles; SetupVertexNormals (); FreeData (); PrintLog (" created %d new triangles and %d new vertices\n", m_nTriangles - m_nTris, gameData.segs.nVertices - m_nVertices); CreateFaceVertLists (); return 1; }