[Bf-blender-cvs] [e45fb9e735c] functions: use more generic mesh surface action context
Jacques Lucke
noreply at git.blender.org
Mon Sep 2 12:32:10 CEST 2019
Commit: e45fb9e735c461690aa6182e9a0c0d14d6e4de9d
Author: Jacques Lucke
Date: Mon Sep 2 12:11:58 2019 +0200
Branches: functions
https://developer.blender.org/rBe45fb9e735c461690aa6182e9a0c0d14d6e4de9d
use more generic mesh surface action context
===================================================================
M source/blender/simulations/CMakeLists.txt
A source/blender/simulations/bparticles/action_contexts.hpp
M source/blender/simulations/bparticles/events.cpp
M source/blender/simulations/bparticles/events.hpp
M source/blender/simulations/bparticles/particle_function_builder.cpp
===================================================================
diff --git a/source/blender/simulations/CMakeLists.txt b/source/blender/simulations/CMakeLists.txt
index fe4dd3e480d..c26d3ad2569 100644
--- a/source/blender/simulations/CMakeLists.txt
+++ b/source/blender/simulations/CMakeLists.txt
@@ -30,6 +30,7 @@ set(SRC
bparticles/actions.cpp
bparticles/action_interface.hpp
bparticles/action_interface.cpp
+ bparticles/action_contexts.hpp
bparticles/events.hpp
bparticles/events.cpp
bparticles/attributes.hpp
diff --git a/source/blender/simulations/bparticles/action_contexts.hpp b/source/blender/simulations/bparticles/action_contexts.hpp
new file mode 100644
index 00000000000..8c9dfbd3bb9
--- /dev/null
+++ b/source/blender/simulations/bparticles/action_contexts.hpp
@@ -0,0 +1,65 @@
+#pragma once
+
+#include "action_interface.hpp"
+
+struct Object;
+
+namespace BParticles {
+
+class MeshSurfaceActionContext : public ActionContext {
+ private:
+ Object *m_object;
+ ArrayRef<float4x4> m_world_transforms;
+ ArrayRef<float3> m_local_positions;
+ ArrayRef<float3> m_local_normals;
+ ArrayRef<float3> m_world_normals;
+ ArrayRef<uint> m_looptri_indices;
+
+ public:
+ MeshSurfaceActionContext(Object *object,
+ ArrayRef<float4x4> world_transforms,
+ ArrayRef<float3> local_positions,
+ ArrayRef<float3> local_normals,
+ ArrayRef<float3> world_normals,
+ ArrayRef<uint> looptri_indices)
+ : m_object(object),
+ m_world_transforms(world_transforms),
+ m_local_positions(local_positions),
+ m_local_normals(local_normals),
+ m_world_normals(world_normals),
+ m_looptri_indices(looptri_indices)
+ {
+ }
+
+ const Object *object() const
+ {
+ return m_object;
+ }
+
+ ArrayRef<float4x4> world_transforms() const
+ {
+ return m_world_transforms;
+ }
+
+ ArrayRef<float3> local_positions() const
+ {
+ return m_local_positions;
+ }
+
+ ArrayRef<float3> local_normals() const
+ {
+ return m_local_normals;
+ }
+
+ ArrayRef<float3> world_normals() const
+ {
+ return m_world_normals;
+ }
+
+ ArrayRef<uint> looptri_indices() const
+ {
+ return m_looptri_indices;
+ }
+};
+
+}; // namespace BParticles
diff --git a/source/blender/simulations/bparticles/events.cpp b/source/blender/simulations/bparticles/events.cpp
index 7f82080a81f..a4090600f6a 100644
--- a/source/blender/simulations/bparticles/events.cpp
+++ b/source/blender/simulations/bparticles/events.cpp
@@ -1,5 +1,7 @@
#include "events.hpp"
+#include "action_contexts.hpp"
+
namespace BParticles {
/* Age Reached Event
@@ -94,7 +96,8 @@ void MeshCollisionEvent::filter(EventFilterInterface &interface)
if (float3::dot(result.normal, ray_direction) > 0) {
result.normal = -result.normal;
}
- storage.normal = m_local_to_world.transform_direction(result.normal).normalized();
+ storage.local_normal = result.normal;
+ storage.local_position = ray_start + ray_direction * result.distance;
storage.looptri_index = result.index;
}
}
@@ -121,18 +124,31 @@ MeshCollisionEvent::RayCastResult MeshCollisionEvent::ray_cast(float3 start,
void MeshCollisionEvent::execute(EventExecuteInterface &interface)
{
ParticleSet particles = interface.particles();
- TemporaryArray<float3> normals(interface.array_size());
- TemporaryArray<uint> looptri_indices(interface.array_size());
+
+ uint array_size = interface.array_size();
+ TemporaryArray<float3> local_positions(array_size);
+ TemporaryArray<float3> local_normals(array_size);
+ TemporaryArray<uint> looptri_indices(array_size);
+ TemporaryArray<float4x4> world_transforms(array_size);
+ TemporaryArray<float3> world_normals(array_size);
+
auto last_collision_times = particles.attributes().get<float>(m_identifier);
for (uint pindex : particles.pindices()) {
auto storage = interface.get_storage<EventStorage>(pindex);
looptri_indices[pindex] = storage.looptri_index;
- normals[pindex] = storage.normal;
+ local_positions[pindex] = storage.local_position;
+ local_normals[pindex] = storage.local_normal;
+ world_transforms[pindex] = m_local_to_world;
+ world_normals[pindex] =
+ m_local_to_world.transform_direction(storage.local_normal).normalized();
+
last_collision_times[pindex] = interface.current_times()[pindex];
}
- CollisionEventInfo action_context(m_object, looptri_indices, normals);
+ MeshSurfaceActionContext action_context(
+ m_object, world_transforms, local_positions, local_normals, world_normals, looptri_indices);
+
m_action->execute_from_event(interface, &action_context);
}
diff --git a/source/blender/simulations/bparticles/events.hpp b/source/blender/simulations/bparticles/events.hpp
index 137db54ee45..4d708a67c2b 100644
--- a/source/blender/simulations/bparticles/events.hpp
+++ b/source/blender/simulations/bparticles/events.hpp
@@ -37,34 +37,6 @@ class AgeReachedEvent : public Event {
void execute(EventExecuteInterface &interface) override;
};
-class CollisionEventInfo : public ActionContext {
- private:
- Object *m_object;
- ArrayRef<uint> m_loop_tri_indices;
- ArrayRef<float3> m_normals;
-
- public:
- CollisionEventInfo(Object *object, ArrayRef<uint> loop_tri_indices, ArrayRef<float3> normals)
- : m_object(object), m_loop_tri_indices(loop_tri_indices), m_normals(normals)
- {
- }
-
- Object *object()
- {
- return m_object;
- }
-
- ArrayRef<uint> loop_tri_indices()
- {
- return m_loop_tri_indices;
- }
-
- ArrayRef<float3> normals()
- {
- return m_normals;
- }
-};
-
class MeshCollisionEvent : public Event {
private:
std::string m_identifier;
@@ -83,7 +55,8 @@ class MeshCollisionEvent : public Event {
struct EventStorage {
uint looptri_index;
- float3 normal;
+ float3 local_normal;
+ float3 local_position;
};
public:
diff --git a/source/blender/simulations/bparticles/particle_function_builder.cpp b/source/blender/simulations/bparticles/particle_function_builder.cpp
index a4fbff71832..b248c2bebbe 100644
--- a/source/blender/simulations/bparticles/particle_function_builder.cpp
+++ b/source/blender/simulations/bparticles/particle_function_builder.cpp
@@ -10,6 +10,7 @@
#include "particle_function_builder.hpp"
#include "events.hpp"
+#include "action_contexts.hpp"
namespace BParticles {
@@ -78,9 +79,9 @@ class CollisionNormalInputProvider : public ParticleFunctionInputProvider {
{
ActionContext *action_context = interface.action_context();
BLI_assert(action_context != nullptr);
- CollisionEventInfo *collision_info = dynamic_cast<CollisionEventInfo *>(action_context);
- BLI_assert(collision_info != nullptr);
- return {collision_info->normals(), false};
+ auto *surface_info = dynamic_cast<MeshSurfaceActionContext *>(action_context);
+ BLI_assert(surface_info != nullptr);
+ return {surface_info->world_normals(), false};
}
};
@@ -136,11 +137,10 @@ class SurfaceImageInputProvider : public ParticleFunctionInputProvider {
{
ActionContext *action_context = interface.action_context();
BLI_assert(action_context != nullptr);
- CollisionEventInfo *collision_info = dynamic_cast<CollisionEventInfo *>(action_context);
- BLI_assert(collision_info != nullptr);
+ auto *surface_info = dynamic_cast<MeshSurfaceActionContext *>(action_context);
+ BLI_assert(surface_info != nullptr);
- Object *object = collision_info->object();
- float4x4 ob_inverse = (float4x4)object->imat;
+ const Object *object = surface_info->object();
Mesh *mesh = (Mesh *)object->data;
const MLoopTri *triangles = BKE_mesh_runtime_looptri_ensure(mesh);
@@ -150,18 +150,18 @@ class SurfaceImageInputProvider : public ParticleFunctionInputProvider {
MLoopUV *uv_layer = (MLoopUV *)CustomData_get(&mesh->ldata, uv_layer_index, CD_MLOOPUV);
BLI_assert(uv_layer != nullptr);
- ArrayRef<float3> positions = interface.particles().attributes().get<float3>("Position");
+ ArrayRef<float3> local_positions = surface_info->local_positions();
rgba_b *pixel_buffer = (rgba_b *)m_ibuf->rect;
- rgba_f *colors_buffer = (rgba_f *)BLI_temporary_allocate(sizeof(rgba_f) * positions.size());
- MutableArrayRef<rgba_f> colors{colors_buffer, positions.size()};
+ rgba_f *colors_buffer = (rgba_f *)BLI_temporary_allocate(sizeof(rgba_f) *
+ local_positions.size());
+ MutableArrayRef<rgba_f> colors{colors_buffer, local_positions.size()};
for (uint pindex : interface.particles().pindices()) {
- float3 position_world = positions[pindex];
- float3 position_local = ob_inverse.transform_position(position_world);
+ float3 local_position = local_positions[pindex];
- uint triangle_index = collision_info->loop_tri_indices()[pindex];
+ uint triangle_index = surface_info->looptri_indices()[pindex];
const MLoopTri &triangle = triangles[triangle_index];
uint loop1 = triangle.tri[0];
@@ -177,7 +177,7 @@ class SurfaceImageInputProvider : public ParticleFunctionInputProvider {
float2 uv3 = uv_layer[loop3].uv;
float3 vertex_weights;
- interp_weights_tri_v3(vertex_weights, v1, v2, v3, position_local);
+ interp_weights_tri_v3(vertex_weights, v1, v2, v3, local_position);
float2 uv;
interp_v2_v2v2v2(uv, uv1, uv2, uv3, vertex_weights);
More information about the Bf-blender-cvs
mailing list