[Bf-blender-cvs] [1b1566a] openvdb: Redesign the VDB API a bit.
Kévin Dietrich
noreply at git.blender.org
Fri Jun 5 14:07:17 CEST 2015
Commit: 1b1566af9861f6e03400636523ba1941aaad51ff
Author: Kévin Dietrich
Date: Fri May 22 02:44:33 2015 +0200
Branches: openvdb
https://developer.blender.org/rB1b1566af9861f6e03400636523ba1941aaad51ff
Redesign the VDB API a bit.
===================================================================
M source/blender/blenkernel/intern/smoke.c
M source/blender/editors/object/object_modifier.c
M source/blender/makesdna/DNA_smoke_types.h
M source/blender/openvdb/CMakeLists.txt
A source/blender/openvdb/intern/openvdb_reader.cpp
A source/blender/openvdb/intern/openvdb_reader.h
M source/blender/openvdb/intern/openvdb_smoke_export.cpp
A source/blender/openvdb/intern/openvdb_writer.cpp
A source/blender/openvdb/intern/openvdb_writer.h
M source/blender/openvdb/openvdb_capi.cpp
M source/blender/openvdb/openvdb_capi.h
M source/blender/openvdb/openvdb_intern.h
===================================================================
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index 18ecf45..f87ba14 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -3091,13 +3091,38 @@ static struct FluidDomainDescr get_fluid_description(SmokeDomainSettings *sds)
return descr;
}
-static void set_fluid_description(SmokeDomainSettings *sds, const FluidDomainDescr descr)
+static void OpenVDB_read_fluid_settings(SmokeDomainSettings *sds, struct OpenVDBReader *reader)
{
- sds->active_fields = descr.active_fields;
- //descr.fluid_fields = smoke_get_data_flags(sds);
- copy_v3_v3(sds->obj_shift_f, descr.obj_shift_f);
- copy_v3_v3_int(sds->shift, descr.shift);
- copy_v3_v3(sds->active_color, descr.active_color);
+ OpenVDBReader_get_meta_int(reader, "active_fields", &sds->active_fields);
+ OpenVDBReader_get_meta_v3_int(reader, "resolution", sds->res);
+ OpenVDBReader_get_meta_v3_int(reader, "min_resolution", sds->res_min);
+ OpenVDBReader_get_meta_v3_int(reader, "max_resolution", sds->res_max);
+ OpenVDBReader_get_meta_v3_int(reader, "base_resolution", sds->base_res);
+ OpenVDBReader_get_meta_fl(reader, "delta_x", &sds->dx);
+ OpenVDBReader_get_meta_v3(reader, "min_bbox", sds->p0);
+ OpenVDBReader_get_meta_v3(reader, "max_bbox", sds->p1);
+ OpenVDBReader_get_meta_v3(reader, "dp0", sds->dp0);
+ OpenVDBReader_get_meta_v3_int(reader, "shift", sds->shift);
+ OpenVDBReader_get_meta_v3(reader, "obj_shift_f", sds->obj_shift_f);
+ OpenVDBReader_get_meta_v3(reader, "active_color", sds->active_color);
+ OpenVDBReader_get_meta_mat4(reader, "obmat", sds->obmat);
+}
+
+static void OpenVDB_write_fluid_settings(SmokeDomainSettings *sds, struct OpenVDBWriter *writer)
+{
+ OpenVDBWriter_add_meta_int(writer, "active_fields", sds->active_fields);
+ OpenVDBWriter_add_meta_v3_int(writer, "resolution", sds->res);
+ OpenVDBWriter_add_meta_v3_int(writer, "min_resolution", sds->res_min);
+ OpenVDBWriter_add_meta_v3_int(writer, "max_resolution", sds->res_max);
+ OpenVDBWriter_add_meta_v3_int(writer, "base_resolution", sds->base_res);
+ OpenVDBWriter_add_meta_fl(writer, "delta_x", sds->dx);
+ OpenVDBWriter_add_meta_v3(writer, "min_bbox", sds->p0);
+ OpenVDBWriter_add_meta_v3(writer, "max_bbox", sds->p1);
+ OpenVDBWriter_add_meta_v3(writer, "dp0", sds->dp0);
+ OpenVDBWriter_add_meta_v3_int(writer, "shift", sds->shift);
+ OpenVDBWriter_add_meta_v3(writer, "obj_shift_f", sds->obj_shift_f);
+ OpenVDBWriter_add_meta_v3(writer, "active_color", sds->active_color);
+ OpenVDBWriter_add_meta_mat4(writer, "obmat", sds->obmat);
}
static void cache_filename(char *string, const char *path, const char *fname, const char *relbase, int frame)
@@ -3116,12 +3141,146 @@ static void cache_filename(char *string, const char *path, const char *fname, co
BLI_ensure_extension(string, FILE_MAX, ".vdb");
}
+static void OpenVDB_export_smoke(SmokeDomainSettings *sds, struct OpenVDBWriter *writer)
+{
+ int fluid_fields;
+
+ OpenVDBWriter_add_meta_int(writer, "fluid_fields", fluid_fields);
+
+ if (sds->fluid) {
+ float dt, dx, *dens, *react, *fuel, *flame, *heat, *heatold, *vx, *vy, *vz, *r, *g, *b;
+ unsigned char *obstacles;
+
+ smoke_export(sds->fluid, &dt, &dx, &dens, &react, &flame, &fuel, &heat,
+ &heatold, &vx, &vy, &vz, &r, &g, &b, &obstacles);
+
+ OpenVDBWriter_add_meta_int(writer, "dx", dx);
+ OpenVDBWriter_add_meta_int(writer, "dt", dx);
+
+ OpenVDB_export_grid_fl(writer, "shadow", sds->shadow, sds->res, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "density", dens, sds->res, sds->obmat);
+
+ if (fluid_fields & SM_ACTIVE_HEAT) {
+ OpenVDB_export_grid_fl(writer, "heat", heat, sds->res, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "heatold", heatold, sds->res, sds->obmat);
+ }
+
+ if (fluid_fields & SM_ACTIVE_FIRE) {
+ OpenVDB_export_grid_fl(writer, "flame", flame, sds->res, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "fuel", fuel, sds->res, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "react", react, sds->res, sds->obmat);
+ }
+
+ if (fluid_fields & SM_ACTIVE_COLORS) {
+ OpenVDB_export_grid_fl(writer, "red", r, sds->res, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "green", g, sds->res, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "blue", b, sds->res, sds->obmat);
+ }
+
+ OpenVDB_export_grid_fl(writer, "vx", vx, sds->res, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "vy", vy, sds->res, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "vz", vz, sds->res, sds->obmat);
+
+ OpenVDB_export_grid_ch(writer, "obstacles", obstacles, sds->res, sds->obmat);
+ }
+
+ if (sds->wt) {
+ float *dens, *react, *fuel, *flame, *tcu, *tcv, *tcw, *r, *g, *b;
+
+ smoke_turbulence_export(sds->wt, &dens, &react, &flame, &fuel, &r, &g, &b, &tcu, &tcv, &tcw);
+
+ OpenVDB_export_grid_fl(writer, "density", dens, sds->res, sds->obmat);
+
+ if (fluid_fields & SM_ACTIVE_FIRE) {
+ OpenVDB_export_grid_fl(writer, "flame high", flame, sds->res_wt, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "fuel high", fuel, sds->res_wt, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "react high", react, sds->res_wt, sds->obmat);
+ }
+
+ if (fluid_fields & SM_ACTIVE_COLORS) {
+ OpenVDB_export_grid_fl(writer, "red high", r, sds->res, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "green high", g, sds->res, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "blue high", b, sds->res, sds->obmat);
+ }
+
+ OpenVDB_export_grid_fl(writer, "tcu", tcu, sds->res, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "tcv", tcv, sds->res, sds->obmat);
+ OpenVDB_export_grid_fl(writer, "tcw", tcw, sds->res, sds->obmat);
+ }
+}
+
+static void OpenVDB_import_smoke(SmokeDomainSettings *sds, struct OpenVDBReader *reader)
+{
+ int fluid_fields = smoke_get_data_flags(sds);
+
+ if (sds->fluid) {
+ float dt, dx, *dens, *react, *fuel, *flame, *heat, *heatold, *vx, *vy, *vz, *r, *g, *b;
+ unsigned char *obstacles;
+
+ smoke_export(sds->fluid, &dt, &dx, &dens, &react, &flame, &fuel, &heat,
+ &heatold, &vx, &vy, &vz, &r, &g, &b, &obstacles);
+
+ OpenVDBReader_get_meta_int(reader, "fluid_fields", &fluid_fields);
+ OpenVDBReader_get_meta_fl(reader, "dx", &dx);
+ OpenVDBReader_get_meta_fl(reader, "dt", &dx);
+
+ OpenVDB_import_grid_fl(reader, "shadow", &sds->shadow, sds->res);
+ OpenVDB_import_grid_fl(reader, "density", &dens, sds->res);
+
+ if (fluid_fields & SM_ACTIVE_HEAT) {
+ OpenVDB_import_grid_fl(reader, "heat", &heat, sds->res);
+ OpenVDB_import_grid_fl(reader, "heatold", &heatold, sds->res);
+ }
+
+ if (fluid_fields & SM_ACTIVE_FIRE) {
+ OpenVDB_import_grid_fl(reader, "flame", &flame, sds->res);
+ OpenVDB_import_grid_fl(reader, "fuel", &fuel, sds->res);
+ OpenVDB_import_grid_fl(reader, "react", &react, sds->res);
+ }
+
+ if (fluid_fields & SM_ACTIVE_COLORS) {
+ OpenVDB_import_grid_fl(reader, "red", &r, sds->res);
+ OpenVDB_import_grid_fl(reader, "green", &g, sds->res);
+ OpenVDB_import_grid_fl(reader, "blue", &b, sds->res);
+ }
+
+ OpenVDB_import_grid_fl(reader, "vx", &vx, sds->res);
+ OpenVDB_import_grid_fl(reader, "vy", &vy, sds->res);
+ OpenVDB_import_grid_fl(reader, "vz", &vz, sds->res);
+
+ OpenVDB_import_grid_ch(reader, "obstacles", &obstacles, sds->res);
+ }
+
+ if (sds->wt) {
+ float *dens, *react, *fuel, *flame, *tcu, *tcv, *tcw, *r, *g, *b;
+
+ smoke_turbulence_export(sds->wt, &dens, &react, &flame, &fuel, &r, &g, &b, &tcu, &tcv, &tcw);
+
+ OpenVDB_import_grid_fl(reader, "density", &dens, sds->res);
+
+ if (fluid_fields & SM_ACTIVE_FIRE) {
+ OpenVDB_import_grid_fl(reader, "flame high", &flame, sds->res_wt);
+ OpenVDB_import_grid_fl(reader, "fuel high", &fuel, sds->res_wt);
+ OpenVDB_import_grid_fl(reader, "react high", &react, sds->res_wt);
+ }
+
+ if (fluid_fields & SM_ACTIVE_COLORS) {
+ OpenVDB_import_grid_fl(reader, "red high", &r, sds->res_wt);
+ OpenVDB_import_grid_fl(reader, "green high", &g, sds->res_wt);
+ OpenVDB_import_grid_fl(reader, "blue high", &b, sds->res_wt);
+ }
+
+ OpenVDB_import_grid_fl(reader, "tcu", &tcu, sds->res);
+ OpenVDB_import_grid_fl(reader, "tcv", &tcv, sds->res);
+ OpenVDB_import_grid_fl(reader, "tcw", &tcw, sds->res);
+ }
+}
+
void smokeModifier_OpenVDB_export(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedMesh *dm,
update_cb update, void *update_cb_data)
{
SmokeDomainSettings *sds = smd->domain;
OpenVDBCache *cache;
- FluidDomainDescr descr;
int orig_frame, fr, cancel = 0;
float progress;
const char *relbase = modifier_path_relbase(ob);
@@ -3130,6 +3289,8 @@ void smokeModifier_OpenVDB_export(SmokeModifierData *smd, Scene *scene, Object *
orig_frame = scene->r.cfra;
cache = BKE_openvdb_get_current_cache(sds);
+ cache->writer = OpenVDBWriter_create();
+ OpenVDBWriter_set_compression(cache->writer, 0);
for (fr = cache->startframe; fr <= cache->endframe; fr++) {
/* smd->time is overwritten with scene->r.cfra in smokeModifier_process,
@@ -3139,11 +3300,13 @@ void smokeModifier_OpenVDB_export(SmokeModifierData *smd, Scene *scene, Object *
cache_filename(filename, cache->path, cache->name, relbase, fr);
smokeModifier_process(smd, scene, ob, dm, false);
- descr = get_fluid_description(sds);
- OpenVDB_export_fluid(sds->fluid, sds->wt, descr, filename, sds->shadow);
+ OpenVDB_write_fluid_settings(sds, cache->writer);
+ OpenVDB_export_smoke(sds, cache->writer);
progress = (fr - cache->startframe) / (float)cache->endframe;
+ OpenVDBWriter_write(cache->writer, filename);
+
update(update_cb_data, progress, &cancel);
if (cancel) {
@@ -3161,7 +3324,6 @@ void smokeModifier_OpenVDB_import(SmokeModifierData *smd, Scene *scene, Object *
{
SmokeDomainSettings *sds = smd->domain;
OpenVDBCache *cache;
- FluidDomainDescr descr;
int startframe, endframe;
char filename[FILE_MAX];
const char *relbase = modifier_path_relbase(ob);
@@ -3177,7 +3339,13 @@ void smokeModifier_OpenVDB_import(SmokeModifierData *smd, Scene *scene, Object *
cache_filename(filename, cache->path, cache->name, relbase, CFRA);
- ret = OpenVDB_import_fluid(sds->fluid, sds->wt, &descr, filename, sds->shadow);
+ cache->reader = OpenVDBReader_create(filename);
+
+ OpenVDB_read_fl
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list