[Bf-blender-cvs] [60ba69ffb58] master: Cleanup: use openvdb matrices properly
Jacques Lucke
noreply at git.blender.org
Mon Oct 12 14:26:37 CEST 2020
Commit: 60ba69ffb58f77355be628283f4bb5cb7a6669e1
Author: Jacques Lucke
Date: Mon Oct 12 14:24:25 2020 +0200
Branches: master
https://developer.blender.org/rB60ba69ffb58f77355be628283f4bb5cb7a6669e1
Cleanup: use openvdb matrices properly
Before I was double confused about how openvdb stores its
transformation matrices. Now, I know they have the same layout
physically in memory, but are logically transposed (i.e. the translation
is in the last row instead of in the last column).
===================================================================
M source/blender/modifiers/intern/MOD_volume_displace.cc
===================================================================
diff --git a/source/blender/modifiers/intern/MOD_volume_displace.cc b/source/blender/modifiers/intern/MOD_volume_displace.cc
index 535fdc762b8..f26aa729f3b 100644
--- a/source/blender/modifiers/intern/MOD_volume_displace.cc
+++ b/source/blender/modifiers/intern/MOD_volume_displace.cc
@@ -136,18 +136,17 @@ static void panelRegister(ARegionType *region_type)
static openvdb::Mat4s matrix_to_openvdb(const float m[4][4])
{
- /* This constructor expects floats in row-major form. Therefore the matrix is transposed
- * afterwards. */
+ /* Openvdb matrices are transposed Blender matrices, i.e. the translation is in the last row
+ * instead of in the last column. However, the layout in memory is the same, because openvdb
+ * matrices are row major (compared to Blender's column major matrices). */
openvdb::Mat4s new_matrix{reinterpret_cast<const float *>(m)};
- new_matrix = new_matrix.transpose();
return new_matrix;
}
template<typename GridType> struct DisplaceOp {
/* Has to be copied for each thread. */
typename GridType::ConstAccessor accessor;
- /* This is the transform of the grid that is being displaced. */
- openvdb::Mat4s index_to_texture;
+ const openvdb::Mat4s index_to_texture;
Tex *texture;
const double strength;
@@ -167,9 +166,11 @@ template<typename GridType> struct DisplaceOp {
openvdb::Vec3d compute_displace_vector(const openvdb::Coord &coord) const
{
if (this->texture != NULL) {
- const openvdb::Vec3f texture_pos = this->index_to_texture * coord.asVec3s();
- openvdb::Vec3d displace_vector = this->evaluate_texture(texture_pos);
- return (displace_vector - this->texture_mid_level) * this->strength;
+ const openvdb::Vec3f texture_pos = coord.asVec3s() * this->index_to_texture;
+ const openvdb::Vec3d texture_value = this->evaluate_texture(texture_pos);
+ const openvdb::Vec3d displacement = (texture_value - this->texture_mid_level) *
+ this->strength;
+ return displacement;
}
return openvdb::Vec3d{0, 0, 0};
}
@@ -185,9 +186,8 @@ template<typename GridType> struct DisplaceOp {
static float get_max_voxel_side_length(const openvdb::GridBase &grid)
{
- const openvdb::Mat3d matrix = grid.transform().baseMap()->getAffineMap()->getMat4().getMat3();
- const float max_voxel_side_length = std::max(
- {matrix.col(0).length(), matrix.col(1).length(), matrix.col(2).length()});
+ const openvdb::Vec3d voxel_size = grid.voxelSize();
+ const float max_voxel_side_length = std::max({voxel_size[0], voxel_size[1], voxel_size[2]});
return max_voxel_side_length;
}
@@ -266,7 +266,7 @@ struct DisplaceGridOp {
}
case MOD_VOLUME_DISPLACE_MAP_GLOBAL: {
const openvdb::Mat4s object_to_world = matrix_to_openvdb(ctx.object->obmat);
- return object_to_world * index_to_object;
+ return index_to_object * object_to_world;
}
case MOD_VOLUME_DISPLACE_MAP_OBJECT: {
if (vdmd.texture_map_object == NULL) {
@@ -274,9 +274,10 @@ struct DisplaceGridOp {
}
const openvdb::Mat4s object_to_world = matrix_to_openvdb(ctx.object->obmat);
const openvdb::Mat4s world_to_texture = matrix_to_openvdb(vdmd.texture_map_object->imat);
- return world_to_texture * object_to_world * index_to_object;
+ return index_to_object * object_to_world * world_to_texture;
}
}
+ BLI_assert(false);
return {};
}
};
More information about the Bf-blender-cvs
mailing list