[Bf-blender-cvs] [d6c17cb276e] temp-modifiers-instancing: update point cloud modiifer interface
Jacques Lucke
noreply at git.blender.org
Tue Nov 10 16:39:02 CET 2020
Commit: d6c17cb276ecba597be9d140829acce5ce0c35ca
Author: Jacques Lucke
Date: Tue Nov 10 11:50:59 2020 +0100
Branches: temp-modifiers-instancing
https://developer.blender.org/rBd6c17cb276ecba597be9d140829acce5ce0c35ca
update point cloud modiifer interface
===================================================================
M source/blender/blenkernel/BKE_geometry_set.hh
M source/blender/blenkernel/BKE_modifier.h
M source/blender/blenkernel/intern/geometry_set.cc
M source/blender/blenkernel/intern/object.c
M source/blender/blenkernel/intern/pointcloud.cc
M source/blender/modifiers/intern/MOD_nodes.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh
index 9a19054cb7c..a625158367b 100644
--- a/source/blender/blenkernel/BKE_geometry_set.hh
+++ b/source/blender/blenkernel/BKE_geometry_set.hh
@@ -130,6 +130,8 @@ class GeometrySet {
/* Utility methods for creation. */
static GeometrySetPtr create_with_mesh(Mesh *mesh, bool transfer_ownership = true);
+ static GeometrySetPtr create_with_pointcloud(PointCloud *pointcloud,
+ bool transfer_ownership = true);
/* Utility methods for access. */
bool has_mesh() const;
@@ -188,4 +190,14 @@ class PointCloudComponent : public GeometryComponent {
static constexpr inline GeometryComponentType type = GeometryComponentType::PointCloud;
};
+inline GeometrySetC *wrap(blender::bke::GeometrySet *geometry_set)
+{
+ return reinterpret_cast<GeometrySetC *>(geometry_set);
+}
+
+inline blender::bke::GeometrySet *unwrap(GeometrySetC *geometry_set_c)
+{
+ return reinterpret_cast<blender::bke::GeometrySet *>(geometry_set_c);
+}
+
} // namespace blender::bke
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index a2c3787bcd2..868f13e3488 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -43,6 +43,7 @@ struct ModifierData;
struct Object;
struct Scene;
struct bArmature;
+struct GeometrySetC;
typedef enum {
/* Should not be used, only for None modifier type */
@@ -246,9 +247,9 @@ typedef struct ModifierTypeInfo {
struct Hair *(*modifyHair)(struct ModifierData *md,
const struct ModifierEvalContext *ctx,
struct Hair *hair);
- struct PointCloud *(*modifyPointCloud)(struct ModifierData *md,
- const struct ModifierEvalContext *ctx,
- struct PointCloud *pointcloud);
+ struct GeometrySetC *(*modifyPointCloud)(struct ModifierData *md,
+ const struct ModifierEvalContext *ctx,
+ struct GeometrySetC *geometry_set_c);
struct Volume *(*modifyVolume)(struct ModifierData *md,
const struct ModifierEvalContext *ctx,
struct Volume *volume);
diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc
index e8d09dfd042..5e303dd53bd 100644
--- a/source/blender/blenkernel/intern/geometry_set.cc
+++ b/source/blender/blenkernel/intern/geometry_set.cc
@@ -162,8 +162,7 @@ bool GeometrySet::has_pointcloud() const
return component != nullptr && component->has_pointcloud();
}
-/* Create a new geometry set that only contains the given mesh. Ownership of the mesh is
- * transferred to the new geometry. */
+/* Create a new geometry set that only contains the given mesh. */
GeometrySetPtr GeometrySet::create_with_mesh(Mesh *mesh, bool transfer_ownership)
{
GeometrySet *geometry_set = new GeometrySet();
@@ -172,6 +171,15 @@ GeometrySetPtr GeometrySet::create_with_mesh(Mesh *mesh, bool transfer_ownership
return geometry_set;
}
+/* Create a new geometry set that only contains the given point cloud. */
+GeometrySetPtr GeometrySet::create_with_pointcloud(PointCloud *pointcloud, bool transfer_ownership)
+{
+ GeometrySet *geometry_set = new GeometrySet();
+ PointCloudComponent &component = geometry_set->get_component_for_write<PointCloudComponent>();
+ component.replace(pointcloud, transfer_ownership);
+ return geometry_set;
+}
+
/* Clear the existing mesh and replace it with the given one. */
void GeometrySet::replace_mesh(Mesh *mesh, bool transfer_ownership)
{
@@ -374,19 +382,14 @@ PointCloud *PointCloudComponent::get_for_write()
/** \name C API
* \{ */
-static blender::bke::GeometrySet *unwrap(GeometrySetC *geometry_set)
-{
- return reinterpret_cast<blender::bke::GeometrySet *>(geometry_set);
-}
-
void BKE_geometry_set_user_add(GeometrySetC *geometry_set)
{
- unwrap(geometry_set)->user_add();
+ blender::bke::unwrap(geometry_set)->user_add();
}
void BKE_geometry_set_user_remove(GeometrySetC *geometry_set)
{
- unwrap(geometry_set)->user_remove();
+ blender::bke::unwrap(geometry_set)->user_remove();
}
/** \} */
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 80535261023..9edf4056145 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1285,8 +1285,7 @@ bool BKE_object_support_modifier_type_check(const Object *ob, int modifier_type)
return (mti->modifyHair != NULL) || (mti->flags & eModifierTypeFlag_AcceptsVertexCosOnly);
}
if (ob->type == OB_POINTCLOUD) {
- return (mti->modifyPointCloud != NULL) ||
- (mti->flags & eModifierTypeFlag_AcceptsVertexCosOnly);
+ return (mti->modifyPointCloud != NULL);
}
if (ob->type == OB_VOLUME) {
return (mti->modifyVolume != NULL);
@@ -1558,6 +1557,7 @@ void BKE_object_free_derived_caches(Object *ob)
if (ob->runtime.geometry_set_eval != NULL) {
BKE_geometry_set_user_remove(ob->runtime.geometry_set_eval);
+ ob->runtime.geometry_set_eval = NULL;
}
}
diff --git a/source/blender/blenkernel/intern/pointcloud.cc b/source/blender/blenkernel/intern/pointcloud.cc
index f6a2beb9767..eca1dd98bf7 100644
--- a/source/blender/blenkernel/intern/pointcloud.cc
+++ b/source/blender/blenkernel/intern/pointcloud.cc
@@ -33,6 +33,7 @@
#include "BKE_anim_data.h"
#include "BKE_customdata.h"
+#include "BKE_geometry_set.hh"
#include "BKE_global.h"
#include "BKE_idtype.h"
#include "BKE_lib_id.h"
@@ -86,6 +87,8 @@ static void pointcloud_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_s
alloc_type,
pointcloud_dst->totpoint);
BKE_pointcloud_update_customdata_pointers(pointcloud_dst);
+
+ pointcloud_dst->batch_cache = NULL;
}
static void pointcloud_free_data(ID *id)
@@ -329,12 +332,13 @@ PointCloud *BKE_pointcloud_copy_for_eval(struct PointCloud *pointcloud_src, bool
return result;
}
-static PointCloud *pointcloud_evaluate_modifiers(struct Depsgraph *depsgraph,
- struct Scene *scene,
- Object *object,
- PointCloud *pointcloud_input)
+static blender::bke::GeometrySetPtr pointcloud_evaluate_modifiers(
+ struct Depsgraph *depsgraph,
+ struct Scene *scene,
+ Object *object,
+ blender::bke::GeometrySetPtr geometry_set)
{
- PointCloud *pointcloud = pointcloud_input;
+ using namespace blender::bke;
/* Modifier evaluation modes. */
const bool use_render = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
@@ -355,55 +359,34 @@ static PointCloud *pointcloud_evaluate_modifiers(struct Depsgraph *depsgraph,
continue;
}
- if ((mti->type == eModifierTypeType_OnlyDeform) &&
- (mti->flags & eModifierTypeFlag_AcceptsVertexCosOnly)) {
- /* Ensure we are not modifying the input. */
- if (pointcloud == pointcloud_input) {
- pointcloud = BKE_pointcloud_copy_for_eval(pointcloud, true);
- }
-
- /* Ensure we are not overwriting referenced data. */
- CustomData_duplicate_referenced_layer_named(
- &pointcloud->pdata, CD_PROP_FLOAT3, POINTCLOUD_ATTR_POSITION, pointcloud->totpoint);
- BKE_pointcloud_update_customdata_pointers(pointcloud);
-
- /* Created deformed coordinates array on demand. */
- mti->deformVerts(md, &mectx, nullptr, pointcloud->co, pointcloud->totpoint);
- }
- else if (mti->modifyPointCloud) {
- /* Ensure we are not modifying the input. */
- if (pointcloud == pointcloud_input) {
- pointcloud = BKE_pointcloud_copy_for_eval(pointcloud, true);
- }
-
- PointCloud *pointcloud_next = mti->modifyPointCloud(md, &mectx, pointcloud);
-
- if (pointcloud_next && pointcloud_next != pointcloud) {
- /* If the modifier returned a new pointcloud, release the old one. */
- if (pointcloud != pointcloud_input) {
- BKE_id_free(nullptr, pointcloud);
- }
- pointcloud = pointcloud_next;
- }
+ if (mti->modifyPointCloud) {
+ GeometrySetC *modifier_input_geometry_set = wrap(geometry_set.release());
+ GeometrySetC *modifier_output_geometry_set = mti->modifyPointCloud(
+ md, &mectx, modifier_input_geometry_set);
+ geometry_set = unwrap(modifier_output_geometry_set);
}
}
- return pointcloud;
+ return geometry_set;
}
void BKE_pointcloud_data_update(struct Depsgraph *depsgraph, struct Scene *scene, Object *object)
{
+ using namespace blender::bke;
+
/* Free any evaluated data and restore original data. */
BKE_object_free_derived_caches(object);
/* Evaluate modifiers. */
PointCloud *pointcloud = static_cast<PointCloud *>(object->data);
- PointCloud *pointcloud_eval = pointcloud_evaluate_modifiers(
- depsgraph, scene, object, pointcloud);
+ GeometrySetPtr input_geometry_set = GeometrySet::create_with_pointcloud(pointcloud, false);
+ GeometrySetPtr geometry_set_eval = pointcloud_evaluate_modifiers(
+ depsgraph, scene, object, input_geometry_set);
/* Assign evaluated object. */
- const bool is_owned = (pointcloud != pointcloud_eval);
- BKE_object_eval_assign_data(object, &pointcloud_eval->id, is_owned);
+ BKE_object_eval_assign_data(object, &pointcloud->id, false);
+ BLI_assert(object->runtime.geometry_set_eval == nullptr);
+ object->runtime.geometry_set_eval = wrap(geometry_set_eval.release());
}
/* Draw Cache */
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index bc05f32600c..5f9873f7545 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -124,16 +124,6 @@ static bool isDisabled(const struct Scene *UNUSED(scene),
return false;
}
-static PointCloud *modifyPointCloud(ModifierData *md,
- const Modifi
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list