2004-10-01 14:10:30 +00:00
|
|
|
/* softbody.c
|
|
|
|
*
|
2005-08-03 21:38:02 +00:00
|
|
|
* $Id$
|
2004-10-01 14:10:30 +00:00
|
|
|
*
|
2008-04-16 22:40:48 +00:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
2004-10-01 14:10:30 +00:00
|
|
|
*
|
|
|
|
* 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
|
2008-04-16 22:40:48 +00:00
|
|
|
* of the License, or (at your option) any later version.
|
2004-10-01 14:10:30 +00:00
|
|
|
*
|
|
|
|
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) Blender Foundation
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* The Original Code is: all of this file.
|
|
|
|
*
|
|
|
|
* Contributor(s): none yet.
|
|
|
|
*
|
2008-04-16 22:40:48 +00:00
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
2004-10-01 14:10:30 +00:00
|
|
|
*/
|
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
/*
|
|
|
|
******
|
|
|
|
variables on the UI for now
|
2005-04-02 13:57:23 +00:00
|
|
|
|
|
|
|
float mediafrict; friction to env
|
|
|
|
float nodemass; softbody mass of *vertex*
|
|
|
|
float grav; softbody amount of gravitaion to apply
|
|
|
|
|
|
|
|
float goalspring; softbody goal springs
|
|
|
|
float goalfrict; softbody goal springs friction
|
|
|
|
float mingoal; quick limits for goal
|
|
|
|
float maxgoal;
|
|
|
|
|
|
|
|
float inspring; softbody inner springs
|
|
|
|
float infrict; softbody inner springs friction
|
2005-01-12 22:28:13 +00:00
|
|
|
|
|
|
|
*****
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2004-10-01 14:10:30 +00:00
|
|
|
#include <math.h>
|
|
|
|
#include <stdlib.h>
|
2005-01-13 13:58:29 +00:00
|
|
|
#include <string.h>
|
2004-10-01 14:10:30 +00:00
|
|
|
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
|
|
|
/* types */
|
2005-04-02 19:52:32 +00:00
|
|
|
#include "DNA_curve_types.h"
|
2004-10-01 14:10:30 +00:00
|
|
|
#include "DNA_object_types.h"
|
2005-05-02 13:28:13 +00:00
|
|
|
#include "DNA_object_force.h" /* here is the softbody struct */
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
#include "DNA_particle_types.h"
|
2005-05-02 13:28:13 +00:00
|
|
|
#include "DNA_key_types.h"
|
2004-10-01 14:10:30 +00:00
|
|
|
#include "DNA_mesh_types.h"
|
|
|
|
#include "DNA_meshdata_types.h"
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
#include "DNA_modifier_types.h"
|
2005-04-02 19:52:32 +00:00
|
|
|
#include "DNA_lattice_types.h"
|
2004-10-01 14:10:30 +00:00
|
|
|
#include "DNA_scene_types.h"
|
|
|
|
|
|
|
|
#include "BLI_blenlib.h"
|
|
|
|
#include "BLI_arithb.h"
|
2006-11-10 23:09:16 +00:00
|
|
|
#include "BLI_ghash.h"
|
2008-08-11 20:40:29 +00:00
|
|
|
#include "BLI_threads.h"
|
|
|
|
|
2005-11-17 11:40:57 +00:00
|
|
|
#include "BKE_curve.h"
|
2005-04-04 18:09:47 +00:00
|
|
|
#include "BKE_effect.h"
|
2004-10-01 14:10:30 +00:00
|
|
|
#include "BKE_global.h"
|
2005-05-02 13:28:13 +00:00
|
|
|
#include "BKE_key.h"
|
2005-04-02 13:57:23 +00:00
|
|
|
#include "BKE_object.h"
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
#include "BKE_particle.h"
|
2004-10-01 14:10:30 +00:00
|
|
|
#include "BKE_softbody.h"
|
2005-04-02 13:57:23 +00:00
|
|
|
#include "BKE_utildefines.h"
|
2005-08-19 22:55:05 +00:00
|
|
|
#include "BKE_DerivedMesh.h"
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
#include "BKE_pointcache.h"
|
|
|
|
#include "BKE_modifier.h"
|
2004-10-01 14:10:30 +00:00
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
#include "BIF_editdeform.h"
|
2006-11-10 23:09:16 +00:00
|
|
|
#include "BIF_graphics.h"
|
|
|
|
#include "PIL_time.h"
|
2008-02-16 00:07:05 +00:00
|
|
|
// #include "ONL_opennl.h" remove linking to ONL for now
|
2006-11-20 22:27:05 +00:00
|
|
|
|
|
|
|
/* callbacks for errors and interrupts and some goo */
|
|
|
|
static int (*SB_localInterruptCallBack)(void) = NULL;
|
|
|
|
|
|
|
|
|
2004-10-01 14:10:30 +00:00
|
|
|
/* ********** soft body engine ******* */
|
2005-08-15 10:30:53 +00:00
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2005-08-15 10:30:53 +00:00
|
|
|
typedef struct BodySpring {
|
|
|
|
int v1, v2;
|
2008-01-09 00:25:51 +00:00
|
|
|
float len, strength, cf,load;
|
2006-10-14 19:03:06 +00:00
|
|
|
float ext_force[3]; /* edges colliding and sailing */
|
2006-10-04 21:36:55 +00:00
|
|
|
short order;
|
2006-10-10 21:49:02 +00:00
|
|
|
short flag;
|
2005-08-15 10:30:53 +00:00
|
|
|
} BodySpring;
|
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
typedef struct BodyFace {
|
|
|
|
int v1, v2, v3 ,v4;
|
2008-01-31 23:00:08 +00:00
|
|
|
float ext_force[3]; /* faces colliding */
|
2006-11-10 23:09:16 +00:00
|
|
|
short flag;
|
|
|
|
} BodyFace;
|
|
|
|
|
|
|
|
|
|
|
|
/*private scratch pad for caching and other data only needed when alive*/
|
|
|
|
typedef struct SBScratch {
|
|
|
|
GHash *colliderhash;
|
|
|
|
short needstobuildcollider;
|
|
|
|
short flag;
|
|
|
|
BodyFace *bodyface;
|
|
|
|
int totface;
|
|
|
|
float aabbmin[3],aabbmax[3];
|
|
|
|
}SBScratch;
|
2005-08-15 10:30:53 +00:00
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
typedef struct SB_thread_context{
|
|
|
|
Object *ob;
|
|
|
|
float forcetime;
|
|
|
|
float timenow;
|
|
|
|
int ifirst;
|
|
|
|
int ilast;
|
|
|
|
ListBase *do_effector;
|
|
|
|
int do_deflector;
|
|
|
|
float fieldfactor;
|
|
|
|
float windfactor;
|
|
|
|
int nr;
|
|
|
|
int tot;
|
|
|
|
}SB_thread_context;
|
|
|
|
|
2008-01-09 00:25:51 +00:00
|
|
|
#define NLF_BUILD 1
|
|
|
|
#define NLF_SOLVE 2
|
|
|
|
|
|
|
|
#define MID_PRESERVE 1
|
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
#define SOFTGOALSNAP 0.999f
|
2005-11-19 21:35:06 +00:00
|
|
|
/* if bp-> goal is above make it a *forced follow original* and skip all ODE stuff for this bp
|
|
|
|
removes *unnecessary* stiffnes from ODE system
|
|
|
|
*/
|
2006-11-10 23:09:16 +00:00
|
|
|
#define HEUNWARNLIMIT 1 /* 500 would be fine i think for detecting severe *stiff* stuff */
|
2005-01-12 22:28:13 +00:00
|
|
|
|
2005-04-18 21:51:45 +00:00
|
|
|
|
2006-10-10 21:49:02 +00:00
|
|
|
#define BSF_INTERSECT 1 /* edge intersects collider face */
|
2006-11-10 23:09:16 +00:00
|
|
|
#define SBF_DOFUZZY 1 /* edge intersects collider face */
|
2008-01-31 23:00:08 +00:00
|
|
|
|
|
|
|
#define BFF_INTERSECT 1 /* collider edge intrudes face */
|
|
|
|
#define BFF_CLOSEVERT 2 /* collider vertex repulses face */
|
2006-10-10 21:49:02 +00:00
|
|
|
|
|
|
|
|
2005-11-19 21:35:06 +00:00
|
|
|
float SoftHeunTol = 1.0f; /* humm .. this should be calculated from sb parameters and sizes */
|
2005-01-12 22:28:13 +00:00
|
|
|
|
2005-03-09 19:45:59 +00:00
|
|
|
/* local prototypes */
|
2005-04-02 13:57:23 +00:00
|
|
|
static void free_softbody_intern(SoftBody *sb);
|
2005-10-24 22:13:32 +00:00
|
|
|
/* aye this belongs to arith.c */
|
|
|
|
static void Vec3PlusStVec(float *v, float s, float *v1);
|
2005-01-12 22:28:13 +00:00
|
|
|
|
2005-04-12 21:36:21 +00:00
|
|
|
/*+++ frame based timing +++*/
|
|
|
|
|
2005-11-19 21:35:06 +00:00
|
|
|
/*physical unit of force is [kg * m / sec^2]*/
|
2005-04-12 21:36:21 +00:00
|
|
|
|
|
|
|
static float sb_grav_force_scale(Object *ob)
|
2005-11-19 21:35:06 +00:00
|
|
|
/* since unit of g is [m/sec^2] and F = mass * g we rescale unit mass of node to 1 gramm
|
|
|
|
put it to a function here, so we can add user options later without touching simulation code
|
|
|
|
*/
|
2005-04-12 21:36:21 +00:00
|
|
|
{
|
|
|
|
return (0.001f);
|
|
|
|
}
|
|
|
|
|
|
|
|
static float sb_fric_force_scale(Object *ob)
|
2005-11-19 21:35:06 +00:00
|
|
|
/* rescaling unit of drag [1 / sec] to somehow reasonable
|
|
|
|
put it to a function here, so we can add user options later without touching simulation code
|
|
|
|
*/
|
2005-01-12 22:28:13 +00:00
|
|
|
{
|
2005-04-12 21:36:21 +00:00
|
|
|
return (0.01f);
|
|
|
|
}
|
|
|
|
|
|
|
|
static float sb_time_scale(Object *ob)
|
2005-11-19 21:35:06 +00:00
|
|
|
/* defining the frames to *real* time relation */
|
2005-04-12 21:36:21 +00:00
|
|
|
{
|
2005-11-19 21:35:06 +00:00
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there */
|
2005-04-12 21:36:21 +00:00
|
|
|
if (sb){
|
2005-11-19 21:35:06 +00:00
|
|
|
return(sb->physics_speed);
|
|
|
|
/*hrms .. this could be IPO as well :)
|
|
|
|
estimated range [0.001 sluggish slug - 100.0 very fast (i hope ODE solver can handle that)]
|
|
|
|
1 approx = a unit 1 pendulum at g = 9.8 [earth conditions] has period 65 frames
|
|
|
|
theory would give a 50 frames period .. so there must be something inaccurate .. looking for that (BM)
|
|
|
|
*/
|
2005-04-12 21:36:21 +00:00
|
|
|
}
|
|
|
|
return (1.0f);
|
2005-04-20 16:55:04 +00:00
|
|
|
/*
|
|
|
|
this would be frames/sec independant timing assuming 25 fps is default
|
|
|
|
but does not work very well with NLA
|
|
|
|
return (25.0f/G.scene->r.frs_sec)
|
|
|
|
*/
|
2005-01-12 22:28:13 +00:00
|
|
|
}
|
2005-04-12 21:36:21 +00:00
|
|
|
/*--- frame based timing ---*/
|
2005-01-12 22:28:13 +00:00
|
|
|
|
2006-01-31 22:48:41 +00:00
|
|
|
/*+++ collider caching and dicing +++*/
|
|
|
|
|
2006-02-01 09:46:34 +00:00
|
|
|
/********************
|
2006-10-14 19:03:06 +00:00
|
|
|
for each target object/face the axis aligned bounding box (AABB) is stored
|
2006-01-31 22:48:41 +00:00
|
|
|
faces paralell to global axes
|
|
|
|
so only simple "value" in [min,max] ckecks are used
|
|
|
|
float operations still
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* just an ID here to reduce the prob for killing objects
|
|
|
|
** ob->sumohandle points to we should not kill :)
|
|
|
|
*/
|
|
|
|
const int CCD_SAVETY = 190561;
|
|
|
|
|
|
|
|
typedef struct ccdf_minmax{
|
|
|
|
float minx,miny,minz,maxx,maxy,maxz;
|
|
|
|
}ccdf_minmax;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct ccd_Mesh {
|
|
|
|
int totvert, totface;
|
|
|
|
MVert *mvert;
|
2006-11-10 23:09:16 +00:00
|
|
|
MVert *mprevvert;
|
2006-01-31 22:48:41 +00:00
|
|
|
MFace *mface;
|
|
|
|
int savety;
|
|
|
|
ccdf_minmax *mima;
|
2006-10-10 21:49:02 +00:00
|
|
|
/* Axis Aligned Bounding Box AABB */
|
2006-01-31 22:48:41 +00:00
|
|
|
float bbmin[3];
|
|
|
|
float bbmax[3];
|
|
|
|
}ccd_Mesh;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm)
|
2006-11-10 23:09:16 +00:00
|
|
|
{
|
2006-01-31 22:48:41 +00:00
|
|
|
ccd_Mesh *pccd_M = NULL;
|
|
|
|
ccdf_minmax *mima =NULL;
|
|
|
|
MFace *mface=NULL;
|
|
|
|
float v[3],hull;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
/* first some paranoia checks */
|
2006-11-10 23:09:16 +00:00
|
|
|
if (!dm) return NULL;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if (!dm->getNumVerts(dm) || !dm->getNumFaces(dm)) return NULL;
|
2006-01-31 22:48:41 +00:00
|
|
|
|
|
|
|
pccd_M = MEM_mallocN(sizeof(ccd_Mesh),"ccd_Mesh");
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
pccd_M->totvert = dm->getNumVerts(dm);
|
2006-11-20 09:19:14 +00:00
|
|
|
pccd_M->totface = dm->getNumFaces(dm);
|
2006-01-31 22:48:41 +00:00
|
|
|
pccd_M->savety = CCD_SAVETY;
|
|
|
|
pccd_M->bbmin[0]=pccd_M->bbmin[1]=pccd_M->bbmin[2]=1e30f;
|
|
|
|
pccd_M->bbmax[0]=pccd_M->bbmax[1]=pccd_M->bbmax[2]=-1e30f;
|
2006-11-10 23:09:16 +00:00
|
|
|
pccd_M->mprevvert=NULL;
|
2006-01-31 22:48:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* blow it up with forcefield ranges */
|
|
|
|
hull = MAX2(ob->pd->pdef_sbift,ob->pd->pdef_sboft);
|
|
|
|
|
|
|
|
/* alloc and copy verts*/
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
pccd_M->mvert = dm->dupVertArray(dm);
|
2006-01-31 22:48:41 +00:00
|
|
|
/* ah yeah, put the verices to global coords once */
|
|
|
|
/* and determine the ortho BB on the fly */
|
2006-11-10 23:09:16 +00:00
|
|
|
for(i=0; i < pccd_M->totvert; i++){
|
|
|
|
Mat4MulVecfl(ob->obmat, pccd_M->mvert[i].co);
|
2006-01-31 22:48:41 +00:00
|
|
|
|
|
|
|
/* evaluate limits */
|
|
|
|
VECCOPY(v,pccd_M->mvert[i].co);
|
|
|
|
pccd_M->bbmin[0] = MIN2(pccd_M->bbmin[0],v[0]-hull);
|
|
|
|
pccd_M->bbmin[1] = MIN2(pccd_M->bbmin[1],v[1]-hull);
|
|
|
|
pccd_M->bbmin[2] = MIN2(pccd_M->bbmin[2],v[2]-hull);
|
|
|
|
|
|
|
|
pccd_M->bbmax[0] = MAX2(pccd_M->bbmax[0],v[0]+hull);
|
|
|
|
pccd_M->bbmax[1] = MAX2(pccd_M->bbmax[1],v[1]+hull);
|
|
|
|
pccd_M->bbmax[2] = MAX2(pccd_M->bbmax[2],v[2]+hull);
|
|
|
|
|
|
|
|
}
|
|
|
|
/* alloc and copy faces*/
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
pccd_M->mface = dm->dupFaceArray(dm);
|
2006-01-31 22:48:41 +00:00
|
|
|
|
|
|
|
/* OBBs for idea1 */
|
|
|
|
pccd_M->mima = MEM_mallocN(sizeof(ccdf_minmax)*pccd_M->totface,"ccd_Mesh_Faces_mima");
|
|
|
|
mima = pccd_M->mima;
|
|
|
|
mface = pccd_M->mface;
|
|
|
|
|
|
|
|
|
|
|
|
/* anyhoo we need to walk the list of faces and find OBB they live in */
|
|
|
|
for(i=0; i < pccd_M->totface; i++){
|
|
|
|
mima->minx=mima->miny=mima->minz=1e30f;
|
|
|
|
mima->maxx=mima->maxy=mima->maxz=-1e30f;
|
|
|
|
|
|
|
|
VECCOPY(v,pccd_M->mvert[mface->v1].co);
|
|
|
|
mima->minx = MIN2(mima->minx,v[0]-hull);
|
|
|
|
mima->miny = MIN2(mima->miny,v[1]-hull);
|
|
|
|
mima->minz = MIN2(mima->minz,v[2]-hull);
|
|
|
|
mima->maxx = MAX2(mima->maxx,v[0]+hull);
|
|
|
|
mima->maxy = MAX2(mima->maxy,v[1]+hull);
|
|
|
|
mima->maxz = MAX2(mima->maxz,v[2]+hull);
|
|
|
|
|
|
|
|
VECCOPY(v,pccd_M->mvert[mface->v2].co);
|
|
|
|
mima->minx = MIN2(mima->minx,v[0]-hull);
|
|
|
|
mima->miny = MIN2(mima->miny,v[1]-hull);
|
|
|
|
mima->minz = MIN2(mima->minz,v[2]-hull);
|
|
|
|
mima->maxx = MAX2(mima->maxx,v[0]+hull);
|
|
|
|
mima->maxy = MAX2(mima->maxy,v[1]+hull);
|
|
|
|
mima->maxz = MAX2(mima->maxz,v[2]+hull);
|
|
|
|
|
|
|
|
VECCOPY(v,pccd_M->mvert[mface->v3].co);
|
|
|
|
mima->minx = MIN2(mima->minx,v[0]-hull);
|
|
|
|
mima->miny = MIN2(mima->miny,v[1]-hull);
|
|
|
|
mima->minz = MIN2(mima->minz,v[2]-hull);
|
|
|
|
mima->maxx = MAX2(mima->maxx,v[0]+hull);
|
|
|
|
mima->maxy = MAX2(mima->maxy,v[1]+hull);
|
|
|
|
mima->maxz = MAX2(mima->maxz,v[2]+hull);
|
|
|
|
|
|
|
|
if(mface->v4){
|
|
|
|
VECCOPY(v,pccd_M->mvert[mface->v4].co);
|
|
|
|
mima->minx = MIN2(mima->minx,v[0]-hull);
|
|
|
|
mima->miny = MIN2(mima->miny,v[1]-hull);
|
|
|
|
mima->minz = MIN2(mima->minz,v[2]-hull);
|
|
|
|
mima->maxx = MAX2(mima->maxx,v[0]+hull);
|
|
|
|
mima->maxy = MAX2(mima->maxy,v[1]+hull);
|
|
|
|
mima->maxz = MAX2(mima->maxz,v[2]+hull);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
mima++;
|
|
|
|
mface++;
|
|
|
|
|
|
|
|
}
|
|
|
|
return pccd_M;
|
|
|
|
}
|
2008-09-29 17:08:11 +00:00
|
|
|
static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm)
|
2006-01-31 22:48:41 +00:00
|
|
|
{
|
2006-11-10 23:09:16 +00:00
|
|
|
ccdf_minmax *mima =NULL;
|
2006-01-31 22:48:41 +00:00
|
|
|
MFace *mface=NULL;
|
|
|
|
float v[3],hull;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
/* first some paranoia checks */
|
2006-11-10 23:09:16 +00:00
|
|
|
if (!dm) return ;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if (!dm->getNumVerts(dm) || !dm->getNumFaces(dm)) return ;
|
2006-11-10 23:09:16 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if ((pccd_M->totvert != dm->getNumVerts(dm)) ||
|
|
|
|
(pccd_M->totface != dm->getNumFaces(dm))) return;
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2006-01-31 22:48:41 +00:00
|
|
|
pccd_M->bbmin[0]=pccd_M->bbmin[1]=pccd_M->bbmin[2]=1e30f;
|
|
|
|
pccd_M->bbmax[0]=pccd_M->bbmax[1]=pccd_M->bbmax[2]=-1e30f;
|
|
|
|
|
|
|
|
|
|
|
|
/* blow it up with forcefield ranges */
|
|
|
|
hull = MAX2(ob->pd->pdef_sbift,ob->pd->pdef_sboft);
|
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
/* rotate current to previous */
|
|
|
|
if(pccd_M->mprevvert) MEM_freeN(pccd_M->mprevvert);
|
|
|
|
pccd_M->mprevvert = pccd_M->mvert;
|
2006-01-31 22:48:41 +00:00
|
|
|
/* alloc and copy verts*/
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
pccd_M->mvert = dm->dupVertArray(dm);
|
2006-01-31 22:48:41 +00:00
|
|
|
/* ah yeah, put the verices to global coords once */
|
|
|
|
/* and determine the ortho BB on the fly */
|
|
|
|
for(i=0; i < pccd_M->totvert; i++){
|
|
|
|
Mat4MulVecfl(ob->obmat, pccd_M->mvert[i].co);
|
|
|
|
|
|
|
|
/* evaluate limits */
|
|
|
|
VECCOPY(v,pccd_M->mvert[i].co);
|
|
|
|
pccd_M->bbmin[0] = MIN2(pccd_M->bbmin[0],v[0]-hull);
|
|
|
|
pccd_M->bbmin[1] = MIN2(pccd_M->bbmin[1],v[1]-hull);
|
|
|
|
pccd_M->bbmin[2] = MIN2(pccd_M->bbmin[2],v[2]-hull);
|
|
|
|
|
|
|
|
pccd_M->bbmax[0] = MAX2(pccd_M->bbmax[0],v[0]+hull);
|
|
|
|
pccd_M->bbmax[1] = MAX2(pccd_M->bbmax[1],v[1]+hull);
|
|
|
|
pccd_M->bbmax[2] = MAX2(pccd_M->bbmax[2],v[2]+hull);
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
/* evaluate limits */
|
|
|
|
VECCOPY(v,pccd_M->mprevvert[i].co);
|
|
|
|
pccd_M->bbmin[0] = MIN2(pccd_M->bbmin[0],v[0]-hull);
|
|
|
|
pccd_M->bbmin[1] = MIN2(pccd_M->bbmin[1],v[1]-hull);
|
|
|
|
pccd_M->bbmin[2] = MIN2(pccd_M->bbmin[2],v[2]-hull);
|
|
|
|
|
|
|
|
pccd_M->bbmax[0] = MAX2(pccd_M->bbmax[0],v[0]+hull);
|
|
|
|
pccd_M->bbmax[1] = MAX2(pccd_M->bbmax[1],v[1]+hull);
|
|
|
|
pccd_M->bbmax[2] = MAX2(pccd_M->bbmax[2],v[2]+hull);
|
2006-01-31 22:48:41 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
mima = pccd_M->mima;
|
|
|
|
mface = pccd_M->mface;
|
|
|
|
|
|
|
|
|
|
|
|
/* anyhoo we need to walk the list of faces and find OBB they live in */
|
|
|
|
for(i=0; i < pccd_M->totface; i++){
|
|
|
|
mima->minx=mima->miny=mima->minz=1e30f;
|
|
|
|
mima->maxx=mima->maxy=mima->maxz=-1e30f;
|
|
|
|
|
|
|
|
VECCOPY(v,pccd_M->mvert[mface->v1].co);
|
|
|
|
mima->minx = MIN2(mima->minx,v[0]-hull);
|
|
|
|
mima->miny = MIN2(mima->miny,v[1]-hull);
|
|
|
|
mima->minz = MIN2(mima->minz,v[2]-hull);
|
|
|
|
mima->maxx = MAX2(mima->maxx,v[0]+hull);
|
|
|
|
mima->maxy = MAX2(mima->maxy,v[1]+hull);
|
|
|
|
mima->maxz = MAX2(mima->maxz,v[2]+hull);
|
|
|
|
|
|
|
|
VECCOPY(v,pccd_M->mvert[mface->v2].co);
|
|
|
|
mima->minx = MIN2(mima->minx,v[0]-hull);
|
|
|
|
mima->miny = MIN2(mima->miny,v[1]-hull);
|
|
|
|
mima->minz = MIN2(mima->minz,v[2]-hull);
|
|
|
|
mima->maxx = MAX2(mima->maxx,v[0]+hull);
|
|
|
|
mima->maxy = MAX2(mima->maxy,v[1]+hull);
|
|
|
|
mima->maxz = MAX2(mima->maxz,v[2]+hull);
|
|
|
|
|
|
|
|
VECCOPY(v,pccd_M->mvert[mface->v3].co);
|
|
|
|
mima->minx = MIN2(mima->minx,v[0]-hull);
|
|
|
|
mima->miny = MIN2(mima->miny,v[1]-hull);
|
|
|
|
mima->minz = MIN2(mima->minz,v[2]-hull);
|
|
|
|
mima->maxx = MAX2(mima->maxx,v[0]+hull);
|
|
|
|
mima->maxy = MAX2(mima->maxy,v[1]+hull);
|
|
|
|
mima->maxz = MAX2(mima->maxz,v[2]+hull);
|
|
|
|
|
|
|
|
if(mface->v4){
|
|
|
|
VECCOPY(v,pccd_M->mvert[mface->v4].co);
|
|
|
|
mima->minx = MIN2(mima->minx,v[0]-hull);
|
|
|
|
mima->miny = MIN2(mima->miny,v[1]-hull);
|
|
|
|
mima->minz = MIN2(mima->minz,v[2]-hull);
|
|
|
|
mima->maxx = MAX2(mima->maxx,v[0]+hull);
|
|
|
|
mima->maxy = MAX2(mima->maxy,v[1]+hull);
|
|
|
|
mima->maxz = MAX2(mima->maxz,v[2]+hull);
|
|
|
|
}
|
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
VECCOPY(v,pccd_M->mprevvert[mface->v1].co);
|
|
|
|
mima->minx = MIN2(mima->minx,v[0]-hull);
|
|
|
|
mima->miny = MIN2(mima->miny,v[1]-hull);
|
|
|
|
mima->minz = MIN2(mima->minz,v[2]-hull);
|
|
|
|
mima->maxx = MAX2(mima->maxx,v[0]+hull);
|
|
|
|
mima->maxy = MAX2(mima->maxy,v[1]+hull);
|
|
|
|
mima->maxz = MAX2(mima->maxz,v[2]+hull);
|
|
|
|
|
|
|
|
VECCOPY(v,pccd_M->mprevvert[mface->v2].co);
|
|
|
|
mima->minx = MIN2(mima->minx,v[0]-hull);
|
|
|
|
mima->miny = MIN2(mima->miny,v[1]-hull);
|
|
|
|
mima->minz = MIN2(mima->minz,v[2]-hull);
|
|
|
|
mima->maxx = MAX2(mima->maxx,v[0]+hull);
|
|
|
|
mima->maxy = MAX2(mima->maxy,v[1]+hull);
|
|
|
|
mima->maxz = MAX2(mima->maxz,v[2]+hull);
|
|
|
|
|
|
|
|
VECCOPY(v,pccd_M->mprevvert[mface->v3].co);
|
|
|
|
mima->minx = MIN2(mima->minx,v[0]-hull);
|
|
|
|
mima->miny = MIN2(mima->miny,v[1]-hull);
|
|
|
|
mima->minz = MIN2(mima->minz,v[2]-hull);
|
|
|
|
mima->maxx = MAX2(mima->maxx,v[0]+hull);
|
|
|
|
mima->maxy = MAX2(mima->maxy,v[1]+hull);
|
|
|
|
mima->maxz = MAX2(mima->maxz,v[2]+hull);
|
|
|
|
|
|
|
|
if(mface->v4){
|
|
|
|
VECCOPY(v,pccd_M->mprevvert[mface->v4].co);
|
|
|
|
mima->minx = MIN2(mima->minx,v[0]-hull);
|
|
|
|
mima->miny = MIN2(mima->miny,v[1]-hull);
|
|
|
|
mima->minz = MIN2(mima->minz,v[2]-hull);
|
|
|
|
mima->maxx = MAX2(mima->maxx,v[0]+hull);
|
|
|
|
mima->maxy = MAX2(mima->maxy,v[1]+hull);
|
|
|
|
mima->maxz = MAX2(mima->maxz,v[2]+hull);
|
|
|
|
}
|
|
|
|
|
2006-01-31 22:48:41 +00:00
|
|
|
|
|
|
|
mima++;
|
|
|
|
mface++;
|
|
|
|
|
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
return ;
|
2006-01-31 22:48:41 +00:00
|
|
|
}
|
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static void ccd_mesh_free(ccd_Mesh *ccdm)
|
2006-01-31 22:48:41 +00:00
|
|
|
{
|
|
|
|
if(ccdm && (ccdm->savety == CCD_SAVETY )){ /*make sure we're not nuking objects we don't know*/
|
|
|
|
MEM_freeN(ccdm->mface);
|
|
|
|
MEM_freeN(ccdm->mvert);
|
2006-11-10 23:09:16 +00:00
|
|
|
if (ccdm->mprevvert) MEM_freeN(ccdm->mprevvert);
|
2006-01-31 22:48:41 +00:00
|
|
|
MEM_freeN(ccdm->mima);
|
|
|
|
MEM_freeN(ccdm);
|
|
|
|
ccdm = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static void ccd_build_deflector_hache(Object *vertexowner,GHash *hash)
|
2006-01-31 22:48:41 +00:00
|
|
|
{
|
|
|
|
Base *base;
|
2006-11-10 23:09:16 +00:00
|
|
|
Object *ob;
|
|
|
|
base= G.scene->base.first;
|
|
|
|
base= G.scene->base.first;
|
|
|
|
if (!hash) return;
|
|
|
|
while (base) {
|
|
|
|
/*Only proceed for mesh object in same layer */
|
|
|
|
if(base->object->type==OB_MESH && (base->lay & vertexowner->lay)) {
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
int particles=0;
|
2006-11-10 23:09:16 +00:00
|
|
|
ob= base->object;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
if((vertexowner) && (ob == vertexowner)) {
|
|
|
|
if(vertexowner->soft->particles){
|
|
|
|
particles=1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* if vertexowner is given we don't want to check collision with owner object */
|
|
|
|
base = base->next;
|
|
|
|
continue;
|
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*+++ only with deflecting set */
|
|
|
|
if(ob->pd && ob->pd->deflect && BLI_ghash_lookup(hash, ob) == 0) {
|
|
|
|
DerivedMesh *dm= NULL;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
|
|
|
if(particles) {
|
|
|
|
dm = psys_get_modifier(ob,psys_get_current(ob))->dm;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if(ob->softflag & OB_SB_COLLFINAL) /* so maybe someone wants overkill to collide with subsurfed */
|
|
|
|
dm = mesh_get_derived_final(ob, CD_MASK_BAREMESH);
|
|
|
|
else
|
|
|
|
dm = mesh_get_derived_deform(ob, CD_MASK_BAREMESH);
|
2006-11-10 23:09:16 +00:00
|
|
|
}
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
if(dm){
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
ccd_Mesh *ccdmesh = ccd_mesh_make(ob, dm);
|
|
|
|
BLI_ghash_insert(hash, ob, ccdmesh);
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
/* we did copy & modify all we need so give 'em away again */
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
dm->release(dm);
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
}/*--- only with deflecting set */
|
|
|
|
|
|
|
|
}/* mesh && layer*/
|
|
|
|
base = base->next;
|
|
|
|
} /* while (base) */
|
2006-01-31 22:48:41 +00:00
|
|
|
}
|
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static void ccd_update_deflector_hache(Object *vertexowner,GHash *hash)
|
2006-01-31 22:48:41 +00:00
|
|
|
{
|
|
|
|
Base *base;
|
|
|
|
Object *ob;
|
|
|
|
base= G.scene->base.first;
|
|
|
|
base= G.scene->base.first;
|
2006-12-02 18:42:20 +00:00
|
|
|
if ((!hash) || (!vertexowner)) return;
|
2006-01-31 22:48:41 +00:00
|
|
|
while (base) {
|
|
|
|
/*Only proceed for mesh object in same layer */
|
|
|
|
if(base->object->type==OB_MESH && (base->lay & vertexowner->lay)) {
|
|
|
|
ob= base->object;
|
2006-12-02 18:42:20 +00:00
|
|
|
if(ob == vertexowner){
|
2006-01-31 22:48:41 +00:00
|
|
|
/* if vertexowner is given we don't want to check collision with owner object */
|
|
|
|
base = base->next;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*+++ only with deflecting set */
|
|
|
|
if(ob->pd && ob->pd->deflect) {
|
|
|
|
DerivedMesh *dm= NULL;
|
|
|
|
|
2006-10-19 22:01:06 +00:00
|
|
|
if(ob->softflag & OB_SB_COLLFINAL) { /* so maybe someone wants overkill to collide with subsurfed */
|
2006-12-05 17:42:03 +00:00
|
|
|
dm = mesh_get_derived_final(ob, CD_MASK_BAREMESH);
|
2006-10-19 22:01:06 +00:00
|
|
|
} else {
|
2006-12-05 17:42:03 +00:00
|
|
|
dm = mesh_get_derived_deform(ob, CD_MASK_BAREMESH);
|
2006-01-31 22:48:41 +00:00
|
|
|
}
|
|
|
|
if(dm){
|
2006-11-10 23:09:16 +00:00
|
|
|
ccd_Mesh *ccdmesh = BLI_ghash_lookup(hash,ob);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if (ccdmesh)
|
|
|
|
ccd_mesh_update(ob,ccdmesh,dm);
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2006-01-31 22:48:41 +00:00
|
|
|
/* we did copy & modify all we need so give 'em away again */
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
dm->release(dm);
|
2006-01-31 22:48:41 +00:00
|
|
|
}
|
|
|
|
}/*--- only with deflecting set */
|
|
|
|
|
|
|
|
}/* mesh && layer*/
|
|
|
|
base = base->next;
|
|
|
|
} /* while (base) */
|
|
|
|
}
|
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2006-01-31 22:48:41 +00:00
|
|
|
/*--- collider caching and dicing ---*/
|
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
static int count_mesh_quads(Mesh *me)
|
2005-01-12 22:28:13 +00:00
|
|
|
{
|
|
|
|
int a,result = 0;
|
|
|
|
MFace *mface= me->mface;
|
2005-04-02 13:57:23 +00:00
|
|
|
|
|
|
|
if(mface) {
|
|
|
|
for(a=me->totface; a>0; a--, mface++) {
|
|
|
|
if(mface->v4) result++;
|
|
|
|
}
|
2005-01-12 22:28:13 +00:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
static void add_mesh_quad_diag_springs(Object *ob)
|
2005-01-12 22:28:13 +00:00
|
|
|
{
|
|
|
|
Mesh *me= ob->data;
|
|
|
|
MFace *mface= me->mface;
|
|
|
|
BodyPoint *bp;
|
|
|
|
BodySpring *bs, *bs_new;
|
|
|
|
int a ;
|
|
|
|
|
|
|
|
if (ob->soft){
|
2005-04-02 13:57:23 +00:00
|
|
|
int nofquads;
|
2008-01-09 00:25:51 +00:00
|
|
|
float s_shear = ob->soft->shearstiff*ob->soft->shearstiff;
|
2005-04-02 13:57:23 +00:00
|
|
|
|
|
|
|
nofquads = count_mesh_quads(me);
|
2005-01-12 22:28:13 +00:00
|
|
|
if (nofquads) {
|
|
|
|
/* resize spring-array to hold additional quad springs */
|
|
|
|
bs_new= MEM_callocN( (ob->soft->totspring + nofquads *2 )*sizeof(BodySpring), "bodyspring");
|
|
|
|
memcpy(bs_new,ob->soft->bspring,(ob->soft->totspring )*sizeof(BodySpring));
|
2005-04-02 19:52:32 +00:00
|
|
|
|
|
|
|
if(ob->soft->bspring)
|
|
|
|
MEM_freeN(ob->soft->bspring); /* do this before reassigning the pointer or have a 1st class memory leak */
|
2005-04-02 13:57:23 +00:00
|
|
|
ob->soft->bspring = bs_new;
|
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
/* fill the tail */
|
|
|
|
a = 0;
|
|
|
|
bs = bs_new+ob->soft->totspring;
|
|
|
|
bp= ob->soft->bpoint;
|
|
|
|
if(mface ) {
|
|
|
|
for(a=me->totface; a>0; a--, mface++) {
|
2005-04-02 13:57:23 +00:00
|
|
|
if(mface->v4) {
|
2005-01-12 22:28:13 +00:00
|
|
|
bs->v1= mface->v1;
|
|
|
|
bs->v2= mface->v3;
|
2008-01-09 00:25:51 +00:00
|
|
|
bs->strength= s_shear;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order =2;
|
2005-01-12 22:28:13 +00:00
|
|
|
bs++;
|
|
|
|
bs->v1= mface->v2;
|
|
|
|
bs->v2= mface->v4;
|
2008-01-09 00:25:51 +00:00
|
|
|
bs->strength= s_shear;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order =2;
|
2005-01-12 22:28:13 +00:00
|
|
|
bs++;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* now we can announce new springs */
|
|
|
|
ob->soft->totspring += nofquads *2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-09-26 12:53:57 +00:00
|
|
|
static void add_2nd_order_roller(Object *ob,float stiffness,int *counter, int addsprings)
|
|
|
|
{
|
|
|
|
/*assume we have a softbody*/
|
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there */
|
|
|
|
BodyPoint *bp,*bpo;
|
2006-10-26 23:34:44 +00:00
|
|
|
BodySpring *bs,*bs2,*bs3= NULL;
|
|
|
|
int a,b,c,notthis= 0,v0;
|
2006-09-26 12:53:57 +00:00
|
|
|
if (!sb->bspring){return;} /* we are 2nd order here so 1rst should have been build :) */
|
|
|
|
/* first run counting second run adding */
|
|
|
|
*counter = 0;
|
|
|
|
if (addsprings) bs3 = ob->soft->bspring+ob->soft->totspring;
|
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
|
|
|
/*scan for neighborhood*/
|
|
|
|
bpo = NULL;
|
|
|
|
v0 = (sb->totpoint-a);
|
|
|
|
for(b=bp->nofsprings;b>0;b--){
|
|
|
|
bs = sb->bspring + bp->springs[b-1];
|
|
|
|
/*nasty thing here that springs have two ends
|
|
|
|
so here we have to make sure we examine the other */
|
|
|
|
if (( v0 == bs->v1) ){
|
|
|
|
bpo =sb->bpoint+bs->v2;
|
|
|
|
notthis = bs->v2;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if (( v0 == bs->v2) ){
|
|
|
|
bpo =sb->bpoint+bs->v1;
|
|
|
|
notthis = bs->v1;
|
|
|
|
}
|
|
|
|
else {printf("oops we should not get here - add_2nd_order_springs");}
|
|
|
|
}
|
|
|
|
if (bpo){/* so now we have a 2nd order humpdidump */
|
|
|
|
for(c=bpo->nofsprings;c>0;c--){
|
|
|
|
bs2 = sb->bspring + bpo->springs[c-1];
|
|
|
|
if ((bs2->v1 != notthis) && (bs2->v1 > v0)){
|
|
|
|
(*counter)++;/*hit */
|
|
|
|
if (addsprings){
|
|
|
|
bs3->v1= v0;
|
|
|
|
bs3->v2= bs2->v1;
|
|
|
|
bs3->strength= stiffness;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs3->order=2;
|
2006-09-26 12:53:57 +00:00
|
|
|
bs3++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ((bs2->v2 !=notthis)&&(bs2->v2 > v0)){
|
|
|
|
(*counter)++;/*hit */
|
|
|
|
if (addsprings){
|
|
|
|
bs3->v1= v0;
|
|
|
|
bs3->v2= bs2->v2;
|
|
|
|
bs3->strength= stiffness;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs3->order=2;
|
2006-09-26 12:53:57 +00:00
|
|
|
bs3++;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
/*scan for neighborhood done*/
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void add_2nd_order_springs(Object *ob,float stiffness)
|
|
|
|
{
|
|
|
|
int counter = 0;
|
|
|
|
BodySpring *bs_new;
|
2008-01-09 00:25:51 +00:00
|
|
|
stiffness *=stiffness;
|
2006-09-26 12:53:57 +00:00
|
|
|
|
2006-10-14 19:03:06 +00:00
|
|
|
add_2nd_order_roller(ob,stiffness,&counter,0); /* counting */
|
2006-09-26 12:53:57 +00:00
|
|
|
if (counter) {
|
|
|
|
/* resize spring-array to hold additional springs */
|
|
|
|
bs_new= MEM_callocN( (ob->soft->totspring + counter )*sizeof(BodySpring), "bodyspring");
|
|
|
|
memcpy(bs_new,ob->soft->bspring,(ob->soft->totspring )*sizeof(BodySpring));
|
|
|
|
|
|
|
|
if(ob->soft->bspring)
|
|
|
|
MEM_freeN(ob->soft->bspring);
|
|
|
|
ob->soft->bspring = bs_new;
|
|
|
|
|
2006-10-14 19:03:06 +00:00
|
|
|
add_2nd_order_roller(ob,stiffness,&counter,1); /* adding */
|
2006-09-26 12:53:57 +00:00
|
|
|
ob->soft->totspring +=counter ;
|
|
|
|
}
|
|
|
|
}
|
2005-01-12 22:28:13 +00:00
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
static void add_bp_springlist(BodyPoint *bp,int springID)
|
2005-01-12 22:28:13 +00:00
|
|
|
{
|
|
|
|
int *newlist;
|
2005-04-02 13:57:23 +00:00
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
if (bp->springs == NULL) {
|
|
|
|
bp->springs = MEM_callocN( sizeof(int), "bpsprings");
|
|
|
|
bp->springs[0] = springID;
|
|
|
|
bp->nofsprings = 1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
bp->nofsprings++;
|
|
|
|
newlist = MEM_callocN(bp->nofsprings * sizeof(int), "bpsprings");
|
|
|
|
memcpy(newlist,bp->springs,(bp->nofsprings-1)* sizeof(int));
|
|
|
|
MEM_freeN(bp->springs);
|
|
|
|
bp->springs = newlist;
|
|
|
|
bp->springs[bp->nofsprings-1] = springID;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* do this once when sb is build
|
|
|
|
it is O(N^2) so scanning for springs every iteration is too expensive
|
|
|
|
*/
|
2005-04-02 13:57:23 +00:00
|
|
|
static void build_bps_springlist(Object *ob)
|
2005-01-12 22:28:13 +00:00
|
|
|
{
|
2005-11-19 21:35:06 +00:00
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there */
|
2005-01-12 22:28:13 +00:00
|
|
|
BodyPoint *bp;
|
|
|
|
BodySpring *bs;
|
|
|
|
int a,b;
|
2005-04-02 13:57:23 +00:00
|
|
|
|
2005-11-19 21:35:06 +00:00
|
|
|
if (sb==NULL) return; /* paranoya check */
|
2005-04-02 13:57:23 +00:00
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
2006-09-27 06:59:27 +00:00
|
|
|
/* throw away old list */
|
|
|
|
if (bp->springs) {
|
|
|
|
MEM_freeN(bp->springs);
|
|
|
|
bp->springs=NULL;
|
|
|
|
}
|
2005-01-12 22:28:13 +00:00
|
|
|
/* scan for attached inner springs */
|
|
|
|
for(b=sb->totspring, bs= sb->bspring; b>0; b--, bs++) {
|
|
|
|
if (( (sb->totpoint-a) == bs->v1) ){
|
|
|
|
add_bp_springlist(bp,sb->totspring -b);
|
|
|
|
}
|
|
|
|
if (( (sb->totpoint-a) == bs->v2) ){
|
|
|
|
add_bp_springlist(bp,sb->totspring -b);
|
|
|
|
}
|
2005-11-19 21:35:06 +00:00
|
|
|
}/*for springs*/
|
|
|
|
}/*for bp*/
|
2005-01-12 22:28:13 +00:00
|
|
|
}
|
|
|
|
|
2006-09-28 20:27:46 +00:00
|
|
|
static void calculate_collision_balls(Object *ob)
|
|
|
|
{
|
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there */
|
|
|
|
BodyPoint *bp;
|
|
|
|
BodySpring *bs;
|
2006-10-04 21:36:55 +00:00
|
|
|
int a,b,akku_count;
|
|
|
|
float min,max,akku;
|
2006-10-01 21:49:10 +00:00
|
|
|
|
2006-09-28 20:27:46 +00:00
|
|
|
if (sb==NULL) return; /* paranoya check */
|
2006-10-01 21:49:10 +00:00
|
|
|
|
2006-09-28 20:27:46 +00:00
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
|
|
|
bp->colball=0;
|
2006-10-04 21:36:55 +00:00
|
|
|
akku =0.0f;
|
|
|
|
akku_count=0;
|
2006-10-01 21:49:10 +00:00
|
|
|
min = 1e22f;
|
|
|
|
max = -1e22f;
|
|
|
|
/* first estimation based on attached */
|
2006-09-28 20:27:46 +00:00
|
|
|
for(b=bp->nofsprings;b>0;b--){
|
|
|
|
bs = sb->bspring + bp->springs[b-1];
|
2006-10-04 21:36:55 +00:00
|
|
|
if (bs->order == 1){
|
|
|
|
akku += bs->len;
|
|
|
|
akku_count++,
|
2006-10-01 21:49:10 +00:00
|
|
|
min = MIN2(bs->len,min);
|
|
|
|
max = MAX2(bs->len,max);
|
2006-10-04 21:36:55 +00:00
|
|
|
}
|
2006-10-01 21:49:10 +00:00
|
|
|
}
|
|
|
|
|
2006-10-04 21:36:55 +00:00
|
|
|
if (akku_count > 0) {
|
2007-11-16 12:23:00 +00:00
|
|
|
if (sb->sbc_mode == SBC_MODE_MANUAL){
|
2006-10-01 21:49:10 +00:00
|
|
|
bp->colball=sb->colball;
|
2006-10-10 21:49:02 +00:00
|
|
|
}
|
2007-11-16 12:23:00 +00:00
|
|
|
if (sb->sbc_mode == SBC_MODE_AVG){
|
|
|
|
bp->colball = akku/(float)akku_count*sb->colball;
|
|
|
|
}
|
|
|
|
if (sb->sbc_mode == SBC_MODE_MIN){
|
2006-10-10 21:49:02 +00:00
|
|
|
bp->colball=min*sb->colball;
|
2007-11-16 12:23:00 +00:00
|
|
|
}
|
|
|
|
if (sb->sbc_mode == SBC_MODE_MAX){
|
2006-10-10 21:49:02 +00:00
|
|
|
bp->colball=max*sb->colball;
|
2007-11-16 12:23:00 +00:00
|
|
|
}
|
|
|
|
if (sb->sbc_mode == SBC_MODE_AVGMINMAX){
|
|
|
|
bp->colball = (min + max)/2.0f*sb->colball;
|
|
|
|
}
|
2006-09-28 20:27:46 +00:00
|
|
|
}
|
|
|
|
else bp->colball=0;
|
|
|
|
}/*for bp*/
|
|
|
|
}
|
|
|
|
|
2004-10-01 14:10:30 +00:00
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
/* creates new softbody if didn't exist yet, makes new points and springs arrays */
|
2005-11-19 18:19:41 +00:00
|
|
|
static void renew_softbody(Object *ob, int totpoint, int totspring)
|
2004-10-01 14:10:30 +00:00
|
|
|
{
|
2005-04-02 13:57:23 +00:00
|
|
|
SoftBody *sb;
|
2005-08-15 10:30:53 +00:00
|
|
|
int i;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
short softflag;
|
2005-04-02 13:57:23 +00:00
|
|
|
if(ob->soft==NULL) ob->soft= sbNew();
|
|
|
|
else free_softbody_intern(ob->soft);
|
|
|
|
sb= ob->soft;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
softflag=ob->softflag;
|
2005-04-02 13:57:23 +00:00
|
|
|
|
2004-10-01 14:10:30 +00:00
|
|
|
if(totpoint) {
|
|
|
|
sb->totpoint= totpoint;
|
|
|
|
sb->totspring= totspring;
|
|
|
|
|
|
|
|
sb->bpoint= MEM_mallocN( totpoint*sizeof(BodyPoint), "bodypoint");
|
|
|
|
if(totspring)
|
|
|
|
sb->bspring= MEM_mallocN( totspring*sizeof(BodySpring), "bodyspring");
|
2005-08-15 10:30:53 +00:00
|
|
|
|
|
|
|
/* initialise BodyPoint array */
|
|
|
|
for (i=0; i<totpoint; i++) {
|
|
|
|
BodyPoint *bp = &sb->bpoint[i];
|
|
|
|
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
if(softflag & OB_SB_GOAL) {
|
|
|
|
bp->goal= sb->defgoal;
|
2005-08-15 10:30:53 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
bp->goal= 0.0f;
|
|
|
|
/* so this will definily be below SOFTGOALSNAP */
|
|
|
|
}
|
|
|
|
|
|
|
|
bp->nofsprings= 0;
|
|
|
|
bp->springs= NULL;
|
2006-11-10 23:09:16 +00:00
|
|
|
bp->choke = 0.0f;
|
2008-01-31 23:00:08 +00:00
|
|
|
bp->choke2 = 0.0f;
|
|
|
|
bp->frozen = 1.0f;
|
2006-10-14 19:03:06 +00:00
|
|
|
bp->colball = 0.0f;
|
2006-11-10 23:09:16 +00:00
|
|
|
bp->flag = 0;
|
2006-10-14 19:03:06 +00:00
|
|
|
|
2005-08-15 10:30:53 +00:00
|
|
|
}
|
2004-10-01 14:10:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-05-02 13:28:13 +00:00
|
|
|
static void free_softbody_baked(SoftBody *sb)
|
|
|
|
{
|
|
|
|
SBVertex *key;
|
|
|
|
int k;
|
2005-09-20 10:21:30 +00:00
|
|
|
|
2005-05-02 13:28:13 +00:00
|
|
|
for(k=0; k<sb->totkey; k++) {
|
|
|
|
key= *(sb->keys + k);
|
|
|
|
if(key) MEM_freeN(key);
|
|
|
|
}
|
|
|
|
if(sb->keys) MEM_freeN(sb->keys);
|
|
|
|
|
|
|
|
sb->keys= NULL;
|
|
|
|
sb->totkey= 0;
|
2006-11-10 23:09:16 +00:00
|
|
|
}
|
|
|
|
static void free_scratch(SoftBody *sb)
|
|
|
|
{
|
|
|
|
if(sb->scratch){
|
|
|
|
/* todo make sure everything is cleaned up nicly */
|
|
|
|
if (sb->scratch->colliderhash){
|
2007-03-16 05:03:38 +00:00
|
|
|
BLI_ghash_free(sb->scratch->colliderhash, NULL,
|
|
|
|
(GHashValFreeFP) ccd_mesh_free); /*this hoepfully will free all caches*/
|
2006-11-10 23:09:16 +00:00
|
|
|
sb->scratch->colliderhash = NULL;
|
|
|
|
}
|
|
|
|
if (sb->scratch->bodyface){
|
2007-03-16 05:03:38 +00:00
|
|
|
MEM_freeN(sb->scratch->bodyface);
|
2006-11-10 23:09:16 +00:00
|
|
|
}
|
|
|
|
MEM_freeN(sb->scratch);
|
|
|
|
sb->scratch = NULL;
|
|
|
|
}
|
|
|
|
|
2005-05-02 13:28:13 +00:00
|
|
|
}
|
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
/* only frees internal data */
|
|
|
|
static void free_softbody_intern(SoftBody *sb)
|
2004-10-01 14:10:30 +00:00
|
|
|
{
|
|
|
|
if(sb) {
|
2005-01-12 22:28:13 +00:00
|
|
|
int a;
|
|
|
|
BodyPoint *bp;
|
2005-04-02 13:57:23 +00:00
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
if(sb->bpoint){
|
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
|
|
|
/* free spring list */
|
|
|
|
if (bp->springs != NULL) {
|
|
|
|
MEM_freeN(bp->springs);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
MEM_freeN(sb->bpoint);
|
|
|
|
}
|
2005-04-02 13:57:23 +00:00
|
|
|
|
2004-10-01 14:10:30 +00:00
|
|
|
if(sb->bspring) MEM_freeN(sb->bspring);
|
2005-04-02 13:57:23 +00:00
|
|
|
|
|
|
|
sb->totpoint= sb->totspring= 0;
|
|
|
|
sb->bpoint= NULL;
|
|
|
|
sb->bspring= NULL;
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
free_scratch(sb);
|
2005-05-02 13:28:13 +00:00
|
|
|
free_softbody_baked(sb);
|
2004-10-01 14:10:30 +00:00
|
|
|
}
|
|
|
|
}
|
2005-04-02 13:57:23 +00:00
|
|
|
|
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
/* ************ dynamics ********** */
|
2006-01-31 22:48:41 +00:00
|
|
|
|
|
|
|
/* the most general (micro physics correct) way to do collision
|
|
|
|
** (only needs the current particle position)
|
|
|
|
**
|
|
|
|
** it actually checks if the particle intrudes a short range force field generated
|
|
|
|
** by the faces of the target object and returns a force to drive the particel out
|
|
|
|
** the strenght of the field grows exponetially if the particle is on the 'wrong' side of the face
|
|
|
|
** 'wrong' side : projection to the face normal is negative (all referred to a vertex in the face)
|
|
|
|
**
|
|
|
|
** flaw of this: 'fast' particles as well as 'fast' colliding faces
|
|
|
|
** give a 'tunnel' effect such that the particle passes through the force field
|
|
|
|
** without ever 'seeing' it
|
|
|
|
** this is fully compliant to heisenberg: h >= fuzzy(location) * fuzzy(time)
|
|
|
|
** besides our h is way larger than in QM because forces propagate way slower here
|
|
|
|
** we have to deal with fuzzy(time) in the range of 1/25 seconds (typical frame rate)
|
|
|
|
** yup collision targets are not known here any better
|
|
|
|
** and 1/25 second is looong compared to real collision events
|
|
|
|
** Q: why not use 'simple' collision here like bouncing back a particle
|
|
|
|
** --> reverting is velocity on the face normal
|
|
|
|
** A: because our particles are not alone here
|
|
|
|
** and need to tell their neighbours exactly what happens via spring forces
|
|
|
|
** unless sbObjectStep( .. ) is called on sub frame timing level
|
|
|
|
** BTW that also questions the use of a 'implicit' solvers on softbodies
|
|
|
|
** since that would only valid for 'slow' moving collision targets and dito particles
|
|
|
|
*/
|
|
|
|
|
2006-10-13 21:27:43 +00:00
|
|
|
/* aye this belongs to arith.c */
|
|
|
|
static void Vec3PlusStVec(float *v, float s, float *v1)
|
|
|
|
{
|
|
|
|
v[0] += s*v1[0];
|
|
|
|
v[1] += s*v1[1];
|
|
|
|
v[2] += s*v1[2];
|
|
|
|
}
|
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
/* +++ dependancy information functions*/
|
2008-02-16 00:07:05 +00:00
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
static int are_there_deflectors(unsigned int layer)
|
2006-10-10 21:49:02 +00:00
|
|
|
{
|
|
|
|
Base *base;
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
for(base = G.scene->base.first; base; base= base->next) {
|
|
|
|
if( (base->lay & layer) && base->object->pd) {
|
|
|
|
if(base->object->pd->deflect)
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int query_external_colliders(Object *me)
|
|
|
|
{
|
|
|
|
return(are_there_deflectors(me->lay));
|
|
|
|
}
|
|
|
|
/* --- dependancy information functions*/
|
|
|
|
|
2008-02-16 00:07:05 +00:00
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
/* +++ the aabb "force" section*/
|
2008-09-29 17:08:11 +00:00
|
|
|
static int sb_detect_aabb_collisionCached( float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
|
2006-11-10 23:09:16 +00:00
|
|
|
{
|
2006-10-10 21:49:02 +00:00
|
|
|
Object *ob;
|
2006-11-10 23:09:16 +00:00
|
|
|
SoftBody *sb=vertexowner->soft;
|
|
|
|
GHash *hash;
|
|
|
|
GHashIterator *ihash;
|
|
|
|
float aabbmin[3],aabbmax[3];
|
2006-10-10 21:49:02 +00:00
|
|
|
int a, deflected=0;
|
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
if ((sb == NULL) || (sb->scratch ==NULL)) return 0;
|
|
|
|
VECCOPY(aabbmin,sb->scratch->aabbmin);
|
|
|
|
VECCOPY(aabbmax,sb->scratch->aabbmax);
|
2006-10-10 21:49:02 +00:00
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
hash = vertexowner->soft->scratch->colliderhash;
|
|
|
|
ihash = BLI_ghashIterator_new(hash);
|
|
|
|
while (!BLI_ghashIterator_isDone(ihash) ) {
|
2006-10-10 21:49:02 +00:00
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
ccd_Mesh *ccdm = BLI_ghashIterator_getValue (ihash);
|
|
|
|
ob = BLI_ghashIterator_getKey (ihash);
|
2006-10-10 21:49:02 +00:00
|
|
|
/* only with deflecting set */
|
|
|
|
if(ob->pd && ob->pd->deflect) {
|
|
|
|
MFace *mface= NULL;
|
|
|
|
MVert *mvert= NULL;
|
2006-11-10 23:09:16 +00:00
|
|
|
MVert *mprevvert= NULL;
|
2006-10-10 21:49:02 +00:00
|
|
|
ccdf_minmax *mima= NULL;
|
2006-11-10 23:09:16 +00:00
|
|
|
if(ccdm){
|
2006-10-10 21:49:02 +00:00
|
|
|
mface= ccdm->mface;
|
|
|
|
mvert= ccdm->mvert;
|
2006-11-10 23:09:16 +00:00
|
|
|
mprevvert= ccdm->mprevvert;
|
2006-10-10 21:49:02 +00:00
|
|
|
mima= ccdm->mima;
|
|
|
|
a = ccdm->totface;
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
if ((aabbmax[0] < ccdm->bbmin[0]) ||
|
|
|
|
(aabbmax[1] < ccdm->bbmin[1]) ||
|
|
|
|
(aabbmax[2] < ccdm->bbmin[2]) ||
|
|
|
|
(aabbmin[0] > ccdm->bbmax[0]) ||
|
|
|
|
(aabbmin[1] > ccdm->bbmax[1]) ||
|
|
|
|
(aabbmin[2] > ccdm->bbmax[2]) ) {
|
|
|
|
/* boxes dont intersect */
|
|
|
|
BLI_ghashIterator_step(ihash);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* so now we have the 2 boxes overlapping */
|
|
|
|
/* forces actually not used */
|
|
|
|
deflected = 2;
|
|
|
|
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
/*aye that should be cached*/
|
|
|
|
printf("missing cache error \n");
|
|
|
|
BLI_ghashIterator_step(ihash);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
} /* if(ob->pd && ob->pd->deflect) */
|
|
|
|
BLI_ghashIterator_step(ihash);
|
|
|
|
} /* while () */
|
|
|
|
BLI_ghashIterator_free(ihash);
|
|
|
|
return deflected;
|
|
|
|
}
|
|
|
|
/* --- the aabb section*/
|
|
|
|
|
|
|
|
|
|
|
|
/* +++ the face external section*/
|
2008-09-29 17:08:11 +00:00
|
|
|
static int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp,
|
2008-01-31 23:00:08 +00:00
|
|
|
float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
|
|
|
|
{
|
|
|
|
Object *ob;
|
|
|
|
GHash *hash;
|
|
|
|
GHashIterator *ihash;
|
|
|
|
float nv1[3], edge1[3], edge2[3], d_nvect[3], aabbmin[3],aabbmax[3];
|
|
|
|
float facedist,outerfacethickness,tune = 10.f;
|
|
|
|
int a, deflected=0;
|
|
|
|
|
|
|
|
aabbmin[0] = MIN3(face_v1[0],face_v2[0],face_v3[0]);
|
|
|
|
aabbmin[1] = MIN3(face_v1[1],face_v2[1],face_v3[1]);
|
|
|
|
aabbmin[2] = MIN3(face_v1[2],face_v2[2],face_v3[2]);
|
|
|
|
aabbmax[0] = MAX3(face_v1[0],face_v2[0],face_v3[0]);
|
|
|
|
aabbmax[1] = MAX3(face_v1[1],face_v2[1],face_v3[1]);
|
|
|
|
aabbmax[2] = MAX3(face_v1[2],face_v2[2],face_v3[2]);
|
|
|
|
|
|
|
|
/* calculate face normal once again SIGH */
|
|
|
|
VECSUB(edge1, face_v1, face_v2);
|
|
|
|
VECSUB(edge2, face_v3, face_v2);
|
|
|
|
Crossf(d_nvect, edge2, edge1);
|
|
|
|
Normalize(d_nvect);
|
|
|
|
|
|
|
|
|
|
|
|
hash = vertexowner->soft->scratch->colliderhash;
|
|
|
|
ihash = BLI_ghashIterator_new(hash);
|
|
|
|
while (!BLI_ghashIterator_isDone(ihash) ) {
|
|
|
|
|
|
|
|
ccd_Mesh *ccdm = BLI_ghashIterator_getValue (ihash);
|
|
|
|
ob = BLI_ghashIterator_getKey (ihash);
|
|
|
|
/* only with deflecting set */
|
|
|
|
if(ob->pd && ob->pd->deflect) {
|
|
|
|
MVert *mvert= NULL;
|
|
|
|
MVert *mprevvert= NULL;
|
|
|
|
if(ccdm){
|
|
|
|
mvert= ccdm->mvert;
|
|
|
|
a = ccdm->totvert;
|
|
|
|
mprevvert= ccdm->mprevvert;
|
|
|
|
outerfacethickness =ob->pd->pdef_sboft;
|
|
|
|
if ((aabbmax[0] < ccdm->bbmin[0]) ||
|
|
|
|
(aabbmax[1] < ccdm->bbmin[1]) ||
|
|
|
|
(aabbmax[2] < ccdm->bbmin[2]) ||
|
|
|
|
(aabbmin[0] > ccdm->bbmax[0]) ||
|
|
|
|
(aabbmin[1] > ccdm->bbmax[1]) ||
|
|
|
|
(aabbmin[2] > ccdm->bbmax[2]) ) {
|
|
|
|
/* boxes dont intersect */
|
|
|
|
BLI_ghashIterator_step(ihash);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
/*aye that should be cached*/
|
|
|
|
printf("missing cache error \n");
|
|
|
|
BLI_ghashIterator_step(ihash);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* use mesh*/
|
|
|
|
if (mvert) {
|
|
|
|
while(a){
|
|
|
|
VECCOPY(nv1,mvert[a-1].co);
|
|
|
|
if(mprevvert){
|
|
|
|
VecMulf(nv1,time);
|
|
|
|
Vec3PlusStVec(nv1,(1.0f-time),mprevvert[a-1].co);
|
|
|
|
}
|
|
|
|
/* origin to face_v2*/
|
|
|
|
VECSUB(nv1, nv1, face_v2);
|
|
|
|
facedist = Inpf(nv1,d_nvect);
|
|
|
|
if (ABS(facedist)<outerfacethickness){
|
|
|
|
if (point_in_tri_prism(nv1, face_v1,face_v2,face_v3) ){
|
|
|
|
float df;
|
|
|
|
if (facedist > 0){
|
|
|
|
df = (outerfacethickness-facedist)/outerfacethickness;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
df = (outerfacethickness+facedist)/outerfacethickness;
|
|
|
|
}
|
|
|
|
|
|
|
|
*damp=df*tune*ob->pd->pdef_sbdamp;
|
|
|
|
|
|
|
|
df = 0.01f*exp(- 100.0f*df);
|
|
|
|
Vec3PlusStVec(force,-df,d_nvect);
|
|
|
|
deflected = 3;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
a--;
|
|
|
|
}/* while(a)*/
|
|
|
|
} /* if (mvert) */
|
|
|
|
} /* if(ob->pd && ob->pd->deflect) */
|
|
|
|
BLI_ghashIterator_step(ihash);
|
|
|
|
} /* while () */
|
|
|
|
BLI_ghashIterator_free(ihash);
|
|
|
|
return deflected;
|
|
|
|
}
|
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp,
|
2006-11-10 23:09:16 +00:00
|
|
|
float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
|
|
|
|
{
|
|
|
|
Object *ob;
|
|
|
|
GHash *hash;
|
|
|
|
GHashIterator *ihash;
|
|
|
|
float nv1[3], nv2[3], nv3[3], nv4[3], edge1[3], edge2[3], d_nvect[3], aabbmin[3],aabbmax[3];
|
2008-01-31 23:00:08 +00:00
|
|
|
float t,tune = 10.0f;
|
2006-11-10 23:09:16 +00:00
|
|
|
int a, deflected=0;
|
|
|
|
|
|
|
|
aabbmin[0] = MIN3(face_v1[0],face_v2[0],face_v3[0]);
|
|
|
|
aabbmin[1] = MIN3(face_v1[1],face_v2[1],face_v3[1]);
|
|
|
|
aabbmin[2] = MIN3(face_v1[2],face_v2[2],face_v3[2]);
|
|
|
|
aabbmax[0] = MAX3(face_v1[0],face_v2[0],face_v3[0]);
|
|
|
|
aabbmax[1] = MAX3(face_v1[1],face_v2[1],face_v3[1]);
|
|
|
|
aabbmax[2] = MAX3(face_v1[2],face_v2[2],face_v3[2]);
|
2006-10-10 21:49:02 +00:00
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
hash = vertexowner->soft->scratch->colliderhash;
|
|
|
|
ihash = BLI_ghashIterator_new(hash);
|
|
|
|
while (!BLI_ghashIterator_isDone(ihash) ) {
|
|
|
|
|
|
|
|
ccd_Mesh *ccdm = BLI_ghashIterator_getValue (ihash);
|
|
|
|
ob = BLI_ghashIterator_getKey (ihash);
|
|
|
|
/* only with deflecting set */
|
|
|
|
if(ob->pd && ob->pd->deflect) {
|
|
|
|
MFace *mface= NULL;
|
|
|
|
MVert *mvert= NULL;
|
|
|
|
MVert *mprevvert= NULL;
|
|
|
|
ccdf_minmax *mima= NULL;
|
|
|
|
if(ccdm){
|
|
|
|
mface= ccdm->mface;
|
|
|
|
mvert= ccdm->mvert;
|
|
|
|
mprevvert= ccdm->mprevvert;
|
|
|
|
mima= ccdm->mima;
|
|
|
|
a = ccdm->totface;
|
|
|
|
|
2006-10-10 21:49:02 +00:00
|
|
|
if ((aabbmax[0] < ccdm->bbmin[0]) ||
|
|
|
|
(aabbmax[1] < ccdm->bbmin[1]) ||
|
|
|
|
(aabbmax[2] < ccdm->bbmin[2]) ||
|
|
|
|
(aabbmin[0] > ccdm->bbmax[0]) ||
|
|
|
|
(aabbmin[1] > ccdm->bbmax[1]) ||
|
|
|
|
(aabbmin[2] > ccdm->bbmax[2]) ) {
|
|
|
|
/* boxes dont intersect */
|
2006-11-10 23:09:16 +00:00
|
|
|
BLI_ghashIterator_step(ihash);
|
2006-10-10 21:49:02 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
/*aye that should be cached*/
|
|
|
|
printf("missing cache error \n");
|
2006-11-10 23:09:16 +00:00
|
|
|
BLI_ghashIterator_step(ihash);
|
2006-10-10 21:49:02 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* use mesh*/
|
|
|
|
while (a--) {
|
|
|
|
if (
|
|
|
|
(aabbmax[0] < mima->minx) ||
|
|
|
|
(aabbmin[0] > mima->maxx) ||
|
|
|
|
(aabbmax[1] < mima->miny) ||
|
|
|
|
(aabbmin[1] > mima->maxy) ||
|
|
|
|
(aabbmax[2] < mima->minz) ||
|
|
|
|
(aabbmin[2] > mima->maxz)
|
|
|
|
) {
|
|
|
|
mface++;
|
|
|
|
mima++;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (mvert){
|
|
|
|
|
|
|
|
VECCOPY(nv1,mvert[mface->v1].co);
|
|
|
|
VECCOPY(nv2,mvert[mface->v2].co);
|
|
|
|
VECCOPY(nv3,mvert[mface->v3].co);
|
|
|
|
if (mface->v4){
|
|
|
|
VECCOPY(nv4,mvert[mface->v4].co);
|
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
if (mprevvert){
|
|
|
|
VecMulf(nv1,time);
|
|
|
|
Vec3PlusStVec(nv1,(1.0f-time),mprevvert[mface->v1].co);
|
|
|
|
|
|
|
|
VecMulf(nv2,time);
|
|
|
|
Vec3PlusStVec(nv2,(1.0f-time),mprevvert[mface->v2].co);
|
|
|
|
|
|
|
|
VecMulf(nv3,time);
|
|
|
|
Vec3PlusStVec(nv3,(1.0f-time),mprevvert[mface->v3].co);
|
|
|
|
|
|
|
|
if (mface->v4){
|
|
|
|
VecMulf(nv4,time);
|
|
|
|
Vec3PlusStVec(nv4,(1.0f-time),mprevvert[mface->v4].co);
|
|
|
|
}
|
|
|
|
}
|
2006-10-10 21:49:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* switch origin to be nv2*/
|
|
|
|
VECSUB(edge1, nv1, nv2);
|
|
|
|
VECSUB(edge2, nv3, nv2);
|
|
|
|
Crossf(d_nvect, edge2, edge1);
|
2007-04-04 13:18:41 +00:00
|
|
|
Normalize(d_nvect);
|
2006-11-10 23:09:16 +00:00
|
|
|
if (
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
LineIntersectsTriangle(nv1, nv2, face_v1, face_v2, face_v3, &t, NULL) ||
|
|
|
|
LineIntersectsTriangle(nv2, nv3, face_v1, face_v2, face_v3, &t, NULL) ||
|
|
|
|
LineIntersectsTriangle(nv3, nv1, face_v1, face_v2, face_v3, &t, NULL) ){
|
2008-01-31 23:00:08 +00:00
|
|
|
Vec3PlusStVec(force,-0.5f,d_nvect);
|
|
|
|
*damp=tune*ob->pd->pdef_sbdamp;
|
2006-11-10 23:09:16 +00:00
|
|
|
deflected = 2;
|
|
|
|
}
|
|
|
|
if (mface->v4){ /* quad */
|
|
|
|
/* switch origin to be nv4 */
|
|
|
|
VECSUB(edge1, nv3, nv4);
|
|
|
|
VECSUB(edge2, nv1, nv4);
|
|
|
|
Crossf(d_nvect, edge2, edge1);
|
2007-04-04 13:18:41 +00:00
|
|
|
Normalize(d_nvect);
|
2006-11-10 23:09:16 +00:00
|
|
|
if (
|
2008-01-31 23:00:08 +00:00
|
|
|
/* LineIntersectsTriangle(nv1, nv3, face_v1, face_v2, face_v3, &t, NULL) ||
|
|
|
|
we did that edge allready */
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
LineIntersectsTriangle(nv3, nv4, face_v1, face_v2, face_v3, &t, NULL) ||
|
|
|
|
LineIntersectsTriangle(nv4, nv1, face_v1, face_v2, face_v3, &t, NULL) ){
|
2008-01-31 23:00:08 +00:00
|
|
|
Vec3PlusStVec(force,-0.5f,d_nvect);
|
|
|
|
*damp=tune*ob->pd->pdef_sbdamp;
|
2006-11-10 23:09:16 +00:00
|
|
|
deflected = 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
mface++;
|
|
|
|
mima++;
|
|
|
|
}/* while a */
|
|
|
|
} /* if(ob->pd && ob->pd->deflect) */
|
|
|
|
BLI_ghashIterator_step(ihash);
|
|
|
|
} /* while () */
|
|
|
|
BLI_ghashIterator_free(ihash);
|
|
|
|
return deflected;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static void scan_for_ext_face_forces(Object *ob,float timenow)
|
2006-11-10 23:09:16 +00:00
|
|
|
{
|
|
|
|
SoftBody *sb = ob->soft;
|
|
|
|
BodyFace *bf;
|
|
|
|
int a;
|
2008-01-31 23:00:08 +00:00
|
|
|
float damp=0.0f,choke=1.0f;
|
2006-11-10 23:09:16 +00:00
|
|
|
float tune = -10.0f;
|
|
|
|
float feedback[3];
|
|
|
|
|
|
|
|
if (sb && sb->scratch->totface){
|
|
|
|
|
|
|
|
|
|
|
|
bf = sb->scratch->bodyface;
|
|
|
|
for(a=0; a<sb->scratch->totface; a++, bf++) {
|
|
|
|
bf->ext_force[0]=bf->ext_force[1]=bf->ext_force[2]=0.0f;
|
2008-01-31 23:00:08 +00:00
|
|
|
/*+++edges intruding*/
|
|
|
|
bf->flag &= ~BFF_INTERSECT;
|
2006-11-10 23:09:16 +00:00
|
|
|
feedback[0]=feedback[1]=feedback[2]=0.0f;
|
|
|
|
if (sb_detect_face_collisionCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v2].pos, sb->bpoint[bf->v3].pos,
|
|
|
|
&damp, feedback, ob->lay ,ob , timenow)){
|
2008-01-31 23:00:08 +00:00
|
|
|
Vec3PlusStVec(sb->bpoint[bf->v1].force,tune,feedback);
|
|
|
|
Vec3PlusStVec(sb->bpoint[bf->v2].force,tune,feedback);
|
|
|
|
Vec3PlusStVec(sb->bpoint[bf->v3].force,tune,feedback);
|
|
|
|
// Vec3PlusStVec(bf->ext_force,tune,feedback);
|
2006-11-10 23:09:16 +00:00
|
|
|
bf->flag |= BFF_INTERSECT;
|
2008-01-31 23:00:08 +00:00
|
|
|
choke = MIN2(MAX2(damp,choke),1.0f);
|
2006-11-10 23:09:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
feedback[0]=feedback[1]=feedback[2]=0.0f;
|
|
|
|
if ((bf->v4) && (sb_detect_face_collisionCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v3].pos, sb->bpoint[bf->v4].pos,
|
|
|
|
&damp, feedback, ob->lay ,ob , timenow))){
|
2008-01-31 23:00:08 +00:00
|
|
|
Vec3PlusStVec(sb->bpoint[bf->v1].force,tune,feedback);
|
|
|
|
Vec3PlusStVec(sb->bpoint[bf->v3].force,tune,feedback);
|
|
|
|
Vec3PlusStVec(sb->bpoint[bf->v4].force,tune,feedback);
|
|
|
|
// Vec3PlusStVec(bf->ext_force,tune,feedback);
|
|
|
|
bf->flag |= BFF_INTERSECT;
|
|
|
|
choke = MIN2(MAX2(damp,choke),1.0f);
|
2006-11-10 23:09:16 +00:00
|
|
|
}
|
2008-01-31 23:00:08 +00:00
|
|
|
/*---edges intruding*/
|
|
|
|
|
|
|
|
/*+++ close vertices*/
|
|
|
|
if (( bf->flag & BFF_INTERSECT)==0){
|
|
|
|
bf->flag &= ~BFF_CLOSEVERT;
|
|
|
|
tune = -1.0f;
|
|
|
|
feedback[0]=feedback[1]=feedback[2]=0.0f;
|
|
|
|
if (sb_detect_face_pointCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v2].pos, sb->bpoint[bf->v3].pos,
|
|
|
|
&damp, feedback, ob->lay ,ob , timenow)){
|
|
|
|
Vec3PlusStVec(sb->bpoint[bf->v1].force,tune,feedback);
|
|
|
|
Vec3PlusStVec(sb->bpoint[bf->v2].force,tune,feedback);
|
|
|
|
Vec3PlusStVec(sb->bpoint[bf->v3].force,tune,feedback);
|
|
|
|
// Vec3PlusStVec(bf->ext_force,tune,feedback);
|
|
|
|
bf->flag |= BFF_CLOSEVERT;
|
|
|
|
choke = MIN2(MAX2(damp,choke),1.0f);
|
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2008-01-31 23:00:08 +00:00
|
|
|
feedback[0]=feedback[1]=feedback[2]=0.0f;
|
|
|
|
if ((bf->v4) && (sb_detect_face_pointCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v3].pos, sb->bpoint[bf->v4].pos,
|
|
|
|
&damp, feedback, ob->lay ,ob , timenow))){
|
|
|
|
Vec3PlusStVec(sb->bpoint[bf->v1].force,tune,feedback);
|
|
|
|
Vec3PlusStVec(sb->bpoint[bf->v3].force,tune,feedback);
|
|
|
|
Vec3PlusStVec(sb->bpoint[bf->v4].force,tune,feedback);
|
|
|
|
// Vec3PlusStVec(bf->ext_force,tune,feedback);
|
|
|
|
bf->flag |= BFF_CLOSEVERT;
|
|
|
|
choke = MIN2(MAX2(damp,choke),1.0f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/*--- close vertices*/
|
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
bf = sb->scratch->bodyface;
|
|
|
|
for(a=0; a<sb->scratch->totface; a++, bf++) {
|
2008-01-31 23:00:08 +00:00
|
|
|
if (( bf->flag & BFF_INTERSECT) || ( bf->flag & BFF_CLOSEVERT))
|
2006-11-10 23:09:16 +00:00
|
|
|
{
|
2008-01-31 23:00:08 +00:00
|
|
|
sb->bpoint[bf->v1].choke2=MAX2(sb->bpoint[bf->v1].choke2,choke);
|
|
|
|
sb->bpoint[bf->v2].choke2=MAX2(sb->bpoint[bf->v2].choke2,choke);
|
|
|
|
sb->bpoint[bf->v3].choke2=MAX2(sb->bpoint[bf->v3].choke2,choke);
|
2006-11-10 23:09:16 +00:00
|
|
|
if (bf->v4){
|
2008-01-31 23:00:08 +00:00
|
|
|
sb->bpoint[bf->v2].choke2=MAX2(sb->bpoint[bf->v2].choke2,choke);
|
2006-11-10 23:09:16 +00:00
|
|
|
}
|
2008-01-31 23:00:08 +00:00
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --- the face external section*/
|
|
|
|
|
|
|
|
|
|
|
|
/* +++ the spring external section*/
|
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],float *damp,
|
2006-11-10 23:09:16 +00:00
|
|
|
float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
|
|
|
|
{
|
|
|
|
Object *ob;
|
|
|
|
GHash *hash;
|
|
|
|
GHashIterator *ihash;
|
|
|
|
float nv1[3], nv2[3], nv3[3], nv4[3], edge1[3], edge2[3], d_nvect[3], aabbmin[3],aabbmax[3];
|
|
|
|
float t,el;
|
|
|
|
int a, deflected=0;
|
|
|
|
|
|
|
|
aabbmin[0] = MIN2(edge_v1[0],edge_v2[0]);
|
|
|
|
aabbmin[1] = MIN2(edge_v1[1],edge_v2[1]);
|
|
|
|
aabbmin[2] = MIN2(edge_v1[2],edge_v2[2]);
|
|
|
|
aabbmax[0] = MAX2(edge_v1[0],edge_v2[0]);
|
|
|
|
aabbmax[1] = MAX2(edge_v1[1],edge_v2[1]);
|
|
|
|
aabbmax[2] = MAX2(edge_v1[2],edge_v2[2]);
|
|
|
|
|
|
|
|
el = VecLenf(edge_v1,edge_v2);
|
|
|
|
|
|
|
|
hash = vertexowner->soft->scratch->colliderhash;
|
|
|
|
ihash = BLI_ghashIterator_new(hash);
|
|
|
|
while (!BLI_ghashIterator_isDone(ihash) ) {
|
|
|
|
|
|
|
|
ccd_Mesh *ccdm = BLI_ghashIterator_getValue (ihash);
|
|
|
|
ob = BLI_ghashIterator_getKey (ihash);
|
|
|
|
/* only with deflecting set */
|
|
|
|
if(ob->pd && ob->pd->deflect) {
|
|
|
|
MFace *mface= NULL;
|
|
|
|
MVert *mvert= NULL;
|
|
|
|
MVert *mprevvert= NULL;
|
|
|
|
ccdf_minmax *mima= NULL;
|
|
|
|
if(ccdm){
|
|
|
|
mface= ccdm->mface;
|
|
|
|
mvert= ccdm->mvert;
|
|
|
|
mprevvert= ccdm->mprevvert;
|
|
|
|
mima= ccdm->mima;
|
|
|
|
a = ccdm->totface;
|
|
|
|
|
|
|
|
if ((aabbmax[0] < ccdm->bbmin[0]) ||
|
|
|
|
(aabbmax[1] < ccdm->bbmin[1]) ||
|
|
|
|
(aabbmax[2] < ccdm->bbmin[2]) ||
|
|
|
|
(aabbmin[0] > ccdm->bbmax[0]) ||
|
|
|
|
(aabbmin[1] > ccdm->bbmax[1]) ||
|
|
|
|
(aabbmin[2] > ccdm->bbmax[2]) ) {
|
|
|
|
/* boxes dont intersect */
|
|
|
|
BLI_ghashIterator_step(ihash);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
/*aye that should be cached*/
|
|
|
|
printf("missing cache error \n");
|
|
|
|
BLI_ghashIterator_step(ihash);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* use mesh*/
|
|
|
|
while (a--) {
|
|
|
|
if (
|
|
|
|
(aabbmax[0] < mima->minx) ||
|
|
|
|
(aabbmin[0] > mima->maxx) ||
|
|
|
|
(aabbmax[1] < mima->miny) ||
|
|
|
|
(aabbmin[1] > mima->maxy) ||
|
|
|
|
(aabbmax[2] < mima->minz) ||
|
|
|
|
(aabbmin[2] > mima->maxz)
|
|
|
|
) {
|
|
|
|
mface++;
|
|
|
|
mima++;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (mvert){
|
|
|
|
|
|
|
|
VECCOPY(nv1,mvert[mface->v1].co);
|
|
|
|
VECCOPY(nv2,mvert[mface->v2].co);
|
|
|
|
VECCOPY(nv3,mvert[mface->v3].co);
|
|
|
|
if (mface->v4){
|
|
|
|
VECCOPY(nv4,mvert[mface->v4].co);
|
|
|
|
}
|
|
|
|
if (mprevvert){
|
|
|
|
VecMulf(nv1,time);
|
|
|
|
Vec3PlusStVec(nv1,(1.0f-time),mprevvert[mface->v1].co);
|
|
|
|
|
|
|
|
VecMulf(nv2,time);
|
|
|
|
Vec3PlusStVec(nv2,(1.0f-time),mprevvert[mface->v2].co);
|
|
|
|
|
|
|
|
VecMulf(nv3,time);
|
|
|
|
Vec3PlusStVec(nv3,(1.0f-time),mprevvert[mface->v3].co);
|
|
|
|
|
|
|
|
if (mface->v4){
|
|
|
|
VecMulf(nv4,time);
|
|
|
|
Vec3PlusStVec(nv4,(1.0f-time),mprevvert[mface->v4].co);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* switch origin to be nv2*/
|
|
|
|
VECSUB(edge1, nv1, nv2);
|
|
|
|
VECSUB(edge2, nv3, nv2);
|
|
|
|
|
|
|
|
Crossf(d_nvect, edge2, edge1);
|
2007-04-04 13:18:41 +00:00
|
|
|
Normalize(d_nvect);
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
if ( LineIntersectsTriangle(edge_v1, edge_v2, nv1, nv2, nv3, &t, NULL)){
|
2006-11-10 23:09:16 +00:00
|
|
|
float v1[3],v2[3];
|
|
|
|
float intrusiondepth,i1,i2;
|
|
|
|
VECSUB(v1, edge_v1, nv2);
|
2006-10-10 21:49:02 +00:00
|
|
|
VECSUB(v2, edge_v2, nv2);
|
|
|
|
i1 = Inpf(v1,d_nvect);
|
|
|
|
i2 = Inpf(v2,d_nvect);
|
|
|
|
intrusiondepth = -MIN2(i1,i2)/el;
|
|
|
|
Vec3PlusStVec(force,intrusiondepth,d_nvect);
|
|
|
|
*damp=ob->pd->pdef_sbdamp;
|
|
|
|
deflected = 2;
|
|
|
|
}
|
|
|
|
if (mface->v4){ /* quad */
|
|
|
|
/* switch origin to be nv4 */
|
|
|
|
VECSUB(edge1, nv3, nv4);
|
|
|
|
VECSUB(edge2, nv1, nv4);
|
|
|
|
|
|
|
|
Crossf(d_nvect, edge2, edge1);
|
2007-04-04 13:18:41 +00:00
|
|
|
Normalize(d_nvect);
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
if (LineIntersectsTriangle( edge_v1, edge_v2,nv1, nv3, nv4, &t, NULL)){
|
2006-11-10 23:09:16 +00:00
|
|
|
float v1[3],v2[3];
|
|
|
|
float intrusiondepth,i1,i2;
|
|
|
|
VECSUB(v1, edge_v1, nv4);
|
|
|
|
VECSUB(v2, edge_v2, nv4);
|
|
|
|
i1 = Inpf(v1,d_nvect);
|
|
|
|
i2 = Inpf(v2,d_nvect);
|
|
|
|
intrusiondepth = -MIN2(i1,i2)/el;
|
|
|
|
|
|
|
|
|
|
|
|
Vec3PlusStVec(force,intrusiondepth,d_nvect);
|
|
|
|
*damp=ob->pd->pdef_sbdamp;
|
|
|
|
deflected = 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
mface++;
|
|
|
|
mima++;
|
|
|
|
}/* while a */
|
|
|
|
} /* if(ob->pd && ob->pd->deflect) */
|
|
|
|
BLI_ghashIterator_step(ihash);
|
|
|
|
} /* while () */
|
|
|
|
BLI_ghashIterator_free(ihash);
|
|
|
|
return deflected;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-01-09 00:25:51 +00:00
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static void _scan_for_ext_spring_forces(Object *ob,float timenow,int ifirst,int ilast, struct ListBase *do_effector)
|
2006-11-10 23:09:16 +00:00
|
|
|
{
|
|
|
|
SoftBody *sb = ob->soft;
|
|
|
|
int a;
|
|
|
|
float damp;
|
|
|
|
float feedback[3];
|
|
|
|
|
|
|
|
if (sb && sb->totspring){
|
2008-08-11 20:40:29 +00:00
|
|
|
for(a=ifirst; a<ilast; a++) {
|
2006-11-10 23:09:16 +00:00
|
|
|
BodySpring *bs = &sb->bspring[a];
|
|
|
|
bs->ext_force[0]=bs->ext_force[1]=bs->ext_force[2]=0.0f;
|
|
|
|
feedback[0]=feedback[1]=feedback[2]=0.0f;
|
|
|
|
bs->flag &= ~BSF_INTERSECT;
|
|
|
|
|
|
|
|
if (bs->order ==1){
|
|
|
|
/* +++ springs colliding */
|
|
|
|
if (ob->softflag & OB_SB_EDGECOLL){
|
|
|
|
if ( sb_detect_edge_collisionCached (sb->bpoint[bs->v1].pos , sb->bpoint[bs->v2].pos,
|
|
|
|
&damp,feedback,ob->lay,ob,timenow)){
|
|
|
|
VecAddf(bs->ext_force,bs->ext_force,feedback);
|
|
|
|
bs->flag |= BSF_INTERSECT;
|
|
|
|
//bs->cf=damp;
|
|
|
|
bs->cf=sb->choke*0.01f;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* ---- springs colliding */
|
|
|
|
|
|
|
|
/* +++ springs seeing wind ... n stuff depending on their orientation*/
|
|
|
|
/* note we don't use sb->mediafrict but use sb->aeroedge for magnitude of effect*/
|
|
|
|
if(sb->aeroedge){
|
|
|
|
float vel[3],sp[3],pr[3],force[3];
|
2008-07-25 22:58:22 +00:00
|
|
|
float f,windfactor = 250.0f;
|
2006-11-10 23:09:16 +00:00
|
|
|
/*see if we have wind*/
|
|
|
|
if(do_effector) {
|
|
|
|
float speed[3]={0.0f,0.0f,0.0f};
|
|
|
|
float pos[3];
|
|
|
|
VecMidf(pos, sb->bpoint[bs->v1].pos , sb->bpoint[bs->v2].pos);
|
|
|
|
VecMidf(vel, sb->bpoint[bs->v1].vec , sb->bpoint[bs->v2].vec);
|
|
|
|
pdDoEffectors(do_effector, pos, force, speed, (float)G.scene->r.cfra, 0.0f, PE_WIND_AS_SPEED);
|
|
|
|
VecMulf(speed,windfactor);
|
|
|
|
VecAddf(vel,vel,speed);
|
|
|
|
}
|
|
|
|
/* media in rest */
|
|
|
|
else{
|
|
|
|
VECADD(vel, sb->bpoint[bs->v1].vec , sb->bpoint[bs->v2].vec);
|
|
|
|
}
|
2007-04-04 13:18:41 +00:00
|
|
|
f = Normalize(vel);
|
2006-11-10 23:09:16 +00:00
|
|
|
f = -0.0001f*f*f*sb->aeroedge;
|
2008-01-12 01:26:40 +00:00
|
|
|
/* (todo) add a nice angle dependant function done for now BUT */
|
|
|
|
/* still there could be some nice drag/lift function, but who needs it */
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
VECSUB(sp, sb->bpoint[bs->v1].pos , sb->bpoint[bs->v2].pos);
|
|
|
|
Projf(pr,vel,sp);
|
|
|
|
VECSUB(vel,vel,pr);
|
2007-04-04 13:18:41 +00:00
|
|
|
Normalize(vel);
|
2008-01-12 01:26:40 +00:00
|
|
|
if (ob->softflag & OB_SB_AERO_ANGLE){
|
|
|
|
Normalize(sp);
|
|
|
|
Vec3PlusStVec(bs->ext_force,f*(1.0f-ABS(Inpf(vel,sp))),vel);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
Vec3PlusStVec(bs->ext_force,f,vel); // to keep compatible with 2.45 release files
|
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
}
|
|
|
|
/* --- springs seeing wind */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-08-11 20:40:29 +00:00
|
|
|
|
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static void scan_for_ext_spring_forces(Object *ob,float timenow)
|
2008-08-11 20:40:29 +00:00
|
|
|
{
|
|
|
|
SoftBody *sb = ob->soft;
|
|
|
|
ListBase *do_effector= NULL;
|
|
|
|
do_effector= pdInitEffectors(ob,NULL);
|
|
|
|
if (sb){
|
|
|
|
_scan_for_ext_spring_forces(ob,timenow,0,sb->totspring,do_effector);
|
|
|
|
}
|
|
|
|
if(do_effector)
|
|
|
|
pdEndEffectors(do_effector);
|
|
|
|
}
|
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static void *exec_scan_for_ext_spring_forces(void *data)
|
2008-08-11 20:40:29 +00:00
|
|
|
{
|
|
|
|
SB_thread_context *pctx = (SB_thread_context*)data;
|
|
|
|
_scan_for_ext_spring_forces(pctx->ob,pctx->timenow,pctx->ifirst,pctx->ilast,pctx->do_effector);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static void sb_sfesf_threads_run(struct Object *ob, float timenow,int totsprings,int *ptr_to_break_func())
|
2008-08-11 20:40:29 +00:00
|
|
|
{
|
2008-09-05 23:28:28 +00:00
|
|
|
ListBase *do_effector = NULL;
|
2008-08-11 20:40:29 +00:00
|
|
|
ListBase threads;
|
|
|
|
SB_thread_context *sb_threads;
|
|
|
|
int i, totthread,left,dec;
|
2008-09-05 23:28:28 +00:00
|
|
|
int lowsprings =100; /* wild guess .. may increase with better thread management 'above' or even be UI option sb->spawn_cf_threads_nopts */
|
2008-08-11 20:40:29 +00:00
|
|
|
|
|
|
|
do_effector= pdInitEffectors(ob,NULL);
|
|
|
|
|
|
|
|
/* figure the number of threads while preventing pretty pointless threading overhead */
|
2008-09-05 23:28:28 +00:00
|
|
|
if(G.scene->r.mode & R_FIXED_THREADS)
|
|
|
|
totthread= G.scene->r.threads;
|
|
|
|
else
|
|
|
|
totthread= BLI_system_thread_count();
|
|
|
|
/* what if we got zillions of CPUs running but less to spread*/
|
|
|
|
while ((totsprings/totthread < lowsprings) && (totthread > 1)) {
|
|
|
|
totthread--;
|
2008-08-11 20:40:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sb_threads= MEM_callocN(sizeof(SB_thread_context)*totthread, "SBSpringsThread");
|
|
|
|
memset(sb_threads, 0, sizeof(SB_thread_context)*totthread);
|
|
|
|
left = totsprings;
|
|
|
|
dec = totsprings/totthread +1;
|
|
|
|
for(i=0; i<totthread; i++) {
|
|
|
|
sb_threads[i].ob = ob;
|
|
|
|
sb_threads[i].forcetime = 0.0; // not used here
|
|
|
|
sb_threads[i].timenow = timenow;
|
|
|
|
sb_threads[i].ilast = left;
|
|
|
|
left = left - dec;
|
|
|
|
if (left >0){
|
|
|
|
sb_threads[i].ifirst = left;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sb_threads[i].ifirst = 0;
|
|
|
|
sb_threads[i].do_effector = do_effector;
|
|
|
|
sb_threads[i].do_deflector = 0;// not used here
|
|
|
|
sb_threads[i].fieldfactor = 0.0f;// not used here
|
|
|
|
sb_threads[i].windfactor = 0.0f;// not used here
|
|
|
|
sb_threads[i].nr= i;
|
|
|
|
sb_threads[i].tot= totthread;
|
|
|
|
}
|
|
|
|
if(totthread > 1) {
|
|
|
|
BLI_init_threads(&threads, exec_scan_for_ext_spring_forces, totthread);
|
|
|
|
|
|
|
|
for(i=0; i<totthread; i++)
|
|
|
|
BLI_insert_thread(&threads, &sb_threads[i]);
|
|
|
|
|
|
|
|
BLI_end_threads(&threads);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
exec_scan_for_ext_spring_forces(&sb_threads[0]);
|
|
|
|
/* clean up */
|
|
|
|
MEM_freeN(sb_threads);
|
|
|
|
|
|
|
|
if(do_effector)
|
|
|
|
pdEndEffectors(do_effector);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
/* --- the spring external section*/
|
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static int choose_winner(float*w, float* pos,float*a,float*b,float*c,float*ca,float*cb,float*cc)
|
2006-11-10 23:09:16 +00:00
|
|
|
{
|
|
|
|
float mindist,cp;
|
|
|
|
int winner =1;
|
|
|
|
mindist = ABS(Inpf(pos,a));
|
|
|
|
|
|
|
|
cp = ABS(Inpf(pos,b));
|
|
|
|
if ( mindist < cp ){
|
|
|
|
mindist = cp;
|
|
|
|
winner =2;
|
|
|
|
}
|
|
|
|
|
|
|
|
cp = ABS(Inpf(pos,c));
|
|
|
|
if (mindist < cp ){
|
|
|
|
mindist = cp;
|
|
|
|
winner =3;
|
|
|
|
}
|
|
|
|
switch (winner){
|
|
|
|
case 1: VECCOPY(w,ca); break;
|
|
|
|
case 2: VECCOPY(w,cb); break;
|
|
|
|
case 3: VECCOPY(w,cc);
|
|
|
|
}
|
|
|
|
return(winner);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], float *damp,
|
2006-11-10 23:09:16 +00:00
|
|
|
float force[3], unsigned int par_layer,struct Object *vertexowner,
|
|
|
|
float time,float vel[3], float *intrusion)
|
|
|
|
{
|
2007-10-29 05:59:26 +00:00
|
|
|
Object *ob= NULL;
|
2006-11-10 23:09:16 +00:00
|
|
|
GHash *hash;
|
|
|
|
GHashIterator *ihash;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
float nv1[3], nv2[3], nv3[3], nv4[3], edge1[3], edge2[3],d_nvect[3], dv1[3],ve[3],avel[3]={0.0,0.0,0.0},
|
2007-10-18 22:47:55 +00:00
|
|
|
vv1[3], vv2[3], vv3[3], vv4[3], coledge[3], mindistedge = 1000.0f,
|
|
|
|
outerforceaccu[3],innerforceaccu[3],
|
2006-11-10 23:09:16 +00:00
|
|
|
facedist,n_mag,force_mag_norm,minx,miny,minz,maxx,maxy,maxz,
|
|
|
|
innerfacethickness = -0.5f, outerfacethickness = 0.2f,
|
2007-10-29 05:59:26 +00:00
|
|
|
ee = 5.0f, ff = 0.1f, fa=1;
|
2006-11-10 23:09:16 +00:00
|
|
|
int a, deflected=0, cavel=0,ci=0;
|
|
|
|
/* init */
|
|
|
|
*intrusion = 0.0f;
|
|
|
|
hash = vertexowner->soft->scratch->colliderhash;
|
|
|
|
ihash = BLI_ghashIterator_new(hash);
|
2007-10-18 22:47:55 +00:00
|
|
|
outerforceaccu[0]=outerforceaccu[1]=outerforceaccu[2]=0.0f;
|
|
|
|
innerforceaccu[0]=innerforceaccu[1]=innerforceaccu[2]=0.0f;
|
2006-11-10 23:09:16 +00:00
|
|
|
/* go */
|
|
|
|
while (!BLI_ghashIterator_isDone(ihash) ) {
|
|
|
|
|
|
|
|
ccd_Mesh *ccdm = BLI_ghashIterator_getValue (ihash);
|
|
|
|
ob = BLI_ghashIterator_getKey (ihash);
|
|
|
|
/* only with deflecting set */
|
|
|
|
if(ob->pd && ob->pd->deflect) {
|
|
|
|
MFace *mface= NULL;
|
|
|
|
MVert *mvert= NULL;
|
|
|
|
MVert *mprevvert= NULL;
|
|
|
|
ccdf_minmax *mima= NULL;
|
|
|
|
|
|
|
|
if(ccdm){
|
|
|
|
mface= ccdm->mface;
|
|
|
|
mvert= ccdm->mvert;
|
|
|
|
mprevvert= ccdm->mprevvert;
|
|
|
|
mima= ccdm->mima;
|
|
|
|
a = ccdm->totface;
|
|
|
|
|
|
|
|
minx =ccdm->bbmin[0];
|
|
|
|
miny =ccdm->bbmin[1];
|
|
|
|
minz =ccdm->bbmin[2];
|
|
|
|
|
|
|
|
maxx =ccdm->bbmax[0];
|
|
|
|
maxy =ccdm->bbmax[1];
|
|
|
|
maxz =ccdm->bbmax[2];
|
|
|
|
|
|
|
|
if ((opco[0] < minx) ||
|
|
|
|
(opco[1] < miny) ||
|
|
|
|
(opco[2] < minz) ||
|
|
|
|
(opco[0] > maxx) ||
|
|
|
|
(opco[1] > maxy) ||
|
|
|
|
(opco[2] > maxz) ) {
|
|
|
|
/* outside the padded boundbox --> collision object is too far away */
|
|
|
|
BLI_ghashIterator_step(ihash);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
/*aye that should be cached*/
|
|
|
|
printf("missing cache error \n");
|
|
|
|
BLI_ghashIterator_step(ihash);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* do object level stuff */
|
|
|
|
/* need to have user control for that since it depends on model scale */
|
|
|
|
innerfacethickness =-ob->pd->pdef_sbift;
|
|
|
|
outerfacethickness =ob->pd->pdef_sboft;
|
|
|
|
fa = (ff*outerfacethickness-outerfacethickness);
|
|
|
|
fa *= fa;
|
|
|
|
fa = 1.0f/fa;
|
|
|
|
avel[0]=avel[1]=avel[2]=0.0f;
|
|
|
|
/* use mesh*/
|
|
|
|
while (a--) {
|
|
|
|
if (
|
|
|
|
(opco[0] < mima->minx) ||
|
|
|
|
(opco[0] > mima->maxx) ||
|
|
|
|
(opco[1] < mima->miny) ||
|
|
|
|
(opco[1] > mima->maxy) ||
|
|
|
|
(opco[2] < mima->minz) ||
|
|
|
|
(opco[2] > mima->maxz)
|
|
|
|
) {
|
|
|
|
mface++;
|
|
|
|
mima++;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mvert){
|
|
|
|
|
|
|
|
VECCOPY(nv1,mvert[mface->v1].co);
|
|
|
|
VECCOPY(nv2,mvert[mface->v2].co);
|
|
|
|
VECCOPY(nv3,mvert[mface->v3].co);
|
|
|
|
if (mface->v4){
|
|
|
|
VECCOPY(nv4,mvert[mface->v4].co);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mprevvert){
|
|
|
|
/* grab the average speed of the collider vertices
|
|
|
|
before we spoil nvX
|
|
|
|
humm could be done once a SB steps but then we' need to store that too
|
|
|
|
since the AABB reduced propabitlty to get here drasticallly
|
|
|
|
it might be a nice tradeof CPU <--> memory
|
|
|
|
*/
|
|
|
|
VECSUB(vv1,nv1,mprevvert[mface->v1].co);
|
|
|
|
VECSUB(vv2,nv2,mprevvert[mface->v2].co);
|
|
|
|
VECSUB(vv3,nv3,mprevvert[mface->v3].co);
|
|
|
|
if (mface->v4){
|
|
|
|
VECSUB(vv4,nv4,mprevvert[mface->v4].co);
|
|
|
|
}
|
|
|
|
|
|
|
|
VecMulf(nv1,time);
|
|
|
|
Vec3PlusStVec(nv1,(1.0f-time),mprevvert[mface->v1].co);
|
|
|
|
|
|
|
|
VecMulf(nv2,time);
|
|
|
|
Vec3PlusStVec(nv2,(1.0f-time),mprevvert[mface->v2].co);
|
|
|
|
|
|
|
|
VecMulf(nv3,time);
|
|
|
|
Vec3PlusStVec(nv3,(1.0f-time),mprevvert[mface->v3].co);
|
|
|
|
|
|
|
|
if (mface->v4){
|
|
|
|
VecMulf(nv4,time);
|
|
|
|
Vec3PlusStVec(nv4,(1.0f-time),mprevvert[mface->v4].co);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* switch origin to be nv2*/
|
|
|
|
VECSUB(edge1, nv1, nv2);
|
|
|
|
VECSUB(edge2, nv3, nv2);
|
|
|
|
VECSUB(dv1,opco,nv2); /* abuse dv1 to have vertex in question at *origin* of triangle */
|
|
|
|
|
|
|
|
Crossf(d_nvect, edge2, edge1);
|
2007-04-04 13:18:41 +00:00
|
|
|
n_mag = Normalize(d_nvect);
|
2006-11-10 23:09:16 +00:00
|
|
|
facedist = Inpf(dv1,d_nvect);
|
2007-10-18 22:47:55 +00:00
|
|
|
// so rules are
|
|
|
|
//
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
if ((facedist > innerfacethickness) && (facedist < outerfacethickness)){
|
|
|
|
if (point_in_tri_prism(opco, nv1, nv2, nv3) ){
|
|
|
|
force_mag_norm =(float)exp(-ee*facedist);
|
|
|
|
if (facedist > outerfacethickness*ff)
|
|
|
|
force_mag_norm =(float)force_mag_norm*fa*(facedist - outerfacethickness)*(facedist - outerfacethickness);
|
|
|
|
*damp=ob->pd->pdef_sbdamp;
|
|
|
|
if (facedist > 0.0f){
|
|
|
|
*damp *= (1.0f - facedist/outerfacethickness);
|
2007-10-18 22:47:55 +00:00
|
|
|
Vec3PlusStVec(outerforceaccu,force_mag_norm,d_nvect);
|
|
|
|
deflected = 3;
|
|
|
|
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Vec3PlusStVec(innerforceaccu,force_mag_norm,d_nvect);
|
|
|
|
if (deflected < 2) deflected = 2;
|
2006-11-10 23:09:16 +00:00
|
|
|
}
|
|
|
|
if ((mprevvert) && (*damp > 0.0f)){
|
|
|
|
choose_winner(ve,opco,nv1,nv2,nv3,vv1,vv2,vv3);
|
|
|
|
VECADD(avel,avel,ve);
|
|
|
|
cavel ++;
|
|
|
|
}
|
|
|
|
*intrusion += facedist;
|
|
|
|
ci++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (mface->v4){ /* quad */
|
|
|
|
/* switch origin to be nv4 */
|
|
|
|
VECSUB(edge1, nv3, nv4);
|
|
|
|
VECSUB(edge2, nv1, nv4);
|
|
|
|
VECSUB(dv1,opco,nv4); /* abuse dv1 to have vertex in question at *origin* of triangle */
|
|
|
|
|
|
|
|
Crossf(d_nvect, edge2, edge1);
|
2007-04-04 13:18:41 +00:00
|
|
|
n_mag = Normalize(d_nvect);
|
2006-11-10 23:09:16 +00:00
|
|
|
facedist = Inpf(dv1,d_nvect);
|
2006-10-10 21:49:02 +00:00
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
if ((facedist > innerfacethickness) && (facedist < outerfacethickness)){
|
|
|
|
if (point_in_tri_prism(opco, nv1, nv3, nv4) ){
|
|
|
|
force_mag_norm =(float)exp(-ee*facedist);
|
|
|
|
if (facedist > outerfacethickness*ff)
|
|
|
|
force_mag_norm =(float)force_mag_norm*fa*(facedist - outerfacethickness)*(facedist - outerfacethickness);
|
|
|
|
*damp=ob->pd->pdef_sbdamp;
|
2007-10-18 22:47:55 +00:00
|
|
|
if (facedist > 0.0f){
|
|
|
|
*damp *= (1.0f - facedist/outerfacethickness);
|
|
|
|
Vec3PlusStVec(outerforceaccu,force_mag_norm,d_nvect);
|
|
|
|
deflected = 3;
|
|
|
|
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Vec3PlusStVec(innerforceaccu,force_mag_norm,d_nvect);
|
|
|
|
if (deflected < 2) deflected = 2;
|
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
if ((mprevvert) && (*damp > 0.0f)){
|
|
|
|
choose_winner(ve,opco,nv1,nv3,nv4,vv1,vv3,vv4);
|
|
|
|
VECADD(avel,avel,ve);
|
|
|
|
cavel ++;
|
|
|
|
}
|
|
|
|
*intrusion += facedist;
|
|
|
|
ci++;
|
|
|
|
}
|
2006-10-10 21:49:02 +00:00
|
|
|
|
2007-10-18 22:47:55 +00:00
|
|
|
}
|
|
|
|
if ((deflected < 2)&& (G.rt != 444)) // we did not hit a face until now
|
|
|
|
{ // see if 'outer' hits an edge
|
|
|
|
float dist;
|
|
|
|
|
|
|
|
PclosestVL3Dfl(ve, opco, nv1, nv2);
|
|
|
|
VECSUB(ve,opco,ve);
|
|
|
|
dist = Normalize(ve);
|
|
|
|
if ((dist < outerfacethickness)&&(dist < mindistedge )){
|
|
|
|
VECCOPY(coledge,ve);
|
|
|
|
mindistedge = dist,
|
|
|
|
deflected=1;
|
|
|
|
}
|
|
|
|
|
|
|
|
PclosestVL3Dfl(ve, opco, nv2, nv3);
|
|
|
|
VECSUB(ve,opco,ve);
|
|
|
|
dist = Normalize(ve);
|
|
|
|
if ((dist < outerfacethickness)&&(dist < mindistedge )){
|
|
|
|
VECCOPY(coledge,ve);
|
|
|
|
mindistedge = dist,
|
|
|
|
deflected=1;
|
|
|
|
}
|
|
|
|
|
|
|
|
PclosestVL3Dfl(ve, opco, nv3, nv1);
|
|
|
|
VECSUB(ve,opco,ve);
|
|
|
|
dist = Normalize(ve);
|
|
|
|
if ((dist < outerfacethickness)&&(dist < mindistedge )){
|
|
|
|
VECCOPY(coledge,ve);
|
|
|
|
mindistedge = dist,
|
|
|
|
deflected=1;
|
|
|
|
}
|
|
|
|
if (mface->v4){ /* quad */
|
|
|
|
PclosestVL3Dfl(ve, opco, nv3, nv4);
|
|
|
|
VECSUB(ve,opco,ve);
|
|
|
|
dist = Normalize(ve);
|
|
|
|
if ((dist < outerfacethickness)&&(dist < mindistedge )){
|
|
|
|
VECCOPY(coledge,ve);
|
|
|
|
mindistedge = dist,
|
|
|
|
deflected=1;
|
|
|
|
}
|
|
|
|
|
|
|
|
PclosestVL3Dfl(ve, opco, nv1, nv4);
|
|
|
|
VECSUB(ve,opco,ve);
|
|
|
|
dist = Normalize(ve);
|
|
|
|
if ((dist < outerfacethickness)&&(dist < mindistedge )){
|
|
|
|
VECCOPY(coledge,ve);
|
|
|
|
mindistedge = dist,
|
|
|
|
deflected=1;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-10-10 21:49:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
mface++;
|
|
|
|
mima++;
|
|
|
|
}/* while a */
|
|
|
|
} /* if(ob->pd && ob->pd->deflect) */
|
2006-11-10 23:09:16 +00:00
|
|
|
BLI_ghashIterator_step(ihash);
|
|
|
|
} /* while () */
|
2007-10-18 22:47:55 +00:00
|
|
|
|
|
|
|
if (deflected == 1){ // no face but 'outer' edge cylinder sees vert
|
|
|
|
force_mag_norm =(float)exp(-ee*mindistedge);
|
|
|
|
if (mindistedge > outerfacethickness*ff)
|
|
|
|
force_mag_norm =(float)force_mag_norm*fa*(mindistedge - outerfacethickness)*(mindistedge - outerfacethickness);
|
|
|
|
Vec3PlusStVec(force,force_mag_norm,coledge);
|
|
|
|
*damp=ob->pd->pdef_sbdamp;
|
|
|
|
if (mindistedge > 0.0f){
|
|
|
|
*damp *= (1.0f - mindistedge/outerfacethickness);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
if (deflected == 2){ // face inner detected
|
|
|
|
VECADD(force,force,innerforceaccu);
|
|
|
|
}
|
|
|
|
if (deflected == 3){ // face outer detected
|
|
|
|
VECADD(force,force,outerforceaccu);
|
|
|
|
}
|
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
BLI_ghashIterator_free(ihash);
|
|
|
|
if (cavel) VecMulf(avel,1.0f/(float)cavel);
|
|
|
|
VECCOPY(vel,avel);
|
|
|
|
if (ci) *intrusion /= ci;
|
|
|
|
if (deflected){
|
|
|
|
VECCOPY(facenormal,force);
|
2007-04-04 13:18:41 +00:00
|
|
|
Normalize(facenormal);
|
2006-10-10 21:49:02 +00:00
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
return deflected;
|
2006-10-10 21:49:02 +00:00
|
|
|
}
|
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
/* sandbox to plug in various deflection algos */
|
|
|
|
static int sb_deflect_face(Object *ob,float *actpos,float *facenormal,float *force,float *cf,float time,float *vel,float *intrusion)
|
2005-04-12 21:36:21 +00:00
|
|
|
{
|
2006-10-10 21:49:02 +00:00
|
|
|
float s_actpos[3];
|
2006-11-10 23:09:16 +00:00
|
|
|
int deflected;
|
2005-04-12 21:36:21 +00:00
|
|
|
VECCOPY(s_actpos,actpos);
|
2006-11-10 23:09:16 +00:00
|
|
|
deflected= sb_detect_vertex_collisionCached(s_actpos, facenormal, cf, force , ob->lay, ob,time,vel,intrusion);
|
|
|
|
//deflected= sb_detect_vertex_collisionCachedEx(s_actpos, facenormal, cf, force , ob->lay, ob,time,vel,intrusion);
|
2005-04-12 21:36:21 +00:00
|
|
|
return(deflected);
|
|
|
|
}
|
|
|
|
|
2008-02-16 00:07:05 +00:00
|
|
|
/* hiding this for now .. but the jacobian may pop up on other tasks .. so i'd like to keep it
|
2008-01-09 00:25:51 +00:00
|
|
|
static void dfdx_spring(int ia, int ic, int op, float dir[3],float L,float len,float factor)
|
|
|
|
{
|
|
|
|
float m,delta_ij;
|
|
|
|
int i ,j;
|
|
|
|
if (L < len){
|
|
|
|
for(i=0;i<3;i++)
|
|
|
|
for(j=0;j<3;j++){
|
|
|
|
delta_ij = (i==j ? (1.0f): (0.0f));
|
|
|
|
m=factor*(dir[i]*dir[j] + (1-L/len)*(delta_ij - dir[i]*dir[j]));
|
|
|
|
nlMatrixAdd(ia+i,op+ic+j,m);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
for(i=0;i<3;i++)
|
|
|
|
for(j=0;j<3;j++){
|
|
|
|
m=factor*dir[i]*dir[j];
|
|
|
|
nlMatrixAdd(ia+i,op+ic+j,m);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2005-04-12 21:36:21 +00:00
|
|
|
|
2008-01-09 00:25:51 +00:00
|
|
|
|
|
|
|
static void dfdx_goal(int ia, int ic, int op, float factor)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i=0;i<3;i++) nlMatrixAdd(ia+i,op+ic+i,factor);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void dfdv_goal(int ia, int ic,float factor)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i=0;i<3;i++) nlMatrixAdd(ia+i,ic+i,factor);
|
|
|
|
}
|
2008-02-16 00:07:05 +00:00
|
|
|
*/
|
2008-01-09 00:25:51 +00:00
|
|
|
static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float forcetime,int nl_flags)
|
|
|
|
{
|
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there */
|
|
|
|
BodyPoint *bp1,*bp2;
|
|
|
|
|
|
|
|
float dir[3],dvel[3];
|
|
|
|
float distance,forcefactor,kd,absvel,projvel;
|
|
|
|
int ia,ic;
|
|
|
|
/* prepare depending on which side of the spring we are on */
|
|
|
|
if (bpi == bs->v1){
|
|
|
|
bp1 = &sb->bpoint[bs->v1];
|
|
|
|
bp2 = &sb->bpoint[bs->v2];
|
|
|
|
ia =3*bs->v1;
|
|
|
|
ic =3*bs->v2;
|
|
|
|
}
|
|
|
|
else if (bpi == bs->v2){
|
|
|
|
bp1 = &sb->bpoint[bs->v2];
|
|
|
|
bp2 = &sb->bpoint[bs->v1];
|
|
|
|
ia =3*bs->v2;
|
|
|
|
ic =3*bs->v1;
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
/* TODO make this debug option */
|
|
|
|
/**/
|
|
|
|
printf("bodypoint <bpi> is not attached to spring <*bs> --> sb_spring_force()\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* do bp1 <--> bp2 elastic */
|
|
|
|
VecSubf(dir,bp1->pos,bp2->pos);
|
|
|
|
distance = Normalize(dir);
|
|
|
|
if (bs->len < distance)
|
|
|
|
iks = 1.0f/(1.0f-sb->inspring)-1.0f ;/* inner spring constants function */
|
|
|
|
else
|
|
|
|
iks = 1.0f/(1.0f-sb->inpush)-1.0f ;/* inner spring constants function */
|
|
|
|
|
|
|
|
if(bs->len > 0.0f) /* check for degenerated springs */
|
|
|
|
forcefactor = iks/bs->len;
|
|
|
|
else
|
|
|
|
forcefactor = iks;
|
|
|
|
forcefactor *= bs->strength;
|
|
|
|
Vec3PlusStVec(bp1->force,(bs->len - distance)*forcefactor,dir);
|
|
|
|
|
|
|
|
/* do bp1 <--> bp2 viscous */
|
|
|
|
VecSubf(dvel,bp1->vec,bp2->vec);
|
|
|
|
kd = sb->infrict * sb_fric_force_scale(ob);
|
|
|
|
absvel = Normalize(dvel);
|
|
|
|
projvel = Inpf(dir,dvel);
|
|
|
|
kd *= absvel * projvel;
|
|
|
|
Vec3PlusStVec(bp1->force,-kd,dir);
|
|
|
|
|
|
|
|
/* do jacobian stuff if needed */
|
|
|
|
if(nl_flags & NLF_BUILD){
|
2008-02-25 04:38:48 +00:00
|
|
|
//int op =3*sb->totpoint;
|
|
|
|
//float mvel = -forcetime*kd;
|
|
|
|
//float mpos = -forcetime*forcefactor;
|
2008-01-09 00:25:51 +00:00
|
|
|
/* depending on my pos */
|
2008-02-16 00:07:05 +00:00
|
|
|
// dfdx_spring(ia,ia,op,dir,bs->len,distance,-mpos);
|
2008-01-09 00:25:51 +00:00
|
|
|
/* depending on my vel */
|
2008-02-16 00:07:05 +00:00
|
|
|
// dfdv_goal(ia,ia,mvel); // well that ignores geometie
|
2008-01-09 00:25:51 +00:00
|
|
|
if(bp2->goal < SOFTGOALSNAP){ /* ommit this bp when it snaps */
|
|
|
|
/* depending on other pos */
|
2008-02-16 00:07:05 +00:00
|
|
|
// dfdx_spring(ia,ic,op,dir,bs->len,distance,mpos);
|
2008-01-09 00:25:51 +00:00
|
|
|
/* depending on other vel */
|
2008-02-16 00:07:05 +00:00
|
|
|
// dfdv_goal(ia,ia,-mvel); // well that ignores geometie
|
2008-01-09 00:25:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
/* since this is definitely the most CPU consuming task here .. try to spread it */
|
|
|
|
/* core function _softbody_calc_forces_slice_in_a_thread */
|
|
|
|
/* result is int to be able to flag user break */
|
2008-09-29 17:08:11 +00:00
|
|
|
static int _softbody_calc_forces_slice_in_a_thread(Object *ob, float forcetime, float timenow,int ifirst,int ilast,int *ptr_to_break_func(),ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
|
2004-10-01 14:10:30 +00:00
|
|
|
{
|
2008-08-11 20:40:29 +00:00
|
|
|
float iks;
|
|
|
|
int bb,do_selfcollision,do_springcollision,do_aero;
|
|
|
|
int number_of_points_here = ilast - ifirst;
|
2005-11-19 21:35:06 +00:00
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there */
|
2005-01-12 22:28:13 +00:00
|
|
|
BodyPoint *bp;
|
2008-08-11 20:40:29 +00:00
|
|
|
/* intitialize */
|
|
|
|
if (sb) {
|
2006-10-14 19:03:06 +00:00
|
|
|
/* check conditions for various options */
|
2008-08-11 20:40:29 +00:00
|
|
|
/* +++ could be done on object level to squeeze out the last bits of it */
|
2006-10-03 12:12:24 +00:00
|
|
|
do_selfcollision=((ob->softflag & OB_SB_EDGES) && (sb->bspring)&& (ob->softflag & OB_SB_SELF));
|
2006-10-10 21:49:02 +00:00
|
|
|
do_springcollision=do_deflector && (ob->softflag & OB_SB_EDGES) &&(ob->softflag & OB_SB_EDGECOLL);
|
2006-10-14 19:03:06 +00:00
|
|
|
do_aero=((sb->aeroedge)&& (ob->softflag & OB_SB_EDGES));
|
2008-08-11 20:40:29 +00:00
|
|
|
/* --- could be done on object level to squeeze out the last bits of it */
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
printf("Error expected a SB here \n");
|
|
|
|
return (999);
|
|
|
|
}
|
2008-07-24 12:27:31 +00:00
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
/* debugerin */
|
|
|
|
if (sb->totpoint < ifirst) {
|
|
|
|
printf("Aye 998");
|
|
|
|
return (998);
|
2006-11-10 23:09:16 +00:00
|
|
|
}
|
2008-08-11 20:40:29 +00:00
|
|
|
/* debugerin */
|
2008-01-12 01:26:40 +00:00
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
|
|
|
|
bp = &sb->bpoint[ifirst];
|
|
|
|
for(bb=number_of_points_here; bb>0; bb--, bp++) {
|
2006-11-10 23:09:16 +00:00
|
|
|
/* clear forces accumulator */
|
|
|
|
bp->force[0]= bp->force[1]= bp->force[2]= 0.0;
|
2006-10-03 12:12:24 +00:00
|
|
|
/* naive ball self collision */
|
|
|
|
/* needs to be done if goal snaps or not */
|
|
|
|
if(do_selfcollision){
|
|
|
|
int attached;
|
|
|
|
BodyPoint *obp;
|
2008-08-11 20:40:29 +00:00
|
|
|
BodySpring *bs;
|
2006-10-03 12:12:24 +00:00
|
|
|
int c,b;
|
2006-10-13 21:27:43 +00:00
|
|
|
float velcenter[3],dvel[3],def[3];
|
2006-10-03 12:12:24 +00:00
|
|
|
float distance;
|
|
|
|
float compare;
|
2008-08-11 20:40:29 +00:00
|
|
|
float bstune = sb->ballstiff;
|
2006-10-03 12:12:24 +00:00
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
for(c=sb->totpoint, obp= sb->bpoint; c>=ifirst+bb; c--, obp++) {
|
2006-10-04 21:36:55 +00:00
|
|
|
compare = (obp->colball + bp->colball);
|
2006-10-03 12:12:24 +00:00
|
|
|
VecSubf(def, bp->pos, obp->pos);
|
2006-11-10 23:09:16 +00:00
|
|
|
/* rather check the AABBoxes before ever calulating the real distance */
|
|
|
|
/* mathematically it is completly nuts, but performace is pretty much (3) times faster */
|
|
|
|
if ((ABS(def[0]) > compare) || (ABS(def[1]) > compare) || (ABS(def[2]) > compare)) continue;
|
2007-04-04 13:18:41 +00:00
|
|
|
distance = Normalize(def);
|
2006-10-03 12:12:24 +00:00
|
|
|
if (distance < compare ){
|
2006-10-14 19:03:06 +00:00
|
|
|
/* exclude body points attached with a spring */
|
2006-10-03 12:12:24 +00:00
|
|
|
attached = 0;
|
|
|
|
for(b=obp->nofsprings;b>0;b--){
|
|
|
|
bs = sb->bspring + obp->springs[b-1];
|
2008-08-11 20:40:29 +00:00
|
|
|
if (( ilast-bb == bs->v2) || ( ilast-bb == bs->v1)){
|
2006-10-03 12:12:24 +00:00
|
|
|
attached=1;
|
|
|
|
continue;}
|
|
|
|
}
|
|
|
|
if (!attached){
|
2008-08-11 20:40:29 +00:00
|
|
|
float f = bstune/(distance) + bstune/(compare*compare)*distance - 2.0f*bstune/compare ;
|
2006-10-13 21:27:43 +00:00
|
|
|
|
2006-10-14 19:03:06 +00:00
|
|
|
VecMidf(velcenter, bp->vec, obp->vec);
|
|
|
|
VecSubf(dvel,velcenter,bp->vec);
|
|
|
|
VecMulf(dvel,sb->nodemass);
|
2006-10-13 21:27:43 +00:00
|
|
|
|
2006-10-14 19:03:06 +00:00
|
|
|
Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def);
|
2008-01-09 00:25:51 +00:00
|
|
|
Vec3PlusStVec(bp->force,sb->balldamp,dvel);
|
|
|
|
|
2006-10-14 19:03:06 +00:00
|
|
|
/* exploit force(a,b) == -force(b,a) part2/2 */
|
|
|
|
VecSubf(dvel,velcenter,obp->vec);
|
|
|
|
VecMulf(dvel,sb->nodemass);
|
2006-10-13 21:27:43 +00:00
|
|
|
|
2006-10-14 19:03:06 +00:00
|
|
|
Vec3PlusStVec(obp->force,sb->balldamp,dvel);
|
|
|
|
Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def);
|
2006-10-03 12:12:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2006-10-14 19:03:06 +00:00
|
|
|
}
|
|
|
|
/* naive ball self collision done */
|
2006-10-03 12:12:24 +00:00
|
|
|
|
2006-09-28 20:27:46 +00:00
|
|
|
if(bp->goal < SOFTGOALSNAP){ /* ommit this bp when it snaps */
|
2005-11-19 21:35:06 +00:00
|
|
|
float auxvect[3];
|
2005-01-12 22:28:13 +00:00
|
|
|
float velgoal[3];
|
2008-02-08 15:36:39 +00:00
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
/* do goal stuff */
|
2005-04-02 13:57:23 +00:00
|
|
|
if(ob->softflag & OB_SB_GOAL) {
|
|
|
|
/* true elastic goal */
|
2008-08-11 20:40:29 +00:00
|
|
|
float ks,kd;
|
2008-01-09 00:25:51 +00:00
|
|
|
VecSubf(auxvect,bp->pos,bp->origT);
|
2005-04-02 13:57:23 +00:00
|
|
|
ks = 1.0f/(1.0f- bp->goal*sb->goalspring)-1.0f ;
|
2008-01-09 00:25:51 +00:00
|
|
|
bp->force[0]+= -ks*(auxvect[0]);
|
|
|
|
bp->force[1]+= -ks*(auxvect[1]);
|
|
|
|
bp->force[2]+= -ks*(auxvect[2]);
|
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
/* calulate damping forces generated by goals*/
|
|
|
|
VecSubf(velgoal,bp->origS, bp->origE);
|
2005-04-12 21:36:21 +00:00
|
|
|
kd = sb->goalfrict * sb_fric_force_scale(ob) ;
|
2008-01-09 00:25:51 +00:00
|
|
|
VecAddf(auxvect,velgoal,bp->vec);
|
2005-04-18 21:51:45 +00:00
|
|
|
|
2005-11-19 21:35:06 +00:00
|
|
|
if (forcetime > 0.0 ) { /* make sure friction does not become rocket motor on time reversal */
|
2008-01-09 00:25:51 +00:00
|
|
|
bp->force[0]-= kd * (auxvect[0]);
|
|
|
|
bp->force[1]-= kd * (auxvect[1]);
|
|
|
|
bp->force[2]-= kd * (auxvect[2]);
|
2005-04-02 13:57:23 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
bp->force[0]-= kd * (velgoal[0] - bp->vec[0]);
|
|
|
|
bp->force[1]-= kd * (velgoal[1] - bp->vec[1]);
|
|
|
|
bp->force[2]-= kd * (velgoal[2] - bp->vec[2]);
|
|
|
|
}
|
2005-01-12 22:28:13 +00:00
|
|
|
}
|
|
|
|
/* done goal stuff */
|
|
|
|
|
|
|
|
/* gravitation */
|
2008-08-11 20:40:29 +00:00
|
|
|
if (sb){
|
|
|
|
float gravity = sb->grav * sb_grav_force_scale(ob);
|
2005-04-02 13:57:23 +00:00
|
|
|
bp->force[2]-= gravity*sb->nodemass; /* individual mass of node here */
|
2008-08-11 20:40:29 +00:00
|
|
|
}
|
2005-04-18 21:51:45 +00:00
|
|
|
|
2005-04-05 20:28:32 +00:00
|
|
|
/* particle field & vortex */
|
The long awaited Particle patch from Janne Karhu
http://www.blender3d.org/cms/New_Particle_options_a.721.0.html
There's no doubt this patch had a lot of good ideas for features, and I
want to compliment Janne again for getting it all to work even!
A more careful review of the features and code did show however quite some
flaws and bugs... partially because the current particle code was very much
polluted already, but also because of the implementation lacked quality.
However, the patch was too good to reject, so I've fixed and recoded the
parts that needed it most. :)
Here's a list of of most evident changes in the patch;
- Guides support recoded. It was implemented as a true 'force field',
checking all Curve path points for each particle to find the closest. Was
just far too slow, and didn't support looping or bends well.
The new implementation is fast (real time) and treats the paths as actual
trajectory for the particle.
- Guides didn't integrate in the physics/speed system either, was added as
exception. Now it's integrated and can be combined with other velocities
or forces
- Use of Fields was slow code in general, made it use a Cache instead.
- The "even" distribution didn't work for Jittered sample patterns.
- The "even" or "vertexgroup" code in the main loops were badly constructed,
giving too much cpu for a simple task. Instead of going over all faces
many times, it now only does it once.
Same part of the code used a lot of temporal unneeded mallocs.
- Use of DerivedMesh or Mesh was confused, didn't work for Subsurfs in all
cases
- Support for vertex groups was slow, evaluating vertexgroups too often
- When a vertexgroup failed to read, it was wrongly handled (set to zero).
VertexGroup support now is with a name.
- Split up the too huge build_particle() call in some parts (moving new code)
- The "texture re-timing" option failed for moving Objects. The old code used
the convention that particles were added with increasing time steps.
Solved by creating a object Matrix Cache.
Also: the texture coordinates had to be corrected to become "OrCo".
- The "Disp" option only was used to draw less particles. Changed it to
actually calculate fewer particles for 3D viewing, but render all still.
So now it can be used to keep editing realtime.
Removed;
The "speed threshold" and "Tight" features were not copied over. This
resembled too much to feature overkill. Needs re-evaluation.
Also the "Deform" option was not added, I prefer to first check if the
current particle system really works for the Modifier system.
And:
- Added integration for particle force fields in the dependency graph
- Added TAB completion for vertexgroup names!
- Made the 'wait cursor' only appear when particles take more than 0.5 sec
- The particle jitter table order now is randomized too, giving much
nicer emitting of particles in large faces.
- Vortex field didn't correctly use speed/forces, so it didn't work for
collisions.
- Triangle distribution was wrong
- Removed ancient bug that applied in a *very* weird way speed and forces.
(location changes got the half force, speed the full...???)
So much... might have forgotten some notes! :)
2005-11-10 16:01:56 +00:00
|
|
|
if(do_effector) {
|
2008-08-11 20:40:29 +00:00
|
|
|
float kd;
|
2005-04-04 18:09:47 +00:00
|
|
|
float force[3]= {0.0f, 0.0f, 0.0f};
|
|
|
|
float speed[3]= {0.0f, 0.0f, 0.0f};
|
2005-11-19 21:35:06 +00:00
|
|
|
float eval_sb_fric_force_scale = sb_fric_force_scale(ob); /* just for calling function once */
|
2005-04-04 18:09:47 +00:00
|
|
|
|
The long awaited Particle patch from Janne Karhu
http://www.blender3d.org/cms/New_Particle_options_a.721.0.html
There's no doubt this patch had a lot of good ideas for features, and I
want to compliment Janne again for getting it all to work even!
A more careful review of the features and code did show however quite some
flaws and bugs... partially because the current particle code was very much
polluted already, but also because of the implementation lacked quality.
However, the patch was too good to reject, so I've fixed and recoded the
parts that needed it most. :)
Here's a list of of most evident changes in the patch;
- Guides support recoded. It was implemented as a true 'force field',
checking all Curve path points for each particle to find the closest. Was
just far too slow, and didn't support looping or bends well.
The new implementation is fast (real time) and treats the paths as actual
trajectory for the particle.
- Guides didn't integrate in the physics/speed system either, was added as
exception. Now it's integrated and can be combined with other velocities
or forces
- Use of Fields was slow code in general, made it use a Cache instead.
- The "even" distribution didn't work for Jittered sample patterns.
- The "even" or "vertexgroup" code in the main loops were badly constructed,
giving too much cpu for a simple task. Instead of going over all faces
many times, it now only does it once.
Same part of the code used a lot of temporal unneeded mallocs.
- Use of DerivedMesh or Mesh was confused, didn't work for Subsurfs in all
cases
- Support for vertex groups was slow, evaluating vertexgroups too often
- When a vertexgroup failed to read, it was wrongly handled (set to zero).
VertexGroup support now is with a name.
- Split up the too huge build_particle() call in some parts (moving new code)
- The "texture re-timing" option failed for moving Objects. The old code used
the convention that particles were added with increasing time steps.
Solved by creating a object Matrix Cache.
Also: the texture coordinates had to be corrected to become "OrCo".
- The "Disp" option only was used to draw less particles. Changed it to
actually calculate fewer particles for 3D viewing, but render all still.
So now it can be used to keep editing realtime.
Removed;
The "speed threshold" and "Tight" features were not copied over. This
resembled too much to feature overkill. Needs re-evaluation.
Also the "Deform" option was not added, I prefer to first check if the
current particle system really works for the Modifier system.
And:
- Added integration for particle force fields in the dependency graph
- Added TAB completion for vertexgroup names!
- Made the 'wait cursor' only appear when particles take more than 0.5 sec
- The particle jitter table order now is randomized too, giving much
nicer emitting of particles in large faces.
- Vortex field didn't correctly use speed/forces, so it didn't work for
collisions.
- Triangle distribution was wrong
- Removed ancient bug that applied in a *very* weird way speed and forces.
(location changes got the half force, speed the full...???)
So much... might have forgotten some notes! :)
2005-11-10 16:01:56 +00:00
|
|
|
pdDoEffectors(do_effector, bp->pos, force, speed, (float)G.scene->r.cfra, 0.0f, PE_WIND_AS_SPEED);
|
|
|
|
|
2005-04-21 18:58:15 +00:00
|
|
|
/* apply forcefield*/
|
|
|
|
VecMulf(force,fieldfactor* eval_sb_fric_force_scale);
|
2005-04-04 18:09:47 +00:00
|
|
|
VECADD(bp->force, bp->force, force);
|
2005-04-21 11:24:44 +00:00
|
|
|
|
2006-10-14 19:03:06 +00:00
|
|
|
/* BP friction in moving media */
|
2005-04-18 21:51:45 +00:00
|
|
|
kd= sb->mediafrict* eval_sb_fric_force_scale;
|
2005-04-21 18:58:15 +00:00
|
|
|
bp->force[0] -= kd * (bp->vec[0] + windfactor*speed[0]/eval_sb_fric_force_scale);
|
|
|
|
bp->force[1] -= kd * (bp->vec[1] + windfactor*speed[1]/eval_sb_fric_force_scale);
|
|
|
|
bp->force[2] -= kd * (bp->vec[2] + windfactor*speed[2]/eval_sb_fric_force_scale);
|
2005-04-05 20:28:32 +00:00
|
|
|
/* now we'll have nice centrifugal effect for vortex */
|
2005-04-18 21:51:45 +00:00
|
|
|
|
2005-04-05 20:28:32 +00:00
|
|
|
}
|
|
|
|
else {
|
2006-10-14 19:03:06 +00:00
|
|
|
/* BP friction in media (not) moving*/
|
2008-08-11 20:40:29 +00:00
|
|
|
float kd = sb->mediafrict* sb_fric_force_scale(ob);
|
2005-04-05 20:28:32 +00:00
|
|
|
/* assume it to be proportional to actual velocity */
|
|
|
|
bp->force[0]-= bp->vec[0]*kd;
|
|
|
|
bp->force[1]-= bp->vec[1]*kd;
|
|
|
|
bp->force[2]-= bp->vec[2]*kd;
|
|
|
|
/* friction in media done */
|
2005-04-04 18:09:47 +00:00
|
|
|
}
|
2006-10-14 19:03:06 +00:00
|
|
|
/* +++cached collision targets */
|
2006-11-10 23:09:16 +00:00
|
|
|
bp->choke = 0.0f;
|
2008-01-31 23:00:08 +00:00
|
|
|
bp->choke2 = 0.0f;
|
2006-11-10 23:09:16 +00:00
|
|
|
bp->flag &= ~SBF_DOFUZZY;
|
The long awaited Particle patch from Janne Karhu
http://www.blender3d.org/cms/New_Particle_options_a.721.0.html
There's no doubt this patch had a lot of good ideas for features, and I
want to compliment Janne again for getting it all to work even!
A more careful review of the features and code did show however quite some
flaws and bugs... partially because the current particle code was very much
polluted already, but also because of the implementation lacked quality.
However, the patch was too good to reject, so I've fixed and recoded the
parts that needed it most. :)
Here's a list of of most evident changes in the patch;
- Guides support recoded. It was implemented as a true 'force field',
checking all Curve path points for each particle to find the closest. Was
just far too slow, and didn't support looping or bends well.
The new implementation is fast (real time) and treats the paths as actual
trajectory for the particle.
- Guides didn't integrate in the physics/speed system either, was added as
exception. Now it's integrated and can be combined with other velocities
or forces
- Use of Fields was slow code in general, made it use a Cache instead.
- The "even" distribution didn't work for Jittered sample patterns.
- The "even" or "vertexgroup" code in the main loops were badly constructed,
giving too much cpu for a simple task. Instead of going over all faces
many times, it now only does it once.
Same part of the code used a lot of temporal unneeded mallocs.
- Use of DerivedMesh or Mesh was confused, didn't work for Subsurfs in all
cases
- Support for vertex groups was slow, evaluating vertexgroups too often
- When a vertexgroup failed to read, it was wrongly handled (set to zero).
VertexGroup support now is with a name.
- Split up the too huge build_particle() call in some parts (moving new code)
- The "texture re-timing" option failed for moving Objects. The old code used
the convention that particles were added with increasing time steps.
Solved by creating a object Matrix Cache.
Also: the texture coordinates had to be corrected to become "OrCo".
- The "Disp" option only was used to draw less particles. Changed it to
actually calculate fewer particles for 3D viewing, but render all still.
So now it can be used to keep editing realtime.
Removed;
The "speed threshold" and "Tight" features were not copied over. This
resembled too much to feature overkill. Needs re-evaluation.
Also the "Deform" option was not added, I prefer to first check if the
current particle system really works for the Modifier system.
And:
- Added integration for particle force fields in the dependency graph
- Added TAB completion for vertexgroup names!
- Made the 'wait cursor' only appear when particles take more than 0.5 sec
- The particle jitter table order now is randomized too, giving much
nicer emitting of particles in large faces.
- Vortex field didn't correctly use speed/forces, so it didn't work for
collisions.
- Triangle distribution was wrong
- Removed ancient bug that applied in a *very* weird way speed and forces.
(location changes got the half force, speed the full...???)
So much... might have forgotten some notes! :)
2005-11-10 16:01:56 +00:00
|
|
|
if(do_deflector) {
|
2006-11-10 23:09:16 +00:00
|
|
|
float cfforce[3],defforce[3] ={0.0f,0.0f,0.0f}, vel[3] = {0.0f,0.0f,0.0f}, facenormal[3], cf = 1.0f,intrusion;
|
2008-08-11 20:40:29 +00:00
|
|
|
float kd = 1.0f;
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
if (sb_deflect_face(ob,bp->pos,facenormal,defforce,&cf,timenow,vel,&intrusion)){
|
2008-09-05 23:28:28 +00:00
|
|
|
if (intrusion < 0.0f){
|
|
|
|
sb->scratch->flag |= SBF_DOFUZZY;
|
|
|
|
bp->flag |= SBF_DOFUZZY;
|
|
|
|
bp->choke = sb->choke*0.01f;
|
|
|
|
}
|
2008-08-11 20:40:29 +00:00
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
VECSUB(cfforce,bp->vec,vel);
|
|
|
|
Vec3PlusStVec(bp->force,-cf*50.0f,cfforce);
|
2008-08-11 20:40:29 +00:00
|
|
|
|
|
|
|
Vec3PlusStVec(bp->force,kd,defforce);
|
2005-04-04 18:09:47 +00:00
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2006-09-28 20:27:46 +00:00
|
|
|
}
|
2006-10-14 19:03:06 +00:00
|
|
|
/* ---cached collision targets */
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2006-10-14 19:03:06 +00:00
|
|
|
/* +++springs */
|
2008-08-11 20:40:29 +00:00
|
|
|
iks = 1.0f/(1.0f-sb->inspring)-1.0f ;/* inner spring constants function */
|
2005-04-02 13:57:23 +00:00
|
|
|
if(ob->softflag & OB_SB_EDGES) {
|
2005-11-19 21:35:06 +00:00
|
|
|
if (sb->bspring){ /* spring list exists at all ? */
|
2008-08-11 20:40:29 +00:00
|
|
|
int b;
|
|
|
|
BodySpring *bs;
|
2005-04-18 21:51:45 +00:00
|
|
|
for(b=bp->nofsprings;b>0;b--){
|
|
|
|
bs = sb->bspring + bp->springs[b-1];
|
2006-10-14 19:03:06 +00:00
|
|
|
if (do_springcollision || do_aero){
|
2006-10-10 21:49:02 +00:00
|
|
|
VecAddf(bp->force,bp->force,bs->ext_force);
|
|
|
|
if (bs->flag & BSF_INTERSECT)
|
2006-11-10 23:09:16 +00:00
|
|
|
bp->choke = bs->cf;
|
2006-10-10 21:49:02 +00:00
|
|
|
|
|
|
|
}
|
2008-01-09 00:25:51 +00:00
|
|
|
// sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float forcetime,int nl_flags)
|
2008-08-11 20:40:29 +00:00
|
|
|
sb_spring_force(ob,ilast-bb,bs,iks,forcetime,0);
|
2005-04-18 21:51:45 +00:00
|
|
|
}/* loop springs */
|
|
|
|
}/* existing spring list */
|
|
|
|
}/*any edges*/
|
2006-10-14 19:03:06 +00:00
|
|
|
/* ---springs */
|
2005-04-18 21:51:45 +00:00
|
|
|
}/*omit on snap */
|
|
|
|
}/*loop all bp's*/
|
2008-08-11 20:40:29 +00:00
|
|
|
return 0; /*done fine*/
|
|
|
|
}
|
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static void *exec_softbody_calc_forces(void *data)
|
2008-08-11 20:40:29 +00:00
|
|
|
{
|
|
|
|
SB_thread_context *pctx = (SB_thread_context*)data;
|
|
|
|
_softbody_calc_forces_slice_in_a_thread(pctx->ob,pctx->forcetime,pctx->timenow,pctx->ifirst,pctx->ilast,NULL,pctx->do_effector,pctx->do_deflector,pctx->fieldfactor,pctx->windfactor);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static void sb_cf_threads_run(struct Object *ob, float forcetime, float timenow,int totpoint,int *ptr_to_break_func(),struct ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
|
2008-08-11 20:40:29 +00:00
|
|
|
{
|
|
|
|
ListBase threads;
|
|
|
|
SB_thread_context *sb_threads;
|
|
|
|
int i, totthread,left,dec;
|
2008-09-05 23:28:28 +00:00
|
|
|
int lowpoints =100; /* wild guess .. may increase with better thread management 'above' or even be UI option sb->spawn_cf_threads_nopts */
|
2008-08-11 20:40:29 +00:00
|
|
|
|
|
|
|
/* figure the number of threads while preventing pretty pointless threading overhead */
|
2008-09-05 23:28:28 +00:00
|
|
|
if(G.scene->r.mode & R_FIXED_THREADS)
|
|
|
|
totthread= G.scene->r.threads;
|
|
|
|
else
|
|
|
|
totthread= BLI_system_thread_count();
|
|
|
|
/* what if we got zillions of CPUs running but less to spread*/
|
|
|
|
while ((totpoint/totthread < lowpoints) && (totthread > 1)) {
|
|
|
|
totthread--;
|
2008-08-11 20:40:29 +00:00
|
|
|
}
|
2008-09-05 23:28:28 +00:00
|
|
|
|
|
|
|
/* printf("sb_cf_threads_run spawning %d threads \n",totthread); */
|
2008-08-11 20:40:29 +00:00
|
|
|
|
|
|
|
sb_threads= MEM_callocN(sizeof(SB_thread_context)*totthread, "SBThread");
|
|
|
|
memset(sb_threads, 0, sizeof(SB_thread_context)*totthread);
|
|
|
|
left = totpoint;
|
|
|
|
dec = totpoint/totthread +1;
|
|
|
|
for(i=0; i<totthread; i++) {
|
|
|
|
sb_threads[i].ob = ob;
|
|
|
|
sb_threads[i].forcetime = forcetime;
|
|
|
|
sb_threads[i].timenow = timenow;
|
|
|
|
sb_threads[i].ilast = left;
|
|
|
|
left = left - dec;
|
|
|
|
if (left >0){
|
|
|
|
sb_threads[i].ifirst = left;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sb_threads[i].ifirst = 0;
|
|
|
|
sb_threads[i].do_effector = do_effector;
|
|
|
|
sb_threads[i].do_deflector = do_deflector;
|
|
|
|
sb_threads[i].fieldfactor = fieldfactor;
|
|
|
|
sb_threads[i].windfactor = windfactor;
|
|
|
|
sb_threads[i].nr= i;
|
|
|
|
sb_threads[i].tot= totthread;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(totthread > 1) {
|
|
|
|
BLI_init_threads(&threads, exec_softbody_calc_forces, totthread);
|
|
|
|
|
|
|
|
for(i=0; i<totthread; i++)
|
|
|
|
BLI_insert_thread(&threads, &sb_threads[i]);
|
|
|
|
|
|
|
|
BLI_end_threads(&threads);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
exec_softbody_calc_forces(&sb_threads[0]);
|
|
|
|
/* clean up */
|
|
|
|
MEM_freeN(sb_threads);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void softbody_calc_forcesEx(Object *ob, float forcetime, float timenow, int nl_flags)
|
|
|
|
{
|
|
|
|
/* rule we never alter free variables :bp->vec bp->pos in here !
|
|
|
|
* this will ruin adaptive stepsize AKA heun! (BM)
|
|
|
|
*/
|
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there */
|
|
|
|
BodyPoint *bproot;
|
|
|
|
ListBase *do_effector;
|
|
|
|
float iks, gravity;
|
|
|
|
float fieldfactor = 1000.0f, windfactor = 250.0f;
|
|
|
|
int do_deflector,do_selfcollision,do_springcollision,do_aero;
|
|
|
|
|
|
|
|
gravity = sb->grav * sb_grav_force_scale(ob);
|
|
|
|
|
|
|
|
/* check conditions for various options */
|
|
|
|
do_deflector= query_external_colliders(ob);
|
|
|
|
do_selfcollision=((ob->softflag & OB_SB_EDGES) && (sb->bspring)&& (ob->softflag & OB_SB_SELF));
|
|
|
|
do_springcollision=do_deflector && (ob->softflag & OB_SB_EDGES) &&(ob->softflag & OB_SB_EDGECOLL);
|
|
|
|
do_aero=((sb->aeroedge)&& (ob->softflag & OB_SB_EDGES));
|
|
|
|
|
|
|
|
iks = 1.0f/(1.0f-sb->inspring)-1.0f ;/* inner spring constants function */
|
|
|
|
bproot= sb->bpoint; /* need this for proper spring addressing */
|
|
|
|
|
|
|
|
if (do_springcollision || do_aero)
|
|
|
|
sb_sfesf_threads_run(ob,timenow,sb->totspring,NULL);
|
|
|
|
|
|
|
|
/* after spring scan because it uses Effoctors too */
|
|
|
|
do_effector= pdInitEffectors(ob,NULL);
|
The long awaited Particle patch from Janne Karhu
http://www.blender3d.org/cms/New_Particle_options_a.721.0.html
There's no doubt this patch had a lot of good ideas for features, and I
want to compliment Janne again for getting it all to work even!
A more careful review of the features and code did show however quite some
flaws and bugs... partially because the current particle code was very much
polluted already, but also because of the implementation lacked quality.
However, the patch was too good to reject, so I've fixed and recoded the
parts that needed it most. :)
Here's a list of of most evident changes in the patch;
- Guides support recoded. It was implemented as a true 'force field',
checking all Curve path points for each particle to find the closest. Was
just far too slow, and didn't support looping or bends well.
The new implementation is fast (real time) and treats the paths as actual
trajectory for the particle.
- Guides didn't integrate in the physics/speed system either, was added as
exception. Now it's integrated and can be combined with other velocities
or forces
- Use of Fields was slow code in general, made it use a Cache instead.
- The "even" distribution didn't work for Jittered sample patterns.
- The "even" or "vertexgroup" code in the main loops were badly constructed,
giving too much cpu for a simple task. Instead of going over all faces
many times, it now only does it once.
Same part of the code used a lot of temporal unneeded mallocs.
- Use of DerivedMesh or Mesh was confused, didn't work for Subsurfs in all
cases
- Support for vertex groups was slow, evaluating vertexgroups too often
- When a vertexgroup failed to read, it was wrongly handled (set to zero).
VertexGroup support now is with a name.
- Split up the too huge build_particle() call in some parts (moving new code)
- The "texture re-timing" option failed for moving Objects. The old code used
the convention that particles were added with increasing time steps.
Solved by creating a object Matrix Cache.
Also: the texture coordinates had to be corrected to become "OrCo".
- The "Disp" option only was used to draw less particles. Changed it to
actually calculate fewer particles for 3D viewing, but render all still.
So now it can be used to keep editing realtime.
Removed;
The "speed threshold" and "Tight" features were not copied over. This
resembled too much to feature overkill. Needs re-evaluation.
Also the "Deform" option was not added, I prefer to first check if the
current particle system really works for the Modifier system.
And:
- Added integration for particle force fields in the dependency graph
- Added TAB completion for vertexgroup names!
- Made the 'wait cursor' only appear when particles take more than 0.5 sec
- The particle jitter table order now is randomized too, giving much
nicer emitting of particles in large faces.
- Vortex field didn't correctly use speed/forces, so it didn't work for
collisions.
- Triangle distribution was wrong
- Removed ancient bug that applied in a *very* weird way speed and forces.
(location changes got the half force, speed the full...???)
So much... might have forgotten some notes! :)
2005-11-10 16:01:56 +00:00
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
if (do_deflector) {
|
|
|
|
float defforce[3];
|
|
|
|
do_deflector = sb_detect_aabb_collisionCached(defforce,ob->lay,ob,timenow);
|
|
|
|
}
|
|
|
|
|
|
|
|
sb_cf_threads_run(ob,forcetime,timenow,sb->totpoint,NULL,do_effector,do_deflector,fieldfactor,windfactor);
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
/* finally add forces caused by face collision */
|
2008-01-09 00:25:51 +00:00
|
|
|
if (ob->softflag & OB_SB_FACECOLL) scan_for_ext_face_forces(ob,timenow);
|
|
|
|
|
|
|
|
/* finish matrix and solve */
|
2008-08-11 20:40:29 +00:00
|
|
|
if(do_effector) pdEndEffectors(do_effector);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void softbody_calc_forces(Object *ob, float forcetime, float timenow, int nl_flags)
|
|
|
|
{
|
|
|
|
/* redirection to the new threaded Version */
|
2008-09-05 23:28:28 +00:00
|
|
|
if (!(G.rt & 0x10)){ // 16
|
2008-08-11 20:40:29 +00:00
|
|
|
softbody_calc_forcesEx(ob, forcetime, timenow, nl_flags);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
/* so the following will die */
|
|
|
|
/* |||||||||||||||||||||||||| */
|
|
|
|
/* VVVVVVVVVVVVVVVVVVVVVVVVVV */
|
2008-09-05 23:28:28 +00:00
|
|
|
/*backward compatibility note:
|
|
|
|
fixing bug [17428] which forces adaptive step size to tiny steps
|
|
|
|
in some situations
|
|
|
|
.. keeping G.rt==17 0x11 option for old files 'needing' the bug*/
|
2008-08-11 20:40:29 +00:00
|
|
|
|
|
|
|
/* rule we never alter free variables :bp->vec bp->pos in here !
|
|
|
|
* this will ruin adaptive stepsize AKA heun! (BM)
|
|
|
|
*/
|
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there */
|
|
|
|
BodyPoint *bp;
|
|
|
|
BodyPoint *bproot;
|
|
|
|
BodySpring *bs;
|
|
|
|
ListBase *do_effector;
|
|
|
|
float iks, ks, kd, gravity;
|
|
|
|
float fieldfactor = 1000.0f, windfactor = 250.0f;
|
|
|
|
float tune = sb->ballstiff;
|
|
|
|
int a, b, do_deflector,do_selfcollision,do_springcollision,do_aero;
|
|
|
|
|
|
|
|
|
|
|
|
/* jacobian
|
|
|
|
NLboolean success;
|
|
|
|
|
|
|
|
if(nl_flags){
|
|
|
|
nlBegin(NL_SYSTEM);
|
|
|
|
nlBegin(NL_MATRIX);
|
2008-01-09 00:25:51 +00:00
|
|
|
}
|
2008-08-11 20:40:29 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
gravity = sb->grav * sb_grav_force_scale(ob);
|
|
|
|
|
|
|
|
/* check conditions for various options */
|
|
|
|
do_deflector= query_external_colliders(ob);
|
|
|
|
do_selfcollision=((ob->softflag & OB_SB_EDGES) && (sb->bspring)&& (ob->softflag & OB_SB_SELF));
|
|
|
|
do_springcollision=do_deflector && (ob->softflag & OB_SB_EDGES) &&(ob->softflag & OB_SB_EDGECOLL);
|
|
|
|
do_aero=((sb->aeroedge)&& (ob->softflag & OB_SB_EDGES));
|
|
|
|
|
|
|
|
iks = 1.0f/(1.0f-sb->inspring)-1.0f ;/* inner spring constants function */
|
|
|
|
bproot= sb->bpoint; /* need this for proper spring addressing */
|
2008-01-09 00:25:51 +00:00
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
if (do_springcollision || do_aero) scan_for_ext_spring_forces(ob,timenow);
|
|
|
|
/* after spring scan because it uses Effoctors too */
|
|
|
|
do_effector= pdInitEffectors(ob,NULL);
|
|
|
|
|
|
|
|
if (do_deflector) {
|
|
|
|
float defforce[3];
|
|
|
|
do_deflector = sb_detect_aabb_collisionCached(defforce,ob->lay,ob,timenow);
|
2008-01-09 00:25:51 +00:00
|
|
|
}
|
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
|
|
|
/* clear forces accumulator */
|
|
|
|
bp->force[0]= bp->force[1]= bp->force[2]= 0.0;
|
|
|
|
if(nl_flags & NLF_BUILD){
|
|
|
|
//int ia =3*(sb->totpoint-a);
|
|
|
|
//int op =3*sb->totpoint;
|
|
|
|
/* dF/dV = v */
|
|
|
|
/* jacobioan
|
|
|
|
nlMatrixAdd(op+ia,ia,-forcetime);
|
|
|
|
nlMatrixAdd(op+ia+1,ia+1,-forcetime);
|
|
|
|
nlMatrixAdd(op+ia+2,ia+2,-forcetime);
|
|
|
|
|
|
|
|
nlMatrixAdd(ia,ia,1);
|
|
|
|
nlMatrixAdd(ia+1,ia+1,1);
|
|
|
|
nlMatrixAdd(ia+2,ia+2,1);
|
|
|
|
|
|
|
|
nlMatrixAdd(op+ia,op+ia,1);
|
|
|
|
nlMatrixAdd(op+ia+1,op+ia+1,1);
|
|
|
|
nlMatrixAdd(op+ia+2,op+ia+2,1);
|
|
|
|
*/
|
2008-01-09 00:25:51 +00:00
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/* naive ball self collision */
|
|
|
|
/* needs to be done if goal snaps or not */
|
|
|
|
if(do_selfcollision){
|
|
|
|
int attached;
|
|
|
|
BodyPoint *obp;
|
|
|
|
int c,b;
|
|
|
|
float velcenter[3],dvel[3],def[3];
|
|
|
|
float distance;
|
|
|
|
float compare;
|
|
|
|
|
|
|
|
for(c=sb->totpoint, obp= sb->bpoint; c>=a; c--, obp++) {
|
|
|
|
|
|
|
|
//if ((bp->octantflag & obp->octantflag) == 0) continue;
|
|
|
|
|
|
|
|
compare = (obp->colball + bp->colball);
|
|
|
|
VecSubf(def, bp->pos, obp->pos);
|
|
|
|
|
|
|
|
/* rather check the AABBoxes before ever calulating the real distance */
|
|
|
|
/* mathematically it is completly nuts, but performace is pretty much (3) times faster */
|
|
|
|
if ((ABS(def[0]) > compare) || (ABS(def[1]) > compare) || (ABS(def[2]) > compare)) continue;
|
|
|
|
|
|
|
|
distance = Normalize(def);
|
|
|
|
if (distance < compare ){
|
|
|
|
/* exclude body points attached with a spring */
|
|
|
|
attached = 0;
|
|
|
|
for(b=obp->nofsprings;b>0;b--){
|
|
|
|
bs = sb->bspring + obp->springs[b-1];
|
|
|
|
if (( sb->totpoint-a == bs->v2) || ( sb->totpoint-a == bs->v1)){
|
|
|
|
attached=1;
|
|
|
|
continue;}
|
|
|
|
}
|
|
|
|
if (!attached){
|
|
|
|
float f = tune/(distance) + tune/(compare*compare)*distance - 2.0f*tune/compare ;
|
|
|
|
|
|
|
|
VecMidf(velcenter, bp->vec, obp->vec);
|
|
|
|
VecSubf(dvel,velcenter,bp->vec);
|
|
|
|
VecMulf(dvel,sb->nodemass);
|
|
|
|
|
|
|
|
Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def);
|
|
|
|
Vec3PlusStVec(bp->force,sb->balldamp,dvel);
|
|
|
|
|
|
|
|
if(nl_flags & NLF_BUILD){
|
|
|
|
//int ia =3*(sb->totpoint-a);
|
|
|
|
//int ic =3*(sb->totpoint-c);
|
|
|
|
//int op =3*sb->totpoint;
|
|
|
|
//float mvel = forcetime*sb->nodemass*sb->balldamp;
|
|
|
|
//float mpos = forcetime*tune*(1.0f-sb->balldamp);
|
|
|
|
/*some quick and dirty entries to the jacobian*/
|
|
|
|
//dfdx_goal(ia,ia,op,mpos);
|
|
|
|
//dfdv_goal(ia,ia,mvel);
|
|
|
|
/* exploit force(a,b) == -force(b,a) part1/2 */
|
|
|
|
//dfdx_goal(ic,ic,op,mpos);
|
|
|
|
//dfdv_goal(ic,ic,mvel);
|
|
|
|
|
|
|
|
|
|
|
|
/*TODO sit down an X-out the true jacobian entries*/
|
|
|
|
/*well does not make to much sense because the eigenvalues
|
|
|
|
of the jacobian go negative; and negative eigenvalues
|
|
|
|
on a complex iterative system z(n+1)=A * z(n)
|
|
|
|
give imaginary roots in the charcateristic polynom
|
|
|
|
--> solutions that to z(t)=u(t)* exp ( i omega t) --> oscilations we don't want here
|
|
|
|
where u(t) is a unknown amplitude function (worst case rising fast)
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
|
|
|
|
/* exploit force(a,b) == -force(b,a) part2/2 */
|
|
|
|
VecSubf(dvel,velcenter,obp->vec);
|
|
|
|
VecMulf(dvel,sb->nodemass);
|
|
|
|
|
|
|
|
Vec3PlusStVec(obp->force,sb->balldamp,dvel);
|
|
|
|
Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
2008-01-09 00:25:51 +00:00
|
|
|
}
|
2008-08-11 20:40:29 +00:00
|
|
|
}
|
|
|
|
/* naive ball self collision done */
|
2008-01-09 00:25:51 +00:00
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
if(bp->goal < SOFTGOALSNAP){ /* ommit this bp when it snaps */
|
|
|
|
float auxvect[3];
|
|
|
|
float velgoal[3];
|
|
|
|
|
|
|
|
/* do goal stuff */
|
|
|
|
if(ob->softflag & OB_SB_GOAL) {
|
|
|
|
/* true elastic goal */
|
|
|
|
VecSubf(auxvect,bp->pos,bp->origT);
|
|
|
|
ks = 1.0f/(1.0f- bp->goal*sb->goalspring)-1.0f ;
|
|
|
|
bp->force[0]+= -ks*(auxvect[0]);
|
|
|
|
bp->force[1]+= -ks*(auxvect[1]);
|
|
|
|
bp->force[2]+= -ks*(auxvect[2]);
|
|
|
|
|
|
|
|
if(nl_flags & NLF_BUILD){
|
|
|
|
//int ia =3*(sb->totpoint-a);
|
|
|
|
//int op =3*(sb->totpoint);
|
|
|
|
/* depending on my pos */
|
|
|
|
//dfdx_goal(ia,ia,op,ks*forcetime);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* calulate damping forces generated by goals*/
|
|
|
|
VecSubf(velgoal,bp->origS, bp->origE);
|
|
|
|
kd = sb->goalfrict * sb_fric_force_scale(ob) ;
|
|
|
|
VecAddf(auxvect,velgoal,bp->vec);
|
|
|
|
|
|
|
|
if (forcetime > 0.0 ) { /* make sure friction does not become rocket motor on time reversal */
|
|
|
|
bp->force[0]-= kd * (auxvect[0]);
|
|
|
|
bp->force[1]-= kd * (auxvect[1]);
|
|
|
|
bp->force[2]-= kd * (auxvect[2]);
|
|
|
|
if(nl_flags & NLF_BUILD){
|
|
|
|
//int ia =3*(sb->totpoint-a);
|
|
|
|
Normalize(auxvect);
|
|
|
|
/* depending on my vel */
|
|
|
|
//dfdv_goal(ia,ia,kd*forcetime);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
bp->force[0]-= kd * (velgoal[0] - bp->vec[0]);
|
|
|
|
bp->force[1]-= kd * (velgoal[1] - bp->vec[1]);
|
|
|
|
bp->force[2]-= kd * (velgoal[2] - bp->vec[2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* done goal stuff */
|
|
|
|
|
|
|
|
|
|
|
|
/* gravitation */
|
|
|
|
bp->force[2]-= gravity*sb->nodemass; /* individual mass of node here */
|
|
|
|
//bp->force[1]-= gravity*sb->nodemass; /* individual mass of node here */
|
|
|
|
|
|
|
|
|
|
|
|
/* particle field & vortex */
|
|
|
|
if(do_effector) {
|
|
|
|
float force[3]= {0.0f, 0.0f, 0.0f};
|
|
|
|
float speed[3]= {0.0f, 0.0f, 0.0f};
|
|
|
|
float eval_sb_fric_force_scale = sb_fric_force_scale(ob); /* just for calling function once */
|
|
|
|
|
|
|
|
pdDoEffectors(do_effector, bp->pos, force, speed, (float)G.scene->r.cfra, 0.0f, PE_WIND_AS_SPEED);
|
|
|
|
|
|
|
|
/* apply forcefield*/
|
|
|
|
VecMulf(force,fieldfactor* eval_sb_fric_force_scale);
|
|
|
|
VECADD(bp->force, bp->force, force);
|
|
|
|
|
|
|
|
/* BP friction in moving media */
|
|
|
|
kd= sb->mediafrict* eval_sb_fric_force_scale;
|
|
|
|
bp->force[0] -= kd * (bp->vec[0] + windfactor*speed[0]/eval_sb_fric_force_scale);
|
|
|
|
bp->force[1] -= kd * (bp->vec[1] + windfactor*speed[1]/eval_sb_fric_force_scale);
|
|
|
|
bp->force[2] -= kd * (bp->vec[2] + windfactor*speed[2]/eval_sb_fric_force_scale);
|
|
|
|
/* now we'll have nice centrifugal effect for vortex */
|
|
|
|
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* BP friction in media (not) moving*/
|
|
|
|
kd= sb->mediafrict* sb_fric_force_scale(ob);
|
|
|
|
/* assume it to be proportional to actual velocity */
|
|
|
|
bp->force[0]-= bp->vec[0]*kd;
|
|
|
|
bp->force[1]-= bp->vec[1]*kd;
|
|
|
|
bp->force[2]-= bp->vec[2]*kd;
|
|
|
|
/* friction in media done */
|
|
|
|
if(nl_flags & NLF_BUILD){
|
|
|
|
//int ia =3*(sb->totpoint-a);
|
|
|
|
/* da/dv = */
|
|
|
|
|
|
|
|
// nlMatrixAdd(ia,ia,forcetime*kd);
|
|
|
|
// nlMatrixAdd(ia+1,ia+1,forcetime*kd);
|
|
|
|
// nlMatrixAdd(ia+2,ia+2,forcetime*kd);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
/* +++cached collision targets */
|
|
|
|
bp->choke = 0.0f;
|
|
|
|
bp->choke2 = 0.0f;
|
|
|
|
bp->flag &= ~SBF_DOFUZZY;
|
|
|
|
if(do_deflector) {
|
|
|
|
float cfforce[3],defforce[3] ={0.0f,0.0f,0.0f}, vel[3] = {0.0f,0.0f,0.0f}, facenormal[3], cf = 1.0f,intrusion;
|
|
|
|
kd = 1.0f;
|
|
|
|
|
|
|
|
if (sb_deflect_face(ob,bp->pos,facenormal,defforce,&cf,timenow,vel,&intrusion)){
|
|
|
|
if ((!nl_flags)&&(intrusion < 0.0f)){
|
2008-09-05 23:28:28 +00:00
|
|
|
if(G.rt & 0x01){ // 17 we did check for bit 0x10 before
|
|
|
|
/*fixing bug [17428] this forces adaptive step size to tiny steps
|
|
|
|
in some situations .. keeping G.rt==17 option for old files 'needing' the bug
|
|
|
|
*/
|
|
|
|
/*bjornmose: uugh.. what an evil hack
|
|
|
|
violation of the 'don't touch bp->pos in here' rule
|
|
|
|
but works nice, like this-->
|
|
|
|
we predict the solution beeing out of the collider
|
|
|
|
in heun step No1 and leave the heun step No2 adapt to it
|
|
|
|
so we kind of introduced a implicit solver for this case
|
|
|
|
*/
|
|
|
|
Vec3PlusStVec(bp->pos,-intrusion,facenormal);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
|
|
|
|
VECSUB(cfforce,bp->vec,vel);
|
|
|
|
Vec3PlusStVec(bp->force,-cf*50.0f,cfforce);
|
|
|
|
}
|
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
|
|
|
|
sb->scratch->flag |= SBF_DOFUZZY;
|
|
|
|
bp->flag |= SBF_DOFUZZY;
|
|
|
|
bp->choke = sb->choke*0.01f;
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
VECSUB(cfforce,bp->vec,vel);
|
|
|
|
Vec3PlusStVec(bp->force,-cf*50.0f,cfforce);
|
|
|
|
}
|
|
|
|
Vec3PlusStVec(bp->force,kd,defforce);
|
|
|
|
if (nl_flags & NLF_BUILD){
|
|
|
|
// int ia =3*(sb->totpoint-a);
|
|
|
|
// int op =3*sb->totpoint;
|
|
|
|
//dfdx_goal(ia,ia,op,mpos); // don't do unless you know
|
|
|
|
//dfdv_goal(ia,ia,-cf);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
/* ---cached collision targets */
|
|
|
|
|
|
|
|
/* +++springs */
|
|
|
|
if(ob->softflag & OB_SB_EDGES) {
|
|
|
|
if (sb->bspring){ /* spring list exists at all ? */
|
|
|
|
for(b=bp->nofsprings;b>0;b--){
|
|
|
|
bs = sb->bspring + bp->springs[b-1];
|
|
|
|
if (do_springcollision || do_aero){
|
|
|
|
VecAddf(bp->force,bp->force,bs->ext_force);
|
|
|
|
if (bs->flag & BSF_INTERSECT)
|
|
|
|
bp->choke = bs->cf;
|
|
|
|
|
|
|
|
}
|
|
|
|
// sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float forcetime,int nl_flags)
|
|
|
|
// rather remove nl_falgs from code .. will make things a lot cleaner
|
|
|
|
sb_spring_force(ob,sb->totpoint-a,bs,iks,forcetime,0);
|
|
|
|
}/* loop springs */
|
|
|
|
}/* existing spring list */
|
|
|
|
}/*any edges*/
|
|
|
|
/* ---springs */
|
|
|
|
}/*omit on snap */
|
|
|
|
}/*loop all bp's*/
|
|
|
|
|
|
|
|
|
|
|
|
/* finally add forces caused by face collision */
|
|
|
|
if (ob->softflag & OB_SB_FACECOLL) scan_for_ext_face_forces(ob,timenow);
|
|
|
|
|
|
|
|
/* finish matrix and solve */
|
|
|
|
#if (0) // remove onl linking for now .. still i am not sure .. the jacobian can be usefull .. so keep that BM
|
|
|
|
if(nl_flags & NLF_SOLVE){
|
|
|
|
//double sct,sst=PIL_check_seconds_timer();
|
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
|
|
|
int iv =3*(sb->totpoint-a);
|
|
|
|
int ip =3*(2*sb->totpoint-a);
|
|
|
|
int n;
|
|
|
|
for (n=0;n<3;n++) {nlRightHandSideSet(0, iv+n, bp->force[0+n]);}
|
|
|
|
for (n=0;n<3;n++) {nlRightHandSideSet(0, ip+n, bp->vec[0+n]);}
|
|
|
|
}
|
|
|
|
nlEnd(NL_MATRIX);
|
|
|
|
nlEnd(NL_SYSTEM);
|
|
|
|
|
|
|
|
if ((G.rt == 32) && (nl_flags & NLF_BUILD))
|
|
|
|
{
|
|
|
|
printf("####MEE#####\n");
|
|
|
|
nlPrintMatrix();
|
|
|
|
}
|
|
|
|
|
|
|
|
success= nlSolveAdvanced(NULL, 1);
|
|
|
|
|
|
|
|
// nlPrintMatrix(); /* for debug purpose .. anyhow cropping B vector looks like working */
|
|
|
|
if(success){
|
|
|
|
float f;
|
|
|
|
int index =0;
|
|
|
|
/* for debug purpose .. anyhow cropping B vector looks like working */
|
|
|
|
if (G.rt ==32)
|
|
|
|
for(a=2*sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
|
|
|
f=nlGetVariable(0,index);
|
|
|
|
printf("(%f ",f);index++;
|
|
|
|
f=nlGetVariable(0,index);
|
|
|
|
printf("%f ",f);index++;
|
|
|
|
f=nlGetVariable(0,index);
|
|
|
|
printf("%f)",f);index++;
|
|
|
|
}
|
|
|
|
|
|
|
|
index =0;
|
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
|
|
|
f=nlGetVariable(0,index);
|
|
|
|
bp->impdv[0] = f; index++;
|
|
|
|
f=nlGetVariable(0,index);
|
|
|
|
bp->impdv[1] = f; index++;
|
|
|
|
f=nlGetVariable(0,index);
|
|
|
|
bp->impdv[2] = f; index++;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
2008-01-09 00:25:51 +00:00
|
|
|
f=nlGetVariable(0,index);
|
2008-08-11 20:40:29 +00:00
|
|
|
bp->impdx[0] = f; index++;
|
2008-01-09 00:25:51 +00:00
|
|
|
f=nlGetVariable(0,index);
|
2008-08-11 20:40:29 +00:00
|
|
|
bp->impdx[1] = f; index++;
|
2008-01-09 00:25:51 +00:00
|
|
|
f=nlGetVariable(0,index);
|
2008-08-11 20:40:29 +00:00
|
|
|
bp->impdx[2] = f; index++;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
printf("Matrix inversion failed \n");
|
2008-01-09 00:25:51 +00:00
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
2008-08-11 20:40:29 +00:00
|
|
|
VECCOPY(bp->impdv,bp->force);
|
2008-01-09 00:25:51 +00:00
|
|
|
}
|
2008-08-11 20:40:29 +00:00
|
|
|
|
2008-01-09 00:25:51 +00:00
|
|
|
}
|
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
//sct=PIL_check_seconds_timer();
|
|
|
|
//if (sct-sst > 0.01f) printf(" implicit solver time %f %s \r",sct-sst,ob->id.name);
|
2008-01-09 00:25:51 +00:00
|
|
|
}
|
2008-08-11 20:40:29 +00:00
|
|
|
/* cleanup */
|
2008-02-16 00:07:05 +00:00
|
|
|
#endif
|
2008-08-11 20:40:29 +00:00
|
|
|
if(do_effector) pdEndEffectors(do_effector);
|
|
|
|
}
|
2004-10-01 14:10:30 +00:00
|
|
|
}
|
2008-08-11 20:40:29 +00:00
|
|
|
|
2008-01-09 00:25:51 +00:00
|
|
|
static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *err, int mid_flags)
|
2004-10-01 14:10:30 +00:00
|
|
|
{
|
2005-01-12 22:28:13 +00:00
|
|
|
/* time evolution */
|
|
|
|
/* actually does an explicit euler step mode == 0 */
|
|
|
|
/* or heun ~ 2nd order runge-kutta steps, mode 1,2 */
|
2005-11-19 21:35:06 +00:00
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there */
|
2004-10-01 14:10:30 +00:00
|
|
|
BodyPoint *bp;
|
2006-11-10 23:09:16 +00:00
|
|
|
float dx[3],dv[3],aabbmin[3],aabbmax[3],cm[3]={0.0f,0.0f,0.0f};
|
2008-02-25 04:38:48 +00:00
|
|
|
float timeovermass/*,freezeloc=0.00001f,freezeforce=0.00000000001f*/;
|
2006-11-10 23:09:16 +00:00
|
|
|
float maxerrpos= 0.0f,maxerrvel = 0.0f;
|
|
|
|
int a,fuzzy=0;
|
2005-04-12 21:36:21 +00:00
|
|
|
|
|
|
|
forcetime *= sb_time_scale(ob);
|
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
aabbmin[0]=aabbmin[1]=aabbmin[2] = 1e20f;
|
|
|
|
aabbmax[0]=aabbmax[1]=aabbmax[2] = -1e20f;
|
|
|
|
|
2005-11-19 21:35:06 +00:00
|
|
|
/* claim a minimum mass for vertex */
|
2006-11-16 20:57:02 +00:00
|
|
|
if (sb->nodemass > 0.009999f) timeovermass = forcetime/sb->nodemass;
|
|
|
|
else timeovermass = forcetime/0.009999f;
|
2004-10-01 14:10:30 +00:00
|
|
|
|
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
2005-01-12 22:28:13 +00:00
|
|
|
if(bp->goal < SOFTGOALSNAP){
|
2008-01-31 23:00:08 +00:00
|
|
|
/* this makes t~ = t */
|
|
|
|
if(mid_flags & MID_PRESERVE) VECCOPY(dx,bp->vec);
|
2005-01-12 22:28:13 +00:00
|
|
|
|
2005-04-05 20:28:32 +00:00
|
|
|
/* so here is (v)' = a(cceleration) = sum(F_springs)/m + gravitation + some friction forces + more forces*/
|
2005-04-16 14:01:49 +00:00
|
|
|
/* the ( ... )' operator denotes derivate respective time */
|
2005-01-12 22:28:13 +00:00
|
|
|
/* the euler step for velocity then becomes */
|
|
|
|
/* v(t + dt) = v(t) + a(t) * dt */
|
2008-01-31 23:00:08 +00:00
|
|
|
VecMulf(bp->force,timeovermass);/* individual mass of node here */
|
2005-01-12 22:28:13 +00:00
|
|
|
/* some nasty if's to have heun in here too */
|
|
|
|
VECCOPY(dv,bp->force);
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
if (mode == 1){
|
2005-04-02 13:57:23 +00:00
|
|
|
VECCOPY(bp->prevvec, bp->vec);
|
|
|
|
VECCOPY(bp->prevdv, dv);
|
2005-01-12 22:28:13 +00:00
|
|
|
}
|
2007-10-18 22:47:55 +00:00
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
if (mode ==2){
|
|
|
|
/* be optimistic and execute step */
|
|
|
|
bp->vec[0] = bp->prevvec[0] + 0.5f * (dv[0] + bp->prevdv[0]);
|
|
|
|
bp->vec[1] = bp->prevvec[1] + 0.5f * (dv[1] + bp->prevdv[1]);
|
|
|
|
bp->vec[2] = bp->prevvec[2] + 0.5f * (dv[2] + bp->prevdv[2]);
|
|
|
|
/* compare euler to heun to estimate error for step sizing */
|
2006-11-10 23:09:16 +00:00
|
|
|
maxerrvel = MAX2(maxerrvel,ABS(dv[0] - bp->prevdv[0]));
|
|
|
|
maxerrvel = MAX2(maxerrvel,ABS(dv[1] - bp->prevdv[1]));
|
|
|
|
maxerrvel = MAX2(maxerrvel,ABS(dv[2] - bp->prevdv[2]));
|
2005-01-12 22:28:13 +00:00
|
|
|
}
|
|
|
|
else {VECADD(bp->vec, bp->vec, bp->force);}
|
|
|
|
|
2008-01-31 23:00:08 +00:00
|
|
|
/* this makes t~ = t+dt */
|
|
|
|
if(!(mid_flags & MID_PRESERVE)) VECCOPY(dx,bp->vec);
|
|
|
|
|
2005-04-05 20:28:32 +00:00
|
|
|
/* so here is (x)'= v(elocity) */
|
2005-01-12 22:28:13 +00:00
|
|
|
/* the euler step for location then becomes */
|
2008-01-31 23:00:08 +00:00
|
|
|
/* x(t + dt) = x(t) + v(t~) * dt */
|
|
|
|
VecMulf(dx,forcetime);
|
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
/* the freezer coming sooner or later */
|
2008-02-17 20:13:58 +00:00
|
|
|
/*
|
2008-01-31 23:00:08 +00:00
|
|
|
if ((Inpf(dx,dx)<freezeloc )&&(Inpf(bp->force,bp->force)<freezeforce )){
|
|
|
|
bp->frozen /=2;
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
bp->frozen =MIN2(bp->frozen*1.05f,1.0f);
|
|
|
|
}
|
|
|
|
VecMulf(dx,bp->frozen);
|
2008-02-17 20:13:58 +00:00
|
|
|
*/
|
2005-01-12 22:28:13 +00:00
|
|
|
/* again some nasty if's to have heun in here too */
|
|
|
|
if (mode ==1){
|
|
|
|
VECCOPY(bp->prevpos,bp->pos);
|
|
|
|
VECCOPY(bp->prevdx ,dx);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mode ==2){
|
|
|
|
bp->pos[0] = bp->prevpos[0] + 0.5f * ( dx[0] + bp->prevdx[0]);
|
|
|
|
bp->pos[1] = bp->prevpos[1] + 0.5f * ( dx[1] + bp->prevdx[1]);
|
2008-01-31 23:00:08 +00:00
|
|
|
bp->pos[2] = bp->prevpos[2] + 0.5f * ( dx[2] + bp->prevdx[2]);
|
2006-11-10 23:09:16 +00:00
|
|
|
maxerrpos = MAX2(maxerrpos,ABS(dx[0] - bp->prevdx[0]));
|
|
|
|
maxerrpos = MAX2(maxerrpos,ABS(dx[1] - bp->prevdx[1]));
|
|
|
|
maxerrpos = MAX2(maxerrpos,ABS(dx[2] - bp->prevdx[2]));
|
|
|
|
|
|
|
|
/* bp->choke is set when we need to pull a vertex or edge out of the collider.
|
|
|
|
the collider object signals to get out by pushing hard. on the other hand
|
|
|
|
we don't want to end up in deep space so we add some <viscosity>
|
|
|
|
to balance that out */
|
2008-01-31 23:00:08 +00:00
|
|
|
if (bp->choke2 > 0.0f){
|
|
|
|
VecMulf(bp->vec,(1.0f - bp->choke2));
|
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
if (bp->choke > 0.0f){
|
2008-01-31 23:00:08 +00:00
|
|
|
VecMulf(bp->vec,(1.0f - bp->choke));
|
2005-04-12 21:36:21 +00:00
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2005-04-12 21:36:21 +00:00
|
|
|
}
|
2005-04-18 21:51:45 +00:00
|
|
|
else { VECADD(bp->pos, bp->pos, dx);}
|
2005-11-19 21:35:06 +00:00
|
|
|
}/*snap*/
|
2006-11-10 23:09:16 +00:00
|
|
|
/* so while we are looping BPs anyway do statistics on the fly */
|
|
|
|
aabbmin[0] = MIN2(aabbmin[0],bp->pos[0]);
|
|
|
|
aabbmin[1] = MIN2(aabbmin[1],bp->pos[1]);
|
|
|
|
aabbmin[2] = MIN2(aabbmin[2],bp->pos[2]);
|
|
|
|
aabbmax[0] = MAX2(aabbmax[0],bp->pos[0]);
|
|
|
|
aabbmax[1] = MAX2(aabbmax[1],bp->pos[1]);
|
|
|
|
aabbmax[2] = MAX2(aabbmax[2],bp->pos[2]);
|
|
|
|
if (bp->flag & SBF_DOFUZZY) fuzzy =1;
|
2005-11-19 21:35:06 +00:00
|
|
|
} /*for*/
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
if (sb->totpoint) VecMulf(cm,1.0f/sb->totpoint);
|
|
|
|
if (sb->scratch){
|
|
|
|
VECCOPY(sb->scratch->aabbmin,aabbmin);
|
|
|
|
VECCOPY(sb->scratch->aabbmax,aabbmax);
|
|
|
|
}
|
The long awaited Particle patch from Janne Karhu
http://www.blender3d.org/cms/New_Particle_options_a.721.0.html
There's no doubt this patch had a lot of good ideas for features, and I
want to compliment Janne again for getting it all to work even!
A more careful review of the features and code did show however quite some
flaws and bugs... partially because the current particle code was very much
polluted already, but also because of the implementation lacked quality.
However, the patch was too good to reject, so I've fixed and recoded the
parts that needed it most. :)
Here's a list of of most evident changes in the patch;
- Guides support recoded. It was implemented as a true 'force field',
checking all Curve path points for each particle to find the closest. Was
just far too slow, and didn't support looping or bends well.
The new implementation is fast (real time) and treats the paths as actual
trajectory for the particle.
- Guides didn't integrate in the physics/speed system either, was added as
exception. Now it's integrated and can be combined with other velocities
or forces
- Use of Fields was slow code in general, made it use a Cache instead.
- The "even" distribution didn't work for Jittered sample patterns.
- The "even" or "vertexgroup" code in the main loops were badly constructed,
giving too much cpu for a simple task. Instead of going over all faces
many times, it now only does it once.
Same part of the code used a lot of temporal unneeded mallocs.
- Use of DerivedMesh or Mesh was confused, didn't work for Subsurfs in all
cases
- Support for vertex groups was slow, evaluating vertexgroups too often
- When a vertexgroup failed to read, it was wrongly handled (set to zero).
VertexGroup support now is with a name.
- Split up the too huge build_particle() call in some parts (moving new code)
- The "texture re-timing" option failed for moving Objects. The old code used
the convention that particles were added with increasing time steps.
Solved by creating a object Matrix Cache.
Also: the texture coordinates had to be corrected to become "OrCo".
- The "Disp" option only was used to draw less particles. Changed it to
actually calculate fewer particles for 3D viewing, but render all still.
So now it can be used to keep editing realtime.
Removed;
The "speed threshold" and "Tight" features were not copied over. This
resembled too much to feature overkill. Needs re-evaluation.
Also the "Deform" option was not added, I prefer to first check if the
current particle system really works for the Modifier system.
And:
- Added integration for particle force fields in the dependency graph
- Added TAB completion for vertexgroup names!
- Made the 'wait cursor' only appear when particles take more than 0.5 sec
- The particle jitter table order now is randomized too, giving much
nicer emitting of particles in large faces.
- Vortex field didn't correctly use speed/forces, so it didn't work for
collisions.
- Triangle distribution was wrong
- Removed ancient bug that applied in a *very* weird way speed and forces.
(location changes got the half force, speed the full...???)
So much... might have forgotten some notes! :)
2005-11-10 16:01:56 +00:00
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
if (err){ /* so step size will be controlled by biggest difference in slope */
|
2006-11-16 20:57:02 +00:00
|
|
|
if (sb->solverflags & SBSO_OLDERR)
|
2006-11-10 23:09:16 +00:00
|
|
|
*err = MAX2(maxerrpos,maxerrvel);
|
2006-11-16 20:57:02 +00:00
|
|
|
else
|
|
|
|
*err = maxerrpos;
|
2006-11-10 23:09:16 +00:00
|
|
|
//printf("EP %f EV %f \n",maxerrpos,maxerrvel);
|
|
|
|
if (fuzzy){
|
|
|
|
*err /= sb->fuzzyness;
|
|
|
|
}
|
2004-10-01 14:10:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
/* used by heun when it overshoots */
|
|
|
|
static void softbody_restore_prev_step(Object *ob)
|
|
|
|
{
|
2005-11-19 21:35:06 +00:00
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there*/
|
2005-01-12 22:28:13 +00:00
|
|
|
BodyPoint *bp;
|
2004-10-01 14:10:30 +00:00
|
|
|
int a;
|
|
|
|
|
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
2005-04-02 13:57:23 +00:00
|
|
|
VECCOPY(bp->vec, bp->prevvec);
|
|
|
|
VECCOPY(bp->pos, bp->prevpos);
|
2005-01-12 22:28:13 +00:00
|
|
|
}
|
|
|
|
}
|
2005-04-02 13:57:23 +00:00
|
|
|
|
2008-02-25 04:38:48 +00:00
|
|
|
#if 0
|
2008-01-09 00:25:51 +00:00
|
|
|
static void softbody_store_step(Object *ob)
|
|
|
|
{
|
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there*/
|
|
|
|
BodyPoint *bp;
|
|
|
|
int a;
|
|
|
|
|
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
|
|
|
VECCOPY(bp->prevvec,bp->vec);
|
|
|
|
VECCOPY(bp->prevpos,bp->pos);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* used by predictors and correctors */
|
|
|
|
static void softbody_store_state(Object *ob,float *ppos,float *pvel)
|
|
|
|
{
|
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there*/
|
|
|
|
BodyPoint *bp;
|
|
|
|
int a;
|
|
|
|
float *pp=ppos,*pv=pvel;
|
|
|
|
|
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
|
|
|
|
|
|
|
VECCOPY(pv, bp->vec);
|
|
|
|
pv+=3;
|
|
|
|
|
|
|
|
VECCOPY(pp, bp->pos);
|
|
|
|
pp+=3;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* used by predictors and correctors */
|
|
|
|
static void softbody_retrieve_state(Object *ob,float *ppos,float *pvel)
|
|
|
|
{
|
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there*/
|
|
|
|
BodyPoint *bp;
|
|
|
|
int a;
|
|
|
|
float *pp=ppos,*pv=pvel;
|
|
|
|
|
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
|
|
|
|
|
|
|
VECCOPY(bp->vec,pv);
|
|
|
|
pv+=3;
|
|
|
|
|
|
|
|
VECCOPY(bp->pos,pp);
|
|
|
|
pp+=3;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* used by predictors and correctors */
|
|
|
|
static void softbody_swap_state(Object *ob,float *ppos,float *pvel)
|
|
|
|
{
|
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there*/
|
|
|
|
BodyPoint *bp;
|
|
|
|
int a;
|
|
|
|
float *pp=ppos,*pv=pvel;
|
|
|
|
float temp[3];
|
|
|
|
|
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
|
|
|
|
|
|
|
VECCOPY(temp, bp->vec);
|
|
|
|
VECCOPY(bp->vec,pv);
|
|
|
|
VECCOPY(pv,temp);
|
|
|
|
pv+=3;
|
|
|
|
|
|
|
|
VECCOPY(temp, bp->pos);
|
|
|
|
VECCOPY(bp->pos,pp);
|
|
|
|
VECCOPY(pp,temp);
|
|
|
|
pp+=3;
|
|
|
|
}
|
|
|
|
}
|
2008-02-25 04:38:48 +00:00
|
|
|
#endif
|
2008-01-09 00:25:51 +00:00
|
|
|
|
|
|
|
|
2006-01-31 22:48:41 +00:00
|
|
|
/* care for bodypoints taken out of the 'ordinary' solver step
|
|
|
|
** because they are screwed to goal by bolts
|
|
|
|
** they just need to move along with the goal in time
|
|
|
|
** we need to adjust them on sub frame timing in solver
|
|
|
|
** so now when frame is done .. put 'em to the position at the end of frame
|
|
|
|
*/
|
2005-01-12 22:28:13 +00:00
|
|
|
static void softbody_apply_goalsnap(Object *ob)
|
|
|
|
{
|
2005-11-19 21:35:06 +00:00
|
|
|
SoftBody *sb= ob->soft; /* is supposed to be there */
|
2005-01-12 22:28:13 +00:00
|
|
|
BodyPoint *bp;
|
|
|
|
int a;
|
|
|
|
|
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
|
|
|
if (bp->goal >= SOFTGOALSNAP){
|
|
|
|
VECCOPY(bp->prevpos,bp->pos);
|
|
|
|
VECCOPY(bp->pos,bp->origT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-02-01 23:20:29 +00:00
|
|
|
|
2008-09-29 17:08:11 +00:00
|
|
|
static void apply_spring_memory(Object *ob)
|
2008-02-01 23:20:29 +00:00
|
|
|
{
|
|
|
|
SoftBody *sb = ob->soft;
|
|
|
|
BodySpring *bs;
|
|
|
|
BodyPoint *bp1, *bp2;
|
|
|
|
int a;
|
|
|
|
float b,l,r;
|
|
|
|
|
|
|
|
b = sb->plastic;
|
|
|
|
if (sb && sb->totspring){
|
|
|
|
for(a=0; a<sb->totspring; a++) {
|
|
|
|
bs = &sb->bspring[a];
|
|
|
|
bp1 =&sb->bpoint[bs->v1];
|
|
|
|
bp2 =&sb->bpoint[bs->v2];
|
|
|
|
l = VecLenf(bp1->pos,bp2->pos);
|
|
|
|
r = bs->len/l;
|
|
|
|
if (( r > 1.05f) || (r < 0.95)){
|
|
|
|
bs->len = ((100.0f - b) * bs->len + b*l)/100.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
/* expects full initialized softbody */
|
2005-01-12 22:28:13 +00:00
|
|
|
static void interpolate_exciter(Object *ob, int timescale, int time)
|
|
|
|
{
|
2005-04-02 13:57:23 +00:00
|
|
|
SoftBody *sb= ob->soft;
|
2005-01-12 22:28:13 +00:00
|
|
|
BodyPoint *bp;
|
|
|
|
float f;
|
2005-04-02 13:57:23 +00:00
|
|
|
int a;
|
2005-01-12 22:28:13 +00:00
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
f = (float)time/(float)timescale;
|
|
|
|
|
|
|
|
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
|
|
|
|
bp->origT[0] = bp->origS[0] + f*(bp->origE[0] - bp->origS[0]);
|
|
|
|
bp->origT[1] = bp->origS[1] + f*(bp->origE[1] - bp->origS[1]);
|
|
|
|
bp->origT[2] = bp->origS[2] + f*(bp->origE[2] - bp->origS[2]);
|
|
|
|
if (bp->goal >= SOFTGOALSNAP){
|
|
|
|
bp->vec[0] = bp->origE[0] - bp->origS[0];
|
|
|
|
bp->vec[1] = bp->origE[1] - bp->origS[1];
|
|
|
|
bp->vec[2] = bp->origE[2] - bp->origS[2];
|
2005-01-12 22:28:13 +00:00
|
|
|
}
|
2005-04-02 13:57:23 +00:00
|
|
|
}
|
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
}
|
|
|
|
|
2004-10-01 14:10:30 +00:00
|
|
|
|
|
|
|
/* ************ convertors ********** */
|
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
/* for each object type we need;
|
2005-08-15 10:30:53 +00:00
|
|
|
- xxxx_to_softbody(Object *ob) : a full (new) copy, creates SB geometry
|
2005-04-02 13:57:23 +00:00
|
|
|
*/
|
|
|
|
|
2005-04-16 14:01:49 +00:00
|
|
|
static void get_scalar_from_vertexgroup(Object *ob, int vertID, short groupindex, float *target)
|
2005-01-12 22:28:13 +00:00
|
|
|
/* result 0 on success, else indicates error number
|
|
|
|
-- kind of *inverse* result defintion,
|
|
|
|
-- but this way we can signal error condition to caller
|
|
|
|
-- and yes this function must not be here but in a *vertex group module*
|
|
|
|
*/
|
|
|
|
{
|
2006-09-03 12:16:14 +00:00
|
|
|
MDeformVert *dv= NULL;
|
2005-04-16 14:01:49 +00:00
|
|
|
int i;
|
2005-04-02 13:57:23 +00:00
|
|
|
|
2005-04-16 14:01:49 +00:00
|
|
|
/* spot the vert in deform vert list at mesh */
|
|
|
|
if(ob->type==OB_MESH) {
|
2006-09-03 12:16:14 +00:00
|
|
|
Mesh *me= ob->data;
|
|
|
|
if (me->dvert)
|
|
|
|
dv = me->dvert + vertID;
|
|
|
|
}
|
|
|
|
else if(ob->type==OB_LATTICE) { /* not yet supported in softbody btw */
|
|
|
|
Lattice *lt= ob->data;
|
|
|
|
if (lt->dvert)
|
|
|
|
dv = lt->dvert + vertID;
|
|
|
|
}
|
|
|
|
if(dv) {
|
|
|
|
/* Lets see if this vert is in the weight group */
|
|
|
|
for (i=0; i<dv->totweight; i++){
|
|
|
|
if (dv->dw[i].def_nr == groupindex){
|
|
|
|
*target= dv->dw[i].weight; /* got it ! */
|
|
|
|
break;
|
2005-01-12 22:28:13 +00:00
|
|
|
}
|
2005-01-13 13:58:29 +00:00
|
|
|
}
|
2005-04-16 14:01:49 +00:00
|
|
|
}
|
2005-01-12 22:28:13 +00:00
|
|
|
}
|
|
|
|
|
2005-10-24 22:13:32 +00:00
|
|
|
/* Resetting a Mesh SB object's springs */
|
|
|
|
/* Spring lenght are caculted from'raw' mesh vertices that are NOT altered by modifier stack. */
|
2005-10-21 22:58:12 +00:00
|
|
|
static void springs_from_mesh(Object *ob)
|
|
|
|
{
|
|
|
|
SoftBody *sb;
|
|
|
|
Mesh *me= ob->data;
|
|
|
|
BodyPoint *bp;
|
|
|
|
int a;
|
2007-10-18 22:47:55 +00:00
|
|
|
float scale =1.0f;
|
2005-10-21 22:58:12 +00:00
|
|
|
|
|
|
|
sb= ob->soft;
|
|
|
|
if (me && sb)
|
|
|
|
{
|
|
|
|
/* using bp->origS as a container for spring calcualtions here
|
|
|
|
** will be overwritten sbObjectStep() to receive
|
|
|
|
** actual modifier stack positions
|
|
|
|
*/
|
|
|
|
if(me->totvert) {
|
|
|
|
bp= ob->soft->bpoint;
|
|
|
|
for(a=0; a<me->totvert; a++, bp++) {
|
|
|
|
VECCOPY(bp->origS, me->mvert[a].co);
|
|
|
|
Mat4MulVecfl(ob->obmat, bp->origS);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
/* recalculate spring length for meshes here */
|
2008-04-05 21:29:17 +00:00
|
|
|
/* public version shrink to fit */
|
|
|
|
if (sb->springpreload != 0 ){
|
|
|
|
scale = sb->springpreload / 100.0f;
|
|
|
|
}
|
2005-10-21 22:58:12 +00:00
|
|
|
for(a=0; a<sb->totspring; a++) {
|
|
|
|
BodySpring *bs = &sb->bspring[a];
|
2007-10-18 22:47:55 +00:00
|
|
|
bs->len= scale*VecLenf(sb->bpoint[bs->v1].origS, sb->bpoint[bs->v2].origS);
|
2005-10-21 22:58:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-10-01 14:10:30 +00:00
|
|
|
/* makes totally fresh start situation */
|
2005-11-19 18:19:41 +00:00
|
|
|
static void mesh_to_softbody(Object *ob)
|
2004-10-01 14:10:30 +00:00
|
|
|
{
|
2005-04-02 13:57:23 +00:00
|
|
|
SoftBody *sb;
|
2004-10-01 14:10:30 +00:00
|
|
|
Mesh *me= ob->data;
|
|
|
|
MEdge *medge= me->medge;
|
|
|
|
BodyPoint *bp;
|
|
|
|
BodySpring *bs;
|
2005-04-02 19:52:32 +00:00
|
|
|
float goalfac;
|
2005-04-03 20:13:10 +00:00
|
|
|
int a, totedge;
|
|
|
|
if (ob->softflag & OB_SB_EDGES) totedge= me->totedge;
|
|
|
|
else totedge= 0;
|
2004-10-01 14:10:30 +00:00
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
/* renew ends with ob->soft with points and edges, also checks & makes ob->soft */
|
2005-11-19 18:19:41 +00:00
|
|
|
renew_softbody(ob, me->totvert, totedge);
|
2005-04-02 19:52:32 +00:00
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
/* we always make body points */
|
|
|
|
sb= ob->soft;
|
|
|
|
bp= sb->bpoint;
|
2005-04-02 19:52:32 +00:00
|
|
|
goalfac= ABS(sb->maxgoal - sb->mingoal);
|
|
|
|
|
2005-07-19 04:27:43 +00:00
|
|
|
for(a=0; a<me->totvert; a++, bp++) {
|
2005-04-16 14:01:49 +00:00
|
|
|
/* get scalar values needed *per vertex* from vertex group functions,
|
|
|
|
so we can *paint* them nicly ..
|
|
|
|
they are normalized [0.0..1.0] so may be we need amplitude for scale
|
|
|
|
which can be done by caller but still .. i'd like it to go this way
|
|
|
|
*/
|
2005-05-20 12:15:50 +00:00
|
|
|
|
|
|
|
if((ob->softflag & OB_SB_GOAL) && sb->vertgroup) {
|
2005-10-24 22:13:32 +00:00
|
|
|
get_scalar_from_vertexgroup(ob, a,(short) (sb->vertgroup-1), &bp->goal);
|
2005-11-19 21:35:06 +00:00
|
|
|
/* do this always, regardless successfull read from vertex group */
|
2005-04-16 14:01:49 +00:00
|
|
|
bp->goal= sb->mingoal + bp->goal*goalfac;
|
|
|
|
}
|
|
|
|
/* a little ad hoc changing the goal control to be less *sharp* */
|
|
|
|
bp->goal = (float)pow(bp->goal, 4.0f);
|
2005-04-02 15:55:15 +00:00
|
|
|
|
2005-04-16 14:01:49 +00:00
|
|
|
/* to proove the concept
|
|
|
|
this would enable per vertex *mass painting*
|
|
|
|
strcpy(name,"SOFTMASS");
|
2005-07-19 20:29:22 +00:00
|
|
|
error = get_scalar_from_named_vertexgroup(ob,name, a,&temp);
|
2005-04-16 14:01:49 +00:00
|
|
|
if (!error) bp->mass = temp * ob->rangeofmass;
|
|
|
|
*/
|
2005-04-02 13:57:23 +00:00
|
|
|
}
|
2005-01-12 22:28:13 +00:00
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
/* but we only optionally add body edge springs */
|
|
|
|
if (ob->softflag & OB_SB_EDGES) {
|
2004-10-01 14:10:30 +00:00
|
|
|
if(medge) {
|
2005-04-02 13:57:23 +00:00
|
|
|
bs= sb->bspring;
|
2004-10-01 14:10:30 +00:00
|
|
|
for(a=me->totedge; a>0; a--, medge++, bs++) {
|
|
|
|
bs->v1= medge->v1;
|
|
|
|
bs->v2= medge->v2;
|
|
|
|
bs->strength= 1.0;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order=1;
|
2004-10-01 14:10:30 +00:00
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
|
|
|
|
|
2005-04-03 20:13:10 +00:00
|
|
|
/* insert *diagonal* springs in quads if desired */
|
|
|
|
if (ob->softflag & OB_SB_QUADS) {
|
|
|
|
add_mesh_quad_diag_springs(ob);
|
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2005-10-21 22:58:12 +00:00
|
|
|
build_bps_springlist(ob); /* scan for springs attached to bodypoints ONCE */
|
2006-09-26 12:53:57 +00:00
|
|
|
/* insert *other second order* springs if desired */
|
|
|
|
if (sb->secondspring > 0.0000001f) {
|
|
|
|
add_2nd_order_springs(ob,sb->secondspring); /* exploits the the first run of build_bps_springlist(ob);*/
|
|
|
|
build_bps_springlist(ob); /* yes we need to do it again*/
|
|
|
|
}
|
2005-10-21 22:58:12 +00:00
|
|
|
springs_from_mesh(ob); /* write the 'rest'-lenght of the springs */
|
2006-10-05 17:46:01 +00:00
|
|
|
if (ob->softflag & OB_SB_SELF) {calculate_collision_balls(ob);}
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2005-04-03 20:13:10 +00:00
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2004-10-01 14:10:30 +00:00
|
|
|
}
|
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
}
|
2005-11-19 20:02:30 +00:00
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
static void mesh_faces_to_scratch(Object *ob)
|
|
|
|
{
|
|
|
|
SoftBody *sb= ob->soft;
|
|
|
|
Mesh *me= ob->data;
|
|
|
|
MFace *mface;
|
|
|
|
BodyFace *bodyface;
|
|
|
|
int a;
|
|
|
|
/* alloc and copy faces*/
|
|
|
|
|
|
|
|
bodyface = sb->scratch->bodyface = MEM_mallocN(sizeof(BodyFace)*me->totface,"SB_body_Faces");
|
|
|
|
//memcpy(sb->scratch->mface,me->mface,sizeof(MFace)*me->totface);
|
|
|
|
mface = me->mface;
|
|
|
|
for(a=0; a<me->totface; a++, mface++, bodyface++) {
|
|
|
|
bodyface->v1 = mface->v1;
|
|
|
|
bodyface->v2 = mface->v2;
|
|
|
|
bodyface->v3 = mface->v3;
|
|
|
|
bodyface->v4 = mface->v4;
|
|
|
|
bodyface->ext_force[0] = bodyface->ext_force[1] = bodyface->ext_force[2] = 0.0f;
|
|
|
|
bodyface->flag =0;
|
|
|
|
}
|
|
|
|
sb->scratch->totface = me->totface;
|
|
|
|
}
|
2005-11-19 20:02:30 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
helper function to get proper spring length
|
|
|
|
when object is rescaled
|
|
|
|
*/
|
2008-09-29 17:08:11 +00:00
|
|
|
static float globallen(float *v1,float *v2,Object *ob)
|
2005-11-19 20:02:30 +00:00
|
|
|
{
|
|
|
|
float p1[3],p2[3];
|
|
|
|
VECCOPY(p1,v1);
|
|
|
|
Mat4MulVecfl(ob->obmat, p1);
|
|
|
|
VECCOPY(p2,v2);
|
|
|
|
Mat4MulVecfl(ob->obmat, p2);
|
|
|
|
return VecLenf(p1,p2);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void makelatticesprings(Lattice *lt, BodySpring *bs, int dostiff,Object *ob)
|
2005-08-03 21:38:02 +00:00
|
|
|
{
|
2005-11-19 18:19:41 +00:00
|
|
|
BPoint *bp=lt->def, *bpu;
|
2005-10-24 22:13:32 +00:00
|
|
|
int u, v, w, dv, dw, bpc=0, bpuc;
|
2005-08-03 21:38:02 +00:00
|
|
|
|
|
|
|
dv= lt->pntsu;
|
|
|
|
dw= dv*lt->pntsv;
|
|
|
|
|
|
|
|
for(w=0; w<lt->pntsw; w++) {
|
|
|
|
|
|
|
|
for(v=0; v<lt->pntsv; v++) {
|
|
|
|
|
2005-11-19 18:19:41 +00:00
|
|
|
for(u=0, bpuc=0, bpu=NULL; u<lt->pntsu; u++, bp++, bpc++) {
|
2005-08-03 21:38:02 +00:00
|
|
|
|
|
|
|
if(w) {
|
|
|
|
bs->v1 = bpc;
|
|
|
|
bs->v2 = bpc-dw;
|
|
|
|
bs->strength= 1.0;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order=1;
|
2005-11-19 20:02:30 +00:00
|
|
|
bs->len= globallen((bp-dw)->vec, bp->vec,ob);
|
2005-08-03 21:38:02 +00:00
|
|
|
bs++;
|
|
|
|
}
|
|
|
|
if(v) {
|
|
|
|
bs->v1 = bpc;
|
|
|
|
bs->v2 = bpc-dv;
|
|
|
|
bs->strength= 1.0;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order=1;
|
2005-11-19 20:02:30 +00:00
|
|
|
bs->len= globallen((bp-dv)->vec, bp->vec,ob);
|
2005-08-03 21:38:02 +00:00
|
|
|
bs++;
|
|
|
|
}
|
|
|
|
if(u) {
|
|
|
|
bs->v1 = bpuc;
|
|
|
|
bs->v2 = bpc;
|
|
|
|
bs->strength= 1.0;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order=1;
|
2005-11-19 20:02:30 +00:00
|
|
|
bs->len= globallen((bpu)->vec, bp->vec,ob);
|
2005-08-03 21:38:02 +00:00
|
|
|
bs++;
|
|
|
|
}
|
2005-08-04 10:41:47 +00:00
|
|
|
|
2005-08-03 21:38:02 +00:00
|
|
|
if (dostiff) {
|
2005-08-04 10:41:47 +00:00
|
|
|
|
|
|
|
if(w){
|
|
|
|
if( v && u ) {
|
|
|
|
bs->v1 = bpc;
|
2005-08-03 21:38:02 +00:00
|
|
|
bs->v2 = bpc-dw-dv-1;
|
|
|
|
bs->strength= 1.0;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order=2;
|
2005-11-19 20:02:30 +00:00
|
|
|
bs->len= globallen((bp-dw-dv-1)->vec, bp->vec,ob);
|
2005-08-04 10:41:47 +00:00
|
|
|
bs++;
|
|
|
|
}
|
|
|
|
if( (v < lt->pntsv-1) && (u) ) {
|
|
|
|
bs->v1 = bpc;
|
|
|
|
bs->v2 = bpc-dw+dv-1;
|
|
|
|
bs->strength= 1.0;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order=2;
|
2005-11-19 20:02:30 +00:00
|
|
|
bs->len= globallen((bp-dw+dv-1)->vec, bp->vec,ob);
|
2005-08-03 21:38:02 +00:00
|
|
|
bs++;
|
|
|
|
}
|
|
|
|
}
|
2005-08-04 10:41:47 +00:00
|
|
|
|
|
|
|
if(w < lt->pntsw -1){
|
|
|
|
if( v && u ) {
|
|
|
|
bs->v1 = bpc;
|
|
|
|
bs->v2 = bpc+dw-dv-1;
|
|
|
|
bs->strength= 1.0;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order=2;
|
2005-11-19 20:02:30 +00:00
|
|
|
bs->len= globallen((bp+dw-dv-1)->vec, bp->vec,ob);
|
2005-08-04 10:41:47 +00:00
|
|
|
bs++;
|
|
|
|
}
|
|
|
|
if( (v < lt->pntsv-1) && (u) ) {
|
|
|
|
bs->v1 = bpc;
|
|
|
|
bs->v2 = bpc+dw+dv-1;
|
|
|
|
bs->strength= 1.0;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order=2;
|
2005-11-19 20:02:30 +00:00
|
|
|
bs->len= globallen((bp+dw+dv-1)->vec, bp->vec,ob);
|
2005-08-04 10:41:47 +00:00
|
|
|
bs++;
|
|
|
|
}
|
|
|
|
}
|
2005-08-03 21:38:02 +00:00
|
|
|
}
|
2005-11-19 18:19:41 +00:00
|
|
|
bpu = bp;
|
2005-08-03 21:38:02 +00:00
|
|
|
bpuc = bpc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-10-01 14:10:30 +00:00
|
|
|
/* makes totally fresh start situation */
|
2005-11-19 18:19:41 +00:00
|
|
|
static void lattice_to_softbody(Object *ob)
|
2004-10-01 14:10:30 +00:00
|
|
|
{
|
2005-04-02 19:52:32 +00:00
|
|
|
Lattice *lt= ob->data;
|
2005-11-17 11:40:57 +00:00
|
|
|
SoftBody *sb;
|
2005-08-15 10:30:53 +00:00
|
|
|
int totvert, totspring = 0;
|
2005-10-21 22:58:12 +00:00
|
|
|
|
2005-04-02 19:52:32 +00:00
|
|
|
totvert= lt->pntsu*lt->pntsv*lt->pntsw;
|
2005-08-04 10:41:47 +00:00
|
|
|
|
|
|
|
if (ob->softflag & OB_SB_EDGES){
|
|
|
|
totspring = ((lt->pntsu -1) * lt->pntsv
|
2005-08-03 21:38:02 +00:00
|
|
|
+ (lt->pntsv -1) * lt->pntsu) * lt->pntsw
|
2005-08-04 10:41:47 +00:00
|
|
|
+lt->pntsu*lt->pntsv*(lt->pntsw -1);
|
|
|
|
if (ob->softflag & OB_SB_QUADS){
|
2005-08-15 10:30:53 +00:00
|
|
|
totspring += 4*(lt->pntsu -1) * (lt->pntsv -1) * (lt->pntsw-1);
|
2005-08-04 10:41:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-04-02 19:52:32 +00:00
|
|
|
/* renew ends with ob->soft with points and edges, also checks & makes ob->soft */
|
2005-11-19 18:19:41 +00:00
|
|
|
renew_softbody(ob, totvert, totspring);
|
2005-11-17 11:40:57 +00:00
|
|
|
sb= ob->soft; /* can be created in renew_softbody() */
|
2005-04-02 19:52:32 +00:00
|
|
|
|
2005-11-16 21:58:49 +00:00
|
|
|
/* weights from bpoints, same code used as for mesh vertices */
|
|
|
|
if((ob->softflag & OB_SB_GOAL) && sb->vertgroup) {
|
|
|
|
BodyPoint *bp= sb->bpoint;
|
|
|
|
BPoint *bpnt= lt->def;
|
|
|
|
float goalfac= ABS(sb->maxgoal - sb->mingoal);
|
|
|
|
int a;
|
|
|
|
|
|
|
|
for(a=0; a<totvert; a++, bp++, bpnt++) {
|
2005-11-17 11:40:57 +00:00
|
|
|
bp->goal= sb->mingoal + bpnt->weight*goalfac;
|
2005-11-16 21:58:49 +00:00
|
|
|
/* a little ad hoc changing the goal control to be less *sharp* */
|
|
|
|
bp->goal = (float)pow(bp->goal, 4.0f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-08-04 10:41:47 +00:00
|
|
|
/* create some helper edges to enable SB lattice to be usefull at all */
|
2005-08-03 21:38:02 +00:00
|
|
|
if (ob->softflag & OB_SB_EDGES){
|
2005-11-19 20:02:30 +00:00
|
|
|
makelatticesprings(lt,ob->soft->bspring,ob->softflag & OB_SB_QUADS,ob);
|
2005-08-03 21:38:02 +00:00
|
|
|
build_bps_springlist(ob); /* link bps to springs */
|
2005-04-02 19:52:32 +00:00
|
|
|
}
|
|
|
|
}
|
2004-10-01 14:10:30 +00:00
|
|
|
|
2005-11-17 11:40:57 +00:00
|
|
|
/* makes totally fresh start situation */
|
2005-11-19 18:19:41 +00:00
|
|
|
static void curve_surf_to_softbody(Object *ob)
|
2005-11-17 11:40:57 +00:00
|
|
|
{
|
|
|
|
Curve *cu= ob->data;
|
|
|
|
SoftBody *sb;
|
2005-11-17 12:24:29 +00:00
|
|
|
BodyPoint *bp;
|
|
|
|
BodySpring *bs;
|
|
|
|
Nurb *nu;
|
|
|
|
BezTriple *bezt;
|
|
|
|
BPoint *bpnt;
|
|
|
|
float goalfac;
|
|
|
|
int a, curindex=0;
|
|
|
|
int totvert, totspring = 0, setgoal=0;
|
2005-11-17 11:40:57 +00:00
|
|
|
|
|
|
|
totvert= count_curveverts(&cu->nurb);
|
|
|
|
|
|
|
|
if (ob->softflag & OB_SB_EDGES){
|
|
|
|
if(ob->type==OB_CURVE) {
|
|
|
|
totspring= totvert - BLI_countlist(&cu->nurb);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* renew ends with ob->soft with points and edges, also checks & makes ob->soft */
|
2005-11-19 18:19:41 +00:00
|
|
|
renew_softbody(ob, totvert, totspring);
|
2005-11-17 11:40:57 +00:00
|
|
|
sb= ob->soft; /* can be created in renew_softbody() */
|
2005-11-17 12:24:29 +00:00
|
|
|
|
|
|
|
/* set vars now */
|
|
|
|
goalfac= ABS(sb->maxgoal - sb->mingoal);
|
|
|
|
bp= sb->bpoint;
|
|
|
|
bs= sb->bspring;
|
2005-11-17 11:40:57 +00:00
|
|
|
|
|
|
|
/* weights from bpoints, same code used as for mesh vertices */
|
2005-11-17 12:24:29 +00:00
|
|
|
if((ob->softflag & OB_SB_GOAL) && sb->vertgroup)
|
|
|
|
setgoal= 1;
|
2005-11-17 11:40:57 +00:00
|
|
|
|
2005-11-17 12:24:29 +00:00
|
|
|
for(nu= cu->nurb.first; nu; nu= nu->next) {
|
|
|
|
if(nu->bezt) {
|
|
|
|
for(bezt=nu->bezt, a=0; a<nu->pntsu; a++, bezt++, bp+=3, curindex+=3) {
|
|
|
|
if(setgoal) {
|
2005-11-17 11:40:57 +00:00
|
|
|
bp->goal= sb->mingoal + bezt->weight*goalfac;
|
|
|
|
/* a little ad hoc changing the goal control to be less *sharp* */
|
|
|
|
bp->goal = (float)pow(bp->goal, 4.0f);
|
|
|
|
|
2005-11-17 12:24:29 +00:00
|
|
|
/* all three triples */
|
|
|
|
(bp+1)->goal= bp->goal;
|
|
|
|
(bp+2)->goal= bp->goal;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(totspring) {
|
|
|
|
if(a>0) {
|
|
|
|
bs->v1= curindex-1;
|
|
|
|
bs->v2= curindex;
|
2005-11-17 11:40:57 +00:00
|
|
|
bs->strength= 1.0;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order=1;
|
2005-11-19 20:02:30 +00:00
|
|
|
bs->len= globallen( (bezt-1)->vec[2], bezt->vec[0], ob );
|
2005-11-17 11:40:57 +00:00
|
|
|
bs++;
|
|
|
|
}
|
2005-11-17 12:24:29 +00:00
|
|
|
bs->v1= curindex;
|
|
|
|
bs->v2= curindex+1;
|
|
|
|
bs->strength= 1.0;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order=1;
|
2005-11-19 20:02:30 +00:00
|
|
|
bs->len= globallen( bezt->vec[0], bezt->vec[1], ob );
|
2005-11-17 12:24:29 +00:00
|
|
|
bs++;
|
|
|
|
|
|
|
|
bs->v1= curindex+1;
|
|
|
|
bs->v2= curindex+2;
|
|
|
|
bs->strength= 1.0;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order=1;
|
2005-11-19 20:02:30 +00:00
|
|
|
bs->len= globallen( bezt->vec[1], bezt->vec[2], ob );
|
2005-11-17 12:24:29 +00:00
|
|
|
bs++;
|
2005-11-17 11:40:57 +00:00
|
|
|
}
|
|
|
|
}
|
2005-11-17 12:24:29 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
for(bpnt=nu->bp, a=0; a<nu->pntsu*nu->pntsv; a++, bpnt++, bp++, curindex++) {
|
|
|
|
if(setgoal) {
|
2005-11-17 11:40:57 +00:00
|
|
|
bp->goal= sb->mingoal + bpnt->weight*goalfac;
|
|
|
|
/* a little ad hoc changing the goal control to be less *sharp* */
|
|
|
|
bp->goal = (float)pow(bp->goal, 4.0f);
|
2005-11-17 12:24:29 +00:00
|
|
|
}
|
|
|
|
if(totspring && a>0) {
|
|
|
|
bs->v1= curindex-1;
|
|
|
|
bs->v2= curindex;
|
|
|
|
bs->strength= 1.0;
|
2006-10-04 21:36:55 +00:00
|
|
|
bs->order=1;
|
2005-11-19 20:02:30 +00:00
|
|
|
bs->len= globallen( (bpnt-1)->vec, bpnt->vec , ob );
|
2005-11-17 12:24:29 +00:00
|
|
|
bs++;
|
2005-11-17 11:40:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(totspring)
|
2006-10-05 17:46:01 +00:00
|
|
|
{
|
2005-11-17 11:40:57 +00:00
|
|
|
build_bps_springlist(ob); /* link bps to springs */
|
2006-10-11 22:53:22 +00:00
|
|
|
if (ob->softflag & OB_SB_SELF) {calculate_collision_balls(ob);}
|
2006-10-05 17:46:01 +00:00
|
|
|
}
|
2005-11-17 11:40:57 +00:00
|
|
|
}
|
|
|
|
|
2005-04-02 19:52:32 +00:00
|
|
|
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
static void springs_from_particles(Object *ob)
|
|
|
|
{
|
|
|
|
ParticleSystem *psys;
|
|
|
|
ParticleSystemModifierData *psmd=0;
|
|
|
|
ParticleData *pa=0;
|
|
|
|
HairKey *key=0;
|
|
|
|
SoftBody *sb;
|
|
|
|
BodyPoint *bp;
|
|
|
|
BodySpring *bs;
|
|
|
|
int a,k;
|
|
|
|
float hairmat[4][4];
|
|
|
|
|
|
|
|
psys= ob->soft->particles;
|
|
|
|
sb= ob->soft;
|
|
|
|
if(ob && sb && psys) {
|
|
|
|
psmd = psys_get_modifier(ob, psys);
|
|
|
|
|
|
|
|
bp= sb->bpoint;
|
|
|
|
for(a=0, pa=psys->particles; a<psys->totpart; a++, pa++) {
|
|
|
|
for(k=0, key=pa->hair; k<pa->totkey; k++, bp++, key++) {
|
|
|
|
VECCOPY(bp->origS, key->co);
|
|
|
|
|
|
|
|
psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat);
|
|
|
|
|
|
|
|
Mat4MulVecfl(hairmat, bp->origS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for(a=0, bs=sb->bspring; a<sb->totspring; a++, bs++)
|
|
|
|
bs->len= VecLenf(sb->bpoint[bs->v1].origS, sb->bpoint[bs->v2].origS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void particles_to_softbody(Object *ob)
|
|
|
|
{
|
|
|
|
SoftBody *sb;
|
|
|
|
BodyPoint *bp;
|
|
|
|
BodySpring *bs;
|
|
|
|
ParticleData *pa;
|
|
|
|
HairKey *key;
|
|
|
|
ParticleSystem *psys= ob->soft->particles;
|
|
|
|
float goalfac;
|
|
|
|
int a, k, curpoint;
|
|
|
|
int totpoint= psys_count_keys(psys);
|
|
|
|
int totedge= totpoint-psys->totpart;
|
|
|
|
|
|
|
|
/* renew ends with ob->soft with points and edges, also checks & makes ob->soft */
|
|
|
|
renew_softbody(ob, totpoint, totedge);
|
|
|
|
|
2008-02-12 13:38:07 +00:00
|
|
|
/* find first BodyPoint index for each particle */
|
2008-02-13 14:40:43 +00:00
|
|
|
if(psys->totpart > 0) {
|
|
|
|
psys->particles->bpi = 0;
|
|
|
|
for(a=1, pa=psys->particles+1; a<psys->totpart; a++, pa++)
|
|
|
|
pa->bpi = (pa-1)->bpi + (pa-1)->totkey;
|
|
|
|
}
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
|
|
|
/* we always make body points */
|
|
|
|
sb= ob->soft;
|
|
|
|
bp= sb->bpoint;
|
|
|
|
bs= sb->bspring;
|
|
|
|
goalfac= ABS(sb->maxgoal - sb->mingoal);
|
|
|
|
|
|
|
|
if((ob->softflag & OB_SB_GOAL)) {
|
|
|
|
for(a=0, pa=psys->particles; a<psys->totpart; a++, pa++) {
|
|
|
|
for(k=0, key=pa->hair; k<pa->totkey; k++,bp++,key++) {
|
|
|
|
if(k) {
|
|
|
|
bp->goal= key->weight;
|
|
|
|
bp->goal= sb->mingoal + bp->goal*goalfac;
|
|
|
|
bp->goal= (float)pow(bp->goal, 4.0f);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
/* hair roots are allways fixed fully to goal */
|
|
|
|
bp->goal= 1.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bp= sb->bpoint;
|
|
|
|
curpoint=0;
|
|
|
|
for(a=0, pa=psys->particles; a<psys->totpart; a++, curpoint++, pa++) {
|
|
|
|
for(k=0; k<pa->totkey-1; k++,bs++,curpoint++) {
|
|
|
|
bs->v1=curpoint;
|
|
|
|
bs->v2=curpoint+1;
|
|
|
|
bs->strength= 1.0;
|
|
|
|
bs->order=1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
build_bps_springlist(ob); /* scan for springs attached to bodypoints ONCE */
|
|
|
|
/* insert *other second order* springs if desired */
|
|
|
|
if(sb->secondspring > 0.0000001f) {
|
|
|
|
add_2nd_order_springs(ob,sb->secondspring*10.0); /* exploits the the first run of build_bps_springlist(ob);*/
|
|
|
|
build_bps_springlist(ob); /* yes we need to do it again*/
|
|
|
|
}
|
|
|
|
springs_from_particles(ob); /* write the 'rest'-lenght of the springs */
|
|
|
|
if(ob->softflag & OB_SB_SELF)
|
|
|
|
calculate_collision_balls(ob);
|
|
|
|
}
|
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
/* copies softbody result back in object */
|
2006-03-01 23:45:25 +00:00
|
|
|
static void softbody_to_object(Object *ob, float (*vertexCos)[3], int numVerts, int local)
|
2005-04-02 13:57:23 +00:00
|
|
|
{
|
2005-08-15 10:30:53 +00:00
|
|
|
BodyPoint *bp= ob->soft->bpoint;
|
|
|
|
int a;
|
|
|
|
|
2005-04-02 19:52:32 +00:00
|
|
|
/* inverse matrix is not uptodate... */
|
|
|
|
Mat4Invert(ob->imat, ob->obmat);
|
|
|
|
|
2005-08-15 10:30:53 +00:00
|
|
|
for(a=0; a<numVerts; a++, bp++) {
|
|
|
|
VECCOPY(vertexCos[a], bp->pos);
|
2006-03-01 23:45:25 +00:00
|
|
|
if(local==0)
|
|
|
|
Mat4MulVecfl(ob->imat, vertexCos[a]); /* softbody is in global coords, baked optionally not */
|
2004-10-01 14:10:30 +00:00
|
|
|
}
|
2005-04-02 13:57:23 +00:00
|
|
|
}
|
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
void sbWriteCache(Object *ob, int framenr)
|
2005-05-02 13:28:13 +00:00
|
|
|
{
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
SoftBody *sb= ob->soft;
|
2005-05-02 13:28:13 +00:00
|
|
|
BodyPoint *bp;
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
PTCacheID pid;
|
|
|
|
PTCacheFile *pf;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
int a;
|
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
if(sb->totpoint == 0)
|
|
|
|
return;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
BKE_ptcache_id_from_softbody(&pid, ob, sb);
|
|
|
|
pf= BKE_ptcache_file_open(&pid, PTCACHE_FILE_WRITE, framenr);
|
|
|
|
if(!pf)
|
|
|
|
return;
|
|
|
|
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++)
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
BKE_ptcache_file_write_floats(pf, bp->pos, 3);
|
|
|
|
|
2008-04-05 21:29:17 +00:00
|
|
|
for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++)
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
BKE_ptcache_file_write_floats(pf, bp->vec, 3);
|
|
|
|
|
|
|
|
BKE_ptcache_file_close(pf);
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
}
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
static int softbody_read_cache(Object *ob, float framenr)
|
|
|
|
{
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
SoftBody *sb= ob->soft;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
BodyPoint *bp;
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
PTCacheID pid;
|
|
|
|
PTCacheFile *pf;
|
|
|
|
int a;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
if(sb->totpoint == 0)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
BKE_ptcache_id_from_softbody(&pid, ob, sb);
|
|
|
|
pf= BKE_ptcache_file_open(&pid, PTCACHE_FILE_READ, framenr);
|
|
|
|
if(!pf)
|
|
|
|
return 0;
|
2008-04-05 21:29:17 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++) {
|
|
|
|
if(!BKE_ptcache_file_read_floats(pf, bp->pos, 3)) {
|
|
|
|
BKE_ptcache_file_close(pf);
|
|
|
|
return 0;
|
2005-05-02 13:28:13 +00:00
|
|
|
}
|
|
|
|
}
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++) {
|
|
|
|
if(!BKE_ptcache_file_read_floats(pf, bp->vec, 3)) {
|
|
|
|
BKE_ptcache_file_close(pf);
|
|
|
|
return 0;
|
|
|
|
}
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
}
|
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
BKE_ptcache_file_close(pf);
|
|
|
|
|
|
|
|
return 1;
|
2005-05-02 13:28:13 +00:00
|
|
|
}
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
|
2006-11-10 23:09:16 +00:00
|
|
|
/* +++ ************ maintaining scratch *************** */
|
2008-09-29 17:08:11 +00:00
|
|
|
static void sb_new_scratch(SoftBody *sb)
|
2006-11-10 23:09:16 +00:00
|
|
|
{
|
|
|
|
if (!sb) return;
|
|
|
|
sb->scratch = MEM_callocN(sizeof(SBScratch), "SBScratch");
|
|
|
|
sb->scratch->colliderhash = BLI_ghash_new(BLI_ghashutil_ptrhash,BLI_ghashutil_ptrcmp);
|
|
|
|
sb->scratch->bodyface = NULL;
|
|
|
|
sb->scratch->totface = 0;
|
|
|
|
sb->scratch->aabbmax[0]=sb->scratch->aabbmax[1]=sb->scratch->aabbmax[2] = 1.0e30f;
|
|
|
|
sb->scratch->aabbmin[0]=sb->scratch->aabbmin[1]=sb->scratch->aabbmin[2] = -1.0e30f;
|
|
|
|
|
|
|
|
}
|
|
|
|
/* --- ************ maintaining scratch *************** */
|
2005-04-02 13:57:23 +00:00
|
|
|
|
|
|
|
/* ************ Object level, exported functions *************** */
|
2004-10-01 14:10:30 +00:00
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
/* allocates and initializes general main data */
|
|
|
|
SoftBody *sbNew(void)
|
|
|
|
{
|
|
|
|
SoftBody *sb;
|
|
|
|
|
|
|
|
sb= MEM_callocN(sizeof(SoftBody), "softbody");
|
|
|
|
|
2006-10-11 22:53:22 +00:00
|
|
|
sb->mediafrict= 0.5f;
|
|
|
|
sb->nodemass= 1.0f;
|
2006-11-16 20:57:02 +00:00
|
|
|
sb->grav= 9.8f;
|
2006-10-11 22:53:22 +00:00
|
|
|
sb->physics_speed= 1.0f;
|
2006-11-16 20:57:02 +00:00
|
|
|
sb->rklimit= 0.1f;
|
2005-04-22 17:58:39 +00:00
|
|
|
|
2006-10-11 22:53:22 +00:00
|
|
|
sb->goalspring= 0.5f;
|
|
|
|
sb->goalfrict= 0.0f;
|
|
|
|
sb->mingoal= 0.0f;
|
|
|
|
sb->maxgoal= 1.0f;
|
2005-10-24 22:13:32 +00:00
|
|
|
sb->defgoal= 0.7f;
|
2005-04-02 13:57:23 +00:00
|
|
|
|
2006-10-11 22:53:22 +00:00
|
|
|
sb->inspring= 0.5f;
|
|
|
|
sb->infrict= 0.5f;
|
2008-01-10 00:07:31 +00:00
|
|
|
/*todo backward file compat should copy inspring to inpush while reading old files*/
|
2008-01-09 00:25:51 +00:00
|
|
|
sb->inpush = 0.5f;
|
2005-04-02 13:57:23 +00:00
|
|
|
|
2005-05-02 13:28:13 +00:00
|
|
|
sb->interval= 10;
|
|
|
|
sb->sfra= G.scene->r.sfra;
|
|
|
|
sb->efra= G.scene->r.efra;
|
2006-10-11 22:53:22 +00:00
|
|
|
|
2006-11-16 20:57:02 +00:00
|
|
|
sb->colball = 0.49f;
|
|
|
|
sb->balldamp = 0.50f;
|
2006-10-11 22:53:22 +00:00
|
|
|
sb->ballstiff= 1.0f;
|
|
|
|
sb->sbc_mode = 1;
|
2007-10-18 22:47:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
sb->minloops = 10;
|
2008-01-09 00:25:51 +00:00
|
|
|
sb->maxloops = 300;
|
2007-10-18 22:47:55 +00:00
|
|
|
|
|
|
|
sb->choke = 3;
|
2006-11-10 23:09:16 +00:00
|
|
|
sb_new_scratch(sb);
|
2008-01-09 00:25:51 +00:00
|
|
|
/*todo backward file compat should set sb->shearstiff = 1.0f while reading old files*/
|
|
|
|
sb->shearstiff = 1.0f;
|
|
|
|
sb->solverflags |= SBSO_OLDERR;
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
|
|
|
|
sb->pointcache = BKE_ptcache_add();
|
|
|
|
|
2005-04-02 13:57:23 +00:00
|
|
|
return sb;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* frees all */
|
|
|
|
void sbFree(SoftBody *sb)
|
|
|
|
{
|
|
|
|
free_softbody_intern(sb);
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
BKE_ptcache_free(sb->pointcache);
|
2005-04-02 13:57:23 +00:00
|
|
|
MEM_freeN(sb);
|
2004-10-01 14:10:30 +00:00
|
|
|
}
|
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
void sbFreeSimulation(SoftBody *sb)
|
|
|
|
{
|
|
|
|
free_softbody_intern(sb);
|
|
|
|
}
|
2005-04-02 13:57:23 +00:00
|
|
|
|
2004-10-01 14:10:30 +00:00
|
|
|
/* makes totally fresh start situation */
|
2005-08-15 10:30:53 +00:00
|
|
|
void sbObjectToSoftbody(Object *ob)
|
2004-10-01 14:10:30 +00:00
|
|
|
{
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
//ob->softflag |= OB_SB_REDO;
|
2005-04-16 15:06:02 +00:00
|
|
|
|
2005-08-16 22:58:31 +00:00
|
|
|
free_softbody_intern(ob->soft);
|
2004-10-01 14:10:30 +00:00
|
|
|
}
|
|
|
|
|
2005-08-15 10:30:53 +00:00
|
|
|
static int object_has_edges(Object *ob)
|
2004-10-01 14:10:30 +00:00
|
|
|
{
|
2005-08-15 10:30:53 +00:00
|
|
|
if(ob->type==OB_MESH) {
|
- added mesh_strip_loose_faces, works in conjunction with make_edges
to get rid of faces with MFace.v3==0
- change all Mesh's to have ->medge now. This is forced by make_edges
on readfile, and in the various exotic important routines, and on
conversion back in python.
- make python NMesh structure always have medges now (needs testing)
- with above two changes it is guarenteed that mf->v3 is never ==0
in main blender code (i.e., all MFace's are actually triangles
or quads) and so I went through and removed all the historic tests
to deal with MFace.v3==0. Equals lots of deleting, I am in heaven!
- removed MEdge edcode flag, no longer needed
- added experimental replacement for edge flag system
Still are some inconsistencies in FACESELECT mode edge drawing to
be ironed out.
NOTE: This commit adds an experimental edge flag calc system, based
on 10-seconds-of-thought algorithm by yours truly. Would appreciate
feedback on how this system works, esp compared to old one and esp
on complex or interesting models.
To Use: New system is enabled by setting G.rt to a value between
1 and 1000 (Value of 0 uses old system). Value 1000 is reserved for
"auto" edge, which is more or less identical to old system but also
makes sure that at least 10% of edges are drawn (solves errors for
super subdivided meshes). Values between 1 and 999 act as percent
(out of 1000) of edges that should be drawn, starting with "most
interesting" edges first. Please try it and comment!
2005-08-21 07:19:20 +00:00
|
|
|
return ((Mesh*) ob->data)->totedge;
|
2005-08-15 10:30:53 +00:00
|
|
|
}
|
|
|
|
else if(ob->type==OB_LATTICE) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return 0;
|
2004-10-01 14:10:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-11-20 22:27:05 +00:00
|
|
|
/* SB global visible functions */
|
|
|
|
void sbSetInterruptCallBack(int (*f)(void))
|
|
|
|
{
|
|
|
|
SB_localInterruptCallBack = f;
|
|
|
|
}
|
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
static void softbody_update_positions(Object *ob, SoftBody *sb, float (*vertexCos)[3], int numVerts)
|
2004-10-01 14:10:30 +00:00
|
|
|
{
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
ParticleSystemModifierData *psmd= NULL;
|
|
|
|
ParticleData *pa= NULL;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
HairKey *key= NULL;
|
2005-08-15 10:30:53 +00:00
|
|
|
BodyPoint *bp;
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
float hairmat[4][4];
|
2005-11-19 18:19:41 +00:00
|
|
|
int a;
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
|
|
|
|
/* update the vertex locations */
|
2008-05-22 13:58:16 +00:00
|
|
|
if(sb->particles && sb->particles->totpart>0) {
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
psmd= psys_get_modifier(ob,sb->particles);
|
2008-05-22 13:58:16 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
pa= sb->particles->particles;
|
|
|
|
key= pa->hair;
|
|
|
|
|
|
|
|
psys_mat_hair_to_global(ob, psmd->dm, sb->particles->part->from, pa, hairmat);
|
|
|
|
}
|
|
|
|
|
|
|
|
for(a=0,bp=sb->bpoint; a<numVerts; a++, bp++) {
|
|
|
|
/* store where goals are now */
|
|
|
|
VECCOPY(bp->origS, bp->origE);
|
|
|
|
/* copy the position of the goals at desired end time */
|
|
|
|
if(sb->particles) {
|
|
|
|
if(key == pa->hair + pa->totkey) {
|
|
|
|
pa++;
|
|
|
|
key = pa->hair;
|
|
|
|
|
|
|
|
psys_mat_hair_to_global(ob, psmd->dm, sb->particles->part->from, pa, hairmat);
|
|
|
|
}
|
|
|
|
VECCOPY(bp->origE, key->co);
|
|
|
|
Mat4MulVecfl(hairmat,bp->origE);
|
|
|
|
|
|
|
|
key++;
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
VECCOPY(bp->origE, vertexCos[a]);
|
|
|
|
/* vertexCos came from local world, go global */
|
|
|
|
Mat4MulVecfl(ob->obmat, bp->origE);
|
|
|
|
}
|
|
|
|
/* just to be save give bp->origT a defined value
|
|
|
|
will be calulated in interpolate_exciter()*/
|
|
|
|
VECCOPY(bp->origT, bp->origE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void softbody_reset(Object *ob, SoftBody *sb, float (*vertexCos)[3], int numVerts)
|
|
|
|
{
|
|
|
|
ParticleSystemModifierData *psmd= NULL;
|
|
|
|
HairKey *key= NULL;
|
|
|
|
ParticleData *pa= NULL;
|
|
|
|
BodyPoint *bp;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
float hairmat[4][4];
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
int a;
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2008-05-22 13:58:16 +00:00
|
|
|
if(sb->particles && sb->particles->totpart>0) {
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
psmd= psys_get_modifier(ob, sb->particles);
|
|
|
|
pa= sb->particles->particles;
|
|
|
|
key= pa->hair;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
psys_mat_hair_to_global(ob, psmd->dm, sb->particles->part->from, pa, hairmat);
|
|
|
|
}
|
|
|
|
|
|
|
|
for(a=0,bp=sb->bpoint; a<numVerts; a++, bp++) {
|
|
|
|
if(sb->particles) {
|
|
|
|
if(key == pa->hair + pa->totkey) {
|
|
|
|
pa++;
|
|
|
|
key = pa->hair;
|
|
|
|
|
|
|
|
psys_mat_hair_to_global(ob, psmd->dm, sb->particles->part->from, pa, hairmat);
|
|
|
|
}
|
|
|
|
VECCOPY(bp->pos, key->co);
|
|
|
|
Mat4MulVecfl(hairmat, bp->pos);
|
|
|
|
key++;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
VECCOPY(bp->pos, vertexCos[a]);
|
|
|
|
Mat4MulVecfl(ob->obmat, bp->pos); /* yep, sofbody is global coords*/
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
}
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
VECCOPY(bp->origS, bp->pos);
|
|
|
|
VECCOPY(bp->origE, bp->pos);
|
|
|
|
VECCOPY(bp->origT, bp->pos);
|
|
|
|
bp->vec[0]= bp->vec[1]= bp->vec[2]= 0.0f;
|
|
|
|
|
|
|
|
/* the bp->prev*'s are for rolling back from a canceled try to propagate in time
|
|
|
|
adaptive step size algo in a nutshell:
|
|
|
|
1. set sheduled time step to new dtime
|
|
|
|
2. try to advance the sheduled time step, beeing optimistic execute it
|
|
|
|
3. check for success
|
|
|
|
3.a we 're fine continue, may be we can increase sheduled time again ?? if so, do so!
|
|
|
|
3.b we did exceed error limit --> roll back, shorten the sheduled time and try again at 2.
|
|
|
|
4. check if we did reach dtime
|
|
|
|
4.a nope we need to do some more at 2.
|
|
|
|
4.b yup we're done
|
|
|
|
*/
|
|
|
|
|
|
|
|
VECCOPY(bp->prevpos, bp->pos);
|
|
|
|
VECCOPY(bp->prevvec, bp->vec);
|
|
|
|
VECCOPY(bp->prevdx, bp->vec);
|
|
|
|
VECCOPY(bp->prevdv, bp->vec);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* make a nice clean scratch struc */
|
|
|
|
free_scratch(sb); /* clear if any */
|
|
|
|
sb_new_scratch(sb); /* make a new */
|
|
|
|
sb->scratch->needstobuildcollider=1;
|
|
|
|
|
|
|
|
if((sb->particles)==0) {
|
|
|
|
/* copy some info to scratch */
|
|
|
|
switch(ob->type) {
|
2005-08-16 22:58:31 +00:00
|
|
|
case OB_MESH:
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
if (ob->softflag & OB_SB_FACECOLL) mesh_faces_to_scratch(ob);
|
2005-08-16 22:58:31 +00:00
|
|
|
break;
|
|
|
|
case OB_LATTICE:
|
2005-11-17 11:40:57 +00:00
|
|
|
break;
|
|
|
|
case OB_CURVE:
|
|
|
|
case OB_SURF:
|
2005-08-16 22:58:31 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
}
|
2005-08-15 10:30:53 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
static void softbody_step(Object *ob, SoftBody *sb, float dtime)
|
|
|
|
{
|
|
|
|
/* the simulator */
|
|
|
|
float forcetime;
|
|
|
|
double sct,sst=PIL_check_seconds_timer();
|
|
|
|
ccd_update_deflector_hache(ob,sb->scratch->colliderhash);
|
2005-04-02 19:52:32 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
if(sb->scratch->needstobuildcollider){
|
|
|
|
if (query_external_colliders(ob)){
|
|
|
|
ccd_build_deflector_hache(ob,sb->scratch->colliderhash);
|
|
|
|
}
|
|
|
|
sb->scratch->needstobuildcollider=0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sb->solver_ID < 2) {
|
|
|
|
/* special case of 2nd order Runge-Kutta type AKA Heun */
|
|
|
|
int mid_flags=0;
|
|
|
|
float err = 0;
|
|
|
|
float forcetimemax = 1.0f;
|
|
|
|
float forcetimemin = 0.001f;
|
|
|
|
float timedone =0.0; /* how far did we get without violating error condition */
|
|
|
|
/* loops = counter for emergency brake
|
|
|
|
* we don't want to lock up the system if physics fail
|
|
|
|
*/
|
|
|
|
int loops =0 ;
|
2008-08-11 20:40:29 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
SoftHeunTol = sb->rklimit; /* humm .. this should be calculated from sb parameters and sizes */
|
|
|
|
if (sb->minloops > 0) forcetimemax = 1.0f / sb->minloops;
|
|
|
|
|
|
|
|
if (sb->maxloops > 0) forcetimemin = 1.0f / sb->maxloops;
|
|
|
|
|
|
|
|
if(sb->solver_ID>0) mid_flags |= MID_PRESERVE;
|
|
|
|
|
|
|
|
//forcetime = dtime; /* hope for integrating in one step */
|
|
|
|
forcetime =forcetimemax; /* hope for integrating in one step */
|
|
|
|
while ( (ABS(timedone) < ABS(dtime)) && (loops < 2000) )
|
|
|
|
{
|
|
|
|
/* set goals in time */
|
|
|
|
interpolate_exciter(ob,200,(int)(200.0*(timedone/dtime)));
|
|
|
|
|
|
|
|
sb->scratch->flag &= ~SBF_DOFUZZY;
|
|
|
|
/* do predictive euler step */
|
|
|
|
softbody_calc_forces(ob, forcetime,timedone/dtime,0);
|
2006-11-10 23:09:16 +00:00
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
softbody_apply_forces(ob, forcetime, 1, NULL,mid_flags);
|
2005-05-02 13:28:13 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
/* crop new slope values to do averaged slope step */
|
|
|
|
softbody_calc_forces(ob, forcetime,timedone/dtime,0);
|
2005-08-15 10:30:53 +00:00
|
|
|
|
2008-08-11 20:40:29 +00:00
|
|
|
softbody_apply_forces(ob, forcetime, 2, &err,mid_flags);
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
softbody_apply_goalsnap(ob);
|
|
|
|
|
|
|
|
if (err > SoftHeunTol) { /* error needs to be scaled to some quantity */
|
|
|
|
|
|
|
|
if (forcetime > forcetimemin){
|
|
|
|
forcetime = MAX2(forcetime / 2.0f,forcetimemin);
|
|
|
|
softbody_restore_prev_step(ob);
|
|
|
|
//printf("down,");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
timedone += forcetime;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
float newtime = forcetime * 1.1f; /* hope for 1.1 times better conditions in next step */
|
|
|
|
|
|
|
|
if (sb->scratch->flag & SBF_DOFUZZY){
|
|
|
|
//if (err > SoftHeunTol/(2.0f*sb->fuzzyness)) { /* stay with this stepsize unless err really small */
|
|
|
|
newtime = forcetime;
|
|
|
|
//}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if (err > SoftHeunTol/2.0f) { /* stay with this stepsize unless err really small */
|
|
|
|
newtime = forcetime;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
timedone += forcetime;
|
|
|
|
newtime=MIN2(forcetimemax,MAX2(newtime,forcetimemin));
|
|
|
|
//if (newtime > forcetime) printf("up,");
|
|
|
|
if (forcetime > 0.0)
|
|
|
|
forcetime = MIN2(dtime - timedone,newtime);
|
|
|
|
else
|
|
|
|
forcetime = MAX2(dtime - timedone,newtime);
|
|
|
|
}
|
|
|
|
loops++;
|
|
|
|
if(sb->solverflags & SBSO_MONITOR ){
|
|
|
|
sct=PIL_check_seconds_timer();
|
|
|
|
if (sct-sst > 0.5f) printf("%3.0f%% \r",100.0f*timedone);
|
|
|
|
}
|
|
|
|
/* ask for user break */
|
|
|
|
if (SB_localInterruptCallBack && SB_localInterruptCallBack()) break;
|
2005-08-15 10:30:53 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
}
|
|
|
|
/* move snapped to final position */
|
|
|
|
interpolate_exciter(ob, 2, 2);
|
|
|
|
softbody_apply_goalsnap(ob);
|
|
|
|
|
|
|
|
// if(G.f & G_DEBUG){
|
|
|
|
if(sb->solverflags & SBSO_MONITOR ){
|
|
|
|
if (loops > HEUNWARNLIMIT) /* monitor high loop counts */
|
2008-08-11 20:40:29 +00:00
|
|
|
printf("\r needed %d steps/frame",loops);
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
}
|
|
|
|
|
2005-01-12 22:28:13 +00:00
|
|
|
}
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
else if (sb->solver_ID == 2)
|
|
|
|
{/* do semi "fake" implicit euler */
|
|
|
|
//removed
|
|
|
|
}/*SOLVER SELECT*/
|
|
|
|
else if (sb->solver_ID == 4)
|
|
|
|
{
|
|
|
|
/* do semi "fake" implicit euler */
|
|
|
|
}/*SOLVER SELECT*/
|
|
|
|
else if (sb->solver_ID == 3){
|
|
|
|
/* do "stupid" semi "fake" implicit euler */
|
|
|
|
//removed
|
2005-08-15 10:30:53 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
}/*SOLVER SELECT*/
|
|
|
|
else{
|
|
|
|
printf("softbody no valid solver ID!");
|
|
|
|
}/*SOLVER SELECT*/
|
|
|
|
if(sb->plastic){ apply_spring_memory(ob);}
|
|
|
|
|
|
|
|
if(sb->solverflags & SBSO_MONITOR ){
|
|
|
|
sct=PIL_check_seconds_timer();
|
2008-09-05 23:28:28 +00:00
|
|
|
if ((sct-sst > 0.5f) || (G.f & G_DEBUG)) printf(" solver time %f sec %s \n",sct-sst,ob->id.name);
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
}
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
}
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
/* simulates one step. framenr is in frames */
|
|
|
|
void sbObjectStep(Object *ob, float cfra, float (*vertexCos)[3], int numVerts)
|
|
|
|
{
|
|
|
|
ParticleSystemModifierData *psmd=0;
|
|
|
|
ParticleData *pa=0;
|
|
|
|
SoftBody *sb= ob->soft;
|
|
|
|
PointCache *cache;
|
|
|
|
PTCacheID pid;
|
|
|
|
float dtime, timescale;
|
|
|
|
int framedelta, framenr, startframe, endframe;
|
2005-08-15 10:30:53 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
cache= sb->pointcache;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
framenr= (int)cfra;
|
|
|
|
framedelta= framenr - cache->simframe;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
BKE_ptcache_id_from_softbody(&pid, ob, sb);
|
|
|
|
BKE_ptcache_id_time(&pid, framenr, &startframe, &endframe, ×cale);
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
/* check for changes in mesh, should only happen in case the mesh
|
|
|
|
* structure changes during an animation */
|
|
|
|
if(sb->bpoint && numVerts != sb->totpoint) {
|
|
|
|
cache->flag &= ~PTCACHE_SIMULATION_VALID;
|
|
|
|
cache->simframe= 0;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
return;
|
2005-08-15 10:30:53 +00:00
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
/* clamp frame ranges */
|
|
|
|
if(framenr < startframe) {
|
|
|
|
cache->flag &= ~PTCACHE_SIMULATION_VALID;
|
|
|
|
cache->simframe= 0;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if(framenr > endframe) {
|
|
|
|
framenr = endframe;
|
|
|
|
}
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
/* verify if we need to create the softbody data */
|
|
|
|
if(sb->bpoint == NULL ||
|
|
|
|
((ob->softflag & OB_SB_EDGES) && !ob->soft->bspring && object_has_edges(ob))) {
|
2005-11-19 21:35:06 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
if(sb->particles){
|
|
|
|
particles_to_softbody(ob);
|
2005-08-15 10:30:53 +00:00
|
|
|
}
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
else {
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
switch(ob->type) {
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
case OB_MESH:
|
|
|
|
mesh_to_softbody(ob);
|
|
|
|
break;
|
|
|
|
case OB_LATTICE:
|
|
|
|
lattice_to_softbody(ob);
|
|
|
|
break;
|
|
|
|
case OB_CURVE:
|
|
|
|
case OB_SURF:
|
|
|
|
curve_surf_to_softbody(ob);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
renew_softbody(ob, numVerts, 0);
|
|
|
|
break;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
}
|
2006-11-10 23:09:16 +00:00
|
|
|
}
|
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
softbody_update_positions(ob, sb, vertexCos, numVerts);
|
|
|
|
softbody_reset(ob, sb, vertexCos, numVerts);
|
2005-08-15 10:30:53 +00:00
|
|
|
}
|
2006-01-31 22:48:41 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
/* continue physics special case */
|
|
|
|
if(BKE_ptcache_get_continue_physics()) {
|
|
|
|
cache->flag &= ~PTCACHE_SIMULATION_VALID;
|
|
|
|
cache->simframe= 0;
|
2006-01-31 22:48:41 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
/* do simulation */
|
|
|
|
dtime = timescale;
|
2006-10-17 22:03:32 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
softbody_update_positions(ob, sb, vertexCos, numVerts);
|
|
|
|
softbody_step(ob, sb, dtime);
|
2006-11-10 23:09:16 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
if(sb->particles==0)
|
|
|
|
softbody_to_object(ob, vertexCos, numVerts, 0);
|
2008-01-09 00:25:51 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
return;
|
|
|
|
}
|
2007-10-18 22:47:55 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
/* still no points? go away */
|
|
|
|
if(sb->totpoint==0) return;
|
2007-10-18 22:47:55 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
if(sb->particles){
|
|
|
|
psmd= psys_get_modifier(ob, sb->particles);
|
|
|
|
pa= sb->particles->particles;
|
|
|
|
}
|
2007-10-18 22:47:55 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
/* try to read from cache */
|
|
|
|
if(softbody_read_cache(ob, framenr)) {
|
|
|
|
if(sb->particles==0)
|
|
|
|
softbody_to_object(ob, vertexCos, numVerts, sb->local);
|
2006-11-20 22:27:05 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
cache->flag |= PTCACHE_SIMULATION_VALID;
|
|
|
|
cache->simframe= framenr;
|
2008-01-09 00:25:51 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if(ob->id.lib || (cache->flag & PTCACHE_BAKED)) {
|
|
|
|
/* if baked and nothing in cache, do nothing */
|
|
|
|
if(cache->flag & PTCACHE_SIMULATION_VALID) {
|
|
|
|
cache->flag &= ~PTCACHE_SIMULATION_VALID;
|
|
|
|
cache->simframe= 0;
|
|
|
|
}
|
2008-01-09 00:25:51 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
return;
|
2004-10-01 14:10:30 +00:00
|
|
|
}
|
2005-04-04 18:09:47 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
if(framenr == startframe) {
|
|
|
|
/* first frame, no simulation to do, just set the positions */
|
|
|
|
softbody_update_positions(ob, sb, vertexCos, numVerts);
|
|
|
|
|
|
|
|
cache->flag |= PTCACHE_SIMULATION_VALID;
|
|
|
|
cache->simframe= framenr;
|
|
|
|
|
|
|
|
/* don't write cache on first frame, but on second frame write
|
|
|
|
* cache for frame 1 and 2 */
|
|
|
|
}
|
|
|
|
else if(framedelta == 1) {
|
|
|
|
/* if on second frame, write cache for first frame */
|
|
|
|
if(framenr == startframe+1)
|
|
|
|
sbWriteCache(ob, startframe);
|
|
|
|
|
|
|
|
softbody_update_positions(ob, sb, vertexCos, numVerts);
|
|
|
|
|
|
|
|
/* do simulation */
|
|
|
|
cache->flag |= PTCACHE_SIMULATION_VALID;
|
|
|
|
cache->simframe= framenr;
|
|
|
|
|
|
|
|
/* checking time: */
|
|
|
|
dtime = framedelta*timescale;
|
2005-08-15 10:30:53 +00:00
|
|
|
|
Point Cache Refactoring
=======================
Caching and Baking:
- The point cache is now cleared on DAG_object_flush_update(), and not cleared for time dependency graph updates.
- There is now a Bake button instead of Protect. Also cache start and end frames were added to softbody and particles.
- The cloth autoprotect feature was removed.
- The Ctrl+B menu now also bakes cloth and particles next to softbody and fluids. Additionally there are now frree bake and free cache menu entries.
- The point cache api has been changed. There is now a PTCacheID struct for each point cache type that can be filled and then used to call the point cache functions.
- PointCache struct was added to DNA and is automatically allocated for each physics type.
- Soft body now supports Bake Editing just like cloth.
- Tried to make the systems deal consistently with time ipo's and offsets. Still not sure it all works correct, but too complicated to solve completely now.
Library Linking:
- Added some more warnings to prevent editing settings on library linked objects.
- Linked objects now read from the cache located next to the original library file, and never write to it. This restores old behavior for softbodies. For local simulation the mesh and not the object should be linked.
- Dupligroups and proxies can't create local point caches at the moment, how to implement that I'm not sure. We probably need a proxy point cache for that to work (ugh).
Physics UI:
- Renamed deflection panel to collision for consistency and reorganized the buttons. Also removed some softbody collision buttons from the softbody panel that were duplicated in this panel for cloth.
- Tweaked field panel buttons to not jump around when changing options.
- Tabbing e.g. Soft Body Collision into the Soft Body panel, it now only shows Collision to make the panel names readable.
- I tried to make enabled/disabling physics more consistent, since all three system did things different. Now the two modifier buttons to enable the modifier for the viewport and rendering are also duplicated in the physics panels. Toggling the Soft Body and Cloth buttons now both remove their modifiers.
- Fixed modifier error drawing glitch.
Particles:
- Particles are now recalculated more often than before. Previously it did partial updates based on the changes, but that doesn't work well with DAG_object_flush_update() ..
- Fixed memory leak loading keyed particle system. Now keys are not written to file anymore but always created after loading.
- Make particle threads work with autothreads.
Continue Physics:
- The timeline play now has a Continue Physics option in the playback menu, which keeps the simulations going without writing them to the cache.
- This doesn't always work that well, some changes are not immediately updated, but this can be improved later. Still it's fun to get a feel for the physics.
Todo:
- Point cache can get out of sync with and undo and changing a file without saving it.
- Change the point cache file format to store a version (so old point cache files can be either converted or at least ignored), and to do correct endian conversion.
- Menu item and/or buttons for Ctrl+B.
- A system("rm ..") was changed to remove() since the former is very slow for clearing point caches. These system() calls were already giving trouble in a bug in the tracker, but really most use of this system("") should be changed and tested.
- The Soft Body Collision and Clot Collision panel titles don't mention there's point cache settings there too, doing that makes them unreadable with the default panel setup.. but may need to make the names longer anyway.
2008-04-10 11:39:20 +00:00
|
|
|
softbody_step(ob, sb, dtime);
|
|
|
|
|
|
|
|
if(sb->particles==0)
|
|
|
|
softbody_to_object(ob, vertexCos, numVerts, 0);
|
|
|
|
|
|
|
|
sbWriteCache(ob, framenr);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* time step backwards or too large forward - do nothing */
|
|
|
|
if(cache->flag & PTCACHE_SIMULATION_VALID) {
|
|
|
|
cache->flag &= ~PTCACHE_SIMULATION_VALID;
|
|
|
|
cache->simframe= 0;
|
|
|
|
}
|
|
|
|
}
|
2004-10-01 14:10:30 +00:00
|
|
|
}
|
|
|
|
|