Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2015-12-05 01:49:55 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2015-12-05 01:49:55 +0300
commit3c6709a63c267dc3cb3898efd9d6466c2300876c (patch)
tree522d9cd6f83c09f9a9ba92b858b307cc0b073867 /source/blender/editors/mesh/editmesh_add.c
parent24be453938c49cd45d910a8ad0ee144fddd843ee (diff)
Fix T37879: Default UV generation for mesh primitives.
Adds default-generated UVs to mesh primitives (cone, cylinder, icosphere, uvsphere, cube, circle, grid) when they are added to the scene, since some of them can be pretty awkward to unwrap manually. Original patch: Liam Mitchell (CommanderCorianderSalamander). Main review work: Campbell Barton (campbellbarton). Finalization, fixes and cleanup: Bastien Montagne (mont29). Reviewers: mont29, #mesh_modeling, campbellbarton Reviewed By: mont29, campbellbarton Subscribers: lkruel, campbellbarton, michaelknubben, kevindietrich Maniphest Tasks: T37879 Differential Revision: https://developer.blender.org/D481
Diffstat (limited to 'source/blender/editors/mesh/editmesh_add.c')
-rw-r--r--source/blender/editors/mesh/editmesh_add.c82
1 files changed, 66 insertions, 16 deletions
diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c
index 49383356b75..b0369c6f5ad 100644
--- a/source/blender/editors/mesh/editmesh_add.c
+++ b/source/blender/editors/mesh/editmesh_add.c
@@ -29,6 +29,7 @@
* \ingroup edmesh
*/
+#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -49,6 +50,7 @@
#include "ED_mesh.h"
#include "ED_screen.h"
#include "ED_object.h"
+#include "ED_uvedit.h"
#include "mesh_intern.h" /* own include */
@@ -105,16 +107,21 @@ static int add_primitive_plane_exec(bContext *C, wmOperator *op)
bool enter_editmode;
bool was_editmode;
unsigned int layer;
+ const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Plane"), &dia, mat, &was_editmode, loc, rot, layer);
em = BKE_editmesh_from_object(obedit);
+ if (calc_uvs && !ED_uvedit_test(obedit)) {
+ ED_mesh_uv_texture_add(obedit->data, NULL, true);
+ }
+
if (!EDBM_op_call_and_selectf(
em, op, "verts.out", false,
- "create_grid x_segments=%i y_segments=%i size=%f matrix=%m4",
- 1, 1, RNA_float_get(op->ptr, "radius"), mat))
+ "create_grid x_segments=%i y_segments=%i size=%f matrix=%m4 calc_uvs=%b",
+ 1, 1, RNA_float_get(op->ptr, "radius"), mat, calc_uvs))
{
return OPERATOR_CANCELLED;
}
@@ -139,6 +146,7 @@ void MESH_OT_primitive_plane_add(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
ED_object_add_unit_props(ot);
+ ED_object_add_mesh_props(ot);
ED_object_add_generic_props(ot, true);
}
@@ -150,16 +158,21 @@ static int add_primitive_cube_exec(bContext *C, wmOperator *op)
bool enter_editmode;
bool was_editmode;
unsigned int layer;
+ const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Cube"), &dia, mat, &was_editmode, loc, rot, layer);
em = BKE_editmesh_from_object(obedit);
+ if (calc_uvs && !ED_uvedit_test(obedit)) {
+ ED_mesh_uv_texture_add(obedit->data, NULL, true);
+ }
+
if (!EDBM_op_call_and_selectf(
em, op, "verts.out", false,
- "create_cube matrix=%m4 size=%f",
- mat, RNA_float_get(op->ptr, "radius") * 2.0f))
+ "create_cube matrix=%m4 size=%f calc_uvs=%b",
+ mat, RNA_float_get(op->ptr, "radius") * 2.0f, calc_uvs))
{
return OPERATOR_CANCELLED;
}
@@ -185,6 +198,7 @@ void MESH_OT_primitive_cube_add(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
ED_object_add_unit_props(ot);
+ ED_object_add_mesh_props(ot);
ED_object_add_generic_props(ot, true);
}
@@ -203,6 +217,7 @@ static int add_primitive_circle_exec(bContext *C, wmOperator *op)
int cap_end, cap_tri;
unsigned int layer;
bool was_editmode;
+ const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
cap_end = RNA_enum_get(op->ptr, "fill_type");
cap_tri = (cap_end == 2);
@@ -212,11 +227,15 @@ static int add_primitive_circle_exec(bContext *C, wmOperator *op)
obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Circle"), &dia, mat, &was_editmode, loc, rot, layer);
em = BKE_editmesh_from_object(obedit);
+ if (calc_uvs && !ED_uvedit_test(obedit)) {
+ ED_mesh_uv_texture_add(obedit->data, NULL, true);
+ }
+
if (!EDBM_op_call_and_selectf(
em, op, "verts.out", false,
- "create_circle segments=%i diameter=%f cap_ends=%b cap_tris=%b matrix=%m4",
+ "create_circle segments=%i diameter=%f cap_ends=%b cap_tris=%b matrix=%m4 calc_uvs=%b",
RNA_int_get(op->ptr, "vertices"), RNA_float_get(op->ptr, "radius"),
- cap_end, cap_tri, mat))
+ cap_end, cap_tri, mat, calc_uvs))
{
return OPERATOR_CANCELLED;
}
@@ -245,6 +264,7 @@ void MESH_OT_primitive_circle_add(wmOperatorType *ot)
ED_object_add_unit_props(ot);
RNA_def_enum(ot->srna, "fill_type", fill_type_items, 0, "Fill Type", "");
+ ED_object_add_mesh_props(ot);
ED_object_add_generic_props(ot, true);
}
@@ -259,20 +279,25 @@ static int add_primitive_cylinder_exec(bContext *C, wmOperator *op)
const int end_fill_type = RNA_enum_get(op->ptr, "end_fill_type");
const bool cap_end = (end_fill_type != 0);
const bool cap_tri = (end_fill_type == 2);
+ const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Cylinder"), &dia, mat, &was_editmode, loc, rot, layer);
em = BKE_editmesh_from_object(obedit);
+ if (calc_uvs && !ED_uvedit_test(obedit)) {
+ ED_mesh_uv_texture_add(obedit->data, NULL, true);
+ }
+
if (!EDBM_op_call_and_selectf(
em, op, "verts.out", false,
- "create_cone segments=%i diameter1=%f diameter2=%f cap_ends=%b cap_tris=%b depth=%f matrix=%m4",
+ "create_cone segments=%i diameter1=%f diameter2=%f cap_ends=%b cap_tris=%b depth=%f matrix=%m4 calc_uvs=%b",
RNA_int_get(op->ptr, "vertices"),
RNA_float_get(op->ptr, "radius"),
RNA_float_get(op->ptr, "radius"),
cap_end, cap_tri,
- RNA_float_get(op->ptr, "depth"), mat))
+ RNA_float_get(op->ptr, "depth"), mat, calc_uvs))
{
return OPERATOR_CANCELLED;
}
@@ -302,6 +327,7 @@ void MESH_OT_primitive_cylinder_add(wmOperatorType *ot)
RNA_def_float_distance(ot->srna, "depth", 2.0f, 0.0, OBJECT_ADD_SIZE_MAXF, "Depth", "", 0.001, 100.00);
RNA_def_enum(ot->srna, "end_fill_type", fill_type_items, 1, "Cap Fill Type", "");
+ ED_object_add_mesh_props(ot);
ED_object_add_generic_props(ot, true);
}
@@ -316,17 +342,22 @@ static int add_primitive_cone_exec(bContext *C, wmOperator *op)
const int end_fill_type = RNA_enum_get(op->ptr, "end_fill_type");
const bool cap_end = (end_fill_type != 0);
const bool cap_tri = (end_fill_type == 2);
+ const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Cone"), &dia, mat, &was_editmode, loc, rot, layer);
em = BKE_editmesh_from_object(obedit);
+ if (calc_uvs && !ED_uvedit_test(obedit)) {
+ ED_mesh_uv_texture_add(obedit->data, NULL, true);
+ }
+
if (!EDBM_op_call_and_selectf(
em, op, "verts.out", false,
- "create_cone segments=%i diameter1=%f diameter2=%f cap_ends=%b cap_tris=%b depth=%f matrix=%m4",
+ "create_cone segments=%i diameter1=%f diameter2=%f cap_ends=%b cap_tris=%b depth=%f matrix=%m4 calc_uvs=%b",
RNA_int_get(op->ptr, "vertices"), RNA_float_get(op->ptr, "radius1"),
- RNA_float_get(op->ptr, "radius2"), cap_end, cap_tri, RNA_float_get(op->ptr, "depth"), mat))
+ RNA_float_get(op->ptr, "radius2"), cap_end, cap_tri, RNA_float_get(op->ptr, "depth"), mat, calc_uvs))
{
return OPERATOR_CANCELLED;
}
@@ -357,6 +388,7 @@ void MESH_OT_primitive_cone_add(wmOperatorType *ot)
RNA_def_float_distance(ot->srna, "depth", 2.0f, 0.0, OBJECT_ADD_SIZE_MAXF, "Depth", "", 0.001, 100.00);
RNA_def_enum(ot->srna, "end_fill_type", fill_type_items, 1, "Base Fill Type", "");
+ ED_object_add_mesh_props(ot);
ED_object_add_generic_props(ot, true);
}
@@ -368,18 +400,23 @@ static int add_primitive_grid_exec(bContext *C, wmOperator *op)
bool enter_editmode;
bool was_editmode;
unsigned int layer;
+ const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Grid"), &dia, mat, &was_editmode, loc, rot, layer);
em = BKE_editmesh_from_object(obedit);
+ if (calc_uvs && !ED_uvedit_test(obedit)) {
+ ED_mesh_uv_texture_add(obedit->data, NULL, true);
+ }
+
if (!EDBM_op_call_and_selectf(
em, op, "verts.out", false,
- "create_grid x_segments=%i y_segments=%i size=%f matrix=%m4",
+ "create_grid x_segments=%i y_segments=%i size=%f matrix=%m4 calc_uvs=%b",
RNA_int_get(op->ptr, "x_subdivisions"),
RNA_int_get(op->ptr, "y_subdivisions"),
- RNA_float_get(op->ptr, "radius"), mat))
+ RNA_float_get(op->ptr, "radius"), mat, calc_uvs))
{
return OPERATOR_CANCELLED;
}
@@ -410,6 +447,7 @@ void MESH_OT_primitive_grid_add(wmOperatorType *ot)
RNA_def_int(ot->srna, "y_subdivisions", 10, 2, MESH_ADD_VERTS_MAXI, "Y Subdivisions", "", 2, 1000);
ED_object_add_unit_props(ot);
+ ED_object_add_mesh_props(ot);
ED_object_add_generic_props(ot, true);
}
@@ -471,17 +509,22 @@ static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op)
bool enter_editmode;
bool was_editmode;
unsigned int layer;
+ const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Sphere"), &dia, mat, &was_editmode, loc, rot, layer);
em = BKE_editmesh_from_object(obedit);
+ if (calc_uvs && !ED_uvedit_test(obedit)) {
+ ED_mesh_uv_texture_add(obedit->data, NULL, true);
+ }
+
if (!EDBM_op_call_and_selectf(
em, op, "verts.out", false,
- "create_uvsphere u_segments=%i v_segments=%i diameter=%f matrix=%m4",
+ "create_uvsphere u_segments=%i v_segments=%i diameter=%f matrix=%m4 calc_uvs=%b",
RNA_int_get(op->ptr, "segments"), RNA_int_get(op->ptr, "ring_count"),
- RNA_float_get(op->ptr, "size"), mat))
+ RNA_float_get(op->ptr, "size"), mat, calc_uvs))
{
return OPERATOR_CANCELLED;
}
@@ -510,6 +553,7 @@ void MESH_OT_primitive_uv_sphere_add(wmOperatorType *ot)
RNA_def_int(ot->srna, "ring_count", 16, 3, MESH_ADD_VERTS_MAXI / 100, "Rings", "", 3, 500);
RNA_def_float_distance(ot->srna, "size", 1.0f, 0.0, OBJECT_ADD_SIZE_MAXF, "Size", "", 0.001, 100.00);
+ ED_object_add_mesh_props(ot);
ED_object_add_generic_props(ot, true);
}
@@ -521,17 +565,22 @@ static int add_primitive_icosphere_exec(bContext *C, wmOperator *op)
bool enter_editmode;
bool was_editmode;
unsigned int layer;
+ const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Icosphere"), &dia, mat, &was_editmode, loc, rot, layer);
em = BKE_editmesh_from_object(obedit);
+ if (calc_uvs && !ED_uvedit_test(obedit)) {
+ ED_mesh_uv_texture_add(obedit->data, NULL, true);
+ }
+
if (!EDBM_op_call_and_selectf(
em, op, "verts.out", false,
- "create_icosphere subdivisions=%i diameter=%f matrix=%m4",
+ "create_icosphere subdivisions=%i diameter=%f matrix=%m4 calc_uvs=%b",
RNA_int_get(op->ptr, "subdivisions"),
- RNA_float_get(op->ptr, "size"), mat))
+ RNA_float_get(op->ptr, "size"), mat, calc_uvs))
{
return OPERATOR_CANCELLED;
}
@@ -559,5 +608,6 @@ void MESH_OT_primitive_ico_sphere_add(wmOperatorType *ot)
RNA_def_int(ot->srna, "subdivisions", 2, 1, 10, "Subdivisions", "", 1, 8);
RNA_def_float_distance(ot->srna, "size", 1.0f, 0.0f, OBJECT_ADD_SIZE_MAXF, "Size", "", 0.001f, 100.00);
+ ED_object_add_mesh_props(ot);
ED_object_add_generic_props(ot, true);
}