Merge from 2.5 r21160 through r21285
authorArystanbek Dyussenov <arystan.d@gmail.com>
Wed, 1 Jul 2009 13:37:52 +0000 (13:37 +0000)
committerArystanbek Dyussenov <arystan.d@gmail.com>
Wed, 1 Jul 2009 13:37:52 +0000 (13:37 +0000)
1  2 
release/ui/buttons_physic_cloth.py
source/blender/makesrna/intern/makesrna.c
source/blender/makesrna/intern/rna_internal.h
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_mesh_api.c
source/blender/makesrna/intern/rna_object.c
source/blender/python/intern/bpy_operator_wrap.c
source/blender/python/intern/bpy_rna.c

@@@ -102,5 -149,6 +149,6 @@@ class Physic_PT_cloth_stiffness(PhysicB
                sub.itemR(cloth, "bending_stiffness_max", text="Max")
                
  bpy.types.register(Physic_PT_cloth)
+ bpy.types.register(PHYSICS_PT_cloth_cache)
  bpy.types.register(Physic_PT_cloth_collision)
 -bpy.types.register(Physic_PT_cloth_stiffness)
 +bpy.types.register(Physic_PT_cloth_stiffness)
  
  #ifdef RNA_RUNTIME
  
+ #include "DNA_mesh_types.h"
+ #include "DNA_scene_types.h"
  #include "BKE_customdata.h"
+ #include "BKE_depsgraph.h"
  #include "BKE_DerivedMesh.h"
+ #include "BKE_main.h"
  #include "BKE_mesh.h"
  
- #include "BLI_arithb.h"
 +#include "DNA_mesh_types.h"
 +#include "DNA_scene_types.h"
 +
- /*
- void rna_Mesh_copy(Mesh *me, Mesh *from)
++#include "BLI_arithb.h"
+ #include "BLI_edgehash.h"
+ #include "WM_api.h"
+ #include "WM_types.h"
+ static void rna_Mesh_calc_edges(Mesh *mesh)
  {
-       copy_mesh_data(me, from);
+       CustomData edata;
+       EdgeHashIterator *ehi;
+       MFace *mf = mesh->mface;
+       MEdge *med;
+       EdgeHash *eh = BLI_edgehash_new();
+       int i, *index, totedge, totface = mesh->totface;
+       for (i = 0; i < totface; i++, mf++) {
+               if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
+                       BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL);
+               if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3))
+                       BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL);
+               
+               if (mf->v4) {
+                       if (!BLI_edgehash_haskey(eh, mf->v3, mf->v4))
+                               BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL);
+                       if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1))
+                               BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL);
+               } else {
+                       if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1))
+                               BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL);
+               }
+       }
+       totedge = BLI_edgehash_size(eh);
+       /* write new edges into a temporary CustomData */
+       memset(&edata, 0, sizeof(edata));
+       CustomData_add_layer(&edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
+       ehi = BLI_edgehashIterator_new(eh);
+       med = CustomData_get_layer(&edata, CD_MEDGE);
+       for(i = 0; !BLI_edgehashIterator_isDone(ehi);
+           BLI_edgehashIterator_step(ehi), ++i, ++med, ++index) {
+               BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
+               med->flag = ME_EDGEDRAW|ME_EDGERENDER;
+       }
+       BLI_edgehashIterator_free(ehi);
+       /* free old CustomData and assign new one */
+       CustomData_free(&mesh->edata, mesh->totedge);
+       mesh->edata = edata;
+       mesh->totedge = totedge;
+       mesh->medge = CustomData_get_layer(&mesh->edata, CD_MEDGE);
+       BLI_edgehash_free(eh, NULL);
  }
  
void rna_Mesh_copy_applied(Mesh *me, Scene *sce, Object *ob)
static void rna_Mesh_update(Mesh *mesh, bContext *C)
  {
-       DerivedMesh *dm= mesh_create_derived_view(sce, ob, CD_MASK_MESH);
-       DM_to_mesh(dm, me);
-       dm->release(dm);
+       Main *bmain= CTX_data_main(C);
+       Object *ob;
+       if(mesh->totface && mesh->totedge == 0)
+               rna_Mesh_calc_edges(mesh);
+       mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mface, mesh->totface, NULL);
+       for(ob=bmain->object.first; ob; ob=ob->id.next) {
+               if(ob->data == mesh) {
+                       ob->recalc |= OB_RECALC_DATA;
+                       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob);
+               }
+       }
  }
- */
  
- void rna_Mesh_transform(Mesh *me, float *mat)
++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(mat, mvert->co);
 +      }
 +}
 +
+ static void rna_Mesh_add_verts(Mesh *mesh, int len)
+ {
+       CustomData vdata;
+       MVert *mvert;
+       int i, totvert;
+       if(len == 0)
+               return;
+       totvert= mesh->totvert + len;
+       CustomData_copy(&mesh->vdata, &vdata, CD_MASK_MESH, CD_DEFAULT, totvert);
+       CustomData_copy_data(&mesh->vdata, &vdata, 0, 0, mesh->totvert);
+       if(!CustomData_has_layer(&vdata, CD_MVERT))
+               CustomData_add_layer(&vdata, CD_MVERT, CD_CALLOC, NULL, totvert);
+       CustomData_free(&mesh->vdata, mesh->totvert);
+       mesh->vdata= vdata;
+       mesh_update_customdata_pointers(mesh);
+       /* scan the input list and insert the new vertices */
+       mvert= &mesh->mvert[mesh->totvert];
+       for(i=0; i<len; i++, mvert++)
+               mvert->flag |= SELECT;
+       /* set final vertex list size */
+       mesh->totvert= totvert;
+ }
 +Mesh *rna_Mesh_create_copy(Mesh *me)
 +{
 +      Mesh *ret= copy_mesh(me);
 +      ret->id.us--;
 +      
 +      return ret;
 +}
 +
- #if 0
- /* extern struct EditVert *addvertlist(EditMesh *em, float *vec, struct EditVert *example); */
+ static void rna_Mesh_add_edges(Mesh *mesh, int len)
+ {
+       CustomData edata;
+       MEdge *medge;
+       int i, totedge;
+       if(len == 0)
+               return;
+       totedge= mesh->totedge+len;
+       /* update customdata  */
+       CustomData_copy(&mesh->edata, &edata, CD_MASK_MESH, CD_DEFAULT, totedge);
+       CustomData_copy_data(&mesh->edata, &edata, 0, 0, mesh->totedge);
+       if(!CustomData_has_layer(&edata, CD_MEDGE))
+               CustomData_add_layer(&edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
+       CustomData_free(&mesh->edata, mesh->totedge);
+       mesh->edata= edata;
+       mesh_update_customdata_pointers(mesh);
+       /* set default flags */
+       medge= &mesh->medge[mesh->totedge];
+       for(i=0; i<len; i++, medge++)
+               medge->flag= ME_EDGEDRAW|ME_EDGERENDER|SELECT;
+       mesh->totedge= totedge;
+ }
  
- static void rna_Mesh_verts_add(PointerRNA *ptr, PointerRNA *ptr_item)
+ static void rna_Mesh_add_faces(Mesh *mesh, int len)
  {
-       //Mesh *me= (Mesh*)ptr->data;
+       CustomData fdata;
+       MFace *mface;
+       int i, totface;
  
-       /*
-       // XXX if item is not MVert we fail silently
-       if (item->type == RNA_MeshVertex)
+       if(len == 0)
                return;
  
-       // XXX this must be slow...
-       EditMesh *em= BKE_mesh_get_editmesh(me);
+       totface= mesh->totface + len;   /* new face count */
  
-       MVert *v = (MVert*)ptr_item->ptr->data;
-       addvertlist(em, v->co, NULL);
+       /* update customdata */
+       CustomData_copy(&mesh->fdata, &fdata, CD_MASK_MESH, CD_DEFAULT, totface);
+       CustomData_copy_data(&mesh->fdata, &fdata, 0, 0, mesh->totface);
  
-       BKE_mesh_end_editmesh(me, em);
-       */
+       if(!CustomData_has_layer(&fdata, CD_MFACE))
+               CustomData_add_layer(&fdata, CD_MFACE, CD_CALLOC, NULL, totface);
+       CustomData_free(&mesh->fdata, mesh->totface);
+       mesh->fdata= fdata;
+       mesh_update_customdata_pointers(mesh);
+       /* set default flags */
+       mface= &mesh->mface[mesh->totface];
+       for(i=0; i<len; i++, mface++)
+               mface->flag= SELECT;
+       mesh->totface= totface;
+ }
+ static void rna_Mesh_add_geometry(Mesh *mesh, int verts, int edges, int faces)
+ {
+       if(verts)
+               rna_Mesh_add_verts(mesh, verts);
+       if(edges)
+               rna_Mesh_add_edges(mesh, edges);
+       if(faces)
+               rna_Mesh_add_faces(mesh, faces);
  }
- #endif
  
  #else
  
@@@ -106,24 -225,16 +249,35 @@@ 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);
+       parm= RNA_def_int(func, "edges", 0, 0, INT_MAX, "Number", "Number of edges to add.", 0, INT_MAX);
+       RNA_def_property_flag(parm, PROP_REQUIRED);
+       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_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);
  }
  
  #endif