1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
// Copyright 2009-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include <stddef.h>
#include "../common/math/vec.h"
namespace embree { namespace collide2 {
using vec_t = Vec3fa;
struct ClothModel;
class Constraint {
public:
Constraint (size_t const numConstainedBodies)
: numConstrainedBodies_ (numConstainedBodies)
{
bodyIDs_ = new size_t[numConstrainedBodies_];
}
virtual ~Constraint () { delete[] bodyIDs_; }
virtual void solvePositionConstraint (ClothModel & model, float timeStep, size_t iter) = 0;
private:
Constraint (const Constraint& other) DELETED; // do not implement
Constraint& operator= (const Constraint& other) DELETED; // do not implement
protected:
size_t numConstrainedBodies_ = 0;
size_t* bodyIDs_ = nullptr;
};
class DistanceConstraint : public Constraint {
public:
DistanceConstraint ()
:
Constraint (2)
{}
virtual void initConstraint (ClothModel const & model, size_t p0ID, size_t p1ID);
virtual void solvePositionConstraint (ClothModel & model, float timeStep, size_t iter);
protected:
float rl_ {0.f};
float lambda_old_0_ {0.f};
float lambda_old_1_ {0.f};
};
class CollisionConstraint : public Constraint {
ALIGNED_CLASS_(16);
public:
CollisionConstraint ()
: Constraint (1) {}
virtual void initConstraint (size_t qID, const vec_t& x0, const vec_t& n, float d);
virtual void solvePositionConstraint (ClothModel & model, float timeStep, size_t iter);
protected:
vec_t x0_ = vec_t(0.f, 0.f, 0.f);
vec_t n_ = vec_t(0.f, 0.f, 0.f);
float d_ = 1.e5f;
};
} // namespace collide2
} // namespace embree
|