tornavis/source/blender/blenkernel/nla_private.h

195 lines
5.9 KiB
C

/*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
* All rights reserved.
*/
/** \file
* \ingroup bke
*/
#pragma once
#include "BLI_bitmap.h"
#include "BLI_ghash.h"
#include "RNA_types.h"
#ifdef __cplusplus
extern "C" {
#endif
struct AnimationEvalContext;
/* --------------- NLA Evaluation DataTypes ----------------------- */
/* used for list of strips to accumulate at current time */
typedef struct NlaEvalStrip {
struct NlaEvalStrip *next, *prev;
NlaTrack *track; /* track that this strip belongs to */
NlaStrip *strip; /* strip that's being used */
short track_index; /* the index of the track within the list */
short strip_mode; /* which end of the strip are we looking at */
float strip_time; /* time at which which strip is being evaluated */
} NlaEvalStrip;
/* NlaEvalStrip->strip_mode */
enum eNlaEvalStrip_StripMode {
/* standard evaluation */
NES_TIME_BEFORE = -1,
NES_TIME_WITHIN,
NES_TIME_AFTER,
/* transition-strip evaluations */
NES_TIME_TRANSITION_START,
NES_TIME_TRANSITION_END,
};
struct NlaEvalChannel;
struct NlaEvalData;
/* Unique channel key for GHash. */
typedef struct NlaEvalChannelKey {
struct PointerRNA ptr;
struct PropertyRNA *prop;
} NlaEvalChannelKey;
/* Bitmask of array indices touched by actions. */
typedef struct NlaValidMask {
BLI_bitmap *ptr;
BLI_bitmap buffer[sizeof(uint64_t) / sizeof(BLI_bitmap)];
} NlaValidMask;
/* Set of property values for blending. */
typedef struct NlaEvalChannelSnapshot {
struct NlaEvalChannel *channel;
int length; /* Number of values in the property. */
bool is_base; /* Base snapshot of the channel. */
float values[]; /* Item values. */
/* Memory over-allocated to provide space for values. */
} NlaEvalChannelSnapshot;
/* NlaEvalChannel->mix_mode */
enum eNlaEvalChannel_MixMode {
NEC_MIX_ADD,
NEC_MIX_MULTIPLY,
NEC_MIX_QUATERNION,
NEC_MIX_AXIS_ANGLE,
};
/* Temp channel for accumulating data from NLA for a single property.
* Handles array properties as a unit to allow intelligent blending. */
typedef struct NlaEvalChannel {
struct NlaEvalChannel *next, *prev;
struct NlaEvalData *owner;
/* Original RNA path string and property key. */
const char *rna_path;
NlaEvalChannelKey key;
int index;
bool is_array;
char mix_mode;
/* Associated with the RNA property's value(s), marks which elements are affected by NLA. */
NlaValidMask domain;
/* Base set of values. */
NlaEvalChannelSnapshot base_snapshot;
/* Memory over-allocated to provide space for base_snapshot.values. */
} NlaEvalChannel;
/* Set of values for all channels. */
typedef struct NlaEvalSnapshot {
/* Snapshot this one defaults to. */
struct NlaEvalSnapshot *base;
int size;
NlaEvalChannelSnapshot **channels;
} NlaEvalSnapshot;
/* Set of all channels covered by NLA. */
typedef struct NlaEvalData {
ListBase channels;
/* Mapping of paths and NlaEvalChannelKeys to channels. */
GHash *path_hash;
GHash *key_hash;
/* Base snapshot. */
int num_channels;
NlaEvalSnapshot base_snapshot;
/* Evaluation result shapshot. */
NlaEvalSnapshot eval_snapshot;
} NlaEvalData;
/* Information about the currently edited strip and ones below it for keyframing. */
typedef struct NlaKeyframingContext {
struct NlaKeyframingContext *next, *prev;
/* AnimData for which this context was built. */
struct AnimData *adt;
/* Data of the currently edited strip (copy, or fake strip for the main action). */
NlaStrip strip;
NlaEvalStrip *eval_strip;
/* Evaluated NLA stack below the tweak strip. */
NlaEvalData lower_eval_data;
} NlaKeyframingContext;
/* --------------- NLA Functions (not to be used as a proper API) ----------------------- */
/* convert from strip time <-> global time */
float nlastrip_get_frame(NlaStrip *strip, float cframe, short mode);
/* --------------- NLA Evaluation (very-private stuff) ----------------------- */
/* these functions are only defined here to avoid problems with the order
* in which they get defined. */
NlaEvalStrip *nlastrips_ctime_get_strip(ListBase *list,
ListBase *strips,
short index,
const struct AnimationEvalContext *anim_eval_context,
const bool flush_to_original);
void nlastrip_evaluate(PointerRNA *ptr,
NlaEvalData *channels,
ListBase *modifiers,
NlaEvalStrip *nes,
NlaEvalSnapshot *snapshot,
const struct AnimationEvalContext *anim_eval_context,
const bool flush_to_original);
void nladata_flush_channels(PointerRNA *ptr,
NlaEvalData *channels,
NlaEvalSnapshot *snapshot,
const bool flush_to_original);
void nlasnapshot_blend(NlaEvalData *eval_data,
NlaEvalSnapshot *lower_snapshot,
NlaEvalSnapshot *upper_snapshot,
const short upper_blendmode,
const float upper_influence,
NlaEvalSnapshot *r_blended_snapshot);
#ifdef __cplusplus
}
#endif