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; b3Shape* s2;
float32 s; float32 s;
bool f1_active, f2_active; bool f_active;
b3FrictionForce f1, f2; b3FrictionForce f;
bool n_active, t1_active, t2_active; bool n_active, t1_active, t2_active;
b3Vec3 n, t1, t2; 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_index = row_value_begin + row_value;
u32 row_value_column = value_columns[row_value_index]; u32 row_value_column = value_columns[row_value_index];
if (row_value_column < j)
{
break;
}
if (row_value_column == j) if (row_value_column == j)
{ {
return values[row_value_index]; 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_index = row_value_begin + row_value;
u32 row_value_column = value_columns[row_value_index]; u32 row_value_column = value_columns[row_value_index];
if (row_value_column < j)
{
break;
}
if (row_value_column == j) if (row_value_column == j)
{ {
return values[row_value_index]; return values[row_value_index];
@ -120,30 +130,30 @@ inline b3Mat33& b3SparseSymMat33::operator()(u32 i, u32 j)
} }
// Find insert position // 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) for (u32 row_value = 0; row_value < row_value_count; ++row_value)
{ {
u32 row_value_index = row_value_begin + row_value; u32 row_value_index = row_value_begin + row_value;
u32 row_value_column = value_columns[row_value_index]; 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; break;
} }
} }
// Shift the values // Shift the values
B3_ASSERT(value_count < value_capacity); 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]; values[row_value] = values[row_value - 1];
value_columns[row_value] = value_columns[row_value - 1]; value_columns[row_value] = value_columns[row_value - 1];
} }
// Insert the value // Insert the value
value_columns[row_value_begin + row_value_k] = j; value_columns[row_value_begin + row_value_position] = j;
values[row_value_begin + row_value_k].SetZero(); values[row_value_begin + row_value_position].SetZero();
++value_count; ++value_count;
// Shift the row pointers // Shift the row pointers
@ -153,7 +163,7 @@ inline b3Mat33& b3SparseSymMat33::operator()(u32 i, u32 j)
} }
// Return the inserted value // 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 inline void b3SparseSymMat33::Diagonal(b3DiagMat33& out) const

View File

@ -483,8 +483,7 @@ void b3Cloth::UpdateContacts()
b3BodyContact c0 = *c; b3BodyContact c0 = *c;
// Create a new contact // Create a new contact
c->f1_active = false; c->f_active = false;
c->f2_active = false;
c->n_active = false; c->n_active = false;
c->t1_active = false; c->t1_active = false;
c->t2_active = false; c->t2_active = false;
@ -591,6 +590,11 @@ void b3Cloth::UpdateContacts()
c->t1 = t1; c->t1 = t1;
c->t2 = t2; 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]; b3Vec3 ts[2];
@ -609,18 +613,6 @@ void b3Cloth::UpdateContacts()
Ft0[0] = c0.Ft1; Ft0[0] = c0.Ft1;
Ft0[1] = c0.Ft2; 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) for (u32 k = 0; k < 2; ++k)
{ {
b3Vec3 t = ts[k]; b3Vec3 t = ts[k];
@ -633,30 +625,8 @@ void b3Cloth::UpdateContacts()
// Lock particle on surface // Lock particle on surface
t_active[k] = true; 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->t1_active = t_active[0];
c->t2_active = t_active[1]; 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) 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); solver.Add(&p->m_contact.f);
}
if (p->m_contact.f2_active)
{
solver.Add(&p->m_contact.f2);
} }
if (p->m_contact.n_active) if (p->m_contact.n_active)
@ -706,8 +671,7 @@ void b3Cloth::Solve(float32 dt, const b3Vec3& gravity)
// Solve // Solve
solver.Solve(dt, gravity); solver.Solve(dt, gravity);
// Clear external applied forces // Clear external applied forces and translations
// Clear translations
for (b3Particle* p = m_particleList.m_head; p; p = p->m_next) for (b3Particle* p = m_particleList.m_head; p; p = p->m_next)
{ {
p->m_force.SetZero(); p->m_force.SetZero();

View File

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

View File

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