Commit: 9226719ef50071fe9c899e6ffbff10372a3ab067 Author: Lukas Tönne Date: Fri Aug 8 10:42:29 2014 +0200 Branches: hair_system https://developer.blender.org/rB9226719ef50071fe9c899e6ffbff10372a3ab067
Make hair debug functions threadsafe by passing explicit per-thread debug data to them, instead of using static global data. =================================================================== M source/blender/hair/HAIR_capi.cpp M source/blender/hair/intern/HAIR_debug.cpp M source/blender/hair/intern/HAIR_debug.h M source/blender/hair/intern/HAIR_solver.cpp M source/blender/hair/intern/HAIR_solver.h =================================================================== diff --git a/source/blender/hair/HAIR_capi.cpp b/source/blender/hair/HAIR_capi.cpp index 7a6add5..81186ca 100644 --- a/source/blender/hair/HAIR_capi.cpp +++ b/source/blender/hair/HAIR_capi.cpp @@ -113,39 +113,52 @@ void HAIR_solver_step_debug(struct HAIR_Solver *csolver, float time, float times Solver *solver = (Solver *)csolver; Transform itfm(ob_imat); - Debug::Points dbg_points; - Debug::set_points(&dbg_points); - Debug::CollisionContacts dbg_contacts; - Debug::set_collision_contacts(&dbg_contacts); + DebugThreadDataVector thread_data_list; + solver->step_threaded(time, timestep, &thread_data_list); - solver->step_threaded(time, timestep); - - Debug::set_points(NULL); if (points && totpoints) { int tot = solver->data()->totpoints; *totpoints = tot; *points = (HAIR_SolverDebugPoint *)MEM_mallocN(sizeof(HAIR_SolverDebugPoint) * tot, "hair solver point debug data"); - for (int i = 0; i < dbg_points.size(); ++i) { - const Debug::Point &dbg_point = dbg_points[i]; - if (dbg_point.index < 0 || dbg_point.index >= tot) - continue; - - HAIR_SolverDebugPoint *p = (*points) + dbg_point.index; - copy_v3_v3(p->bend, transform_direction(itfm, dbg_point.bend).data()); - copy_v3_v3(p->frame[0], transform_direction(itfm, dbg_point.frame.normal).data()); - copy_v3_v3(p->frame[1], transform_direction(itfm, dbg_point.frame.tangent).data()); - copy_v3_v3(p->frame[2], transform_direction(itfm, dbg_point.frame.cotangent).data()); - } } - Debug::set_collision_contacts(NULL); + HAIR_SolverDebugContact *contact; if (contacts && totcontacts) { - *totcontacts = dbg_contacts.size(); - *contacts = (HAIR_SolverDebugContact *)MEM_mallocN(sizeof(HAIR_SolverDebugContact) * dbg_contacts.size(), "hair solver contact debug data"); - for (int i = 0; i < dbg_contacts.size(); ++i) { - HAIR_SolverDebugContact *c = (*contacts) + i; - copy_v3_v3(c->coA, transform_point(itfm, dbg_contacts[i].coA).data()); - copy_v3_v3(c->coB, transform_point(itfm, dbg_contacts[i].coB).data()); + *totcontacts = 0; + for (int d = 0; d < thread_data_list.size(); ++d) { + const DebugThreadData &data = thread_data_list[d]; + *totcontacts += data.contacts.size(); + } + *contacts = (HAIR_SolverDebugContact *)MEM_mallocN(sizeof(HAIR_SolverDebugContact) * (*totcontacts), "hair solver contact debug data"); + contact = *contacts; + } + else + contact = NULL; + + for (int d = 0; d < thread_data_list.size(); ++d) { + const DebugThreadData &data = thread_data_list[d]; + + if (points && totpoints) { + int tot = solver->data()->totpoints; + for (int i = 0; i < data.points.size(); ++i) { + const DebugPoint &dbg_point = data.points[i]; + if (dbg_point.index < 0 || dbg_point.index >= tot) + continue; + + HAIR_SolverDebugPoint *p = (*points) + dbg_point.index; + copy_v3_v3(p->bend, transform_direction(itfm, dbg_point.bend).data()); + copy_v3_v3(p->frame[0], transform_direction(itfm, dbg_point.frame.normal).data()); + copy_v3_v3(p->frame[1], transform_direction(itfm, dbg_point.frame.tangent).data()); + copy_v3_v3(p->frame[2], transform_direction(itfm, dbg_point.frame.cotangent).data()); + } + } + + if (contacts && totcontacts) { + for (int i = 0; i < data.contacts.size(); ++i, ++contact) { + HAIR_SolverDebugContact *c = contact; + copy_v3_v3(c->coA, transform_point(itfm, data.contacts[i].coA).data()); + copy_v3_v3(c->coB, transform_point(itfm, data.contacts[i].coB).data()); + } } } } diff --git a/source/blender/hair/intern/HAIR_debug.cpp b/source/blender/hair/intern/HAIR_debug.cpp index 5ef391c..a2a5e34 100644 --- a/source/blender/hair/intern/HAIR_debug.cpp +++ b/source/blender/hair/intern/HAIR_debug.cpp @@ -32,9 +32,6 @@ HAIR_NAMESPACE_BEGIN #ifdef HAIR_DEBUG -Debug::CollisionContacts *Debug::m_contacts = NULL; -Debug::Points *Debug::m_points = NULL; - #endif diff --git a/source/blender/hair/intern/HAIR_debug.h b/source/blender/hair/intern/HAIR_debug.h index 21b3f56..e9769e9 100644 --- a/source/blender/hair/intern/HAIR_debug.h +++ b/source/blender/hair/intern/HAIR_debug.h @@ -40,77 +40,61 @@ HAIR_NAMESPACE_BEGIN struct SolverData; -struct Debug { - struct Point { - int index; - - float3 bend; - Frame frame; - }; - - typedef std::vector<Point> Points; +struct DebugPoint { + int index; - struct Contact { - float3 coA, coB; - }; + float3 bend; + Frame frame; +}; + +struct DebugContact { + float3 coA, coB; +}; + +struct DebugThreadData +{ + typedef std::vector<DebugPoint> Points; + typedef std::vector<DebugContact> CollisionContacts; - typedef std::vector<Contact> CollisionContacts; + CollisionContacts contacts; + Points points; +}; + +struct Debug { - static void point(int index, const float3 &bend, const Frame &frame) + static void point(DebugThreadData *data, int index, const float3 &bend, const Frame &frame) { #ifdef HAIR_DEBUG - if (m_points) { - Point p; + if (data) { + DebugPoint p; p.index = index; p.bend = bend; p.frame = frame; - m_points->push_back(p); + data->points.push_back(p); } #else + (void)data; + (void)index; (void)bend; + (void)frame; #endif } - static void set_points(Points *points) - { -#ifdef HAIR_DEBUG - m_points = points; -#else - (void)points; -#endif - } - - static void collision_contact(const float3 &coA, const float3 &coB) + static void collision_contact(DebugThreadData *data, const float3 &coA, const float3 &coB) { #ifdef HAIR_DEBUG - if (m_contacts) { - Contact c; + if (data) { + DebugContact c; c.coA = coA; c.coB = coB; - m_contacts->push_back(c); + data->contacts.push_back(c); } #else + (void)data; (void)coA; (void)coB; #endif } - - static void set_collision_contacts(CollisionContacts *contacts) - { -#ifdef HAIR_DEBUG - m_contacts = contacts; -#else - (void)contacts; -#endif - } - -#ifdef HAIR_DEBUG - -private: - static CollisionContacts *m_contacts; - static Points *m_points; - -#endif }; HAIR_NAMESPACE_END diff --git a/source/blender/hair/intern/HAIR_solver.cpp b/source/blender/hair/intern/HAIR_solver.cpp index d0e85bc..4349480 100644 --- a/source/blender/hair/intern/HAIR_solver.cpp +++ b/source/blender/hair/intern/HAIR_solver.cpp @@ -455,7 +455,7 @@ static void advance_state(SolverData *data) } } -void Solver::step_threaded(float time, float timestep) +void Solver::step_threaded(float time, float timestep, DebugThreadDataVector *debug_thread_data) { typedef std::vector<SolverTaskData> SolverTaskVector; diff --git a/source/blender/hair/intern/HAIR_solver.h b/source/blender/hair/intern/HAIR_solver.h index 1f4c02b..24b7f41 100644 --- a/source/blender/hair/intern/HAIR_solver.h +++ b/source/blender/hair/intern/HAIR_solver.h @@ -43,6 +43,7 @@ struct rbGhostObject; HAIR_NAMESPACE_BEGIN +struct DebugThreadData; struct SolverTaskData; struct SolverData { @@ -147,6 +148,7 @@ struct PointContactInfo { }; typedef std::vector<PointContactInfo> PointContactCache; +typedef std::vector<DebugThreadData> DebugThreadDataVector; class Solver { @@ -167,7 +169,7 @@ public: void do_integration(float time, float timestep, const SolverTaskData &data) const; - void step_threaded(float time, float timestep); + void step_threaded(float time, float timestep, DebugThreadDataVector *debug_thread_data = NULL); private: HairParams m_params; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs