Files
lace/3-mid/opengl/source/lean/support/opengl-dolly.adb
2022-07-31 17:34:54 +10:00

91 lines
3.3 KiB
Ada

with
ada.Text_IO;
package body openGL.Dolly
is
procedure Speed_is (Self : in out Item; Now : in Real)
is
begin
Self.Speed := Now;
end Speed_is;
procedure evolve (Self : in out Item)
is
use linear_Algebra_3d,
ada.Text_IO;
Command : Character;
Avail : Boolean;
begin
get_Immediate (Command, Avail);
if Avail
then
case Command
is
when 'q' => Self.quit_Requested := True;
-- Linear Motion.
--
when 'a' => Self.Camera.Site_is (Self.Camera.Site - right_Direction (Self.Camera.Spin) * Self.Speed);
when 's' => Self.Camera.Site_is (Self.Camera.Site + right_Direction (Self.Camera.Spin) * Self.Speed);
when 'w' => Self.Camera.Site_is (Self.Camera.Site - forward_Direction (Self.Camera.Spin) * Self.Speed);
when 'z' => Self.Camera.Site_is (Self.Camera.Site + forward_Direction (Self.Camera.Spin) * Self.Speed);
when 'e' => Self.Camera.Site_is (Self.Camera.Site + up_Direction (Self.Camera.Spin) * Self.Speed);
when 'd' => Self.Camera.Site_is (Self.Camera.Site - up_Direction (Self.Camera.Spin) * Self.Speed);
-- Orbital motion.
--
when 'A' => Self.Camera.Site_is (Self.Camera.Site * y_Rotation_from (to_Radians (-5.0)));
Self.Camera.Spin_is (Self.Camera.Spin * y_Rotation_from (to_Radians (-5.0)));
when 'S' => Self.Camera.Site_is (Self.Camera.Site * y_Rotation_from (to_Radians ( 5.0)));
Self.Camera.Spin_is (Self.Camera.Spin * y_Rotation_from (to_Radians ( 5.0)));
when 'E' => Self.Camera.Site_is (Self.Camera.Site * x_Rotation_from (to_Radians (-5.0)));
Self.Camera.Spin_is (Self.Camera.Spin * x_Rotation_from (to_Radians (-5.0)));
when 'D' => Self.Camera.Site_is (Self.Camera.Site * x_Rotation_from (to_Radians ( 5.0)));
Self.Camera.Spin_is (Self.Camera.Spin * x_Rotation_from (to_Radians ( 5.0)));
when 'W' => Self.Camera.Site_is (Self.Camera.Site * z_Rotation_from (to_Radians (-5.0)));
Self.Camera.Spin_is (Self.Camera.Spin * z_Rotation_from (to_Radians (-5.0)));
when 'Z' => Self.Camera.Site_is (Self.Camera.Site * z_Rotation_from (to_Radians ( 5.0)));
Self.Camera.Spin_is (Self.Camera.Spin * z_Rotation_from (to_Radians ( 5.0)));
when others => null;
end case;
Self.last_Character := Command;
end if;
end evolve;
function quit_Requested (Self : in Item) return Boolean
is
begin
return Self.quit_Requested;
end quit_Requested;
procedure get_last_Character (Self : in out Item; the_Character : out Character;
Available : out Boolean)
is
use ada.Characters;
begin
if Self.last_Character = latin_1.NUL
then
Available := False;
else
Available := True;
the_Character := Self.last_Character;
Self.last_Character := latin_1.NUL;
end if;
end get_last_Character;
end openGL.Dolly;