with gel.Camera, ada.Containers.Vectors; package gel.Dolly -- -- Models a camera dolly. -- is type Item is abstract tagged private; type View is access all Item'Class; --------- --- Forge -- procedure define (Self : in out Item) is abstract; procedure destroy (Self : in out Item) is abstract; procedure free (Self : in out View); -------------- --- Attributes -- type Direction is (Left, Right, Up, Down, Forward, Backward); procedure add_Camera (Self : in out Item'Class; the_Camera : in Camera.view); procedure is_moving (Self : in out Item'Class; Direction : dolly.Direction; Now : in Boolean := True); procedure is_spinning (Self : in out Item'Class; Direction : dolly.Direction; Now : in Boolean := True); procedure is_orbiting (Self : in out Item'Class; Direction : dolly.Direction; Now : in Boolean := True); function Speed (Self : in Item) return math.Real; procedure Speed_is (Self : in out Item; Now : in math.Real); procedure speed_Multiplier_is (Self : in out Item; Now : in math.Real); procedure allow_linear_Motion (Self : in out Item; Allow : in Boolean) is null; procedure allow_orbital_Motion (Self : in out Item; Allow : in Boolean) is null; -------------- --- Operations -- procedure freshen (Self : in out Item) is abstract; private use type gel.Camera.view; package camera_Vectors is new ada.Containers.Vectors (Positive, gel.Camera.view); subtype camera_Vector is camera_Vectors.Vector; type Direction_Flags is array (Direction) of Boolean; type Item is abstract tagged record Cameras : camera_Vector; Motion : Direction_Flags := (others => False); Spin : Direction_Flags := (others => False); Orbit : Direction_Flags := (others => False); Speed : math.Real := 1.0; Multiplier : math.Real := 1.0; -- Applied to speed. end record; end gel.Dolly;