[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