Revision: 44084
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44084
Author:   campbellbarton
Date:     2012-02-13 08:06:44 +0000 (Mon, 13 Feb 2012)
Log Message:
-----------
bring array cap ends back, with 2 todo's
* they are not drawn in editmode
* weld does't work foe the caps

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_array.c

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_array.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_array.c  
2012-02-13 06:59:25 UTC (rev 44083)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_array.c  
2012-02-13 08:06:44 UTC (rev 44084)
@@ -162,6 +162,29 @@
        return max_co - min_co;
 }
 
+/* Used for start/end cap.
+ *
+ * this function expects all existing vertices to be tagged,
+ * so we can know new verts are not tagged.
+ *
+ * All verts will be tagged on exit.
+ */
+static void bmesh_merge_dm_transform(BMesh* bm, DerivedMesh *dm, float 
mat[4][4])
+{
+       BMVert *v;
+       BMIter iter;
+
+       DM_to_bmesh_ex(dm, bm);
+
+       /* transform all verts */
+       BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+               if (!BM_elem_flag_test(v, BM_ELEM_TAG)) {
+                       mul_m4_v3(mat, v->co);
+                       BM_elem_flag_enable(v, BM_ELEM_TAG);
+               }
+       }
+}
+
 static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
                                          Scene *scene, Object *ob, DerivedMesh 
*dm,
                                                                                
  int UNUSED(initFlags))
@@ -172,6 +195,8 @@
        int i, j, indexLen;
        /* offset matrix */
        float offset[4][4];
+       float final_offset[4][4];
+       float tmp_mat[4][4];
        float length = amd->length;
        int count = amd->count, maxVerts;
        int *indexMap = NULL;
@@ -212,6 +237,14 @@
                copy_m4_m4(offset, result_mat);
        }
 
+       /* calculate the offset matrix of the final copy (for merging) */
+       unit_m4(final_offset);
+
+       for(j=0; j < count - 1; j++) {
+               mult_m4_m4m4(tmp_mat, offset, final_offset);
+               copy_m4_m4(final_offset, tmp_mat);
+       }
+
        if(amd->fit_type == MOD_ARR_FITCURVE && amd->curve_ob) {
                Curve *cu = amd->curve_ob->data;
                if(cu) {
@@ -338,6 +371,33 @@
 
        if (j > 0) BMO_op_finish(em->bm, &op);
 
+       /* BMESH_TODO - cap ends are not welded, even though weld is called 
after */
+
+       /* start capping */
+       if ((start_cap || end_cap) &&
+
+           /* BMESH_TODO - theres a bug in DM_to_bmesh_ex() when in editmode!
+                * this needs investigation, but for now at least dont crash */
+           ob->mode != OB_MODE_EDIT
+
+           )
+       {
+               BM_mesh_elem_flag_enable_all(em->bm, BM_VERT, BM_ELEM_TAG);
+
+               if (start_cap) {
+                       float startoffset[4][4];
+                       invert_m4_m4(startoffset, offset);
+                       bmesh_merge_dm_transform(em->bm, start_cap, 
startoffset);
+               }
+
+               if (end_cap) {
+                       float endoffset[4][4];
+                       mult_m4_m4m4(endoffset, offset, final_offset);
+                       bmesh_merge_dm_transform(em->bm, end_cap, endoffset);
+               }
+       }
+       /* done capping */
+
        if (amd->flags & MOD_ARR_MERGE)
                BMO_op_exec(em->bm, &weldop);
 

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

Reply via email to