Unit FMState; Interface Type // Basic physical properties for any discernible object TPhysicalObject = Record Position, // current aircraft-position Orientation, // current aircraft orientation Movement : TSTVertex; // Pre-calculated movement rates Speed : Float; // current aircraft speed ChangedOrient : Boolean; // true if the aicraft orientation was changed End; // A list of all physical entities in the engine TPhysicalObjectList = Array Of TPhysicalObject; Procedure StepPhysicalObject(Var PS : TPhysicalObject); Function AppendPhysicalObject(Var POL : TPhysicalObjectList): Cardinal; Procedure StepAllPhysicalObjects(Var POL : TPhysicalObjectList); Implementation Procedure StepPhysicalObject(Var PS : TPhysicalObject); Var RotateX, RotateY, RotateZ, Combined : TSTMatrix; Begin // Only re-calculate if changed orientation If ChangedOrient Then Begin // Start as a straight movement PS.Movement.X := PS.Speed; PS.Movement.Y := 0; PS.Movement.Z := 0; // Calculate rotation matrices SetRotateMatrixX(RotateX, PS.Orientation.X); SetRotateMatrixY(RotateY, PS.Orientation.Y); SetRotateMatrixZ(RotateZ, PS.Orientation.Z); SetIdentityMatrix(Combined); // Multiply all transformation matrices into one MultiplyMatrix(Combined, RotateX); MultiplyMatrix(Combined, RotateY); MultiplyMatrix(Combined, RotateZ); // Apply transformation PS.Movement := TransformVertex(PS.Movement, Combined); ChangedOrient := False; End; // Move position around by movement ammount PS.Position := PS.Position + PS.Movement; End; Function AppendPhysicalObject(Var POL : TPhysicalObjectList): Cardinal; Begin // Increase the list size SetLength(POL, Length(POL) + 1); // Return last object (recently created) AppendPhysicalObject := Length(POL) - 1; End; Procedure StepAllPhysicalObjects(Var POL : TPhysicalObjectList); Var Ctrl : Cardinal; Begin // Update all physical objects in the list For Ctrl := 0 To Length(POL) - 1 Do StepPhysicalObject(POL[Ctrl]); End; End.