1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
|
/*
* Copyright (C) Volition, Inc. 1999. All rights reserved.
*
* All source code herein is the property of Volition, Inc. You may not sell
* or otherwise commercially exploit the source or things you created based on the
* source.
*
*/
#ifndef _MODELANIM_H
#define _MODELANIM_H
#include <limits.h>
#define MAX_TRIGGERED_ANIMATIONS 15
// WMC: Steps to adding a triggered animation
// 1 - add TRIGGER_TYPE_* define
// 2 - increment MAX_TRIGGER_ANIMATION_TYPES
// 3 - add name to animation_type_names array
// 4 - add start trigger (model_anim_start_type)
// 5 - add stop trigger (model_anim_start_type)
#define TRIGGER_TYPE_NONE -1 // No animation
#define TRIGGER_TYPE_INITIAL 0 // This is just the position the subobject should be placed in
#define TRIGGER_TYPE_DOCKING_STAGE_1 1 // Before you dock
#define TRIGGER_TYPE_DOCKING_STAGE_2 2 // Before you dock
#define TRIGGER_TYPE_DOCKING_STAGE_3 3 // Before you dock
#define TRIGGER_TYPE_DOCKED 4 // As you dock
#define TRIGGER_TYPE_PRIMARY_BANK 5 // Primary banks
#define TRIGGER_TYPE_SECONDARY_BANK 6 // Secondary banks
#define TRIGGER_TYPE_DOCK_BAY_DOOR 7 // Fighter bays
#define TRIGGER_TYPE_AFTERBURNER 8 // Afterburner -C
#define TRIGGER_TYPE_TURRET_FIRING 9 // Turret shooting -C
#define TRIGGER_TYPE_SCRIPTED 10 // Triggered exclusively by scripting...maybe SEXPs? -C
#define TRIGGER_TYPE_TURRET_FIRED 11 // Triggered after a turret has fired -The E
#define MAX_TRIGGER_ANIMATION_TYPES 12
extern char *Animation_type_names[MAX_TRIGGER_ANIMATION_TYPES];
// Model Animation Position settings
enum EModelAnimationPosition {
MA_POS_NOT_SET = 0, // not yet setup
MA_POS_SET = 1, // set, but is moving
MA_POS_READY = 2 // set, done with move
};
#define ANIMATION_SUBTYPE_ALL INT_MAX
/**
* This is an object responsable for storing the animation information assosiated with
* a specific triggered animation, one subobject can have many triggered animations
*/
struct queued_animation {
vec3d angle;
vec3d vel;
vec3d accel;
int start;
int start_time;
int end;
int end_time;
int reverse_start;
bool absolute;
int type;
int subtype;
int instance;
int real_end_time;
int start_sound;
int loop_sound;
int end_sound;
float snd_rad;
char sub_name[NAME_LENGTH];
};
extern void queued_animation_init(queued_animation *qa);
extern void queued_animation_correct(queued_animation *qa);
/*
struct trigger_instance{
int type;
int sub_type;
queued_animation properties;
void corect();
};
*/
/**
* This is the triggered animation object, it is responsable for controlling how the current triggered animation works
* rot_accel is the acceleration for starting to move and stopping, so figure it in twice.
*/
class triggered_rotation
{
private:
int start_sound;
int loop_sound;
int end_sound;
int current_snd;
int current_snd_index;
float snd_rad;
int obj_num;
int n_queue;
queued_animation queue[MAX_TRIGGERED_ANIMATIONS];
queued_animation queue_tmp[MAX_TRIGGERED_ANIMATIONS];
public:
triggered_rotation();
~triggered_rotation();
void clear();
void start(queued_animation *q);
void set_to_initial(queued_animation *q);
void set_to_final(queued_animation *q);
void apply_trigger_angles(angles *submodel_angles);
void add_queue(queued_animation *new_queue, int dir);
void process_queue();
vec3d current_ang;
vec3d current_vel;
vec3d rot_accel; // rotational acceleration, 0 means instant
vec3d rot_vel; // radians per second, hold this speed when rot_accel has pushed it to this
vec3d slow_angle; // angle that we should start to slow down
vec3d end_angle; // lock it in
vec3d direction;
int instance; // which animation this is (for reversals)
bool has_started; // animation has started playing
int end_time; // time that we should stop
int start_time; // the time the current animation started
};
extern SCP_vector<triggered_rotation> Triggered_rotations;
// functions...
struct model_subsystem;
class ship_subsys;
class ship;
class ship_info;
void model_anim_submodel_trigger_rotate(model_subsystem *psub, ship_subsys *ss);
void model_anim_set_initial_states(ship *shipp);
void model_anim_fix_reverse_times(ship_info *sip);
// gets animation type index from string name
int model_anim_match_type(char *p);
// starts an animation of a certan type that may be assosiated with a submodel of a ship (returns true if an animation was started)
bool model_anim_start_type(ship_subsys *pss, int animation_type, int subtype, int direction, bool instant = false); // for a specific subsystem
bool model_anim_start_type(ship *shipp, int animation_type, int subtype, int direction, bool instant = false); // for all valid subsystems
// how long until the animation is done
int model_anim_get_time_type(ship_subsys *pss, int animation_type, int subtype); // for a specific subsystem
int model_anim_get_time_type(ship *shipp, int animation_type, int subtype); // for all valid subsystems
// this is for handling multiplayer-safe, client-side, animations
void model_anim_handle_multiplayer(ship *shipp);
// for pushing and popping animations
typedef struct stack_item
{
ship *shipp;
int animation_type;
int subtype;
int direction;
bool instant;
} stack_item;
typedef SCP_vector<stack_item> animation_stack;
extern SCP_map<int, animation_stack> Animation_map;
bool model_anim_push_and_start_type(int stack_unique_id, ship *shipp, int animation_type, int subtype, int direction, bool instant = false);
bool model_anim_pop_and_start_type(int stack_unique_id);
#endif // _MODELANIM_H
|