[Bf-blender-cvs] [542bbf32820] hair_guides_grooming: Finish bounding box functions for groom objects.
Lukas Tönne
noreply at git.blender.org
Sun May 27 08:43:17 CEST 2018
Commit: 542bbf32820d8d431a7566c2117a6da66fae382f
Author: Lukas Tönne
Date: Sun May 27 07:24:12 2018 +0100
Branches: hair_guides_grooming
https://developer.blender.org/rB542bbf32820d8d431a7566c2117a6da66fae382f
Finish bounding box functions for groom objects.
===================================================================
M source/blender/blenkernel/BKE_groom.h
M source/blender/blenkernel/intern/groom.c
M source/blender/blenkernel/intern/object.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_groom.h b/source/blender/blenkernel/BKE_groom.h
index a86d458e60b..70c6628d7ad 100644
--- a/source/blender/blenkernel/BKE_groom.h
+++ b/source/blender/blenkernel/BKE_groom.h
@@ -32,6 +32,7 @@
* \ingroup bke
*/
+struct BoundBox;
struct Depsgraph;
struct Groom;
struct GroomBundle;
@@ -52,7 +53,8 @@ struct Groom *BKE_groom_copy(struct Main *bmain, const struct Groom *groom);
void BKE_groom_make_local(struct Main *bmain, struct Groom *groom, const bool lib_local);
bool BKE_groom_minmax(struct Groom *groom, float min[3], float max[3]);
-void BKE_groom_boundbox_calc(struct Groom *groom, float r_loc[3], float r_size[3]);
+void BKE_groom_boundbox_calc(struct Groom *groom);
+struct BoundBox *BKE_groom_boundbox_get(struct Object *ob);
/* === Curve cache === */
diff --git a/source/blender/blenkernel/intern/groom.c b/source/blender/blenkernel/intern/groom.c
index 63ba4a2a9f6..c6bc3c53b4d 100644
--- a/source/blender/blenkernel/intern/groom.c
+++ b/source/blender/blenkernel/intern/groom.c
@@ -228,26 +228,44 @@ void BKE_groom_make_local(Main *bmain, Groom *groom, const bool lib_local)
bool BKE_groom_minmax(Groom *groom, float min[3], float max[3])
{
- // TODO
- UNUSED_VARS(groom, min, max);
- return true;
+ bool result = false;
+ for (GroomBundle *bundle = groom->bundles.first; bundle; bundle = bundle->next)
+ {
+ if (bundle->curvecache)
+ {
+ const int totcurvecache = (bundle->numshapeverts + 1) * bundle->curvesize;
+ GroomCurveCache *cc = bundle->curvecache;
+ for (int i = 0; i < totcurvecache; ++i, ++cc)
+ {
+ minmax_v3v3_v3(min, max, cc->co);
+ }
+
+ result = true;
+ }
+ }
+ return result;
}
-void BKE_groom_boundbox_calc(Groom *groom, float r_loc[3], float r_size[3])
+BoundBox *BKE_groom_boundbox_get(Object *ob)
{
- if (groom->bb == NULL)
- {
- groom->bb = MEM_callocN(sizeof(BoundBox), "boundbox");
- }
+ BLI_assert(ob->type == OB_GROOM);
+ Groom *groom = ob->data;
- float mloc[3], msize[3];
- if (!r_loc)
- {
- r_loc = mloc;
+ if (ob->bb)
+ return ob->bb;
+
+ if (groom->bb == NULL || (groom->bb->flag & BOUNDBOX_DIRTY)) {
+ BKE_groom_boundbox_calc(groom);
}
- if (!r_size)
+
+ return groom->bb;
+}
+
+void BKE_groom_boundbox_calc(Groom *groom)
+{
+ if (groom->bb == NULL)
{
- r_size = msize;
+ groom->bb = MEM_callocN(sizeof(BoundBox), "boundbox");
}
float min[3], max[3];
@@ -257,12 +275,6 @@ void BKE_groom_boundbox_calc(Groom *groom, float r_loc[3], float r_size[3])
max[0] = max[1] = max[2] = 1.0f;
}
- mid_v3_v3v3(r_loc, min, max);
-
- r_size[0] = (max[0] - min[0]) / 2.0f;
- r_size[1] = (max[1] - min[1]) / 2.0f;
- r_size[2] = (max[2] - min[2]) / 2.0f;
-
BKE_boundbox_init_from_minmax(groom->bb, min, max);
groom->bb->flag &= ~BOUNDBOX_DIRTY;
}
@@ -993,7 +1005,7 @@ void BKE_groom_eval_geometry(struct Depsgraph *UNUSED(depsgraph), Groom *groom)
BKE_groom_hair_update_guide_curves(groom);
if (groom->bb == NULL || (groom->bb->flag & BOUNDBOX_DIRTY)) {
- BKE_groom_boundbox_calc(groom, NULL, NULL);
+ BKE_groom_boundbox_calc(groom);
}
}
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 65eb85114b4..861ea6f8d17 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -2313,6 +2313,9 @@ BoundBox *BKE_object_boundbox_get(Object *ob)
else if (ob->type == OB_ARMATURE) {
bb = BKE_armature_boundbox_get(ob);
}
+ else if (ob->type == OB_GROOM) {
+ bb = BKE_groom_boundbox_get(ob);
+ }
return bb;
}
More information about the Bf-blender-cvs
mailing list