Merging r46111 through r46136 from trunk into soc-2011-tomato
[blender-staging.git] / source / blender / makesrna / intern / rna_object_api.c
index f33cf1a3993273dad43869281a5ed8949b8f40d8..cb0f1d307aa8733b32466a92f1b0bc452547db1c 100644 (file)
@@ -4,7 +4,7 @@
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. 
+ * of the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,7 @@
  * The Original Code is Copyright (C) 2009 Blender Foundation.
  * All rights reserved.
  *
- * 
+ *
  * Contributor(s): Blender Foundation
  *
  * ***** END GPL LICENSE BLOCK *****
 #include "DNA_object_types.h"
 #include "DNA_modifier_types.h"
 
-/* #include "BLO_sys_types.h"  *//* needed for intptr_t used in ED_mesh.h */
-
-/* #include "ED_mesh.h" */
-
-
 #ifdef RNA_RUNTIME
 #include "BLI_math.h"
 
@@ -101,7 +96,7 @@ Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_
                        object_free_modifiers(tmpobj);
 
                /* copies the data */
-               copycu = tmpobj->data = copy_curve( (Curve *) ob->data );
+               copycu = tmpobj->data = BKE_curve_copy((Curve *) ob->data );
 
                /* temporarily set edit so we get updates from edit mode, but
                 * also because for text datablocks copying it while in edit
@@ -110,26 +105,26 @@ Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_
                copycu->editnurb = tmpcu->editnurb;
 
                /* get updated display list, and convert to a mesh */
-               makeDispListCurveTypes( sce, tmpobj, 0 );
+               makeDispListCurveTypes(sce, tmpobj, 0);
 
                copycu->editfont = NULL;
                copycu->editnurb = NULL;
 
-               nurbs_to_mesh( tmpobj );
+               nurbs_to_mesh(tmpobj);
 
                /* nurbs_to_mesh changes the type to a mesh, check it worked */
                if (tmpobj->type != OB_MESH) {
-                       free_libblock_us( &(G.main->object), tmpobj );
+                       free_libblock_us(&(G.main->object), tmpobj);
                        BKE_report(reports, RPT_ERROR, "cant convert curve to mesh. Does the curve have any segments?");
                        return NULL;
                }
                tmpmesh = tmpobj->data;
-               free_libblock_us( &G.main->object, tmpobj );
+               free_libblock_us(&G.main->object, tmpobj);
                break;
 
        case OB_MBALL: {
                /* metaballs don't have modifiers, so just convert to mesh */
-               Object *basis_ob = find_basis_mball(sce, ob);
+               Object *basis_ob = BKE_metaball_basis_find(sce, ob);
                /* todo, re-generatre for render-res */
                /* metaball_polygonize(scene, ob) */
 
@@ -155,22 +150,23 @@ Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_
                        /* copies the data */
                        tmpmesh = copy_mesh( ob->data );
                /* if not getting the original caged mesh, get final derived mesh */
-               } else {
+               }
+               else {
                        /* Make a dummy mesh, saves copying */
                        DerivedMesh *dm;
                        /* CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL; */
                        CustomDataMask mask = CD_MASK_MESH; /* this seems more suitable, exporter,
-                                                                                                  for example, needs CD_MASK_MDEFORMVERT */
+                                                                                                * for example, needs CD_MASK_MDEFORMVERT */
                        
                        /* Write the display mesh into the dummy mesh */
                        if (render)
-                               dm = mesh_create_derived_render( sce, ob, mask );
+                               dm = mesh_create_derived_render(sce, ob, mask);
                        else
-                               dm = mesh_create_derived_view( sce, ob, mask );
+                               dm = mesh_create_derived_view(sce, ob, mask);
                        
-                       tmpmesh = add_mesh( "Mesh" );
-                       DM_to_mesh( dm, tmpmesh, ob );
-                       dm->release( dm );
+                       tmpmesh = add_mesh("Mesh");
+                       DM_to_mesh(dm, tmpmesh, ob);
+                       dm->release(dm);
                }
                
                break;
@@ -184,7 +180,7 @@ Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_
        case OB_SURF:
        case OB_FONT:
        case OB_CURVE:
-               tmpmesh->totcol = tmpcu->totcol;                
+               tmpmesh->totcol = tmpcu->totcol;
                
                /* free old material list (if it exists) and adjust user counts */
                if ( tmpcu->mat ) {
@@ -326,7 +322,8 @@ void rna_Object_free_duplilist(Object *ob)
        }
 }
 
-static PointerRNA rna_Object_shape_key_add(Object *ob, bContext *C, ReportList *reports, const char *name, int from_mix)
+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);
        KeyBlock *kb = NULL;
@@ -351,7 +348,8 @@ int rna_Object_is_visible(Object *ob, Scene *sce)
 }
 
 #if 0
-static void rna_Mesh_assign_verts_to_group(Object *ob, bDeformGroup *group, int *indices, int totindex, float weight, int assignmode)
+static void rna_Mesh_assign_verts_to_group(Object *ob, bDeformGroup *group, int *indices, int totindex,
+                                           float weight, int assignmode)
 {
        if (ob->type != OB_MESH) {
                BKE_report(reports, RPT_ERROR, "Object should be of MESH type");
@@ -366,12 +364,12 @@ static void rna_Mesh_assign_verts_to_group(Object *ob, bDeformGroup *group, int
        }
 
        if (assignmode != WEIGHT_REPLACE && assignmode != WEIGHT_ADD && assignmode != WEIGHT_SUBTRACT) {
-               BKE_report(reports, RPT_ERROR, "Bad assignment mode" );
+               BKE_report(reports, RPT_ERROR, "Bad assignment mode");
                return;
        }
 
        /* makes a set of dVerts corresponding to the mVerts */
-       if (!me->dvert) 
+       if (!me->dvert)
                create_dverts(&me->id);
 
        /* loop list adding verts to group  */
@@ -386,7 +384,9 @@ static void rna_Mesh_assign_verts_to_group(Object *ob, bDeformGroup *group, int
 }
 #endif
 
-void rna_Object_ray_cast(Object *ob, ReportList *reports, float ray_start[3], float ray_end[3], float r_location[3], float r_normal[3], int *index)
+/* BMESH_TODO, return polygon index, not tessface */
+void rna_Object_ray_cast(Object *ob, ReportList *reports, float ray_start[3], float ray_end[3],
+                         float r_location[3], float r_normal[3], int *index)
 {
        BVHTreeFromMesh treeData = {NULL};
        
@@ -410,7 +410,8 @@ void rna_Object_ray_cast(Object *ob, ReportList *reports, float ray_start[3], fl
                dist = hit.dist = normalize_v3(ray_nor);
                hit.index = -1;
                
-               if (BLI_bvhtree_ray_cast(treeData.tree, ray_start, ray_nor, 0.0f, &hit, treeData.raycast_callback, &treeData) != -1) {
+               if (BLI_bvhtree_ray_cast(treeData.tree, ray_start, ray_nor, 0.0f, &hit,
+                                        treeData.raycast_callback, &treeData) != -1) {
                        if (hit.dist <= dist) {
                                copy_v3_v3(r_location, hit.co);
                                copy_v3_v3(r_normal, hit.no);
@@ -425,12 +426,14 @@ void rna_Object_ray_cast(Object *ob, ReportList *reports, float ray_start[3], fl
        *index = -1;
 }
 
-void rna_Object_closest_point_on_mesh(Object *ob, ReportList *reports, float point_co[3], float max_dist, float n_location[3], float n_normal[3], int *index)
+void rna_Object_closest_point_on_mesh(Object *ob, ReportList *reports, float point_co[3], float max_dist,
+                                      float n_location[3], float n_normal[3], int *index)
 {
        BVHTreeFromMesh treeData = {NULL};
        
        if (ob->derivedFinal == NULL) {
-               BKE_reportf(reports, RPT_ERROR, "object \"%s\" has no mesh data to be used for finding nearest point", ob->id.name+2);
+               BKE_reportf(reports, RPT_ERROR, "object \"%s\" has no mesh data to be used for finding nearest point",
+                           ob->id.name+2);
                return;
        }
 
@@ -438,7 +441,8 @@ void rna_Object_closest_point_on_mesh(Object *ob, ReportList *reports, float poi
        bvhtree_from_mesh_faces(&treeData, ob->derivedFinal, 0.0f, 4, 6);
 
        if (treeData.tree == NULL) {
-               BKE_reportf(reports, RPT_ERROR, "object \"%s\" could not create internal data for finding nearest point", ob->id.name+2);
+               BKE_reportf(reports, RPT_ERROR, "object \"%s\" could not create internal data for finding nearest point",
+                           ob->id.name+2);
                return;
        }
        else {
@@ -472,6 +476,11 @@ int rna_Object_is_modified(Object *ob, Scene *scene, int settings)
        return object_is_modified(scene, ob) & settings;
 }
 
+int rna_Object_is_deform_modified(Object *ob, Scene *scene, int settings)
+{
+       return object_is_deform_modified(scene, ob) & settings;
+}
+
 #ifndef NDEBUG
 void rna_Object_dm_info(struct Object *ob, int type, char *result)
 {
@@ -527,7 +536,7 @@ void RNA_api_object(StructRNA *srna)
        static EnumPropertyItem mesh_dm_info_items[] = {
                {0, "SOURCE", 0, "Source", "Source mesh"},
                {1, "DEFORM", 0, "Deform", "Objects deform mesh"},
-           {2, "FINAL", 0, "Final", "Objects final mesh"},
+               {2, "FINAL", 0, "Final", "Objects final mesh"},
                {0, NULL, 0, NULL, NULL}
        };
 #endif
@@ -542,7 +551,8 @@ void RNA_api_object(StructRNA *srna)
        RNA_def_property_flag(parm, PROP_REQUIRED);
        parm = RNA_def_enum(func, "settings", mesh_type_items, 0, "", "Modifier settings to apply");
        RNA_def_property_flag(parm, PROP_REQUIRED);
-       parm = RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh created from object, remove it if it is only used for export");
+       parm = RNA_def_pointer(func, "mesh", "Mesh", "",
+                              "Mesh created from object, remove it if it is only used for export");
        RNA_def_function_return(func, parm);
 
        /* duplis */
@@ -585,10 +595,12 @@ void RNA_api_object(StructRNA *srna)
        RNA_def_property_flag(parm, PROP_REQUIRED);
 
        /* return location and normal */
-       parm = RNA_def_float_vector(func, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location", "The hit location of this ray cast", -1e4, 1e4);
+       parm = RNA_def_float_vector(func, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location",
+                                   "The hit location of this ray cast", -1e4, 1e4);
        RNA_def_property_flag(parm, PROP_THICK_WRAP);
        RNA_def_function_output(func, parm);
-       parm = RNA_def_float_vector(func, "normal", 3, NULL, -FLT_MAX, FLT_MAX, "Normal", "The face normal at the ray cast hit location", -1e4, 1e4);
+       parm = RNA_def_float_vector(func, "normal", 3, NULL, -FLT_MAX, FLT_MAX, "Normal",
+                                   "The face normal at the ray cast hit location", -1e4, 1e4);
        RNA_def_property_flag(parm, PROP_THICK_WRAP);
        RNA_def_function_output(func, parm);
        
@@ -607,10 +619,12 @@ void RNA_api_object(StructRNA *srna)
        RNA_def_float(func, "max_dist", 1.844674352395373e+19, 0.0, FLT_MAX, "", "", 0.0, FLT_MAX);
 
        /* return location and normal */
-       parm = RNA_def_float_vector(func, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location", "The location on the object closest to the point", -1e4, 1e4);
+       parm = RNA_def_float_vector(func, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location",
+                                   "The location on the object closest to the point", -1e4, 1e4);
        RNA_def_property_flag(parm, PROP_THICK_WRAP);
        RNA_def_function_output(func, parm);
-       parm = RNA_def_float_vector(func, "normal", 3, NULL, -FLT_MAX, FLT_MAX, "Normal", "The face normal at the closest point", -1e4, 1e4);
+       parm = RNA_def_float_vector(func, "normal", 3, NULL, -FLT_MAX, FLT_MAX, "Normal",
+                                   "The face normal at the closest point", -1e4, 1e4);
        RNA_def_property_flag(parm, PROP_THICK_WRAP);
        RNA_def_function_output(func, parm);
 
@@ -635,6 +649,14 @@ void RNA_api_object(StructRNA *srna)
        parm = RNA_def_boolean(func, "result", 0, "", "Object visibility");
        RNA_def_function_return(func, parm);
 
+       func = RNA_def_function(srna, "is_deform_modified", "rna_Object_is_deform_modified");
+       RNA_def_function_ui_description(func, "Determine if this object is modified by a deformation 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);
 
 #ifndef NDEBUG
        /* mesh */
@@ -657,7 +679,8 @@ void RNA_api_object_base(StructRNA *srna)
        PropertyRNA *parm;
 
        func = RNA_def_function(srna, "layers_from_view", "rna_ObjectBase_layers_from_view");
-       RNA_def_function_ui_description(func, "Sets the object layers from a 3D View (use when adding an object in local view)");
+       RNA_def_function_ui_description(func,
+                                       "Sets the object layers from a 3D View (use when adding an object in local view)");
        parm = RNA_def_pointer(func, "view", "SpaceView3D", "", "");
        RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }