[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