* Based on what happens during simulation the cache is marked (also in cache panel, this could possibly be extended to 3d view as well) as: - exact (not marked) - outdated (simulation is not done completely with current settings) - non-exact (frames were skipped during simulation) * The parameter "cache step" effects the number of frames between saved cache frames. - This can save a lot of memory (or disk space) if absolutely frame accurate simulation is not required. - Speeds up the "quick caching" very much. - Frames between cached frames are interpolated from the cached frames. - Current default value of 10 frames works nicely with up/down-arrows (skip 10 frames forwards/backwards on timeline), but can be changed if wanted. * The caching can work in normal or "quick" mode: [Normal cache] - Basic: Calculate what even happens (settings change, big frame steps etc.) and cache results, if possible try to use "cache step" when saving cache frames. - Becomes non-exact: After larger than 1 frame steps. - Becomes outdated: After any change effecting the simulation other than frame steps. - Pros/cons: Freedom of doing anything and playing with particles, but exact results have to calculated from the beginning. [Quick cache] - Basic: Calculate simulation up to current frame automatically on changes with cache step sized jumps in simulation. With multiple "quick cached" simulations the smallest cache step is used. - Becomes non-exact: Always from frame 1 (unless cache step = 1). - Becomes outdated: Never. - Pros/cons: Not very accurate, but super fast! - Todo: Transform of any animated (non-autokeyed) object is locked! Probably needs some tinkering with anim sys overrides. * The simulation can be run forwards or backwards even if it's cache is outdated or non-exact, the following rules apply in these situations: - step forwards (to unknown) -> simulate from last exact frame, store result - step backwards (to known) -> result is interpolated from existing frames, store result, clear cache forwards if current frame is after last exact frame * "Calculate to current frame" runs the simulation from start to current frame with a frame steps of 1. - Baking does the same, but runs the simulation all the way to the end of simulation. - Rendering does this automatically if the simulation is outdated of non-exact, so all rendered simulations will always be updated and exact. * Every cache panel also holds buttons to "Bake all dynamics", "Free all dynamics" and "Update all dynamics to current frame". * Cloth simulation supports the new cache too.
169 lines
4.9 KiB
C++
169 lines
4.9 KiB
C++
/*
|
|
*
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*
|
|
* The Original Code is Copyright (C) 2006 Blender Foundation.
|
|
* All rights reserved.
|
|
*
|
|
* The Original Code is: all of this file.
|
|
*
|
|
* Contributor(s): Campbell Barton <ideasman42@gmail.com>
|
|
*
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
*/
|
|
|
|
#ifndef BKE_POINTCACHE_H
|
|
#define BKE_POINTCACHE_H
|
|
|
|
#include "DNA_ID.h"
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
/* Point cache clearing option, for BKE_ptcache_id_clear, before
|
|
* and after are non inclusive (they wont remove the cfra) */
|
|
#define PTCACHE_CLEAR_ALL 0
|
|
#define PTCACHE_CLEAR_FRAME 1
|
|
#define PTCACHE_CLEAR_BEFORE 2
|
|
#define PTCACHE_CLEAR_AFTER 3
|
|
|
|
/* Point cache reset options */
|
|
#define PTCACHE_RESET_DEPSGRAPH 0
|
|
#define PTCACHE_RESET_BAKED 1
|
|
#define PTCACHE_RESET_OUTDATED 2
|
|
#define PTCACHE_RESET_FREE 3
|
|
|
|
/* Add the blendfile name after blendcache_ */
|
|
#define PTCACHE_EXT ".bphys"
|
|
#define PTCACHE_PATH "blendcache_"
|
|
|
|
/* File open options, for BKE_ptcache_file_open */
|
|
#define PTCACHE_FILE_READ 0
|
|
#define PTCACHE_FILE_WRITE 1
|
|
|
|
/* PTCacheID types */
|
|
#define PTCACHE_TYPE_SOFTBODY 0
|
|
#define PTCACHE_TYPE_PARTICLES 1
|
|
#define PTCACHE_TYPE_CLOTH 2
|
|
|
|
/* PTCache read return code */
|
|
#define PTCACHE_READ_EXACT 1
|
|
#define PTCACHE_READ_INTERPOLATED 2
|
|
#define PTCACHE_READ_OLD 3
|
|
|
|
/* Structs */
|
|
struct Object;
|
|
struct Scene;
|
|
struct SoftBody;
|
|
struct ParticleSystem;
|
|
struct ClothModifierData;
|
|
struct PointCache;
|
|
struct ListBase;
|
|
|
|
typedef struct PTCacheFile {
|
|
FILE *fp;
|
|
} PTCacheFile;
|
|
|
|
typedef struct PTCacheID {
|
|
struct PTCacheID *next, *prev;
|
|
|
|
struct Object *ob;
|
|
void *data;
|
|
int type;
|
|
int stack_index;
|
|
|
|
struct PointCache *cache;
|
|
} PTCacheID;
|
|
|
|
typedef struct PTCacheWriter {
|
|
struct PTCacheID *pid;
|
|
int cfra;
|
|
int totelem;
|
|
|
|
void (*set_elem)(int index, void *calldata, float *data);
|
|
void *calldata;
|
|
} PTCacheWriter;
|
|
|
|
typedef struct PTCacheReader {
|
|
struct Scene *scene;
|
|
struct PTCacheID *pid;
|
|
float cfra;
|
|
int totelem;
|
|
|
|
void (*set_elem)(int elem_index, void *calldata, float *data);
|
|
void (*interpolate_elem)(int index, void *calldata, float frs_sec, float cfra, float cfra1, float cfra2, float *data1, float *data2);
|
|
void *calldata;
|
|
|
|
int *old_frame;
|
|
} PTCacheReader;
|
|
|
|
typedef struct PTCacheBaker {
|
|
struct Scene *scene;
|
|
int bake;
|
|
int render;
|
|
int quick_step;
|
|
struct PTCacheID *pid;
|
|
int (*break_test)(void *data);
|
|
void *break_data;
|
|
void (*progressbar)(void *data, int num);
|
|
void *progresscontext;
|
|
} PTCacheBaker;
|
|
|
|
/* Creating ID's */
|
|
void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct SoftBody *sb);
|
|
void BKE_ptcache_id_from_particles(PTCacheID *pid, struct Object *ob, struct ParticleSystem *psys);
|
|
void BKE_ptcache_id_from_cloth(PTCacheID *pid, struct Object *ob, struct ClothModifierData *clmd);
|
|
|
|
void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob);
|
|
|
|
/* Global funcs */
|
|
void BKE_ptcache_remove(void);
|
|
|
|
/* ID specific functions */
|
|
void BKE_ptcache_id_clear(PTCacheID *id, int mode, int cfra);
|
|
int BKE_ptcache_id_exist(PTCacheID *id, int cfra);
|
|
int BKE_ptcache_id_reset(struct Scene *scene, PTCacheID *id, int mode);
|
|
void BKE_ptcache_id_time(PTCacheID *pid, struct Scene *scene, float cfra, int *startframe, int *endframe, float *timescale);
|
|
int BKE_ptcache_object_reset(struct Scene *scene, struct Object *ob, int mode);
|
|
|
|
/* File reading/writing */
|
|
PTCacheFile *BKE_ptcache_file_open(PTCacheID *id, int mode, int cfra);
|
|
void BKE_ptcache_file_close(PTCacheFile *pf);
|
|
int BKE_ptcache_file_read_floats(PTCacheFile *pf, float *f, int tot);
|
|
int BKE_ptcache_file_write_floats(PTCacheFile *pf, float *f, int tot);
|
|
|
|
void BKE_ptcache_update_info(PTCacheID *pid);
|
|
|
|
/* General cache reading/writing */
|
|
int BKE_ptcache_read_cache(PTCacheReader *reader);
|
|
int BKE_ptcache_write_cache(PTCacheWriter *writer);
|
|
|
|
/* Continue physics */
|
|
void BKE_ptcache_set_continue_physics(struct Scene *scene, int enable);
|
|
int BKE_ptcache_get_continue_physics(void);
|
|
|
|
/* Point Cache */
|
|
struct PointCache *BKE_ptcache_add(void);
|
|
void BKE_ptcache_free(struct PointCache *cache);
|
|
struct PointCache *BKE_ptcache_copy(struct PointCache *cache);
|
|
|
|
/* Baking */
|
|
void BKE_ptcache_quick_cache_all(struct Scene *scene);
|
|
void BKE_ptcache_make_cache(struct PTCacheBaker* baker);
|
|
void BKE_ptcache_toggle_disk_cache(struct PTCacheID *pid);
|
|
|
|
#endif
|