[Bf-blender-cvs] [df9d4f4] openvdb: Add an operator to update the transformation matrices of the grids.
Kévin Dietrich
noreply at git.blender.org
Fri Jun 5 14:06:24 CEST 2015
Commit: df9d4f4bff50f3467e751c697f85917a3b140c8b
Author: Kévin Dietrich
Date: Sat May 16 11:20:29 2015 +0200
Branches: openvdb
https://developer.blender.org/rBdf9d4f4bff50f3467e751c697f85917a3b140c8b
Add an operator to update the transformation matrices of the grids.
===================================================================
M release/scripts/startup/bl_ui/properties_physics_smoke.py
M source/blender/blenkernel/BKE_smoke.h
M source/blender/blenkernel/intern/smoke.c
M source/blender/editors/object/object_intern.h
M source/blender/editors/object/object_modifier.c
M source/blender/editors/object/object_ops.c
M source/blender/openvdb/intern/openvdb_smoke_export.cpp
M source/blender/openvdb/openvdb_capi.cpp
M source/blender/openvdb/openvdb_capi.h
M source/blender/openvdb/openvdb_intern.h
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_physics_smoke.py b/release/scripts/startup/bl_ui/properties_physics_smoke.py
index 115c0ca..270f091 100644
--- a/release/scripts/startup/bl_ui/properties_physics_smoke.py
+++ b/release/scripts/startup/bl_ui/properties_physics_smoke.py
@@ -338,6 +338,7 @@ class PHYSICS_PT_smoke_openvdb(PhysicButtonsPanel, Panel):
row.prop(domain, "frame_start")
row.prop(domain, "frame_end")
layout.operator("object.smoke_vdb_export")
+ layout.operator("object.smoke_vdb_transform_update")
class PHYSICS_PT_smoke_field_weights(PhysicButtonsPanel, Panel):
diff --git a/source/blender/blenkernel/BKE_smoke.h b/source/blender/blenkernel/BKE_smoke.h
index 1ab6477..3045336 100644
--- a/source/blender/blenkernel/BKE_smoke.h
+++ b/source/blender/blenkernel/BKE_smoke.h
@@ -52,11 +52,19 @@ int smoke_get_data_flags(struct SmokeDomainSettings *sds);
struct FluidDomainDescr get_fluid_description(struct SmokeDomainSettings *sds, struct Object *ob);
+typedef void (*update_cb)(void *, float progress, int *cancel);
+
void smokeModifier_OpenVDB_export(struct SmokeModifierData *smd, struct Scene *scene,
struct Object *ob, struct DerivedMesh *dm,
- void (*update_cb)(void *, float progress, int *cancel),
+ update_cb update,
void *update_cb_data);
+void smokeModifier_OpenVDB_update_transform(struct SmokeModifierData *smd,
+ struct Scene *scene,
+ struct Object *ob,
+ update_cb update,
+ void *update_cb_data);
+
void smokeModifier_OpenVDB_import(struct SmokeModifierData *smd, struct Scene *scene, struct Object *ob);
#endif /* __BKE_SMOKE_H__ */
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index 727b076..dc0fbf1 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -3109,8 +3109,7 @@ static void cache_filename(char *string, const char *path, const char *relbase,
}
void smokeModifier_OpenVDB_export(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedMesh *dm,
- void (*update_cb)(void *, float progress, int *cancel),
- void *update_cb_data)
+ update_cb update, void *update_cb_data)
{
SmokeDomainSettings *sds = smd->domain;
int orig_frame, fr, cancel = 0;
@@ -3133,7 +3132,7 @@ void smokeModifier_OpenVDB_export(SmokeModifierData *smd, Scene *scene, Object *
progress = (fr - sds->startframe) / (float)sds->endframe;
- update_cb(update_cb_data, progress, &cancel);
+ update(update_cb_data, progress, &cancel);
if (cancel) {
scene->r.cfra = orig_frame;
@@ -3181,4 +3180,41 @@ void smokeModifier_OpenVDB_import(SmokeModifierData *smd, Scene *scene, Object *
printf("%s\n", __func__);
}
+void smokeModifier_OpenVDB_update_transform(SmokeModifierData *smd,
+ Scene *scene,
+ Object *ob,
+ update_cb update,
+ void *update_cb_data)
+{
+ SmokeDomainSettings *sds = smd->domain;
+ int orig_frame, fr, cancel = 0;
+ float progress;
+ const char *relbase = modifier_path_relbase(ob);
+ char filename[FILE_MAX];
+
+ orig_frame = scene->r.cfra;
+
+ for (fr = sds->startframe; fr <= sds->endframe; fr++) {
+ FluidDomainDescr descr = get_fluid_description(sds, ob);
+ /* smd->time is overwritten with scene->r.cfra in smokeModifier_process,
+ * so we can't use it here... */
+ scene->r.cfra = fr;
+
+ cache_filename(filename, sds->path, relbase, fr);
+
+ OpenVDB_update_fluid_transform(filename, descr);
+
+ progress = (fr - sds->startframe) / (float)sds->endframe;
+
+ update(update_cb_data, progress, &cancel);
+
+ if (cancel) {
+ scene->r.cfra = orig_frame;
+ return;
+ }
+ }
+
+ scene->r.cfra = orig_frame;
+}
+
#endif /* WITH_SMOKE */
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index 89575e1..dda38f0 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -185,6 +185,7 @@ void OBJECT_OT_skin_radii_equalize(struct wmOperatorType *ot);
void OBJECT_OT_skin_armature_create(struct wmOperatorType *ot);
void OBJECT_OT_laplaciandeform_bind(struct wmOperatorType *ot);
void OBJECT_OT_smoke_vdb_export(struct wmOperatorType *ot);
+void OBJECT_OT_smoke_vdb_transform_update(struct wmOperatorType *ot);
/* object_constraint.c */
void OBJECT_OT_constraint_add(struct wmOperatorType *ot);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 112dffe..5f0142b 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2410,3 +2410,66 @@ void OBJECT_OT_smoke_vdb_export(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
}
+
+static void smoke_transform_startjob(void *customdata, short *stop, short *do_update, float *progress)
+{
+ SmokeExportJob *sej = customdata;
+
+ sej->stop = stop;
+ sej->do_update = do_update;
+ sej->progress = progress;
+
+ G.is_break = false;
+
+ smokeModifier_OpenVDB_update_transform(sej->smd, sej->scene, sej->ob, sej->dm,
+ smoke_export_update, (void *)sej);
+
+ *do_update = true;
+ *stop = 0;
+}
+
+static int smoke_transform_exec(bContext *C, wmOperator *op)
+{
+ Object *ob = ED_object_active_context(C);
+ SmokeModifierData *smd = (SmokeModifierData *)modifiers_findByType(ob, eModifierType_Smoke);
+ Scene *scene = CTX_data_scene(C);
+ wmJob *wm_job;
+ SmokeExportJob *sej;
+
+ if (!smd) {
+ return OPERATOR_CANCELLED;
+ }
+
+ /* setup job */
+ wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "OpenVDB export",
+ WM_JOB_PROGRESS, WM_JOB_TYPE_SMOKE_EXPORT);
+
+ sej = MEM_callocN(sizeof(SmokeExportJob), "smoke export job");
+ sej->smd = smd;
+ sej->scene = scene;
+ sej->ob = ob;
+ sej->dm = ob->derivedDeform;
+
+ WM_jobs_customdata_set(wm_job, sej, smoke_export_free);
+ WM_jobs_timer(wm_job, 0.1, NC_OBJECT | ND_MODIFIER, NC_OBJECT | ND_MODIFIER);
+ WM_jobs_callbacks(wm_job, smoke_transform_startjob, NULL, NULL, smoke_export_endjob);
+
+ WM_jobs_start(CTX_wm_manager(C), wm_job);
+
+ return OPERATOR_FINISHED;
+
+ UNUSED_VARS(op);
+}
+
+void OBJECT_OT_smoke_vdb_transform_update(wmOperatorType *ot)
+{
+ ot->name = "Update transform matrix";
+ ot->description = "Update transformation matrices for all grids in the file";
+ ot->idname = "OBJECT_OT_smoke_vdb_transform_update";
+
+ ot->poll = ED_operator_object_active_editable;
+ ot->exec = smoke_transform_exec;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
+}
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index c60e4d1..7ecf2dc 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -246,6 +246,7 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_unlink_data);
WM_operatortype_append(OBJECT_OT_laplaciandeform_bind);
WM_operatortype_append(OBJECT_OT_smoke_vdb_export);
+ WM_operatortype_append(OBJECT_OT_smoke_vdb_transform_update);
WM_operatortype_append(OBJECT_OT_lod_add);
WM_operatortype_append(OBJECT_OT_lod_remove);
diff --git a/source/blender/openvdb/intern/openvdb_smoke_export.cpp b/source/blender/openvdb/intern/openvdb_smoke_export.cpp
index b04f283..d084552 100644
--- a/source/blender/openvdb/intern/openvdb_smoke_export.cpp
+++ b/source/blender/openvdb/intern/openvdb_smoke_export.cpp
@@ -328,4 +328,52 @@ void OpenVDB_import_fluid(FLUID_3D *fluid, WTURBULENCE *wt, FluidDomainDescr *de
file.close();
}
+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],
+ descr.fluidmat[2][0], descr.fluidmat[2][1], descr.fluidmat[2][2], descr.fluidmat[2][3],
+ descr.fluidmat[3][0], descr.fluidmat[3][1], descr.fluidmat[3][2], descr.fluidmat[3][3]);
+
+ Mat4R fluid_matBig = Mat4R(
+ descr.fluidmathigh[0][0], descr.fluidmathigh[0][1], descr.fluidmathigh[0][2], descr.fluidmathigh[0][3],
+ descr.fluidmathigh[1][0], descr.fluidmathigh[1][1], descr.fluidmathigh[1][2], descr.fluidmathigh[1][3],
+ 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);
+
+ io::File file(filename);
+ file.open();
+ GridPtrVecPtr grids = file.getGrids();
+ GridBase::Ptr grid;
+
+ for (size_t i = 0; i < grids->size(); ++i) {
+ grid = (*grids)[i];
+
+ const std::string name = grid->getName();
+ size_t found = name.find("High");
+
+ if (found != std::string::npos) {
+ grid->setTransform(transformBig);
+ }
+ else {
+ grid->setTransform(transform);
+ }
+ }
+
+ file.close();
+}
+
} // namespac
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list