void SetPlane(double *p1, double *p2, double *p3, double *pln) { // set plane through points p1, p2, p3 double cen[3]; TriangleNormal(p1, p2, p3, pln); TriangleCenter(p1, p2, p3, cen); pln[3] = -DotProduct(cen, pln); }
static void ConvertWorldBrushesToPhysCollide( CUtlVector<CPhysCollisionEntry *> &collisionList, float shrinkSize, float mergeTolerance, int contentsMask ) { CPlaneList planes( shrinkSize, mergeTolerance ); planes.m_contentsMask = contentsMask; VisitLeaves_r( planes, dmodels[0].headnode ); planes.AddBrushes(); int count = planes.m_convex.Count(); if ( count ) { CPhysCollide *pCollide = physcollision->ConvertConvexToCollide( planes.m_convex.Base(), count ); ICollisionQuery *pQuery = physcollision->CreateQueryModel( pCollide ); int convex = pQuery->ConvexCount(); for ( int i = 0; i < convex; i++ ) { int triCount = pQuery->TriangleCount( i ); int brushIndex = pQuery->GetGameData( i ); Vector points[3]; for ( int j = 0; j < triCount; j++ ) { pQuery->GetTriangleVerts( i, j, points ); Vector normal = TriangleNormal( points[0], points[1], points[2] ); dbrushside_t *pside = FindBrushSide( brushIndex, normal ); if ( pside->texinfo != TEXINFO_NODE ) { int prop = g_SurfaceProperties[texinfo[pside->texinfo].texdata]; pQuery->SetTriangleMaterialIndex( i, j, RemapWorldMaterial( prop ) ); } } } physcollision->DestroyQueryModel( pQuery ); pQuery = NULL; collisionList.AddToTail( new CPhysCollisionEntryStaticSolid( pCollide, contentsMask ) ); } }
void CMesh::CalculateVertexAverageNormals(void) { unsigned long i; for (i=0; i<num_vertices; ++i) vertices[i].normal.Set(0.0f, 0.0f, 0.0f); for (i=0; i<num_faces; ++i) { unsigned long *iv=indices+i*3; CVector3D N=TriangleNormal( vertices[iv[0]].position, vertices[iv[1]].position, vertices[iv[2]].position); vertices[iv[0]].normal+=N; vertices[iv[1]].normal+=N; vertices[iv[2]].normal+=N; } for (i=0; i<num_vertices; ++i) vertices[i].normal.Normalize(); }