added boolean type for bmesh operators, will make python wrapping clearer and also...
[blender.git] / source / blender / bmesh / operators / bmo_primitive.c
index 5e7ebd87e43cb19f91f6c8f579370de2b07c4315..dc9b26cd665b159905c5d6afa4ed61a2d65ab43c 100644 (file)
@@ -234,7 +234,7 @@ void bmesh_create_grid_exec(BMesh *bm, BMOperator *op)
        if (tot < 2) tot = 2;
        if (seg < 2) seg = 2;
 
-       BMO_slot_mat4_set(op, "mat", mat);
+       BMO_slot_mat4_get(op, "mat", mat);
 
        /* one segment first: the X axis */
        phi = 1.0f;
@@ -246,7 +246,7 @@ void bmesh_create_grid_exec(BMesh *bm, BMOperator *op)
                mul_m4_v3(mat, vec);
 
                eve = BM_vert_create(bm, vec, NULL);
-               BM_elem_select_set(bm, eve, TRUE);
+               BMO_elem_flag_enable(bm, eve, VERT_MARK);
 
                if (a) {
                        e = BM_edge_create(bm, preveve, eve, NULL, TRUE);
@@ -296,7 +296,7 @@ void bmesh_create_uvsphere_exec(BMesh *bm, BMOperator *op)
        float phid, dia = BMO_slot_float_get(op, "diameter");
        int a, seg = BMO_slot_int_get(op, "segments"), tot = BMO_slot_int_get(op, "revolutions");
 
-       BMO_slot_mat4_set(op, "mat", mat);
+       BMO_slot_mat4_get(op, "mat", mat);
 
        phid = 2.0f * (float)M_PI / tot;
        phi = 0.25f * (float)M_PI;
@@ -378,13 +378,15 @@ void bmesh_create_uvsphere_exec(BMesh *bm, BMOperator *op)
 void bmesh_create_icosphere_exec(BMesh *bm, BMOperator *op)
 {
        BMVert *eva[12];
+       BMVert *v;
        BMIter liter;
+       BMIter viter;
        BMLoop *l;
        float vec[3], mat[4][4] /* , phi, phid */;
        float dia = BMO_slot_float_get(op, "diameter");
        int a, subdiv = BMO_slot_int_get(op, "subdivisions");
 
-       BMO_slot_mat4_set(op, "mat", mat);
+       BMO_slot_mat4_get(op, "mat", mat);
 
        /* phid = 2.0f * (float)M_PI / subdiv; */ /* UNUSED */
        /* phi = 0.25f * (float)M_PI; */         /* UNUSED */
@@ -396,8 +398,7 @@ void bmesh_create_icosphere_exec(BMesh *bm, BMOperator *op)
                vec[2] = dia * icovert[a][2];
                eva[a] = BM_vert_create(bm, vec, NULL);
 
-               mul_m4_v3(mat, eva[a]->co);
-               BM_elem_select_set(bm, eva[a], TRUE);
+               BMO_elem_flag_enable(bm, eva[a], VERT_MARK);
        }
 
        for (a = 0; a < 20; a++) {
@@ -431,6 +432,13 @@ void bmesh_create_icosphere_exec(BMesh *bm, BMOperator *op)
                BMO_op_finish(bm, &bmop);
        }
 
+       /* must transform after becayse of sphere subdivision */
+       BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+               if (BMO_elem_flag_test(bm, v, VERT_MARK)) {
+                       mul_m4_v3(mat, v->co);
+               }
+       }
+
        BMO_slot_from_flag(bm, op, "vertout", VERT_MARK, BM_VERT);
 }
 
@@ -441,7 +449,7 @@ void bmesh_create_monkey_exec(BMesh *bm, BMOperator *op)
        float mat[4][4];
        int i;
 
-       BMO_slot_mat4_set(op, "mat", mat);
+       BMO_slot_mat4_get(op, "mat", mat);
 
        for (i = 0; i < monkeynv; i++) {
                float v[3];
@@ -451,7 +459,10 @@ void bmesh_create_monkey_exec(BMesh *bm, BMOperator *op)
                tv[i] = BM_vert_create(bm, v, NULL);
                BMO_elem_flag_enable(bm, tv[i], VERT_MARK);
 
-               tv[monkeynv + i] = (fabsf(v[0] = -v[0]) < 0.001f) ? tv[i]: (eve = BM_vert_create(bm, v, NULL), mul_m4_v3(mat, eve->co), eve);
+               tv[monkeynv + i] = (fabsf(v[0] = -v[0]) < 0.001f) ?
+                           tv[i] :
+                           (eve = BM_vert_create(bm, v, NULL), mul_m4_v3(mat, eve->co), eve);
+
                BMO_elem_flag_enable(bm, tv[monkeynv + i], VERT_MARK);
 
                mul_m4_v3(mat, tv[i]->co);
@@ -484,14 +495,15 @@ void bmesh_create_circle_exec(BMesh *bm, BMOperator *op)
        BMVert *v1, *lastv1 = NULL, *cent1, *firstv1 = NULL;
        float vec[3], mat[4][4], phi, phid;
        float dia = BMO_slot_float_get(op, "diameter");
-       int cap_ends = BMO_slot_int_get(op, "cap_ends"), segs = BMO_slot_int_get(op, "segments");
-       int cap_tris = BMO_slot_int_get(op, "cap_tris");
+       int segs = BMO_slot_int_get(op, "segments");
+       int cap_ends = BMO_slot_bool_get(op, "cap_ends");
+       int cap_tris = BMO_slot_bool_get(op, "cap_tris");
        int a;
        
        if (!segs)
                return;
        
-       BMO_slot_mat4_set(op, "mat", mat);
+       BMO_slot_mat4_get(op, "mat", mat);
 
        phid = 2.0f * (float)M_PI / segs;
        phi = .25f * (float)M_PI;
@@ -556,14 +568,15 @@ void bmesh_create_cone_exec(BMesh *bm, BMOperator *op)
        float dia1 = BMO_slot_float_get(op, "diameter1");
        float dia2 = BMO_slot_float_get(op, "diameter2");
        float depth = BMO_slot_float_get(op, "depth");
-       int cap_ends = BMO_slot_int_get(op, "cap_ends"), segs = BMO_slot_int_get(op, "segments");
-       int cap_tris = BMO_slot_int_get(op, "cap_tris");
+       int segs = BMO_slot_int_get(op, "segments");
+       int cap_ends = BMO_slot_bool_get(op, "cap_ends");
+       int cap_tris = BMO_slot_bool_get(op, "cap_tris");
        int a;
        
        if (!segs)
                return;
        
-       BMO_slot_mat4_set(op, "mat", mat);
+       BMO_slot_mat4_get(op, "mat", mat);
 
        phid = 2.0f * (float)M_PI / segs;
        phi = 0.25f * (float)M_PI;
@@ -649,7 +662,7 @@ void bmesh_create_cube_exec(BMesh *bm, BMOperator *op)
        BMVert *v1, *v2, *v3, *v4, *v5, *v6, *v7, *v8;
        float vec[3], mat[4][4], off = BMO_slot_float_get(op, "size") / 2.0f;
 
-       BMO_slot_mat4_set(op, "mat", mat);
+       BMO_slot_mat4_get(op, "mat", mat);
 
        if (!off) off = 0.5f;