[Bf-blender-cvs] [8beba05ecce] fluid-mantaflow: Merge branch 'master' into fluid-mantaflow

Sebastián Barschkis noreply at git.blender.org
Sun Aug 18 23:01:17 CEST 2019


Commit: 8beba05ecce265564ae7f14ea91add88905ac5e7
Author: Sebastián Barschkis
Date:   Sun Aug 18 22:53:13 2019 +0200
Branches: fluid-mantaflow
https://developer.blender.org/rB8beba05ecce265564ae7f14ea91add88905ac5e7

Merge branch 'master' into fluid-mantaflow

===================================================================



===================================================================

diff --cc source/blender/blenkernel/intern/manta.c
index bcbf369d924,00000000000..cc8c8c5f25b
mode 100644,000000..100644
--- a/source/blender/blenkernel/intern/manta.c
+++ b/source/blender/blenkernel/intern/manta.c
@@@ -1,4402 -1,0 +1,4402 @@@
 +/*
 + * This program is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU General Public License
 + * as published by the Free Software Foundation; either version 2
 + * of the License, or (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software Foundation,
 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 + *
 + * The Original Code is Copyright (C) Blender Foundation.
 + * All rights reserved.
 + */
 +
 +/** \file
 + * \ingroup bke
 + */
 +
 +/* Part of the code copied from elbeem fluid library, copyright by Nils Thuerey */
 +
 +#include "MEM_guardedalloc.h"
 +
 +#include <float.h>
 +#include <math.h>
 +#include <stdio.h>
 +#include <string.h> /* memset */
 +
 +#include "BLI_blenlib.h"
 +#include "BLI_math.h"
 +#include "BLI_kdopbvh.h"
 +#include "BLI_threads.h"
 +#include "BLI_utildefines.h"
 +
 +#include "DNA_anim_types.h"
 +#include "DNA_armature_types.h"
 +#include "DNA_constraint_types.h"
 +#include "DNA_customdata_types.h"
 +#include "DNA_light_types.h"
 +#include "DNA_mesh_types.h"
 +#include "DNA_meshdata_types.h"
 +#include "DNA_modifier_types.h"
 +#include "DNA_object_types.h"
 +#include "DNA_particle_types.h"
 +#include "DNA_scene_types.h"
 +#include "DNA_manta_types.h"
 +
 +#include "BKE_appdir.h"
 +#include "BKE_animsys.h"
 +#include "BKE_armature.h"
 +#include "BKE_bvhutils.h"
 +#include "BKE_collision.h"
 +#include "BKE_colortools.h"
 +#include "BKE_constraint.h"
 +#include "BKE_customdata.h"
 +#include "BKE_deform.h"
 +#include "BKE_effect.h"
 +#include "BKE_library.h"
 +#include "BKE_mesh.h"
 +#include "BKE_mesh_runtime.h"
 +#include "BKE_modifier.h"
 +#include "BKE_object.h"
 +#include "BKE_particle.h"
 +#include "BKE_pointcache.h"
 +#include "BKE_scene.h"
 +#include "BKE_manta.h"
 +#include "BKE_texture.h"
 +
 +#include "DEG_depsgraph.h"
 +#include "DEG_depsgraph_query.h"
 +
 +#include "RE_shader_ext.h"
 +
 +#include "GPU_glew.h"
 +
 +/* UNUSED so far, may be enabled later */
 +/* #define USE_SMOKE_COLLISION_DM */
 +
 +//#define DEBUG_TIME
 +
 +#include "manta_fluid_API.h"
 +
 +#ifdef DEBUG_TIME
 +#  include "PIL_time.h"
 +#endif
 +
 +#  include "BLI_task.h"
 +#  include "BLI_kdtree.h"
 +#  include "BLI_voxel.h"
 +
 +static ThreadMutex object_update_lock = BLI_MUTEX_INITIALIZER;
 +
 +struct Mesh;
 +struct Object;
 +struct Scene;
 +struct MantaModifierData;
 +
 +// timestep default value for nice appearance 0.1f
 +#  define DT_DEFAULT 0.1f
 +
 +#  define ADD_IF_LOWER_POS(a, b) (min_ff((a) + (b), max_ff((a), (b))))
 +#  define ADD_IF_LOWER_NEG(a, b) (max_ff((a) + (b), min_ff((a), (b))))
 +#  define ADD_IF_LOWER(a, b) (((b) > 0) ? ADD_IF_LOWER_POS((a), (b)) : ADD_IF_LOWER_NEG((a), (b)))
 +
 +void BKE_manta_reallocate_fluid(MantaDomainSettings *mds, int res[3], int free_old)
 +{
 +  if (free_old && mds->fluid) {
 +    manta_free(mds->fluid);
 +  }
 +  if (!min_iii(res[0], res[1], res[2])) {
 +    mds->fluid = NULL;
 +    return;
 +  }
 +
 +  mds->fluid = manta_init(res, mds->mmd);
 +
 +  if (mds->flags & FLUID_DOMAIN_USE_NOISE) {
 +    mds->res_noise[0] = res[0] * mds->noise_scale;
 +    mds->res_noise[1] = res[1] * mds->noise_scale;
 +    mds->res_noise[2] = res[2] * mds->noise_scale;
 +  }
 +}
 +
 +/* convert global position to domain cell space */
 +static void manta_pos_to_cell(MantaDomainSettings *mds, float pos[3])
 +{
 +  mul_m4_v3(mds->imat, pos);
 +  sub_v3_v3(pos, mds->p0);
 +  pos[0] *= 1.0f / mds->cell_size[0];
 +  pos[1] *= 1.0f / mds->cell_size[1];
 +  pos[2] *= 1.0f / mds->cell_size[2];
 +}
 +
 +/* set domain transformations and base resolution from object mesh */
 +static void manta_set_domain_from_mesh(MantaDomainSettings *mds,
 +                                       Object *ob,
 +                                       Mesh *me,
 +                                       bool init_resolution)
 +{
 +  size_t i;
 +  float min[3] = {FLT_MAX, FLT_MAX, FLT_MAX}, max[3] = {-FLT_MAX, -FLT_MAX, -FLT_MAX};
 +  float size[3];
 +  MVert *verts = me->mvert;
 +  float scale = 0.0;
 +  int res;
 +
 +  res = mds->maxres;
 +
 +  // get BB of domain
 +  for (i = 0; i < me->totvert; i++) {
 +    // min BB
 +    min[0] = MIN2(min[0], verts[i].co[0]);
 +    min[1] = MIN2(min[1], verts[i].co[1]);
 +    min[2] = MIN2(min[2], verts[i].co[2]);
 +
 +    // max BB
 +    max[0] = MAX2(max[0], verts[i].co[0]);
 +    max[1] = MAX2(max[1], verts[i].co[1]);
 +    max[2] = MAX2(max[2], verts[i].co[2]);
 +  }
 +
 +  /* set domain bounds */
 +  copy_v3_v3(mds->p0, min);
 +  copy_v3_v3(mds->p1, max);
 +  mds->dx = 1.0f / res;
 +
 +  /* calculate domain dimensions */
 +  sub_v3_v3v3(size, max, min);
 +  if (init_resolution) {
 +    zero_v3_int(mds->base_res);
 +    copy_v3_v3(mds->cell_size, size);
 +  }
 +  /* apply object scale */
 +  for (i = 0; i < 3; i++) {
 +    size[i] = fabsf(size[i] * ob->scale[i]);
 +  }
 +  copy_v3_v3(mds->global_size, size);
 +  copy_v3_v3(mds->dp0, min);
 +
 +  invert_m4_m4(mds->imat, ob->obmat);
 +
 +  // prevent crash when initializing a plane as domain
 +  if (!init_resolution || (size[0] < FLT_EPSILON) || (size[1] < FLT_EPSILON) ||
 +      (size[2] < FLT_EPSILON)) {
 +    return;
 +  }
 +
 +  /* define grid resolutions from longest domain side */
 +  if (size[0] >= MAX2(size[1], size[2])) {
 +    scale = res / size[0];
 +    mds->scale = size[0] / fabsf(ob->scale[0]);
 +    mds->base_res[0] = res;
 +    mds->base_res[1] = max_ii((int)(size[1] * scale + 0.5f), 4);
 +    mds->base_res[2] = max_ii((int)(size[2] * scale + 0.5f), 4);
 +  }
 +  else if (size[1] >= MAX2(size[0], size[2])) {
 +    scale = res / size[1];
 +    mds->scale = size[1] / fabsf(ob->scale[1]);
 +    mds->base_res[0] = max_ii((int)(size[0] * scale + 0.5f), 4);
 +    mds->base_res[1] = res;
 +    mds->base_res[2] = max_ii((int)(size[2] * scale + 0.5f), 4);
 +  }
 +  else {
 +    scale = res / size[2];
 +    mds->scale = size[2] / fabsf(ob->scale[2]);
 +    mds->base_res[0] = max_ii((int)(size[0] * scale + 0.5f), 4);
 +    mds->base_res[1] = max_ii((int)(size[1] * scale + 0.5f), 4);
 +    mds->base_res[2] = res;
 +  }
 +
 +  /* set cell size */
 +  mds->cell_size[0] /= (float)mds->base_res[0];
 +  mds->cell_size[1] /= (float)mds->base_res[1];
 +  mds->cell_size[2] /= (float)mds->base_res[2];
 +}
 +
 +static void manta_set_domain_gravity(Scene *scene, MantaDomainSettings *mds)
 +{
 +  float gravity[3] = {0.0f, 0.0f, -1.0f};
 +  float gravity_mag;
 +
 +  /* use global gravity if enabled */
 +  if (scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY) {
 +    copy_v3_v3(gravity, scene->physics_settings.gravity);
 +    /* map default value to 1.0 */
 +    mul_v3_fl(gravity, 1.0f / 9.810f);
 +
 +    /* convert gravity to domain space */
 +    gravity_mag = len_v3(gravity);
 +    mul_mat3_m4_v3(mds->imat, gravity);
 +    normalize_v3(gravity);
 +    mul_v3_fl(gravity, gravity_mag);
 +
 +    mds->gravity[0] = gravity[0];
 +    mds->gravity[1] = gravity[1];
 +    mds->gravity[2] = gravity[2];
 +  }
 +}
 +
 +static int mantaModifier_init(
 +    MantaModifierData *mmd, Depsgraph *depsgraph, Object *ob, Scene *scene, Mesh *me)
 +{
 +  int scene_framenr = (int)DEG_get_ctime(depsgraph);
 +
 +  if ((mmd->type & MOD_MANTA_TYPE_DOMAIN) && mmd->domain && !mmd->domain->fluid) {
 +    MantaDomainSettings *mds = mmd->domain;
 +    int res[3];
 +    /* set domain dimensions from mesh */
 +    manta_set_domain_from_mesh(mds, ob, me, true);
 +    /* set domain gravity */
 +    manta_set_domain_gravity(scene, mds);
 +    /* reset domain values */
 +    zero_v3_int(mds->shift);
 +    zero_v3(mds->shift_f);
 +    add_v3_fl(mds->shift_f, 0.5f);
 +    zero_v3(mds->prev_loc);
 +    mul_m4_v3(ob->obmat, mds->prev_loc);
 +    copy_m4_m4(mds->obmat, ob->obmat);
 +
 +    /* set resolutions */
 +    if (mmd->domain->type == FLUID_DOMAIN_TYPE_GAS &&
 +        mmd->domain->flags & FLUID_DOMAIN_USE_ADAPTIVE_DOMAIN)
 +    {
 +      res[0] = res[1] = res[2] = 1; /* use minimum res for adaptive init */
 +    }
 +    else {
 +      copy_v3_v3_int(res, mds->base_res);
 +    }
 +    copy_v3_v3_int(mds->res, res);
 +    mds->total_cells = mds->res[0] * mds->res[1] * mds->res[2];
 +    mds->res_min[0] = mds->res_min[1] = mds->res_min[2] = 0;
 +    copy_v3_v3_int(mds->res_max, res);
 +
 +    /* set time, frame length = 0.1 is at 25fps */
 +    float fps = scene->r.frs_sec / scene->r.frs_sec_base;
 +    mds->frame_length = DT_DEFAULT * (25.0f / fps) * mds->time_scale;
 +    /* initially dt is equal to frame length (dt can change with adaptive-time stepping though) */
 +    mds->dt = mds->frame_length;
 +    mds->time_per_frame = 0;
 +    mds->time_total = (scene_framenr-1) * mds->frame_length;
 +
 +    /* allocate fluid */
 +    BKE_manta_reallocate_fluid(mds, mds->res, 0);
 +
 +    mmd->time = scene_framenr;
 +
 +    return 1;
 +  }
 +  else if (mmd->type & MOD_MANTA_TYPE_FLOW) {
 +    if (!mmd->flow) {
 +      mantaModifier_createType(mmd);
 +    }
 +    mmd->time = scene_framenr;
 +    return 1;
 +  }
 +  else if (mmd->type & MOD_MANTA_TYPE_EFFEC) {
 +    if (!mmd->effec) {
 +      mantaModifier_createType(mmd);
 +    }
 +    mmd->time = scene_framenr;
 +    return 1;
 +  }
 +  return 0;
 +}
 +
 +static void mantaModifier_freeDomain(MantaModifierData *mmd)
 +{
 +  if (mmd->domain) {
 +    if (mmd->domain->fluid) {
 +      manta_free(mmd->domain->fluid);
 +    }
 +
 +    if (mmd->domain->fluid_mutex) {
 +      BLI_rw_mutex_free(mmd->domain->fluid_mutex);
 +    }
 +
 +    if (mmd->domain->effector_weights) {
 +      MEM_freeN(mmd->domain->effector_weights);
 +    }
 +    mmd->domain->effector_weights = NULL;
 +
 +    if (!(m

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list