- rna/python api object.create_render_mesh(...) support for getting a mesh from metab...
[blender.git] / source / blender / makesrna / intern / rna_object_api.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2009 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Blender Foundation
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include <stdlib.h>
30 #include <stdio.h>
31
32 #include "RNA_define.h"
33 #include "RNA_types.h"
34
35 #ifdef RNA_RUNTIME
36
37 #include "MEM_guardedalloc.h"
38
39 #include "BKE_customdata.h"
40 #include "BKE_DerivedMesh.h"
41 #include "BKE_displist.h"
42 #include "BKE_object.h"
43 #include "BKE_main.h"
44
45 #include "DNA_mesh_types.h"
46 #include "DNA_curve_types.h"
47 #include "DNA_scene_types.h"
48
49 /* copied from init_render_mesh (render code) */
50 static Mesh *rna_Object_create_render_mesh(Object *ob, bContext *C, Scene *scene)
51 {
52         CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL;
53         Object *tmpobj = NULL;
54         DerivedMesh *dm;
55         Mesh *me;
56         
57         switch(ob->type) {
58         case OB_FONT:
59         case OB_CURVE:
60         case OB_SURF:
61         {
62                 int cage = 0; //XXX -todo
63                 Curve *tmpcu = NULL;
64
65                 /* copies object and modifiers (but not the data) */
66                 tmpobj= copy_object( ob );
67                 tmpcu = (Curve *)tmpobj->data;
68                 tmpcu->id.us--;
69
70                 /* if getting the original caged mesh, delete object modifiers */
71                 if( cage )
72                         object_free_modifiers(tmpobj);
73
74                 /* copies the data */
75                 tmpobj->data = copy_curve( (Curve *) ob->data );
76
77 #if 0
78                 /* copy_curve() sets disp.first null, so currently not need */
79                 {
80                         Curve *cu;
81                         cu = (Curve *)tmpobj->data;
82                         if( cu->disp.first )
83                                 MEM_freeN( cu->disp.first );
84                         cu->disp.first = NULL;
85                 }
86         
87 #endif
88
89                 /* get updated display list, and convert to a mesh */
90                 makeDispListCurveTypes( scene, tmpobj, 0 );
91                 nurbs_to_mesh( tmpobj );
92
93                 /* nurbs_to_mesh changes the type tp a mesh, check it worked */
94                 if (tmpobj->type != OB_MESH) {
95                         free_libblock_us( &(CTX_data_main(C)->object), tmpobj );
96                         printf("cant convert curve to mesh. Does the curve have any segments?" ); // XXX use report api
97                 }
98                 me = tmpobj->data;
99                 free_libblock_us( &(CTX_data_main(C)->object), tmpobj );
100                 break;
101         }
102         case OB_MBALL:
103                 /* metaballs don't have modifiers, so just convert to mesh */
104                 ob = find_basis_mball( ob );
105                 /* todo, re-generatre for render-res */
106                 // metaball_polygonize(scene, ob)
107                 me = add_mesh("Mesh");
108                 mball_to_mesh( &ob->disp, me );
109                 break;
110         case OB_MESH:
111         {
112                 dm= mesh_create_derived_render(scene, ob, mask);
113                 // dm= mesh_create_derived_view(scene, ob, mask);
114
115                 if(!dm)
116                         return NULL;
117
118                 me= add_mesh("tmp_render_mesh");
119                 me->id.us--; /* we don't assign it to anything */
120                 DM_to_mesh(dm, me);
121                 dm->release(dm);
122                 break;
123         }
124         default:
125                 return NULL;
126         }
127
128
129         {       /* update the material */
130                 short i, *totcol =give_totcolp(ob);
131
132                 /* free the current material list */
133                 if(me->mat)
134                         MEM_freeN((void *)me->mat);
135
136                 me->mat= (Material **)MEM_callocN(sizeof(void *)*(*totcol), "matarray");
137
138                 for(i=0; i<*totcol; i++) {
139                         Material *mat= give_current_material(ob, i+1);
140                         if(mat) {
141                                 me->mat[i]= mat;
142                                 mat->id.us++;
143                         }
144                 }
145         }
146
147         return me;
148 }
149
150 #else
151
152 void RNA_api_object(StructRNA *srna)
153 {
154         FunctionRNA *func;
155         PropertyRNA *prop;
156
157         func= RNA_def_function(srna, "create_render_mesh", "rna_Object_create_render_mesh");
158         RNA_def_function_ui_description(func, "Create a Mesh datablock with all modifiers applied.");
159         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
160         prop= RNA_def_pointer(func, "scene", "Scene", "", "");
161         RNA_def_property_flag(prop, PROP_REQUIRED);
162         prop= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh created from object, remove it if it is only used for export.");
163         RNA_def_function_return(func, prop);
164 }
165
166 #endif
167