[Bf-blender-cvs] [c8a7cd4] alembic: Store child strand curves alongside the parent strands in dupli object data.

Lukas Tönne noreply at git.blender.org
Thu Apr 9 10:46:17 CEST 2015


Commit: c8a7cd4266c3942bf75baebda9219f3ce8daa9db
Author: Lukas Tönne
Date:   Thu Apr 9 09:57:20 2015 +0200
Branches: alembic
https://developer.blender.org/rBc8a7cd4266c3942bf75baebda9219f3ce8daa9db

Store child strand curves alongside the parent strands in dupli object
data.

Child strands have their own struct type for vertices and curves to
avoid unnecessary overhead (parent curves store a full 3x3 matrix after
all).

Child strands may be constructed from particle pathcaches, or read from
curves data in alembic files.

===================================================================

M	source/blender/blenkernel/BKE_anim.h
M	source/blender/blenkernel/intern/object_dupli.c
M	source/blender/editors/space_view3d/drawstrands.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_intern.h
M	source/blender/makesdna/DNA_object_types.h

===================================================================

diff --git a/source/blender/blenkernel/BKE_anim.h b/source/blender/blenkernel/BKE_anim.h
index a0e41a0..514c031 100644
--- a/source/blender/blenkernel/BKE_anim.h
+++ b/source/blender/blenkernel/BKE_anim.h
@@ -47,6 +47,7 @@ struct DupliObject;
 struct DupliObjectData;
 struct DerivedMesh;
 struct Strands;
+struct StrandsChildren;
 struct DupliCacheIterator;
 struct CacheLibrary;
 
@@ -91,8 +92,11 @@ void BKE_dupli_object_data_init(struct DupliObjectData *data, struct Object *ob)
 void BKE_dupli_object_data_clear(struct DupliObjectData *data);
 void BKE_dupli_object_data_set_mesh(struct DupliObjectData *data, struct DerivedMesh *dm);
 void BKE_dupli_object_data_add_strands(struct DupliObjectData *data, const char *name, struct Strands *strands);
+void BKE_dupli_object_data_add_strands_children(struct DupliObjectData *data, const char *name, struct StrandsChildren *children);
 struct Strands *BKE_dupli_object_data_find_strands(struct DupliObjectData *data, const char *name);
+struct StrandsChildren *BKE_dupli_object_data_find_strands_children(struct DupliObjectData *data, const char *name);
 bool BKE_dupli_object_data_acquire_strands(struct DupliObjectData *data, struct Strands *strands);
+bool BKE_dupli_object_data_acquire_strands_children(struct DupliObjectData *data, struct StrandsChildren *children);
 
 struct DupliCache *BKE_dupli_cache_new(void);
 void BKE_dupli_cache_free(struct DupliCache *dupcache);
diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c
index 103a090..f1d06d6 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -1342,6 +1342,10 @@ static void dupli_cache_calc_boundbox(DupliObjectData *data)
 			BKE_strands_get_minmax(link->strands, min, max, true);
 			has_data = true;
 		}
+		if (link->strands_children) {
+			BKE_strands_children_get_minmax(link->strands_children, min, max);
+			has_data = true;
+		}
 	}
 	
 	if (!has_data) {
@@ -1386,6 +1390,8 @@ void BKE_dupli_object_data_clear(DupliObjectData *data)
 	for (link = data->strands.first; link; link = link->next) {
 		if (link->strands)
 			BKE_strands_free(link->strands);
+		if (link->strands_children)
+			BKE_strands_children_free(link->strands_children);
 	}
 	BLI_freelistN(&data->strands);
 }
@@ -1431,6 +1437,30 @@ void BKE_dupli_object_data_add_strands(DupliObjectData *data, const char *name,
 	dupli_cache_calc_boundbox(data);
 }
 
+void BKE_dupli_object_data_add_strands_children(DupliObjectData *data, const char *name, StrandsChildren *children)
+{
+	DupliObjectDataStrands *link = NULL;
+	for (link = data->strands.first; link; link = link->next) {
+		if (STREQ(link->name, name))
+			break;
+	}
+	
+	if (!link) {
+		link = MEM_callocN(sizeof(DupliObjectDataStrands), "strands link");
+		BLI_strncpy(link->name, name, sizeof(link->name));
+		link->strands_children = children;
+		
+		BLI_addtail(&data->strands, link);
+	}
+	else {
+		if (link->strands_children && link->strands_children != children)
+			BKE_strands_children_free(link->strands_children);
+		link->strands_children = children;
+	}
+	
+	dupli_cache_calc_boundbox(data);
+}
+
 Strands *BKE_dupli_object_data_find_strands(DupliObjectData *data, const char *name)
 {
 	DupliObjectDataStrands *link;
@@ -1441,6 +1471,16 @@ Strands *BKE_dupli_object_data_find_strands(DupliObjectData *data, const char *n
 	return NULL;
 }
 
+StrandsChildren *BKE_dupli_object_data_find_strands_children(DupliObjectData *data, const char *name)
+{
+	DupliObjectDataStrands *link;
+	for (link = data->strands.first; link; link = link->next) {
+		if (STREQ(link->name, name))
+			return link->strands_children;
+	}
+	return NULL;
+}
+
 bool BKE_dupli_object_data_acquire_strands(DupliObjectData *data, Strands *strands)
 {
 	DupliObjectDataStrands *link, *link_next;
@@ -1452,8 +1492,25 @@ bool BKE_dupli_object_data_acquire_strands(DupliObjectData *data, Strands *stran
 	for (link = data->strands.first; link; link = link_next) {
 		link_next = link->next;
 		if (link->strands == strands) {
-			BLI_remlink(&data->strands, link);
-			MEM_freeN(link);
+			link->strands = NULL;
+			found = true;
+		}
+	}
+	return found;
+}
+
+bool BKE_dupli_object_data_acquire_strands_children(DupliObjectData *data, StrandsChildren *children)
+{
+	DupliObjectDataStrands *link, *link_next;
+	bool found = false;
+	
+	if (!data || !children)
+		return false;
+	
+	for (link = data->strands.first; link; link = link_next) {
+		link_next = link->next;
+		if (link->strands_children == children) {
+			link->strands_children = NULL;
 			found = true;
 		}
 	}
diff --git a/source/blender/editors/space_view3d/drawstrands.c b/source/blender/editors/space_view3d/drawstrands.c
index adf6b7a..17850f1 100644
--- a/source/blender/editors/space_view3d/drawstrands.c
+++ b/source/blender/editors/space_view3d/drawstrands.c
@@ -50,14 +50,13 @@
 
 #include "UI_resources.h"
 
-static void draw_strand_lines(Strands *strands, short dflag)
-{
-	const bool has_motion_state = strands->state;
-	
+typedef struct StrandsDrawGLState {
 	GLint polygonmode[2];
-	StrandIterator it_strand;
-	
-	glGetIntegerv(GL_POLYGON_MODE, polygonmode);
+} StrandsDrawGLState;
+
+static void draw_strands_begin(StrandsDrawGLState *state, short dflag)
+{
+	glGetIntegerv(GL_POLYGON_MODE, state->polygonmode);
 	glEnableClientState(GL_VERTEX_ARRAY);
 	
 	/* setup gl flags */
@@ -72,6 +71,32 @@ static void draw_strand_lines(Strands *strands, short dflag)
 	glEnable(GL_LIGHTING);
 //	glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
 //	glEnable(GL_COLOR_MATERIAL);
+}
+
+static void draw_strands_end(StrandsDrawGLState *state)
+{
+	/* restore & clean up */
+//	if (part->draw_col == PART_DRAW_COL_MAT)
+//		glDisableClientState(GL_COLOR_ARRAY);
+	glDisable(GL_LIGHTING);
+	glDisable(GL_COLOR_MATERIAL);
+	
+	glLineWidth(1.0f);
+	
+	glDisableClientState(GL_VERTEX_ARRAY);
+	glDisableClientState(GL_NORMAL_ARRAY);
+	
+	glPolygonMode(GL_FRONT, state->polygonmode[0]);
+	glPolygonMode(GL_BACK, state->polygonmode[1]);
+}
+
+static void draw_strand_lines(Strands *strands, short dflag)
+{
+	const bool has_motion_state = strands->state;
+	StrandsDrawGLState gl_state;
+	StrandIterator it_strand;
+	
+	draw_strands_begin(&gl_state, dflag);
 	
 	for (BKE_strand_iter_init(&it_strand, strands); BKE_strand_iter_valid(&it_strand); BKE_strand_iter_next(&it_strand)) {
 		if (it_strand.tot <= 0)
@@ -94,22 +119,36 @@ static void draw_strand_lines(Strands *strands, short dflag)
 		glDrawArrays(GL_LINE_STRIP, 0, it_strand.curve->numverts);
 	}
 	
-	/* restore & clean up */
-//	if (part->draw_col == PART_DRAW_COL_MAT)
-//		glDisableClientState(GL_COLOR_ARRAY);
-	glDisable(GL_LIGHTING);
-	glDisable(GL_COLOR_MATERIAL);
+	draw_strands_end(&gl_state);
+}
+
+static void draw_strand_child_lines(StrandsChildren *children, short dflag)
+{
+	StrandsDrawGLState gl_state;
+	StrandChildIterator it_strand;
 	
-	glLineWidth(1.0f);
+	draw_strands_begin(&gl_state, dflag);
 	
-	glDisableClientState(GL_VERTEX_ARRAY);
-	glDisableClientState(GL_NORMAL_ARRAY);
+	for (BKE_strand_child_iter_init(&it_strand, children); BKE_strand_child_iter_valid(&it_strand); BKE_strand_child_iter_next(&it_strand)) {
+		if (it_strand.tot <= 0)
+			continue;
+		
+		glVertexPointer(3, GL_FLOAT, sizeof(StrandsChildVertex), it_strand.verts->co);
+		glNormalPointer(GL_FLOAT, sizeof(StrandsChildVertex), it_strand.verts->nor);
+		
+		if ((dflag & DRAW_CONSTCOLOR) == 0) {
+//			if (part->draw_col == PART_DRAW_COL_MAT) {
+//				glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col);
+//			}
+		}
+		
+		glDrawArrays(GL_LINE_STRIP, 0, it_strand.curve->numverts);
+	}
 	
-	glPolygonMode(GL_FRONT, polygonmode[0]);
-	glPolygonMode(GL_BACK, polygonmode[1]);
+	draw_strands_end(&gl_state);
 }
 
-void draw_strands(Scene *UNUSED(scene), View3D *UNUSED(v3d), ARegion *ar, Object *ob, Strands *strands, short dflag)
+void draw_strands(Scene *UNUSED(scene), View3D *UNUSED(v3d), ARegion *ar, Object *ob, Strands *strands, StrandsChildren *children, short dflag)
 {
 	RegionView3D *rv3d = ar->regiondata;
 	float imat[4][4];
@@ -124,7 +163,10 @@ void draw_strands(Scene *UNUSED(scene), View3D *UNUSED(v3d), ARegion *ar, Object
 	glLoadMatrixf(rv3d->viewmat);
 	glMultMatrixf(ob->obmat);
 	
-	draw_strand_lines(strands, dflag);
+	if (children)
+		draw_strand_child_lines(children, dflag);
+	else
+		draw_strand_lines(strands, dflag);
 	
 	glPopMatrix();
 	
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 75556db..d00f72f 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2019,8 +2019,9 @@ static void draw_dupli_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base
 		
 		for (link = dob_data->strands.first; link; link = link->next) {
 			struct Strands *strands = link->strands;
+			struct StrandsChildren *children = link->strands_children;
 			
-			draw_strands(scene, v3d, ar, base->object, strands, dflag);
+			draw_strands(scene, v3d, ar, base->object, strands, children, dflag);
 		}
 	}
 }
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index 13c75cb..618f063 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -47,6 +47,7 @@ struct bMotionPath;
 struct bPoseChannel;
 struct Mesh;
 struct Strands;
+struct StrandsChildren;
 struct wmNDOFMotionData;
 struct wmOperatorType;
 struct wmWindowManager;
@@ -181,7 +182,7 @@ void draw_mesh_paint(View3D *v3d, RegionView3D *rv3d,
 void draw_sim_debug_data(Scene *scene, View3D *v3d, ARegion *ar);
 
 /* drawstrands.c */
-void draw_strands(Scene *scene, View3D *v3d, ARegion *ar, struct Object *ob, struct Strands *strands, short dflag);
+void draw_strands(Scene *scene, View3D *v3d, ARegion *ar, struct Object *ob, struct Strands *strands, struct StrandsChildren *children, short dflag);
 
 /* view3d_draw.c */
 void view3d_main_area_draw(const struct bContext *C, struct ARegion *ar);
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 3

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list