Files
lace/4-high/gel/source/dolly/gel-dolly-simple.adb
2022-07-31 17:34:54 +10:00

155 lines
4.5 KiB
Ada

package body gel.Dolly.simple
is
overriding
procedure define (Self : in out Item)
is
begin
null;
end define;
overriding
procedure destroy (Self : in out Item)
is
begin
null;
end destroy;
--------------
-- Operations
--
overriding
procedure freshen (Self : in out Item)
is
use Math,
linear_Algebra_3D;
Speed : constant Real := Self.Speed * Self.Multiplier;
rotate_Factor : constant Real := 0.04;
orbit_Factor : constant Real := 0.08;
initial_Site : constant Vector_3 := Self.Cameras.first_Element.Site;
initial_Spin : constant Matrix_3x3 := Self.Cameras.first_Element.Spin;
new_Site : Vector_3;
new_Spin : Matrix_3x3;
site_Updated : Boolean := False;
spin_Updated : Boolean := False;
procedure update_Site (To : in Vector_3)
is
begin
new_Site := To;
site_Updated := True;
end update_Site;
procedure update_Spin (To : in math.Matrix_3x3)
is
begin
new_Spin := To;
spin_Updated := True;
end update_Spin;
begin
-- Linear Motion
--
if Self.Motion (Forward) then update_Site (initial_Site - forward_Direction (initial_Spin) * Speed); end if;
if Self.Motion (Backward) then update_Site (initial_Site + forward_Direction (initial_Spin) * Speed); end if;
if Self.Motion (Left) then update_Site (initial_Site - right_Direction (initial_Spin) * Speed); end if;
if Self.Motion (Right) then update_Site (initial_Site + right_Direction (initial_Spin) * Speed); end if;
if Self.Motion (Up) then update_Site (initial_Site + up_Direction (initial_Spin) * Speed); end if;
if Self.Motion (Down) then update_Site (initial_Site - up_Direction (initial_Spin) * Speed); end if;
-- Angular Spin
--
if Self.Spin (Left) then update_Spin (y_Rotation_from (-rotate_Factor) * initial_Spin); end if;
if Self.Spin (Right) then update_Spin (y_Rotation_from ( rotate_Factor) * initial_Spin); end if;
if Self.Spin (Forward) then update_Spin (x_Rotation_from ( rotate_Factor) * initial_Spin); end if;
if Self.Spin (Backward) then update_Spin (x_Rotation_from (-rotate_Factor) * initial_Spin); end if;
if Self.Spin (Up) then update_Spin (z_Rotation_from (-rotate_Factor) * initial_Spin); end if;
if Self.Spin (Down) then update_Spin (z_Rotation_from ( rotate_Factor) * initial_Spin); end if;
-- Orbit
--
if Self.Orbit (Left)
then
update_Site (initial_Site * y_Rotation_from (orbit_Factor * Speed));
update_Spin (initial_Spin * y_Rotation_from (orbit_Factor * Speed));
end if;
if Self.Orbit (Right)
then
update_Site (initial_Site * y_Rotation_from (-orbit_Factor * Speed));
update_Spin (initial_Spin * y_Rotation_from (-orbit_Factor * Speed));
end if;
if Self.Orbit (Forward)
then
update_Site (initial_Site * x_Rotation_from (-orbit_Factor * Speed));
update_Spin (initial_Spin * x_Rotation_from (-orbit_Factor * Speed));
end if;
if Self.Orbit (Backward)
then
update_Site (initial_Site * x_Rotation_from (orbit_Factor * Speed));
update_Spin (initial_Spin * x_Rotation_from (orbit_Factor * Speed));
end if;
if Self.Orbit (Up)
then
update_Site (initial_Site * z_Rotation_from (-orbit_Factor * Speed));
update_Spin (initial_Spin * z_Rotation_from (-orbit_Factor * Speed));
end if;
if Self.Orbit (Down)
then
update_Site (initial_Site * z_Rotation_from (orbit_Factor * Speed));
update_Spin (initial_Spin * z_Rotation_from (orbit_Factor * Speed));
end if;
-- Update each camera with new site and spin.
--
declare
use camera_Vectors;
the_Camera : gel.Camera.view;
Cursor : camera_Vectors.Cursor := Self.Cameras.First;
begin
while has_Element (Cursor)
loop
the_Camera := Element (Cursor);
if site_Updated
then
the_Camera.Site_is (new_Site);
end if;
if spin_Updated
then
the_Camera.Spin_is (new_Spin);
end if;
next (Cursor);
end loop;
end;
end freshen;
end gel.Dolly.simple;