60void TimeCodedMorphKeysClass::Free(
void)
72 for (
uint32 i=0; i<key_count; i++) {
73 cload.
Read(&w3dkey,
sizeof(w3dkey));
83 for (
int i=0; i<Keys.Count (); i++) {
86 csave.
Write(&w3dkey,
sizeof(w3dkey));
93 Keys.Add (MorphKeyStruct (morph_frame, pose_frame));
99 if (morph_frame < 0.0f) {
100 *pose_frame0 = *pose_frame1 = Keys[0].PoseFrame;
105 if (morph_frame >= Keys[Keys.Count ()-1].MorphFrame) {
106 *pose_frame0 = *pose_frame1 = Keys[Keys.Count ()-1].PoseFrame;
111 int key_index = get_index(morph_frame);
113 *pose_frame0 = Keys[key_index].PoseFrame;
114 *pose_frame1 = Keys[key_index+1].PoseFrame;
115 *fraction = (morph_frame - Keys[key_index].MorphFrame) / (Keys[key_index+1].MorphFrame - Keys[key_index].MorphFrame);
119uint32 TimeCodedMorphKeysClass::get_index(
float frame)
123 float cached_frame = Keys[CachedIdx].MorphFrame;
126 if (frame >= cached_frame) {
129 if (CachedIdx == (
uint32)Keys.
Count ()-1)
return(CachedIdx);
132 if (frame < Keys[CachedIdx + 1].MorphFrame)
return(CachedIdx);
138 if (CachedIdx == (
uint32)Keys.
Count ()-1)
return(CachedIdx);
141 if (frame < Keys[CachedIdx + 1].MorphFrame)
return(CachedIdx);
145 CachedIdx = binary_search_index(frame);
150uint32 TimeCodedMorphKeysClass::binary_search_index(
float req_frame)
153 if (req_frame < Keys[0].MorphFrame)
return 0;
154 if (req_frame >= Keys[Keys.Count ()-1].MorphFrame)
return Keys.Count ()-1;
157 int rightIdx = Keys.Count ();
164 dx = rightIdx - leftIdx;
166 WWASSERT(req_frame >= Keys[leftIdx].MorphFrame);
167 WWASSERT(req_frame < Keys[rightIdx].MorphFrame);
175 if (req_frame < Keys[idx].MorphFrame) {
234static int Build_List_From_String
237 const char * delimiter,
246 if ((buffer !=
NULL) &&
247 (delimiter !=
NULL) &&
248 (string_list !=
NULL))
250 int delim_len = ::strlen (delimiter);
255 for (
const char *entry = buffer;
256 (entry !=
NULL) && (entry[1] != 0);
257 entry = ::strstr (entry, delimiter))
263 if ((::strnicmp (entry, delimiter, delim_len) == 0) && (count > 0)) {
283 (entry !=
NULL) && (entry[1] != 0);
284 entry = ::strstr (entry, delimiter))
290 if ((::strnicmp (entry, delimiter, delim_len) == 0) && (count > 0)) {
298 char *delim_start = ::strstr (entry_string, delimiter);
299 if (delim_start !=
NULL) {
306 if ((entry_string.
Get_Length () > 0) || (count == 0)) {
307 (*string_list)[count++] = entry_string;
311 }
else if (delim_len > 0) {
314 (*string_list)[0] = buffer;
330 while (retval && str[0] !=
NULL){
331 retval = ((str[0] >=
'0' && str[0] <=
'9') || str[0] ==
'-' || str[0] ==
'.');
363 bool success = text_desc.
Read_Line (header);
370 int column_count = Build_List_From_String (header,
",", &column_list);
396 while (text_desc.
Read_Line (frame_desc)) {
402 int list_count = Build_List_From_String (frame_desc,
",", &channel_list);
405 if (list_count > 0) {
410 int frame = ::atoi (channel_list[0]);
415 for (
int index = 1; index < list_count; index ++) {
423 MorphKeyData[index - 1].Add_Key (frame, ::atoi (channel_frame));
433 if (channel_list !=
NULL) {
434 delete [] channel_list;
449 if (column_list !=
NULL) {
450 delete [] column_list;
465 for (
int pivot = 0; pivot <
NumNodes; pivot ++) {
471 for (
int channel = 0; channel <
ChannelCount; channel ++) {
486 ::strcpy (
Name, name);
492 char *separator = ::strchr (full_name,
'.');
493 if (separator !=
NULL) {
556 cload.
Read(&header,
sizeof(header));
566 if (base_pose ==
NULL) {
630 memset(&header,0,
sizeof(header));
640 csave.
Write(&header,
sizeof(header));
663 const char * pose_name =
PoseData[channel]->Get_Name();
665 csave.
Write(pose_name,strlen(pose_name) + 1);
677 int pose_frame0,pose_frame1;
679 MorphKeyData[channel].Get_Morph_Info(frame,&pose_frame0,&pose_frame1,&fraction);
682 PoseData[channel]->Get_Translation(t0,pividx,pose_frame0);
684 PoseData[channel]->Get_Translation(t1,pividx,pose_frame1);
691 int pose_frame0,pose_frame1;
693 MorphKeyData[channel].Get_Morph_Info(frame,&pose_frame0,&pose_frame1,&fraction);
696 PoseData[channel]->Get_Orientation(q0,pividx,pose_frame0);
698 PoseData[channel]->Get_Orientation(q1,pividx,pose_frame1);
705 int pose_frame0,pose_frame1;
707 MorphKeyData[channel].Get_Morph_Info(frame,&pose_frame0,&pose_frame1,&fraction);
710 PoseData[channel]->Get_Orientation(q0,pividx,pose_frame0);
712 PoseData[channel]->Get_Orientation(q1,pividx,pose_frame1);
717 PoseData[channel]->Get_Translation(t0,pividx,pose_frame0);
719 PoseData[channel]->Get_Translation(t1,pividx,pose_frame1);
@ W3D_CHUNK_MORPHANIM_PIVOTCHANNELDATA
@ W3D_CHUNK_MORPHANIM_HEADER
@ W3D_CHUNK_MORPHANIM_CHANNEL
@ W3D_CHUNK_MORPHANIM_POSENAME
@ W3D_CHUNK_MORPH_ANIMATION
@ W3D_CHUNK_MORPHANIM_KEYDATA
uint32 Cur_Chunk_Length()
uint32 Read(void *buf, uint32 nbytes)
uint32 Write(const void *buf, uint32 nbytes)
bool Begin_Chunk(uint32 id)
virtual float Get_Frame_Rate()=0
virtual int Get_Num_Pivots(void) const =0
void Insert_Morph_Key(const int channel, uint32 morph_frame, uint32 pose_frame)
int Save_W3D(ChunkSaveClass &csave)
void Resolve_Pivot_Channels(void)
char AnimName[W3D_NAME_LEN]
TimeCodedMorphKeysClass * MorphKeyData
char HierarchyName[W3D_NAME_LEN]
bool Is_Node_Motion_Present(int pividx)
bool Import(const char *hierarchy_name, TextFileClass &text_desc)
void read_channel(ChunkLoadClass &cload, int channel)
int Load_W3D(ChunkLoadClass &cload)
char Name[2 *W3D_NAME_LEN]
void Get_Transform(Matrix3D &transform, int pividx, float frame) const
void Get_Translation(Vector3 &translation, int pividx, float frame) const
void write_channel(ChunkSaveClass &csave, int channel)
void Set_Name(const char *name)
void Get_Orientation(Quaternion &orientation, int pividx, float frame) const
int Create_New_Morph(const int channels, HAnimClass *anim[])
WWINLINE int Num_Pivots(void) const
WWINLINE void Set_Translation(const Vector3 &t)
void Delete_All(bool allow_shrink=true)
int _cdecl Format(const TCHAR *format,...)
TCHAR * Get_Buffer(int new_length)
int Get_Length(void) const
bool Read_Line(StringClass &string)
void Get_Morph_Info(float morph_frame, int *pose_frame0, int *pose_frame1, float *fraction)
~TimeCodedMorphKeysClass(void)
TimeCodedMorphKeysClass(void)
void Add_Key(uint32 morph_frame, uint32 pose_frame)
bool Load_W3D(ChunkLoadClass &cload)
bool Save_W3D(ChunkSaveClass &csave)
static void Lerp(const Vector3 &a, const Vector3 &b, float alpha, Vector3 *set_result)
static WW3DAssetManager * Get_Instance(void)
virtual HAnimClass * Get_HAnim(const char *name)
virtual HTreeClass * Get_HTree(const char *name)
static float Max(float a, float b)
bool Is_Number(const char *str)
void __cdecl Fast_Slerp(Quaternion &res, const Quaternion &p, const Quaternion &q, float alpha)
Matrix3D & Build_Matrix3D(const Quaternion &q, Matrix3D &out)
#define REF_PTR_RELEASE(x)