Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Collision/CollideSoftBodyVertexIterator.h
9912 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2024 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#pragma once56#include <Jolt/Physics/SoftBody/SoftBodyVertex.h>7#include <Jolt/Core/StridedPtr.h>89JPH_NAMESPACE_BEGIN1011/// Class that allows iterating over the vertices of a soft body.12/// It tracks the largest penetration and allows storing the resulting collision in a different structure than the soft body vertex itself.13class CollideSoftBodyVertexIterator14{15public:16/// Default constructor17CollideSoftBodyVertexIterator() = default;18CollideSoftBodyVertexIterator(const CollideSoftBodyVertexIterator &) = default;1920/// Construct using (strided) pointers21CollideSoftBodyVertexIterator(const StridedPtr<const Vec3> &inPosition, const StridedPtr<const float> &inInvMass, const StridedPtr<Plane> &inCollisionPlane, const StridedPtr<float> &inLargestPenetration, const StridedPtr<int> &inCollidingShapeIndex) :22mPosition(inPosition),23mInvMass(inInvMass),24mCollisionPlane(inCollisionPlane),25mLargestPenetration(inLargestPenetration),26mCollidingShapeIndex(inCollidingShapeIndex)27{28}2930/// Construct using a soft body vertex31explicit CollideSoftBodyVertexIterator(SoftBodyVertex *inVertices) :32mPosition(&inVertices->mPosition, sizeof(SoftBodyVertex)),33mInvMass(&inVertices->mInvMass, sizeof(SoftBodyVertex)),34mCollisionPlane(&inVertices->mCollisionPlane, sizeof(SoftBodyVertex)),35mLargestPenetration(&inVertices->mLargestPenetration, sizeof(SoftBodyVertex)),36mCollidingShapeIndex(&inVertices->mCollidingShapeIndex, sizeof(SoftBodyVertex))37{38}3940/// Default assignment41CollideSoftBodyVertexIterator & operator = (const CollideSoftBodyVertexIterator &) = default;4243/// Equality operator.44/// Note: Only used to determine end iterator, so we only compare position.45bool operator != (const CollideSoftBodyVertexIterator &inRHS) const46{47return mPosition != inRHS.mPosition;48}4950/// Next vertex51CollideSoftBodyVertexIterator & operator ++ ()52{53++mPosition;54++mInvMass;55++mCollisionPlane;56++mLargestPenetration;57++mCollidingShapeIndex;58return *this;59}6061/// Add an offset62/// Note: Only used to determine end iterator, so we only set position.63CollideSoftBodyVertexIterator operator + (int inOffset) const64{65return CollideSoftBodyVertexIterator(mPosition + inOffset, StridedPtr<const float>(), StridedPtr<Plane>(), StridedPtr<float>(), StridedPtr<int>());66}6768/// Get the position of the current vertex69Vec3 GetPosition() const70{71return *mPosition;72}7374/// Get the inverse mass of the current vertex75float GetInvMass() const76{77return *mInvMass;78}7980/// Update penetration of the current vertex81/// @return Returns true if the vertex has the largest penetration so far, this means you need to follow up by calling SetCollision82bool UpdatePenetration(float inLargestPenetration) const83{84float &penetration = *mLargestPenetration;85if (penetration >= inLargestPenetration)86return false;87penetration = inLargestPenetration;88return true;89}9091/// Update the collision of the current vertex92void SetCollision(const Plane &inCollisionPlane, int inCollidingShapeIndex) const93{94*mCollisionPlane = inCollisionPlane;95*mCollidingShapeIndex = inCollidingShapeIndex;96}9798private:99/// Input data100StridedPtr<const Vec3> mPosition;101StridedPtr<const float> mInvMass;102103/// Output data104StridedPtr<Plane> mCollisionPlane;105StridedPtr<float> mLargestPenetration;106StridedPtr<int> mCollidingShapeIndex;107};108109JPH_NAMESPACE_END110111112