[Bf-blender-cvs] [7e930f4e8be] geometry-nodes: Geometry Nodes: support rotation and scale in instances component
Jacques Lucke
noreply at git.blender.org
Wed Nov 18 13:41:37 CET 2020
Commit: 7e930f4e8be66943e7a6c16149ef9cd90f5414a7
Author: Jacques Lucke
Date: Wed Nov 18 13:39:56 2020 +0100
Branches: geometry-nodes
https://developer.blender.org/rB7e930f4e8be66943e7a6c16149ef9cd90f5414a7
Geometry Nodes: support rotation and scale in instances component
===================================================================
M source/blender/blenkernel/BKE_geometry_set.h
M source/blender/blenkernel/BKE_geometry_set.hh
M source/blender/blenkernel/intern/geometry_set.cc
M source/blender/blenkernel/intern/object_dupli.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_geometry_set.h b/source/blender/blenkernel/BKE_geometry_set.h
index c3ca02a1831..026f4d39d51 100644
--- a/source/blender/blenkernel/BKE_geometry_set.h
+++ b/source/blender/blenkernel/BKE_geometry_set.h
@@ -33,6 +33,8 @@ bool BKE_geometry_set_has_instances(const struct GeometrySet *geometry_set);
int BKE_geometry_set_instances(const struct GeometrySet *geometry_set,
float (**r_positions)[3],
+ float (**r_rotations)[3],
+ float (**r_scales)[3],
struct Object ***r_objects);
#ifdef __cplusplus
diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh
index d4aa090960f..4fe74aa2e1d 100644
--- a/source/blender/blenkernel/BKE_geometry_set.hh
+++ b/source/blender/blenkernel/BKE_geometry_set.hh
@@ -193,18 +193,24 @@ class PointCloudComponent : public GeometryComponent {
class InstancesComponent : public GeometryComponent {
private:
blender::Vector<blender::float3> positions_;
+ blender::Vector<blender::float3> rotations_;
+ blender::Vector<blender::float3> scales_;
blender::Vector<const Object *> objects_;
public:
~InstancesComponent() = default;
GeometryComponent *copy() const override;
- void replace(blender::Vector<blender::float3> positions,
- blender::Vector<const Object *> objects);
- void replace(blender::Vector<blender::float3> positions, const Object *object);
+ void clear();
+ void add_instance(const Object *object,
+ blender::float3 position,
+ blender::float3 rotation = {0, 0, 0},
+ blender::float3 scale = {1, 1, 1});
blender::Span<const Object *> objects() const;
blender::Span<blender::float3> positions() const;
+ blender::Span<blender::float3> rotations() const;
+ blender::Span<blender::float3> scales() const;
blender::MutableSpan<blender::float3> positions();
int instances_amount() const;
diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc
index ab83ccc4a3d..c286514707c 100644
--- a/source/blender/blenkernel/intern/geometry_set.cc
+++ b/source/blender/blenkernel/intern/geometry_set.cc
@@ -400,18 +400,22 @@ GeometryComponent *InstancesComponent::copy() const
return new_component;
}
-void InstancesComponent::replace(Vector<float3> positions, Vector<const Object *> objects)
+void InstancesComponent::clear()
{
- BLI_assert(positions.size() == objects.size());
- positions_ = std::move(positions);
- objects_ = std::move(objects);
+ objects_.clear();
+ positions_.clear();
+ rotations_.clear();
+ scales_.clear();
}
-
-void InstancesComponent::replace(Vector<float3> positions, const Object *object)
+void InstancesComponent::add_instance(const Object *object,
+ blender::float3 position,
+ blender::float3 rotation,
+ blender::float3 scale)
{
- positions_ = std::move(positions);
- objects_.clear();
- objects_.append_n_times(object, positions_.size());
+ objects_.append(object);
+ positions_.append(position);
+ rotations_.append(rotation);
+ scales_.append(scale);
}
Span<const Object *> InstancesComponent::objects() const
@@ -424,6 +428,16 @@ Span<float3> InstancesComponent::positions() const
return positions_;
}
+blender::Span<blender::float3> InstancesComponent::rotations() const
+{
+ return rotations_;
+}
+
+blender::Span<blender::float3> InstancesComponent::scales() const
+{
+ return scales_;
+}
+
MutableSpan<float3> InstancesComponent::positions()
{
return positions_;
@@ -453,6 +467,8 @@ bool BKE_geometry_set_has_instances(const GeometrySet *geometry_set)
int BKE_geometry_set_instances(const GeometrySet *geometry_set,
float (**r_positions)[3],
+ float (**r_rotations)[3],
+ float (**r_scales)[3],
Object ***r_objects)
{
const InstancesComponent *component = geometry_set->get_component_for_read<InstancesComponent>();
@@ -460,6 +476,8 @@ int BKE_geometry_set_instances(const GeometrySet *geometry_set,
return 0;
}
*r_positions = (float(*)[3])component->positions().data();
+ *r_rotations = (float(*)[3])component->rotations().data();
+ *r_scales = (float(*)[3])component->scales().data();
*r_objects = (Object **)component->objects().data();
return component->instances_amount();
}
diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c
index 4da05a39f02..9a8c560f116 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -814,21 +814,28 @@ static const DupliGenerator gen_dupli_verts_pointcloud = {
static void make_duplis_instances_component(const DupliContext *ctx)
{
float(*positions)[3];
+ float(*rotations)[3];
+ float(*scales)[3];
Object **objects;
const int amount = BKE_geometry_set_instances(
- ctx->object->runtime.geometry_set_eval, &positions, &objects);
+ ctx->object->runtime.geometry_set_eval, &positions, &rotations, &scales, &objects);
for (int i = 0; i < amount; i++) {
Object *object = objects[i];
if (object == NULL) {
continue;
}
- float mat[4][4];
- unit_m4(mat);
- copy_v3_v3(mat[3], positions[i]);
- mul_m4_m4_pre(mat, ctx->object->obmat);
- make_dupli(ctx, object, mat, i);
- make_recursive_duplis(ctx, object, mat, i);
+ float scale_matrix[4][4];
+ size_to_mat4(scale_matrix, scales[i]);
+ float rotation_matrix[4][4];
+ eul_to_mat4(rotation_matrix, rotations[i]);
+ float matrix[4][4];
+ mul_m4_m4m4(matrix, rotation_matrix, scale_matrix);
+ copy_v3_v3(matrix[3], positions[i]);
+ mul_m4_m4_pre(matrix, ctx->object->obmat);
+
+ make_dupli(ctx, object, matrix, i);
+ make_recursive_duplis(ctx, object, matrix, i);
}
}
More information about the Bf-blender-cvs
mailing list