Differential D16893 Diff 58979 source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc
Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc
| Show First 20 Lines • Show All 53 Lines • ▼ Show 20 Lines | CornersOfVertInput(Field<int> vert_index, Field<int> sort_index, Field<float> sort_weight) | ||||
| category_ = Category::Generated; | category_ = Category::Generated; | ||||
| } | } | ||||
| GVArray get_varray_for_context(const Mesh &mesh, | GVArray get_varray_for_context(const Mesh &mesh, | ||||
| const eAttrDomain domain, | const eAttrDomain domain, | ||||
| const IndexMask mask) const final | const IndexMask mask) const final | ||||
| { | { | ||||
| const IndexRange vert_range(mesh.totvert); | const IndexRange vert_range(mesh.totvert); | ||||
| const Span<MLoop> loops = mesh.loops(); | const Span<int> corner_verts = mesh.corner_verts(); | ||||
| Array<Vector<int>> vert_to_loop_map = bke::mesh_topology::build_vert_to_loop_map(loops, | Array<Vector<int>> vert_to_loop_map = bke::mesh_topology::build_vert_to_loop_map(corner_verts, | ||||
| mesh.totvert); | mesh.totvert); | ||||
| const bke::MeshFieldContext context{mesh, domain}; | const bke::MeshFieldContext context{mesh, domain}; | ||||
| fn::FieldEvaluator evaluator{context, &mask}; | fn::FieldEvaluator evaluator{context, &mask}; | ||||
| evaluator.add(vert_index_); | evaluator.add(vert_index_); | ||||
| evaluator.add(sort_index_); | evaluator.add(sort_index_); | ||||
| evaluator.evaluate(); | evaluator.evaluate(); | ||||
| const VArray<int> vert_indices = evaluator.get_evaluated<int>(0); | const VArray<int> vert_indices = evaluator.get_evaluated<int>(0); | ||||
| const VArray<int> indices_in_sort = evaluator.get_evaluated<int>(1); | const VArray<int> indices_in_sort = evaluator.get_evaluated<int>(1); | ||||
| const bke::MeshFieldContext corner_context{mesh, ATTR_DOMAIN_CORNER}; | const bke::MeshFieldContext corner_context{mesh, ATTR_DOMAIN_CORNER}; | ||||
| fn::FieldEvaluator corner_evaluator{corner_context, loops.size()}; | fn::FieldEvaluator corner_evaluator{corner_context, corner_verts.size()}; | ||||
| corner_evaluator.add(sort_weight_); | corner_evaluator.add(sort_weight_); | ||||
| corner_evaluator.evaluate(); | corner_evaluator.evaluate(); | ||||
| const VArray<float> all_sort_weights = corner_evaluator.get_evaluated<float>(0); | const VArray<float> all_sort_weights = corner_evaluator.get_evaluated<float>(0); | ||||
| Array<int> corner_of_vertex(mask.min_array_size()); | Array<int> corner_of_vertex(mask.min_array_size()); | ||||
| threading::parallel_for(mask.index_range(), 1024, [&](const IndexRange range) { | threading::parallel_for(mask.index_range(), 1024, [&](const IndexRange range) { | ||||
| /* Reuse arrays to avoid allocation. */ | /* Reuse arrays to avoid allocation. */ | ||||
| Array<int64_t> corner_indices; | Array<int64_t> corner_indices; | ||||
| ▲ Show 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | public: | ||||
| GVArray get_varray_for_context(const Mesh &mesh, | GVArray get_varray_for_context(const Mesh &mesh, | ||||
| const eAttrDomain domain, | const eAttrDomain domain, | ||||
| const IndexMask /*mask*/) const final | const IndexMask /*mask*/) const final | ||||
| { | { | ||||
| if (domain != ATTR_DOMAIN_POINT) { | if (domain != ATTR_DOMAIN_POINT) { | ||||
| return {}; | return {}; | ||||
| } | } | ||||
| const Span<MLoop> loops = mesh.loops(); | const Span<int> corner_verts = mesh.corner_verts(); | ||||
| Array<int> counts(mesh.totvert, 0); | Array<int> counts(mesh.totvert, 0); | ||||
| for (const int i : loops.index_range()) { | for (const int i : corner_verts.index_range()) { | ||||
| counts[loops[i].v]++; | counts[corner_verts[i]]++; | ||||
| } | } | ||||
| return VArray<int>::ForContainer(std::move(counts)); | return VArray<int>::ForContainer(std::move(counts)); | ||||
| } | } | ||||
| uint64_t hash() const final | uint64_t hash() const final | ||||
| { | { | ||||
| return 253098745374645; | return 253098745374645; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 46 Lines • Show Last 20 Lines | |||||