Revision: 21627
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21627
Author:   kazanbas
Date:     2009-07-16 15:19:43 +0200 (Thu, 16 Jul 2009)

Log Message:
-----------
- replaced Object.create_mesh body with 2.4x API's Mesh.createFromObject code 
to also support curves, surfaces and metaballs.
- replaced Object.dag_update with Object.make_display_list, which copies old 
API's Object.makeDisplayList

Modified Paths:
--------------
    branches/soc-2009-kazanbas/release/io/export_fbx.py
    branches/soc-2009-kazanbas/release/io/export_obj.py
    branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_object_api.c

Modified: branches/soc-2009-kazanbas/release/io/export_fbx.py
===================================================================
--- branches/soc-2009-kazanbas/release/io/export_fbx.py 2009-07-16 11:05:16 UTC 
(rev 21626)
+++ branches/soc-2009-kazanbas/release/io/export_fbx.py 2009-07-16 13:19:43 UTC 
(rev 21627)
@@ -2019,41 +2019,60 @@
                # This is needed so applying modifiers dosnt apply the armature 
deformation, its also needed
                # ...so mesh objects return their rest worldspace matrix when 
bone-parents are exported as weighted meshes.
                # set every armature to its rest, backup the original values so 
we done mess up the scene
-               ob_arms_orig_rest = [arm.restPosition for arm in 
bpy.data.armatures]
+               ob_arms_orig_rest = [arm.rest_position for arm in 
bpy.data.armatures]
+#              ob_arms_orig_rest = [arm.restPosition for arm in 
bpy.data.armatures]
                
                for arm in bpy.data.armatures:
-                       arm.restPosition = True
+                       arm.rest_position = True
+#                      arm.restPosition = True
                
                if ob_arms_orig_rest:
                        for ob_base in bpy.data.objects:
                                #if ob_base.type == 'Armature':
-                               ob_base.makeDisplayList()
+                               ob_base.make_display_list()
+#                              ob_base.makeDisplayList()
                                        
                        # This causes the makeDisplayList command to effect the 
mesh
-                       Blender.Set('curframe', Blender.Get('curframe'))
+                       sce.set_frame(sce.current_frame)
+#                      Blender.Set('curframe', Blender.Get('curframe'))
                        
        
        for ob_base in tmp_objects:
-               for ob, mtx in BPyObject.getDerivedObjects(ob_base):
-                       #for ob in [ob_base,]:
+
+               # ignore dupli children
+               if ob_base.parent and ob_base.parent.dupli_type != 'NONE':
+                       continue
+
+               obs = [(ob_base, ob_base.matrix)]
+               if ob_base.dupli_type != 'NONE':
+                       ob_base.create_dupli_list()
+                       obs = [(dob.object, dob.matrix) for dob in 
ob_base.dupli_list]
+
+               for ob, mtx in obs:
+#              for ob, mtx in BPyObject.getDerivedObjects(ob_base):
                        tmp_ob_type = ob.type
-                       if tmp_ob_type == 'Camera':
+                       if tmp_ob_type == 'CAMERA':
+#                      if tmp_ob_type == 'Camera':
                                if EXP_CAMERA:
                                        ob_cameras.append(my_object_generic(ob, 
mtx))
-                       elif tmp_ob_type == 'Lamp':
+                       elif tmp_ob_type == 'LAMP':
+#                      elif tmp_ob_type == 'Lamp':
                                if EXP_LAMP:
                                        ob_lights.append(my_object_generic(ob, 
mtx))
-                       elif tmp_ob_type == 'Armature':
+                       elif tmp_ob_type == 'ARMATURE':
+#                      elif tmp_ob_type == 'Armature':
                                if EXP_ARMATURE:
                                        # TODO - armatures dont work in 
dupligroups!
                                        if ob not in ob_arms: ob_arms.append(ob)
                                        # ob_arms.append(ob) # replace later. 
was "ob_arms.append(sane_obname(ob), ob)"
-                       elif tmp_ob_type == 'Empty':
+                       elif tmp_ob_type == 'EMPTY':
+#                      elif tmp_ob_type == 'Empty':
                                if EXP_EMPTY:
                                        ob_null.append(my_object_generic(ob, 
mtx))
                        elif EXP_MESH:
                                origData = True
-                               if tmp_ob_type != 'Mesh':
+                               if tmp_ob_type != 'MESH':
+#                              if tmp_ob_type != 'Mesh':
                                        me = bpy.data.meshes.new()
                                        try:    me.getFromObject(ob)
                                        except: me = None
@@ -2171,8 +2190,9 @@
                        
                if ob_arms_orig_rest:
                        for ob_base in bpy.data.objects:
-                               if ob_base.type == 'Armature':
-                                       ob_base.dag_update()
+                               if ob_base.type == 'ARMATURE':
+#                              if ob_base.type == 'Armature':
+                                       ob_base.make_display_list()
 #                                      ob_base.makeDisplayList()
                        # This causes the makeDisplayList command to effect the 
mesh
                        sce.set_frame(sce.current_frame)
@@ -3322,6 +3342,7 @@
 # - get rid of BPyObject_getObjectArmature, move it in RNA?
 # - BATCH_ENABLE and BATCH_GROUP options: line 327
 # - implement all BPyMesh_* used here with RNA
+# - getDerivedObjects is not fully replicated with .dupli* funcs
 
 # TODO
 

Modified: branches/soc-2009-kazanbas/release/io/export_obj.py
===================================================================
--- branches/soc-2009-kazanbas/release/io/export_obj.py 2009-07-16 11:05:16 UTC 
(rev 21626)
+++ branches/soc-2009-kazanbas/release/io/export_obj.py 2009-07-16 13:19:43 UTC 
(rev 21627)
@@ -380,11 +380,6 @@
        # Get all meshes
        for ob_main in objects:
 
-               if ob_main.dupli_type != 'NONE':
-                       # XXX
-                       print('creating dupli_list on', ob_main.name)
-                       ob_main.create_dupli_list()
-
                # ignore dupli children
                if ob_main.parent and ob_main.parent.dupli_type != 'NONE':
                        # XXX
@@ -393,6 +388,10 @@
 
                obs = []
                if ob_main.dupli_type != 'NONE':
+                       # XXX
+                       print('creating dupli_list on', ob_main.name)
+                       ob_main.create_dupli_list()
+                       
                        obs = [(dob.object, dob.matrix) for dob in 
ob_main.dupli_list]
 
                        # XXX debug print

Modified: 
branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_object_api.c
===================================================================
--- branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_object_api.c  
2009-07-16 11:05:16 UTC (rev 21626)
+++ branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_object_api.c  
2009-07-16 13:19:43 UTC (rev 21627)
@@ -40,62 +40,190 @@
 
 #include "ED_mesh.h"
 
-/* parameter to rna_Object_create_mesh */
-typedef enum CreateMeshType {
-       CREATE_MESH_PREVIEW = 0,
-       CREATE_MESH_RENDER = 1
-} CreateMeshType;
-
 #ifdef RNA_RUNTIME
 
+#include "BKE_main.h"
+#include "BKE_global.h"
+#include "BKE_context.h"
+#include "BKE_report.h"
+#include "BKE_object.h"
+#include "BKE_mesh.h"
+#include "BKE_DerivedMesh.h"
 #include "BKE_customdata.h"
-#include "BKE_DerivedMesh.h"
 #include "BKE_anim.h"
-#include "BKE_report.h"
 #include "BKE_depsgraph.h"
+#include "BKE_displist.h"
+#include "BKE_font.h"
+#include "BKE_mball.h"
 
+#include "BLI_arithb.h"
+
 #include "DNA_mesh_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_meshdata_types.h"
+#include "DNA_curve_types.h"
 
-#include "BLI_arithb.h"
+#include "MEM_guardedalloc.h"
 
-/* copied from init_render_mesh (render code) */
-static Mesh *rna_Object_create_mesh(Object *ob, bContext *C, ReportList 
*reports, int type)
+/* copied from Mesh_getFromObject and adapted to RNA interface */
+/* settings: 0 - preview, 1 - render */
+static Mesh *rna_Object_create_mesh(Object *ob, bContext *C, ReportList 
*reports, int apply_modifiers, int settings)
 {
-       /* 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 */
-       DerivedMesh *dm;
-       Mesh *me;
-       Scene *sce;
+       Mesh *tmpmesh;
+       Curve *tmpcu = NULL;
+       Object *tmpobj = NULL;
+       int render = settings, i;
+       int cage = !apply_modifiers;
+       Scene *sce = CTX_data_scene(C);
 
-       sce= CTX_data_scene(C);
+       /* perform the mesh extraction based on type */
+       switch (ob->type) {
+       case OB_FONT:
+       case OB_CURVE:
+       case OB_SURF:
+
+               /* copies object and modifiers (but not the data) */
+               tmpobj= copy_object(ob);
+               tmpcu = (Curve *)tmpobj->data;
+               tmpcu->id.us--;
+
+               /* if getting the original caged mesh, delete object modifiers 
*/
+               if( cage )
+                       object_free_modifiers(tmpobj);
+
+               /* copies the data */
+               tmpobj->data = copy_curve( (Curve *) ob->data );
+
+#if 0
+               /* copy_curve() sets disp.first null, so currently not need */
+               {
+                       Curve *cu;
+                       cu = (Curve *)tmpobj->data;
+                       if( cu->disp.first )
+                               MEM_freeN( cu->disp.first );
+                       cu->disp.first = NULL;
+               }
        
-       /* TODO: other types */
-       if(ob->type != OB_MESH) {
-               BKE_report(reports, RPT_ERROR, "Object should be of type 
MESH.");
-               return NULL;
-       }
+#endif
 
-       if (type == CREATE_MESH_PREVIEW) {
-               dm= mesh_create_derived_view(sce, ob, mask);
-       }
-       else {
-               dm= mesh_create_derived_render(sce, ob, mask);
-       }
+               /* get updated display list, and convert to a mesh */
+               makeDispListCurveTypes( sce, tmpobj, 0 );
+               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 );
+                       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 );
+               break;
 
-       if(!dm) {
-               /* TODO: report */
-               return NULL;
-       }
+       case OB_MBALL:
+               /* metaballs don't have modifiers, so just convert to mesh */
+               ob = find_basis_mball( sce, ob );
+               tmpmesh = add_mesh("Mesh");
+               mball_to_mesh( &ob->disp, tmpmesh );
+               break;
 
-       me= add_mesh("tmp_render_mesh");
-       me->id.us--; /* we don't assign it to anything */
-       DM_to_mesh(dm, me);
-       dm->release(dm);
+       case OB_MESH:
+               /* copies object and modifiers (but not the data) */
+               if (cage) {
+                       /* copies the data */
+                       tmpmesh = copy_mesh( ob->data );
+               /* if not getting the original caged mesh, get final derived 
mesh */
+               } 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 */
+                       
+                       /* Write the display mesh into the dummy mesh */
+                       if (render)
+                               dm = mesh_create_derived_render( sce, ob, mask 
);
+                       else
+                               dm = mesh_create_derived_view( sce, ob, mask );
+                       
+                       tmpmesh = add_mesh( "Mesh" );
+                       DM_to_mesh( dm, tmpmesh );
+                       dm->release( dm );
+               }
+               
+               break;
+       default:
+               BKE_report(reports, RPT_ERROR, "Object does not have geometry 
data");
+               return NULL;
+       }
 
-       return me;
+       /* Copy materials to new mesh */
+       switch (ob->type) {
+       case OB_SURF:
+               tmpmesh->totcol = tmpcu->totcol;                
+               
+               /* free old material list (if it exists) and adjust user counts 
*/
+               if( tmpcu->mat ) {
+                       for( i = tmpcu->totcol; i-- > 0; ) {
+                               /* are we an object material or data based? */
+                               if (ob->colbits & 1<<i) 
+                                       tmpmesh->mat[i] = ob->mat[i];
+                               else 
+                                       tmpmesh->mat[i] = tmpcu->mat[i];
+
+                               if (tmpmesh->mat[i]) 
+                                       tmpmesh->mat[i]->id.us++;
+                       }
+               }
+               break;
+
+#if 0
+       /* Crashes when assigning the new material, not sure why */
+       case OB_MBALL:
+               tmpmb = (MetaBall *)ob->data;
+               tmpmesh->totcol = tmpmb->totcol;
+               
+               /* free old material list (if it exists) and adjust user counts 
*/
+               if( tmpmb->mat ) {
+                       for( i = tmpmb->totcol; i-- > 0; ) {
+                               tmpmesh->mat[i] = tmpmb->mat[i]; /* CRASH HERE 
??? */
+                               if (tmpmesh->mat[i]) {
+                                       tmpmb->mat[i]->id.us++;
+                               }
+                       }
+               }
+               break;
+#endif
+
+       case OB_MESH:
+               if (!cage) {
+                       Mesh *origmesh= ob->data;
+                       tmpmesh->flag= origmesh->flag;
+                       tmpmesh->mat = MEM_dupallocN(origmesh->mat);
+                       tmpmesh->totcol = origmesh->totcol;
+                       tmpmesh->smoothresh= origmesh->smoothresh;
+                       if( origmesh->mat ) {
+                               for( i = origmesh->totcol; i-- > 0; ) {

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to