[Bf-blender-cvs] [54fe3f0] particles_refactor: Basic dupli display for particles.

Lukas Tönne noreply at git.blender.org
Tue Apr 22 12:07:04 CEST 2014


Commit: 54fe3f0285a40d72cc305015a1a6e17963d287bb
Author: Lukas Tönne
Date:   Fri Jan 3 16:54:53 2014 +0100
https://developer.blender.org/rB54fe3f0285a40d72cc305015a1a6e17963d287bb

Basic dupli display for particles.

Conflicts:
	source/blender/blenkernel/intern/anim.c

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

M	source/blender/blenkernel/BKE_nparticle.h
M	source/blender/blenkernel/intern/nparticle.c
M	source/blender/blenkernel/intern/object_dupli.c
M	source/blender/makesdna/DNA_nparticle_types.h

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

diff --git a/source/blender/blenkernel/BKE_nparticle.h b/source/blender/blenkernel/BKE_nparticle.h
index eaa2f7b..45d17db 100644
--- a/source/blender/blenkernel/BKE_nparticle.h
+++ b/source/blender/blenkernel/BKE_nparticle.h
@@ -107,6 +107,8 @@ float BKE_nparticle_iter_get_float(struct NParticleIterator *it, const char *att
 void BKE_nparticle_iter_set_float(struct NParticleIterator *it, const char *attr, float value);
 void BKE_nparticle_iter_get_vector(struct NParticleIterator *it, const char *attr, float *result);
 void BKE_nparticle_iter_set_vector(struct NParticleIterator *it, const char *attr, const float *value);
+void BKE_nparticle_iter_get_quaternion(struct NParticleIterator *it, const char *attr, float *result);
+void BKE_nparticle_iter_set_quaternion(struct NParticleIterator *it, const char *attr, const float *value);
 void *BKE_nparticle_iter_get_pointer(struct NParticleIterator *it, const char *attr);
 void BKE_nparticle_iter_set_pointer(struct NParticleIterator *it, const char *attr, void *value);
 
diff --git a/source/blender/blenkernel/intern/nparticle.c b/source/blender/blenkernel/intern/nparticle.c
index 4917af9..dd49350 100644
--- a/source/blender/blenkernel/intern/nparticle.c
+++ b/source/blender/blenkernel/intern/nparticle.c
@@ -56,6 +56,7 @@ const char *BKE_nparticle_datatype_name(int datatype)
 		case PAR_ATTR_DATATYPE_VECTOR: return "vector";
 		case PAR_ATTR_DATATYPE_POINT: return "point";
 		case PAR_ATTR_DATATYPE_NORMAL: return "normal";
+		case PAR_ATTR_DATATYPE_QUATERNION: return "quaternion";
 		case PAR_ATTR_DATATYPE_COLOR: return "color";
 		case PAR_ATTR_DATATYPE_MATRIX: return "matrix";
 		case PAR_ATTR_DATATYPE_POINTER: return "pointer";
@@ -73,6 +74,7 @@ static size_t nparticle_elem_bytes(int datatype)
 		case PAR_ATTR_DATATYPE_POINT:
 		case PAR_ATTR_DATATYPE_NORMAL:
 			return sizeof(float)*3;
+		case PAR_ATTR_DATATYPE_QUATERNION: return sizeof(float)*4;
 		case PAR_ATTR_DATATYPE_COLOR: return sizeof(float)*4;
 		case PAR_ATTR_DATATYPE_MATRIX: return sizeof(float)*16;
 		case PAR_ATTR_DATATYPE_POINTER: return sizeof(void*);
@@ -594,6 +596,24 @@ void BKE_nparticle_iter_set_vector(NParticleIterator *it, const char *attr, cons
 		copy_v3_v3(data, value);
 }
 
+void BKE_nparticle_iter_get_quaternion(NParticleIterator *it, const char *attr, float *result)
+{
+	float *data = nparticle_data_ptr(it->state, attr, it->index);
+	BLI_assert(nparticle_check_attribute_type(it->state, attr, PAR_ATTR_DATATYPE_QUATERNION));
+	if (data)
+		copy_qt_qt(result, data);
+	else
+		unit_qt(result);
+}
+
+void BKE_nparticle_iter_set_quaternion(NParticleIterator *it, const char *attr, const float *value)
+{
+	float *data = nparticle_data_ptr(it->state, attr, it->index);
+	BLI_assert(nparticle_check_attribute_type(it->state, attr, PAR_ATTR_DATATYPE_QUATERNION));
+	if (data)
+		copy_qt_qt(data, value);
+}
+
 void *BKE_nparticle_iter_get_pointer(NParticleIterator *it, const char *attr)
 {
 	void **data = nparticle_data_ptr(it->state, attr, it->index);
diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c
index b3726eb..8826cbd 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -44,6 +44,9 @@
 #include "DNA_anim_types.h"
 #include "DNA_group_types.h"
 #include "DNA_mesh_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_nparticle_types.h"
+#include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_vfont_types.h"
 
@@ -56,6 +59,7 @@
 #include "BKE_lattice.h"
 #include "BKE_main.h"
 #include "BKE_mesh.h"
+#include "BKE_nparticle.h"
 #include "BKE_object.h"
 #include "BKE_particle.h"
 #include "BKE_scene.h"
@@ -1139,6 +1143,69 @@ const DupliGenerator gen_dupli_particles = {
 
 /* ------------- */
 
+/* OB_DUPLIPARTS */
+static void make_duplis_nparticle_system(const DupliContext *ctx, NParticleSystem *psys, NParticleDisplay *display)
+{
+	NParticleIterator iter;
+	NParticleDisplayDupliObject *dupli, *dob;
+	int totdupli, i;
+	float loc[3], rot[4], scale[3], obmat[4][4];
+	
+	/* simple preventing of too deep nested groups */
+	if (level > MAX_DUPLI_RECUR) return;
+	
+	/* for faster index-based lookup make a temp array */
+	totdupli = BLI_countlist(&display->dupli_objects);
+	dupli = MEM_mallocN(totdupli * sizeof(NParticleDisplayDupliObject), "dupli objects");
+	for (dob = display->dupli_objects.first, i = 0; dob; dob = dob->next, ++i)
+		memcpy(&dupli[i], dob, sizeof(NParticleDisplayDupliObject));
+	
+	scale[0] = scale[1] = scale[2] = 1.0f;
+	
+	for (BKE_nparticle_iter_init(psys->state, &iter); BKE_nparticle_iter_valid(&iter); BKE_nparticle_iter_next(&iter)) {
+		i = BKE_nparticle_iter_get_int(&iter, "dupli");
+		if (i < 0 || i >= totdupli || dupli[i].object==NULL)
+			continue;
+		
+		BKE_nparticle_iter_get_vector(&iter, "position", loc);
+		BKE_nparticle_iter_get_quaternion(&iter, "rotation", rot);
+		loc_quat_size_to_mat4(obmat, loc, rot, scale);
+		
+		make_dupli(ctx, dupli[i].object, obmat, BKE_nparticle_iter_get_id(&iter), false, false);
+	}
+	
+	MEM_freeN(dupli);
+}
+
+static void make_duplis_nparticles(const DupliContext *ctx)
+{
+	ModifierData *md;
+	int pmd_index = 0;	/* XXX not really a persistent index, but modifier is only stop-gap design anyway */
+	for (md = ctx->object->modifiers.first; md; md = md->next) {
+		if (md->type == eModifierType_NParticleSystem) {
+			NParticleSystemModifierData *pmd = (NParticleSystemModifierData *)md;
+			NParticleDisplay *display;
+			/* particles create one more level for persistent psys index */
+			DupliContext pctx;
+			copy_dupli_context(&pctx, ctx, ctx->object, NULL, pmd_index, false);
+			
+			for (display = pmd->psys->display.first; display; display = display->next) {
+				if (display->type == PAR_DISPLAY_DUPLI)
+					make_duplis_nparticle_system(&pctx, pmd->psys, display);
+			}
+			
+			++pmd_index;
+		}
+	}
+}
+
+const DupliGenerator gen_dupli_nparticles = {
+    OB_DUPLI_NPARTICLE,             /* type */
+    make_duplis_nparticles          /* make_duplis */
+};
+
+/* ------------- */
+
 /* select dupli generator from given context */
 static const DupliGenerator *get_dupli_generator(const DupliContext *ctx)
 {
@@ -1155,6 +1222,9 @@ static const DupliGenerator *get_dupli_generator(const DupliContext *ctx)
 	if (transflag & OB_DUPLIPARTS) {
 		return &gen_dupli_particles;
 	}
+	else if (transflag & OB_DUPLI_NPARTICLE) {
+		return &gen_dupli_nparticles;
+	}
 	else if (transflag & OB_DUPLIVERTS) {
 		if (ctx->object->type == OB_MESH) {
 			return &gen_dupli_verts;
diff --git a/source/blender/makesdna/DNA_nparticle_types.h b/source/blender/makesdna/DNA_nparticle_types.h
index 7ec3c28..a980d6e 100644
--- a/source/blender/makesdna/DNA_nparticle_types.h
+++ b/source/blender/makesdna/DNA_nparticle_types.h
@@ -54,9 +54,10 @@ typedef enum eParticleAttributeDataType {
 	PAR_ATTR_DATATYPE_VECTOR		= 4,
 	PAR_ATTR_DATATYPE_POINT			= 5,
 	PAR_ATTR_DATATYPE_NORMAL		= 6,
-	PAR_ATTR_DATATYPE_COLOR			= 7,
-	PAR_ATTR_DATATYPE_MATRIX		= 8,
-	PAR_ATTR_DATATYPE_POINTER		= 9
+	PAR_ATTR_DATATYPE_QUATERNION	= 7,
+	PAR_ATTR_DATATYPE_COLOR			= 8,
+	PAR_ATTR_DATATYPE_MATRIX		= 9,
+	PAR_ATTR_DATATYPE_POINTER		= 10
 } eParticleAttributeDataType;
 
 typedef struct NParticleAttributeState {




More information about the Bf-blender-cvs mailing list