Code archives/3D Graphics - Misc/Entity Recorder
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
These functions provide a way To record Enitities and save the actions to disk. Four tracks are available to record to/from, but only the first track increments the frame counter. | |||||
; **************************************************** ; * Simple Entity Recorder by Michael Wilson ; **************************************************** ; * These functions provide a way To record Enitities ; * and save the actions to disk ; * ; * 4 Tracks are available to record to/from, but only ; * the first track increments the frame counter ; **************************************************** ; ****************************************** ; * Released under the LPGL 11/21/2002 by ; * Michael Wilson wilson(at)no2games.com ; ****************************************** ; **************************************************** ; * Sample useage: ; * ; * If KeyHit(19) Then ; R = Record ; * If Not EntityRecording Then RewindFrames() ; * EntityRecording = 1 - EntityRecording ; * EndIf ; * ; * If KeyHit(25) Then ; P = Play ; * If Not EntityPlayinging Then RewindFrames() ; * EntityPlayinging = 1 - EntityPlayinging ; * EndIf ; * ; * [ ... ] ; * ; * If EntityPlaying Then PlayEntity(Camera) ; * UpdateWorld ; * If EntityRecording Then RecordEntity(Camera) ; **************************************************** Global EntityRecording = 0 Global EntityPlayinging = 0 Global CurrentFrame = 0 Const MaxRecordedFrames = 99999 Type RecorderType Field x0#,y0#,z0#,p0#,w0#,r0# Field x1#,y1#,z1#,p1#,w1#,r1# Field x2#,y2#,z2#,p2#,w2#,r2# Field x3#,y3#,z3#,p3#,w3#,r3# End Type Dim Frame.RecorderType(MaxRecordedFrames) Function RecordEntity(Entity,Track=0) If Entity=0 Then RuntimeError("No entity to record") Return EndIf Select Track Case 0 CurrentFrame = CurrentFrame + 1 Frame.RecorderType(CurrentFrame)=New RecorderType Frame(CurrentFrame)\x0# = EntityX(Entity,1) Frame(CurrentFrame)\y0# = EntityY(Entity,1) Frame(CurrentFrame)\z0# = EntityZ(Entity,1) Frame(CurrentFrame)\p0# = EntityPitch(Entity,1) Frame(CurrentFrame)\w0# = EntityYaw(Entity,1) Frame(CurrentFrame)\r0# = EntityRoll(Entity,1) Case 1 Frame(CurrentFrame)\x1# = EntityX(Entity,1) Frame(CurrentFrame)\y1# = EntityY(Entity,1) Frame(CurrentFrame)\z1# = EntityZ(Entity,1) Frame(CurrentFrame)\p1# = EntityPitch(Entity,1) Frame(CurrentFrame)\w1# = EntityYaw(Entity,1) Frame(CurrentFrame)\r1# = EntityRoll(Entity,1) Case 2 Frame(CurrentFrame)\x2# = EntityX(Entity,1) Frame(CurrentFrame)\y2# = EntityY(Entity,1) Frame(CurrentFrame)\z2# = EntityZ(Entity,1) Frame(CurrentFrame)\p2# = EntityPitch(Entity,1) Frame(CurrentFrame)\w2# = EntityYaw(Entity,1) Frame(CurrentFrame)\r2# = EntityRoll(Entity,1) Case 3 Frame(CurrentFrame)\x3# = EntityX(Entity,1) Frame(CurrentFrame)\y3# = EntityY(Entity,1) Frame(CurrentFrame)\z3# = EntityZ(Entity,1) Frame(CurrentFrame)\p3# = EntityPitch(Entity,1) Frame(CurrentFrame)\w3# = EntityYaw(Entity,1) Frame(CurrentFrame)\r3# = EntityRoll(Entity,1) End Select End Function Function RewindFrames() CurrentFrame = 0 Frame.RecorderType(CurrentFrame)=First RecorderType End Function Function PlayEntity(Entity,Track=0) ; Smooth=False If Entity=0 Then RuntimeError("No target entity for playback") Return EndIf If Frame(CurrentFrame+1) = Null Then RewindFrames() Select Track Case 0 CurrentFrame = CurrentFrame + 1 PositionEntity Entity,Frame(CurrentFrame)\x0,Frame(CurrentFrame)\y0,Frame(CurrentFrame)\z0,1 RotateEntity Entity,Frame(CurrentFrame)\p0,Frame(CurrentFrame)\w0,Frame(CurrentFrame)\r0,1 Case 1 PositionEntity Entity,Frame(CurrentFrame)\x1,Frame(CurrentFrame)\y1,Frame(CurrentFrame)\z1,1 RotateEntity Entity,Frame(CurrentFrame)\p1,Frame(CurrentFrame)\w1,Frame(CurrentFrame)\r1,1 Case 2 PositionEntity Entity,Frame(CurrentFrame)\x2,Frame(CurrentFrame)\y2,Frame(CurrentFrame)\z2,1 RotateEntity Entity,Frame(CurrentFrame)\p2,Frame(CurrentFrame)\w2,Frame(CurrentFrame)\r2,1 Case 3 PositionEntity Entity,Frame(CurrentFrame)\x3,Frame(CurrentFrame)\y3,Frame(CurrentFrame)\z3,1 RotateEntity Entity,Frame(CurrentFrame)\p3,Frame(CurrentFrame)\w3,Frame(CurrentFrame)\r3,1 End Select End Function Function SaveRecording(Filename$,Track=0) RewindFrames() RecordFile=WriteFile(Filename$) While Frame(CurrentFrame+1) <> Null CurrentFrame = CurrentFrame + 1 Select Track Case 0 WriteFloat RecordFile,Frame(CurrentFrame)\x0# WriteFloat RecordFile,Frame(CurrentFrame)\y0# WriteFloat RecordFile,Frame(CurrentFrame)\z0# WriteFloat RecordFile,Frame(CurrentFrame)\p0# WriteFloat RecordFile,Frame(CurrentFrame)\w0# WriteFloat RecordFile,Frame(CurrentFrame)\r0# Case 1 WriteFloat RecordFile,Frame(CurrentFrame)\x1# WriteFloat RecordFile,Frame(CurrentFrame)\y1# WriteFloat RecordFile,Frame(CurrentFrame)\z1# WriteFloat RecordFile,Frame(CurrentFrame)\p1# WriteFloat RecordFile,Frame(CurrentFrame)\w1# WriteFloat RecordFile,Frame(CurrentFrame)\r1# Case 2 WriteFloat RecordFile,Frame(CurrentFrame)\x2# WriteFloat RecordFile,Frame(CurrentFrame)\y2# WriteFloat RecordFile,Frame(CurrentFrame)\z2# WriteFloat RecordFile,Frame(CurrentFrame)\p2# WriteFloat RecordFile,Frame(CurrentFrame)\w2# WriteFloat RecordFile,Frame(CurrentFrame)\r2# Case 3 WriteFloat RecordFile,Frame(CurrentFrame)\x3# WriteFloat RecordFile,Frame(CurrentFrame)\y3# WriteFloat RecordFile,Frame(CurrentFrame)\z3# WriteFloat RecordFile,Frame(CurrentFrame)\p3# WriteFloat RecordFile,Frame(CurrentFrame)\w3# WriteFloat RecordFile,Frame(CurrentFrame)\r3# End Select Wend CloseFile RecordFile SavedFrames = CurrentFrame - 1 RewindFrames() Return SavedFrames; DebugLog "Saved "+SavedFrames+" Frames" End Function Function LoadRecording(Filename$,Track=0) RewindFrames() RecordFile=ReadFile(Filename$) While Not Eof(RecordFile) CurrentFrame = CurrentFrame + 1 Select Track Case 0 Frame.RecorderType(CurrentFrame)=New RecorderType Frame(CurrentFrame)\x0# = ReadFloat(RecordFile) Frame(CurrentFrame)\y0# = ReadFloat(RecordFile) Frame(CurrentFrame)\z0# = ReadFloat(RecordFile) Frame(CurrentFrame)\p0# = ReadFloat(RecordFile) Frame(CurrentFrame)\w0# = ReadFloat(RecordFile) Frame(CurrentFrame)\r0# = ReadFloat(RecordFile) Case 1 Frame(CurrentFrame)\x1# = ReadFloat(RecordFile) Frame(CurrentFrame)\y1# = ReadFloat(RecordFile) Frame(CurrentFrame)\z1# = ReadFloat(RecordFile) Frame(CurrentFrame)\p1# = ReadFloat(RecordFile) Frame(CurrentFrame)\w1# = ReadFloat(RecordFile) Frame(CurrentFrame)\r1# = ReadFloat(RecordFile) Case 2 Frame(CurrentFrame)\x2# = ReadFloat(RecordFile) Frame(CurrentFrame)\y2# = ReadFloat(RecordFile) Frame(CurrentFrame)\z2# = ReadFloat(RecordFile) Frame(CurrentFrame)\p2# = ReadFloat(RecordFile) Frame(CurrentFrame)\w2# = ReadFloat(RecordFile) Frame(CurrentFrame)\r2# = ReadFloat(RecordFile) Case 3 Frame(CurrentFrame)\x3# = ReadFloat(RecordFile) Frame(CurrentFrame)\y3# = ReadFloat(RecordFile) Frame(CurrentFrame)\z3# = ReadFloat(RecordFile) Frame(CurrentFrame)\p3# = ReadFloat(RecordFile) Frame(CurrentFrame)\w3# = ReadFloat(RecordFile) Frame(CurrentFrame)\r3# = ReadFloat(RecordFile) End Select Wend CloseFile RecordFile ReadFrames = CurrentFrame - 1 RewindFrames() Return ReadFrames; DebugLog "Read "+ReadFrames+" Frames" End Function |
Comments
None.
Code Archives Forum