orka_b455160b/orka/src/orka/interface/orka-loops.ads

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
--  SPDX-License-Identifier: Apache-2.0
--
--  Copyright (c) 2017 onox <denkpadje@gmail.com>
--
--  Licensed under the Apache License, Version 2.0 (the "License");
--  you may not use this file except in compliance with the License.
--  You may obtain a copy of the License at
--
--      http://www.apache.org/licenses/LICENSE-2.0
--
--  Unless required by applicable law or agreed to in writing, software
--  distributed under the License is distributed on an "AS IS" BASIS,
--  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--  See the License for the specific language governing permissions and
--  limitations under the License.

with Ada.Containers.Ordered_Sets;
with Ada.Real_Time;

with Orka.Behaviors;
with Orka.Cameras;
with Orka.Jobs.System;

use Ada.Real_Time;

generic
   Time_Step, Frame_Limit : Time_Span;

   Camera : Cameras.Camera_Ptr;

   with package Job_Manager is new Orka.Jobs.System (<>);

   Maximum_Frame_Time : Time_Span := Milliseconds (1000);
   --  Maximum allowed duration of a frame. The simulation loop will
   --  exit by raising an exception if this time is exceeded
package Orka.Loops is

   protected Handler is
      procedure Stop;

      procedure Set_Frame_Limit (Value : Time_Span);

      function Frame_Limit return Time_Span;

      procedure Enable_Limit (Enable : Boolean);

      function Limit_Enabled return Boolean;

      function Should_Stop return Boolean;
   private
      Limit : Time_Span := Orka.Loops.Frame_Limit;
      Stop_Flag  : Boolean := False;
      Limit_Flag : Boolean := False;
   end Handler;

   use type Behaviors.Behavior_Ptr;
   use type Behaviors.Behavior_Array_Access;

   function "<" (Left, Right : Behaviors.Behavior_Ptr) return Boolean;

   package Behavior_Sets is new Ada.Containers.Ordered_Sets
     (Behaviors.Behavior_Ptr, "<", "=");

   protected Scene is
      procedure Add (Object : Behaviors.Behavior_Ptr)
        with Post => Modified;

      procedure Remove (Object : Behaviors.Behavior_Ptr)
        with Post => Modified;

      procedure Replace_Array (Target : in out Behaviors.Behavior_Array_Access)
        with Pre  => Target /= null,
             Post => Target /= null and not Modified;

      function Modified return Boolean;

      procedure Set_Camera (Camera : Cameras.Camera_Ptr);

      function Camera return Cameras.Camera_Ptr;
   private
      Modified_Flag : Boolean := False;
      Behaviors_Set : Behavior_Sets.Set;
      Scene_Camera  : Cameras.Camera_Ptr := Orka.Loops.Camera;
   end Scene;

   procedure Stop_Loop;

   procedure Run_Loop
     (Render : not null access procedure
        (Scene  : not null Behaviors.Behavior_Array_Access;
         Camera : Cameras.Camera_Ptr));

end Orka.Loops;