Commit: 6b6a968053cd8bb031049094bfc2da8e983e8969
Author: Martin Felke
Date:   Wed Dec 31 13:59:45 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rB6b6a968053cd8bb031049094bfc2da8e983e8969

Merge remote-tracking branch 'refs/remotes/origin/master' into fracture_modifier

Conflicts:
        extern/SConscript
        release/datafiles/splash.png
        release/datafiles/splash_2x.png
        source/blender/blenkernel/intern/rigidbody.c
        source/blender/editors/physics/rigidbody_constraint.c
        source/blender/makesrna/intern/rna_modifier.c
        source/blender/modifiers/intern/MOD_boolean_util.c
        source/blender/windowmanager/WM_api.h

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



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

diff --cc CMakeLists.txt
index b4c58cf,4ee277b..53d227a
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@@ -146,11 -217,10 +217,11 @@@ option(WITH_FFTW3         "Enable FFTW
  option(WITH_BULLET        "Enable Bullet (Physics Engine)" ON)
  option(WITH_SYSTEM_BULLET "Use the systems bullet library (currently 
unsupported due to missing features in upstream!)" )
  mark_as_advanced(WITH_SYSTEM_BULLET)
- option(WITH_GAMEENGINE    "Enable Game Engine" ON)
+ option(WITH_GAMEENGINE    "Enable Game Engine" ${_init_GAMEENGINE})
  option(WITH_PLAYER        "Build Player" OFF)
- option(WITH_OPENCOLORIO   "Enable OpenColorIO color management" ON)
+ option(WITH_OPENCOLORIO   "Enable OpenColorIO color management" 
${_init_OPENCOLORIO})
  option(WITH_COMPOSITOR    "Enable the tile based nodal compositor" ON)
 +option(WITH_VORO    "Enable Voronoi Fracture based on Voro++" ON)
  
  # GHOST Windowing Library Options
  option(WITH_GHOST_DEBUG   "Enable debugging output for the GHOST library" OFF)
diff --cc SConstruct
index 2689795,4dacf89..1682ae6
--- a/SConstruct
+++ b/SConstruct
@@@ -263,8 -265,8 +265,9 @@@ if 'blenderlite' in B.targets
      target_env_defs['WITH_BF_SMOKE'] = False
      target_env_defs['WITH_BF_BOOLEAN'] = False
      target_env_defs['WITH_BF_REMESH'] = False
 +    target_env_defs['WITH_BF_VORONOI'] = False
      target_env_defs['WITH_BF_PYTHON'] = False
+     target_env_defs['WITH_BF_IME'] = False
      target_env_defs['WITH_BF_3DMOUSE'] = False
      target_env_defs['WITH_BF_LIBMV'] = False
      target_env_defs['WITH_BF_FREESTYLE'] = False
diff --cc extern/SConscript
index f370d30,1f94f50..b5f3c73
--- a/extern/SConscript
+++ b/extern/SConscript
@@@ -51,5 -51,5 +51,8 @@@ if env['WITH_GHOST_XDND']
      if env['OURPLATFORM'] in ('linux', 'openbsd3', 'sunos5', 'aix4', 'aix5'):
          SConscript(['xdnd/SConscript'])
  
 +if env ['WITH_BF_VORONOI']:
 +    SConscript(['voro++/SConscript'])
++    
+ if env['WITH_BF_SDL'] and env['WITH_BF_SDL_DYNLOAD']:
+     SConscript(['sdlew/SConscript'])
diff --cc source/blender/blenkernel/SConscript
index 2c481b9,3da3d64..248ef84
--- a/source/blender/blenkernel/SConscript
+++ b/source/blender/blenkernel/SConscript
@@@ -165,13 -166,13 +166,17 @@@ if env['WITH_BF_INTERNATIONAL']
  if env['WITH_BF_FREESTYLE']:
      defs.append('WITH_FREESTYLE')
  
 +if env['WITH_BF_VORONOI']:
 +    incs += ' #/extern/voro++'
 +    defs.append('WITH_VORO')
 +
  if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 
'win64-vc', 'win64-mingw'):
      incs += ' ' + env['BF_PTHREADS_INC']
+     incs += ' ../../../intern/utfconv'
  
+ if env['WITH_BF_BINRELOC']:
+     incs += ' #extern/binreloc/include'
+     defs.append('WITH_BINRELOC')
  
  if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
      env.BlenderLib ( libname = 'bf_blenkernel', sources = sources, includes = 
Split(incs), defines = defs, libtype=['core','player'], priority = [166,25]) #, 
cc_compileflags = env['CCFLAGS'].append('/WX') )
diff --cc source/blender/blenkernel/intern/rigidbody.c
index 9238245,3bf5c4c..ac73ee3
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@@ -64,430 -61,9 +64,428 @@@
  #include "BKE_object.h"
  #include "BKE_pointcache.h"
  #include "BKE_rigidbody.h"
 +#include "BKE_modifier.h"
 +#include "BKE_depsgraph.h"
 +#include "BKE_scene.h"
  
- #include "RNA_access.h"
- 
  #ifdef WITH_BULLET
  
 +static void activateRigidbody(RigidBodyOb* rbo)
 +{
 +      rbo->flag &= ~RBO_FLAG_KINEMATIC;
 +      RB_body_set_mass(rbo->physics_object, RBO_GET_MASS(rbo));
 +      RB_body_set_kinematic_state(rbo->physics_object, false);
 +      rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
 +}
 +
 +static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, 
int rebuild);
 +
 +static bool isModifierActive(FractureModifierData *rmd) {
 +      return ((rmd != NULL) && (rmd->modifier.mode & (eModifierMode_Realtime 
| eModifierMode_Render)) && (rmd->refresh == false));
 +}
 +
 +static void calc_dist_angle(RigidBodyShardCon *con, float *dist, float *angle)
 +{
 +      float q1[4], q2[4], qdiff[4], axis[3];
 +      if ((con->mi1->rigidbody == NULL) || (con->mi2->rigidbody == NULL)) {
 +              *dist = 0;
 +              *angle = 0;
 +              return;
 +      }
 +      
 +      sub_v3_v3v3(axis, con->mi1->rigidbody->pos, con->mi2->rigidbody->pos);
 +      *dist = len_v3(axis);
 +      copy_qt_qt(q1, con->mi1->rigidbody->orn);
 +      copy_qt_qt(q2, con->mi2->rigidbody->orn);
 +      invert_qt(q1);
 +      mul_qt_qtqt(qdiff, q1, q2);
 +      quat_to_axis_angle(axis, angle, qdiff);
 +}
 +
 +void BKE_rigidbody_start_dist_angle(RigidBodyShardCon *con)
 +{
 +      /* store starting angle and distance per constraint*/
 +      float dist, angle;
 +      calc_dist_angle(con, &dist, &angle);
 +      con->start_dist = dist;
 +      con->start_angle = angle;
 +}
 +
 +float BKE_rigidbody_calc_max_con_mass(Object *ob)
 +{
 +      FractureModifierData *rmd;
 +      ModifierData *md;
 +      RigidBodyShardCon *con;
 +      float max_con_mass = 0, con_mass;
 +
 +      for (md = ob->modifiers.first; md; md = md->next) {
 +              if (md->type == eModifierType_Fracture) {
 +                      rmd = (FractureModifierData *)md;
 +                      for (con = rmd->meshConstraints.first; con; con = 
con->next) {
 +                              if ((con->mi1 != NULL && con->mi1->rigidbody != 
NULL) &&
 +                                  (con->mi2 != NULL && con->mi2->rigidbody != 
NULL)) {
 +                                      con_mass = con->mi1->rigidbody->mass + 
con->mi2->rigidbody->mass;
 +                                      if (con_mass > max_con_mass) {
 +                                              max_con_mass = con_mass;
 +                                      }
 +                              }
 +                      }
 +
 +                      return max_con_mass;
 +              }
 +      }
 +
 +      return 0;
 +}
 +
 +float BKE_rigidbody_calc_min_con_dist(Object *ob)
 +{
 +      FractureModifierData *rmd;
 +      ModifierData *md;
 +      RigidBodyShardCon *con;
 +      float min_con_dist = FLT_MAX, con_dist, con_vec[3];
 +
 +      for (md = ob->modifiers.first; md; md = md->next) {
 +              if (md->type == eModifierType_Fracture) {
 +                      rmd = (FractureModifierData *)md;
 +                      for (con = rmd->meshConstraints.first; con; con = 
con->next) {
 +                              if ((con->mi1 != NULL && con->mi1->rigidbody != 
NULL) &&
 +                                  (con->mi2 != NULL && con->mi2->rigidbody != 
NULL)) {
 +                                      sub_v3_v3v3(con_vec, 
con->mi1->centroid, con->mi2->centroid);
 +                                      con_dist = len_v3(con_vec);
 +                                      if (con_dist < min_con_dist) {
 +                                              min_con_dist = con_dist;
 +                                      }
 +                              }
 +                      }
 +
 +                      return min_con_dist;
 +              }
 +      }
 +
 +      return FLT_MAX;
 +}
 +
 +
 +void BKE_rigidbody_calc_threshold(float max_con_mass, FractureModifierData 
*rmd, RigidBodyShardCon *con) {
 +
 +      float max_thresh, thresh = 0.0f, con_mass;
 +      if ((max_con_mass == 0) && (rmd->use_mass_dependent_thresholds)) {
 +              return;
 +      }
 +
 +      if ((con->mi1 == NULL) || (con->mi2 == NULL)) {
 +              return;
 +      }
 +
 +      max_thresh = rmd->breaking_threshold;
 +      if ((con->mi1->rigidbody != NULL) && (con->mi2->rigidbody != NULL)) {
 +              con_mass = con->mi1->rigidbody->mass + 
con->mi2->rigidbody->mass;
 +
 +              if (rmd->use_mass_dependent_thresholds)
 +              {
 +                      thresh = (con_mass / max_con_mass) * max_thresh;
 +              }
 +
 +              con->breaking_threshold = thresh;
 +      }
 +}
 +
 +static int DM_mesh_minmax(DerivedMesh *dm, float r_min[3], float r_max[3])
 +{
 +      MVert *v;
 +      int i = 0;
 +      for (i = 0; i < dm->numVertData; i++) {
 +              v = CDDM_get_vert(dm, i);
 +              minmax_v3v3_v3(r_min, r_max, v->co);
 +      }
 +
 +      return (dm->numVertData != 0);
 +}
 +
 +static void DM_mesh_boundbox(DerivedMesh *bm, float r_loc[3], float r_size[3])
 +{
 +      float min[3], max[3];
 +      float mloc[3], msize[3];
 +
 +      if (!r_loc) r_loc = mloc;
 +      if (!r_size) r_size = msize;
 +
 +      INIT_MINMAX(min, max);
 +      if (!DM_mesh_minmax(bm, min, max)) {
 +              min[0] = min[1] = min[2] = -1.0f;
 +              max[0] = max[1] = max[2] = 1.0f;
 +      }
 +
 +      mid_v3_v3v3(r_loc, min, max);
 +
 +      r_size[0] = (max[0] - min[0]) / 2.0f;
 +      r_size[1] = (max[1] - min[1]) / 2.0f;
 +      r_size[2] = (max[2] - min[2]) / 2.0f;
 +}
 +
 +/* helper function to calculate volume of rigidbody object */
 +float BKE_rigidbody_calc_volume(DerivedMesh *dm, RigidBodyOb *rbo)
 +{
 +      float loc[3]  = {0.0f, 0.0f, 0.0f};
 +      float size[3]  = {1.0f, 1.0f, 1.0f};
 +      float radius = 1.0f;
 +      float height = 1.0f;
 +
 +      float volume = 0.0f;
 +
 +      /* if automatically determining dimensions, use the Object's boundbox
 +       *      - assume that all quadrics are standing upright on local z-axis
 +       *      - assume even distribution of mass around the Object's pivot
 +       *        (i.e. Object pivot is centralised in boundbox)
 +       *      - boundbox gives full width
 +       */
 +      /* XXX: all dimensions are auto-determined now... later can add stored 
settings for this*/
 +      DM_mesh_boundbox(dm, loc, size);
 +
 +      if (ELEM(rbo->shape, RB_SHAPE_CAPSULE, RB_SHAPE_CYLINDER, 
RB_SHAPE_CONE)) {
 +              /* take radius as largest x/y dimension, and height as 
z-dimension */
 +              radius = MAX2(size[0], size[1]) * 0.5f;
 +              height = size[2];
 +      }
 +      else if (rbo->shape == RB_SHAPE_SPHERE) {
 +              /* take radius to the the largest dimension to try and 
encompass everything */
 +              radius = max_fff(size[0], size[1], size[2]) * 0.5f;
 +      }
 +
 +      /* calculate volume as appropriate  */
 +      switch (rbo->shape) {
 +      
 +              case RB_SHAPE_SPHERE:
 +                      volume = 4.0f / 3.0f * (float)M_PI * radius * radius * 
radius;
 +                      break;
 +
 +              /* for now, assume that capsule is close enough to a 
cylinder... */
 +              case RB_SHAPE_CAPSULE:
 +              case RB_SHAPE_CYLINDER:
 +                      volume = (float)M_PI * radius * radius * height;
 +                      break;
 +
 +              case RB_SHAPE_CONE:
 +                      volume = (float)M_PI / 3.0f * radius * radius * height;
 +                      break;
 +
 +              /* for now, all mesh shapes are just treated as boxes...
 +               * NOTE: this may overestimate the volume, but other methods 
are overkill
 +               */
 +              case RB_SHAPE_BOX:
 +              case RB_SHAPE_CONVEXH:
 +              case RB_SHAPE_TRIMESH:
 +                      volume = size[0] * size[1] * size[2];
 +                      if (size[0] == 0) {
 +                              volume = size[1] * size[2];
 +                      }
 +                      else if (size[1] == 0) {
 +                              volume = size[0] * size[2];
 +                      }
 +                      else if (size[2] == 0) {
 +                              volume = size[0] * size[1];
 +                      }
 +                      break;
 +
 +#if 0 // XXX: not defined yet
 +              case RB_SHAPE_COMPOUND:
 +                      volume = 0.0f;
 +                      break;
 +#endif
 +      }
 +
 +      /* return the volume calculated */
 +      return volume;
 +}
 +
 +void BKE_rigidbody_calc_shard_mass(Object *ob, MeshIsland *mi, DerivedMesh 
*orig_dm)
 +{
 +      DerivedMesh *dm_ob = orig_dm, *dm_mi;
 +      float vol_mi = 0, mass_mi = 0, vol_ob = 0, mass_ob = 0;
 +
 +      if (dm_ob =

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to