tornavis/source/blender/makesdna/DNA_pointcache_types.h

156 lines
4.3 KiB
C

/* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup DNA
*/
#pragma once
#include "DNA_listBase.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Point cache file data types:
* - Used as `(1 << flag)` so poke jahka if you reach the limit of 15.
* - To add new data types update:
* - #BKE_ptcache_data_size()
* - #ptcache_file_pointers_init()
*/
#define BPHYS_DATA_INDEX 0
#define BPHYS_DATA_LOCATION 1
#define BPHYS_DATA_SMOKE_LOW 1
#define BPHYS_DATA_VELOCITY 2
#define BPHYS_DATA_SMOKE_HIGH 2
#define BPHYS_DATA_ROTATION 3
#define BPHYS_DATA_DYNAMICPAINT 3
#define BPHYS_DATA_AVELOCITY 4 /* used for particles */
#define BPHYS_DATA_XCONST 4 /* used for cloth */
#define BPHYS_DATA_SIZE 5
#define BPHYS_DATA_TIMES 6
#define BPHYS_DATA_BOIDS 7
#define BPHYS_TOT_DATA 8
#define BPHYS_EXTRA_FLUID_SPRINGS 1
#define BPHYS_EXTRA_CLOTH_ACCELERATION 2
typedef struct PTCacheExtra {
struct PTCacheExtra *next, *prev;
unsigned int type, totdata;
void *data;
} PTCacheExtra;
typedef struct PTCacheMem {
struct PTCacheMem *next, *prev;
unsigned int frame, totpoint;
unsigned int data_types, flag;
/** BPHYS_TOT_DATA. */
void *data[8];
struct ListBase extradata;
} PTCacheMem;
typedef struct PointCache {
struct PointCache *next, *prev;
/** Generic flag. */
int flag;
/**
* The number of frames between cached frames.
* This should probably be an upper bound for a per point adaptive step in the future,
* but for now it's the same for all points. Without adaptivity this can effect the perceived
* simulation quite a bit though. If for example particles are colliding with a horizontal
* plane (with high damping) they quickly come to a stop on the plane, however there are still
* forces acting on the particle (gravity and collisions), so the particle velocity isn't
* necessarily zero for the whole duration of the frame even if the particle seems stationary.
* If all simulation frames aren't cached (step > 1) these velocities are interpolated into
* movement for the non-cached frames.
* The result will look like the point is oscillating around the collision location.
* So for now cache step should be set to 1 for accurate reproduction of collisions.
*/
int step;
/** Current frame of simulation (only if SIMULATION_VALID). */
int simframe;
/** Simulation start frame. */
int startframe;
/** Simulation end frame. */
int endframe;
/** Frame being edited (runtime only). */
int editframe;
/** Last exact frame that's cached. */
int last_exact;
/** Used for editing cache - what is the last baked frame. */
int last_valid;
char _pad[4];
/* for external cache files */
/** Number of cached points. */
int totpoint;
/** Modifier stack index. */
int index;
short compression;
char _pad0[2];
char name[64];
char prev_name[64];
char info[128];
/** File path, 1024 = FILE_MAX. */
char path[1024];
/**
* Array of length `endframe - startframe + 1` with flags to indicate cached frames.
* Can be later used for other per frame flags too if needed.
*/
char *cached_frames;
int cached_frames_len;
char _pad1[4];
struct ListBase mem_cache;
struct PTCacheEdit *edit;
/** Free callback. */
void (*free_edit)(struct PTCacheEdit *edit);
} PointCache;
/** #PointCache.flag */
enum {
PTCACHE_BAKED = 1 << 0,
PTCACHE_OUTDATED = 1 << 1,
PTCACHE_SIMULATION_VALID = 1 << 2,
PTCACHE_BAKING = 1 << 3,
// PTCACHE_BAKE_EDIT = 1 << 4,
// PTCACHE_BAKE_EDIT_ACTIVE = 1 << 5,
PTCACHE_DISK_CACHE = 1 << 6,
/* removed since 2.64 - T30974, could be added back in a more useful way */
// PTCACHE_QUICK_CACHE = 1 << 7,
PTCACHE_FRAMES_SKIPPED = 1 << 8,
PTCACHE_EXTERNAL = 1 << 9,
PTCACHE_READ_INFO = 1 << 10,
/** Don't use the file-path of the blend-file the data is linked from (write a local cache). */
PTCACHE_IGNORE_LIBPATH = 1 << 11,
/**
* High resolution cache is saved for smoke for backwards compatibility,
* so set this flag to know it's a "fake" cache.
*/
PTCACHE_FAKE_SMOKE = 1 << 12,
PTCACHE_IGNORE_CLEAR = 1 << 13,
PTCACHE_FLAG_INFO_DIRTY = 1 << 14,
PTCACHE_REDO_NEEDED = PTCACHE_OUTDATED | PTCACHE_FRAMES_SKIPPED,
PTCACHE_FLAGS_COPY = PTCACHE_DISK_CACHE | PTCACHE_EXTERNAL | PTCACHE_IGNORE_LIBPATH,
};
#define PTCACHE_COMPRESS_NO 0
#define PTCACHE_COMPRESS_LZO 1
#define PTCACHE_COMPRESS_LZMA 2
#ifdef __cplusplus
}
#endif