with
     gel.World.simple,
     gel.Camera.forge;


package body gel.Applet.gui_and_sim_world
is

   procedure define (Self : access Item;   Name       : in String;
                                           use_Window : in gel.Window.view)
   is
      pragma Unreferenced (use_Window);
   begin
      declare
         the_world_Info : constant world_Info_view  := new world_Info;
         the_Camera     : constant gel.Camera.view  := gel.Camera.forge.new_Camera;
      begin
         the_world_Info.World := gel.World.simple.forge.new_World (Name,
                                                                   gui_world_Id,
                                                                   space_Kind => physics.Bullet,
                                                                   Renderer   => Self.Renderer).all'Access;

         --  the_world_Info.World.register (Self.all'unchecked_Access,
         --                                 to_Kind (gel.events.new_sprite_added_to_world_Event'Tag));

         the_Camera.Viewport_is (Self.Window.Width, Self.Window.Height);
         the_Camera.Renderer_is (Self.Renderer);
         the_Camera.Site_is     ([0.0, 5.0, 5.0]);

         the_world_Info.Cameras.append (the_Camera);
         Self.Worlds           .append (the_world_Info);

         --  Self.local_Subject_and_Observer.add (the_add_new_sprite_Response'Access,
         --                                       to_Kind (gel.events.new_sprite_added_to_world_Event'Tag),
         --                                       the_world_Info.World.Name);
         the_world_Info.World.start;
      end;

      declare
         the_world_Info : constant world_Info_view  := new world_Info;
         the_Camera     : constant gel.Camera.View  := gel.Camera.forge.new_Camera;
      begin
         the_world_Info.World := gel.World.simple.forge.new_World (Name       => Name,
                                                                   Id         => sim_world_Id,
                                                                   space_Kind => physics.Bullet,
                                                                   Renderer   => Self.Renderer).all'Access;

         --  the_world_Info.World.register (the_Observer => Self.all'unchecked_Access,
         --                                 of_Kind      => to_Kind (gel.events.new_sprite_added_to_world_Event'Tag));

         the_Camera.Viewport_is (Self.Window.Width, Self.Window.Height);
         the_Camera.Renderer_is (Self.Renderer);
         the_Camera.Site_is     ([0.0, 5.0, 5.0]);

         the_world_Info.Cameras.append (the_Camera);
         Self.Worlds           .append (the_world_Info);

         --  Self.local_Subject_and_Observer.add (the_add_new_sprite_Response'Access,
         --                                       to_Kind (gel.events.new_sprite_added_to_world_Event'Tag),
         --                                       the_world_Info.World.Name);
         the_world_Info.World.start;
      end;
   end define;



   package body Forge
   is
      function to_Applet (Name       : in String;
                          use_Window : in gel.Window.view) return Item
      is
      begin
         return Self : Item := (gel.Applet.Forge.to_Applet (Name, use_Window)
                                with null record)
         do
            define (Self'unchecked_Access, Name, use_Window);
         end return;
      end to_Applet;



      function new_Applet (Name       : in String;
                           use_Window : in gel.Window.view) return View
      is
         Self : constant View := new Item' (to_Applet (Name, use_Window));
      begin
         return Self;
      end new_Applet;

   end Forge;



   function sim_World (Self : in Item) return gel.World.view
   is
   begin
      return Self.World (sim_world_Id);
   end sim_World;



   function sim_Camera (Self : in Item) return gel.Camera.view
   is
   begin
      return Self.Camera (sim_world_Id,
                          sim_camera_Id);
   end sim_Camera;



   function gui_World (Self : in Item) return gel.World.view
   is
   begin
      return Self.World (gui_world_Id);
   end gui_World;



   function gui_Camera (Self : in Item) return gel.Camera.view
   is
   begin
      return Self.Camera (gui_world_Id,
                          gui_camera_Id);
   end gui_Camera;


end gel.Applet.gui_and_sim_world;
