Fluid: Cleanup naming for emmission bounding box
Since the bounding boxes are now also being used for effector objects, there needs to be a better name for them. Instead of calling them EmissionMap, which caters only to emission objects, they will now be called FluidObjectBB.
This commit is contained in:
@@ -650,7 +650,7 @@ static bool is_static_object(Object *ob)
|
|||||||
/** \name Bounding Box
|
/** \name Bounding Box
|
||||||
* \{ */
|
* \{ */
|
||||||
|
|
||||||
typedef struct EmissionMap {
|
typedef struct FluidObjectBB {
|
||||||
float *influence;
|
float *influence;
|
||||||
float *velocity;
|
float *velocity;
|
||||||
float *distances;
|
float *distances;
|
||||||
@@ -658,95 +658,98 @@ typedef struct EmissionMap {
|
|||||||
int min[3], max[3], res[3];
|
int min[3], max[3], res[3];
|
||||||
int hmin[3], hmax[3], hres[3];
|
int hmin[3], hmax[3], hres[3];
|
||||||
int total_cells, valid;
|
int total_cells, valid;
|
||||||
} EmissionMap;
|
} FluidObjectBB;
|
||||||
|
|
||||||
static void em_boundInsert(EmissionMap *em, float point[3])
|
static void bb_boundInsert(FluidObjectBB *bb, float point[3])
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
if (!em->valid) {
|
if (!bb->valid) {
|
||||||
for (; i < 3; i++) {
|
for (; i < 3; i++) {
|
||||||
em->min[i] = (int)floor(point[i]);
|
bb->min[i] = (int)floor(point[i]);
|
||||||
em->max[i] = (int)ceil(point[i]);
|
bb->max[i] = (int)ceil(point[i]);
|
||||||
}
|
}
|
||||||
em->valid = 1;
|
bb->valid = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (; i < 3; i++) {
|
for (; i < 3; i++) {
|
||||||
if (point[i] < em->min[i]) {
|
if (point[i] < bb->min[i]) {
|
||||||
em->min[i] = (int)floor(point[i]);
|
bb->min[i] = (int)floor(point[i]);
|
||||||
}
|
}
|
||||||
if (point[i] > em->max[i]) {
|
if (point[i] > bb->max[i]) {
|
||||||
em->max[i] = (int)ceil(point[i]);
|
bb->max[i] = (int)ceil(point[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void em_allocateData(EmissionMap *em, bool use_velocity, bool use_influence)
|
static void bb_allocateData(FluidObjectBB *bb, bool use_velocity, bool use_influence)
|
||||||
{
|
{
|
||||||
int i, res[3];
|
int i, res[3];
|
||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
res[i] = em->max[i] - em->min[i];
|
res[i] = bb->max[i] - bb->min[i];
|
||||||
if (res[i] <= 0) {
|
if (res[i] <= 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
em->total_cells = res[0] * res[1] * res[2];
|
bb->total_cells = res[0] * res[1] * res[2];
|
||||||
copy_v3_v3_int(em->res, res);
|
copy_v3_v3_int(bb->res, res);
|
||||||
|
|
||||||
em->numobjs = MEM_calloc_arrayN(em->total_cells, sizeof(float), "fluid_bb_numobjs");
|
bb->numobjs = MEM_calloc_arrayN(bb->total_cells, sizeof(float), "fluid_bb_numobjs");
|
||||||
if (use_influence) {
|
if (use_influence) {
|
||||||
em->influence = MEM_calloc_arrayN(em->total_cells, sizeof(float), "fluid_bb_influence");
|
bb->influence = MEM_calloc_arrayN(bb->total_cells, sizeof(float), "fluid_bb_influence");
|
||||||
}
|
}
|
||||||
if (use_velocity) {
|
if (use_velocity) {
|
||||||
em->velocity = MEM_calloc_arrayN(em->total_cells * 3, sizeof(float), "fluid_bb_velocity");
|
bb->velocity = MEM_calloc_arrayN(bb->total_cells * 3, sizeof(float), "fluid_bb_velocity");
|
||||||
}
|
}
|
||||||
|
|
||||||
em->distances = MEM_malloc_arrayN(em->total_cells, sizeof(float), "fluid_bb_distances");
|
bb->distances = MEM_malloc_arrayN(bb->total_cells, sizeof(float), "fluid_bb_distances");
|
||||||
/* Initialize to infinity. */
|
/* Initialize to infinity. */
|
||||||
memset(em->distances, 0x7f7f7f7f, sizeof(float) * em->total_cells);
|
memset(bb->distances, 0x7f7f7f7f, sizeof(float) * bb->total_cells);
|
||||||
|
|
||||||
em->valid = true;
|
bb->valid = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void em_freeData(EmissionMap *em)
|
static void bb_freeData(FluidObjectBB *bb)
|
||||||
{
|
{
|
||||||
if (em->numobjs) {
|
if (bb->numobjs) {
|
||||||
MEM_freeN(em->numobjs);
|
MEM_freeN(bb->numobjs);
|
||||||
}
|
}
|
||||||
if (em->influence) {
|
if (bb->influence) {
|
||||||
MEM_freeN(em->influence);
|
MEM_freeN(bb->influence);
|
||||||
}
|
}
|
||||||
if (em->velocity) {
|
if (bb->velocity) {
|
||||||
MEM_freeN(em->velocity);
|
MEM_freeN(bb->velocity);
|
||||||
}
|
}
|
||||||
if (em->distances) {
|
if (bb->distances) {
|
||||||
MEM_freeN(em->distances);
|
MEM_freeN(bb->distances);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void em_combineMaps(EmissionMap *output, EmissionMap *em2, int additive, float sample_size)
|
static void bb_combineMaps(FluidObjectBB *output,
|
||||||
|
FluidObjectBB *bb2,
|
||||||
|
int additive,
|
||||||
|
float sample_size)
|
||||||
{
|
{
|
||||||
int i, x, y, z;
|
int i, x, y, z;
|
||||||
|
|
||||||
/* Copyfill input 1 struct and clear output for new allocation. */
|
/* Copyfill input 1 struct and clear output for new allocation. */
|
||||||
EmissionMap em1;
|
FluidObjectBB bb1;
|
||||||
memcpy(&em1, output, sizeof(EmissionMap));
|
memcpy(&bb1, output, sizeof(FluidObjectBB));
|
||||||
memset(output, 0, sizeof(EmissionMap));
|
memset(output, 0, sizeof(FluidObjectBB));
|
||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
if (em1.valid) {
|
if (bb1.valid) {
|
||||||
output->min[i] = MIN2(em1.min[i], em2->min[i]);
|
output->min[i] = MIN2(bb1.min[i], bb2->min[i]);
|
||||||
output->max[i] = MAX2(em1.max[i], em2->max[i]);
|
output->max[i] = MAX2(bb1.max[i], bb2->max[i]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
output->min[i] = em2->min[i];
|
output->min[i] = bb2->min[i];
|
||||||
output->max[i] = em2->max[i];
|
output->max[i] = bb2->max[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Allocate output map. */
|
/* Allocate output map. */
|
||||||
em_allocateData(output, (em1.velocity || em2->velocity), (em1.influence || em2->influence));
|
bb_allocateData(output, (bb1.velocity || bb2->velocity), (bb1.influence || bb2->influence));
|
||||||
|
|
||||||
/* Low through bounding box */
|
/* Low through bounding box */
|
||||||
for (x = output->min[0]; x < output->max[0]; x++) {
|
for (x = output->min[0]; x < output->max[0]; x++) {
|
||||||
@@ -759,45 +762,45 @@ static void em_combineMaps(EmissionMap *output, EmissionMap *em2, int additive,
|
|||||||
z - output->min[2]);
|
z - output->min[2]);
|
||||||
|
|
||||||
/* Initialize with first input if in range. */
|
/* Initialize with first input if in range. */
|
||||||
if (x >= em1.min[0] && x < em1.max[0] && y >= em1.min[1] && y < em1.max[1] &&
|
if (x >= bb1.min[0] && x < bb1.max[0] && y >= bb1.min[1] && y < bb1.max[1] &&
|
||||||
z >= em1.min[2] && z < em1.max[2]) {
|
z >= bb1.min[2] && z < bb1.max[2]) {
|
||||||
int index_in = manta_get_index(
|
int index_in = manta_get_index(
|
||||||
x - em1.min[0], em1.res[0], y - em1.min[1], em1.res[1], z - em1.min[2]);
|
x - bb1.min[0], bb1.res[0], y - bb1.min[1], bb1.res[1], z - bb1.min[2]);
|
||||||
|
|
||||||
/* Values. */
|
/* Values. */
|
||||||
output->numobjs[index_out] = em1.numobjs[index_in];
|
output->numobjs[index_out] = bb1.numobjs[index_in];
|
||||||
output->influence[index_out] = em1.influence[index_in];
|
output->influence[index_out] = bb1.influence[index_in];
|
||||||
output->distances[index_out] = em1.distances[index_in];
|
output->distances[index_out] = bb1.distances[index_in];
|
||||||
if (output->velocity && em1.velocity) {
|
if (output->velocity && bb1.velocity) {
|
||||||
copy_v3_v3(&output->velocity[index_out * 3], &em1.velocity[index_in * 3]);
|
copy_v3_v3(&output->velocity[index_out * 3], &bb1.velocity[index_in * 3]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Apply second input if in range. */
|
/* Apply second input if in range. */
|
||||||
if (x >= em2->min[0] && x < em2->max[0] && y >= em2->min[1] && y < em2->max[1] &&
|
if (x >= bb2->min[0] && x < bb2->max[0] && y >= bb2->min[1] && y < bb2->max[1] &&
|
||||||
z >= em2->min[2] && z < em2->max[2]) {
|
z >= bb2->min[2] && z < bb2->max[2]) {
|
||||||
int index_in = manta_get_index(
|
int index_in = manta_get_index(
|
||||||
x - em2->min[0], em2->res[0], y - em2->min[1], em2->res[1], z - em2->min[2]);
|
x - bb2->min[0], bb2->res[0], y - bb2->min[1], bb2->res[1], z - bb2->min[2]);
|
||||||
|
|
||||||
/* Values. */
|
/* Values. */
|
||||||
output->numobjs[index_out] = MAX2(em2->numobjs[index_in], output->numobjs[index_out]);
|
output->numobjs[index_out] = MAX2(bb2->numobjs[index_in], output->numobjs[index_out]);
|
||||||
if (additive) {
|
if (additive) {
|
||||||
output->influence[index_out] += em2->influence[index_in] * sample_size;
|
output->influence[index_out] += bb2->influence[index_in] * sample_size;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
output->influence[index_out] = MAX2(em2->influence[index_in],
|
output->influence[index_out] = MAX2(bb2->influence[index_in],
|
||||||
output->influence[index_out]);
|
output->influence[index_out]);
|
||||||
}
|
}
|
||||||
output->distances[index_out] = MIN2(em2->distances[index_in],
|
output->distances[index_out] = MIN2(bb2->distances[index_in],
|
||||||
output->distances[index_out]);
|
output->distances[index_out]);
|
||||||
if (output->velocity && em2->velocity) {
|
if (output->velocity && bb2->velocity) {
|
||||||
/* Last sample replaces the velocity. */
|
/* Last sample replaces the velocity. */
|
||||||
output->velocity[index_out * 3] = ADD_IF_LOWER(output->velocity[index_out * 3],
|
output->velocity[index_out * 3] = ADD_IF_LOWER(output->velocity[index_out * 3],
|
||||||
em2->velocity[index_in * 3]);
|
bb2->velocity[index_in * 3]);
|
||||||
output->velocity[index_out * 3 + 1] = ADD_IF_LOWER(output->velocity[index_out * 3 + 1],
|
output->velocity[index_out * 3 + 1] = ADD_IF_LOWER(output->velocity[index_out * 3 + 1],
|
||||||
em2->velocity[index_in * 3 + 1]);
|
bb2->velocity[index_in * 3 + 1]);
|
||||||
output->velocity[index_out * 3 + 2] = ADD_IF_LOWER(output->velocity[index_out * 3 + 2],
|
output->velocity[index_out * 3 + 2] = ADD_IF_LOWER(output->velocity[index_out * 3 + 2],
|
||||||
em2->velocity[index_in * 3 + 2]);
|
bb2->velocity[index_in * 3 + 2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* Low res loop. */
|
} /* Low res loop. */
|
||||||
@@ -805,7 +808,7 @@ static void em_combineMaps(EmissionMap *output, EmissionMap *em2, int additive,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Free original data. */
|
/* Free original data. */
|
||||||
em_freeData(&em1);
|
bb_freeData(&bb1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \} */
|
/** \} */
|
||||||
@@ -940,7 +943,7 @@ typedef struct ObstaclesFromDMData {
|
|||||||
const MLoopTri *mlooptri;
|
const MLoopTri *mlooptri;
|
||||||
|
|
||||||
BVHTreeFromMesh *tree;
|
BVHTreeFromMesh *tree;
|
||||||
EmissionMap *om;
|
FluidObjectBB *bb;
|
||||||
|
|
||||||
bool has_velocity;
|
bool has_velocity;
|
||||||
float *vert_vel;
|
float *vert_vel;
|
||||||
@@ -952,29 +955,29 @@ static void obstacles_from_mesh_task_cb(void *__restrict userdata,
|
|||||||
const TaskParallelTLS *__restrict UNUSED(tls))
|
const TaskParallelTLS *__restrict UNUSED(tls))
|
||||||
{
|
{
|
||||||
ObstaclesFromDMData *data = userdata;
|
ObstaclesFromDMData *data = userdata;
|
||||||
EmissionMap *om = data->om;
|
FluidObjectBB *bb = data->bb;
|
||||||
|
|
||||||
for (int x = data->min[0]; x < data->max[0]; x++) {
|
for (int x = data->min[0]; x < data->max[0]; x++) {
|
||||||
for (int y = data->min[1]; y < data->max[1]; y++) {
|
for (int y = data->min[1]; y < data->max[1]; y++) {
|
||||||
const int index = manta_get_index(
|
const int index = manta_get_index(
|
||||||
x - om->min[0], om->res[0], y - om->min[1], om->res[1], z - om->min[2]);
|
x - bb->min[0], bb->res[0], y - bb->min[1], bb->res[1], z - bb->min[2]);
|
||||||
float ray_start[3] = {(float)x + 0.5f, (float)y + 0.5f, (float)z + 0.5f};
|
float ray_start[3] = {(float)x + 0.5f, (float)y + 0.5f, (float)z + 0.5f};
|
||||||
|
|
||||||
/* Calculate object velocities. Result in om->velocity. */
|
/* Calculate object velocities. Result in bb->velocity. */
|
||||||
sample_effector(data->mes,
|
sample_effector(data->mes,
|
||||||
data->mvert,
|
data->mvert,
|
||||||
data->mloop,
|
data->mloop,
|
||||||
data->mlooptri,
|
data->mlooptri,
|
||||||
om->velocity,
|
bb->velocity,
|
||||||
index,
|
index,
|
||||||
data->tree,
|
data->tree,
|
||||||
ray_start,
|
ray_start,
|
||||||
data->vert_vel,
|
data->vert_vel,
|
||||||
data->has_velocity);
|
data->has_velocity);
|
||||||
|
|
||||||
/* Calculate levelset values from meshes. Result in om->distances. */
|
/* Calculate levelset values from meshes. Result in bb->distances. */
|
||||||
update_distances(index,
|
update_distances(index,
|
||||||
om->distances,
|
bb->distances,
|
||||||
data->tree,
|
data->tree,
|
||||||
ray_start,
|
ray_start,
|
||||||
data->mes->surface_distance,
|
data->mes->surface_distance,
|
||||||
@@ -982,8 +985,8 @@ static void obstacles_from_mesh_task_cb(void *__restrict userdata,
|
|||||||
|
|
||||||
/* Ensure that num objects are also counted inside object.
|
/* Ensure that num objects are also counted inside object.
|
||||||
* But don't count twice (see object inc for nearest point). */
|
* But don't count twice (see object inc for nearest point). */
|
||||||
if (om->distances[index] < 0) {
|
if (bb->distances[index] < 0) {
|
||||||
om->numobjs[index]++;
|
bb->numobjs[index]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -992,7 +995,7 @@ static void obstacles_from_mesh_task_cb(void *__restrict userdata,
|
|||||||
static void obstacles_from_mesh(Object *coll_ob,
|
static void obstacles_from_mesh(Object *coll_ob,
|
||||||
FluidDomainSettings *mds,
|
FluidDomainSettings *mds,
|
||||||
FluidEffectorSettings *mes,
|
FluidEffectorSettings *mes,
|
||||||
EmissionMap *em,
|
FluidObjectBB *bb,
|
||||||
float dt)
|
float dt)
|
||||||
{
|
{
|
||||||
if (mes->mesh) {
|
if (mes->mesh) {
|
||||||
@@ -1064,20 +1067,20 @@ static void obstacles_from_mesh(Object *coll_ob,
|
|||||||
copy_v3_v3(&mes->verts_old[i * 3], co);
|
copy_v3_v3(&mes->verts_old[i * 3], co);
|
||||||
|
|
||||||
/* Calculate emission map bounds. */
|
/* Calculate emission map bounds. */
|
||||||
em_boundInsert(em, mvert[i].co);
|
bb_boundInsert(bb, mvert[i].co);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set emission map.
|
/* Set emission map.
|
||||||
* Use 3 cell diagonals as margin (3 * 1.732 = 5.196). */
|
* Use 3 cell diagonals as margin (3 * 1.732 = 5.196). */
|
||||||
int bounds_margin = (int)ceil(5.196);
|
int bounds_margin = (int)ceil(5.196);
|
||||||
clamp_bounds_in_domain(mds, em->min, em->max, NULL, NULL, bounds_margin, dt);
|
clamp_bounds_in_domain(mds, bb->min, bb->max, NULL, NULL, bounds_margin, dt);
|
||||||
em_allocateData(em, true, false);
|
bb_allocateData(bb, true, false);
|
||||||
|
|
||||||
/* Setup loop bounds. */
|
/* Setup loop bounds. */
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
min[i] = em->min[i];
|
min[i] = bb->min[i];
|
||||||
max[i] = em->max[i];
|
max[i] = bb->max[i];
|
||||||
res[i] = em->res[i];
|
res[i] = bb->res[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BKE_bvhtree_from_mesh_get(&tree_data, me, BVHTREE_FROM_LOOPTRI, 4)) {
|
if (BKE_bvhtree_from_mesh_get(&tree_data, me, BVHTREE_FROM_LOOPTRI, 4)) {
|
||||||
@@ -1088,7 +1091,7 @@ static void obstacles_from_mesh(Object *coll_ob,
|
|||||||
.mloop = mloop,
|
.mloop = mloop,
|
||||||
.mlooptri = looptri,
|
.mlooptri = looptri,
|
||||||
.tree = &tree_data,
|
.tree = &tree_data,
|
||||||
.om = em,
|
.bb = bb,
|
||||||
.has_velocity = has_velocity,
|
.has_velocity = has_velocity,
|
||||||
.vert_vel = vert_vel,
|
.vert_vel = vert_vel,
|
||||||
.min = min,
|
.min = min,
|
||||||
@@ -1168,7 +1171,7 @@ static void update_obstacles(Depsgraph *depsgraph,
|
|||||||
int frame,
|
int frame,
|
||||||
float dt)
|
float dt)
|
||||||
{
|
{
|
||||||
EmissionMap *emaps = NULL;
|
FluidObjectBB *bb_maps = NULL;
|
||||||
Object **effecobjs = NULL;
|
Object **effecobjs = NULL;
|
||||||
uint numeffecobjs = 0, effec_index = 0;
|
uint numeffecobjs = 0, effec_index = 0;
|
||||||
bool is_first_frame = (frame == mds->cache_frame_start);
|
bool is_first_frame = (frame == mds->cache_frame_start);
|
||||||
@@ -1180,7 +1183,7 @@ static void update_obstacles(Depsgraph *depsgraph,
|
|||||||
update_obstacleflags(mds, effecobjs, numeffecobjs);
|
update_obstacleflags(mds, effecobjs, numeffecobjs);
|
||||||
|
|
||||||
/* Initialize effector maps for each flow. */
|
/* Initialize effector maps for each flow. */
|
||||||
emaps = MEM_callocN(sizeof(struct EmissionMap) * numeffecobjs, "fluid_bb_maps");
|
bb_maps = MEM_callocN(sizeof(struct FluidObjectBB) * numeffecobjs, "fluid_effector_bb_maps");
|
||||||
|
|
||||||
/* Prepare effector maps. */
|
/* Prepare effector maps. */
|
||||||
for (effec_index = 0; effec_index < numeffecobjs; effec_index++) {
|
for (effec_index = 0; effec_index < numeffecobjs; effec_index++) {
|
||||||
@@ -1197,7 +1200,7 @@ static void update_obstacles(Depsgraph *depsgraph,
|
|||||||
if ((mmd2->type & MOD_FLUID_TYPE_EFFEC) && mmd2->effector) {
|
if ((mmd2->type & MOD_FLUID_TYPE_EFFEC) && mmd2->effector) {
|
||||||
FluidEffectorSettings *mes = mmd2->effector;
|
FluidEffectorSettings *mes = mmd2->effector;
|
||||||
int subframes = mes->subframes;
|
int subframes = mes->subframes;
|
||||||
EmissionMap *em = &emaps[effec_index];
|
FluidObjectBB *bb = &bb_maps[effec_index];
|
||||||
|
|
||||||
bool is_static = is_static_object(effecobj);
|
bool is_static = is_static_object(effecobj);
|
||||||
/* Cannot use static mode with adaptive domain.
|
/* Cannot use static mode with adaptive domain.
|
||||||
@@ -1238,7 +1241,7 @@ static void update_obstacles(Depsgraph *depsgraph,
|
|||||||
for (subframe = subframes; subframe >= 0; subframe--) {
|
for (subframe = subframes; subframe >= 0; subframe--) {
|
||||||
|
|
||||||
/* Temporary emission map used when subframes are enabled, i.e. at least one subframe. */
|
/* Temporary emission map used when subframes are enabled, i.e. at least one subframe. */
|
||||||
EmissionMap em_temp = {NULL};
|
FluidObjectBB bb_temp = {NULL};
|
||||||
|
|
||||||
/* Set scene time */
|
/* Set scene time */
|
||||||
/* Handle emission subframe */
|
/* Handle emission subframe */
|
||||||
@@ -1284,18 +1287,18 @@ static void update_obstacles(Depsgraph *depsgraph,
|
|||||||
depsgraph, scene, effecobj, true, 5, BKE_scene_frame_get(scene), eModifierType_Fluid);
|
depsgraph, scene, effecobj, true, 5, BKE_scene_frame_get(scene), eModifierType_Fluid);
|
||||||
|
|
||||||
if (subframes) {
|
if (subframes) {
|
||||||
obstacles_from_mesh(effecobj, mds, mes, &em_temp, subframe_dt);
|
obstacles_from_mesh(effecobj, mds, mes, &bb_temp, subframe_dt);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
obstacles_from_mesh(effecobj, mds, mes, em, subframe_dt);
|
obstacles_from_mesh(effecobj, mds, mes, bb, subframe_dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If this we emitted with temp emission map in this loop (subframe emission), we combine
|
/* If this we emitted with temp emission map in this loop (subframe emission), we combine
|
||||||
* the temp map with the original emission map. */
|
* the temp map with the original emission map. */
|
||||||
if (subframes) {
|
if (subframes) {
|
||||||
/* Combine emission maps. */
|
/* Combine emission maps. */
|
||||||
em_combineMaps(em, &em_temp, 0, 0.0f);
|
bb_combineMaps(bb, &bb_temp, 0, 0.0f);
|
||||||
em_freeData(&em_temp);
|
bb_freeData(&bb_temp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1382,23 +1385,23 @@ static void update_obstacles(Depsgraph *depsgraph,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
EmissionMap *em = &emaps[effec_index];
|
FluidObjectBB *bb = &bb_maps[effec_index];
|
||||||
float *velocity_map = em->velocity;
|
float *velocity_map = bb->velocity;
|
||||||
float *numobjs_map = em->numobjs;
|
float *numobjs_map = bb->numobjs;
|
||||||
float *distance_map = em->distances;
|
float *distance_map = bb->distances;
|
||||||
|
|
||||||
int gx, gy, gz, ex, ey, ez, dx, dy, dz;
|
int gx, gy, gz, ex, ey, ez, dx, dy, dz;
|
||||||
size_t e_index, d_index;
|
size_t e_index, d_index;
|
||||||
|
|
||||||
/* Loop through every emission map cell. */
|
/* Loop through every emission map cell. */
|
||||||
for (gx = em->min[0]; gx < em->max[0]; gx++) {
|
for (gx = bb->min[0]; gx < bb->max[0]; gx++) {
|
||||||
for (gy = em->min[1]; gy < em->max[1]; gy++) {
|
for (gy = bb->min[1]; gy < bb->max[1]; gy++) {
|
||||||
for (gz = em->min[2]; gz < em->max[2]; gz++) {
|
for (gz = bb->min[2]; gz < bb->max[2]; gz++) {
|
||||||
/* Compute emission map index. */
|
/* Compute emission map index. */
|
||||||
ex = gx - em->min[0];
|
ex = gx - bb->min[0];
|
||||||
ey = gy - em->min[1];
|
ey = gy - bb->min[1];
|
||||||
ez = gz - em->min[2];
|
ez = gz - bb->min[2];
|
||||||
e_index = manta_get_index(ex, em->res[0], ey, em->res[1], ez);
|
e_index = manta_get_index(ex, bb->res[0], ey, bb->res[1], ez);
|
||||||
|
|
||||||
/* Get domain index. */
|
/* Get domain index. */
|
||||||
dx = gx - mds->res_min[0];
|
dx = gx - mds->res_min[0];
|
||||||
@@ -1462,13 +1465,13 @@ static void update_obstacles(Depsgraph *depsgraph,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* End of effector map loop. */
|
} /* End of effector map loop. */
|
||||||
em_freeData(em);
|
bb_freeData(bb);
|
||||||
} /* End of effector object loop. */
|
} /* End of effector object loop. */
|
||||||
}
|
}
|
||||||
|
|
||||||
BKE_collision_objects_free(effecobjs);
|
BKE_collision_objects_free(effecobjs);
|
||||||
if (emaps) {
|
if (bb_maps) {
|
||||||
MEM_freeN(emaps);
|
MEM_freeN(bb_maps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1482,7 +1485,7 @@ typedef struct EmitFromParticlesData {
|
|||||||
FluidFlowSettings *mfs;
|
FluidFlowSettings *mfs;
|
||||||
KDTree_3d *tree;
|
KDTree_3d *tree;
|
||||||
|
|
||||||
EmissionMap *em;
|
FluidObjectBB *bb;
|
||||||
float *particle_vel;
|
float *particle_vel;
|
||||||
int *min, *max, *res;
|
int *min, *max, *res;
|
||||||
|
|
||||||
@@ -1496,12 +1499,12 @@ static void emit_from_particles_task_cb(void *__restrict userdata,
|
|||||||
{
|
{
|
||||||
EmitFromParticlesData *data = userdata;
|
EmitFromParticlesData *data = userdata;
|
||||||
FluidFlowSettings *mfs = data->mfs;
|
FluidFlowSettings *mfs = data->mfs;
|
||||||
EmissionMap *em = data->em;
|
FluidObjectBB *bb = data->bb;
|
||||||
|
|
||||||
for (int x = data->min[0]; x < data->max[0]; x++) {
|
for (int x = data->min[0]; x < data->max[0]; x++) {
|
||||||
for (int y = data->min[1]; y < data->max[1]; y++) {
|
for (int y = data->min[1]; y < data->max[1]; y++) {
|
||||||
const int index = manta_get_index(
|
const int index = manta_get_index(
|
||||||
x - em->min[0], em->res[0], y - em->min[1], em->res[1], z - em->min[2]);
|
x - bb->min[0], bb->res[0], y - bb->min[1], bb->res[1], z - bb->min[2]);
|
||||||
const float ray_start[3] = {((float)x) + 0.5f, ((float)y) + 0.5f, ((float)z) + 0.5f};
|
const float ray_start[3] = {((float)x) + 0.5f, ((float)y) + 0.5f, ((float)z) + 0.5f};
|
||||||
|
|
||||||
/* Find particle distance from the kdtree. */
|
/* Find particle distance from the kdtree. */
|
||||||
@@ -1510,13 +1513,13 @@ static void emit_from_particles_task_cb(void *__restrict userdata,
|
|||||||
BLI_kdtree_3d_find_nearest(data->tree, ray_start, &nearest);
|
BLI_kdtree_3d_find_nearest(data->tree, ray_start, &nearest);
|
||||||
|
|
||||||
if (nearest.dist < range) {
|
if (nearest.dist < range) {
|
||||||
em->influence[index] = (nearest.dist < data->solid) ?
|
bb->influence[index] = (nearest.dist < data->solid) ?
|
||||||
1.0f :
|
1.0f :
|
||||||
(1.0f - (nearest.dist - data->solid) / data->smooth);
|
(1.0f - (nearest.dist - data->solid) / data->smooth);
|
||||||
/* Uses particle velocity as initial velocity for smoke. */
|
/* Uses particle velocity as initial velocity for smoke. */
|
||||||
if (mfs->flags & FLUID_FLOW_INITVELOCITY && (mfs->psys->part->phystype != PART_PHYS_NO)) {
|
if (mfs->flags & FLUID_FLOW_INITVELOCITY && (mfs->psys->part->phystype != PART_PHYS_NO)) {
|
||||||
madd_v3_v3fl(
|
madd_v3_v3fl(
|
||||||
&em->velocity[index * 3], &data->particle_vel[nearest.index * 3], mfs->vel_multi);
|
&bb->velocity[index * 3], &data->particle_vel[nearest.index * 3], mfs->vel_multi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1526,7 +1529,7 @@ static void emit_from_particles_task_cb(void *__restrict userdata,
|
|||||||
static void emit_from_particles(Object *flow_ob,
|
static void emit_from_particles(Object *flow_ob,
|
||||||
FluidDomainSettings *mds,
|
FluidDomainSettings *mds,
|
||||||
FluidFlowSettings *mfs,
|
FluidFlowSettings *mfs,
|
||||||
EmissionMap *em,
|
FluidObjectBB *bb,
|
||||||
Depsgraph *depsgraph,
|
Depsgraph *depsgraph,
|
||||||
Scene *scene,
|
Scene *scene,
|
||||||
float dt)
|
float dt)
|
||||||
@@ -1623,13 +1626,13 @@ static void emit_from_particles(Object *flow_ob,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* calculate emission map bounds */
|
/* calculate emission map bounds */
|
||||||
em_boundInsert(em, pos);
|
bb_boundInsert(bb, pos);
|
||||||
valid_particles++;
|
valid_particles++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set emission map */
|
/* set emission map */
|
||||||
clamp_bounds_in_domain(mds, em->min, em->max, NULL, NULL, bounds_margin, dt);
|
clamp_bounds_in_domain(mds, bb->min, bb->max, NULL, NULL, bounds_margin, dt);
|
||||||
em_allocateData(em, mfs->flags & FLUID_FLOW_INITVELOCITY, true);
|
bb_allocateData(bb, mfs->flags & FLUID_FLOW_INITVELOCITY, true);
|
||||||
|
|
||||||
if (!(mfs->flags & FLUID_FLOW_USE_PART_SIZE)) {
|
if (!(mfs->flags & FLUID_FLOW_USE_PART_SIZE)) {
|
||||||
for (p = 0; p < valid_particles; p++) {
|
for (p = 0; p < valid_particles; p++) {
|
||||||
@@ -1639,12 +1642,12 @@ static void emit_from_particles(Object *flow_ob,
|
|||||||
int badcell = 0;
|
int badcell = 0;
|
||||||
|
|
||||||
/* 1. get corresponding cell */
|
/* 1. get corresponding cell */
|
||||||
cell[0] = floor(particle_pos[p * 3]) - em->min[0];
|
cell[0] = floor(particle_pos[p * 3]) - bb->min[0];
|
||||||
cell[1] = floor(particle_pos[p * 3 + 1]) - em->min[1];
|
cell[1] = floor(particle_pos[p * 3 + 1]) - bb->min[1];
|
||||||
cell[2] = floor(particle_pos[p * 3 + 2]) - em->min[2];
|
cell[2] = floor(particle_pos[p * 3 + 2]) - bb->min[2];
|
||||||
/* check if cell is valid (in the domain boundary) */
|
/* check if cell is valid (in the domain boundary) */
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
if ((cell[i] > em->res[i] - 1) || (cell[i] < 0)) {
|
if ((cell[i] > bb->res[i] - 1) || (cell[i] < 0)) {
|
||||||
badcell = 1;
|
badcell = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1653,12 +1656,12 @@ static void emit_from_particles(Object *flow_ob,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* get cell index */
|
/* get cell index */
|
||||||
index = manta_get_index(cell[0], em->res[0], cell[1], em->res[1], cell[2]);
|
index = manta_get_index(cell[0], bb->res[0], cell[1], bb->res[1], cell[2]);
|
||||||
/* Add influence to emission map */
|
/* Add influence to emission map */
|
||||||
em->influence[index] = 1.0f;
|
bb->influence[index] = 1.0f;
|
||||||
/* Uses particle velocity as initial velocity for smoke */
|
/* Uses particle velocity as initial velocity for smoke */
|
||||||
if (mfs->flags & FLUID_FLOW_INITVELOCITY && (psys->part->phystype != PART_PHYS_NO)) {
|
if (mfs->flags & FLUID_FLOW_INITVELOCITY && (psys->part->phystype != PART_PHYS_NO)) {
|
||||||
madd_v3_v3fl(&em->velocity[index * 3], &particle_vel[p * 3], mfs->vel_multi);
|
madd_v3_v3fl(&bb->velocity[index * 3], &particle_vel[p * 3], mfs->vel_multi);
|
||||||
}
|
}
|
||||||
} // particles loop
|
} // particles loop
|
||||||
}
|
}
|
||||||
@@ -1667,9 +1670,9 @@ static void emit_from_particles(Object *flow_ob,
|
|||||||
|
|
||||||
/* setup loop bounds */
|
/* setup loop bounds */
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
min[i] = em->min[i];
|
min[i] = bb->min[i];
|
||||||
max[i] = em->max[i];
|
max[i] = bb->max[i];
|
||||||
res[i] = em->res[i];
|
res[i] = bb->res[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
BLI_kdtree_3d_balance(tree);
|
BLI_kdtree_3d_balance(tree);
|
||||||
@@ -1677,7 +1680,7 @@ static void emit_from_particles(Object *flow_ob,
|
|||||||
EmitFromParticlesData data = {
|
EmitFromParticlesData data = {
|
||||||
.mfs = mfs,
|
.mfs = mfs,
|
||||||
.tree = tree,
|
.tree = tree,
|
||||||
.em = em,
|
.bb = bb,
|
||||||
.particle_vel = particle_vel,
|
.particle_vel = particle_vel,
|
||||||
.min = min,
|
.min = min,
|
||||||
.max = max,
|
.max = max,
|
||||||
@@ -1991,7 +1994,7 @@ typedef struct EmitFromDMData {
|
|||||||
int defgrp_index;
|
int defgrp_index;
|
||||||
|
|
||||||
BVHTreeFromMesh *tree;
|
BVHTreeFromMesh *tree;
|
||||||
EmissionMap *em;
|
FluidObjectBB *bb;
|
||||||
|
|
||||||
bool has_velocity;
|
bool has_velocity;
|
||||||
float *vert_vel;
|
float *vert_vel;
|
||||||
@@ -2004,16 +2007,16 @@ static void emit_from_mesh_task_cb(void *__restrict userdata,
|
|||||||
const TaskParallelTLS *__restrict UNUSED(tls))
|
const TaskParallelTLS *__restrict UNUSED(tls))
|
||||||
{
|
{
|
||||||
EmitFromDMData *data = userdata;
|
EmitFromDMData *data = userdata;
|
||||||
EmissionMap *em = data->em;
|
FluidObjectBB *bb = data->bb;
|
||||||
|
|
||||||
for (int x = data->min[0]; x < data->max[0]; x++) {
|
for (int x = data->min[0]; x < data->max[0]; x++) {
|
||||||
for (int y = data->min[1]; y < data->max[1]; y++) {
|
for (int y = data->min[1]; y < data->max[1]; y++) {
|
||||||
const int index = manta_get_index(
|
const int index = manta_get_index(
|
||||||
x - em->min[0], em->res[0], y - em->min[1], em->res[1], z - em->min[2]);
|
x - bb->min[0], bb->res[0], y - bb->min[1], bb->res[1], z - bb->min[2]);
|
||||||
const float ray_start[3] = {((float)x) + 0.5f, ((float)y) + 0.5f, ((float)z) + 0.5f};
|
const float ray_start[3] = {((float)x) + 0.5f, ((float)y) + 0.5f, ((float)z) + 0.5f};
|
||||||
|
|
||||||
/* Compute emission only for flow objects that produce fluid (i.e. skip outflow objects).
|
/* Compute emission only for flow objects that produce fluid (i.e. skip outflow objects).
|
||||||
* Result in em->influence. Also computes initial velocities. Result in em->velocity. */
|
* Result in bb->influence. Also computes initial velocities. Result in bb->velocity. */
|
||||||
if ((data->mfs->behavior == FLUID_FLOW_BEHAVIOR_GEOMETRY) ||
|
if ((data->mfs->behavior == FLUID_FLOW_BEHAVIOR_GEOMETRY) ||
|
||||||
(data->mfs->behavior == FLUID_FLOW_BEHAVIOR_INFLOW)) {
|
(data->mfs->behavior == FLUID_FLOW_BEHAVIOR_INFLOW)) {
|
||||||
sample_mesh(data->mfs,
|
sample_mesh(data->mfs,
|
||||||
@@ -2021,8 +2024,8 @@ static void emit_from_mesh_task_cb(void *__restrict userdata,
|
|||||||
data->mloop,
|
data->mloop,
|
||||||
data->mlooptri,
|
data->mlooptri,
|
||||||
data->mloopuv,
|
data->mloopuv,
|
||||||
em->influence,
|
bb->influence,
|
||||||
em->velocity,
|
bb->velocity,
|
||||||
index,
|
index,
|
||||||
data->mds->base_res,
|
data->mds->base_res,
|
||||||
data->flow_center,
|
data->flow_center,
|
||||||
@@ -2037,9 +2040,9 @@ static void emit_from_mesh_task_cb(void *__restrict userdata,
|
|||||||
(float)z);
|
(float)z);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate levelset values from meshes. Result in em->distances. */
|
/* Calculate levelset values from meshes. Result in bb->distances. */
|
||||||
update_distances(index,
|
update_distances(index,
|
||||||
em->distances,
|
bb->distances,
|
||||||
data->tree,
|
data->tree,
|
||||||
ray_start,
|
ray_start,
|
||||||
data->mfs->surface_distance,
|
data->mfs->surface_distance,
|
||||||
@@ -2049,7 +2052,7 @@ static void emit_from_mesh_task_cb(void *__restrict userdata,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void emit_from_mesh(
|
static void emit_from_mesh(
|
||||||
Object *flow_ob, FluidDomainSettings *mds, FluidFlowSettings *mfs, EmissionMap *em, float dt)
|
Object *flow_ob, FluidDomainSettings *mds, FluidFlowSettings *mfs, FluidObjectBB *bb, float dt)
|
||||||
{
|
{
|
||||||
if (mfs->mesh) {
|
if (mfs->mesh) {
|
||||||
Mesh *me = NULL;
|
Mesh *me = NULL;
|
||||||
@@ -2128,7 +2131,7 @@ static void emit_from_mesh(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate emission map bounds. */
|
/* Calculate emission map bounds. */
|
||||||
em_boundInsert(em, mvert[i].co);
|
bb_boundInsert(bb, mvert[i].co);
|
||||||
}
|
}
|
||||||
mul_m4_v3(flow_ob->obmat, flow_center);
|
mul_m4_v3(flow_ob->obmat, flow_center);
|
||||||
manta_pos_to_cell(mds, flow_center);
|
manta_pos_to_cell(mds, flow_center);
|
||||||
@@ -2136,14 +2139,14 @@ static void emit_from_mesh(
|
|||||||
/* Set emission map.
|
/* Set emission map.
|
||||||
* Use 3 cell diagonals as margin (3 * 1.732 = 5.196). */
|
* Use 3 cell diagonals as margin (3 * 1.732 = 5.196). */
|
||||||
int bounds_margin = (int)ceil(5.196);
|
int bounds_margin = (int)ceil(5.196);
|
||||||
clamp_bounds_in_domain(mds, em->min, em->max, NULL, NULL, bounds_margin, dt);
|
clamp_bounds_in_domain(mds, bb->min, bb->max, NULL, NULL, bounds_margin, dt);
|
||||||
em_allocateData(em, mfs->flags & FLUID_FLOW_INITVELOCITY, true);
|
bb_allocateData(bb, mfs->flags & FLUID_FLOW_INITVELOCITY, true);
|
||||||
|
|
||||||
/* Setup loop bounds. */
|
/* Setup loop bounds. */
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
min[i] = em->min[i];
|
min[i] = bb->min[i];
|
||||||
max[i] = em->max[i];
|
max[i] = bb->max[i];
|
||||||
res[i] = em->res[i];
|
res[i] = bb->res[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BKE_bvhtree_from_mesh_get(&tree_data, me, BVHTREE_FROM_LOOPTRI, 4)) {
|
if (BKE_bvhtree_from_mesh_get(&tree_data, me, BVHTREE_FROM_LOOPTRI, 4)) {
|
||||||
@@ -2158,7 +2161,7 @@ static void emit_from_mesh(
|
|||||||
.dvert = dvert,
|
.dvert = dvert,
|
||||||
.defgrp_index = defgrp_index,
|
.defgrp_index = defgrp_index,
|
||||||
.tree = &tree_data,
|
.tree = &tree_data,
|
||||||
.em = em,
|
.bb = bb,
|
||||||
.has_velocity = has_velocity,
|
.has_velocity = has_velocity,
|
||||||
.vert_vel = vert_vel,
|
.vert_vel = vert_vel,
|
||||||
.flow_center = flow_center,
|
.flow_center = flow_center,
|
||||||
@@ -2192,7 +2195,7 @@ static void emit_from_mesh(
|
|||||||
* \{ */
|
* \{ */
|
||||||
|
|
||||||
static void adaptive_domain_adjust(
|
static void adaptive_domain_adjust(
|
||||||
FluidDomainSettings *mds, Object *ob, EmissionMap *emaps, uint numflowobj, float dt)
|
FluidDomainSettings *mds, Object *ob, FluidObjectBB *bb_maps, uint numflowobj, float dt)
|
||||||
{
|
{
|
||||||
/* calculate domain shift for current frame */
|
/* calculate domain shift for current frame */
|
||||||
int new_shift[3] = {0};
|
int new_shift[3] = {0};
|
||||||
@@ -2341,14 +2344,14 @@ static void adaptive_domain_adjust(
|
|||||||
|
|
||||||
/* also apply emission maps */
|
/* also apply emission maps */
|
||||||
for (int i = 0; i < numflowobj; i++) {
|
for (int i = 0; i < numflowobj; i++) {
|
||||||
EmissionMap *em = &emaps[i];
|
FluidObjectBB *bb = &bb_maps[i];
|
||||||
|
|
||||||
for (x = em->min[0]; x < em->max[0]; x++) {
|
for (x = bb->min[0]; x < bb->max[0]; x++) {
|
||||||
for (y = em->min[1]; y < em->max[1]; y++) {
|
for (y = bb->min[1]; y < bb->max[1]; y++) {
|
||||||
for (z = em->min[2]; z < em->max[2]; z++) {
|
for (z = bb->min[2]; z < bb->max[2]; z++) {
|
||||||
int index = manta_get_index(
|
int index = manta_get_index(
|
||||||
x - em->min[0], em->res[0], y - em->min[1], em->res[1], z - em->min[2]);
|
x - bb->min[0], bb->res[0], y - bb->min[1], bb->res[1], z - bb->min[2]);
|
||||||
float max_den = em->influence[index];
|
float max_den = bb->influence[index];
|
||||||
|
|
||||||
/* density bounds */
|
/* density bounds */
|
||||||
if (max_den >= mds->adapt_threshold) {
|
if (max_den >= mds->adapt_threshold) {
|
||||||
@@ -2677,7 +2680,7 @@ static void update_flowsfluids(struct Depsgraph *depsgraph,
|
|||||||
int frame,
|
int frame,
|
||||||
float dt)
|
float dt)
|
||||||
{
|
{
|
||||||
EmissionMap *emaps = NULL;
|
FluidObjectBB *bb_maps = NULL;
|
||||||
Object **flowobjs = NULL;
|
Object **flowobjs = NULL;
|
||||||
uint numflowobj = 0, flow_index = 0;
|
uint numflowobj = 0, flow_index = 0;
|
||||||
bool is_first_frame = (frame == mds->cache_frame_start);
|
bool is_first_frame = (frame == mds->cache_frame_start);
|
||||||
@@ -2689,7 +2692,7 @@ static void update_flowsfluids(struct Depsgraph *depsgraph,
|
|||||||
update_flowsflags(mds, flowobjs, numflowobj);
|
update_flowsflags(mds, flowobjs, numflowobj);
|
||||||
|
|
||||||
/* Initialize emission maps for each flow. */
|
/* Initialize emission maps for each flow. */
|
||||||
emaps = MEM_callocN(sizeof(struct EmissionMap) * numflowobj, "manta_flow_maps");
|
bb_maps = MEM_callocN(sizeof(struct FluidObjectBB) * numflowobj, "fluid_flow_bb_maps");
|
||||||
|
|
||||||
/* Prepare flow emission maps. */
|
/* Prepare flow emission maps. */
|
||||||
for (flow_index = 0; flow_index < numflowobj; flow_index++) {
|
for (flow_index = 0; flow_index < numflowobj; flow_index++) {
|
||||||
@@ -2706,7 +2709,7 @@ static void update_flowsfluids(struct Depsgraph *depsgraph,
|
|||||||
if ((mmd2->type & MOD_FLUID_TYPE_FLOW) && mmd2->flow) {
|
if ((mmd2->type & MOD_FLUID_TYPE_FLOW) && mmd2->flow) {
|
||||||
FluidFlowSettings *mfs = mmd2->flow;
|
FluidFlowSettings *mfs = mmd2->flow;
|
||||||
int subframes = mfs->subframes;
|
int subframes = mfs->subframes;
|
||||||
EmissionMap *em = &emaps[flow_index];
|
FluidObjectBB *bb = &bb_maps[flow_index];
|
||||||
|
|
||||||
bool use_velocity = mfs->flags & FLUID_FLOW_INITVELOCITY;
|
bool use_velocity = mfs->flags & FLUID_FLOW_INITVELOCITY;
|
||||||
bool is_static = is_static_object(flowobj);
|
bool is_static = is_static_object(flowobj);
|
||||||
@@ -2764,7 +2767,7 @@ static void update_flowsfluids(struct Depsgraph *depsgraph,
|
|||||||
for (subframe = subframes; subframe >= 0; subframe--) {
|
for (subframe = subframes; subframe >= 0; subframe--) {
|
||||||
|
|
||||||
/* Temporary emission map used when subframes are enabled, i.e. at least one subframe. */
|
/* Temporary emission map used when subframes are enabled, i.e. at least one subframe. */
|
||||||
EmissionMap em_temp = {NULL};
|
FluidObjectBB bb_temp = {NULL};
|
||||||
|
|
||||||
/* Set scene time */
|
/* Set scene time */
|
||||||
/* Handle emission subframe */
|
/* Handle emission subframe */
|
||||||
@@ -2811,19 +2814,19 @@ static void update_flowsfluids(struct Depsgraph *depsgraph,
|
|||||||
/* Emission from particles. */
|
/* Emission from particles. */
|
||||||
if (mfs->source == FLUID_FLOW_SOURCE_PARTICLES) {
|
if (mfs->source == FLUID_FLOW_SOURCE_PARTICLES) {
|
||||||
if (subframes) {
|
if (subframes) {
|
||||||
emit_from_particles(flowobj, mds, mfs, &em_temp, depsgraph, scene, subframe_dt);
|
emit_from_particles(flowobj, mds, mfs, &bb_temp, depsgraph, scene, subframe_dt);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
emit_from_particles(flowobj, mds, mfs, em, depsgraph, scene, subframe_dt);
|
emit_from_particles(flowobj, mds, mfs, bb, depsgraph, scene, subframe_dt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Emission from mesh. */
|
/* Emission from mesh. */
|
||||||
else if (mfs->source == FLUID_FLOW_SOURCE_MESH) {
|
else if (mfs->source == FLUID_FLOW_SOURCE_MESH) {
|
||||||
if (subframes) {
|
if (subframes) {
|
||||||
emit_from_mesh(flowobj, mds, mfs, &em_temp, subframe_dt);
|
emit_from_mesh(flowobj, mds, mfs, &bb_temp, subframe_dt);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
emit_from_mesh(flowobj, mds, mfs, em, subframe_dt);
|
emit_from_mesh(flowobj, mds, mfs, bb, subframe_dt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -2834,8 +2837,8 @@ static void update_flowsfluids(struct Depsgraph *depsgraph,
|
|||||||
* the temp map with the original emission map. */
|
* the temp map with the original emission map. */
|
||||||
if (subframes) {
|
if (subframes) {
|
||||||
/* Combine emission maps. */
|
/* Combine emission maps. */
|
||||||
em_combineMaps(em, &em_temp, !(mfs->flags & FLUID_FLOW_ABSOLUTE), sample_size);
|
bb_combineMaps(bb, &bb_temp, !(mfs->flags & FLUID_FLOW_ABSOLUTE), sample_size);
|
||||||
em_freeData(&em_temp);
|
bb_freeData(&bb_temp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2851,7 +2854,7 @@ static void update_flowsfluids(struct Depsgraph *depsgraph,
|
|||||||
|
|
||||||
/* Adjust domain size if needed. Only do this once for every frame. */
|
/* Adjust domain size if needed. Only do this once for every frame. */
|
||||||
if (mds->type == FLUID_DOMAIN_TYPE_GAS && mds->flags & FLUID_DOMAIN_USE_ADAPTIVE_DOMAIN) {
|
if (mds->type == FLUID_DOMAIN_TYPE_GAS && mds->flags & FLUID_DOMAIN_USE_ADAPTIVE_DOMAIN) {
|
||||||
adaptive_domain_adjust(mds, ob, emaps, numflowobj, dt);
|
adaptive_domain_adjust(mds, ob, bb_maps, numflowobj, dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
float *phi_in = manta_get_phi_in(mds->fluid);
|
float *phi_in = manta_get_phi_in(mds->fluid);
|
||||||
@@ -2967,23 +2970,23 @@ static void update_flowsfluids(struct Depsgraph *depsgraph,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EmissionMap *em = &emaps[flow_index];
|
FluidObjectBB *bb = &bb_maps[flow_index];
|
||||||
float *velocity_map = em->velocity;
|
float *velocity_map = bb->velocity;
|
||||||
float *emission_map = em->influence;
|
float *emission_map = bb->influence;
|
||||||
float *distance_map = em->distances;
|
float *distance_map = bb->distances;
|
||||||
|
|
||||||
int gx, gy, gz, ex, ey, ez, dx, dy, dz;
|
int gx, gy, gz, ex, ey, ez, dx, dy, dz;
|
||||||
size_t e_index, d_index;
|
size_t e_index, d_index;
|
||||||
|
|
||||||
/* Loop through every emission map cell. */
|
/* Loop through every emission map cell. */
|
||||||
for (gx = em->min[0]; gx < em->max[0]; gx++) {
|
for (gx = bb->min[0]; gx < bb->max[0]; gx++) {
|
||||||
for (gy = em->min[1]; gy < em->max[1]; gy++) {
|
for (gy = bb->min[1]; gy < bb->max[1]; gy++) {
|
||||||
for (gz = em->min[2]; gz < em->max[2]; gz++) {
|
for (gz = bb->min[2]; gz < bb->max[2]; gz++) {
|
||||||
/* Compute emission map index. */
|
/* Compute emission map index. */
|
||||||
ex = gx - em->min[0];
|
ex = gx - bb->min[0];
|
||||||
ey = gy - em->min[1];
|
ey = gy - bb->min[1];
|
||||||
ez = gz - em->min[2];
|
ez = gz - bb->min[2];
|
||||||
e_index = manta_get_index(ex, em->res[0], ey, em->res[1], ez);
|
e_index = manta_get_index(ex, bb->res[0], ey, bb->res[1], ez);
|
||||||
|
|
||||||
/* Get domain index. */
|
/* Get domain index. */
|
||||||
dx = gx - mds->res_min[0];
|
dx = gx - mds->res_min[0];
|
||||||
@@ -3086,13 +3089,13 @@ static void update_flowsfluids(struct Depsgraph *depsgraph,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* End of flow emission map loop. */
|
} /* End of flow emission map loop. */
|
||||||
em_freeData(em);
|
bb_freeData(bb);
|
||||||
} /* End of flow object loop. */
|
} /* End of flow object loop. */
|
||||||
}
|
}
|
||||||
|
|
||||||
BKE_collision_objects_free(flowobjs);
|
BKE_collision_objects_free(flowobjs);
|
||||||
if (emaps) {
|
if (bb_maps) {
|
||||||
MEM_freeN(emaps);
|
MEM_freeN(bb_maps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user