// ********************************************************************************** // * "l_a3d_v6.c" * // * Written by : Sébastien Rubens * // * Tabulations : 4 char * // ********************************************************************************** #define L_A3D_V6_C // ********************************************************************************** //#define ShowInfos //#define WaitGetChar #define Details // ********************************************************************************** // Included files #include #include #include #include #include "SCR.h" //#include "LRM.h" #include "specif\\a3x_pref.h" #include "structur\\anim_s.h" #include "a3x_glob.h" #include "makeanim.h" #include "l_global_v6.h" #include "l_a3d_v6.h" #include "l_Tbl_v6.h" #include "l_chl_v6.h" #include "a3x_int.h" #include "a3x_intb.h" // ********************************************************************************** #define NbChannelAlreadyUsed 1000 #define UNKNOW_CHANNEL 0xFFFE static unsigned long ulNoInvalid= 1; // 0= undefined to graphic, 1= Undefined to empty static unsigned short ax_uwChannelAlreadyUsed[NbChannelAlreadyUsed]; static signed long slWaitedStringsTableEntry; static signed long slWaitedVertexesTableEntry; static signed long slWaitedQuaternionsTableEntry; static signed long slWaitedChannelNumber; static signed long slLastFrame, slCurrentFrame, slHierFrame; static signed long slWaitedMax; //static signed long slMaxInChannel; // Max in channel name le to set ChannelNumber value !!! static unsigned short uwPivotDefined; // Flag static unsigned short uwOkAnimationFile; // Flag static unsigned short uwHierDef; // Flag static unsigned short uwNbReadedKeys; static tdstBinA3dAnimationGENERAL *p_stGENERAL; static tdstBinFrame stReadFrame; typedef char tdString[50]; static tdString ax_tdEventType[]= { "SOUND_EVENT", "MECHANIC_EVENT", "GENERATE_EVENT", "GENERIC_EVENT" }; static tdString ax_tdMechanicType[]= { "NoAction", "TurnUp", "TurnDown", "TurnLeft", "TurnRight", "TurnAbsolute", "Jump", "JumpAbsolute", "JumpWithoutAddingSpeed", "Accelerate", "Pulse", "Brake", "GoRelative", "GoAbsolute", "Start", "Continue", "TrackingDirection", "ActionOnCamera", "TurnAbsoluteInProgress", "GoTarget", "GoInDirection", "Fire", "ReachTarget", "TurnAround", "BePushed" }; // ********************************************************************************** // HEADER CALLBACK // ********************************************************************************** static SCR_tde_Anl_ReturnValue fn_eA3dHEADERCallBackV6i( SCR_tdst_File_Description *_p_stFile, char *_p_szName, char *_ap_SzParam[], SCR_tde_Anl_Action _eAction ) { // Section already analysed if (_eAction == SCR_EA_Anl_AlreadyAnalysed) { fprintf( ErrorFile, "%s : A3dHEADER already analysed\n", AnimationName ); } // Beginning of section if (_eAction == SCR_EA_Anl_BeginSection) { #ifdef ShowInfos fn_v_LogSectionBegin( D_BINSCR_LogNew, "A3dHEADER", AnimationName ); #endif // No memory allocation for A3dHEADER uwNbReadedKeys= 0; } // We are in the section else if (_eAction == SCR_EA_Anl_Entry) { // FileType if ( !stricmp(_p_szName, "FileType") ) { if ( stricmp(_ap_SzParam[0], "Animations") ) { fprintf( ErrorFile, "%s : A3dHEADER.FileType is not equal to 'Animations' (%s)\n", AnimationName, _ap_SzParam[0] ); uwOkAnimationFile= 1; bValid(&stAnims[uwAnalysedAnim]) = 1; } else { uwOkAnimationFile= 0; //bValid(&stAnims[uwAnalysedAnim]) = 0; } } // VersionNumber else if ( (uwOkAnimationFile == 0) && !stricmp(_p_szName, "VersionNumber") ) { if ( atoi(_ap_SzParam[0]) != 6 ) { uwOkAnimationFile= 1; bValid(&stAnims[uwAnalysedAnim]) = 1; printf("\nAnimation dans l'ancien format (%s) \n", AnimationName ); fprintf( ErrorFile, "\nAnimation dans l'ancien format (%s) \n", AnimationName ); } else { uwOkAnimationFile= 0; //bValid(&stAnims[uwAnalysedAnim]) = 0; } } // Unknown field else if (uwOkAnimationFile == 0) { fprintf( ErrorFile, "%s : Unknown field in A3d file, A3dHEADER (%s)\n", AnimationName, _ap_SzParam[0] ); } } // End of section else if (_eAction == SCR_EA_Anl_EndSection) { #ifdef ShowInfos fn_v_LogSectionEnd(); #endif } return SCR_ERV_Anl_NormalReturn; } // ********************************************************************************** // STRING TABLE CALLBACK // ********************************************************************************** SCR_tde_Anl_ReturnValue fn_eA3dStringsTableCallBackV6i( SCR_tdst_File_Description *_p_stFile, char *_p_szName, char *_ap_SzParam[], SCR_tde_Anl_Action _eAction ) { // Section already analysed if (_eAction == SCR_EA_Anl_AlreadyAnalysed) { if (uwOkAnimationFile == 0) { fprintf( ErrorFile, "%s : A3dStringsTable already analysed\n", AnimationName ); } } // Beginning of section if (_eAction == SCR_EA_Anl_BeginSection) { if (uwOkAnimationFile == 0) { #ifdef ShowInfos fn_v_LogSectionBegin( D_BINSCR_LogNew, "A3dStringsTable", AnimationName ); #endif //p_szName contains NumberOfStrings and _ap_SzParam[0] contains nothing ( (nothing) ) //Allocate memory for StringsTable slWaitedMax= (signed long) atoi(_p_szName); fn_v_AllocateOnStack( eStackBinStrings, slWaitedMax ); slWaitedStringsTableEntry= 0L; } } // We are in the section else if (_eAction == SCR_EA_Anl_Entry) { if (uwOkAnimationFile == 0) { // Add if ( !stricmp(_p_szName, "Add") ) { if ( slWaitedStringsTableEntry == ReadSLong(0) ) strcpy( &ax_xStrings[M_GetStackAlloc(eStackBinStrings)+slWaitedStringsTableEntry][0], _ap_SzParam[1] ); else fprintf( ErrorFile, "%s : Wrong (first) parameter in A3dStringsTable (%s)\n", AnimationName, _ap_SzParam[0] ); slWaitedStringsTableEntry++; } // Unknown field else { fprintf( ErrorFile, "%s : Unknown field in A3d file, A3dStringsTable (%s)\n", AnimationName, _p_szName ); } } } // End of section else if (_eAction == SCR_EA_Anl_EndSection) { if (uwOkAnimationFile == 0) { if ( slWaitedStringsTableEntry != slWaitedMax ) fprintf(WarningFile, "%s : Not enough entries in StringsTable (%d)\n", AnimationName, slWaitedStringsTableEntry ); #ifdef ShowInfos fn_v_LogSectionEnd(); #endif } } return SCR_ERV_Anl_NormalReturn; } // ********************************************************************************** // VERTEX TABLE CALLBACK // ********************************************************************************** SCR_tde_Anl_ReturnValue fn_eA3dVertexesTableCallBackV6i( SCR_tdst_File_Description *_p_stFile, char *_p_szName, char *_ap_SzParam[], SCR_tde_Anl_Action _eAction ) { signed long slInd; SEB_xReal *p_stVector; // Section already analysed if (_eAction == SCR_EA_Anl_AlreadyAnalysed) { if (uwOkAnimationFile == 0) { fprintf( ErrorFile, "%s : A3dVertexesTable already analysed\n", AnimationName ); } } // Beginning of section if (_eAction == SCR_EA_Anl_BeginSection) { if (uwOkAnimationFile == 0) { #ifdef ShowInfos fn_v_LogSectionBegin( D_BINSCR_LogNew, "A3dVertexesTable", AnimationName ); #endif //Allocate memory for VertexesTable slWaitedMax= (signed long) atoi(_p_szName); fn_v_AllocateOnStack( eStackBinVertexes, slWaitedMax ); slWaitedVertexesTableEntry= 0; } } // We are in the section else if (_eAction == SCR_EA_Anl_Entry) { if (uwOkAnimationFile == 0) { // Add if ( !stricmp(_p_szName, "Add") ) { if ( slWaitedVertexesTableEntry == ReadSLong(0) ) { slInd= M_GetStackAlloc(eStackBinVertexes) + slWaitedVertexesTableEntry; p_stVector= &axa3_xVertexes[slInd][0]; p_stVector[0]= ReadDouble(1); p_stVector[1]= ReadDouble(2); p_stVector[2]= ReadDouble(3); slWaitedVertexesTableEntry++; } else { fprintf( ErrorFile, "%s : Wrong (first) parameter in A3dStringsTable (%s)\n", AnimationName, _ap_SzParam[0] ); } } // Unknown field else { fprintf( ErrorFile, "%s : Unknown field in A3d file, A3dVertexesTable (%s)\n", AnimationName, _p_szName ); } } } // End of section else if (_eAction == SCR_EA_Anl_EndSection) { if (uwOkAnimationFile == 0) { if ( slWaitedVertexesTableEntry != slWaitedMax ) fprintf( ErrorFile, "%s : Not enough entries in VertexesTable (%d)\n", AnimationName, slWaitedVertexesTableEntry ); #ifdef ShowInfos fn_v_LogSectionEnd(); #endif } } return SCR_ERV_Anl_NormalReturn; } // ********************************************************************************** // QUATERNIONS TABLE CALLBACK // ********************************************************************************** SCR_tde_Anl_ReturnValue fn_eA3dQuaternionsTableCallBackV6i( SCR_tdst_File_Description *_p_stFile, char *_p_szName, char *_ap_SzParam[], SCR_tde_Anl_Action _eAction ) { signed long slInd; SEB_xReal *p_stQuater; // Section already analysed if (_eAction == SCR_EA_Anl_AlreadyAnalysed) { if (uwOkAnimationFile == 0) { fprintf( ErrorFile, "%s : A3dQuaternionsTable already analysed\n", AnimationName ); } } // Beginning of section if (_eAction == SCR_EA_Anl_BeginSection) { if (uwOkAnimationFile == 0) { #ifdef ShowInfos fn_v_LogSectionBegin( D_BINSCR_LogNew, "A3dQuaternionsTable", AnimationName ); #endif //Allocate memory for QuaternionsTable slWaitedMax= atoi(_p_szName); fn_v_AllocateOnStack( eStackBinQuaternions, slWaitedMax ); slWaitedQuaternionsTableEntry= 0L; } } // We are in the section else if (_eAction == SCR_EA_Anl_Entry) { if (uwOkAnimationFile == 0) { // Add if ( !stricmp(_p_szName, "Add") ) { if ( slWaitedQuaternionsTableEntry == ReadSLong(0) ) { slInd= M_GetStackAlloc(eStackBinQuaternions) + slWaitedQuaternionsTableEntry; p_stQuater= &axa4_xBinQuaternions[slInd][0]; p_stQuater[0]= ReadDouble(1); p_stQuater[1]= ReadDouble(2); p_stQuater[2]= ReadDouble(3); p_stQuater[3]= ReadDouble(4); slWaitedQuaternionsTableEntry++; } else { fprintf( ErrorFile, "%s : Wrong (first) parameter in A3dStringsTable (%s)\n", AnimationName, _ap_SzParam[0] ); } } // Unknown field else { fprintf( ErrorFile, "%s : Unknown field in A3d file, A3dQuaternionsTable (%s)\n", AnimationName, _p_szName ); } } } // End of section else if (_eAction == SCR_EA_Anl_EndSection) { if (uwOkAnimationFile == 0) { if ( slWaitedQuaternionsTableEntry != slWaitedMax ) fprintf( ErrorFile, "%s : Not enough entries in QuaternionsTable (%d)\n", AnimationName, slWaitedQuaternionsTableEntry ); #ifdef ShowInfos fn_v_LogSectionEnd(); #endif } } return SCR_ERV_Anl_NormalReturn; } // ********************************************************************************** // ANIMATION GENERAL CALLBACK // ********************************************************************************** // Modif 17/08/98 : New Key CameraAngle(do nothing) - Carlos Torres // Modif 27/08/98 : Supress Morph allocation - Carlos Torres SCR_tde_Anl_ReturnValue fn_eA3dAnimationGENERALCallBackV6i( SCR_tdst_File_Description *_p_stFile, char *_p_szName, char *_ap_SzParam[], SCR_tde_Anl_Action _eAction ) { // Section already analysed if (_eAction == SCR_EA_Anl_AlreadyAnalysed) { if (uwOkAnimationFile == 0) { fprintf( ErrorFile, "%s : A3dAnimationGENERAL already analysed\n", AnimationName ); } } // Beginning of section else if (_eAction == SCR_EA_Anl_BeginSection) { if (uwOkAnimationFile == 0) { #ifdef ShowInfos fn_v_LogSectionBegin( D_BINSCR_LogNew, "A3dAnimationGENERAL", AnimationName ); #endif // Set pointer on A3dAnimationGENERAL structure p_stGENERAL= &ax_tdstA3dGENERAL[M_GetStackAlloc(eStackBinA3dGENERAL)]; p_stGENERAL->uwNumberOfFrames= 0; p_stGENERAL->uwNumberOfChannels= 0; p_stGENERAL->uwNumberOfVectors= (unsigned short) (M_GetStackPos(eStackBinVertexes) - M_GetStackAlloc(eStackBinVertexes)); p_stGENERAL->uwNumberOfQuaternions= (unsigned short) (M_GetStackPos(eStackBinQuaternions) - M_GetStackAlloc(eStackBinQuaternions)); p_stGENERAL->uwNumberOfHierarchies= 0; p_stGENERAL->uwNumberOfEvents= 0; p_stGENERAL->uwNumberOfMorphData= 0; p_stGENERAL->slNumOfHierarchies= M_GetStackPos(eStackBinHierarchies); p_stGENERAL->slNumOfVectors= M_GetStackPos(eStackBinVertexes); p_stGENERAL->slNumOfQuaternions= M_GetStackPos(eStackBinQuaternions); p_stGENERAL->slNumOfEvents= M_GetStackPos(eStackBinEvent); p_stGENERAL->slNumOfMorphData= M_GetStackPos(eStackBinMorphInformation); { unsigned long ulCnt; for ( ulCnt=0 ; ulCntuwNumberOfChannels= ReadUShort(0); } // NumberOfFrames else if ( !stricmp(_p_szName, "NumberOfFrames") ) { // Integer p_stGENERAL->uwNumberOfFrames= ReadUShort(0); } // CurrentFrame else if ( !stricmp(_p_szName, "CurrentFrame") ) { // Integer // Not used ------- } // AnimationTranslationOffset else if ( !stricmp(_p_szName, "AnimationTranslationOffset") ) { // Unpacked Vector fn_v_CopyVect( p_stGENERAL->uwAnimationTranslationOffset, axa3_xVertexes[M_GetStackAlloc(eStackBinVertexes) + ReadUShort(0)] ); } // AnimationRotationOffset else if ( !stricmp(_p_szName, "AnimationRotationOffset") ) { // Packed quaternion fn_v_CopyQuat( p_stGENERAL->uwAnimationRotationOffset, axa4_xBinQuaternions[M_GetStackAlloc(eStackBinQuaternions) + ReadUShort(0)] ); } // AnimReferenceChannel else if ( !stricmp(_p_szName, "AnimReferenceChannel") ) { // Integer // Not used ------- } // AnimationSpeed else if ( !stricmp(_p_szName, "AnimationSpeed") ) { // Integer p_stGENERAL->uwAnimationSpeed= ReadUShort(0); } // CameraAngle else if ( !stricmp(_p_szName, "CameraAngle") ) { // ??? // Used by Rayman TV !!! } // Unknown field else { fprintf( ErrorFile, "%s : Unknown field in A3d, AnimationGENERAL (%s)\n", AnimationName, _p_szName ); } } } // End of section else if (_eAction == SCR_EA_Anl_EndSection) { if (uwOkAnimationFile == 0) { signed long slCnt; // Set pointer on A3dAnimationGENERAL structure p_stGENERAL= &ax_tdstA3dGENERAL[M_GetStackAlloc(eStackBinA3dGENERAL)]; p_stGENERAL->uwStartFrame= 0; p_stGENERAL->uwEndFrame= 0; p_stGENERAL->uwFlags= 0; p_stGENERAL->uwFakeAnimSpeed= p_stGENERAL->uwAnimationSpeed; // Allocate memory for all Channels structures fn_v_AllocateOnStack( eStackBinChannels, p_stGENERAL->uwNumberOfChannels ); p_stGENERAL->slNumOfChannels= M_GetStackAlloc(eStackBinChannels); // Allocate memory for all OnlyFrame structures fn_v_AllocateOnStack( eStackBinOnlyFrames, p_stGENERAL->uwNumberOfFrames ); p_stGENERAL->slNumOfOnlyFrames= M_GetStackAlloc(eStackBinOnlyFrames); for ( slCnt=0 ; slCntuwNumberOfFrames ; slCnt++ ) { fn_v_SetIdQuater( ax_tdstOnlyFrames[p_stGENERAL->slNumOfOnlyFrames + slCnt].tdxAngularSpeedQuat ); fn_v_SetZeroVector( ax_tdstOnlyFrames[p_stGENERAL->slNumOfOnlyFrames + slCnt].tdxSpeedVector ); ax_tdstOnlyFrames[p_stGENERAL->slNumOfOnlyFrames + slCnt].slNumOfAngularSpeedQuat= 0xFFFFFFFF; ax_tdstOnlyFrames[p_stGENERAL->slNumOfOnlyFrames + slCnt].slNumOfSpeedVector= 0xFFFFFFFF; ax_tdstOnlyFrames[p_stGENERAL->slNumOfOnlyFrames + slCnt].uwHierarchyNbCouples= 0; ax_tdstOnlyFrames[p_stGENERAL->slNumOfOnlyFrames + slCnt].slNumOfHierarchyCouples= p_stGENERAL->slNumOfHierarchies; } slWaitedChannelNumber= 0; #ifdef ShowInfos fn_v_LogSectionEnd(); #endif } } return SCR_ERV_Anl_NormalReturn; } // ********************************************************************************** // CHANNEL CALLBACK // ********************************************************************************** SCR_tde_Anl_ReturnValue fn_eChannelCallBackV6i( SCR_tdst_File_Description *_p_stFile, char *_p_szName, char *_ap_SzParam[], SCR_tde_Anl_Action _eAction ) { // Section already analysed if (_eAction == SCR_EA_Anl_AlreadyAnalysed) { if (uwOkAnimationFile == 0) { fprintf( ErrorFile, "%s : Channel already analysed (Channel %d)\n", AnimationName, (slWaitedChannelNumber+1) ); } } // Beginning of section else if (_eAction == SCR_EA_Anl_BeginSection) { if (uwOkAnimationFile == 0) { signed long slCnt, slNumCHL; #ifdef ShowInfos fn_v_LogSectionBegin( D_BINSCR_LogNew, "Channel", AnimationName ); #endif // Verify ChannelNumber if ( slWaitedChannelNumber != (signed long) (atoi(_p_szName)-1) ) fprintf( ErrorFile, "%s : Wrong (waited) Channel Number (%s)\n", AnimationName, _ap_SzParam[0] ); // Allocate memory for Frame structures fn_v_AllocateOnStack( eStackBinFrames, p_stGENERAL->uwNumberOfFrames ); ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].slNumOfFrames= M_GetStackAlloc(eStackBinFrames); // Initialize info structure fn_v_CopyVect( ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].a3_xLocalPivotPos, a3_xVector0 ); uwPivotDefined= 0; stReadFrame.swNumberInTable= -1; stReadFrame.uwTypeOfObject= 0; stReadFrame.uwFrameNumber= 0; stReadFrame.uwMask= 0x0000; stReadFrame.uwAttribute= 0; stReadFrame.uwTypeOfObject= TE_EmptyObject; stReadFrame.xInterpolationParameter= 0.0; fn_v_CopyQuat( stReadFrame.a4_xQuatOri, a4_xQuater1 ); fn_v_CopyQuat( stReadFrame.a4_xQuatSca, a4_xQuater1 ); fn_v_CopyVect( stReadFrame.a3_xScaleValues, a3_xVector0 ); fn_v_CopyVect( stReadFrame.a3_xPosition, a3_xVector0 ); stReadFrame.ucTransparency=0xFF; slNumCHL= ReadUShort(0); slCnt= 0; // Channel name search is case sensitive !!! while ((slCnt < slMaxInChannel) && (stricmp(ax_xChannelNames[slCnt],ax_xStrings[M_GetStackAlloc(eStackBinStrings) + slNumCHL]))) slCnt++; if (slCnt < slMaxInChannel) { ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber= (unsigned short) slCnt; if (ax_uwChannelAlreadyUsed[slCnt] == 1) fprintf( ErrorFile, "%s : Channel Name (%s) already used in animation (Channel %d) : possible error !!!\n", AnimationName, ax_xChannelNames[slCnt], (slWaitedChannelNumber+1) ); ax_uwChannelAlreadyUsed[slCnt]= 1; } // unknow channel name else ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber = UNKNOW_CHANNEL; slLastFrame= 0; } } // We are in the section else if (_eAction == SCR_EA_Anl_Entry) { if (uwOkAnimationFile == 0) { if ( !stricmp(_p_szName, "TrajectorySettings") ) { // Editor datas } else if ( !stricmp(_p_szName, "ActiveStatus") ) { // Editor datas } else if ( !stricmp(_p_szName, "IsCamera") ) { // Editor datas } // Unknown field else fprintf( ErrorFile, "%s : Unknown field in A3d file (%s) (Channel %d)\n", AnimationName, _p_szName, (slWaitedChannelNumber+1) ); } } // End of section else if (_eAction == SCR_EA_Anl_EndSection) { if (uwOkAnimationFile == 0) { signed long slCnt; tdxMatrix33 a3a3_xScaleMatrix, a3a3_xMtxSca, a3a3_xMtxOri; tdxVector3 a3_xTmpVec; // Invalid unknow channel channel if (ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber == UNKNOW_CHANNEL) ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber = SEB_Invalid; slWaitedChannelNumber++; // Set other values fn_v_QuatToMatrix( a3a3_xMtxSca, stReadFrame.a4_xQuatSca ); fn_v_QuatToMatrix( a3a3_xMtxOri, stReadFrame.a4_xQuatOri ); fn_v_InvRotDiaRot( a3a3_xScaleMatrix, a3a3_xMtxSca, stReadFrame.a3_xScaleValues ); fn_v_MatrixByVector( a3_xTmpVec, a3a3_xScaleMatrix, ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].a3_xLocalPivotPos ); fn_v_MatrixByVector( stReadFrame.a3_xWorldPivotPosition, a3a3_xMtxOri, a3_xTmpVec ); stReadFrame.a3_xWorldPivotPosition[0]+= stReadFrame.a3_xPosition[0]; stReadFrame.a3_xWorldPivotPosition[1]+= stReadFrame.a3_xPosition[1]; stReadFrame.a3_xWorldPivotPosition[2]+= stReadFrame.a3_xPosition[2]; stReadFrame.xDistMaster= fn_x_VectorLength( stReadFrame.a3_xPosition ); stReadFrame.uwFrameNumber= (unsigned short) slCurrentFrame; // Copy datas to Table stReadFrame.uwMask= 0x0000; stReadFrame.uwAttribute= 0; // On copie les frames jusqu'à la dernière frame ax_tdstFrames[M_GetStackAlloc(eStackBinFrames) + slLastFrame].uwFrameNumber= (unsigned short) slLastFrame; for ( slCnt=slLastFrame+1 ; slCntuwNumberOfFrames ; slCnt++ ) { ax_tdstFrames[M_GetStackAlloc(eStackBinFrames) + slCnt]= ax_tdstFrames[M_GetStackAlloc(eStackBinFrames) + slLastFrame]; ax_tdstFrames[M_GetStackAlloc(eStackBinFrames) + slCnt].uwAttribute= 0x0000; ax_tdstFrames[M_GetStackAlloc(eStackBinFrames) + slCnt].uwFrameNumber= (unsigned short) slCnt; } slLastFrame= slCurrentFrame; #ifdef ShowInfos fn_v_LogSectionEnd(); #endif if (slWaitedChannelNumber == p_stGENERAL->uwNumberOfChannels) { if (p_stGENERAL->uwNumberOfFrames > 2) { if (uwNbReadedKeys == 0) fprintf( WarningFile, "%s : this animation is optimized ???\n", AnimationName ); } } } } return SCR_ERV_Anl_NormalReturn; } // ********************************************************************************** // FRAME CALLBACK // ********************************************************************************** // Modif 27/08/98 : Alloc Morph element and fill new structure - Carlos Torres SCR_tde_Anl_ReturnValue fn_eFrameCallBackV6i( SCR_tdst_File_Description *_p_stFile, char *_p_szName, char *_ap_SzParam[], SCR_tde_Anl_Action _eAction ) { static unsigned short uwEventType; // Section already analysed if (_eAction == SCR_EA_Anl_AlreadyAnalysed) { if (uwOkAnimationFile == 0) { fprintf( ErrorFile, "%s : Frame already analysed (Channel %d, Frame %d)\n", AnimationName, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } } // Beginning of section else if (_eAction == SCR_EA_Anl_BeginSection) { if (uwOkAnimationFile == 0) { uwEventType= 0; #ifdef ShowInfos fn_v_LogSectionBegin( D_BINSCR_LogNew, "Frame", AnimationName ); #endif slCurrentFrame= (atoi(_p_szName) - 1); stReadFrame.uwFrameNumber= 0; } } // We are in the section else if (_eAction == SCR_EA_Anl_Entry) { if (uwOkAnimationFile == 0) { // ObjectType if ( !stricmp(_p_szName, "ObjectType") ) { // String : Object type // No SubAnim // unsigned short uwTypeOfObject if (( !stricmp(_ap_SzParam[0], "3dObject"))||( !stricmp(_ap_SzParam[0], "Morphed"))) { stReadFrame.uwTypeOfObject= TE_GraphicObject; // check if channel is valid if (ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber == UNKNOW_CHANNEL) { fprintf(ErrorFile,"%s : Channel Name not found (Channel %d)\n",AnimationName,slWaitedChannelNumber+1); ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber = SEB_Invalid; } } else if ( !stricmp(_ap_SzParam[0], "Light") ) { stReadFrame.uwTypeOfObject= TE_Light; fprintf(ErrorFile,"%s : Light Object isn't suported (Channel %d, Frame %d)\n",AnimationName,slWaitedChannelNumber+1,slCurrentFrame+1); } else if ( !stricmp(_ap_SzParam[0], "SoundEvent") ) { stReadFrame.uwTypeOfObject= TE_Event; // Transform to simple event uwEventType= C_ucSOUND_EVENT; } else if ( !stricmp(_ap_SzParam[0], "CameraEvent") ) { stReadFrame.uwTypeOfObject= TE_Event; // Transform to simple event fprintf(ErrorFile,"%s : Camera Event isn't suported (Channel %d, Frame %d)\n",AnimationName,slWaitedChannelNumber+1,slCurrentFrame+1); } else if ( !stricmp(_ap_SzParam[0], "GenericEvent") ) { stReadFrame.uwTypeOfObject= TE_Event; // Transform to simple event uwEventType= C_ucGENERIC_EVENT; // check if channel is valid if (ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber == UNKNOW_CHANNEL) { fprintf(ErrorFile,"%s : Channel Name not found (Channel %d)\n",AnimationName,slWaitedChannelNumber+1); ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber = SEB_Invalid; } } else if ( !stricmp(_ap_SzParam[0], "GenerateEvent") ) { stReadFrame.uwTypeOfObject= TE_Event; // Transform to simple event uwEventType= C_ucGENERATE_EVENT; // check if channel is valid if (ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber == UNKNOW_CHANNEL) { fprintf(ErrorFile,"%s : Channel Name not found (Channel %d)\n",AnimationName,slWaitedChannelNumber+1); ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber = SEB_Invalid; } } else if ( !stricmp(_ap_SzParam[0], "MechanicEvent") ) { stReadFrame.uwTypeOfObject= TE_Event; // Transform to simple event uwEventType= C_ucMECHANIC_EVENT; fprintf(ErrorFile,"%s : Machanic Event isn't supported (Channel %d, Frame %d)\n",AnimationName,slWaitedChannelNumber+1,slCurrentFrame+1); } else if ( !stricmp(_ap_SzParam[0], "Fake") ) { stReadFrame.uwTypeOfObject= TE_Fake; // check if channel is valid if (ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber == UNKNOW_CHANNEL) { fprintf(ErrorFile,"%s : Channel Name not found (Channel %d)\n",AnimationName,slWaitedChannelNumber+1); ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber = SEB_Invalid; } } else if ( !stricmp(_ap_SzParam[0], "Empty") ) { stReadFrame.uwTypeOfObject= TE_EmptyObject; stReadFrame.swNumberInTable= -1; } else if ( !stricmp(_ap_SzParam[0], "Undefined") ) { stReadFrame.uwTypeOfObject= TE_Undefined; fprintf(WarningFile,"%s : ObjectType is undefined (Channel %d, Frame %d)\n",AnimationName,slWaitedChannelNumber+1,slCurrentFrame+1); } else { stReadFrame.swNumberInTable= -1; stReadFrame.uwTypeOfObject= TE_EmptyObject; fprintf( ErrorFile, "%s : Unknow type of object (%s) (Channel %d, Frame %d)\n", AnimationName, _ap_SzParam[0], (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } } // Bank else if ( !stricmp(_p_szName, "Bank") ) { // Integer // Not used ------- } // Object else if ( !stricmp(_p_szName, "Object") ) { // Reference to StringsTable (Name of object) // Not used } // NumberInTable else if ( !stricmp(_p_szName, "NumberInTable") ) { // set number in table and object presence in anim stReadFrame.swNumberInTable= (signed short)(ReadUShort(0)-1); ax_tdstTabTBL[stReadFrame.swNumberInTable].ucFlag |= OBJECT_IN_ANIM; if (stReadFrame.swNumberInTable >= 0) { // objet non present dans la TBL if (!(ax_tdstTabTBL[stReadFrame.swNumberInTable].ucFlag & OBJECT_IN_TBL)) { fprintf( ErrorFile, "%s : NumberInTable #%d not existing in Table of Objects (Channel %d, Frame %d)\n", AnimationName, (stReadFrame.swNumberInTable+1), (slWaitedChannelNumber+1), (slCurrentFrame+1) ); stReadFrame.uwTypeOfObject= TE_EmptyObject; stReadFrame.swNumberInTable= -1; ax_tdstTabTBL[stReadFrame.swNumberInTable].ucFlag &= ~OBJECT_IN_ANIM; } // object undefined choose depending on TBL else if (stReadFrame.uwTypeOfObject == TE_Undefined) { stReadFrame.uwTypeOfObject = (ax_tdstTabTBL[stReadFrame.swNumberInTable].ucIsObject)?TE_GraphicObject:TE_Event; } // type Object and Event in TBL !! Strange else if ((stReadFrame.uwTypeOfObject == TE_GraphicObject) && (!ax_tdstTabTBL[stReadFrame.swNumberInTable].ucIsObject) ) { stReadFrame.uwTypeOfObject= TE_Event; fprintf( ErrorFile, "%s : 3dObject in A3d, Not a 3dObject in Object Table (NumberInTable %d, Channel %d, Frame %d)\n", AnimationName, (stReadFrame.swNumberInTable+1), (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } // type Event and Object in TBL !! Strange else if ((stReadFrame.uwTypeOfObject == TE_Event) && (ax_tdstTabTBL[stReadFrame.swNumberInTable].ucIsObject) ) { stReadFrame.uwTypeOfObject= TE_GraphicObject; fprintf( ErrorFile, "%s : Event in A3d, 3dObject in Object Table (NumberInTable %d, Channel %d, Frame %d)\n", AnimationName, (stReadFrame.swNumberInTable+1), (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } } } // IncludingBox else if ( !stricmp(_p_szName, "IncludingBox") ) { // Reference to vector + reference to vector // Not used } // Position else if ( !stricmp(_p_szName, "Position") ) { // Reference to vector fn_v_CopyVect( stReadFrame.a3_xPosition, axa3_xVertexes[M_GetStackAlloc(eStackBinVertexes) + ReadUShort(0)] ); } // Orientation else if ( !stricmp(_p_szName, "Orientation") ) { // Reference to quaternion fn_v_CopyQuat( stReadFrame.a4_xQuatOri, axa4_xBinQuaternions[M_GetStackAlloc(eStackBinQuaternions) + ReadUShort(0)] ); } // Scale else if ( !stricmp(_p_szName, "Scale") ) { // Reference to quaternions fn_v_CopyQuat( stReadFrame.a4_xQuatSca, axa4_xBinQuaternions[M_GetStackAlloc(eStackBinQuaternions) + ReadUShort(0)] ); // Reference to vector fn_v_CopyVect( stReadFrame.a3_xScaleValues, axa3_xVertexes[M_GetStackAlloc(eStackBinVertexes) + ReadUShort(1)] ); } // PivotPosition else if ( !stricmp(_p_szName, "PivotPosition") ) { // Reference to vector if ( uwPivotDefined == 0 ) { uwPivotDefined= 1; fn_v_CopyVect( ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].a3_xLocalPivotPos, axa3_xVertexes[M_GetStackAlloc(eStackBinVertexes) + ReadUShort(0)] ); } else { if ( fn_uw_CompVect( ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].a3_xLocalPivotPos, axa3_xVertexes[M_GetStackAlloc(eStackBinVertexes) + ReadUShort(0)] ) != 0 ) fprintf(WarningFile, "%s : PivotPosition is changed, changing is ignore (Channel %d, Frame %d)\n", AnimationName, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } } // PivotOrientation else if ( !stricmp(_p_szName, "PivotOrientation") ) { SEB_xReal *p_tdxQuat; // Reference to quaternion // Must be equal to identity in this version ! p_tdxQuat= &axa4_xBinQuaternions[M_GetStackAlloc(eStackBinQuaternions) + ReadUShort(0)][0]; //if ( (p_tdxQuat[0]!=xZero) || (p_tdxQuat[1]!=xZero) || (p_tdxQuat[2]!=xZero) || (p_tdxQuat[3]!=xOne) ) // fprintf( ErrorFile, "%s : PivotOrientation must be equal to Identity (Channel %d, Frame %d)\n", AnimationName, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); fn_v_CopyQuat( axa4_xBinQuaternions[M_GetStackAlloc(eStackBinQuaternions) + ReadUShort(0)], a4_xQuater1 ); } // Morphing AR980304 else if ( !stricmp(_p_szName, "Morphing") ) { unsigned short uwTargetObjectNumber=(unsigned short)(ReadUChar(0)-1); if (!(ax_tdstTabTBL[uwTargetObjectNumber].ucFlag & OBJECT_IN_TBL) || (!ax_tdstTabTBL[uwTargetObjectNumber].ucIsObject) ) { fprintf( ErrorFile, "%s : Morphing Target #%d not existing in Table of Objects (Channel %d, Frame %d)\n", AnimationName, uwTargetObjectNumber+1, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } else { ax_tdstTabTBL[uwTargetObjectNumber].ucFlag |= OBJECT_IN_ANIM; // Add 1 Morphing info fn_v_AllocateOnStack(eStackBinMorphInformation,1); p_stGENERAL->uwNumberOfMorphData++; // Fill the array ax_tdstBinMorphInfos[M_GetStackAlloc(eStackBinMorphInformation)].ucTarget=(unsigned char)(ReadUChar(0)-1); ax_tdstBinMorphInfos[M_GetStackAlloc(eStackBinMorphInformation)].ucMorphingAmount=ReadUChar(1); ax_tdstBinMorphInfos[M_GetStackAlloc(eStackBinMorphInformation)].uwChannelNumber=ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber; ax_tdstBinMorphInfos[M_GetStackAlloc(eStackBinMorphInformation)].uwFrameNumber=(unsigned short)slCurrentFrame; } } // Transparency else if ( !stricmp(_p_szName, "Transparency") ) { unsigned short uwTransparency = ReadUShort(0); if (uwTransparency > 255) { uwTransparency = 255; fprintf( ErrorFile, "%s : Transparency %d > 255 (Channel %d, Frame %d)\n", AnimationName,uwTransparency, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } stReadFrame.ucTransparency = (unsigned char)uwTransparency; } // FakeProperties else if ( !stricmp(_p_szName, "FakeProperties") ) { } // Nothing To do // Unknown field else { fprintf( ErrorFile, "%s : Unknown field in A3d (%s) (Channel %d, Frame %d)\n", AnimationName, _p_szName, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } } } // End of section else if (_eAction == SCR_EA_Anl_EndSection) { if (uwOkAnimationFile == 0) { signed long slCnt; tdxMatrix33 a3a3_xScaleMatrix, a3a3_xMtxSca, a3a3_xMtxOri; tdxVector3 a3_xTmpVec; // Copy Event (if we have an event of course !) if ((stReadFrame.uwTypeOfObject & 0x00FF) == TE_Event) { if (stReadFrame.swNumberInTable < 0) { stReadFrame.uwTypeOfObject= (stReadFrame.uwTypeOfObject & 0xFF00) | TE_EmptyObject; fprintf( ErrorFile, "%s : NumberInTable #%d not valid for event\n", AnimationName, (stReadFrame.swNumberInTable+1) ); } else { unsigned short uwNumOfEntry; signed long slEventInd; fn_v_AllocateOnStack( eStackBinEvent, 1 ); slEventInd= M_GetStackAlloc(eStackBinEvent); uwNumOfEntry= stReadFrame.swNumberInTable; ax_tdstEvents[slEventInd].usEventNumberInTBL= uwNumOfEntry; ax_tdstEvents[slEventInd].uwFrameNumber= (unsigned short) slCurrentFrame; ax_tdstEvents[slEventInd].uwChannelNumber= ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].uwChannelNumber; p_stGENERAL->uwNumberOfEvents++; } } // Set other values fn_v_QuatToMatrix( a3a3_xMtxSca, stReadFrame.a4_xQuatSca ); fn_v_QuatToMatrix( a3a3_xMtxOri, stReadFrame.a4_xQuatOri ); fn_v_InvRotDiaRot( a3a3_xScaleMatrix, a3a3_xMtxSca, stReadFrame.a3_xScaleValues ); fn_v_MatrixByVector( a3_xTmpVec, a3a3_xScaleMatrix, ax_tdstChannels[p_stGENERAL->slNumOfChannels + slWaitedChannelNumber].a3_xLocalPivotPos ); fn_v_MatrixByVector( stReadFrame.a3_xWorldPivotPosition, a3a3_xMtxOri, a3_xTmpVec ); stReadFrame.a3_xWorldPivotPosition[0]+= stReadFrame.a3_xPosition[0]; stReadFrame.a3_xWorldPivotPosition[1]+= stReadFrame.a3_xPosition[1]; stReadFrame.a3_xWorldPivotPosition[2]+= stReadFrame.a3_xPosition[2]; stReadFrame.xDistMaster= fn_x_VectorLength( stReadFrame.a3_xPosition ); stReadFrame.uwFrameNumber= (unsigned short) slCurrentFrame; // Copy datas to Table ax_tdstFrames[M_GetStackAlloc(eStackBinFrames) + slCurrentFrame]= stReadFrame; stReadFrame.uwMask= 0x0000; stReadFrame.uwAttribute= 0; // On copie les frames jusqu'à la dernière frame for ( slCnt=slLastFrame+1 ; slCnt 1.0) { xInterpolation= 1.0; fprintf( ErrorFile, "%s : Interpolation (mode 1) parameter is greater than 1, and will set to 1 (Channel %d, Frame %d)\n", AnimationName, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } stReadFrame.xInterpolationParameter = (SEB_xReal)(2.0 - (4.0 * xInterpolation)); } else // Unknow interpolation type fprintf( ErrorFile, "%s : Interpolation type is not equal to 0 (linear) (Channel %d, Frame %d)\n", AnimationName, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } // Morphing else if ( !stricmp(_p_szName, "Morphing") ) { } // Nothing To do // Unknown field else { fprintf( ErrorFile, "%s : Unknown field in A3d (%s) (Channel %d, Frame %d)\n", AnimationName, _p_szName, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } } } // End of section else if (_eAction == SCR_EA_Anl_EndSection) { if (uwOkAnimationFile == 0) { #ifdef ShowInfos fn_v_LogSectionEnd(); #endif } } return SCR_ERV_Anl_NormalReturn; } // ********************************************************************************** // SPEED LIST CALLBACK // ********************************************************************************** SCR_tde_Anl_ReturnValue fn_eSpeedsListCallBackV6i( SCR_tdst_File_Description *_p_stFile, char *_p_szName, char *_ap_SzParam[], SCR_tde_Anl_Action _eAction ) { // Section already analysed if (_eAction == SCR_EA_Anl_AlreadyAnalysed) { if (uwOkAnimationFile == 0) { fprintf( ErrorFile, "%s : SpeedsList already analysed (Channel %d, Frame %d)\n", AnimationName, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } } // Beginning of section else if (_eAction == SCR_EA_Anl_BeginSection) { if (uwOkAnimationFile == 0) { signed long slCnt; #ifdef ShowInfos fn_v_LogSectionBegin( D_BINSCR_LogNew, "SpeedsList", AnimationName ); #endif // Initialise memory fn_v_CopyQuat( ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames)].tdxAngularSpeedQuat, a4_xQuater1 ); fn_v_CopyVect( ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames)].tdxSpeedVector, a3_xVector0 ); slLastFrame= 0; for ( slCnt=0 ; slCntuwNumberOfFrames ; slCnt++ ) { ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + slCnt].slNumOfAngularSpeedQuat= 0xFFFFFFFF; ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + slCnt].slNumOfSpeedVector= 0xFFFFFFFF; } } } // We are in the section else if (_eAction == SCR_EA_Anl_Entry) { if (uwOkAnimationFile == 0) { // Unknown field fprintf( ErrorFile, "%s : Unknown field in A3d file, SpeedsList (%s) (Channel %d, Frame %d)\n", AnimationName, _p_szName, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } } // End of section else if (_eAction == SCR_EA_Anl_EndSection) { if (uwOkAnimationFile == 0) { unsigned long ulFrameNumber, ulLastFrameNumber; ulLastFrameNumber= M_GetStackAlloc(eStackBinOnlyFrames); // SpeedQuaternion for ( ulFrameNumber=0 ; ulFrameNumberuwNumberOfFrames ; ulFrameNumber++ ) { if (ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + ulFrameNumber].slNumOfAngularSpeedQuat != 0xFFFFFFFF) { break; } } if (ulFrameNumber < p_stGENERAL->uwNumberOfFrames) { ulLastFrameNumber= 0; if (ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames)].slNumOfAngularSpeedQuat == 0xFFFFFFFF) { fn_v_SetIdQuater( ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames)].tdxAngularSpeedQuat ); ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames)].slNumOfAngularSpeedQuat= 0; } // Fill gaps between AngularSpeed changes. for ( ulFrameNumber=1 ; ulFrameNumberuwNumberOfFrames ; ulFrameNumber++ ) { if (ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + ulFrameNumber].slNumOfAngularSpeedQuat == 0xFFFFFFFF) { fn_v_CopyQuat( ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + ulFrameNumber ].tdxAngularSpeedQuat, ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + ulLastFrameNumber].tdxAngularSpeedQuat ); ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + ulFrameNumber].slNumOfAngularSpeedQuat= 0; } else { ulLastFrameNumber= ulFrameNumber; } } } else printf("Pas de speed\n"); // SpeedVector for ( ulFrameNumber=0 ; ulFrameNumberuwNumberOfFrames ; ulFrameNumber++ ) { if (ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + ulFrameNumber].slNumOfSpeedVector != 0xFFFFFFFF) { break; } } if (ulFrameNumber < p_stGENERAL->uwNumberOfFrames) { ulLastFrameNumber= 0; if (ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames)].slNumOfSpeedVector == 0xFFFFFFFF) { fn_v_SetIdQuater( ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames)].tdxSpeedVector ); ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames)].slNumOfSpeedVector= 0; } // Fill gaps between AngularSpeed changes. for ( ulFrameNumber=1 ; ulFrameNumberuwNumberOfFrames ; ulFrameNumber++ ) { if (ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + ulFrameNumber].slNumOfSpeedVector == 0xFFFFFFFF) { fn_v_CopyVect( ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + ulFrameNumber ].tdxSpeedVector, ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + ulLastFrameNumber].tdxSpeedVector ); ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + ulFrameNumber].slNumOfSpeedVector= 0; } else { ulLastFrameNumber= ulFrameNumber; } } } else printf("Pas de speed\n"); #ifdef ShowInfos fn_v_LogSectionEnd(); #endif } } return SCR_ERV_Anl_NormalReturn; } // ********************************************************************************** // SPEED CALLBACK // ********************************************************************************** SCR_tde_Anl_ReturnValue fn_eSpeedCallBackV6i( SCR_tdst_File_Description *_p_stFile, char *_p_szName, char *_ap_SzParam[], SCR_tde_Anl_Action _eAction ) { // Section already analysed if (_eAction == SCR_EA_Anl_AlreadyAnalysed) { if (uwOkAnimationFile == 0) { fprintf( ErrorFile, "%s : Speed already analysed (Channel %d, Frame %d)\n", AnimationName, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } } // Beginning of section else if (_eAction == SCR_EA_Anl_BeginSection) { if (uwOkAnimationFile == 0) { #ifdef ShowInfos fn_v_LogSectionBegin( D_BINSCR_LogNew, "Speed", AnimationName ); #endif // Readed Frame slCurrentFrame= (atoi(_p_szName) - 1); } } // We are in the section else if (_eAction == SCR_EA_Anl_Entry) { if (uwOkAnimationFile == 0) { // RotationSpeed if ( !stricmp(_p_szName, "RotationSpeed") ) { // Reference to quaternion fn_v_CopyQuat( ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + slCurrentFrame].tdxAngularSpeedQuat, axa4_xBinQuaternions[M_GetStackAlloc(eStackBinQuaternions) + ReadUShort(0)] ); ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + slCurrentFrame].slNumOfAngularSpeedQuat= 0; } // TranslationSpeed else if ( !stricmp(_p_szName, "TranslationSpeed") ) { // Reference to vector fn_v_CopyVect( ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + slCurrentFrame].tdxSpeedVector, axa3_xVertexes[M_GetStackAlloc(eStackBinVertexes) + ReadUShort(0)] ); ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + slCurrentFrame].slNumOfSpeedVector= 0; } // Unknown field else { fprintf( ErrorFile, "%s : Unknown field in A3d, SpeedsList, Speed (%s) (Channel %d, Frame %d)\n", AnimationName, _p_szName, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } } } // End of section else if (_eAction == SCR_EA_Anl_EndSection) { if (uwOkAnimationFile == 0) { slLastFrame= slCurrentFrame; #ifdef ShowInfos fn_v_LogSectionEnd(); #endif } } return SCR_ERV_Anl_NormalReturn; } // ********************************************************************************** // HIERARCHIES LIST CALLBACK // ********************************************************************************** SCR_tde_Anl_ReturnValue fn_eHierarchiesListCallBackV6i( SCR_tdst_File_Description *_p_stFile, char *_p_szName, char *ap_SzParam[], SCR_tde_Anl_Action _eAction ) { // Section already analysed if (_eAction == SCR_EA_Anl_AlreadyAnalysed) { if (uwOkAnimationFile == 0) { fprintf( ErrorFile, "%s : HierarchiesList already analysed (Channel %d, Frame %d)\n", AnimationName, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } } // Beginning of section else if (_eAction == SCR_EA_Anl_BeginSection) { if (uwOkAnimationFile == 0) { #ifdef ShowInfos fn_v_LogSectionBegin( D_BINSCR_LogNew, "Hierarchy", AnimationName ); #endif // Initialise memory p_stGENERAL->slNumOfHierarchies= M_GetStackPos(eStackBinHierarchies); p_stGENERAL->uwNumberOfHierarchies= 0; slLastFrame= 0; uwHierDef= 0; ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames)].uwHierarchyNbCouples= 0; } } // We are in the section else if (_eAction == SCR_EA_Anl_Entry) { if (uwOkAnimationFile == 0) { // Unknown field fprintf( ErrorFile, "%s : Unknown field in A3d file, HierarchiesList (%s) (Channel %d, Frame %d)\n", AnimationName, _p_szName, (slWaitedChannelNumber+1), (slCurrentFrame+1) ); } } // End of section else if (_eAction == SCR_EA_Anl_EndSection) { if (uwOkAnimationFile == 0) { signed long slCnt; // On copie les Hierarchy de la dernière frame jusqu'à celle-ci for ( slCnt=slLastFrame+1 ; slCntuwNumberOfFrames ; slCnt++ ) { ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + slCnt].uwHierarchyNbCouples= ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + slLastFrame].uwHierarchyNbCouples; ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + slCnt].slNumOfHierarchyCouples= ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + slLastFrame].slNumOfHierarchyCouples; } p_stGENERAL->uwNumberOfHierarchies= (unsigned short) (M_GetStackPos(eStackBinHierarchies) - p_stGENERAL->slNumOfHierarchies); #ifdef ShowInfos fn_v_LogSectionEnd(); #endif } } return SCR_ERV_Anl_NormalReturn; } // ********************************************************************************** unsigned long fn_uw_CompareHierarchy( signed long slOldFrame, signed long slNewFrame ) { signed long slCnt1, slCnt2, slCnt3; if ( ax_tdstOnlyFrames[slOldFrame].uwHierarchyNbCouples == ax_tdstOnlyFrames[slNewFrame].uwHierarchyNbCouples ) { // For all hierarchy couples in CurrentFrame for ( slCnt1=0 ; slCnt1 p_stGENERAL->uwNumberOfChannels) ) fprintf( ErrorFile, "%s : Invalid hierarchy channel number (%s) (Channel %d, Frame %d)\n", AnimationName, _p_szName, (slWaitedChannelNumber+1), (slHierFrame+1) ); if ( (ReadUShort(1) <= 0) || (ReadUShort(1) > p_stGENERAL->uwNumberOfChannels) ) fprintf( ErrorFile, "%s : Invalid hierarchy channel number (%s) (Channel %d, Frame %d)\n", AnimationName, _p_szName, (slWaitedChannelNumber+1), (slHierFrame+1) ); } // Unknown field else { fprintf( ErrorFile, "%s : Unknown field in A3d, HierarchiesList, A3dHIERARCHY (%s) (Channel %d, Frame %d)\n", AnimationName, _p_szName, (slWaitedChannelNumber+1), (slHierFrame+1) ); } } } // End of section else if (_eAction == SCR_EA_Anl_EndSection) { if (uwOkAnimationFile == 0) { signed long slInd, slCnt, slRet; // On copie les hierarchies de la dernière frame jusqu'à celle-ci for ( slCnt=slLastFrame+1 ; slCnt= 0 ) { if (fn_uw_CompareHierarchy( M_GetStackAlloc(eStackBinOnlyFrames) + slHierFrame - 1, M_GetStackAlloc(eStackBinOnlyFrames) + slHierFrame ) == 0 ) fprintf(WarningFile, "%s : This hierarchy is duplicated (can be change) (Channel %d, Frame %d)\n", AnimationName, (slWaitedChannelNumber+1), (slHierFrame+1) ); fn_v_DeAllocateOnStack( eStackBinHierarchies, ax_tdstOnlyFrames[slInd + slHierFrame].uwHierarchyNbCouples); ax_tdstOnlyFrames[M_GetStackAlloc(eStackBinOnlyFrames) + slHierFrame].slNumOfHierarchyCouples= ax_tdstOnlyFrames[slRet].slNumOfHierarchyCouples; } } #ifdef ShowInfos fn_v_LogSectionEnd(); #endif } } return SCR_ERV_Anl_NormalReturn; } // ********************************************************************************** // A3D FILE CALLBACK // ********************************************************************************** // Modif 28/10/98 Allocate A3dGeneral - Carlos Torres // ********************************************************************************** SCR_tde_Anl_ReturnValue fn_eA3DfileCallBackV6i( SCR_tdst_File_Description *_p_stFile, char *_p_szName, char *_ap_SzParam[], SCR_tde_Anl_Action _eAction ) { if (_eAction == SCR_EA_Anl_AlreadyAnalysed) { } else if (_eAction == SCR_EA_Anl_BeginSection) { fn_v_LogSectionBegin( D_BINSCR_LogNew, ".a3d", AnimationName ); // always allocate A3D General in stack to respect indexing fn_v_AllocateOnStack( eStackBinA3dGENERAL, 1 ); } else if (_eAction == SCR_EA_Anl_Entry) { fprintf( ErrorFile, "%s : Unknown field in .a3d (%s)\n", AnimationName, _p_szName ); } else if (_eAction == SCR_EA_Anl_EndSection) { fn_v_LogSectionEnd(); } return SCR_ERV_Anl_NormalReturn; } // ********************************************************************************** // Modif 28/10/98 init validAnim table - Carlos Torres // ********************************************************************************** void fn_v_InitA3dV6i( void ) { // Register CallBack on A3dHeader SCR_fn_v_RdL0_RegisterCallback( "A3dHEADER", fn_eA3dHEADERCallBackV6i, SCR_CRC_c_RdL0_ForSection ); // Register CallBack on A3dStringsTable SCR_fn_v_RdL0_RegisterCallback( "A3dStringsTable", fn_eA3dStringsTableCallBackV6i, SCR_CRC_c_RdL0_ForSection ); // Register CallBack on A3dVertexesTable SCR_fn_v_RdL0_RegisterCallback( "A3dVertexesTable", fn_eA3dVertexesTableCallBackV6i, SCR_CRC_c_RdL0_ForSection ); // Register CallBack on A3dQuaternionsTable SCR_fn_v_RdL0_RegisterCallback( "A3dQuaternionsTable", fn_eA3dQuaternionsTableCallBackV6i, SCR_CRC_c_RdL0_ForSection ); // Register CallBack on A3dAnimationGENERAL SCR_fn_v_RdL0_RegisterCallback( "A3dAnimationGENERAL", fn_eA3dAnimationGENERALCallBackV6i, SCR_CRC_c_RdL0_ForSection ); // Register CallBack on Channel SCR_fn_v_RdL0_RegisterCallback( "Channel", fn_eChannelCallBackV6i, SCR_CRC_c_RdL0_ForSection ); // Register CallBack on Frame SCR_fn_v_RdL0_RegisterCallback( "Frame", fn_eFrameCallBackV6i, SCR_CRC_c_RdL0_ForSection ); // Register CallBack on Key SCR_fn_v_RdL0_RegisterCallback( "Key", fn_eKeyCallBackV6i, SCR_CRC_c_RdL0_ForSection ); // Register CallBack on SpeedsList SCR_fn_v_RdL0_RegisterCallback( "SpeedsList", fn_eSpeedsListCallBackV6i, SCR_CRC_c_RdL0_ForSection ); // Register CallBack on Speed SCR_fn_v_RdL0_RegisterCallback( "Speed", fn_eSpeedCallBackV6i, SCR_CRC_c_RdL0_ForSection ); // Register CallBack on HierarchiesList SCR_fn_v_RdL0_RegisterCallback( "HierarchiesList", fn_eHierarchiesListCallBackV6i, SCR_CRC_c_RdL0_ForSection ); // Register CallBack on A3dHIERARCHY SCR_fn_v_RdL0_RegisterCallback( "A3dHIERARCHY", fn_eA3dHIERARCHYCallBackV6i, SCR_CRC_c_RdL0_ForSection ); // Register CallBack on ".a3d" SCR_fn_v_RdL0_RegisterCallback( ".a3d", fn_eA3DfileCallBackV6i, SCR_CRC_c_RdL0_ForFile ); } // ********************************************************************************** #undef L_A3D_V6_C