=bmesh=
[blender.git] / source / blender / bmesh / intern / bmesh_opdefines.c
index 35d69fbe9cde673bde6b94ef63e56c09b3a9a4d5..c949d730d8c5640c68d50592a292a5d664d2d6bd 100644 (file)
@@ -154,12 +154,13 @@ BMOpDefine def_reversefaces = {
 };
 
 /*
-  Edge Split
+  Edge Bisect
 
   Splits input edges (but doesn't do anything else).
+  This creates a 2-valence vert.
 */
-BMOpDefine def_edgesplit = {
-       "edgesplit",
+BMOpDefine def_edgebisect = {
+       "edgebisect",
        {{BMOP_OPSLOT_ELEMENT_BUF, "edges"}, //input edges
        {BMOP_OPSLOT_INT, "numcuts"}, //number of cuts
        {BMOP_OPSLOT_ELEMENT_BUF, "outsplit"}, //newly created vertices and edges
@@ -223,6 +224,22 @@ BMOpDefine def_removedoubles = {
        0,
 };
 
+/*
+  Auto Merge
+
+  Finds groups of vertices closer then dist and merges them together,
+  using the weld verts bmop.  The merges must go from a vert not in
+  verts to one in verts.
+*/
+BMOpDefine def_automerge = {
+       "automerge",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "verts"}, //input verts
+        {BMOP_OPSLOT_FLT,         "dist"}, //minimum distance
+        {0, /*null-terminating sentinel*/}},
+       bmesh_automerge_exec,
+       0,
+};
+
 /*
   Collapse Connected
 
@@ -323,6 +340,27 @@ BMOpDefine def_makevert = {
        0,
 };
 
+/*
+  Join Triangles
+
+  Tries to intelligently join triangles according 
+  to various settings and stuff.
+
+  */
+BMOpDefine def_join_triangles= {
+       "join_triangles",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "faces"}, //input geometry.
+        {BMOP_OPSLOT_ELEMENT_BUF, "faceout"}, //joined faces
+        {BMOP_OPSLOT_INT, "compare_sharp"},
+        {BMOP_OPSLOT_INT, "compare_uvs"},
+        {BMOP_OPSLOT_INT, "compare_vcols"},
+        {BMOP_OPSLOT_INT, "compare_materials"},
+        {BMOP_OPSLOT_FLT, "limit"},
+        {0, /*null-terminating sentinel*/}},
+       bmesh_jointriangles_exec,
+       0,
+};
+
 /*
   Contextual Create
 
@@ -343,16 +381,38 @@ BMOpDefine def_contextual_create= {
        0,
 };
 
-/*this may be unimplemented*/
 BMOpDefine def_edgenet_fill= {
        "edgenet_fill",
-       {{BMOP_OPSLOT_ELEMENT_BUF, "edges"},
-        {BMOP_OPSLOT_ELEMENT_BUF, "faceout"},
+       {{BMOP_OPSLOT_ELEMENT_BUF, "edges"}, /*input edges*/
+        {BMOP_OPSLOT_MAPPING,     "restrict"}, /*restricts edges to groups.  maps edges to integers*/
+        {BMOP_OPSLOT_INT,         "use_restrict"},
+        {BMOP_OPSLOT_ELEMENT_BUF, "excludefaces"}, /*list of faces to ignore for manifold checks*/
+        {BMOP_OPSLOT_MAPPING,     "faceout_groupmap"}, /*maps new faces to the group numbers they came from*/
+        {BMOP_OPSLOT_ELEMENT_BUF, "faceout"}, /*new faces*/
        {0, /*null-terminating sentinel*/}},
        bmesh_edgenet_fill_exec,
        0,
 };
 
+/*
+  Edgenet Prepare
+
+  Identifies several useful edge loop cases and modifies them so
+  they'll become a face when edgenet_fill is called.  The cases covered are:
+
+  * One single loop; an edge is added to connect the ends
+  * Two loops; two edges are added to connect the endpoints (based on the
+    shortest distance between each endpont).
+*/
+BMOpDefine def_edgenet_prepare= {
+       "edgenet_prepare",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "edges"}, //input edges
+        {BMOP_OPSLOT_ELEMENT_BUF, "edgeout"}, //new edges
+       {0, /*null-terminating sentinel*/}},
+       bmesh_edgenet_prepare,
+       0,
+};
+
 /*
   Rotate
 
@@ -384,6 +444,20 @@ BMOpDefine def_translate= {
        0,
 };
 
+/*
+  Scale
+
+  Scales vertices by an offset.
+*/
+BMOpDefine def_scale= {
+       "scale",
+       {{BMOP_OPSLOT_VEC, "vec"}, //scale factor
+       {BMOP_OPSLOT_ELEMENT_BUF, "verts"}, //input vertices
+       {0, /*null-terminating sentinel*/}},
+       bmesh_scale_exec,
+       0,
+};
+
 
 /*
   Transform
@@ -411,19 +485,36 @@ BMOpDefine def_object_load_bmesh = {
        {{BMOP_OPSLOT_PNT, "scene"},
        {BMOP_OPSLOT_PNT, "object"},
        {0, /*null-terminating sentinel*/}},
-       bmesh_to_mesh_exec,
+       object_load_bmesh_exec,
        0,
 };
 
 
+/*
+  BMesh to Mesh
+
+  Converts a bmesh to a Mesh.  This is reserved for exiting editmode.
+*/
+BMOpDefine def_bmesh_to_mesh = {
+       "bmesh_to_mesh",
+       {{BMOP_OPSLOT_PNT, "mesh"}, //pointer to a mesh structure to fill in
+        {BMOP_OPSLOT_PNT, "object"}, //pointer to an object structure
+        {BMOP_OPSLOT_INT, "notesselation"}, //don't calculate mfaces
+        {0, /*null-terminating sentinel*/}},
+       bmesh_to_mesh_exec,
+       0,
+};
+
 /*
   Mesh to BMesh
 
-  Load the contents of a mesh into the bmesh.
+  Load the contents of a mesh into the bmesh.  this bmop is private, it's
+  reserved exclusively for entering editmode.
 */
 BMOpDefine def_mesh_to_bmesh = {
        "mesh_to_bmesh",
        {{BMOP_OPSLOT_PNT, "mesh"}, //pointer to a Mesh structure
+        {BMOP_OPSLOT_PNT, "object"}, //pointer to an Object structure
         {0, /*null-terminating sentinel*/}},
        mesh_to_bmesh_exec,
        0
@@ -512,15 +603,6 @@ BMOpDefine def_extrudefaceregion = {
        0
 };
 
-BMOpDefine def_makefgonsop = {
-       "makefgon",
-       {{BMOP_OPSLOT_INT, "trifan"}, /*use triangle fans instead of 
-                                       real interpolation*/
-        {0} /*null-terminating sentinel*/},
-       bmesh_make_fgons_exec,
-       0
-};
-
 BMOpDefine def_dissolvevertsop = {
        "dissolveverts",
        {{BMOP_OPSLOT_ELEMENT_BUF, "verts"},
@@ -578,9 +660,10 @@ BMOpDefine def_subdop = {
        {BMOP_OPSLOT_MAPPING, "custompatterns"},
        {BMOP_OPSLOT_MAPPING, "edgepercents"},
        
-       /*these next two can have multiple types of elements in them.*/
+       /*these next three can have multiple types of elements in them.*/
        {BMOP_OPSLOT_ELEMENT_BUF, "outinner"},
        {BMOP_OPSLOT_ELEMENT_BUF, "outsplit"},
+       {BMOP_OPSLOT_ELEMENT_BUF, "geomout"}, /*contains all output geometry*/
 
        {BMOP_OPSLOT_INT, "quadcornertype"}, //quad corner type, see bmesh_operators.h
        {BMOP_OPSLOT_INT, "gridfill"}, //fill in fully-selected faces with a grid
@@ -592,22 +675,6 @@ BMOpDefine def_subdop = {
        0
 };
 
-BMOpDefine def_edit2bmesh = {
-       "editmesh_to_bmesh",
-       {{BMOP_OPSLOT_PNT, "em"}, {BMOP_OPSLOT_MAPPING, "map"},
-       {0} /*null-terminating sentinel*/},
-       edit2bmesh_exec,
-       0
-};
-
-BMOpDefine def_bmesh2edit = {
-       "bmesh_to_editmesh",
-       {{BMOP_OPSLOT_PNT, "emout"},
-       {0} /*null-terminating sentinel*/},
-       bmesh2edit_exec,
-       0
-};
-
 BMOpDefine def_delop = {
        "del",
        {{BMOP_OPSLOT_ELEMENT_BUF, "geom"}, {BMOP_OPSLOT_INT, "context"},
@@ -626,6 +693,7 @@ BMOpDefine def_dupeop = {
        {BMOP_OPSLOT_MAPPING, "facemap"},
        {BMOP_OPSLOT_MAPPING, "boundarymap"},
        {BMOP_OPSLOT_MAPPING, "isovertmap"},
+       {BMOP_OPSLOT_PNT, "dest"}, /*destination bmesh, if NULL will use current one*/
        {0} /*null-terminating sentinel*/},
        dupeop_exec,
        0
@@ -637,15 +705,16 @@ BMOpDefine def_splitop = {
        {BMOP_OPSLOT_ELEMENT_BUF, "geomout"},
        {BMOP_OPSLOT_MAPPING, "boundarymap"},
        {BMOP_OPSLOT_MAPPING, "isovertmap"},
+       {BMOP_OPSLOT_PNT, "dest"}, /*destination bmesh, if NULL will use current one*/
        {0} /*null-terminating sentinel*/},
        splitop_exec,
        0
 };
 
 /*
-  Similar faces select
+  Similar faces search
 
-  Select similar faces (area/material/perimeter....).
+  Find similar faces (area/material/perimeter....).
 */
 BMOpDefine def_similarfaces = {
        "similarfaces",
@@ -659,9 +728,9 @@ BMOpDefine def_similarfaces = {
 };
 
 /*
-  Similar edges select
+  Similar edges search
 
-  Select similar edges (length, direction, edge, seam,....).
+  Find similar edges (length, direction, edge, seam,....).
 */
 BMOpDefine def_similaredges = {
        "similaredges",
@@ -675,9 +744,9 @@ BMOpDefine def_similaredges = {
 };
 
 /*
-  Similar vertices select
+  Similar vertices search
 
-  Select similar vertices (normal, face, vertex group,....).
+  Find similar vertices (normal, face, vertex group,....).
 */
 BMOpDefine def_similarverts = {
        "similarverts",
@@ -690,19 +759,211 @@ BMOpDefine def_similarverts = {
        0
 };
 
+/*
+** uv rotation
+** cycle the uvs
+*/
+BMOpDefine def_meshrotateuvs = {
+       "meshrotateuvs",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "faces"}, /* input faces */
+        {BMOP_OPSLOT_INT, "dir"},                      /* direction */
+        {0} /*null-terminating sentinel*/},
+       bmesh_rotateuvs_exec,
+       0
+};
+
+/*
+** uv reverse
+** reverse the uvs
+*/
+BMOpDefine def_meshreverseuvs = {
+       "meshreverseuvs",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "faces"}, /* input faces */
+        {0} /*null-terminating sentinel*/},
+       bmesh_reverseuvs_exec,
+       0
+};
+
+/*
+** color rotation
+** cycle the colors
+*/
+BMOpDefine def_meshrotatecolors = {
+       "meshrotatecolors",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "faces"}, /* input faces */
+        {BMOP_OPSLOT_INT, "dir"},                      /* direction */
+        {0} /*null-terminating sentinel*/},
+       bmesh_rotatecolors_exec,
+       0
+};
+
+/*
+** color reverse
+** reverse the colors
+*/
+BMOpDefine def_meshreversecolors = {
+       "meshreversecolors",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "faces"}, /* input faces */
+        {0} /*null-terminating sentinel*/},
+       bmesh_reversecolors_exec,
+       0
+};
+
+/*
+  Similar vertices search
+
+  Find similar vertices (normal, face, vertex group,....).
+*/
+BMOpDefine def_vertexshortestpath = {
+       "vertexshortestpath",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "startv"}, /* start vertex */
+        {BMOP_OPSLOT_ELEMENT_BUF, "endv"}, /* end vertex */
+        {BMOP_OPSLOT_ELEMENT_BUF, "vertout"}, /* output vertices */
+        {BMOP_OPSLOT_INT, "type"},                     /* type of selection */
+        {0} /*null-terminating sentinel*/},
+       bmesh_vertexshortestpath_exec,
+       0
+};
+
+/*
+  Edge Split
+
+  Disconnects faces along input edges.
+ */
+BMOpDefine def_edgesplit = {
+       "edgesplit",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "edges"}, /* input edges */
+        {BMOP_OPSLOT_ELEMENT_BUF, "edgeout1"}, /* old output disconnected edges */
+        {BMOP_OPSLOT_ELEMENT_BUF, "edgeout2"}, /* new output disconnected edges */
+        {0} /*null-terminating sentinel*/},
+       bmesh_edgesplitop_exec,
+       0
+};
+
+/*
+  Create Grid
+
+  Creates a grid with a variable number of subdivisions
+*/
+BMOpDefine def_create_grid = {
+       "create_grid",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "vertout"}, //output verts
+        {BMOP_OPSLOT_INT,         "xsegments"}, //number of x segments
+        {BMOP_OPSLOT_INT,         "ysegments"}, //number of y segments
+        {BMOP_OPSLOT_FLT,         "size"}, //size of the grid
+        {BMOP_OPSLOT_MAT,         "mat"}, //matrix to multiply the new geometry with
+        {0, /*null-terminating sentinel*/}},
+       bmesh_create_grid_exec,
+       0,
+};
+
+/*
+  Create UV Sphere
+
+  Creates a grid with a variable number of subdivisions
+*/
+BMOpDefine def_create_uvsphere = {
+       "create_uvsphere",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "vertout"}, //output verts
+        {BMOP_OPSLOT_INT,         "segments"}, //number of u segments
+        {BMOP_OPSLOT_INT,         "revolutions"}, //number of v segment
+        {BMOP_OPSLOT_FLT,         "diameter"}, //diameter
+        {BMOP_OPSLOT_MAT,         "mat"}, //matrix to multiply the new geometry with--
+        {0, /*null-terminating sentinel*/}},
+       bmesh_create_uvsphere_exec,
+       0,
+};
+
+/*
+  Create Ico Sphere
+
+  Creates a grid with a variable number of subdivisions
+*/
+BMOpDefine def_create_icosphere = {
+       "create_icosphere",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "vertout"}, //output verts
+        {BMOP_OPSLOT_INT,         "subdivisions"}, //how many times to recursively subdivide the sphere
+        {BMOP_OPSLOT_FLT,       "diameter"}, //diameter
+        {BMOP_OPSLOT_MAT, "mat"}, //matrix to multiply the new geometry with
+        {0, /*null-terminating sentinel*/}},
+       bmesh_create_icosphere_exec,
+       0,
+};
+
+/*
+  Create Suzanne
+
+  Creates a monkey.  Be wary.
+*/
+BMOpDefine def_create_monkey = {
+       "create_monkey",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "vertout"}, //output verts
+        {BMOP_OPSLOT_MAT, "mat"}, //matrix to multiply the new geometry with--
+        {0, /*null-terminating sentinel*/}},
+       bmesh_create_monkey_exec,
+       0,
+};
+
+/*
+  Create Cone
+
+  Creates a cone with variable depth at both ends
+*/
+BMOpDefine def_create_cone = {
+       "create_cone",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "vertout"}, //output verts
+        {BMOP_OPSLOT_INT, "cap_ends"}, //wheter or not to fill in the ends with faces
+        {BMOP_OPSLOT_INT, "segments"},
+        {BMOP_OPSLOT_FLT, "diameter1"}, //diameter of one end
+        {BMOP_OPSLOT_FLT, "diameter2"}, //diameter of the opposite
+        {BMOP_OPSLOT_FLT, "depth"}, //distance between ends
+        {BMOP_OPSLOT_MAT, "mat"}, //matrix to multiply the new geometry with--
+        {0, /*null-terminating sentinel*/}},
+       bmesh_create_cone_exec,
+       0,
+};
+
+/*
+  Create Cone
+
+  Creates a cone with variable depth at both ends
+*/
+BMOpDefine def_create_cube = {
+       "create_cube",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "vertout"}, //output verts
+        {BMOP_OPSLOT_FLT, "size"}, //size of the cube
+        {BMOP_OPSLOT_MAT, "mat"}, //matrix to multiply the new geometry with--
+        {0, /*null-terminating sentinel*/}},
+       bmesh_create_cube_exec,
+       0,
+};
+
+/*
+  Bevel
+
+  Bevels edges and vertices
+ */
+BMOpDefine def_bevel = {
+       "bevel",
+       {{BMOP_OPSLOT_ELEMENT_BUF, "geom"}, /* input edges and vertices */
+        {BMOP_OPSLOT_ELEMENT_BUF, "face_spans"}, /* new geometry */
+        {BMOP_OPSLOT_ELEMENT_BUF, "face_holes"}, /* new geometry */
+        {BMOP_OPSLOT_FLT, "percent"}, /* percentage to expand bevelled edges*/
+        {0} /*null-terminating sentinel*/},
+       bmesh_bevel_exec,
+       0
+};
+
 BMOpDefine *opdefines[] = {
        &def_splitop,
        &def_dupeop,
        &def_delop,
-       &def_edit2bmesh,
-       &def_bmesh2edit,
        &def_subdop,
        &def_triangop,
        &def_dissolvefacesop,
        &def_dissolveedgessop,
        &def_dissolveedgeloopsop,
        &def_dissolvevertsop,
-       &def_makefgonsop,
        &def_extrudefaceregion,
        &def_connectverts,
        //&def_makeprim,
@@ -719,7 +980,7 @@ BMOpDefine *opdefines[] = {
        &def_removedoubles,
        &def_finddoubles,
        &def_mirror,
-       &def_edgesplit,
+       &def_edgebisect,
        &def_reversefaces,
        &def_edgerotate,
        &def_regionextend,
@@ -735,6 +996,24 @@ BMOpDefine *opdefines[] = {
        &def_similarverts,
        &def_pointmerge_facedata,
        &def_vert_average_facedata,
+       &def_meshrotateuvs,
+       &def_bmesh_to_mesh,
+       &def_meshreverseuvs,
+       &def_edgenet_prepare,
+       &def_meshrotatecolors,
+       &def_meshreversecolors,
+       &def_vertexshortestpath,
+       &def_scale,
+       &def_edgesplit,
+       &def_automerge,
+       &def_create_uvsphere,
+       &def_create_grid,
+       &def_create_icosphere,
+       &def_create_monkey,
+       &def_create_cone,
+       &def_create_cube,
+       &def_join_triangles,
+       &def_bevel,
 };
 
 int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*));