Differential D16893 Diff 59310 source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc
Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc
| Show First 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | |||||
| circle_edge_total(fill_type, verts_num), | circle_edge_total(fill_type, verts_num), | ||||
| 0, | 0, | ||||
| circle_corner_total(fill_type, verts_num), | circle_corner_total(fill_type, verts_num), | ||||
| circle_face_total(fill_type, verts_num)); | circle_face_total(fill_type, verts_num)); | ||||
| BKE_id_material_eval_ensure_default_slot(&mesh->id); | BKE_id_material_eval_ensure_default_slot(&mesh->id); | ||||
| MutableSpan<float3> positions = mesh->vert_positions_for_write(); | MutableSpan<float3> positions = mesh->vert_positions_for_write(); | ||||
| MutableSpan<MEdge> edges = mesh->edges_for_write(); | MutableSpan<MEdge> edges = mesh->edges_for_write(); | ||||
| MutableSpan<MPoly> polys = mesh->polys_for_write(); | MutableSpan<MPoly> polys = mesh->polys_for_write(); | ||||
| MutableSpan<MLoop> loops = mesh->loops_for_write(); | MutableSpan<int> corner_verts = mesh->corner_verts_for_write(); | ||||
| MutableSpan<int> corner_edges = mesh->corner_edges_for_write(); | |||||
| /* Assign vertex coordinates. */ | /* Assign vertex coordinates. */ | ||||
| const float angle_delta = 2.0f * (M_PI / float(verts_num)); | const float angle_delta = 2.0f * (M_PI / float(verts_num)); | ||||
| for (const int i : IndexRange(verts_num)) { | for (const int i : IndexRange(verts_num)) { | ||||
| const float angle = i * angle_delta; | const float angle = i * angle_delta; | ||||
| positions[i] = float3(std::cos(angle) * radius, std::sin(angle) * radius, 0.0f); | positions[i] = float3(std::cos(angle) * radius, std::sin(angle) * radius, 0.0f); | ||||
| } | } | ||||
| if (fill_type == GEO_NODE_MESH_CIRCLE_FILL_TRIANGLE_FAN) { | if (fill_type == GEO_NODE_MESH_CIRCLE_FILL_TRIANGLE_FAN) { | ||||
| Show All 17 Lines | |||||
| edge.flag = ME_EDGEDRAW; | edge.flag = ME_EDGEDRAW; | ||||
| } | } | ||||
| } | } | ||||
| /* Create corners and faces. */ | /* Create corners and faces. */ | ||||
| if (fill_type == GEO_NODE_MESH_CIRCLE_FILL_NGON) { | if (fill_type == GEO_NODE_MESH_CIRCLE_FILL_NGON) { | ||||
| MPoly &poly = polys[0]; | MPoly &poly = polys[0]; | ||||
| poly.loopstart = 0; | poly.loopstart = 0; | ||||
| poly.totloop = loops.size(); | poly.totloop = corner_verts.size(); | ||||
| for (const int i : IndexRange(verts_num)) { | std::iota(corner_verts.begin(), corner_verts.end(), 0); | ||||
| MLoop &loop = loops[i]; | std::iota(corner_edges.begin(), corner_edges.end(), 0); | ||||
| loop.e = i; | |||||
| loop.v = i; | |||||
| } | |||||
| } | } | ||||
| else if (fill_type == GEO_NODE_MESH_CIRCLE_FILL_TRIANGLE_FAN) { | else if (fill_type == GEO_NODE_MESH_CIRCLE_FILL_TRIANGLE_FAN) { | ||||
| for (const int i : IndexRange(verts_num)) { | for (const int i : IndexRange(verts_num)) { | ||||
| MPoly &poly = polys[i]; | MPoly &poly = polys[i]; | ||||
| poly.loopstart = 3 * i; | poly.loopstart = 3 * i; | ||||
| poly.totloop = 3; | poly.totloop = 3; | ||||
| MLoop &loop_a = loops[3 * i]; | corner_verts[3 * i] = i; | ||||
| loop_a.e = i; | corner_edges[3 * i] = i; | ||||
| loop_a.v = i; | |||||
| MLoop &loop_b = loops[3 * i + 1]; | corner_verts[3 * i + 1] = (i + 1) % verts_num; | ||||
| loop_b.e = verts_num + ((i + 1) % verts_num); | corner_edges[3 * i + 1] = verts_num + ((i + 1) % verts_num); | ||||
| loop_b.v = (i + 1) % verts_num; | |||||
| MLoop &loop_c = loops[3 * i + 2]; | corner_verts[3 * i + 2] = verts_num; | ||||
| loop_c.e = verts_num + i; | corner_edges[3 * i + 2] = verts_num + i; | ||||
| loop_c.v = verts_num; | |||||
| } | } | ||||
| } | } | ||||
| return mesh; | return mesh; | ||||
| } | } | ||||
| static void node_geo_exec(GeoNodeExecParams params) | static void node_geo_exec(GeoNodeExecParams params) | ||||
| { | { | ||||
| Show All 33 Lines | |||||