Commit: d5c17b2c92d903863a764ba41b6e1210b4950e1e
Author: Kévin Dietrich
Date:   Sun May 17 18:53:49 2015 +0200
Branches: openvdb
https://developer.blender.org/rBd5c17b2c92d903863a764ba41b6e1210b4950e1e

Properly set the fluid transformation matrix.

This time for real, though we need to account for adaptive domain, but
that's for another commit I guess.
Also add metadata to the grid to mark it as in local space.

===================================================================

M       source/blender/blenkernel/intern/smoke.c
M       source/blender/openvdb/intern/openvdb_smoke_export.cpp

===================================================================

diff --git a/source/blender/blenkernel/intern/smoke.c 
b/source/blender/blenkernel/intern/smoke.c
index ae92d95..6c21abd 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -3045,7 +3045,7 @@ int smoke_get_data_flags(SmokeDomainSettings *sds)
 static struct FluidDomainDescr get_fluid_description(SmokeDomainSettings *sds)
 {
        FluidDomainDescr descr;
-       float voxel_size[3], voxel_size_high[3], bbox_min[3];
+       float voxel_size[3], voxel_size_high[3];
 
        descr.active_fields = sds->active_fields;
        descr.fluid_fields = smoke_get_data_flags(sds);
@@ -3053,9 +3053,9 @@ static struct FluidDomainDescr 
get_fluid_description(SmokeDomainSettings *sds)
        copy_v3_v3_int(descr.shift, sds->shift);
        copy_v3_v3(descr.active_color, sds->active_color);
 
-       mul_m4_m4m4(descr.obmat, sds->obmat, sds->imat);
+       copy_m4_m4(descr.obmat, sds->obmat);
 
-       /* Construct a matrix that represents a voxel:
+       /* Construct a matrix which represents the fluid object:
         * vs 0  0  0
         * 0  vs 0  0
         * 0  0  vs 0
@@ -3064,23 +3064,42 @@ static struct FluidDomainDescr 
get_fluid_description(SmokeDomainSettings *sds)
         * bounding box.
         */
 
+       /* construct low res matrix */
        copy_v3_v3(voxel_size, sds->cell_size);
-       mul_mat3_m4_v3(sds->obmat, voxel_size);
+       size_to_mat4(descr.fluidmat, voxel_size);
+       copy_v3_v3(descr.fluidmat[3], sds->p0);
+       mul_m4_m4m4(descr.fluidmat, sds->obmat, descr.fluidmat);
+
+       /* make sure voxels have the same size on all axises */
+       voxel_size[0] = descr.fluidmat[0][0];
+       voxel_size[1] = descr.fluidmat[1][1];
+       voxel_size[2] = descr.fluidmat[2][2];
 
-       /* only consider the max value as due to float precision issues coupled 
with
-        * cuboid domain we might get slightly different xyz values... In short,
-        * voxels should be cubes!
-        */
        copy_v3_fl(voxel_size, max_fff(voxel_size[0], voxel_size[1], 
voxel_size[2]));
 
-       copy_v3_v3(bbox_min, sds->p0);
-       mul_mat3_m4_v3(sds->obmat, bbox_min);
-       size_to_mat4(descr.fluidmat, voxel_size);
-       copy_v3_v3(descr.fluidmat[3], bbox_min);
+       descr.fluidmat[0][0] = voxel_size[0];
+       descr.fluidmat[1][1] = voxel_size[1];
+       descr.fluidmat[2][2] = voxel_size[2];
+
+       if (sds->wt) {
+               /* construct high res matrix */
+               mul_v3_v3fl(voxel_size_high, sds->cell_size, 1.0f / 
(float)(sds->amplify + 1));
+               size_to_mat4(descr.fluidmathigh, voxel_size_high);
+               copy_v3_v3(descr.fluidmathigh[3], sds->p0);
+               mul_m4_m4m4(descr.fluidmathigh, sds->obmat, descr.fluidmathigh);
 
-       mul_v3_v3fl(voxel_size_high, voxel_size, 1.0f / (float)(sds->amplify + 
1));
-       size_to_mat4(descr.fluidmathigh, voxel_size_high);
-       copy_v3_v3(descr.fluidmathigh[3], bbox_min);
+               /* make sure voxels have the same size on all axises */
+               voxel_size_high[0] = descr.fluidmathigh[0][0];
+               voxel_size_high[1] = descr.fluidmathigh[1][1];
+               voxel_size_high[2] = descr.fluidmathigh[2][2];
+
+               copy_v3_fl(voxel_size, max_fff(voxel_size_high[0], 
voxel_size_high[1], voxel_size_high[2]));
+
+               descr.fluidmathigh[0][0] = voxel_size_high[0];
+               descr.fluidmathigh[1][1] = voxel_size_high[1];
+               descr.fluidmathigh[2][2] = voxel_size_high[2];
+
+       }
 
        return descr;
 }
diff --git a/source/blender/openvdb/intern/openvdb_smoke_export.cpp 
b/source/blender/openvdb/intern/openvdb_smoke_export.cpp
index d084552..bd0c728 100644
--- a/source/blender/openvdb/intern/openvdb_smoke_export.cpp
+++ b/source/blender/openvdb/intern/openvdb_smoke_export.cpp
@@ -54,6 +54,7 @@ static void OpenVDB_export_grid(GridPtrVec &gridVec,
        grid->setName(name);
        grid->setGridClass(GRID_FOG_VOLUME);
        grid->setTransform(transform->copy());
+       grid->setIsInWorldSpace(false);
 
        gridVec.push_back(grid);
 }
@@ -82,6 +83,7 @@ static void OpenVDB_export_vector_grid(GridPtrVec &gridVec,
        grid->setName(name);
        grid->setGridClass(GRID_FOG_VOLUME);
        grid->setTransform(transform->copy());
+       grid->setIsInWorldSpace(false);
 
        gridVec.push_back(grid);
 }
@@ -145,9 +147,6 @@ static MetaMap getSimMetaMap(FLUID_3D *fluid, 
FluidDomainDescr descr)
        sim_data.insertMeta("shift", Vec3IMetadata(Vec3I(descr.shift)));
        sim_data.insertMeta("obj_shift_f", 
Vec3SMetadata(Vec3s(descr.obj_shift_f)));
 
-       /* TODO(kevin): Meta datas can't take double matrices, and transforms 
can't
-        * take float matrices, so this is duplicated.
-        */
        Mat4s obj_mat = Mat4s(
                        descr.obmat[0][0], descr.obmat[0][1], 
descr.obmat[0][2], descr.obmat[0][3],
                descr.obmat[1][0], descr.obmat[1][1], descr.obmat[1][2], 
descr.obmat[1][3],
@@ -162,12 +161,6 @@ static MetaMap getSimMetaMap(FLUID_3D *fluid, 
FluidDomainDescr descr)
 
 void OpenVDB_export_fluid(FLUID_3D *fluid, WTURBULENCE *wt, FluidDomainDescr 
descr, const char *filename, float *shadow)
 {
-       Mat4R obj_mat = Mat4R(
-                       descr.obmat[0][0], descr.obmat[0][1], 
descr.obmat[0][2], descr.obmat[0][3],
-               descr.obmat[1][0], descr.obmat[1][1], descr.obmat[1][2], 
descr.obmat[1][3],
-               descr.obmat[2][0], descr.obmat[2][1], descr.obmat[2][2], 
descr.obmat[2][3],
-               descr.obmat[3][0], descr.obmat[3][1], descr.obmat[3][2], 
descr.obmat[3][3]);
-
        Mat4R fluid_mat = Mat4R(
                  descr.fluidmat[0][0], descr.fluidmat[0][1], 
descr.fluidmat[0][2], descr.fluidmat[0][3],
           descr.fluidmat[1][0], descr.fluidmat[1][1], descr.fluidmat[1][2], 
descr.fluidmat[1][3],
@@ -177,7 +170,7 @@ void OpenVDB_export_fluid(FLUID_3D *fluid, WTURBULENCE *wt, 
FluidDomainDescr des
        GridPtrVec gridVec;
        math::CoordBBox bbox(Coord(0), Coord(fluid->_xRes - 1, fluid->_yRes - 
1, fluid->_zRes - 1));
 
-       math::Transform::Ptr transform = 
math::Transform::createLinearTransform(fluid_mat * obj_mat);
+       math::Transform::Ptr transform = 
math::Transform::createLinearTransform(fluid_mat);
 
        OpenVDB_export_grid<FloatGrid>(gridVec, "Shadow", shadow, 0.0f, bbox, 
transform);
        OpenVDB_export_grid<FloatGrid>(gridVec, "Density", fluid->_density, 
0.0f, bbox, transform);
@@ -207,7 +200,7 @@ void OpenVDB_export_fluid(FLUID_3D *fluid, WTURBULENCE *wt, 
FluidDomainDescr des
                  descr.fluidmathigh[2][0], descr.fluidmathigh[2][1], 
descr.fluidmathigh[2][2], descr.fluidmathigh[2][3],
                  descr.fluidmathigh[3][0], descr.fluidmathigh[3][1], 
descr.fluidmathigh[3][2], descr.fluidmathigh[3][3]);
 
-               math::Transform::Ptr transformBig = 
math::Transform::createLinearTransform(fluid_matBig * obj_mat);
+               math::Transform::Ptr transformBig = 
math::Transform::createLinearTransform(fluid_matBig);
                math::CoordBBox bboxBig(Coord(0), Coord(wt->_xResBig - 1, 
wt->_yResBig - 1, wt->_zResBig - 1));
 
                OpenVDB_export_grid<FloatGrid>(gridVec, "Density High", 
wt->_densityBig, 0.0f, bboxBig, transformBig);
@@ -333,12 +326,6 @@ void OpenVDB_update_fluid_transform(const char *filename, 
FluidDomainDescr descr
        /* TODO(kevin): deduplicate this call */
        initialize();
 
-       Mat4R obj_mat = Mat4R(
-               descr.obmat[0][0], descr.obmat[0][1], descr.obmat[0][2], 
descr.obmat[0][3],
-               descr.obmat[1][0], descr.obmat[1][1], descr.obmat[1][2], 
descr.obmat[1][3],
-               descr.obmat[2][0], descr.obmat[2][1], descr.obmat[2][2], 
descr.obmat[2][3],
-               descr.obmat[3][0], descr.obmat[3][1], descr.obmat[3][2], 
descr.obmat[3][3]);
-
        Mat4R fluid_mat = Mat4R(
                descr.fluidmat[0][0], descr.fluidmat[0][1], 
descr.fluidmat[0][2], descr.fluidmat[0][3],
                descr.fluidmat[1][0], descr.fluidmat[1][1], 
descr.fluidmat[1][2], descr.fluidmat[1][3],
@@ -351,8 +338,8 @@ void OpenVDB_update_fluid_transform(const char *filename, 
FluidDomainDescr descr
                descr.fluidmathigh[2][0], descr.fluidmathigh[2][1], 
descr.fluidmathigh[2][2], descr.fluidmathigh[2][3],
                descr.fluidmathigh[3][0], descr.fluidmathigh[3][1], 
descr.fluidmathigh[3][2], descr.fluidmathigh[3][3]);
 
-       math::Transform::Ptr transform = 
math::Transform::createLinearTransform(fluid_mat * obj_mat);
-       math::Transform::Ptr transformBig = 
math::Transform::createLinearTransform(fluid_matBig * obj_mat);
+       math::Transform::Ptr transform = 
math::Transform::createLinearTransform(fluid_mat);
+       math::Transform::Ptr transformBig = 
math::Transform::createLinearTransform(fluid_matBig);
 
        io::File file(filename);
        file.open();

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to