cyberarm_engine 0.22.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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/assets/shaders/fragment/g_buffer.glsl +30 -0
  3. data/assets/shaders/fragment/lighting.glsl +69 -0
  4. data/assets/shaders/include/light_struct.glsl +11 -0
  5. data/assets/shaders/include/material_struct.glsl +16 -0
  6. data/assets/shaders/vertex/g_buffer.glsl +28 -0
  7. data/assets/shaders/vertex/lighting.glsl +24 -0
  8. data/lib/cyberarm_engine/background_image.rb +1 -1
  9. data/lib/cyberarm_engine/builtin/intro_state.rb +3 -3
  10. data/lib/cyberarm_engine/common.rb +14 -2
  11. data/lib/cyberarm_engine/console.rb +10 -10
  12. data/lib/cyberarm_engine/game_object.rb +1 -1
  13. data/lib/cyberarm_engine/game_state.rb +4 -0
  14. data/lib/cyberarm_engine/gosu_ext/draw_arc.rb +98 -0
  15. data/lib/cyberarm_engine/gosu_ext/draw_circle.rb +31 -0
  16. data/lib/cyberarm_engine/gosu_ext/draw_path.rb +17 -0
  17. data/lib/cyberarm_engine/model.rb +7 -6
  18. data/lib/cyberarm_engine/notification.rb +83 -0
  19. data/lib/cyberarm_engine/notification_manager.rb +242 -0
  20. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +1 -0
  21. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +16 -10
  22. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +12 -1
  23. data/lib/cyberarm_engine/opengl/shader.rb +2 -2
  24. data/lib/cyberarm_engine/opengl.rb +13 -1
  25. data/lib/cyberarm_engine/stats.rb +181 -10
  26. data/lib/cyberarm_engine/text.rb +3 -0
  27. data/lib/cyberarm_engine/ui/border_canvas.rb +2 -2
  28. data/lib/cyberarm_engine/ui/element.rb +74 -26
  29. data/lib/cyberarm_engine/ui/elements/container.rb +95 -25
  30. data/lib/cyberarm_engine/ui/elements/edit_line.rb +6 -0
  31. data/lib/cyberarm_engine/ui/elements/image.rb +2 -2
  32. data/lib/cyberarm_engine/ui/elements/progress.rb +5 -0
  33. data/lib/cyberarm_engine/ui/elements/slider.rb +6 -3
  34. data/lib/cyberarm_engine/ui/elements/text_block.rb +19 -1
  35. data/lib/cyberarm_engine/ui/gui_state.rb +53 -27
  36. data/lib/cyberarm_engine/ui/style.rb +2 -1
  37. data/lib/cyberarm_engine/vector.rb +35 -16
  38. data/lib/cyberarm_engine/version.rb +1 -1
  39. data/lib/cyberarm_engine/window.rb +40 -8
  40. data/lib/cyberarm_engine.rb +8 -2
  41. data/mrbgem.rake +29 -0
  42. metadata +15 -3
@@ -27,6 +27,8 @@ module CyberarmEngine
27
27
  @pending_recalculate_request = false
28
28
  @pending_element_recalculate_requests = []
29
29
 
30
+ @needs_repaint = false
31
+
30
32
  @menu = nil
31
33
  @min_drag_distance = 0
32
34
  @mouse_pos = Vector.new
@@ -55,30 +57,44 @@ module CyberarmEngine
55
57
  @menu.draw
56
58
  end
57
59
 
58
- if @tip.value.length.positive?
60
+ if @tip && @tip.value.length.positive?
59
61
  Gosu.flush
60
62
 
61
63
  @tip.draw
62
64
  end
63
65
 
64
- if defined?(GUI_DEBUG)
66
+ # FIXME
67
+ if false# defined?(GUI_DEBUG)
65
68
  Gosu.flush
66
69
 
67
70
  @root_container.debug_draw
68
71
  end
72
+
73
+ @needs_repaint = false
74
+ end
75
+
76
+ def needs_repaint?
77
+ @needs_repaint
69
78
  end
70
79
 
71
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
+
72
89
  if @pending_recalculate_request
73
- @root_container.recalculate
74
- @root_container.recalculate
90
+ Stats.frame.start_timing(:gui_recalculate)
91
+
75
92
  @root_container.recalculate
76
93
 
77
94
  @pending_recalculate_request = false
78
- end
79
95
 
80
- @pending_element_recalculate_requests.each(&:recalculate)
81
- @pending_element_recalculate_requests.clear
96
+ Stats.frame.end_timing(:gui_recalculate)
97
+ end
82
98
 
83
99
  if @pending_focus_request
84
100
  @pending_focus_request = false
@@ -88,9 +104,19 @@ module CyberarmEngine
88
104
  end
89
105
 
90
106
  @menu&.update
107
+
91
108
  super
92
109
 
110
+ if @active_width != window.width || @active_height != window.height
111
+ request_recalculate
112
+ @root_container.publish(:window_size_changed)
113
+ end
114
+
115
+ @active_width = window.width
116
+ @active_height = window.height
117
+
93
118
  return unless window.has_focus?
119
+ return unless window.current_state == self
94
120
 
95
121
  new_mouse_over = @menu.hit_element?(window.mouse_x, window.mouse_y) if @menu
96
122
  new_mouse_over ||= @root_container.hit_element?(window.mouse_x, window.mouse_y)
@@ -103,9 +129,9 @@ module CyberarmEngine
103
129
  @mouse_over.publish(:leave) if @mouse_over && new_mouse_over != @mouse_over
104
130
  @mouse_over = new_mouse_over
105
131
 
106
- redirect_holding_mouse_button(:left) if @mouse_over && Gosu.button_down?(Gosu::MsLeft)
107
- redirect_holding_mouse_button(:middle) if @mouse_over && Gosu.button_down?(Gosu::MsMiddle)
108
- redirect_holding_mouse_button(:right) if @mouse_over && Gosu.button_down?(Gosu::MsRight)
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)
109
135
 
110
136
  if Vector.new(window.mouse_x, window.mouse_y) == @last_mouse_pos
111
137
  if @mouse_over && (Gosu.milliseconds - @mouse_moved_at) > tool_tip_delay
@@ -127,27 +153,19 @@ module CyberarmEngine
127
153
 
128
154
  @last_mouse_pos = Vector.new(window.mouse_x, window.mouse_y)
129
155
  @mouse_pos = @last_mouse_pos.clone
130
-
131
- if @active_width != window.width || @active_height != window.height
132
- request_recalculate
133
- @root_container.publish(:window_size_changed)
134
- end
135
-
136
- @active_width = window.width
137
- @active_height = window.height
138
156
  end
139
157
 
140
158
  def button_down(id)
141
159
  super
142
160
 
143
161
  case id
144
- when Gosu::MsLeft
162
+ when Gosu::MS_LEFT
145
163
  redirect_mouse_button(:left)
146
- when Gosu::MsMiddle
164
+ when Gosu::MS_MIDDLE
147
165
  redirect_mouse_button(:middle)
148
- when Gosu::MsRight
166
+ when Gosu::MS_RIGHT
149
167
  redirect_mouse_button(:right)
150
- when Gosu::KbF5
168
+ when Gosu::KB_F5
151
169
  request_recalculate
152
170
  end
153
171
 
@@ -158,15 +176,15 @@ module CyberarmEngine
158
176
  super
159
177
 
160
178
  case id
161
- when Gosu::MsLeft
179
+ when Gosu::MS_LEFT
162
180
  redirect_released_mouse_button(:left)
163
- when Gosu::MsMiddle
181
+ when Gosu::MS_MIDDLE
164
182
  redirect_released_mouse_button(:middle)
165
- when Gosu::MsRight
183
+ when Gosu::MS_RIGHT
166
184
  redirect_released_mouse_button(:right)
167
- when Gosu::MsWheelUp
185
+ when Gosu::MS_WHEEL_UP
168
186
  redirect_mouse_wheel(:up)
169
- when Gosu::MsWheelDown
187
+ when Gosu::MS_WHEEL_DOWN
170
188
  redirect_mouse_wheel(:down)
171
189
  end
172
190
 
@@ -253,6 +271,12 @@ module CyberarmEngine
253
271
  @pending_focus_element = element
254
272
  end
255
273
 
274
+ def request_repaint
275
+ # puts caller[0..4]
276
+ # puts
277
+ @needs_repaint = true
278
+ end
279
+
256
280
  def show_menu(list_box)
257
281
  @menu = list_box
258
282
  end
@@ -260,6 +284,8 @@ module CyberarmEngine
260
284
  def hide_menu
261
285
  return unless @menu
262
286
 
287
+ request_repaint
288
+
263
289
  @hid_menu_for = @menu.parent
264
290
  @menu = nil
265
291
  end
@@ -20,7 +20,8 @@ module CyberarmEngine
20
20
  attr_reader :hash
21
21
 
22
22
  def initialize(hash = {})
23
- h = Marshal.load(Marshal.dump(hash))
23
+ h = hash
24
+ # h = Marshal.load(Marshal.dump(hash))
24
25
 
25
26
  h[:default] = {}
26
27
 
@@ -95,39 +95,58 @@ module CyberarmEngine
95
95
  Vector.new(@x, @y)
96
96
  end
97
97
 
98
- # Performs math operation, excluding {weight}
99
- private def operator(function, other)
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.send(:"#{function}", other),
103
- @y.send(:"#{function}", other),
104
- @z.send(:"#{function}", other)
103
+ @x + other,
104
+ @y + other,
105
+ @z + other
105
106
  )
106
107
  else
107
108
  Vector.new(
108
- @x.send(:"#{function}", other.x),
109
- @y.send(:"#{function}", other.y),
110
- @z.send(:"#{function}", other.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
- operator("-", other)
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
- operator("*", other)
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)
@@ -1,4 +1,4 @@
1
1
  module CyberarmEngine
2
2
  NAME = "InDev".freeze
3
- VERSION = "0.22.0".freeze
3
+ VERSION = "0.24.0".freeze
4
4
  end
@@ -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.last_frame_time / 1000.0
18
+ instance.dt
19
19
  end
20
20
 
21
21
  def self.instance=(window)
@@ -31,31 +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
- self.caption = "CyberarmEngine #{CyberarmEngine::VERSION} #{Gosu.language}"
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
46
+ preload_default_shaders if respond_to?(:preload_default_shaders)
47
+ @stats_plotter = Stats::StatsPlotter.new(2, 28) # FIXME: Make positioning easy
44
48
 
45
- setup if defined?(setup)
49
+ setup
50
+ end
51
+
52
+ def setup
46
53
  end
47
54
 
48
55
  def draw
56
+ Stats.frame.start_timing(:draw)
57
+
49
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)
50
65
  end
51
66
 
52
67
  def update
53
- Stats.clear
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
54
72
 
55
- current_state&.update
73
+ Stats.new_frame
74
+
75
+ @delta_time = (Gosu.milliseconds - @current_frame_time) * 0.001
56
76
 
57
77
  @last_frame_time = Gosu.milliseconds - @current_frame_time
58
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?
59
85
  end
60
86
 
61
87
  def needs_cursor?
@@ -119,7 +145,7 @@ module CyberarmEngine
119
145
  def push_state(klass, options = {})
120
146
  options = { setup: true }.merge(options)
121
147
 
122
- if klass.instance_of?(klass.class) && defined?(klass.options)
148
+ if klass.instance_of?(klass.class) && klass.respond_to?(:options)
123
149
  @states << klass
124
150
  klass.setup if options[:setup]
125
151
  klass.post_setup if options[:setup]
@@ -132,6 +158,8 @@ module CyberarmEngine
132
158
  end
133
159
 
134
160
  private def child_of?(input, klass)
161
+ return false unless input
162
+
135
163
  input.ancestors.detect { |c| c == klass }
136
164
  end
137
165
 
@@ -141,10 +169,14 @@ module CyberarmEngine
141
169
 
142
170
  def pop_state
143
171
  @states.pop
172
+
173
+ current_state.request_repaint if current_state&.is_a?(GuiState)
144
174
  end
145
175
 
146
176
  def shift_state
147
177
  @states.shift
178
+
179
+ current_state.request_repaint if current_state&.is_a?(GuiState)
148
180
  end
149
181
 
150
182
  def has_focus?
@@ -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
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cyberarm_engine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.0
4
+ version: 0.24.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyberarm
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-23 00:00:00.000000000 Z
11
+ date: 2023-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: excon
@@ -108,6 +108,12 @@ files:
108
108
  - LICENSE.txt
109
109
  - README.md
110
110
  - Rakefile
111
+ - assets/shaders/fragment/g_buffer.glsl
112
+ - assets/shaders/fragment/lighting.glsl
113
+ - assets/shaders/include/light_struct.glsl
114
+ - assets/shaders/include/material_struct.glsl
115
+ - assets/shaders/vertex/g_buffer.glsl
116
+ - assets/shaders/vertex/lighting.glsl
111
117
  - assets/textures/default.png
112
118
  - assets/textures/logo.png
113
119
  - bin/console
@@ -130,6 +136,9 @@ files:
130
136
  - lib/cyberarm_engine/console/subcommand.rb
131
137
  - lib/cyberarm_engine/game_object.rb
132
138
  - lib/cyberarm_engine/game_state.rb
139
+ - lib/cyberarm_engine/gosu_ext/draw_arc.rb
140
+ - lib/cyberarm_engine/gosu_ext/draw_circle.rb
141
+ - lib/cyberarm_engine/gosu_ext/draw_path.rb
133
142
  - lib/cyberarm_engine/model.rb
134
143
  - lib/cyberarm_engine/model/material.rb
135
144
  - lib/cyberarm_engine/model/model_object.rb
@@ -137,6 +146,8 @@ files:
137
146
  - lib/cyberarm_engine/model/parsers/collada_parser.rb
138
147
  - lib/cyberarm_engine/model/parsers/wavefront_parser.rb
139
148
  - lib/cyberarm_engine/model_cache.rb
149
+ - lib/cyberarm_engine/notification.rb
150
+ - lib/cyberarm_engine/notification_manager.rb
140
151
  - lib/cyberarm_engine/opengl.rb
141
152
  - lib/cyberarm_engine/opengl/light.rb
142
153
  - lib/cyberarm_engine/opengl/orthographic_camera.rb
@@ -176,6 +187,7 @@ files:
176
187
  - lib/cyberarm_engine/vector.rb
177
188
  - lib/cyberarm_engine/version.rb
178
189
  - lib/cyberarm_engine/window.rb
190
+ - mrbgem.rake
179
191
  homepage: https://github.com/cyberarm/cyberarm_engine
180
192
  licenses:
181
193
  - MIT
@@ -197,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
209
  - !ruby/object:Gem::Version
198
210
  version: '0'
199
211
  requirements: []
200
- rubygems_version: 3.3.15
212
+ rubygems_version: 3.4.14
201
213
  signing_key:
202
214
  specification_version: 4
203
215
  summary: Make games quickly and easily with gosu