Merge with 2.5 -r 21756:22173.
[blender.git] / source / blender / makesrna / intern / rna_mesh_api.c
index c98b3fb7b09f1b8d53b8ed2dd765717b934b0025..9a527948b0f7eeb39fd5f8a8ff31d0305bb65f6b 100644 (file)
 #include "BKE_main.h"
 #include "BKE_mesh.h"
 
+#include "DNA_mesh_types.h"
+#include "DNA_scene_types.h"
+
+#include "BLI_arithb.h"
 #include "BLI_edgehash.h"
 
 #include "WM_api.h"
@@ -118,6 +122,18 @@ static void rna_Mesh_update(Mesh *mesh, bContext *C)
        }
 }
 
+static void rna_Mesh_transform(Mesh *me, float *mat)
+{
+
+       /* TODO: old API transform had recalc_normals option */
+       int i;
+       MVert *mvert= me->mvert;
+
+       for(i= 0; i < me->totvert; i++, mvert++) {
+               Mat4MulVecfl((float (*)[4])mat, mvert->co);
+       }
+}
+
 static void rna_Mesh_add_verts(Mesh *mesh, int len)
 {
        CustomData vdata;
@@ -148,6 +164,14 @@ static void rna_Mesh_add_verts(Mesh *mesh, int len)
        mesh->totvert= totvert;
 }
 
+Mesh *rna_Mesh_create_copy(Mesh *me)
+{
+       Mesh *ret= copy_mesh(me);
+       ret->id.us--;
+       
+       return ret;
+}
+
 static void rna_Mesh_add_edges(Mesh *mesh, int len)
 {
        CustomData edata;
@@ -208,6 +232,12 @@ static void rna_Mesh_add_faces(Mesh *mesh, int len)
        mesh->totface= totface;
 }
 
+/*
+static void rna_Mesh_add_faces(Mesh *mesh)
+{
+}
+*/
+
 static void rna_Mesh_add_geometry(Mesh *mesh, int verts, int edges, int faces)
 {
        if(verts)
@@ -218,6 +248,16 @@ static void rna_Mesh_add_geometry(Mesh *mesh, int verts, int edges, int faces)
                rna_Mesh_add_faces(mesh, faces);
 }
 
+static void rna_Mesh_add_uv_layer(Mesh *me)
+{
+       me->mtface= CustomData_add_layer(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface);
+}
+
+static void rna_Mesh_calc_normals(Mesh *me)
+{
+       mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+}
+
 #else
 
 void RNA_api_mesh(StructRNA *srna)
@@ -225,6 +265,11 @@ void RNA_api_mesh(StructRNA *srna)
        FunctionRNA *func;
        PropertyRNA *parm;
 
+       func= RNA_def_function(srna, "transform", "rna_Mesh_transform");
+       RNA_def_function_ui_description(func, "Transform mesh vertices by a matrix.");
+       parm= RNA_def_float_matrix(func, "matrix", 16, NULL, 0.0f, 0.0f, "", "Matrix.", 0.0f, 0.0f);
+       RNA_def_property_flag(parm, PROP_REQUIRED);
+
        func= RNA_def_function(srna, "add_geometry", "rna_Mesh_add_geometry");
        parm= RNA_def_int(func, "verts", 0, 0, INT_MAX, "Number", "Number of vertices to add.", 0, INT_MAX);
        RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -233,6 +278,26 @@ void RNA_api_mesh(StructRNA *srna)
        parm= RNA_def_int(func, "faces", 0, 0, INT_MAX, "Number", "Number of faces to add.", 0, INT_MAX);
        RNA_def_property_flag(parm, PROP_REQUIRED);
 
+       func= RNA_def_function(srna, "create_copy", "rna_Mesh_create_copy");
+       RNA_def_function_ui_description(func, "Create a copy of this Mesh datablock.");
+       parm= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh, remove it if it is only used for export.");
+       RNA_def_function_return(func, parm);
+
+       func= RNA_def_function(srna, "add_uv_layer", "rna_Mesh_add_uv_layer");
+       RNA_def_function_ui_description(func, "Add new UV layer to Mesh.");
+
+       func= RNA_def_function(srna, "calc_normals", "rna_Mesh_calc_normals");
+       RNA_def_function_ui_description(func, "Calculate vertex normals.");
+
+       /*
+       func= RNA_def_function(srna, "add_geom", "rna_Mesh_add_geom");
+       RNA_def_function_ui_description(func, "Add geometry data to mesh.");
+       prop= RNA_def_collection(func, "verts", "?", "", "Vertices.");
+       RNA_def_property_flag(prop, PROP_REQUIRED);
+       prop= RNA_def_collection(func, "faces", "?", "", "Faces.");
+       RNA_def_property_flag(prop, PROP_REQUIRED);
+       */
+
        func= RNA_def_function(srna, "update", "rna_Mesh_update");
        RNA_def_function_flag(func, FUNC_USE_CONTEXT);
 }