[Bf-blender-cvs] [8d40c8d] soc-2014-fluid: Defining Interfaces for Manta_API
Roman Pogribnyi
noreply at git.blender.org
Tue Nov 11 23:42:59 CET 2014
Commit: 8d40c8de5adc97259c64917657070956189c4cc9
Author: Roman Pogribnyi
Date: Sun Oct 26 21:59:40 2014 +0100
Branches: soc-2014-fluid
https://developer.blender.org/rB8d40c8de5adc97259c64917657070956189c4cc9
Defining Interfaces for Manta_API
===================================================================
M intern/smoke/extern/smoke_API.h
M intern/smoke/intern/smoke_API.cpp
M source/blender/makesdna/DNA_smoke_types.h
===================================================================
diff --git a/intern/smoke/extern/smoke_API.h b/intern/smoke/extern/smoke_API.h
index 938cd7a..cb6f8e5 100644
--- a/intern/smoke/extern/smoke_API.h
+++ b/intern/smoke/extern/smoke_API.h
@@ -35,6 +35,7 @@
extern "C" {
#endif
+#ifndef USE_MANTA /*old Blender Solver*/
struct FLUID_3D;
// low res
@@ -70,14 +71,11 @@ unsigned char *smoke_get_obstacle(struct FLUID_3D *fluid);
size_t smoke_get_index(int x, int max_x, int y, int max_y, int z);
size_t smoke_get_index2d(int x, int max_x, int y);
-
void smoke_dissolve(struct FLUID_3D *fluid, int speed, int log);
-
// wavelet turbulence functions
struct WTURBULENCE *smoke_turbulence_init(int *res, int amplify, int noisetype, const char *noisefile_path, int use_fire, int use_colors);
void smoke_turbulence_free(struct WTURBULENCE *wt);
void smoke_turbulence_step(struct WTURBULENCE *wt, struct FLUID_3D *fluid);
-
float *smoke_turbulence_get_density(struct WTURBULENCE *wt);
float *smoke_turbulence_get_color_r(struct WTURBULENCE *wt);
float *smoke_turbulence_get_color_g(struct WTURBULENCE *wt);
@@ -92,27 +90,103 @@ int smoke_turbulence_get_cells(struct WTURBULENCE *wt);
void smoke_turbulence_set_noise(struct WTURBULENCE *wt, int type, const char *noisefile_path);
void smoke_initWaveletBlenderRNA(struct WTURBULENCE *wt, float *strength);
void smoke_dissolve_wavelet(struct WTURBULENCE *wt, int speed, int log);
-
/* export */
void smoke_export(struct FLUID_3D *fluid, float *dt, float *dx, float **dens, float **react, float **flame, float **fuel, float **heat, float **heatold,
float **vx, float **vy, float **vz, float **r, float **g, float **b, unsigned char **obstacles);
void smoke_turbulence_export(struct WTURBULENCE *wt, float **dens, float **react, float **flame, float **fuel,
float **r, float **g, float **b, float **tcu, float **tcv, float **tcw);
-
/* flame spectrum */
void flame_get_spectrum(unsigned char *spec, int width, float t1, float t2);
-
/* data fields */
int smoke_has_heat(struct FLUID_3D *fluid);
int smoke_has_fuel(struct FLUID_3D *fluid);
int smoke_has_colors(struct FLUID_3D *fluid);
int smoke_turbulence_has_fuel(struct WTURBULENCE *wt);
int smoke_turbulence_has_colors(struct WTURBULENCE *wt);
-
void smoke_ensure_heat(struct FLUID_3D *fluid);
void smoke_ensure_fire(struct FLUID_3D *fluid, struct WTURBULENCE *wt);
void smoke_ensure_colors(struct FLUID_3D *fluid, struct WTURBULENCE *wt, float init_r, float init_g, float init_b);
+
+
+#else /* using Mantaflow structures */
+ struct Manta_API;
+ struct Manta_API *smoke_init(int *res, float dx, float dtdef, int use_heat, int use_fire, int use_colors);
+ void smoke_free(struct Manta_API *fluid);
+
+ void smoke_initBlenderRNA(struct Manta_API *fluid, float *alpha, float *beta, float *dt_factor, float *vorticity, int *border_colli, float *burning_rate,
+ float *flame_smoke, float *flame_smoke_color, float *flame_vorticity, float *flame_ignition_temp, float *flame_max_temp);
+ void smoke_step(struct Manta_API *fluid, float gravity[3], float dtSubdiv);
+
+ float *smoke_get_density(struct Manta_API *fluid);
+ float *smoke_get_flame(struct Manta_API *fluid);
+ float *smoke_get_fuel(struct Manta_API *fluid);
+ float *smoke_get_react(struct Manta_API *fluid);
+ float *smoke_get_color_r(struct Manta_API *fluid);
+ float *smoke_get_color_g(struct Manta_API *fluid);
+ float *smoke_get_color_b(struct Manta_API *fluid);
+ void smoke_get_rgba(struct Manta_API *fluid, float *data, int sequential);
+ void smoke_get_rgba_from_density(struct Manta_API *fluid, float color[3], float *data, int sequential);
+ float *smoke_get_heat(struct Manta_API *fluid);
+ float *smoke_get_velocity_x(struct Manta_API *fluid);
+ float *smoke_get_velocity_y(struct Manta_API *fluid);
+ float *smoke_get_velocity_z(struct Manta_API *fluid);
+
+ /* Moving obstacle velocity provided by blender */
+ void smoke_get_ob_velocity(struct Manta_API *fluid, float **x, float **y, float **z);
+
+ float *smoke_get_force_x(struct Manta_API *fluid);
+ float *smoke_get_force_y(struct Manta_API *fluid);
+ float *smoke_get_force_z(struct Manta_API *fluid);
+
+ unsigned char *smoke_get_obstacle(struct Manta_API *fluid);
+
+ size_t smoke_get_index(int x, int max_x, int y, int max_y, int z);
+ size_t smoke_get_index2d(int x, int max_x, int y);
+
+ void smoke_dissolve(struct Manta_API *fluid, int speed, int log);
+
+ // wavelet turbulence functions
+ struct WTURBULENCE *smoke_turbulence_init(int *res, int amplify, int noisetype, const char *noisefile_path, int use_fire, int use_colors);
+ void smoke_turbulence_free(struct WTURBULENCE *wt);
+ void smoke_turbulence_step(struct WTURBULENCE *wt, struct Manta_API *fluid);
+
+ float *smoke_turbulence_get_density(struct WTURBULENCE *wt);
+ float *smoke_turbulence_get_color_r(struct WTURBULENCE *wt);
+ float *smoke_turbulence_get_color_g(struct WTURBULENCE *wt);
+ float *smoke_turbulence_get_color_b(struct WTURBULENCE *wt);
+ void smoke_turbulence_get_rgba(struct WTURBULENCE *wt, float *data, int sequential);
+ void smoke_turbulence_get_rgba_from_density(struct WTURBULENCE *wt, float color[3], float *data, int sequential);
+ float *smoke_turbulence_get_flame(struct WTURBULENCE *wt);
+ float *smoke_turbulence_get_fuel(struct WTURBULENCE *wt);
+ float *smoke_turbulence_get_react(struct WTURBULENCE *wt);
+ void smoke_turbulence_get_res(struct WTURBULENCE *wt, int *res);
+ int smoke_turbulence_get_cells(struct WTURBULENCE *wt);
+ void smoke_turbulence_set_noise(struct WTURBULENCE *wt, int type, const char *noisefile_path);
+ void smoke_initWaveletBlenderRNA(struct WTURBULENCE *wt, float *strength);
+ void smoke_dissolve_wavelet(struct WTURBULENCE *wt, int speed, int log);
+
+ /* export */
+ void smoke_export(struct Manta_API *fluid, float *dt, float *dx, float **dens, float **react, float **flame, float **fuel, float **heat, float **heatold,
+ float **vx, float **vy, float **vz, float **r, float **g, float **b, unsigned char **obstacles);
+ void smoke_turbulence_export(struct WTURBULENCE *wt, float **dens, float **react, float **flame, float **fuel,
+ float **r, float **g, float **b, float **tcu, float **tcv, float **tcw);
+
+ /* flame spectrum */
+ void flame_get_spectrum(unsigned char *spec, int width, float t1, float t2);
+
+ /* data fields */
+ int smoke_has_heat(struct Manta_API *fluid);
+ int smoke_has_fuel(struct Manta_API *fluid);
+ int smoke_has_colors(struct Manta_API *fluid);
+ int smoke_turbulence_has_fuel(struct WTURBULENCE *wt);
+ int smoke_turbulence_has_colors(struct WTURBULENCE *wt);
+
+ void smoke_ensure_heat(struct Manta_API *fluid);
+ void smoke_ensure_fire(struct Manta_API *fluid, struct WTURBULENCE *wt);
+ void smoke_ensure_colors(struct Manta_API *fluid, struct WTURBULENCE *wt, float init_r, float init_g, float init_b);
+#endif /*USE_MANTA*/
+
/*Mantaflow functions*/
int smoke_mantaflow_read(struct SmokeDomainSettings *sds, char* name, bool with_wavelets); //1:success, 0: no file,error
void smoke_mantaflow_write_scene_file(struct SmokeModifierData *smd);
diff --git a/intern/smoke/intern/smoke_API.cpp b/intern/smoke/intern/smoke_API.cpp
index abb5427..edd803c 100644
--- a/intern/smoke/intern/smoke_API.cpp
+++ b/intern/smoke/intern/smoke_API.cpp
@@ -39,6 +39,8 @@
#include "../extern/smoke_API.h" /* to ensure valid prototypes */
+#ifndef USE_MANTA
+
extern "C" FLUID_3D *smoke_init(int *res, float dx, float dtdef, int use_heat, int use_fire, int use_colors)
{
FLUID_3D *fluid = new FLUID_3D(res, dx, dtdef, use_heat, use_fire, use_colors);
@@ -500,6 +502,471 @@ extern "C" void smoke_ensure_colors(FLUID_3D *fluid, WTURBULENCE *wt, float init
}
}
+#else /* USE_MANTA */
+
+extern "C" Manta_API *smoke_init(int *res, float dx, float dtdef, int use_heat, int use_fire, int use_colors)
+{
+ Manta_API *fluid = new Manta_API(res, dx, dtdef, use_heat, use_fire, use_colors);
+ return fluid;
+}
+
+extern "C" WTURBULENCE *smoke_turbulence_init(int *res, int amplify, int noisetype, const char *noisefile_path, int use_fire, int use_colors)
+{
+ if (amplify)
+ return new WTURBULENCE(res[0],res[1],res[2], amplify, noisetype, noisefile_path, use_fire, use_colors);
+ else
+ return NULL;
+}
+
+extern "C" void smoke_free(Manta_API *fluid)
+{
+ delete fluid;
+ fluid = NULL;
+}
+
+extern "C" void smoke_turbulence_free(WTURBULENCE *wt)
+{
+ delete wt;
+ wt = NULL;
+}
+
+extern "C" size_t smoke_get_index(int x, int max_x, int y, int max_y, int z /*, int max_z */)
+{
+ return x + y * max_x + z * max_x*max_y;
+}
+
+extern "C" size_t smoke_get_index2d(int x, int max_x, int y /*, int max_y, int z, int max_z */)
+{
+ return x + y * max_x;
+}
+
+extern "C" void smoke_step(Manta_API *fluid, float gravity[3], float dtSubdiv)
+{
+ if (fluid->_fuel) {
+ fluid->processBurn(fluid->_fuel, fluid->_density, fluid->_react, fluid->_flame, fluid->_heat,
+ fluid->_color_r, fluid->_color_g, fluid->_color_b, fluid->_totalCells, (*fluid->_dtFactor)*dtSubdiv);
+ }
+ fluid->step(dtSubdiv, gravity);
+}
+
+extern "C" void smoke_turbulence_step(WTURBULENCE *wt, Manta_API *fluid)
+{
+ if (wt->_fuelBig) {
+ fluid->processBurn(wt->_fuelBig, wt->_densityBig, wt->_reactBig, wt->_flameBig, 0,
+ wt->_color_rBig, wt->_color_gBig, wt->_color_bBig, wt->_totalCellsBig, fluid->_dt);
+ }
+ wt->stepTurbulenceFull(fluid->_dt/fluid->_dx, fluid->_xVelocity, fluid->_yVelocity, fluid->_zVelocity, fluid->_obstacles);
+}
+
+extern "C" void smoke_initBlenderRNA(Manta_API *fluid, float *alpha, float *beta, float *dt_factor, float *vorticity, int *border_colli, float *burning_rate,
+ float *flame_smoke, float *flame_smoke_color, float *flame_vorticity, float *flame_ignition_temp, float *flame_max_temp)
+{
+ fluid->initBlenderRNA(alpha, beta, dt_factor, vorticity, border_colli, burning_rate, flame_smoke, flame_smoke_color, flame_vorticity, flame_ignition_temp, flame_max_temp);
+}
+
+extern "C" void smoke_initWaveletBlenderRNA(WTURBULENCE *wt, float *strength)
+{
+ wt->initBlenderRNA(strength);
+}
+
+static void data_dissolve(float *density, float *heat, float *r, float *g, float *b, int total_cells, int speed, int log)
+{
+ if (log) {
+ /* max density/speed = dydx */
+ float fac = 1.0f - (1
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list