Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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();
}