cyberarm_engine 0.23.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/assets/shaders/fragment/g_buffer.glsl +8 -8
- data/assets/shaders/fragment/lighting.glsl +15 -9
- data/assets/shaders/include/material_struct.glsl +16 -0
- data/assets/shaders/vertex/g_buffer.glsl +17 -17
- data/assets/shaders/vertex/lighting.glsl +16 -9
- data/lib/cyberarm_engine/builtin/intro_state.rb +1 -1
- data/lib/cyberarm_engine/common.rb +2 -2
- data/lib/cyberarm_engine/console.rb +10 -10
- data/lib/cyberarm_engine/game_object.rb +1 -1
- data/lib/cyberarm_engine/gosu_ext/draw_arc.rb +98 -0
- data/lib/cyberarm_engine/gosu_ext/draw_circle.rb +31 -0
- data/lib/cyberarm_engine/gosu_ext/draw_path.rb +17 -0
- data/lib/cyberarm_engine/model.rb +7 -6
- data/lib/cyberarm_engine/notification.rb +83 -0
- data/lib/cyberarm_engine/notification_manager.rb +242 -0
- data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +16 -10
- data/lib/cyberarm_engine/opengl/renderer/renderer.rb +12 -1
- data/lib/cyberarm_engine/opengl/shader.rb +2 -2
- data/lib/cyberarm_engine/stats.rb +181 -10
- data/lib/cyberarm_engine/text.rb +3 -0
- data/lib/cyberarm_engine/ui/element.rb +45 -14
- data/lib/cyberarm_engine/ui/elements/container.rb +86 -27
- data/lib/cyberarm_engine/ui/elements/slider.rb +4 -3
- data/lib/cyberarm_engine/ui/elements/text_block.rb +11 -1
- data/lib/cyberarm_engine/ui/gui_state.rb +28 -18
- data/lib/cyberarm_engine/ui/style.rb +2 -1
- data/lib/cyberarm_engine/vector.rb +35 -16
- data/lib/cyberarm_engine/version.rb +1 -1
- data/lib/cyberarm_engine/window.rb +35 -8
- data/lib/cyberarm_engine.rb +8 -2
- data/mrbgem.rake +29 -0
- metadata +10 -3
@@ -20,7 +20,10 @@ module CyberarmEngine
|
|
20
20
|
@gui_state = options.delete(:gui_state)
|
21
21
|
super
|
22
22
|
|
23
|
+
@last_scroll_position = Vector.new(0, 0)
|
23
24
|
@scroll_position = Vector.new(0, 0)
|
25
|
+
@scroll_target_position = Vector.new(0, 0)
|
26
|
+
@scroll_chunk = 120
|
24
27
|
@scroll_speed = 40
|
25
28
|
|
26
29
|
@text_color = options[:color]
|
@@ -33,17 +36,17 @@ module CyberarmEngine
|
|
33
36
|
def build
|
34
37
|
@block.call(self) if @block
|
35
38
|
|
36
|
-
root.gui_state.
|
39
|
+
root.gui_state.request_recalculate_for(self)
|
37
40
|
end
|
38
41
|
|
39
42
|
def add(element)
|
40
43
|
@children << element
|
41
44
|
|
42
|
-
root.gui_state.
|
45
|
+
root.gui_state.request_recalculate_for(self)
|
43
46
|
end
|
44
47
|
|
45
48
|
def remove(element)
|
46
|
-
root.gui_state.
|
49
|
+
root.gui_state.request_recalculate_for(self) if @children.delete(element)
|
47
50
|
end
|
48
51
|
|
49
52
|
def clear(&block)
|
@@ -56,7 +59,7 @@ module CyberarmEngine
|
|
56
59
|
|
57
60
|
CyberarmEngine::Element::Container.current_container = old_container
|
58
61
|
|
59
|
-
root.gui_state.
|
62
|
+
root.gui_state.request_recalculate_for(self)
|
60
63
|
end
|
61
64
|
|
62
65
|
def append(&block)
|
@@ -67,7 +70,7 @@ module CyberarmEngine
|
|
67
70
|
|
68
71
|
CyberarmEngine::Element::Container.current_container = old_container
|
69
72
|
|
70
|
-
root.gui_state.
|
73
|
+
root.gui_state.request_recalculate_for(self)
|
71
74
|
end
|
72
75
|
|
73
76
|
def render
|
@@ -77,7 +80,9 @@ module CyberarmEngine
|
|
77
80
|
content_width + 1,
|
78
81
|
content_height + 1
|
79
82
|
) do
|
80
|
-
@
|
83
|
+
Gosu.translate(@scroll_position.x, @scroll_position.y) do
|
84
|
+
@children.each(&:draw)
|
85
|
+
end
|
81
86
|
end
|
82
87
|
end
|
83
88
|
|
@@ -90,35 +95,74 @@ module CyberarmEngine
|
|
90
95
|
end
|
91
96
|
|
92
97
|
def update
|
98
|
+
update_scroll
|
93
99
|
@children.each(&:update)
|
94
100
|
end
|
95
101
|
|
96
102
|
def hit_element?(x, y)
|
97
103
|
return unless hit?(x, y)
|
98
104
|
|
105
|
+
# Offset child hit point by scroll position/offset
|
106
|
+
child_x = x - @scroll_position.x
|
107
|
+
child_y = y - @scroll_position.y
|
108
|
+
|
99
109
|
@children.reverse_each do |child|
|
100
110
|
next unless child.visible?
|
101
111
|
|
102
112
|
case child
|
103
113
|
when Container
|
104
|
-
if element = child.hit_element?(
|
114
|
+
if element = child.hit_element?(child_x, child_y)
|
105
115
|
return element
|
106
116
|
end
|
107
117
|
else
|
108
|
-
return child if child.hit?(
|
118
|
+
return child if child.hit?(child_x, child_y)
|
109
119
|
end
|
110
120
|
end
|
111
121
|
|
112
122
|
self if hit?(x, y)
|
113
123
|
end
|
114
124
|
|
125
|
+
def update_child_element_visibity(child)
|
126
|
+
child.element_visible = child.x >= (@x - @scroll_position.x) - child.width && child.x <= (@x - @scroll_position.x) + width &&
|
127
|
+
child.y >= (@y - @scroll_position.y) - child.height && child.y <= (@y - @scroll_position.y) + height
|
128
|
+
end
|
129
|
+
|
130
|
+
def update_scroll
|
131
|
+
dt = window.dt > 1 ? 1.0 : window.dt
|
132
|
+
|
133
|
+
scroll_x_diff = (@scroll_target_position.x - @scroll_position.x)
|
134
|
+
scroll_y_diff = (@scroll_target_position.y - @scroll_position.y)
|
135
|
+
|
136
|
+
@scroll_position.x += (scroll_x_diff * @scroll_speed * 0.25 * dt).round
|
137
|
+
@scroll_position.y += (scroll_y_diff * @scroll_speed * 0.25 * dt).round
|
138
|
+
|
139
|
+
@scroll_position.x = @scroll_target_position.x if scroll_x_diff.abs < 1.0
|
140
|
+
@scroll_position.y = @scroll_target_position.y if scroll_y_diff.abs < 1.0
|
141
|
+
|
142
|
+
# Scrolled PAST top
|
143
|
+
if @scroll_position.y > 0
|
144
|
+
@scroll_target_position.y = 0
|
145
|
+
|
146
|
+
# Scrolled PAST bottom
|
147
|
+
elsif @scroll_position.y.abs > max_scroll_height
|
148
|
+
@scroll_target_position.y = -max_scroll_height
|
149
|
+
end
|
150
|
+
|
151
|
+
if @last_scroll_position != @scroll_position
|
152
|
+
@children.each { |child| update_child_element_visibity(child) }
|
153
|
+
root.gui_state.request_repaint
|
154
|
+
end
|
155
|
+
|
156
|
+
@last_scroll_position.x = @scroll_position.x
|
157
|
+
@last_scroll_position.y = @scroll_position.y
|
158
|
+
end
|
159
|
+
|
115
160
|
def recalculate
|
116
161
|
@current_position = Vector.new(@style.margin_left + @style.padding_left, @style.margin_top + @style.padding_top)
|
117
|
-
@current_position += @scroll_position
|
118
162
|
|
119
163
|
return unless visible?
|
120
164
|
|
121
|
-
Stats.increment(:
|
165
|
+
Stats.frame.increment(:gui_recalculations)
|
122
166
|
|
123
167
|
stylize
|
124
168
|
|
@@ -129,6 +173,9 @@ module CyberarmEngine
|
|
129
173
|
old_width = @width
|
130
174
|
old_height = @height
|
131
175
|
|
176
|
+
@cached_scroll_width = nil
|
177
|
+
@cached_scroll_height = nil
|
178
|
+
|
132
179
|
if is_root?
|
133
180
|
@width = @style.width = window.width
|
134
181
|
@height = @style.height = window.height
|
@@ -176,17 +223,30 @@ module CyberarmEngine
|
|
176
223
|
child.recalculate
|
177
224
|
child.reposition # TODO: Implement top,bottom,left,center, and right positioning
|
178
225
|
|
179
|
-
Stats.increment(:
|
226
|
+
Stats.frame.increment(:gui_recalculations)
|
180
227
|
|
181
|
-
child
|
182
|
-
child.y >= @y - child.height && child.y <= @y + height
|
228
|
+
update_child_element_visibity(child)
|
183
229
|
end
|
184
230
|
|
185
231
|
# puts "TOOK: #{Gosu.milliseconds - s}ms to recalculate #{self.class}:0x#{self.object_id.to_s(16)}"
|
186
232
|
|
187
233
|
update_background
|
188
234
|
|
235
|
+
# Fixes resized container scrolled past bottom
|
236
|
+
self.scroll_top = -@scroll_position.y
|
237
|
+
@scroll_target_position.y = @scroll_position.y
|
238
|
+
|
239
|
+
# NOTE: Experiment for removing need to explicitly call gui_state#recalculate at least 3 times for layout to layout...
|
240
|
+
if old_width != @width || old_height != @height
|
241
|
+
if @parent
|
242
|
+
root.gui_state.request_recalculate_for(@parent)
|
243
|
+
else
|
244
|
+
root.gui_state.request_recalculate
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
189
248
|
root.gui_state.request_repaint if @width != old_width || @height != old_height
|
249
|
+
recalculate_if_size_changed
|
190
250
|
end
|
191
251
|
|
192
252
|
def layout
|
@@ -246,12 +306,13 @@ module CyberarmEngine
|
|
246
306
|
def mouse_wheel_up(sender, x, y)
|
247
307
|
return unless @style.scroll
|
248
308
|
|
249
|
-
if
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
309
|
+
# Allow overscrolling UP, only if one can scroll DOWN
|
310
|
+
if height < scroll_height
|
311
|
+
if @scroll_target_position.y > 0
|
312
|
+
@scroll_target_position.y = @scroll_chunk
|
313
|
+
else
|
314
|
+
@scroll_target_position.y += @scroll_chunk
|
315
|
+
end
|
255
316
|
|
256
317
|
return :handled
|
257
318
|
end
|
@@ -262,15 +323,13 @@ module CyberarmEngine
|
|
262
323
|
|
263
324
|
return unless height < scroll_height
|
264
325
|
|
265
|
-
if @
|
266
|
-
@
|
267
|
-
|
268
|
-
|
269
|
-
root.gui_state.request_recalculate_for(self)
|
270
|
-
root.gui_state.request_repaint
|
271
|
-
|
272
|
-
return :handled
|
326
|
+
if @scroll_target_position.y > 0
|
327
|
+
@scroll_target_position.y = -@scroll_chunk
|
328
|
+
else
|
329
|
+
@scroll_target_position.y -= @scroll_chunk
|
273
330
|
end
|
331
|
+
|
332
|
+
return :handled
|
274
333
|
end
|
275
334
|
|
276
335
|
def scroll_top
|
@@ -33,7 +33,8 @@ module CyberarmEngine
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
attr_reader :
|
36
|
+
attr_reader :step_size, :value
|
37
|
+
attr_accessor :range, :step_size
|
37
38
|
|
38
39
|
def initialize(options = {}, block = nil)
|
39
40
|
super(options, block)
|
@@ -76,7 +77,7 @@ module CyberarmEngine
|
|
76
77
|
def update
|
77
78
|
super
|
78
79
|
|
79
|
-
@tip = value.
|
80
|
+
@tip = format("%.2f", value.to_f)
|
80
81
|
@handle.tip = @tip
|
81
82
|
end
|
82
83
|
|
@@ -87,7 +88,7 @@ module CyberarmEngine
|
|
87
88
|
end
|
88
89
|
|
89
90
|
def handle_dragged_to(x, _y)
|
90
|
-
@ratio = ((x - @handle.width / 2) - @x) / (content_width - @handle.outer_width)
|
91
|
+
@ratio = ((x - @handle.width / 2.0) - @x) / (content_width - @handle.outer_width.to_f)
|
91
92
|
|
92
93
|
self.value = @ratio.clamp(0.0, 1.0) * (@range.max - @range.min) + @range.min
|
93
94
|
end
|
@@ -18,6 +18,15 @@ module CyberarmEngine
|
|
18
18
|
@raw_text = text
|
19
19
|
end
|
20
20
|
|
21
|
+
def update
|
22
|
+
super
|
23
|
+
|
24
|
+
if @text.textobject.name != safe_style_fetch(:font)
|
25
|
+
set_font
|
26
|
+
root.gui_state.request_recalculate
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
21
30
|
def render
|
22
31
|
# Gosu.clip_to is too expensive to always use so check if we actually need it.
|
23
32
|
if @text.width > width || @text.height > height
|
@@ -84,6 +93,7 @@ module CyberarmEngine
|
|
84
93
|
update_background
|
85
94
|
|
86
95
|
root.gui_state.request_repaint if @width != old_width || @height != old_height
|
96
|
+
recalculate_if_size_changed
|
87
97
|
end
|
88
98
|
|
89
99
|
def handle_text_wrapping(max_width)
|
@@ -156,7 +166,7 @@ module CyberarmEngine
|
|
156
166
|
end
|
157
167
|
|
158
168
|
def line_width(text)
|
159
|
-
(@text.textobject.markup_width(text) + noncontent_width)
|
169
|
+
(@text.textobject.markup_width(text.to_s) + noncontent_width)
|
160
170
|
end
|
161
171
|
|
162
172
|
def value
|
@@ -63,7 +63,8 @@ module CyberarmEngine
|
|
63
63
|
@tip.draw
|
64
64
|
end
|
65
65
|
|
66
|
-
|
66
|
+
# FIXME
|
67
|
+
if false# defined?(GUI_DEBUG)
|
67
68
|
Gosu.flush
|
68
69
|
|
69
70
|
@root_container.debug_draw
|
@@ -77,16 +78,23 @@ module CyberarmEngine
|
|
77
78
|
end
|
78
79
|
|
79
80
|
def update
|
81
|
+
Stats.frame.start_timing(:gui_element_recalculate_requests)
|
82
|
+
|
83
|
+
# puts "PENDING REQUESTS: #{@pending_element_recalculate_requests.size}" if @pending_element_recalculate_requests.size.positive?
|
84
|
+
@pending_element_recalculate_requests.each(&:recalculate)
|
85
|
+
@pending_element_recalculate_requests.clear
|
86
|
+
|
87
|
+
Stats.frame.end_timing(:gui_element_recalculate_requests)
|
88
|
+
|
80
89
|
if @pending_recalculate_request
|
81
|
-
|
82
|
-
|
90
|
+
Stats.frame.start_timing(:gui_recalculate)
|
91
|
+
|
83
92
|
@root_container.recalculate
|
84
93
|
|
85
94
|
@pending_recalculate_request = false
|
86
|
-
end
|
87
95
|
|
88
|
-
|
89
|
-
|
96
|
+
Stats.frame.end_timing(:gui_recalculate)
|
97
|
+
end
|
90
98
|
|
91
99
|
if @pending_focus_request
|
92
100
|
@pending_focus_request = false
|
@@ -121,9 +129,9 @@ module CyberarmEngine
|
|
121
129
|
@mouse_over.publish(:leave) if @mouse_over && new_mouse_over != @mouse_over
|
122
130
|
@mouse_over = new_mouse_over
|
123
131
|
|
124
|
-
redirect_holding_mouse_button(:left) if @mouse_over && Gosu.button_down?(Gosu::
|
125
|
-
redirect_holding_mouse_button(:middle) if @mouse_over && Gosu.button_down?(Gosu::
|
126
|
-
redirect_holding_mouse_button(:right) if @mouse_over && Gosu.button_down?(Gosu::
|
132
|
+
redirect_holding_mouse_button(:left) if @mouse_over && Gosu.button_down?(Gosu::MS_LEFT)
|
133
|
+
redirect_holding_mouse_button(:middle) if @mouse_over && Gosu.button_down?(Gosu::MS_MIDDLE)
|
134
|
+
redirect_holding_mouse_button(:right) if @mouse_over && Gosu.button_down?(Gosu::MS_RIGHT)
|
127
135
|
|
128
136
|
if Vector.new(window.mouse_x, window.mouse_y) == @last_mouse_pos
|
129
137
|
if @mouse_over && (Gosu.milliseconds - @mouse_moved_at) > tool_tip_delay
|
@@ -151,13 +159,13 @@ module CyberarmEngine
|
|
151
159
|
super
|
152
160
|
|
153
161
|
case id
|
154
|
-
when Gosu::
|
162
|
+
when Gosu::MS_LEFT
|
155
163
|
redirect_mouse_button(:left)
|
156
|
-
when Gosu::
|
164
|
+
when Gosu::MS_MIDDLE
|
157
165
|
redirect_mouse_button(:middle)
|
158
|
-
when Gosu::
|
166
|
+
when Gosu::MS_RIGHT
|
159
167
|
redirect_mouse_button(:right)
|
160
|
-
when Gosu::
|
168
|
+
when Gosu::KB_F5
|
161
169
|
request_recalculate
|
162
170
|
end
|
163
171
|
|
@@ -168,15 +176,15 @@ module CyberarmEngine
|
|
168
176
|
super
|
169
177
|
|
170
178
|
case id
|
171
|
-
when Gosu::
|
179
|
+
when Gosu::MS_LEFT
|
172
180
|
redirect_released_mouse_button(:left)
|
173
|
-
when Gosu::
|
181
|
+
when Gosu::MS_MIDDLE
|
174
182
|
redirect_released_mouse_button(:middle)
|
175
|
-
when Gosu::
|
183
|
+
when Gosu::MS_RIGHT
|
176
184
|
redirect_released_mouse_button(:right)
|
177
|
-
when Gosu::
|
185
|
+
when Gosu::MS_WHEEL_UP
|
178
186
|
redirect_mouse_wheel(:up)
|
179
|
-
when Gosu::
|
187
|
+
when Gosu::MS_WHEEL_DOWN
|
180
188
|
redirect_mouse_wheel(:down)
|
181
189
|
end
|
182
190
|
|
@@ -276,6 +284,8 @@ module CyberarmEngine
|
|
276
284
|
def hide_menu
|
277
285
|
return unless @menu
|
278
286
|
|
287
|
+
request_repaint
|
288
|
+
|
279
289
|
@hid_menu_for = @menu.parent
|
280
290
|
@menu = nil
|
281
291
|
end
|
@@ -95,39 +95,58 @@ module CyberarmEngine
|
|
95
95
|
Vector.new(@x, @y)
|
96
96
|
end
|
97
97
|
|
98
|
-
#
|
99
|
-
|
98
|
+
# Adds Vector and Numeric or Vector and Vector, excluding {weight}
|
99
|
+
# @return [CyberarmEngine::Vector]
|
100
|
+
def +(other)
|
100
101
|
if other.is_a?(Numeric)
|
101
102
|
Vector.new(
|
102
|
-
@x
|
103
|
-
@y
|
104
|
-
@z
|
103
|
+
@x + other,
|
104
|
+
@y + other,
|
105
|
+
@z + other
|
105
106
|
)
|
106
107
|
else
|
107
108
|
Vector.new(
|
108
|
-
@x
|
109
|
-
@y
|
110
|
-
@z
|
109
|
+
@x + other.x,
|
110
|
+
@y + other.y,
|
111
|
+
@z + other.z
|
111
112
|
)
|
112
113
|
end
|
113
114
|
end
|
114
115
|
|
115
|
-
# Adds Vector and Numeric or Vector and Vector, excluding {weight}
|
116
|
-
# @return [CyberarmEngine::Vector]
|
117
|
-
def +(other)
|
118
|
-
operator("+", other)
|
119
|
-
end
|
120
|
-
|
121
116
|
# Subtracts Vector and Numeric or Vector and Vector, excluding {weight}
|
122
117
|
# @return [CyberarmEngine::Vector]
|
123
118
|
def -(other)
|
124
|
-
|
119
|
+
if other.is_a?(Numeric)
|
120
|
+
Vector.new(
|
121
|
+
@x - other,
|
122
|
+
@y - other,
|
123
|
+
@z - other
|
124
|
+
)
|
125
|
+
else
|
126
|
+
Vector.new(
|
127
|
+
@x - other.x,
|
128
|
+
@y - other.y,
|
129
|
+
@z - other.z
|
130
|
+
)
|
131
|
+
end
|
125
132
|
end
|
126
133
|
|
127
134
|
# Multiplies Vector and Numeric or Vector and Vector, excluding {weight}
|
128
135
|
# @return [CyberarmEngine::Vector]
|
129
136
|
def *(other)
|
130
|
-
|
137
|
+
if other.is_a?(Numeric)
|
138
|
+
Vector.new(
|
139
|
+
@x * other,
|
140
|
+
@y * other,
|
141
|
+
@z * other
|
142
|
+
)
|
143
|
+
else
|
144
|
+
Vector.new(
|
145
|
+
@x * other.x,
|
146
|
+
@y * other.y,
|
147
|
+
@z * other.z
|
148
|
+
)
|
149
|
+
end
|
131
150
|
end
|
132
151
|
|
133
152
|
def multiply_transform(transform)
|
@@ -6,16 +6,16 @@ module CyberarmEngine
|
|
6
6
|
SAMPLES = {}
|
7
7
|
SONGS = {}
|
8
8
|
|
9
|
-
attr_accessor :show_cursor
|
9
|
+
attr_accessor :show_cursor, :show_stats_plotter
|
10
10
|
attr_writer :exit_on_opengl_error
|
11
|
-
attr_reader :last_frame_time, :states
|
11
|
+
attr_reader :last_frame_time, :delta_time, :states
|
12
12
|
|
13
13
|
def self.now
|
14
14
|
Gosu.milliseconds
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.dt
|
18
|
-
instance.
|
18
|
+
instance.dt
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.instance=(window)
|
@@ -31,32 +31,57 @@ module CyberarmEngine
|
|
31
31
|
def initialize(width: 800, height: 600, fullscreen: false, update_interval: 1000.0 / 60, resizable: false, borderless: false)
|
32
32
|
@show_cursor = false
|
33
33
|
@has_focus = false
|
34
|
+
@show_stats_plotter = false
|
34
35
|
|
35
36
|
super(width, height, fullscreen: fullscreen, update_interval: update_interval, resizable: resizable, borderless: borderless)
|
36
37
|
Window.instance = self
|
37
38
|
|
38
39
|
@last_frame_time = Gosu.milliseconds - 1
|
39
40
|
@current_frame_time = Gosu.milliseconds
|
40
|
-
|
41
|
+
@delta_time = @last_frame_time
|
42
|
+
self.caption = "CyberarmEngine #{CyberarmEngine::VERSION} #{Gosu.user_languages.join(', ')}"
|
41
43
|
|
42
44
|
@states = []
|
43
45
|
@exit_on_opengl_error = false
|
44
46
|
preload_default_shaders if respond_to?(:preload_default_shaders)
|
47
|
+
@stats_plotter = Stats::StatsPlotter.new(2, 28) # FIXME: Make positioning easy
|
45
48
|
|
46
|
-
setup
|
49
|
+
setup
|
50
|
+
end
|
51
|
+
|
52
|
+
def setup
|
47
53
|
end
|
48
54
|
|
49
55
|
def draw
|
56
|
+
Stats.frame.start_timing(:draw)
|
57
|
+
|
50
58
|
current_state&.draw
|
59
|
+
Stats.frame.start_timing(:engine_stats_renderer)
|
60
|
+
@stats_plotter&.draw if @show_stats_plotter
|
61
|
+
Stats.frame.end_timing(:engine_stats_renderer)
|
62
|
+
|
63
|
+
Stats.frame.end_timing(:draw)
|
64
|
+
Stats.frame.start_timing(:interframe_sleep)
|
51
65
|
end
|
52
66
|
|
53
67
|
def update
|
54
|
-
|
68
|
+
# Gosu calls update() then (optionally) draw(),
|
69
|
+
# so always end last frame and start next frame when update() is called.
|
70
|
+
Stats.frame&.end_timing(:interframe_sleep)
|
71
|
+
Stats.end_frame
|
55
72
|
|
56
|
-
|
73
|
+
Stats.new_frame
|
74
|
+
|
75
|
+
@delta_time = (Gosu.milliseconds - @current_frame_time) * 0.001
|
57
76
|
|
58
77
|
@last_frame_time = Gosu.milliseconds - @current_frame_time
|
59
78
|
@current_frame_time = Gosu.milliseconds
|
79
|
+
|
80
|
+
Stats.frame.start_timing(:update)
|
81
|
+
current_state&.update
|
82
|
+
Stats.frame.end_timing(:update)
|
83
|
+
|
84
|
+
Stats.frame.start_timing(:interframe_sleep) unless needs_redraw?
|
60
85
|
end
|
61
86
|
|
62
87
|
def needs_cursor?
|
@@ -120,7 +145,7 @@ module CyberarmEngine
|
|
120
145
|
def push_state(klass, options = {})
|
121
146
|
options = { setup: true }.merge(options)
|
122
147
|
|
123
|
-
if klass.instance_of?(klass.class) &&
|
148
|
+
if klass.instance_of?(klass.class) && klass.respond_to?(:options)
|
124
149
|
@states << klass
|
125
150
|
klass.setup if options[:setup]
|
126
151
|
klass.post_setup if options[:setup]
|
@@ -133,6 +158,8 @@ module CyberarmEngine
|
|
133
158
|
end
|
134
159
|
|
135
160
|
private def child_of?(input, klass)
|
161
|
+
return false unless input
|
162
|
+
|
136
163
|
input.ancestors.detect { |c| c == klass }
|
137
164
|
end
|
138
165
|
|
data/lib/cyberarm_engine.rb
CHANGED
@@ -7,13 +7,19 @@ else
|
|
7
7
|
end
|
8
8
|
require "json"
|
9
9
|
require "excon"
|
10
|
-
require "gosu_more_drawables"
|
11
10
|
|
12
11
|
require_relative "cyberarm_engine/version"
|
13
12
|
require_relative "cyberarm_engine/stats"
|
14
13
|
|
15
14
|
require_relative "cyberarm_engine/common"
|
16
15
|
|
16
|
+
require_relative "cyberarm_engine/gosu_ext/draw_arc"
|
17
|
+
require_relative "cyberarm_engine/gosu_ext/draw_circle"
|
18
|
+
require_relative "cyberarm_engine/gosu_ext/draw_path"
|
19
|
+
|
20
|
+
require_relative "cyberarm_engine/notification"
|
21
|
+
require_relative "cyberarm_engine/notification_manager"
|
22
|
+
|
17
23
|
require_relative "cyberarm_engine/game_object"
|
18
24
|
require_relative "cyberarm_engine/window"
|
19
25
|
|
@@ -66,6 +72,6 @@ require_relative "cyberarm_engine/model/material"
|
|
66
72
|
require_relative "cyberarm_engine/model/model_object"
|
67
73
|
require_relative "cyberarm_engine/model/parser"
|
68
74
|
require_relative "cyberarm_engine/model/parsers/wavefront_parser"
|
69
|
-
require_relative "cyberarm_engine/model/parsers/collada_parser" if defined?(Nokogiri)
|
75
|
+
require_relative "cyberarm_engine/model/parsers/collada_parser" if RUBY_ENGINE != "mruby" && defined?(Nokogiri)
|
70
76
|
|
71
77
|
require_relative "cyberarm_engine/builtin/intro_state"
|
data/mrbgem.rake
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
MRuby::Gem::Specification.new("mruby-cyberarm_engine") do |spec|
|
2
|
+
spec.license = "MIT"
|
3
|
+
spec.authors = "cyberarm"
|
4
|
+
spec.summary = " Yet another framework for building games with Gosu"
|
5
|
+
|
6
|
+
lib_rbfiles = []
|
7
|
+
# Dir.glob("#{File.expand_path("..", __FILE__)}/lib/**/*.rb").reject do |f|
|
8
|
+
# File.basename(f.downcase, ".rb") == "cyberarm_engine" ||
|
9
|
+
# File.basename(f.downcase, ".rb") == "opengl" ||
|
10
|
+
# f.downcase.include?("/opengl/")
|
11
|
+
# end.reverse!
|
12
|
+
|
13
|
+
local_path = File.expand_path("..", __FILE__)
|
14
|
+
File.read("#{local_path}/lib/cyberarm_engine.rb").each_line do |line|
|
15
|
+
line = line.strip
|
16
|
+
|
17
|
+
next unless line.start_with?("require_relative")
|
18
|
+
|
19
|
+
file = line.split("require_relative").last.strip.gsub("\"", "")
|
20
|
+
|
21
|
+
next if file.include?(" if ")
|
22
|
+
|
23
|
+
lib_rbfiles << "#{local_path}/lib/#{file}.rb"
|
24
|
+
end
|
25
|
+
|
26
|
+
pp lib_rbfiles
|
27
|
+
|
28
|
+
spec.rbfiles = lib_rbfiles
|
29
|
+
end
|