201 lines
4.1 KiB
C
201 lines
4.1 KiB
C
![]() |
#ifndef _shp_anim_h
|
||
|
#define _shp_anim_h 1
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
|
||
|
extern "C" {
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/*
|
||
|
|
||
|
Structures for animating shapes (not morphing)
|
||
|
|
||
|
I am using standard types to organise the
|
||
|
sequences as an enum would force a complete
|
||
|
recompile each time it changed
|
||
|
|
||
|
*/
|
||
|
|
||
|
typedef struct shapeanimationframe
|
||
|
{
|
||
|
|
||
|
// Public variables
|
||
|
|
||
|
|
||
|
|
||
|
// Private variables
|
||
|
|
||
|
int * vertices;
|
||
|
int * item_normals;
|
||
|
|
||
|
|
||
|
} SHAPEANIMATIONFRAME;
|
||
|
|
||
|
|
||
|
typedef struct shapeanimationsequence
|
||
|
{
|
||
|
|
||
|
// Public variables
|
||
|
|
||
|
int radius;
|
||
|
|
||
|
int max_x;
|
||
|
int max_y;
|
||
|
int max_z;
|
||
|
|
||
|
int min_x;
|
||
|
int min_y;
|
||
|
int min_z;
|
||
|
|
||
|
|
||
|
// Private variables
|
||
|
|
||
|
unsigned long num_frames;
|
||
|
SHAPEANIMATIONFRAME * anim_frames;
|
||
|
|
||
|
// unsigned long num_interpolated_frames_per_frame;
|
||
|
// 0 for none
|
||
|
|
||
|
int * vertex_normals;
|
||
|
|
||
|
} SHAPEANIMATIONSEQUENCE;
|
||
|
|
||
|
|
||
|
typedef struct shapeanimationheader
|
||
|
{
|
||
|
|
||
|
// Public variables
|
||
|
|
||
|
|
||
|
// Private variables
|
||
|
|
||
|
unsigned long num_sequences;
|
||
|
|
||
|
SHAPEANIMATIONSEQUENCE * anim_sequences;
|
||
|
|
||
|
int num_shapes_using_this; //number of shapes sharing the same shapeanimationheader
|
||
|
|
||
|
} SHAPEANIMATIONHEADER;
|
||
|
|
||
|
|
||
|
|
||
|
typedef struct shapeanimationcontroldata
|
||
|
{
|
||
|
|
||
|
// Public variables
|
||
|
|
||
|
// 16.16 fixed point
|
||
|
unsigned long seconds_per_frame;
|
||
|
// default is ONE_FIXED / 8
|
||
|
|
||
|
unsigned long sequence_no;
|
||
|
// default is 0
|
||
|
|
||
|
// if you're not interested in setting a start and an end frame
|
||
|
// then set the flag 'default_start_and_end_frames' below
|
||
|
unsigned long start_frame;
|
||
|
unsigned long end_frame;
|
||
|
// no default values
|
||
|
|
||
|
unsigned long default_start_and_end_frames : 1;
|
||
|
// default is on
|
||
|
|
||
|
unsigned long reversed : 1;
|
||
|
// default is off
|
||
|
|
||
|
unsigned long stop_at_end : 1;
|
||
|
// default is off
|
||
|
|
||
|
|
||
|
|
||
|
// Private variables
|
||
|
|
||
|
unsigned long empty : 1;
|
||
|
unsigned long stop_now : 1;
|
||
|
unsigned long pause_at_end : 1;
|
||
|
|
||
|
// if start_frame == end_frame
|
||
|
// then do not stop unless it has done at least one frame
|
||
|
unsigned long done_a_frame : 1;
|
||
|
|
||
|
SHAPEANIMATIONSEQUENCE * sequence;
|
||
|
|
||
|
signed long current_frame;
|
||
|
signed long time_to_next_frame;
|
||
|
|
||
|
} SHAPEANIMATIONCONTROLDATA;
|
||
|
|
||
|
|
||
|
typedef struct shapeanimationcontroller
|
||
|
{
|
||
|
|
||
|
// Public variables
|
||
|
|
||
|
SHAPEANIMATIONCONTROLDATA current;
|
||
|
|
||
|
SHAPEANIMATIONCONTROLDATA next;
|
||
|
|
||
|
unsigned long finished : 1;
|
||
|
|
||
|
|
||
|
// Private variables
|
||
|
|
||
|
unsigned long playing : 1;
|
||
|
|
||
|
SHAPEANIMATIONHEADER * anim_header;
|
||
|
|
||
|
} SHAPEANIMATIONCONTROLLER;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////
|
||
|
///////////////////////////// Funtions /////////////////////////////////
|
||
|
//////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
struct displayblock;
|
||
|
struct shapeheader;
|
||
|
|
||
|
// This sets the current animation (and the next to empty)
|
||
|
unsigned int SetShapeAnimationSequence (struct displayblock *, SHAPEANIMATIONCONTROLDATA *);
|
||
|
unsigned int SetOrphanedShapeAnimationSequence (SHAPEANIMATIONCONTROLLER * sac, SHAPEANIMATIONCONTROLDATA * sacd);
|
||
|
|
||
|
// This sets the next animation (if the current is empty it will set the current)
|
||
|
unsigned int SetNextShapeAnimationSequence (struct displayblock *, SHAPEANIMATIONCONTROLDATA *);
|
||
|
|
||
|
// stop_now == 1 will cause the function to ignore the end_frame value
|
||
|
// set end_frame to -1 for no change to the ending frame of the sequence
|
||
|
void SetCurrentShapeAnimationToStop (struct displayblock *, unsigned long stop_now, signed long end_frame);
|
||
|
|
||
|
SHAPEANIMATIONCONTROLDATA const * GetCurrentShapeAnimationSequenceData (struct displayblock *);
|
||
|
SHAPEANIMATIONCONTROLDATA const * GetNextShapeAnimationSequenceData (struct displayblock *);
|
||
|
|
||
|
// pause_now == 1 will cause the function to ignore the end_frame value
|
||
|
// set end_frame to -1 for no change to the ending frame of the sequence
|
||
|
void PauseCurrentShapeAnimation (struct displayblock *, unsigned long pause_now, signed long end_frame);
|
||
|
void RestartCurrentShapeAnimation (struct displayblock *);
|
||
|
|
||
|
// Please use these functions, whenever you create a block of each type
|
||
|
void InitShapeAnimationController (SHAPEANIMATIONCONTROLLER *, struct shapeheader *);
|
||
|
void InitShapeAnimationControlData (SHAPEANIMATIONCONTROLDATA *);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// These are for the system
|
||
|
|
||
|
void DoAllShapeAnimations ();
|
||
|
|
||
|
void CopyAnimationFrameToShape (SHAPEANIMATIONCONTROLDATA *sacd, struct displayblock * dptr);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#endif
|