[Bf-blender-cvs] [da3004a0f99] geometry-nodes-curve-support: Merge branch 'master' into geometry-nodes-curve-support

Hans Goudey noreply at git.blender.org
Sat Apr 10 05:50:52 CEST 2021


Commit: da3004a0f998033dd3d192b0beba97cf9bd7a19b
Author: Hans Goudey
Date:   Fri Apr 9 22:01:57 2021 -0500
Branches: geometry-nodes-curve-support
https://developer.blender.org/rBda3004a0f998033dd3d192b0beba97cf9bd7a19b

Merge branch 'master' into geometry-nodes-curve-support

===================================================================



===================================================================

diff --cc source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
index 00000000000,337e1e68f1a..6716faaf552
mode 000000,100644..100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
@@@ -1,0 -1,447 +1,447 @@@
+ /*
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License
+  * as published by the Free Software Foundation; either version 2
+  * of the License, or (at your option) any later version.
+  *
+  * This program is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  * GNU General Public License for more details.
+  *
+  * You should have received a copy of the GNU General Public License
+  * along with this program; if not, write to the Free Software Foundation,
+  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+  */
+ 
+ #include "BKE_context.h"
+ #include "BKE_editmesh.h"
+ #include "BKE_lib_id.h"
+ #include "BKE_mesh.h"
+ #include "BKE_mesh_wrapper.h"
+ #include "BKE_modifier.h"
+ 
+ #include "DNA_ID.h"
+ #include "DNA_mesh_types.h"
+ #include "DNA_meshdata_types.h"
+ #include "DNA_space_types.h"
+ #include "DNA_userdef_types.h"
+ 
+ #include "DEG_depsgraph_query.h"
+ 
+ #include "bmesh.h"
+ 
+ #include "spreadsheet_data_source_geometry.hh"
+ #include "spreadsheet_intern.hh"
+ 
+ namespace blender::ed::spreadsheet {
+ 
+ void GeometryDataSource::foreach_default_column_ids(
+     FunctionRef<void(const SpreadsheetColumnID &)> fn) const
+ {
+   component_->attribute_foreach([&](StringRefNull name, const AttributeMetaData &meta_data) {
+     if (meta_data.domain != domain_) {
+       return true;
+     }
+     SpreadsheetColumnID column_id;
+     column_id.name = (char *)name.c_str();
+     if (meta_data.data_type == CD_PROP_FLOAT3) {
+       for (const int i : {0, 1, 2}) {
+         column_id.index = i;
+         fn(column_id);
+       }
+     }
+     else if (meta_data.data_type == CD_PROP_FLOAT2) {
+       for (const int i : {0, 1}) {
+         column_id.index = i;
+         fn(column_id);
+       }
+     }
+     else if (meta_data.data_type == CD_PROP_COLOR) {
+       for (const int i : {0, 1, 2, 3}) {
+         column_id.index = i;
+         fn(column_id);
+       }
+     }
+     else {
+       column_id.index = -1;
+       fn(column_id);
+     }
+     return true;
+   });
+ }
+ 
+ std::unique_ptr<ColumnValues> GeometryDataSource::get_column_values(
+     const SpreadsheetColumnID &column_id) const
+ {
+   std::lock_guard lock{mutex_};
+ 
+   bke::ReadAttributePtr attribute_ptr = component_->attribute_try_get_for_read(column_id.name);
+   if (!attribute_ptr) {
+     return {};
+   }
+   const bke::ReadAttribute *attribute = scope_.add(std::move(attribute_ptr), __func__);
+   if (attribute->domain() != domain_) {
+     return {};
+   }
+   int domain_size = attribute->size();
+   switch (attribute->custom_data_type()) {
+     case CD_PROP_FLOAT:
+       return column_values_from_function(
+           column_id.name, domain_size, [attribute](int index, CellValue &r_cell_value) {
+             float value;
+             attribute->get(index, &value);
+             r_cell_value.value_float = value;
+           });
+     case CD_PROP_INT32:
+       return column_values_from_function(
+           column_id.name, domain_size, [attribute](int index, CellValue &r_cell_value) {
+             int value;
+             attribute->get(index, &value);
+             r_cell_value.value_int = value;
+           });
+     case CD_PROP_BOOL:
+       return column_values_from_function(
+           column_id.name, domain_size, [attribute](int index, CellValue &r_cell_value) {
+             bool value;
+             attribute->get(index, &value);
+             r_cell_value.value_bool = value;
+           });
+     case CD_PROP_FLOAT2: {
+       if (column_id.index < 0 || column_id.index > 1) {
+         return {};
+       }
+       const std::array<const char *, 2> suffixes = {" X", " Y"};
+       const std::string name = StringRef(column_id.name) + suffixes[column_id.index];
+       return column_values_from_function(
+           name,
+           domain_size,
+           [attribute, axis = column_id.index](int index, CellValue &r_cell_value) {
+             float2 value;
+             attribute->get(index, &value);
+             r_cell_value.value_float = value[axis];
+           });
+     }
+     case CD_PROP_FLOAT3: {
+       if (column_id.index < 0 || column_id.index > 2) {
+         return {};
+       }
+       const std::array<const char *, 3> suffixes = {" X", " Y", " Z"};
+       const std::string name = StringRef(column_id.name) + suffixes[column_id.index];
+       return column_values_from_function(
+           name,
+           domain_size,
+           [attribute, axis = column_id.index](int index, CellValue &r_cell_value) {
+             float3 value;
+             attribute->get(index, &value);
+             r_cell_value.value_float = value[axis];
+           });
+     }
+     case CD_PROP_COLOR: {
+       if (column_id.index < 0 || column_id.index > 3) {
+         return {};
+       }
+       const std::array<const char *, 4> suffixes = {" R", " G", " B", " A"};
+       const std::string name = StringRef(column_id.name) + suffixes[column_id.index];
+       return column_values_from_function(
+           name,
+           domain_size,
+           [attribute, axis = column_id.index](int index, CellValue &r_cell_value) {
+             Color4f value;
+             attribute->get(index, &value);
+             r_cell_value.value_float = value[axis];
+           });
+     }
+     default:
+       break;
+   }
+   return {};
+ }
+ 
+ int GeometryDataSource::tot_rows() const
+ {
+   return component_->attribute_domain_size(domain_);
+ }
+ 
+ using IsVertexSelectedFn = FunctionRef<bool(int vertex_index)>;
+ 
+ static void get_selected_vertex_indices(const Mesh &mesh,
+                                         const IsVertexSelectedFn is_vertex_selected_fn,
+                                         Vector<int64_t> &r_vertex_indices)
+ {
+   for (const int i : IndexRange(mesh.totvert)) {
+     if (is_vertex_selected_fn(i)) {
+       r_vertex_indices.append(i);
+     }
+   }
+ }
+ 
+ static void get_selected_corner_indices(const Mesh &mesh,
+                                         const IsVertexSelectedFn is_vertex_selected_fn,
+                                         Vector<int64_t> &r_corner_indices)
+ {
+   for (const int i : IndexRange(mesh.totloop)) {
+     const MLoop &loop = mesh.mloop[i];
+     if (is_vertex_selected_fn(loop.v)) {
+       r_corner_indices.append(i);
+     }
+   }
+ }
+ 
+ static void get_selected_face_indices(const Mesh &mesh,
+                                       const IsVertexSelectedFn is_vertex_selected_fn,
+                                       Vector<int64_t> &r_face_indices)
+ {
+   for (const int poly_index : IndexRange(mesh.totpoly)) {
+     const MPoly &poly = mesh.mpoly[poly_index];
+     bool is_selected = true;
+     for (const int loop_index : IndexRange(poly.loopstart, poly.totloop)) {
+       const MLoop &loop = mesh.mloop[loop_index];
+       if (!is_vertex_selected_fn(loop.v)) {
+         is_selected = false;
+         break;
+       }
+     }
+     if (is_selected) {
+       r_face_indices.append(poly_index);
+     }
+   }
+ }
+ 
+ static void get_selected_edge_indices(const Mesh &mesh,
+                                       const IsVertexSelectedFn is_vertex_selected_fn,
+                                       Vector<int64_t> &r_edge_indices)
+ {
+   for (const int i : IndexRange(mesh.totedge)) {
+     const MEdge &edge = mesh.medge[i];
+     if (is_vertex_selected_fn(edge.v1) && is_vertex_selected_fn(edge.v2)) {
+       r_edge_indices.append(i);
+     }
+   }
+ }
+ 
+ static void get_selected_indices_on_domain(const Mesh &mesh,
+                                            const AttributeDomain domain,
+                                            const IsVertexSelectedFn is_vertex_selected_fn,
+                                            Vector<int64_t> &r_indices)
+ {
+   switch (domain) {
+     case ATTR_DOMAIN_POINT:
+       return get_selected_vertex_indices(mesh, is_vertex_selected_fn, r_indices);
+     case ATTR_DOMAIN_FACE:
+       return get_selected_face_indices(mesh, is_vertex_selected_fn, r_indices);
+     case ATTR_DOMAIN_CORNER:
+       return get_selected_corner_indices(mesh, is_vertex_selected_fn, r_indices);
+     case ATTR_DOMAIN_EDGE:
+       return get_selected_edge_indices(mesh, is_vertex_selected_fn, r_indices);
+     default:
+       return;
+   }
+ }
+ 
+ Span<int64_t> GeometryDataSource::get_selected_element_indices() const
+ {
+   std::lock_guard lock{mutex_};
+ 
+   BLI_assert(object_eval_->mode == OB_MODE_EDIT);
+   BLI_assert(component_->type() == GEO_COMPONENT_TYPE_MESH);
+   Object *object_orig = DEG_get_original_object(object_eval_);
+   Vector<int64_t> &indices = scope_.construct<Vector<int64_t>>(__func__);
+   const MeshComponent *mesh_component = static_cast<const MeshComponent *>(component_);
+   const Mesh *mesh_eval = mesh_component->get_for_read();
+   Mesh *mesh_orig = (Mesh *)object_orig->data;
+   BMesh *bm = mesh_orig->edit_mesh->bm;
+   BM_mesh_elem_table_ensure(bm, BM_VERT);
+ 
+   int *orig_indices = (int *)CustomData_get_layer(&mesh_eval->vdata, CD_ORIGINDEX);
+   if (orig_indices != nullptr) {
+     /* Use CD_ORIGINDEX layer if it exists. */
+     auto is_vertex_selected = [&](int vertex_index) -> bool {
+       const int i_orig = orig_indices[vertex_index];
+       if (i_orig < 0) {
+         return false;
+       }
+       if (i_orig >= bm->totvert) {
+         return false;
+       }
+       BMVert *vert = bm->vtable[i_orig];
+       return BM_elem_flag_test(vert, BM_ELEM_SELECT);
+     };
+     get_selected_indices_on_domain(*mesh_eval, domain_, is_vertex_selected, indices);
+   }
+   else if (mesh_eval->totvert == bm->totvert) {
+     /* Use a simple heuristic to match original vertices to

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list