[Bf-blender-cvs] [56548260e28] temp-modifiers-instancing: initial drawing of mesh in point cloud
Jacques Lucke
noreply at git.blender.org
Wed Nov 11 16:09:19 CET 2020
Commit: 56548260e288e3416a33a4adbcd78bb8c1c2a32b
Author: Jacques Lucke
Date: Wed Nov 11 14:10:10 2020 +0100
Branches: temp-modifiers-instancing
https://developer.blender.org/rB56548260e288e3416a33a4adbcd78bb8c1c2a32b
initial drawing of mesh in point cloud
===================================================================
M source/blender/blenkernel/BKE_geometry_set.hh
M source/blender/depsgraph/DEG_depsgraph_query.h
M source/blender/depsgraph/intern/depsgraph_query_iter.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh
index 72d60dc917d..0d531deee0a 100644
--- a/source/blender/blenkernel/BKE_geometry_set.hh
+++ b/source/blender/blenkernel/BKE_geometry_set.hh
@@ -43,18 +43,18 @@ using GeometrySetPtr = UserCounter<class GeometrySet>;
* stores. Functions modifying a geometry will usually just modify a subset of the component types.
*/
enum class GeometryComponentType {
- Mesh,
- PointCloud,
- Instances,
+ Mesh = 0,
+ PointCloud = 1,
+ Instances = 2,
};
enum class GeometryOwnershipType {
/* The geometry is owned. This implies that it can be changed. */
- Owned,
+ Owned = 0,
/* The geometry can be changed, but someone else is responsible for freeing it. */
- Editable,
+ Editable = 1,
/* The geometry cannot be changed and someone else is responsible for freeing it. */
- ReadOnly,
+ ReadOnly = 2,
};
} // namespace blender::bke
diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h
index 7eb5f1ccec1..1d942c4e2a8 100644
--- a/source/blender/depsgraph/DEG_depsgraph_query.h
+++ b/source/blender/depsgraph/DEG_depsgraph_query.h
@@ -42,6 +42,7 @@ struct ListBase;
struct PointerRNA;
struct Scene;
struct ViewLayer;
+struct GeometrySetC;
#ifdef __cplusplus
extern "C" {
@@ -145,6 +146,11 @@ typedef struct DEGObjectIterData {
eEvaluationMode eval_mode;
+ /* **** Iteration over geometry components **** */
+ struct Object *geometry_set_owner;
+ struct GeometrySetC *geometry_set_c;
+ int next_geometry_set_component;
+
/* **** Iteration over dupli-list. *** */
/* Object which created the dupli-list. */
diff --git a/source/blender/depsgraph/intern/depsgraph_query_iter.cc b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
index 40ac8323283..36d2c5414fb 100644
--- a/source/blender/depsgraph/intern/depsgraph_query_iter.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
@@ -237,7 +237,15 @@ void deg_iterator_objects_step(BLI_Iterator *iter, deg::IDNode *id_node)
if (ob_visibility & (OB_VISIBLE_SELF | OB_VISIBLE_PARTICLES)) {
iter->current = object;
- iter->skip = false;
+ if (object->runtime.geometry_set_eval) {
+ data->geometry_set_c = object->runtime.geometry_set_eval;
+ data->next_geometry_set_component = (int)bke::GeometryComponentType::Mesh;
+ data->geometry_set_owner = object;
+ iter->skip = true;
+ }
+ else {
+ iter->skip = false;
+ }
}
}
@@ -264,6 +272,9 @@ void DEG_iterator_objects_begin(BLI_Iterator *iter, DEGObjectIterData *data)
data->id_node_index = 0;
data->num_id_nodes = num_id_nodes;
data->eval_mode = DEG_get_mode(depsgraph);
+ data->next_geometry_set_component = 0;
+ data->geometry_set_owner = nullptr;
+ data->geometry_set_c = nullptr;
deg_invalidate_iterator_work_data(data);
deg::IDNode *id_node = deg_graph->id_nodes[data->id_node_index];
@@ -281,6 +292,35 @@ void DEG_iterator_objects_next(BLI_Iterator *iter)
deg::Depsgraph *deg_graph = reinterpret_cast<deg::Depsgraph *>(depsgraph);
do {
iter->skip = false;
+
+ if (data->geometry_set_c != nullptr) {
+ bke::GeometrySet *geometry_set = bke::unwrap(data->geometry_set_c);
+ if (data->next_geometry_set_component == (int)bke::GeometryComponentType::Mesh) {
+ data->next_geometry_set_component = (int)bke::GeometryComponentType::PointCloud;
+ const Mesh *mesh = geometry_set->get_mesh_for_read();
+ if (mesh != nullptr) {
+ Object *temp_object = &data->temp_dupli_object;
+ *temp_object = *data->geometry_set_owner;
+ temp_object->type = OB_MESH;
+ temp_object->data = (void *)mesh;
+ iter->current = temp_object;
+ return;
+ }
+ }
+ if (data->next_geometry_set_component == (int)bke::GeometryComponentType::PointCloud) {
+ data->geometry_set_c = nullptr;
+ const PointCloud *pointcloud = geometry_set->get_pointcloud_for_read();
+ if (pointcloud != nullptr) {
+ Object *temp_object = &data->temp_dupli_object;
+ *temp_object = *data->geometry_set_owner;
+ temp_object->type = OB_POINTCLOUD;
+ temp_object->data = (void *)pointcloud;
+ iter->current = temp_object;
+ return;
+ }
+ }
+ }
+
if (data->dupli_list) {
if (deg_objects_dupli_iterator_next(iter)) {
return;
More information about the Bf-blender-cvs
mailing list