with
     gel.Window.setup,
     gel.Applet.gui_world,
     gel.Camera,
     gel.Rig,
     gel.Forge,

     openGL.Model.any,
     openGL.texture_Set,
     openGL.Light,
     --  openGL.Light.directional,

     ada.Calendar;

pragma unreferenced (gel.Window.setup);


procedure launch_box_rig_1_bone_Demo
--
-- Simple rigged box model with one animated bone.
--
is
   use gel.Rig,
       gel.Math,
       gel.linear_Algebra_3D,
       openGL,
       ada.Calendar;

   -------------
   --- Variables
   --
   the_Applet    : constant gel.Applet.gui_World.view := gel.Forge.new_gui_Applet ("Rig Demo", 1536, 864);
   the_rig_Model : constant openGL.Model.any.view     := openGL.Model.any.new_Model (Model            => openGL.to_Asset ("./box_1_bone.dae"),
                                                                                     --  Model            => openGL.to_Asset ("./box_1_bone-animated.dae"),
                                                                                     --  Model            => openGL.to_Asset ("./box_2_bone.dae"),
                                                                                     --  Model            => openGL.to_Asset ("./box_3_bone.dae"),
                                                                                     --  Model            => openGL.to_Asset ("./human-default-animated-01_01.dae"),
                                                                                     Texture          => openGL.null_Asset,
                                                                                     texture_Details  => openGL.texture_Set.to_Details ([1 => openGL.to_Asset ("assets/gel/Face1.bmp")]),
                                                                                     Texture_is_lucid => False);
   the_Rig          : gel.Rig.item;
   next_render_Time : ada.calendar.Time;

begin
   the_Applet.gui_Camera.Site_is ((0.0, -10.0, 1.0));                        -- Position the camera.
   the_Applet.gui_Camera.Spin_is (x_Rotation_from (to_Radians (-90.0)));     -- Rotate   the camera.

   the_Applet.enable_simple_Dolly (1);                                       -- Enable user camera control via keyboards
   the_Applet.Dolly.Speed_is (0.05);

   the_Applet.gui_World.Gravity_is ((0.0, -9.0, 0.0));

   -- Set the lights position and ambient color.
   --
   declare
      --  Light : openGL.Light.directional.item := the_Applet.Renderer.Light (Id => 1);
      Light : openGL.Light.item := the_Applet.Renderer.new_Light;
   begin
      --  Light.ambient_Color_is ((255.0 / 255.0,
      --                           153.0 / 255.0,
      --                           102.0 / 255.0,
      --                             1.0));
      Light.Color_is ((255.0 / 255.0,
                      153.0 / 255.0,
                      102.0 / 255.0));
      Light.Site_is  ([1000.0, 000.0, 1000.0]);

      --  the_Applet.Renderer.Light_is (Id => 1, Now => Light);
      the_Applet.Renderer.set (the_Light => Light);
   end;


   the_Rig.define (the_Applet.gui_World,
                   the_rig_Model.all'Access,
                   Mass         => 0.0,
                   is_Kinematic => False);

   the_Rig.Spin_is (x_Rotation_from (to_Radians (-90.0)));

   the_Applet.gui_World.add (the_Rig.base_Sprite, and_Children => True);     -- Add the rigs armature sprite.

   the_Rig.enable_Graphics;
   the_Rig.motion_Mode_is (Animation);
   the_Rig.assume_Pose;

   next_render_Time := ada.Calendar.clock;

   while the_Applet.is_open
   loop
      the_Applet.gui_World.evolve;                                             -- Evolve the world.
      the_Rig             .evolve (world_Age => the_Applet.gui_World.Age);     -- Evolve the rig.
      the_Rig.assume_Pose;
      the_Applet.freshen;                                                      -- Handle any new events and update the screen.

      next_render_Time := next_render_Time + 1.0/60.0;
      delay until next_render_Time;
   end loop;

   the_Applet.destroy;
end launch_box_rig_1_bone_Demo;
