early out, bugfix

This commit is contained in:
Irlan 2018-06-28 21:55:49 -03:00
parent 0154db4b77
commit 8ebdb67a75
5 changed files with 32 additions and 60 deletions

View File

@ -89,8 +89,8 @@ public:
b3Shape* s2;
float32 s;
bool f1_active, f2_active;
b3FrictionForce f1, f2;
bool f_active;
b3FrictionForce f;
bool n_active, t1_active, t2_active;
b3Vec3 n, t1, t2;

View File

@ -85,6 +85,11 @@ inline const b3Mat33& b3SparseSymMat33::operator()(u32 i, u32 j) const
u32 row_value_index = row_value_begin + row_value;
u32 row_value_column = value_columns[row_value_index];
if (row_value_column < j)
{
break;
}
if (row_value_column == j)
{
return values[row_value_index];
@ -112,7 +117,12 @@ inline b3Mat33& b3SparseSymMat33::operator()(u32 i, u32 j)
{
u32 row_value_index = row_value_begin + row_value;
u32 row_value_column = value_columns[row_value_index];
if (row_value_column < j)
{
break;
}
if (row_value_column == j)
{
return values[row_value_index];
@ -120,30 +130,30 @@ inline b3Mat33& b3SparseSymMat33::operator()(u32 i, u32 j)
}
// Find insert position
u32 row_value_k = 0;
u32 row_value_position = 0;
for (u32 row_value = 0; row_value < row_value_count; ++row_value)
{
u32 row_value_index = row_value_begin + row_value;
u32 row_value_column = value_columns[row_value_index];
if (row_value_column >= j)
if (row_value_column > j)
{
row_value_k = row_value;
row_value_position = row_value;
break;
}
}
// Shift the values
B3_ASSERT(value_count < value_capacity);
for (u32 row_value = value_count; row_value > row_value_begin + row_value_k; --row_value)
for (u32 row_value = value_count; row_value > row_value_begin + row_value_position; --row_value)
{
values[row_value] = values[row_value - 1];
value_columns[row_value] = value_columns[row_value - 1];
}
// Insert the value
value_columns[row_value_begin + row_value_k] = j;
values[row_value_begin + row_value_k].SetZero();
value_columns[row_value_begin + row_value_position] = j;
values[row_value_begin + row_value_position].SetZero();
++value_count;
// Shift the row pointers
@ -153,7 +163,7 @@ inline b3Mat33& b3SparseSymMat33::operator()(u32 i, u32 j)
}
// Return the inserted value
return values[row_value_begin + row_value_k];
return values[row_value_begin + row_value_position];
}
inline void b3SparseSymMat33::Diagonal(b3DiagMat33& out) const

View File

@ -483,8 +483,7 @@ void b3Cloth::UpdateContacts()
b3BodyContact c0 = *c;
// Create a new contact
c->f1_active = false;
c->f2_active = false;
c->f_active = false;
c->n_active = false;
c->t1_active = false;
c->t2_active = false;
@ -591,6 +590,11 @@ void b3Cloth::UpdateContacts()
c->t1 = t1;
c->t2 = t2;
//c->f_active = true;
//c->f.m_type = e_frictionForce;
//c->f.m_p = p;
//c->f.m_kd = 10.0f;
}
b3Vec3 ts[2];
@ -609,18 +613,6 @@ void b3Cloth::UpdateContacts()
Ft0[0] = c0.Ft1;
Ft0[1] = c0.Ft2;
bool f_active[2];
f_active[0] = c->f1_active;
f_active[1] = c->f2_active;
bool f_active0[2];
f_active0[0] = c0.f1_active;
f_active0[1] = c0.f2_active;
b3FrictionForce* sf[2];
sf[0] = &c->f1;
sf[1] = &c->f2;
for (u32 k = 0; k < 2; ++k)
{
b3Vec3 t = ts[k];
@ -633,30 +625,8 @@ void b3Cloth::UpdateContacts()
// Lock particle on surface
t_active[k] = true;
}
if (t_active0[k] == true && t_active[k] == true)
{
float32 frictionForce = Ft0[k];
// Dynamic friction
if (frictionForce * frictionForce > maxFrictionForce * maxFrictionForce)
{
// Unlock particle off surface
//t_active[k] = false;
// Apply dynamic friction
//f_active[k] = true;
//sf[k]->m_type = e_frictionForce;
//sf[k]->m_p = p;
//sf[k]->m_kd = 100.0f;
}
}
}
c->f1_active = f_active[0];
c->f2_active = f_active[1];
c->t1_active = t_active[0];
c->t2_active = t_active[1];
}
@ -687,14 +657,9 @@ void b3Cloth::Solve(float32 dt, const b3Vec3& gravity)
for (b3Particle* p = m_particleList.m_head; p; p = p->m_next)
{
if (p->m_contact.f1_active)
if (p->m_contact.f_active)
{
solver.Add(&p->m_contact.f1);
}
if (p->m_contact.f2_active)
{
solver.Add(&p->m_contact.f2);
solver.Add(&p->m_contact.f);
}
if (p->m_contact.n_active)
@ -706,8 +671,7 @@ void b3Cloth::Solve(float32 dt, const b3Vec3& gravity)
// Solve
solver.Solve(dt, gravity);
// Clear external applied forces
// Clear translations
// Clear external applied forces and translations
for (b3Particle* p = m_particleList.m_head; p; p = p->m_next)
{
p->m_force.SetZero();

View File

@ -223,7 +223,7 @@ void b3ClothSolver::Solve(float32 dt, const b3Vec3& gravity)
sx0[i] = p->m_x;
}
// Apply contact position correction
// Apply internal translations
for (u32 i = 0; i < m_contactCount; ++i)
{
b3BodyContact* c = m_contacts[i];

View File

@ -57,8 +57,7 @@ b3Particle::b3Particle(const b3ParticleDef& def, b3Cloth* cloth)
m_x.SetZero();
m_vertex = ~0;
m_contact.f1_active = false;
m_contact.f2_active = false;
m_contact.f_active = false;
m_contact.n_active = false;
m_contact.t1_active = false;
m_contact.t2_active = false;
@ -87,8 +86,7 @@ void b3Particle::SetType(b3ParticleType type)
m_velocity.SetZero();
m_translation.SetZero();
m_contact.f1_active = false;
m_contact.f2_active = false;
m_contact.f_active = false;
m_contact.n_active = false;
m_contact.t1_active = false;
m_contact.t2_active = false;