diff options
Diffstat (limited to '3dc/win95/animobs.hpp')
| -rw-r--r-- | 3dc/win95/animobs.hpp | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/3dc/win95/animobs.hpp b/3dc/win95/animobs.hpp new file mode 100644 index 0000000..0cdb9f8 --- /dev/null +++ b/3dc/win95/animobs.hpp @@ -0,0 +1,286 @@ +#ifndef _animobs_hpp +#define _animobs_hpp 1 + +#include "chunk.hpp" +#include "chnktype.hpp" + +class Object_Animation_Sequence_Header_Chunk; +class Object_Animation_Sequence_Frame_Chunk; +class Object_Animation_Sequence_Chunk; +class Hierarchy_Bounding_Box_Chunk; + +class Object_Animation_Sequences_Chunk : public Chunk_With_Children +{ +public: + + Object_Animation_Sequences_Chunk (Chunk_With_Children * parent) + : Chunk_With_Children (parent, "OBANSEQS") + {} + Object_Animation_Sequences_Chunk (Chunk_With_Children * const parent,const char *, const size_t); + + void list_sequences(List <Object_Animation_Sequence_Chunk *> * pList); + + Object_Animation_Sequence_Chunk * get_sequence (int num, int sub_num); + +private: + + friend class Object_Chunk; + friend class Object_Hierarchy_Chunk; + + +}; + + + + +class Object_Animation_Sequence_Chunk : public Chunk_With_Children +{ +public: + + Object_Animation_Sequence_Chunk (Object_Animation_Sequences_Chunk * parent) + : Chunk_With_Children (parent, "OBANSEQC") + {} + Object_Animation_Sequence_Chunk (Chunk_With_Children * const parent,const char *, const size_t); + + //creates sequence of one frame ,with name taken from template_seq + Object_Animation_Sequence_Chunk(Object_Animation_Sequences_Chunk * parent,Object_Animation_Sequence_Chunk* template_seq,ChunkQuat& orient,ChunkVectorInt& trans); + + Object_Animation_Sequence_Header_Chunk * get_header(); + + void get_frames(List <Object_Animation_Sequence_Frame_Chunk *>* ); + + int get_sequence_time(); //gets time in ms + int get_sequence_speed(); //gets movement speed in mm/second + + //get (normalised) direction of movement for sequence + //if no direction has been set then returns false , and sets direction to a forward vector + BOOL get_sequence_vector(ChunkVectorFloat* direction); + + //getting and setting flags for this sequence + int get_sequence_flags(); + void set_sequence_flags(int new_flags); + + Hierarchy_Bounding_Box_Chunk* get_bounding_box(); //gets the chunk with the bounding box for the sequence +private: + + friend class Object_Animation_Sequences_Chunk; + + +}; + + + +#define HierarchyFrameFlag_DeltaFrame 0x80000000 +#define HierarchyFrame_SoundIndexMask 0x7f000000 +#define HierarchyFrame_FlagMask 0x00ffffff + +class Object_Animation_Sequence_Frame_Chunk : public Chunk +{ +public: + + Object_Animation_Sequence_Frame_Chunk (Object_Animation_Sequence_Chunk * parent) + : Chunk (parent, "OBASEQFR"), at_frame_no (-1), frame_ref_no (-1) + { + ChunkQuat identity = {0,0,0,1}; + orientation = identity; + + transform.x = 0; + transform.y = 0; + transform.z = 0; + + flags =0; + + num_extra_data=0; + extra_data=0; + } + Object_Animation_Sequence_Frame_Chunk (Chunk_With_Children * parent,const char *, size_t); + + ~Object_Animation_Sequence_Frame_Chunk(){if(extra_data) delete extra_data;} + + ChunkQuat orientation; + ChunkVectorInt transform; + + signed long at_frame_no; //frame start time (0-65535) + + signed long frame_ref_no; //frame index number + + int flags; + + int num_extra_data; + int* extra_data; + + virtual void fill_data_block (char *); + virtual size_t size_chunk () + { + return(chunk_size = 12 + 4*4 + 3*4 + 4 + 4 + 8+4*num_extra_data); + } + + void set_sound_index(int ind); + int get_sound_index(){return ((flags & HierarchyFrame_SoundIndexMask )>>24);} + +private: + + friend class Object_Animation_Sequence_Chunk; + + +}; + + + + +class Object_Animation_Sequence_Header_Chunk : public Chunk +{ +public: + + Object_Animation_Sequence_Header_Chunk(Chunk_With_Children * parent) + : Chunk (parent, "OBASEQHD"), num_frames (0), sequence_number (-1), + sub_sequence_number (-1), sequence_name (0) + { + num_extra_data=0; + extra_data=0; + } + Object_Animation_Sequence_Header_Chunk (Chunk_With_Children * parent,const char *, size_t); + + ~Object_Animation_Sequence_Header_Chunk(); + + unsigned long num_frames; + + signed long sequence_number; + signed long sub_sequence_number; + + int num_extra_data; + int* extra_data; + + char * sequence_name; + + virtual void fill_data_block (char *); + virtual size_t size_chunk () + { + if (sequence_name) + { + return(chunk_size = 12 + 16 + 4*num_extra_data + strlen(sequence_name) + 4 - strlen(sequence_name)%4); + } + else + { + return(chunk_size = 12 + 16 + 4*num_extra_data + 4); + } + } + +private: + + friend class Object_Animation_Sequence_Chunk; + + +}; + +class Object_Animation_Sequence_Time_Chunk : public Chunk +{ +public : + Object_Animation_Sequence_Time_Chunk(Chunk_With_Children* parent) + : Chunk (parent,"OBASEQTM") , sequence_time(0) + { + } + Object_Animation_Sequence_Time_Chunk (Chunk_With_Children * parent,const char *, size_t); + + unsigned int sequence_time; //in milliseconds + + virtual void fill_data_block (char *); + virtual size_t size_chunk (){ return chunk_size=16;} + +private: + + friend class Object_Animation_Sequence_Chunk; + + +}; + + +class Object_Animation_Sequence_Speed_Chunk : public Chunk +{ +public : + Object_Animation_Sequence_Speed_Chunk(Chunk_With_Children* parent) + : Chunk (parent,"OBASEQSP") , sequence_speed(0) ,angle(0),spare(0) + { + } + Object_Animation_Sequence_Speed_Chunk (Chunk_With_Children * parent,const char *, size_t); + + int sequence_speed; //in mm/second + int angle; //in degrees (mainly for tools use) + int spare; + + virtual void fill_data_block (char *); + virtual size_t size_chunk (){ return chunk_size=24;} + +private: + + friend class Object_Animation_Sequence_Chunk; + + +}; + +#define MummySequenceFlag_UpperSequence 0x00000001 +#define MummySequenceFlag_LowerSequence 0x00000002 +#define SequenceFlag_Loops 0x00000004 +#define SequenceFlag_NoLoop 0x00000008 +#define SequenceFlag_NoInterpolation 0x00000010 +#define SequenceFlag_HalfFrameRate 0x00000020 + +class Object_Animation_Sequence_Flags_Chunk : public Chunk +{ +public : + Object_Animation_Sequence_Flags_Chunk(Chunk_With_Children* parent,int _flags) + : Chunk (parent,"OBASEQFL") , flags(_flags) + { + } + Object_Animation_Sequence_Flags_Chunk (Chunk_With_Children * parent,const char *, size_t); + + int flags; + + virtual void fill_data_block (char *); + virtual size_t size_chunk (){ return chunk_size=16;} + +}; + + +struct Object_Animation_Frame +{ + ChunkQuat orientation; + ChunkVectorInt transform; + signed long at_frame_no; //frame start time (0-65535) + int flags; + + int get_sound_index(){return ((flags & HierarchyFrame_SoundIndexMask )>>24);} + +}; + +struct Object_Animation_Sequence +{ + ~Object_Animation_Sequence(){delete [] frames;} + + unsigned long num_frames; + signed long sequence_number; + signed long sub_sequence_number; + unsigned int sequence_time; //in milliseconds + Object_Animation_Frame* frames; +}; + +#define Get_Object_Animation_All_Sequence_Chunk(parent) (Object_Animation_All_Sequence_Chunk*)(parent)->lookup_single_child("OBANALLS") + +//a more compact version of the sequence and frame data +//this format isn't recognized by any of the tools however. +class Object_Animation_All_Sequence_Chunk : public Chunk +{ +public: + + Object_Animation_All_Sequence_Chunk (Chunk_With_Children * parent); + Object_Animation_All_Sequence_Chunk (Chunk_With_Children * const parent,const char *, const size_t); + ~Object_Animation_All_Sequence_Chunk () {delete [] sequences;} + + virtual void fill_data_block (char *); + virtual size_t size_chunk (); + + int num_sequences; + Object_Animation_Sequence* sequences; + +}; +#endif
\ No newline at end of file |
