r5sdk/r5dev/vphysics/physics_collide.cpp
Kawe Mazidjatari 7d89a42b56 Mathlib implementation
SourceSDK mathlib port with light modifications.
Renamed Vector to Vector3D (to avoid confusion with std::vector (declared as vector) and Vector2D/Vector4D).
2022-07-06 21:11:32 +02:00

51 lines
1.4 KiB
C++

//===== Copyright (c) 1996-2005, Valve Corporation, All rights reserved. ======//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "core/stdafx.h"
#include "mathlib/vector.h"
#include "mathlib/mathlib.h"
//-----------------------------------------------------------------------------
// Purpose: Calculate the volume of a tetrahedron with these vertices
// Input : p0 - points of tetrahedron
// p1 -
// p2 -
// p3 -
// Output : float (volume in units^3)
//-----------------------------------------------------------------------------
static float TetrahedronVolume(const Vector3D& p0, const Vector3D& p1, const Vector3D& p2, const Vector3D& p3)
{
Vector3D a, b, c, cross;
float volume = 1.0f / 6.0f;
a = p1 - p0;
b = p2 - p0;
c = p3 - p0;
cross = CrossProduct(b, c);
volume *= DotProduct(a, cross);
if (volume < 0)
return -volume;
return volume;
}
//-----------------------------------------------------------------------------
// Purpose: Calculate a triangle area with these vertices
// Input : p0 - points of tetrahedron
// p1 -
// p2 -
// Output : float (area)
//-----------------------------------------------------------------------------
static float TriangleArea(const Vector3D& p0, const Vector3D& p1, const Vector3D& p2)
{
Vector3D e0 = p1 - p0;
Vector3D e1 = p2 - p0;
Vector3D cross;
CrossProduct(e0, e1, cross);
return 0.5 * cross.Length();
}