コード例 #1
0
ファイル: MeshDistance.cpp プロジェクト: kbinani/dxrip
void MeshDistanceBruteForce::InitMeshList(const Vector< pair<const BaseMesh*, Matrix4> > &meshes)
{
    UINT triangleSum = 0;
    const UINT meshCount = meshes.Length();
    for(UINT meshIndex = 0; meshIndex < meshCount; meshIndex++)
    {
        triangleSum += meshes[meshIndex].first->FaceCount();
    }

    _triangles.Allocate(triangleSum);

	UINT triangleListIndex = 0;

	for(UINT meshIndex = 0; meshIndex < meshCount; meshIndex++)
    {
        const BaseMesh &curMesh = *meshes[meshIndex].first;
        const Matrix4 &curTransform = meshes[meshIndex].second;
        const UINT triangleCount = curMesh.FaceCount();
        const MeshVertex *vertices = curMesh.Vertices();
        const DWORD *indices = curMesh.Indices();
		for(UINT triangleIndex = 0; triangleIndex < triangleCount; triangleIndex++)
		{
            TriangleEntry &curEntry = _triangles[triangleListIndex];
            curEntry.V[0] = curTransform.TransformPoint(vertices[ indices[ triangleIndex * 3 + 0 ] ].Pos);
            curEntry.V[1] = curTransform.TransformPoint(vertices[ indices[ triangleIndex * 3 + 1 ] ].Pos);
            curEntry.V[2] = curTransform.TransformPoint(vertices[ indices[ triangleIndex * 3 + 2 ] ].Pos);
            Rectangle3f curBBox = Rectangle3f::ConstructFromTwoPoints(curEntry.V[0], curEntry.V[1]);
            curBBox.ExpandBoundingBox(curEntry.V[2]);
            curEntry.center = curBBox.Center();
            curEntry.variance = curBBox.Variance();
			triangleListIndex++;
		}
    }
}
コード例 #2
0
ファイル: MeshDistance.cpp プロジェクト: kbinani/dxrip
bool MeshDistanceBruteForce::IntersectMeshList(const Vector< pair<const BaseMesh*, Matrix4> > &meshes) const
{
    const UINT meshCount = meshes.Length();
    const UINT mTriangleCount = _triangles.Length();
    for(UINT meshIndex = 0; meshIndex < meshCount; meshIndex++)
    {
        const BaseMesh &curMesh = *meshes[meshIndex].first;
        const Matrix4 &curTransform = meshes[meshIndex].second;
        const UINT triangleCount = curMesh.FaceCount();
        const MeshVertex *vertices = curMesh.Vertices();
        const DWORD *indices = curMesh.Indices();
		for(UINT outerTriangleIndex = 0; outerTriangleIndex < triangleCount; outerTriangleIndex++)
		{
			const Vec3f t0 = curTransform.TransformPoint(vertices[ indices[ outerTriangleIndex * 3 + 0 ] ].Pos);
			const Vec3f t1 = curTransform.TransformPoint(vertices[ indices[ outerTriangleIndex * 3 + 1 ] ].Pos);
			const Vec3f t2 = curTransform.TransformPoint(vertices[ indices[ outerTriangleIndex * 3 + 2 ] ].Pos);

            Rectangle3f curBBox = Rectangle3f::ConstructFromTwoPoints(t0, t1);
            curBBox.ExpandBoundingBox(t2);
            const Vec3f center = curBBox.Center();
            const Vec3f variance = curBBox.Variance();
			
            for(UINT innerTriangleIndex = 0; innerTriangleIndex < mTriangleCount; innerTriangleIndex++)
            {
                const TriangleEntry &curEntry = _triangles[innerTriangleIndex];
                if(Math::Abs(center.x - curEntry.center.x) <= variance.x + curEntry.variance.x &&
                   Math::Abs(center.y - curEntry.center.y) <= variance.y + curEntry.variance.y &&
                   Math::Abs(center.z - curEntry.center.z) <= variance.z + curEntry.variance.z)
                {
                    if(Math::DistanceTriangleTriangleSq(t0, t1, t2, curEntry.V[0], curEntry.V[1], curEntry.V[2]) == 0.0f)
                    {
                        float value = Math::DistanceTriangleTriangleSq(t0, t1, t2, curEntry.V[0], curEntry.V[1], curEntry.V[2]);
                        return true;
                    }
                }
            }
		}
    }
    return false;
}