[Bf-blender-cvs] [b40533a] hair_system: Transform contact points into object space for drawing and show both points at the same time.
Lukas Tönne
noreply at git.blender.org
Mon Aug 4 16:18:59 CEST 2014
Commit: b40533a111268599d2e8e9873843d579af673c71
Author: Lukas Tönne
Date: Mon Aug 4 16:18:57 2014 +0200
Branches: hair_system
https://developer.blender.org/rBb40533a111268599d2e8e9873843d579af673c71
Transform contact points into object space for drawing and show both
points at the same time.
===================================================================
M source/blender/blenkernel/intern/object.c
M source/blender/editors/space_view3d/drawhair.c
M source/blender/hair/HAIR_capi.cpp
M source/blender/hair/HAIR_capi.h
M source/blender/hair/intern/HAIR_debug.h
M source/blender/hair/intern/HAIR_solver.cpp
===================================================================
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index ded7a4b..da3ff6c 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -3127,6 +3127,17 @@ void BKE_object_sim_tick(Scene *UNUSED(scene), Object *ob, float ctime, float ti
if (hmd->debug_contacts)
MEM_freeN(hmd->debug_contacts);
HAIR_solver_step_debug(hmd->solver, ctime, timestep, &hmd->debug_contacts, &hmd->debug_totcontacts);
+ /* transform to object space */
+ {
+ float imat[4][4];
+ int i;
+ invert_m4_m4(imat, ob->obmat);
+ for (i = 0; i < hmd->debug_totcontacts; ++i) {
+ HAIR_SolverContact *c = hmd->debug_contacts + i;
+ mul_m4_v3(imat, c->coA);
+ mul_m4_v3(imat, c->coB);
+ }
+ }
#endif
}
}
diff --git a/source/blender/editors/space_view3d/drawhair.c b/source/blender/editors/space_view3d/drawhair.c
index 8d9855e..8f3b6e5 100644
--- a/source/blender/editors/space_view3d/drawhair.c
+++ b/source/blender/editors/space_view3d/drawhair.c
@@ -258,14 +258,25 @@ static void draw_hair_debug_contacts(HAIR_SolverContact *contacts, int totcontac
#ifdef SHOW_CONTACTS
int i;
- glColor3f(1.0f, 0.1f, 0.0f);
+ glBegin(GL_LINES);
+ glColor3f(0.7f, 0.7f, 0.9f);
+ for (i = 0; i < totcontacts; ++i) {
+ HAIR_SolverContact *c = contacts + i;
+
+ glVertex3f(c->coA[0], c->coA[1], c->coA[2]);
+ glVertex3f(c->coB[0], c->coB[1], c->coB[2]);
+ }
+ glEnd();
glPointSize(3.0f);
glBegin(GL_POINTS);
for (i = 0; i < totcontacts; ++i) {
HAIR_SolverContact *c = contacts + i;
- glVertex3f(c->co[0], c->co[1], c->co[2]);
+ glColor3f(1.0f, 0.1f, 0.0f);
+ glVertex3f(c->coA[0], c->coA[1], c->coA[2]);
+ glColor3f(0.0f, 1.0f, 0.7f);
+ glVertex3f(c->coB[0], c->coB[1], c->coB[2]);
}
glEnd();
glPointSize(1.0f);
diff --git a/source/blender/hair/HAIR_capi.cpp b/source/blender/hair/HAIR_capi.cpp
index c192184..f84d1ac 100644
--- a/source/blender/hair/HAIR_capi.cpp
+++ b/source/blender/hair/HAIR_capi.cpp
@@ -111,7 +111,8 @@ void HAIR_solver_step_debug(struct HAIR_Solver *csolver, float time, float times
*contacts = (HAIR_SolverContact *)MEM_mallocN(sizeof(HAIR_SolverContact) * dbg_contacts.size(), "hair solver contact debug data");
for (int i = 0; i < dbg_contacts.size(); ++i) {
HAIR_SolverContact *c = (*contacts) + i;
- copy_v3_v3(c->co, dbg_contacts[i].data());
+ copy_v3_v3(c->coA, dbg_contacts[i].coA.data());
+ copy_v3_v3(c->coB, dbg_contacts[i].coB.data());
}
}
diff --git a/source/blender/hair/HAIR_capi.h b/source/blender/hair/HAIR_capi.h
index 6a29e9d..faa20c3 100644
--- a/source/blender/hair/HAIR_capi.h
+++ b/source/blender/hair/HAIR_capi.h
@@ -45,7 +45,7 @@ void HAIR_solver_build_data(struct HAIR_Solver *solver, struct Scene *scene, str
void HAIR_solver_update_externals(struct HAIR_Solver *solver, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, struct HairSystem *hsys, float time);
typedef struct HAIR_SolverContact {
- float co[3];
+ float coA[3], coB[3];
} HAIR_SolverContact;
void HAIR_solver_step(struct HAIR_Solver *solver, float time, float timestep);
diff --git a/source/blender/hair/intern/HAIR_debug.h b/source/blender/hair/intern/HAIR_debug.h
index 069c022..d363dde 100644
--- a/source/blender/hair/intern/HAIR_debug.h
+++ b/source/blender/hair/intern/HAIR_debug.h
@@ -38,14 +38,21 @@ HAIR_NAMESPACE_BEGIN
#endif
struct Debug {
- typedef std::vector<float3> CollisionContacts;
+ struct Contact {
+ float3 coA, coB;
+ };
+ typedef std::vector<Contact> CollisionContacts;
#ifdef HAIR_DEBUG
- static void collision_contact(const float3 &co)
+ static void collision_contact(const float3 &coA, const float3 &coB)
{
- if (m_contacts)
- m_contacts->push_back(co);
+ if (m_contacts) {
+ Contact c;
+ c.coA = coA;
+ c.coB = coB;
+ m_contacts->push_back(c);
+ }
}
static void set_collision_contacts(CollisionContacts *contacts)
diff --git a/source/blender/hair/intern/HAIR_solver.cpp b/source/blender/hair/intern/HAIR_solver.cpp
index 4e07282..f176a6a 100644
--- a/source/blender/hair/intern/HAIR_solver.cpp
+++ b/source/blender/hair/intern/HAIR_solver.cpp
@@ -163,7 +163,7 @@ static void debug_point_contacts(btDynamicsWorld *dworld, Point *point)
const btVector3 &ptB = pt.getPositionWorldOnB();
const btVector3 &normalOnB = pt.m_normalWorldOnB;
- Debug::collision_contact(float3(ptB.x(), ptB.y(), ptB.z()));
+ Debug::collision_contact(float3(ptA.x(), ptA.y(), ptA.z()), float3(ptB.x(), ptB.y(), ptB.z()));
}
}
}
More information about the Bf-blender-cvs
mailing list