[Bf-blender-cvs] [3113007] particles_refactor: Boilerplate RNA for the particle display settings.
Lukas Tönne
noreply at git.blender.org
Tue Apr 22 12:07:01 CEST 2014
Commit: 31130076827042447848a0ec8086d22c42c0fbc0
Author: Lukas Tönne
Date: Fri Jan 3 13:48:53 2014 +0100
https://developer.blender.org/rB31130076827042447848a0ec8086d22c42c0fbc0
Boilerplate RNA for the particle display settings.
===================================================================
M source/blender/blenkernel/BKE_nparticle.h
M source/blender/blenkernel/intern/nparticle.c
M source/blender/makesdna/DNA_nparticle_types.h
M source/blender/makesrna/intern/rna_nparticle.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_nparticle.h b/source/blender/blenkernel/BKE_nparticle.h
index 701d623..eaa2f7b 100644
--- a/source/blender/blenkernel/BKE_nparticle.h
+++ b/source/blender/blenkernel/BKE_nparticle.h
@@ -38,6 +38,7 @@ struct NParticleAttribute;
struct NParticleState;
struct NParticleAttributeState;
struct NParticleDisplay;
+struct NParticleDisplayDupliObject;
/* XXX where to put this? */
typedef uint32_t NParticleID;
@@ -122,4 +123,9 @@ void BKE_nparticle_display_free(struct NParticleSystem *psys, struct NParticleDi
/* update object transflag for nparticle duplis */
void BKE_nparticle_update_object_dupli_flags(struct Object *ob, struct NParticleSystem *psys);
+struct NParticleDisplayDupliObject *BKE_nparticle_display_dupli_object_add(struct NParticleDisplay *display);
+void BKE_nparticle_display_dupli_object_remove(struct NParticleDisplay *display, struct NParticleDisplayDupliObject *dupli_object);
+void BKE_nparticle_display_dupli_object_remove_all(struct NParticleDisplay *display);
+void BKE_nparticle_display_dupli_object_move(struct NParticleDisplay *display, int from_index, int to_index);
+
#endif /* BKE_NPARTICLE_H */
diff --git a/source/blender/blenkernel/intern/nparticle.c b/source/blender/blenkernel/intern/nparticle.c
index 5e0ca92..c675336 100644
--- a/source/blender/blenkernel/intern/nparticle.c
+++ b/source/blender/blenkernel/intern/nparticle.c
@@ -649,3 +649,64 @@ void BKE_nparticle_update_object_dupli_flags(Object *ob, NParticleSystem *psys)
ob->transflag |= OB_DUPLI_NPARTICLE;
}
}
+
+NParticleDisplayDupliObject *BKE_nparticle_display_dupli_object_add(NParticleDisplay *display)
+{
+ NParticleDisplayDupliObject *dob;
+
+ BLI_assert(display->type == PAR_DISPLAY_DUPLI);
+
+ dob = MEM_callocN(sizeof(NParticleDisplayDupliObject), "particle dupli object");
+ BLI_addtail(&display->dupli_objects, dob);
+ return dob;
+}
+
+void BKE_nparticle_display_dupli_object_remove(NParticleDisplay *display, NParticleDisplayDupliObject *dupli_object)
+{
+ BLI_assert(display->type == PAR_DISPLAY_DUPLI);
+
+ BLI_remlink(&display->dupli_objects, dupli_object);
+ MEM_freeN(dupli_object);
+}
+
+void BKE_nparticle_display_dupli_object_remove_all(NParticleDisplay *display)
+{
+ NParticleDisplayDupliObject *dob, *dob_next;
+
+ BLI_assert(display->type == PAR_DISPLAY_DUPLI);
+
+ for (dob = display->dupli_objects.first; dob; dob = dob_next) {
+ dob_next = dob->next;
+
+ MEM_freeN(dob);
+ }
+ display->dupli_objects.first = display->dupli_objects.last = NULL;
+}
+
+void BKE_nparticle_display_dupli_object_move(NParticleDisplay *display, int from_index, int to_index)
+{
+ NParticleDisplayDupliObject *dob;
+
+ BLI_assert(display->type == PAR_DISPLAY_DUPLI);
+
+ if (from_index == to_index)
+ return;
+ if (from_index < 0 || to_index < 0)
+ return;
+
+ dob = BLI_findlink(&display->dupli_objects, from_index);
+ if (to_index < from_index) {
+ NParticleDisplayDupliObject *nextdob = BLI_findlink(&display->dupli_objects, to_index);
+ if (nextdob) {
+ BLI_remlink(&display->dupli_objects, dob);
+ BLI_insertlinkbefore(&display->dupli_objects, nextdob, dob);
+ }
+ }
+ else {
+ NParticleDisplayDupliObject *prevdob = BLI_findlink(&display->dupli_objects, to_index);
+ if (prevdob) {
+ BLI_remlink(&display->dupli_objects, dob);
+ BLI_insertlinkafter(&display->dupli_objects, prevdob, dob);
+ }
+ }
+}
diff --git a/source/blender/makesdna/DNA_nparticle_types.h b/source/blender/makesdna/DNA_nparticle_types.h
index 2055285..7ec3c28 100644
--- a/source/blender/makesdna/DNA_nparticle_types.h
+++ b/source/blender/makesdna/DNA_nparticle_types.h
@@ -111,9 +111,11 @@ typedef struct NParticleDisplay {
ListBase dupli_objects;
} NParticleDisplay;
-typedef struct NParticleDisplayDupli {
- struct Object *ob;
-} NParticleDisplayDupli;
+typedef struct NParticleDisplayDupliObject {
+ struct NParticleDisplayDupliObject *next, *prev;
+
+ struct Object *object;
+} NParticleDisplayDupliObject;
typedef enum eParticleDisplayType {
PAR_DISPLAY_PARTICLE = 1,
diff --git a/source/blender/makesrna/intern/rna_nparticle.c b/source/blender/makesrna/intern/rna_nparticle.c
index d2ffea6..64ad5f4 100644
--- a/source/blender/makesrna/intern/rna_nparticle.c
+++ b/source/blender/makesrna/intern/rna_nparticle.c
@@ -32,6 +32,13 @@
#include "rna_internal.h"
+static EnumPropertyItem nparticle_display_type_items[] = {
+ {PAR_DISPLAY_PARTICLE, "PARTICLE", ICON_NONE, "Particles", "Display particle symbols"},
+ {PAR_DISPLAY_DUPLI, "DUPLI", ICON_NONE, "Duplis", "Create object dupli instances from particles"},
+ {0, NULL, 0, NULL, NULL}
+};
+
+
#ifdef RNA_RUNTIME
#include "MEM_guardedalloc.h"
@@ -118,7 +125,7 @@ int rna_NParticleAttributeState_data_lookup_int(PointerRNA *ptr, int key, Pointe
return data != NULL;
}
-int rna_NParticleAttributeState_data_assign_int(PointerRNA *ptr, int key, const PointerRNA *assign_ptr, StructRNA *data_srna)
+int rna_NParticleAttributeState_data_assign_int(PointerRNA *ptr, int key, const PointerRNA *assign_ptr, StructRNA *UNUSED(data_srna))
{
NParticleAttributeState *state = ptr->data;
void *data = BLI_pbuf_get(&state->data, key);
@@ -365,6 +372,37 @@ static void rna_NParticleSystem_attributes_move(NParticleSystem *psys, int from_
BKE_nparticle_attribute_move(psys, from_index, to_index);
}
+static StructRNA *rna_NParticleDisplay_refine(PointerRNA *ptr)
+{
+ NParticleDisplay *display = ptr->data;
+
+ switch (display->type) {
+ case PAR_DISPLAY_PARTICLE: return &RNA_NParticleDisplayParticle;
+ case PAR_DISPLAY_DUPLI: return &RNA_NParticleDisplayDupli;
+ default: return &RNA_NParticleDisplay;
+ }
+}
+
+static NParticleDisplayDupliObject *rna_NParticleDisplayDupli_dupli_objects_new(NParticleDisplay *display)
+{
+ return BKE_nparticle_display_dupli_object_add(display);
+}
+
+static void rna_NParticleDisplayDupli_dupli_objects_remove(NParticleDisplay *display, NParticleDisplayDupliObject *dupli_object)
+{
+ BKE_nparticle_display_dupli_object_remove(display, dupli_object);
+}
+
+static void rna_NParticleDisplayDupli_dupli_objects_clear(NParticleDisplay *display)
+{
+ BKE_nparticle_display_dupli_object_remove_all(display);
+}
+
+static void rna_NParticleDisplayDupli_dupli_objects_move(NParticleDisplay *display, int from_index, int to_index)
+{
+ BKE_nparticle_display_dupli_object_move(display, from_index, to_index);
+}
+
#else
EnumPropertyItem nparticle_attribute_datatype_all[] = {
@@ -574,7 +612,6 @@ static void rna_def_nparticle_attribute_state(BlenderRNA *brna)
static void rna_def_nparticle_iterator(BlenderRNA *brna)
{
StructRNA *srna;
- PropertyRNA *prop;
srna = RNA_def_struct(brna, "NParticleIterator", NULL);
RNA_def_struct_ui_text(srna, "Particle Iterator", "Access iterator for individual particles");
@@ -679,6 +716,86 @@ static void rna_def_nparticle_system_attributes_api(BlenderRNA *brna, PropertyRN
RNA_def_property_flag(parm, PROP_REQUIRED);
}
+static void rna_def_nparticle_display_dupli_object(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "NParticleDisplayDupliObject", NULL);
+ RNA_def_struct_ui_text(srna, "Particle Display Dupli Object", "Object dupli settings");
+
+ prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "object");
+ RNA_def_property_struct_type(prop, "Object");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Object", "Object to use for dupli instances");
+}
+
+static void rna_def_nparticle_display_dupli_objects_api(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, "NParticleDisplayDupliObjects");
+ srna = RNA_def_struct(brna, "NParticleDisplayDupliObjects", NULL);
+ RNA_def_struct_sdna(srna, "NParticleDisplay");
+ RNA_def_struct_ui_text(srna, "Dupli Objects", "Collection of dupli objects in a particle system");
+
+ func = RNA_def_function(srna, "new", "rna_NParticleDisplayDupli_dupli_objects_new");
+ RNA_def_function_ui_description(func, "Add a particle dupli object");
+ /* return value */
+ parm = RNA_def_pointer(func, "dupli_object", "NParticleDisplayDupliObject", "Dupli Object", "");
+ RNA_def_function_return(func, parm);
+
+ func = RNA_def_function(srna, "remove", "rna_NParticleDisplayDupli_dupli_objects_remove");
+ RNA_def_function_ui_description(func, "Remove an particle dupli object");
+ parm = RNA_def_pointer(func, "dupli_object", "NParticleDisplayDupliObject", "", "The dupli object to remove");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ func = RNA_def_function(srna, "clear", "rna_NParticleDisplayDupli_dupli_objects_clear");
+ RNA_def_function_ui_description(func, "Remove all particle dupli objects");
+
+ func = RNA_def_function(srna, "move", "rna_NParticleDisplayDupli_dupli_objects_move");
+ RNA_def_function_ui_description(func, "Move a particle dupli object to another index");
+ parm = RNA_def_int(func, "from_index", -1, 0, INT_MAX, "From Index", "Index of the attribute to move", 0, 10000);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm = RNA_def_int(func, "to_index", -1, 0, INT_MAX, "To Index", "Target index for the attribute", 0, 10000);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+}
+
+static void rna_def_nparticle_display(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "NParticleDisplay", NULL);
+ RNA_def_struct_sdna(srna, "NParticleDisplay");
+ RNA_def_struct_ui_text(srna, "Particle Display", "Display mode for particles");
+ RNA_def_struct_refine_func(srna, "rna_NParticleDisplay_refine");
+
+ prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, nparticle_display_type_items);
+ RNA_def_property_ui_text(prop, "Type", "");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+
+ srna = RNA_def_struct(brna, "NParticleDisplayParticle", "NParticleDisplay");
+ RNA_def_struct_sdna(srna, "NParticleDisplay");
+ RNA_def_struct_ui_text(srna, "Particle Symbol Display", "Displays particle symbols");
+
+
+ srna = RNA_def_struct(brna, "NParticleDisplayDupli", "NParticleDisplay");
+ RNA_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list