Fluids: improve subframe handling

Reviewers: sebbas

Differential Revision: https://developer.blender.org/D7256
This commit is contained in:
Jacques Lucke 2020-04-02 10:34:05 +02:00
parent 06cb321f33
commit 1c3ded12f4
1 changed files with 15 additions and 58 deletions

View File

@ -1232,52 +1232,31 @@ static void update_obstacles(Depsgraph *depsgraph,
continue;
}
/* Length of one adaptive frame. If using adaptive stepping, length is smaller than actual
* frame length */
float adaptframe_length = time_per_frame / frame_length;
/* Adaptive frame length as percentage */
CLAMP(adaptframe_length, 0.0f, 1.0f);
/* More splitting because of emission subframe: If no subframes present, sample_size is 1. */
float sample_size = 1.0f / (float)(subframes + 1);
/* First frame cannot have any subframes because there is (obviously) no previous frame from
* where subframes could come from. */
if (is_first_frame) {
subframes = 0;
}
int subframe;
/* More splitting because of emission subframe: If no subframes present, sample_size is 1. */
float sample_size = 1.0f / (float)(subframes + 1);
float subframe_dt = dt * sample_size;
/* Emission loop. When not using subframes this will loop only once. */
for (subframe = subframes; subframe >= 0; subframe--) {
for (int subframe = 0; subframe <= subframes; subframe++) {
/* Temporary emission map used when subframes are enabled, i.e. at least one subframe. */
FluidObjectBB bb_temp = {NULL};
/* Set scene time */
/* Handle emission subframe */
if (subframe > 0 && !is_first_frame) {
scene->r.subframe = adaptframe_length -
sample_size * (float)(subframe) * (dt / frame_length);
if (subframe < subframes || time_per_frame + dt + FLT_EPSILON < frame_length) {
scene->r.subframe = (time_per_frame + (subframe + 1.0f) * subframe_dt) / frame_length;
scene->r.cfra = frame - 1;
}
/* Last frame in this loop (subframe == suframes). Can be real end frame or in between
* frames (adaptive frame). */
else {
/* Handle adaptive subframe (ie has subframe fraction). Need to set according scene
* subframe parameter. */
if (time_per_frame < frame_length) {
scene->r.subframe = adaptframe_length;
scene->r.cfra = frame - 1;
}
/* Handle absolute endframe (ie no subframe fraction). Need to set the scene subframe
* parameter to 0 and advance current scene frame. */
else {
scene->r.subframe = 0.0f;
scene->r.cfra = frame;
}
scene->r.subframe = 0.0f;
scene->r.cfra = frame;
}
/* Sanity check: subframe portion must be between 0 and 1. */
CLAMP(scene->r.subframe, 0.0f, 1.0f);
@ -2768,53 +2747,31 @@ static void update_flowsfluids(struct Depsgraph *depsgraph,
continue;
}
/* Length of one adaptive frame. If using adaptive stepping, length is smaller than actual
* frame length */
float adaptframe_length = time_per_frame / frame_length;
/* Adaptive frame length as percentage */
CLAMP(adaptframe_length, 0.0f, 1.0f);
/* More splitting because of emission subframe: If no subframes present, sample_size is 1. */
float sample_size = 1.0f / (float)(subframes + 1);
/* First frame cannot have any subframes because there is (obviously) no previous frame from
* where subframes could come from. */
if (is_first_frame) {
subframes = 0;
}
int subframe;
/* More splitting because of emission subframe: If no subframes present, sample_size is 1. */
float sample_size = 1.0f / (float)(subframes + 1);
float subframe_dt = dt * sample_size;
/* Emission loop. When not using subframes this will loop only once. */
for (subframe = subframes; subframe >= 0; subframe--) {
for (int subframe = 0; subframe <= subframes; subframe++) {
/* Temporary emission map used when subframes are enabled, i.e. at least one subframe. */
FluidObjectBB bb_temp = {NULL};
/* Set scene time */
/* Handle emission subframe */
if (subframe > 0 && !is_first_frame) {
scene->r.subframe = adaptframe_length -
sample_size * (float)(subframe) * (dt / frame_length);
if (subframe < subframes || time_per_frame + dt + FLT_EPSILON < frame_length) {
scene->r.subframe = (time_per_frame + (subframe + 1.0f) * subframe_dt) / frame_length;
scene->r.cfra = frame - 1;
}
/* Last frame in this loop (subframe == suframes). Can be real end frame or in between
* frames (adaptive frame). */
else {
/* Handle adaptive subframe (ie has subframe fraction). Need to set according scene
* subframe parameter. */
if (time_per_frame < frame_length) {
scene->r.subframe = adaptframe_length;
scene->r.cfra = frame - 1;
}
/* Handle absolute endframe (ie no subframe fraction). Need to set the scene subframe
* parameter to 0 and advance current scene frame. */
else {
scene->r.subframe = 0.0f;
scene->r.cfra = frame;
}
scene->r.subframe = 0.0f;
scene->r.cfra = frame;
}
/* Sanity check: subframe portion must be between 0 and 1. */
CLAMP(scene->r.subframe, 0.0f, 1.0f);
# ifdef DEBUG_PRINT