Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
| Show First 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | |||||
| edge.v1 = config.last_ring_verts_start + i; | edge.v1 = config.last_ring_verts_start + i; | ||||
| edge.v2 = config.last_vert; | edge.v2 = config.last_vert; | ||||
| edge.flag = ME_EDGEDRAW; | edge.flag = ME_EDGEDRAW; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void calculate_cone_faces(const ConeConfig &config, | static void calculate_cone_faces(const ConeConfig &config, | ||||
| MutableSpan<MLoop> loops, | MutableSpan<int> corner_verts, | ||||
| MutableSpan<int> corner_edges, | |||||
| MutableSpan<MPoly> polys) | MutableSpan<MPoly> polys) | ||||
| { | { | ||||
| int rings_poly_start = 0; | int rings_poly_start = 0; | ||||
| int rings_loop_start = 0; | int rings_loop_start = 0; | ||||
| if (config.top_has_center_vert) { | if (config.top_has_center_vert) { | ||||
| rings_poly_start = config.circle_segments; | rings_poly_start = config.circle_segments; | ||||
| rings_loop_start = config.circle_segments * 3; | rings_loop_start = config.circle_segments * 3; | ||||
| /* Top cone tip or center triangle fan in the fill. */ | /* Top cone tip or center triangle fan in the fill. */ | ||||
| const int top_center_vert = 0; | const int top_center_vert = 0; | ||||
| const int top_fan_edges_start = 0; | const int top_fan_edges_start = 0; | ||||
| for (const int i : IndexRange(config.circle_segments)) { | for (const int i : IndexRange(config.circle_segments)) { | ||||
| const int loop_start = i * 3; | const int loop_start = i * 3; | ||||
| MPoly &poly = polys[i]; | MPoly &poly = polys[i]; | ||||
| poly.loopstart = loop_start; | poly.loopstart = loop_start; | ||||
| poly.totloop = 3; | poly.totloop = 3; | ||||
| loops[loop_start + 0].v = config.first_ring_verts_start + i; | corner_verts[loop_start + 0] = config.first_ring_verts_start + i; | ||||
| loops[loop_start + 0].e = config.first_ring_edges_start + i; | corner_edges[loop_start + 0] = config.first_ring_edges_start + i; | ||||
| loops[loop_start + 1].v = config.first_ring_verts_start + ((i + 1) % config.circle_segments); | corner_verts[loop_start + 1] = config.first_ring_verts_start + | ||||
| loops[loop_start + 1].e = top_fan_edges_start + ((i + 1) % config.circle_segments); | ((i + 1) % config.circle_segments); | ||||
| corner_edges[loop_start + 1] = top_fan_edges_start + ((i + 1) % config.circle_segments); | |||||
| loops[loop_start + 2].v = top_center_vert; | corner_verts[loop_start + 2] = top_center_vert; | ||||
| loops[loop_start + 2].e = top_fan_edges_start + i; | corner_edges[loop_start + 2] = top_fan_edges_start + i; | ||||
| } | } | ||||
| } | } | ||||
| else if (config.fill_type == GEO_NODE_MESH_CIRCLE_FILL_NGON) { | else if (config.fill_type == GEO_NODE_MESH_CIRCLE_FILL_NGON) { | ||||
| rings_poly_start = 1; | rings_poly_start = 1; | ||||
| rings_loop_start = config.circle_segments; | rings_loop_start = config.circle_segments; | ||||
| /* Center n-gon in the fill. */ | /* Center n-gon in the fill. */ | ||||
| MPoly &poly = polys[0]; | MPoly &poly = polys[0]; | ||||
| poly.loopstart = 0; | poly.loopstart = 0; | ||||
| poly.totloop = config.circle_segments; | poly.totloop = config.circle_segments; | ||||
| for (const int i : IndexRange(config.circle_segments)) { | for (const int i : IndexRange(config.circle_segments)) { | ||||
| loops[i].v = i; | corner_verts[i] = i; | ||||
| loops[i].e = i; | corner_edges[i] = i; | ||||
| } | } | ||||
| } | } | ||||
| /* Quads connect one edge ring to the next one. */ | /* Quads connect one edge ring to the next one. */ | ||||
| for (const int i : IndexRange(config.tot_quad_rings)) { | for (const int i : IndexRange(config.tot_quad_rings)) { | ||||
| const int this_ring_poly_start = rings_poly_start + i * config.circle_segments; | const int this_ring_poly_start = rings_poly_start + i * config.circle_segments; | ||||
| const int this_ring_loop_start = rings_loop_start + i * config.circle_segments * 4; | const int this_ring_loop_start = rings_loop_start + i * config.circle_segments * 4; | ||||
| const int this_ring_vert_start = config.first_ring_verts_start + (i * config.circle_segments); | const int this_ring_vert_start = config.first_ring_verts_start + (i * config.circle_segments); | ||||
| const int next_ring_vert_start = this_ring_vert_start + config.circle_segments; | const int next_ring_vert_start = this_ring_vert_start + config.circle_segments; | ||||
| const int this_ring_edges_start = config.first_ring_edges_start + | const int this_ring_edges_start = config.first_ring_edges_start + | ||||
| (i * 2 * config.circle_segments); | (i * 2 * config.circle_segments); | ||||
| const int next_ring_edges_start = this_ring_edges_start + (2 * config.circle_segments); | const int next_ring_edges_start = this_ring_edges_start + (2 * config.circle_segments); | ||||
| const int ring_connections_start = this_ring_edges_start + config.circle_segments; | const int ring_connections_start = this_ring_edges_start + config.circle_segments; | ||||
| for (const int j : IndexRange(config.circle_segments)) { | for (const int j : IndexRange(config.circle_segments)) { | ||||
| const int loop_start = this_ring_loop_start + j * 4; | const int loop_start = this_ring_loop_start + j * 4; | ||||
| MPoly &poly = polys[this_ring_poly_start + j]; | MPoly &poly = polys[this_ring_poly_start + j]; | ||||
| poly.loopstart = loop_start; | poly.loopstart = loop_start; | ||||
| poly.totloop = 4; | poly.totloop = 4; | ||||
| loops[loop_start + 0].v = this_ring_vert_start + j; | corner_verts[loop_start + 0] = this_ring_vert_start + j; | ||||
| loops[loop_start + 0].e = ring_connections_start + j; | corner_edges[loop_start + 0] = ring_connections_start + j; | ||||
| loops[loop_start + 1].v = next_ring_vert_start + j; | corner_verts[loop_start + 1] = next_ring_vert_start + j; | ||||
| loops[loop_start + 1].e = next_ring_edges_start + j; | corner_edges[loop_start + 1] = next_ring_edges_start + j; | ||||
| loops[loop_start + 2].v = next_ring_vert_start + ((j + 1) % config.circle_segments); | corner_verts[loop_start + 2] = next_ring_vert_start + ((j + 1) % config.circle_segments); | ||||
| loops[loop_start + 2].e = ring_connections_start + ((j + 1) % config.circle_segments); | corner_edges[loop_start + 2] = ring_connections_start + ((j + 1) % config.circle_segments); | ||||
| loops[loop_start + 3].v = this_ring_vert_start + ((j + 1) % config.circle_segments); | corner_verts[loop_start + 3] = this_ring_vert_start + ((j + 1) % config.circle_segments); | ||||
| loops[loop_start + 3].e = this_ring_edges_start + j; | corner_edges[loop_start + 3] = this_ring_edges_start + j; | ||||
| } | } | ||||
| } | } | ||||
| const int bottom_poly_start = rings_poly_start + config.tot_quad_rings * config.circle_segments; | const int bottom_poly_start = rings_poly_start + config.tot_quad_rings * config.circle_segments; | ||||
| const int bottom_loop_start = rings_loop_start + | const int bottom_loop_start = rings_loop_start + | ||||
| config.tot_quad_rings * config.circle_segments * 4; | config.tot_quad_rings * config.circle_segments * 4; | ||||
| if (config.bottom_has_center_vert) { | if (config.bottom_has_center_vert) { | ||||
| /* Bottom cone tip or center triangle fan in the fill. */ | /* Bottom cone tip or center triangle fan in the fill. */ | ||||
| for (const int i : IndexRange(config.circle_segments)) { | for (const int i : IndexRange(config.circle_segments)) { | ||||
| const int loop_start = bottom_loop_start + i * 3; | const int loop_start = bottom_loop_start + i * 3; | ||||
| MPoly &poly = polys[bottom_poly_start + i]; | MPoly &poly = polys[bottom_poly_start + i]; | ||||
| poly.loopstart = loop_start; | poly.loopstart = loop_start; | ||||
| poly.totloop = 3; | poly.totloop = 3; | ||||
| loops[loop_start + 0].v = config.last_ring_verts_start + i; | corner_verts[loop_start + 0] = config.last_ring_verts_start + i; | ||||
| loops[loop_start + 0].e = config.last_fan_edges_start + i; | corner_edges[loop_start + 0] = config.last_fan_edges_start + i; | ||||
| loops[loop_start + 1].v = config.last_vert; | corner_verts[loop_start + 1] = config.last_vert; | ||||
| loops[loop_start + 1].e = config.last_fan_edges_start + (i + 1) % config.circle_segments; | corner_edges[loop_start + 1] = config.last_fan_edges_start + | ||||
| (i + 1) % config.circle_segments; | |||||
| loops[loop_start + 2].v = config.last_ring_verts_start + (i + 1) % config.circle_segments; | corner_verts[loop_start + 2] = config.last_ring_verts_start + | ||||
| loops[loop_start + 2].e = config.last_ring_edges_start + i; | (i + 1) % config.circle_segments; | ||||
| corner_edges[loop_start + 2] = config.last_ring_edges_start + i; | |||||
| } | } | ||||
| } | } | ||||
| else if (config.fill_type == GEO_NODE_MESH_CIRCLE_FILL_NGON) { | else if (config.fill_type == GEO_NODE_MESH_CIRCLE_FILL_NGON) { | ||||
| /* Center n-gon in the fill. */ | /* Center n-gon in the fill. */ | ||||
| MPoly &poly = polys[bottom_poly_start]; | MPoly &poly = polys[bottom_poly_start]; | ||||
| poly.loopstart = bottom_loop_start; | poly.loopstart = bottom_loop_start; | ||||
| poly.totloop = config.circle_segments; | poly.totloop = config.circle_segments; | ||||
| for (const int i : IndexRange(config.circle_segments)) { | for (const int i : IndexRange(config.circle_segments)) { | ||||
| /* Go backwards to reverse surface normal. */ | /* Go backwards to reverse surface normal. */ | ||||
| loops[bottom_loop_start + i].v = config.last_vert - i; | corner_verts[bottom_loop_start + i] = config.last_vert - i; | ||||
| loops[bottom_loop_start + i].e = config.last_edge - ((i + 1) % config.circle_segments); | corner_edges[bottom_loop_start + i] = config.last_edge - ((i + 1) % config.circle_segments); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void calculate_selection_outputs(const ConeConfig &config, | static void calculate_selection_outputs(const ConeConfig &config, | ||||
| const ConeAttributeOutputs &attribute_outputs, | const ConeAttributeOutputs &attribute_outputs, | ||||
| MutableAttributeAccessor attributes) | MutableAttributeAccessor attributes) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 184 Lines • ▼ Show 20 Lines | |||||
| Mesh *mesh = BKE_mesh_new_nomain( | Mesh *mesh = BKE_mesh_new_nomain( | ||||
| config.tot_verts, config.tot_edges, 0, config.tot_corners, config.tot_faces); | config.tot_verts, config.tot_edges, 0, config.tot_corners, config.tot_faces); | ||||
| 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(); | |||||
| calculate_cone_verts(config, positions); | calculate_cone_verts(config, positions); | ||||
| calculate_cone_edges(config, edges); | calculate_cone_edges(config, edges); | ||||
| calculate_cone_faces(config, loops, polys); | calculate_cone_faces( | ||||
| config, mesh->corner_verts_for_write(), mesh->corner_edges_for_write(), polys); | |||||
| if (attribute_outputs.uv_map_id) { | if (attribute_outputs.uv_map_id) { | ||||
| calculate_cone_uvs(config, mesh, attribute_outputs.uv_map_id.get()); | calculate_cone_uvs(config, mesh, attribute_outputs.uv_map_id.get()); | ||||
| } | } | ||||
| calculate_selection_outputs(config, attribute_outputs, mesh->attributes_for_write()); | calculate_selection_outputs(config, attribute_outputs, mesh->attributes_for_write()); | ||||
| mesh->loose_edges_tag_none(); | mesh->loose_edges_tag_none(); | ||||
| return mesh; | return mesh; | ||||
| ▲ Show 20 Lines • Show All 92 Lines • Show Last 20 Lines | |||||