diff options
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 21 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_object_api.c | 24 |
3 files changed, 43 insertions, 4 deletions
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 3d32ba5a30a..065810089f1 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -136,6 +136,8 @@ int object_insert_ptcache(struct Object *ob); // void object_delete_ptcache(struct Object *ob, int index); struct KeyBlock *object_insert_shape_key(struct Scene *scene, struct Object *ob, const char *name, int from_mix); +int object_is_modified(struct Scene *scene, struct Object *ob); + void object_camera_matrix( struct RenderData *rd, struct Object *camera, int winx, int winy, short field_second, float winmat[][4], struct rctf *viewplane, float *clipsta, float *clipend, float *lens, float *ycor, diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 25354f2f239..9f2de5be84a 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -3061,3 +3061,24 @@ KeyBlock *object_insert_shape_key(Scene *scene, Object *ob, const char *name, in else return NULL; } +/* most important if this is modified it should _always_ return True, in certain + * cases false positives are hard to avoid (shape keys for eg) + */ +int object_is_modified(Scene *scene, Object *ob) +{ + int flag= 0; + + if(ob_get_key(ob)) { + flag |= eModifierMode_Render | eModifierMode_Render; + } + else { + ModifierData *md; + /* cloth */ + for(md=modifiers_getVirtualModifierList(ob); md && (flag != (eModifierMode_Render | eModifierMode_Realtime)); md=md->next) { + if((flag & eModifierMode_Render) == 0 && modifier_isEnabled(scene, md, eModifierMode_Render)) flag |= eModifierMode_Render; + if((flag & eModifierMode_Realtime) == 0 && modifier_isEnabled(scene, md, eModifierMode_Realtime)) flag |= eModifierMode_Realtime; + } + } + + return flag; +} diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 2d9ea89fa2f..2a369ba9044 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -39,6 +39,7 @@ #include "RNA_define.h" #include "DNA_object_types.h" +#include "DNA_modifier_types.h" // #include "BLO_sys_types.h" /* needed for intptr_t used in ED_mesh.h */ @@ -82,7 +83,7 @@ static Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int Mesh *tmpmesh; Curve *tmpcu = NULL; Object *tmpobj = NULL; - int render = settings, i; + int render = settings == eModifierMode_Render, i; int cage = !apply_modifiers; /* perform the mesh extraction based on type */ @@ -421,6 +422,11 @@ void rna_ObjectBase_layers_from_view(Base *base, View3D *v3d) base->lay= base->object->lay= v3d->lay; } +int rna_Object_is_modified(Object *ob, Scene *scene, int settings) +{ + return object_is_modified(scene, ob) & settings; +} + #else void RNA_api_object(StructRNA *srna) @@ -429,8 +435,8 @@ void RNA_api_object(StructRNA *srna) PropertyRNA *parm; static EnumPropertyItem mesh_type_items[] = { - {0, "PREVIEW", 0, "Preview", "Apply modifier preview settings"}, - {1, "RENDER", 0, "Render", "Apply modifier render settings"}, + {eModifierMode_Realtime, "PREVIEW", 0, "Preview", "Apply modifier preview settings"}, + {eModifierMode_Render, "RENDER", 0, "Render", "Apply modifier render settings"}, {0, NULL, 0, NULL, NULL} }; @@ -500,7 +506,17 @@ void RNA_api_object(StructRNA *srna) RNA_def_function_ui_description(func, "Determine if object is visible in a given scene."); parm= RNA_def_pointer(func, "scene", "Scene", "", ""); RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); - parm= RNA_def_boolean(func, "is_visible", 0, "", "Object visibility."); + parm= RNA_def_boolean(func, "result", 0, "", "Object visibility."); + RNA_def_function_return(func, parm); + + /* utility function for checking if the object is modified */ + func= RNA_def_function(srna, "is_modified", "rna_Object_is_modified"); + RNA_def_function_ui_description(func, "Determine if this object is modified from the base mesh data."); + parm= RNA_def_pointer(func, "scene", "Scene", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); + parm= RNA_def_enum(func, "settings", mesh_type_items, 0, "", "Modifier settings to apply."); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_boolean(func, "result", 0, "", "Object visibility."); RNA_def_function_return(func, parm); } |