[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34029] trunk/blender: rna/api

Alberto Torres kungfoobar at gmail.com
Thu Jan 6 21:48:57 CET 2011


+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 <ideasman42 at gmail.com> 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 <dfelinto at gmail.com> 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 <ideasman42 at gmail.com>
>>
>>> 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
>>> Bf-blender-cvs at blender.org
>>> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>>>
>> _______________________________________________
>> Bf-committers mailing list
>> Bf-committers at blender.org
>> http://lists.blender.org/mailman/listinfo/bf-committers
>>
>
>
>
> --
> - Campbell
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers
>


More information about the Bf-committers mailing list