Code/HumanoidRetargeter/Core/Formats/Mmd/Bullet/BulletCollision/GjkEpaSolver2MinkowskiDiff.cs

A small helper class used by the collision solver. It represents a Minkowski difference wrapper around two ConvexShape instances and provides support functions used by GJK/EPA, plus a margin toggle and simple transform fields.

Native Interop
/*
 * C# / XNA  port of Bullet (c) 2011 Mark Neale <[email protected]>
 *
 * Bullet Continuous Collision Detection and Physics Library
 * Copyright (c) 2003-2008 Erwin Coumans  http://www.bulletphysics.com/
 *
 * This software is provided 'as-is', without any express or implied warranty.
 * In no event will the authors be held liable for any damages arising from
 * the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
 *    appreciated but is not required.
 * 2. Altered source versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 * 3. This notice may not be removed or altered from any source distribution.
 */
// Adapted from BulletXNA 73b2e1b9: namespace isolation, no XNA rendering, one type per file.
#nullable disable
#pragma warning disable CS1591, CS0168, CS0219, CS0414, CS0660, CS0661, CS0659, CS0693, CS8981, CS0108, CS0114
using System;
using System.Collections.Generic;
using HumanoidRetargeter.Core.Formats.Mmd.Bullet.LinearMath;
using System.Diagnostics;

namespace HumanoidRetargeter.Core.Formats.Mmd.Bullet.BulletCollision;

internal class GjkEpaSolver2MinkowskiDiff : IDisposable
{
	public GjkEpaSolver2MinkowskiDiff()
	{
	}

	public void EnableMargin(bool enable)
	{
		m_enableMargin = enable;
	}

	public IndexedVector3 Support0(ref IndexedVector3 d)
	{
		if (m_enableMargin)
		{
			return m_shapes[0].LocalGetSupportVertexNonVirtual(ref d);
		}

		return m_shapes[0].LocalGetSupportVertexWithoutMarginNonVirtual(ref d);
	}

	public IndexedVector3 Support1(ref IndexedVector3 d)
	{
		IndexedVector3 dcopy = m_toshape1 * d;
		IndexedVector3 temp = m_enableMargin ? m_shapes[1].LocalGetSupportVertexNonVirtual(ref dcopy) : m_shapes[1].LocalGetSupportVertexWithoutMarginNonVirtual(ref dcopy);
		return m_toshape0 * temp;
	}

	public IndexedVector3 Support(ref IndexedVector3 d)
	{
		IndexedVector3 minusD = -d;
		IndexedVector3 temp = Support1(ref minusD);
		return (Support0(ref d) - temp);
	}

	public IndexedVector3 Support(ref IndexedVector3 d, uint index)
	{
		if (index > 0)
			return (Support1(ref d));
		else
			return (Support0(ref d));
	}

	public virtual void Dispose()
	{
		BulletGlobals.GjkEpaSolver2MinkowskiDiffPool.Free(this);
	}

	public bool m_enableMargin;
	public ConvexShape[] m_shapes = new ConvexShape[2];
	public IndexedBasisMatrix m_toshape1 = IndexedBasisMatrix.Identity;
	public IndexedMatrix m_toshape0 = IndexedMatrix.Identity;
}