geBoolean AProject_AddMotion ( AProject *pProject, const char *MotionName, const char *Filename, const ApjMotionFormat Fmt, const geBoolean OptFlag, const int OptLevel, const char *BoneName, int *pIndex // returned index ) { ApjMotionEntry *pEntry; int ArraySize; assert ((OptLevel >= 0) && (OptLevel <= 9)); assert ((Fmt > ApjMotion_Invalid) && (Fmt < ApjMotion_TypeCount)); ArraySize = Array_GetSize (pProject->Motions.Items); if (pProject->Motions.Count == ArraySize) { // array is full, have to extend it int NewSize; NewSize = Array_Resize (pProject->Motions.Items, 2*ArraySize); if (NewSize <= ArraySize) { // couldn't resize geErrorLog_AddString (GE_ERR_MEMORY_RESOURCE, "Adding Motion",NULL); return GE_FALSE; } } pEntry = Array_ItemPtr (pProject->Motions.Items, pProject->Motions.Count); pEntry->Name = NULL; pEntry->Filename = NULL; pEntry->Bone = NULL; pEntry->Fmt = Fmt; if (((pEntry->Name = Util_Strdup (MotionName)) == NULL) || ((pEntry->Filename = Util_Strdup (Filename)) == NULL) || ((pEntry->Bone = Util_Strdup (BoneName)) == NULL)) { geErrorLog_AddString (GE_ERR_MEMORY_RESOURCE, "Adding Motion",NULL); AProject_FreeMotionInfo (pEntry); return GE_FALSE; } pEntry->OptFlag = OptFlag; pEntry->OptLevel = OptLevel; *pIndex = (pProject->Motions.Count)++; return GE_TRUE; }
geBoolean AProject_AddMaterial ( AProject *pProject, const char *MaterialName, const ApjMaterialFormat Fmt, const char *TextureFilename, const float Red, const float Green, const float Blue, const float Alpha, int *pIndex // returned index ) { ApjMaterialEntry *pEntry; int ArraySize; assert ((Fmt == ApjMaterial_Color) || (Fmt == ApjMaterial_Texture)); ArraySize = Array_GetSize (pProject->Materials.Items); if (pProject->Materials.Count == ArraySize) { // array is full, have to extend it int NewSize; NewSize = Array_Resize (pProject->Materials.Items, 2*ArraySize); if (NewSize <= ArraySize) { // couldn't resize geErrorLog_AddString (GE_ERR_MEMORY_RESOURCE, "Adding material",NULL); return GE_FALSE; } } pEntry = Array_ItemPtr (pProject->Materials.Items, pProject->Materials.Count); pEntry->Name = NULL; pEntry->Filename = NULL; if (((pEntry->Name = Util_Strdup (MaterialName)) == NULL) || ((pEntry->Filename = Util_Strdup (TextureFilename)) == NULL)) { geErrorLog_AddString (GE_ERR_MEMORY_RESOURCE, "Adding material",NULL); AProject_FreeMaterialInfo (pEntry); return GE_FALSE; } pEntry->Fmt = Fmt; pEntry->Color.r = Red; pEntry->Color.g = Green; pEntry->Color.b = Blue; pEntry->Color.a = Alpha; *pIndex = (pProject->Materials.Count)++; return GE_TRUE; }
int RUCE_RUDB_Load(RUCE_DB_Entry* Dest, String* Path) { File Sorc; File_Ctor(& Sorc); if(! File_Open(& Sorc, Path, READONLY)) return -1; int ReverseEndian = 0; int64_t FLen = File_GetLength(& Sorc); if(FLen < 48) return -1; char CBuffer[8]; uint32_t Header[4]; uint64_t DataSize; File_Read_Buffer(& Sorc, Header, 12); if(Header[0] != RUDB_Header) { Endian_Switch_Array_UInt32(Header, 4); ReverseEndian = 1; } if(Header[0] != RUDB_Header) return -2; if(Header[2] > RUDB_VERSION) return -3; File_Read_Buffer(& Sorc, CBuffer, 4); if(strncmp(CBuffer, "DATA", 4)) return -4; File_Read_Buffer(& Sorc, & DataSize, 8); if(DataSize < 8) return -5; char* Data = malloc(DataSize); File_Read_Buffer(& Sorc, Data, DataSize); if(Header[1] != CRC32Sum(Data, DataSize, 0)) return -6; memcpy(& (Dest -> HopSize), Data, 8); Data += 8; if(ReverseEndian) Endian_Switch_Array_Int32(& (Dest -> HopSize), 2); while(Data != Data + DataSize) { if(! strncmp(Data, "FRME", 4)) { Data += 4; memcpy(Header, Data, 4); Data += 4; if(ReverseEndian) Endian_Switch_UInt32(Header); int OldSize = Dest -> FrameList_Index + 1; Array_Resize(RUCE_DB_Frame, Dest -> FrameList, OldSize + Header[0]); for(int i = 0 + OldSize; i < Header[0] + OldSize; ++i) { RUCE_DB_Frame_Ctor(& (Dest -> FrameList[i])); if(strncmp(Data, "FRMB", 4)) return -255; Data += 4; memcpy(& (Dest -> FrameList[i].Position), Data, 4); Data += 4; int Cnt; memcpy(& Cnt, Data, 4); Data += 4; if(ReverseEndian) { Endian_Switch_Int32(& (Dest -> FrameList[i].Position)); Endian_Switch_Int32(& Cnt); } Array_Resize(float, Dest -> FrameList[i].Freq, Cnt); Array_Resize(float, Dest -> FrameList[i].Ampl, Cnt); Array_Resize(float, Dest -> FrameList[i].Phse, Cnt); Dest -> FrameList[i].Freq_Index = Cnt - 1; Dest -> FrameList[i].Ampl_Index = Cnt - 1; Dest -> FrameList[i].Phse_Index = Cnt - 1; if(Dest -> FrameList[i].Noiz) free(Dest -> FrameList[i].Noiz); Dest -> FrameList[i].Noiz = RAlloc_Float(Dest -> NoizSize); memcpy(Dest -> FrameList[i].Freq, Data, Cnt * 4); Data += Cnt * 4; memcpy(Dest -> FrameList[i].Ampl, Data, Cnt * 4); Data += Cnt * 4; memcpy(Dest -> FrameList[i].Phse, Data, Cnt * 4); Data += Cnt * 4; memcpy(Dest -> FrameList[i].Noiz, Data, Dest -> NoizSize * 4); Data += Dest -> NoizSize * 4; if(ReverseEndian) { Endian_Switch_Array_Float(Dest -> FrameList[i].Freq, Cnt); Endian_Switch_Array_Float(Dest -> FrameList[i].Ampl, Cnt); Endian_Switch_Array_Float(Dest -> FrameList[i].Phse, Cnt); Endian_Switch_Array_Float(Dest -> FrameList[i].Noiz, Dest -> NoizSize); } } } else if(! strncmp(Data, "PULS", 4))