404 lines
10 KiB
C
404 lines
10 KiB
C
/* SPDX-FileCopyrightText: 2004-2005 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/** \file
|
|
* \ingroup DNA
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "DNA_defs.h"
|
|
#include "DNA_listBase.h"
|
|
|
|
struct BodySpring;
|
|
|
|
/** #PartDeflect.forcefield: Effector Fields types. */
|
|
typedef enum ePFieldType {
|
|
/** (this is used for general effector weight). */
|
|
PFIELD_NULL = 0,
|
|
/** Force away/towards a point depending on force strength. */
|
|
PFIELD_FORCE = 1,
|
|
/** Force around the effector normal. */
|
|
PFIELD_VORTEX = 2,
|
|
/** Force from the cross product of effector normal and point velocity. */
|
|
PFIELD_MAGNET = 3,
|
|
/** Force away and towards a point depending which side of the effector normal the point is. */
|
|
PFIELD_WIND = 4,
|
|
/** Force along curve for dynamics, a shaping curve for hair paths. */
|
|
PFIELD_GUIDE = 5,
|
|
/** Force based on texture values calculated at point coordinates. */
|
|
PFIELD_TEXTURE = 6,
|
|
/** Force of a harmonic (damped) oscillator. */
|
|
PFIELD_HARMONIC = 7,
|
|
/** Force away/towards a point depending on point charge. */
|
|
PFIELD_CHARGE = 8,
|
|
/** Force due to a Lennard-Jones potential. */
|
|
PFIELD_LENNARDJ = 9,
|
|
/** Defines predator / goal for boids. */
|
|
PFIELD_BOID = 10,
|
|
/** Force defined by BLI_noise_generic_turbulence. */
|
|
PFIELD_TURBULENCE = 11,
|
|
/** Linear & quadratic drag. */
|
|
PFIELD_DRAG = 12,
|
|
/** Force based on fluid simulation velocities. */
|
|
PFIELD_FLUIDFLOW = 13,
|
|
|
|
/* Keep last. */
|
|
NUM_PFIELD_TYPES,
|
|
} ePFieldType;
|
|
|
|
typedef struct PartDeflect {
|
|
/** General settings flag. */
|
|
int flag;
|
|
/** Deflection flag - does mesh deflect particles. */
|
|
short deflect;
|
|
/** Force field type, do the vertices attract / repel particles? */
|
|
short forcefield;
|
|
/** Fall-off type. */
|
|
short falloff;
|
|
/** Point, plane or surface. */
|
|
short shape;
|
|
/** Texture effector. */
|
|
short tex_mode;
|
|
/** For curve guide. */
|
|
short kink, kink_axis;
|
|
short zdir;
|
|
|
|
/* Main effector values */
|
|
/** The strength of the force (+ or - ). */
|
|
float f_strength;
|
|
/** Damping ratio of the harmonic effector. */
|
|
float f_damp;
|
|
/**
|
|
* How much force is converted into "air flow", i.e.
|
|
* force used as the velocity of surrounding medium. */
|
|
float f_flow;
|
|
/** How much force is reduced when acting parallel to a surface, e.g. cloth. */
|
|
float f_wind_factor;
|
|
|
|
char _pad0[4];
|
|
|
|
/** Noise size for noise effector, restlength for harmonic effector. */
|
|
float f_size;
|
|
|
|
/* fall-off */
|
|
/** The power law - real gravitation is 2 (square). */
|
|
float f_power;
|
|
/** If indicated, use this maximum. */
|
|
float maxdist;
|
|
/** If indicated, use this minimum. */
|
|
float mindist;
|
|
/** Radial fall-off power. */
|
|
float f_power_r;
|
|
/** Radial versions of above. */
|
|
float maxrad;
|
|
float minrad;
|
|
|
|
/* particle collisions */
|
|
/** Damping factor for particle deflection. */
|
|
float pdef_damp;
|
|
/** Random element of damping for deflection. */
|
|
float pdef_rdamp;
|
|
/** Chance of particle passing through mesh. */
|
|
float pdef_perm;
|
|
/** Friction factor for particle deflection. */
|
|
float pdef_frict;
|
|
/** Random element of friction for deflection. */
|
|
float pdef_rfrict;
|
|
/** Surface particle stickiness. */
|
|
float pdef_stickness;
|
|
|
|
/** Used for forces. */
|
|
float absorption;
|
|
|
|
/* softbody collisions */
|
|
/** Damping factor for softbody deflection. */
|
|
float pdef_sbdamp;
|
|
/** Inner face thickness for softbody deflection. */
|
|
float pdef_sbift;
|
|
/** Outer face thickness for softbody deflection. */
|
|
float pdef_sboft;
|
|
|
|
/* guide curve, same as for particle child effects */
|
|
float clump_fac, clump_pow;
|
|
float kink_freq, kink_shape, kink_amp, free_end;
|
|
|
|
/* texture effector */
|
|
/** Used for calculating partial derivatives. */
|
|
float tex_nabla;
|
|
/** Texture of the texture effector. */
|
|
struct Tex *tex;
|
|
|
|
/* effector noise */
|
|
/** Noise of force. */
|
|
float f_noise;
|
|
/** Noise random seed. */
|
|
int seed;
|
|
|
|
/* Display Size */
|
|
/** Runtime only : start of the curve or draw scale. */
|
|
float drawvec1[4];
|
|
/** Runtime only : end of the curve. */
|
|
float drawvec2[4];
|
|
/** Runtime only. */
|
|
float drawvec_falloff_min[3];
|
|
char _pad1[4];
|
|
/** Runtime only. */
|
|
float drawvec_falloff_max[3];
|
|
char _pad2[4];
|
|
|
|
/** Force source object. */
|
|
struct Object *f_source;
|
|
|
|
/** Friction of cloth collisions. */
|
|
float pdef_cfrict;
|
|
char _pad[4];
|
|
} PartDeflect;
|
|
|
|
typedef struct EffectorWeights {
|
|
/** Only use effectors from this group of objects. */
|
|
struct Collection *group;
|
|
|
|
/** Effector type specific weights. */
|
|
float weight[14];
|
|
float global_gravity;
|
|
short flag;
|
|
char _pad[2];
|
|
} EffectorWeights;
|
|
|
|
/** #EffectorWeights::flag */
|
|
enum {
|
|
EFF_WEIGHT_DO_HAIR = 1,
|
|
};
|
|
|
|
typedef struct SBVertex {
|
|
float vec[4];
|
|
} SBVertex;
|
|
|
|
/* Container for data that is shared among evaluated copies.
|
|
*
|
|
* This is placed in a separate struct so that values can be changed
|
|
* without having to update all evaluated copies. */
|
|
typedef struct SoftBody_Shared {
|
|
struct PointCache *pointcache;
|
|
struct ListBase ptcaches;
|
|
} SoftBody_Shared;
|
|
|
|
typedef struct SoftBody {
|
|
/* dynamic data */
|
|
int totpoint, totspring;
|
|
/** Not saved in file. */
|
|
struct BodyPoint *bpoint;
|
|
/** Not saved in file. */
|
|
struct BodySpring *bspring;
|
|
char _pad;
|
|
char msg_lock;
|
|
short msg_value;
|
|
|
|
/* part of UI: */
|
|
|
|
/* general options */
|
|
/** Softbody mass of *vertex*. */
|
|
float nodemass;
|
|
/**
|
|
* Along with it introduce mass painting starting to fix old bug .. nastiness that VG are indexes
|
|
* rather find them by name tag to find it -> jow20090613. #MAX_VGROUP_NAME size.
|
|
*/
|
|
char namedVG_Mass[64];
|
|
/** Softbody amount of gravitation to apply. */
|
|
float grav;
|
|
/** Friction to env. */
|
|
float mediafrict;
|
|
/** Error limit for ODE solver. */
|
|
float rklimit;
|
|
/** User control over simulation speed. */
|
|
float physics_speed;
|
|
|
|
/* goal */
|
|
/** Softbody goal springs. */
|
|
float goalspring;
|
|
/** Softbody goal springs friction. */
|
|
float goalfrict;
|
|
/** Quick limits for goal. */
|
|
float mingoal;
|
|
float maxgoal;
|
|
/** Default goal for vertices without vgroup. */
|
|
float defgoal;
|
|
/** Index starting at 1. */
|
|
short vertgroup;
|
|
/**
|
|
* Starting to fix old bug .. nastiness that VG are indexes
|
|
* rather find them by name tag to find it -> jow20090613. #MAX_VGROUP_NAME size.
|
|
*/
|
|
char namedVG_Softgoal[64];
|
|
|
|
short fuzzyness;
|
|
|
|
/* springs */
|
|
/** Softbody inner springs. */
|
|
float inspring;
|
|
/** Softbody inner springs friction. */
|
|
float infrict;
|
|
/**
|
|
* Along with it introduce Spring_K painting
|
|
* starting to fix old bug .. nastiness that VG are indexes
|
|
* rather find them by name tag to find it -> jow20090613.
|
|
* MAX_VGROUP_NAME
|
|
*/
|
|
char namedVG_Spring_K[64];
|
|
|
|
/* baking */
|
|
char _pad1[6];
|
|
/** Local==1: use local coords for baking. */
|
|
char local, solverflags;
|
|
|
|
/* -- these must be kept for backwards compatibility -- */
|
|
/** Array of size totpointkey. */
|
|
SBVertex **keys;
|
|
/** If totpointkey != totpoint or totkey!- (efra-sfra)/interval -> free keys. */
|
|
int totpointkey, totkey;
|
|
/* ---------------------------------------------------- */
|
|
float secondspring;
|
|
|
|
/* Self collision. */
|
|
/** Fixed collision ball size if > 0. */
|
|
float colball;
|
|
/** Cooling down collision response. */
|
|
float balldamp;
|
|
/** Pressure the ball is loaded with. */
|
|
float ballstiff;
|
|
short sbc_mode;
|
|
short aeroedge;
|
|
short minloops;
|
|
short maxloops;
|
|
short choke;
|
|
short solver_ID;
|
|
short plastic;
|
|
short springpreload;
|
|
|
|
/** Scratchpad/cache on live time not saved in file. */
|
|
struct SBScratch *scratch;
|
|
float shearstiff;
|
|
float inpush;
|
|
|
|
struct SoftBody_Shared *shared;
|
|
/** Moved to SoftBody_Shared. */
|
|
struct PointCache *pointcache DNA_DEPRECATED;
|
|
/** Moved to SoftBody_Shared. */
|
|
struct ListBase ptcaches DNA_DEPRECATED;
|
|
|
|
struct Collection *collision_group;
|
|
|
|
struct EffectorWeights *effector_weights;
|
|
/* Reverse estimated object-matrix (run-time data, no need to store in the file). */
|
|
float lcom[3];
|
|
float lrot[3][3];
|
|
float lscale[3][3];
|
|
|
|
int last_frame;
|
|
} SoftBody;
|
|
|
|
/** #PartDeflect::flag: various settings. */
|
|
enum {
|
|
PFIELD_USEMAX = 1 << 0,
|
|
// PDEFLE_DEFORM = 1 << 1, /* UNUSED */
|
|
/** TODO: do_versions for below */
|
|
PFIELD_GUIDE_PATH_ADD = 1 << 2,
|
|
/** used for do_versions */
|
|
PFIELD_PLANAR = 1 << 3,
|
|
PDEFLE_KILL_PART = 1 << 4,
|
|
/** used for do_versions */
|
|
PFIELD_POSZ = 1 << 5,
|
|
PFIELD_TEX_OBJECT = 1 << 6,
|
|
/** used for turbulence */
|
|
PFIELD_GLOBAL_CO = 1 << 6,
|
|
PFIELD_TEX_2D = 1 << 7,
|
|
/** used for harmonic force */
|
|
PFIELD_MULTIPLE_SPRINGS = 1 << 7,
|
|
PFIELD_USEMIN = 1 << 8,
|
|
PFIELD_USEMAXR = 1 << 9,
|
|
PFIELD_USEMINR = 1 << 10,
|
|
PFIELD_TEX_ROOTCO = 1 << 11,
|
|
/** used for do_versions */
|
|
PFIELD_SURFACE = 1 << 12,
|
|
PFIELD_VISIBILITY = 1 << 13,
|
|
PFIELD_DO_LOCATION = 1 << 14,
|
|
PFIELD_DO_ROTATION = 1 << 15,
|
|
/** apply curve weights */
|
|
PFIELD_GUIDE_PATH_WEIGHT = 1 << 16,
|
|
/** multiply smoke force by density */
|
|
PFIELD_SMOKE_DENSITY = 1 << 17,
|
|
/** used for (simple) force */
|
|
PFIELD_GRAVITATION = 1 << 18,
|
|
/** Enable cloth collision side detection based on normal. */
|
|
PFIELD_CLOTH_USE_CULLING = 1 << 19,
|
|
/** Replace collision direction with collider normal. */
|
|
PFIELD_CLOTH_USE_NORMAL = 1 << 20,
|
|
};
|
|
|
|
/** #PartDeflect::falloff */
|
|
enum {
|
|
PFIELD_FALL_SPHERE = 0,
|
|
PFIELD_FALL_TUBE = 1,
|
|
PFIELD_FALL_CONE = 2,
|
|
};
|
|
|
|
/** #PartDeflect::shape */
|
|
enum {
|
|
PFIELD_SHAPE_POINT = 0,
|
|
PFIELD_SHAPE_PLANE = 1,
|
|
PFIELD_SHAPE_SURFACE = 2,
|
|
PFIELD_SHAPE_POINTS = 3,
|
|
PFIELD_SHAPE_LINE = 4,
|
|
};
|
|
|
|
/** #PartDeflect::tex_mode */
|
|
enum {
|
|
PFIELD_TEX_RGB = 0,
|
|
PFIELD_TEX_GRAD = 1,
|
|
PFIELD_TEX_CURL = 2,
|
|
};
|
|
|
|
/** #PartDeflect::zdir */
|
|
enum {
|
|
PFIELD_Z_BOTH = 0,
|
|
PFIELD_Z_POS = 1,
|
|
PFIELD_Z_NEG = 2,
|
|
};
|
|
|
|
/** #Object::softflag */
|
|
enum {
|
|
OB_SB_ENABLE = 1 << 0, /* Deprecated (use modifier). */
|
|
OB_SB_GOAL = 1 << 1,
|
|
OB_SB_EDGES = 1 << 2,
|
|
OB_SB_QUADS = 1 << 3,
|
|
OB_SB_POSTDEF = 1 << 4,
|
|
// OB_SB_REDO = 1 << 5,
|
|
// OB_SB_BAKESET = 1 << 6,
|
|
// OB_SB_BAKEDO = 1 << 7,
|
|
// OB_SB_RESET = 1 << 8,
|
|
OB_SB_SELF = 1 << 9,
|
|
OB_SB_FACECOLL = 1 << 10,
|
|
OB_SB_EDGECOLL = 1 << 11,
|
|
// OB_SB_COLLFINAL = 1 << 12, /* Deprecated. */
|
|
// OB_SB_BIG_UI = 1 << 13, /* Deprecated. */
|
|
OB_SB_AERO_ANGLE = 1 << 14,
|
|
};
|
|
|
|
/** #SoftBody::solverflags */
|
|
enum {
|
|
SBSO_MONITOR = 1 << 0,
|
|
SBSO_OLDERR = 1 << 1,
|
|
SBSO_ESTIMATEIPO = 1 << 2,
|
|
};
|
|
|
|
/** #SoftBody::sbc_mode */
|
|
enum {
|
|
SBC_MODE_MANUAL = 0,
|
|
SBC_MODE_AVG = 1,
|
|
SBC_MODE_MIN = 2,
|
|
SBC_MODE_MAX = 3,
|
|
SBC_MODE_AVGMINMAX = 4,
|
|
};
|