[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