Path: blob/master/thirdparty/jolt_physics/Jolt/Geometry/IndexedTriangle.h
9913 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#pragma once56#include <Jolt/Core/HashCombine.h>78JPH_NAMESPACE_BEGIN910/// Triangle with 32-bit indices11class IndexedTriangleNoMaterial12{13public:14JPH_OVERRIDE_NEW_DELETE1516/// Constructor17IndexedTriangleNoMaterial() = default;18constexpr IndexedTriangleNoMaterial(uint32 inI1, uint32 inI2, uint32 inI3) : mIdx { inI1, inI2, inI3 } { }1920/// Check if two triangles are identical21bool operator == (const IndexedTriangleNoMaterial &inRHS) const22{23return mIdx[0] == inRHS.mIdx[0] && mIdx[1] == inRHS.mIdx[1] && mIdx[2] == inRHS.mIdx[2];24}2526/// Check if two triangles are equivalent (using the same vertices)27bool IsEquivalent(const IndexedTriangleNoMaterial &inRHS) const28{29return (mIdx[0] == inRHS.mIdx[0] && mIdx[1] == inRHS.mIdx[1] && mIdx[2] == inRHS.mIdx[2])30|| (mIdx[0] == inRHS.mIdx[1] && mIdx[1] == inRHS.mIdx[2] && mIdx[2] == inRHS.mIdx[0])31|| (mIdx[0] == inRHS.mIdx[2] && mIdx[1] == inRHS.mIdx[0] && mIdx[2] == inRHS.mIdx[1]);32}3334/// Check if two triangles are opposite (using the same vertices but in opposing order)35bool IsOpposite(const IndexedTriangleNoMaterial &inRHS) const36{37return (mIdx[0] == inRHS.mIdx[0] && mIdx[1] == inRHS.mIdx[2] && mIdx[2] == inRHS.mIdx[1])38|| (mIdx[0] == inRHS.mIdx[1] && mIdx[1] == inRHS.mIdx[0] && mIdx[2] == inRHS.mIdx[2])39|| (mIdx[0] == inRHS.mIdx[2] && mIdx[1] == inRHS.mIdx[1] && mIdx[2] == inRHS.mIdx[0]);40}4142/// Check if triangle is degenerate43bool IsDegenerate(const VertexList &inVertices) const44{45Vec3 v0(inVertices[mIdx[0]]);46Vec3 v1(inVertices[mIdx[1]]);47Vec3 v2(inVertices[mIdx[2]]);4849return (v1 - v0).Cross(v2 - v0).IsNearZero();50}5152/// Rotate the vertices so that the second vertex becomes first etc. This does not change the represented triangle.53void Rotate()54{55uint32 tmp = mIdx[0];56mIdx[0] = mIdx[1];57mIdx[1] = mIdx[2];58mIdx[2] = tmp;59}6061/// Get center of triangle62Vec3 GetCentroid(const VertexList &inVertices) const63{64return (Vec3(inVertices[mIdx[0]]) + Vec3(inVertices[mIdx[1]]) + Vec3(inVertices[mIdx[2]])) / 3.0f;65}6667/// Get the hash value of this structure68uint64 GetHash() const69{70static_assert(sizeof(IndexedTriangleNoMaterial) == 3 * sizeof(uint32), "Class should have no padding");71return HashBytes(this, sizeof(IndexedTriangleNoMaterial));72}7374uint32 mIdx[3];75};7677/// Triangle with 32-bit indices and material index78class IndexedTriangle : public IndexedTriangleNoMaterial79{80public:81using IndexedTriangleNoMaterial::IndexedTriangleNoMaterial;8283/// Constructor84constexpr IndexedTriangle(uint32 inI1, uint32 inI2, uint32 inI3, uint32 inMaterialIndex, uint inUserData = 0) : IndexedTriangleNoMaterial(inI1, inI2, inI3), mMaterialIndex(inMaterialIndex), mUserData(inUserData) { }8586/// Check if two triangles are identical87bool operator == (const IndexedTriangle &inRHS) const88{89return mMaterialIndex == inRHS.mMaterialIndex && mUserData == inRHS.mUserData && IndexedTriangleNoMaterial::operator==(inRHS);90}9192/// Rotate the vertices so that the lowest vertex becomes the first. This does not change the represented triangle.93IndexedTriangle GetLowestIndexFirst() const94{95if (mIdx[0] < mIdx[1])96{97if (mIdx[0] < mIdx[2])98return IndexedTriangle(mIdx[0], mIdx[1], mIdx[2], mMaterialIndex, mUserData); // 0 is smallest99else100return IndexedTriangle(mIdx[2], mIdx[0], mIdx[1], mMaterialIndex, mUserData); // 2 is smallest101}102else103{104if (mIdx[1] < mIdx[2])105return IndexedTriangle(mIdx[1], mIdx[2], mIdx[0], mMaterialIndex, mUserData); // 1 is smallest106else107return IndexedTriangle(mIdx[2], mIdx[0], mIdx[1], mMaterialIndex, mUserData); // 2 is smallest108}109}110111/// Get the hash value of this structure112uint64 GetHash() const113{114static_assert(sizeof(IndexedTriangle) == 5 * sizeof(uint32), "Class should have no padding");115return HashBytes(this, sizeof(IndexedTriangle));116}117118uint32 mMaterialIndex = 0;119uint32 mUserData = 0; ///< User data that can be used for anything by the application, e.g. for tracking the original index of the triangle120};121122using IndexedTriangleNoMaterialList = Array<IndexedTriangleNoMaterial>;123using IndexedTriangleList = Array<IndexedTriangle>;124125JPH_NAMESPACE_END126127// Create a std::hash for IndexedTriangleNoMaterial and IndexedTriangle128JPH_MAKE_STD_HASH(JPH::IndexedTriangleNoMaterial)129JPH_MAKE_STD_HASH(JPH::IndexedTriangle)130131132