+1 for an option of mass-creating objects. I have ported a script for 2.4x to 2.5x that creates thousands of objects and it's waaaay slower now.
It would be nice if scene.objects.link() accepts a list of objects and then updates the depgraph at the end. DiThi On Wed, Jan 5, 2011 at 3:45 AM, Campbell Barton <[email protected]> wrote: > This would be useful short term but not a good precedent for other > operators IMHO. > If your making multiple duplicates through python, would an operator > option to duplicate many times help?, then the update would only be > once at the end. > > I'd prefer not to allow this, since its a workaround and seems > arbitrary to add these kinds of options as users find certain > operators slow. > > Id rather have a testcase showing slow duplication, then profile this > and see whats taking time. > While this probably isn't a quick fix, there are places where > OB_RECALC_TIME & OB_RECALC_DATA are used in blender were I'm fairly > sure they don't need to be. > > - Campbell > > On Mon, Jan 3, 2011 at 11:53 AM, Dalai Felinto <[email protected]> wrote: >> Hi Campbell, nice function. >> >> Could the OBJECT_OT_duplicate operator have a (HIDDEN) option to skip >> depsgraph now? A long ago you told me that this would be a bit hacky >> (API-wise, not codewise) but maybe could be pushed into Blender. >> Now (? not sure since when) that we can force depsgraph sorting and flushing >> through python it seems more compatible with the current API design. >> >> Thanks, >> Dalai >> [the question is more API-design wise than implementation-wise (which should >> be trivial)] >> >> www.dalaifelinto.com >> >> 2011/1/3 Campbell Barton <[email protected]> >> >>> Revision: 34029 >>> >>> http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=34029 >>> Author: campbellbarton >>> Date: 2011-01-03 10:09:30 +0100 (Mon, 03 Jan 2011) >>> >>> Log Message: >>> ----------- >>> rna/api >>> move Object.update(...) to ID.update(). since depsgraph update function can >>> now be called on ID types. >>> >>> also changed how update flags work. >>> >>> obj.update(scene, 1, 1, 1) >>> ... is now >>> obj.update({'OBJECT', 'DATA', 'TIME'}) >>> >>> Don't pass scene anymore. This was used for recalculating text but I think >>> this is better dont in a different function. >>> >>> Modified Paths: >>> -------------- >>> trunk/blender/release/scripts/op/io_scene_fbx/export_fbx.py >>> trunk/blender/source/blender/blenkernel/intern/depsgraph.c >>> trunk/blender/source/blender/makesrna/intern/rna_ID.c >>> trunk/blender/source/blender/makesrna/intern/rna_object_api.c >>> >>> Modified: trunk/blender/release/scripts/op/io_scene_fbx/export_fbx.py >>> =================================================================== >>> --- trunk/blender/release/scripts/op/io_scene_fbx/export_fbx.py 2011-01-03 >>> 08:28:22 UTC (rev 34028) >>> +++ trunk/blender/release/scripts/op/io_scene_fbx/export_fbx.py 2011-01-03 >>> 09:09:30 UTC (rev 34029) >>> @@ -1907,7 +1907,7 @@ >>> if ob_arms_orig_rest: >>> for ob_base in bpy.data.objects: >>> if ob_base.type == 'ARMATURE': >>> - ob_base.update(scene) >>> + ob_base.update() >>> >>> # This causes the makeDisplayList command to effect the mesh >>> scene.frame_set(scene.frame_current) >>> @@ -2055,7 +2055,7 @@ >>> if ob_arms_orig_rest: >>> for ob_base in bpy.data.objects: >>> if ob_base.type == 'ARMATURE': >>> - ob_base.update(scene) >>> + ob_base.update() >>> # This causes the makeDisplayList command to effect the mesh >>> scene.frame_set(scene.frame_current) >>> >>> >>> Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c >>> =================================================================== >>> --- trunk/blender/source/blender/blenkernel/intern/depsgraph.c 2011-01-03 >>> 08:28:22 UTC (rev 34028) >>> +++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c 2011-01-03 >>> 09:09:30 UTC (rev 34029) >>> @@ -2463,6 +2463,9 @@ >>> } >>> } >>> } >>> + else { >>> + BKE_assert(!"invalid flag for this 'idtype'"); >>> + } >>> } >>> } >>> >>> >>> Modified: trunk/blender/source/blender/makesrna/intern/rna_ID.c >>> =================================================================== >>> --- trunk/blender/source/blender/makesrna/intern/rna_ID.c 2011-01-03 >>> 08:28:22 UTC (rev 34028) >>> +++ trunk/blender/source/blender/makesrna/intern/rna_ID.c 2011-01-03 >>> 09:09:30 UTC (rev 34029) >>> @@ -30,6 +30,7 @@ >>> >>> #include "DNA_ID.h" >>> #include "DNA_vfont_types.h" >>> +#include "DNA_object_types.h" >>> >>> #include "WM_types.h" >>> >>> @@ -73,6 +74,7 @@ >>> #include "BKE_library.h" >>> #include "BKE_animsys.h" >>> #include "BKE_material.h" >>> +#include "BKE_depsgraph.h" >>> >>> /* name functions that ignore the first two ID characters */ >>> void rna_ID_name_get(PointerRNA *ptr, char *value) >>> @@ -248,6 +250,43 @@ >>> return NULL; >>> } >>> >>> +static void rna_ID_update(ID *id, ReportList *reports, int flag) >>> +{ >>> + /* XXX, new function for this! */ >>> + /*if (ob->type == OB_FONT) { >>> + Curve *cu = ob->data; >>> + freedisplist(&cu->disp); >>> + BKE_text_to_curve(sce, ob, CU_LEFT); >>> + }*/ >>> + >>> + if(flag == 0) { >>> + /* pass */ >>> + } >>> + else { >>> + /* ensure flag us correct for the type */ >>> + switch(GS(id->name)) { >>> + case ID_OB: >>> + if(flag & ~(OB_RECALC_ALL)) { >>> + BKE_report(reports, RPT_ERROR, "'refresh' >>> incompatible with Object ID type"); >>> + return; >>> + } >>> + break; >>> + /* Could add particle updates later */ >>> +/* case ID_PA: >>> + if(flag & ~(OB_RECALC_ALL|PSYS_RECALC)) { >>> + BKE_report(reports, RPT_ERROR, "'refresh' >>> incompatible with ParticleSettings ID type"); >>> + return; >>> + } >>> + break; */ >>> + default: >>> + BKE_report(reports, RPT_ERROR, "This ID type is not >>> compatible with any 'refresh' options"); >>> + return; >>> + } >>> + } >>> + >>> + DAG_id_tag_update(id, flag); >>> +} >>> + >>> void rna_ID_user_clear(ID *id) >>> { >>> id->us= 0; /* dont save */ >>> @@ -382,6 +421,12 @@ >>> FunctionRNA *func; >>> PropertyRNA *prop, *parm; >>> >>> + static EnumPropertyItem update_flag_items[] = { >>> + {OB_RECALC_OB, "OBJECT", 0, "Object", ""}, >>> + {OB_RECALC_DATA, "DATA", 0, "Data", ""}, >>> + {OB_RECALC_TIME, "TIME", 0, "Time", ""}, >>> + {0, NULL, 0, NULL, NULL}}; >>> + >>> srna= RNA_def_struct(brna, "ID", NULL); >>> RNA_def_struct_ui_text(srna, "ID", "Base type for datablocks, >>> defining a unique name, linking from other libraries and garbage >>> collection"); >>> RNA_def_struct_flag(srna, STRUCT_ID|STRUCT_ID_REFCOUNT); >>> @@ -433,6 +478,11 @@ >>> func= RNA_def_function(srna, "animation_data_clear", >>> "BKE_free_animdata"); >>> RNA_def_function_ui_description(func, "Clear animation on this this >>> ID."); >>> >>> + func= RNA_def_function(srna, "update", "rna_ID_update"); >>> + RNA_def_function_flag(func, FUNC_USE_REPORTS); >>> + RNA_def_function_ui_description(func, "Tag the id to update its >>> display data."); >>> + parm= RNA_def_enum(func, "refresh", update_flag_items, 0, "", "Type >>> of updates to perform."); >>> + RNA_def_property_flag(parm, PROP_ENUM_FLAG); >>> } >>> >>> static void rna_def_library(BlenderRNA *brna) >>> >>> Modified: trunk/blender/source/blender/makesrna/intern/rna_object_api.c >>> =================================================================== >>> --- trunk/blender/source/blender/makesrna/intern/rna_object_api.c >>> 2011-01-03 08:28:22 UTC (rev 34028) >>> +++ trunk/blender/source/blender/makesrna/intern/rna_object_api.c >>> 2011-01-03 09:09:30 UTC (rev 34029) >>> @@ -262,25 +262,6 @@ >>> } >>> } >>> >>> -/* copied from old API Object.makeDisplayList (Object.c) >>> - * use _ suffix because this exists for internal rna */ >>> -static void rna_Object_update(Object *ob, Scene *sce, int object, int >>> data, int time) >>> -{ >>> - int flag= 0; >>> - >>> - if (ob->type == OB_FONT) { >>> - Curve *cu = ob->data; >>> - freedisplist(&cu->disp); >>> - BKE_text_to_curve(sce, ob, CU_LEFT); >>> - } >>> - >>> - if(object) flag |= OB_RECALC_OB; >>> - if(data) flag |= OB_RECALC_DATA; >>> - if(time) flag |= OB_RECALC_TIME; >>> - >>> - DAG_id_tag_update(&ob->id, flag); >>> -} >>> - >>> static PointerRNA rna_Object_shape_key_add(Object *ob, bContext *C, >>> ReportList *reports, const char *name, int from_mix) >>> { >>> Scene *scene= CTX_data_scene(C); >>> @@ -462,16 +443,6 @@ >>> parm= RNA_def_int(func, "index", 0, 0, 0, "", "The face index, -1 >>> when no intersection is found.", 0, 0); >>> RNA_def_function_output(func, parm); >>> >>> - >>> - /* DAG */ >>> - func= RNA_def_function(srna, "update", "rna_Object_update"); >>> - RNA_def_function_ui_description(func, "Tag the object to update its >>> display data."); >>> - parm= RNA_def_pointer(func, "scene", "Scene", "", ""); >>> - RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); >>> - RNA_def_boolean(func, "object", 1, "", "Tag the object for >>> updating"); >>> - RNA_def_boolean(func, "data", 1, "", "Tag the objects display data >>> for updating"); >>> - RNA_def_boolean(func, "time", 1, "", "Tag the object time related >>> data for updating"); >>> - >>> /* View */ >>> func= RNA_def_function(srna, "is_visible", "rna_Object_is_visible"); >>> RNA_def_function_ui_description(func, "Determine if object is >>> visible in a given scene."); >>> >>> >>> _______________________________________________ >>> Bf-blender-cvs mailing list >>> [email protected] >>> http://lists.blender.org/mailman/listinfo/bf-blender-cvs >>> >> _______________________________________________ >> Bf-committers mailing list >> [email protected] >> http://lists.blender.org/mailman/listinfo/bf-committers >> > > > > -- > - Campbell > _______________________________________________ > Bf-committers mailing list > [email protected] > http://lists.blender.org/mailman/listinfo/bf-committers > _______________________________________________ Bf-committers mailing list [email protected] http://lists.blender.org/mailman/listinfo/bf-committers
