cyberarm_engine 0.25.0 → 0.30.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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -8
  3. data/.rubocop.yml +7 -7
  4. data/.travis.yml +5 -5
  5. data/Gemfile +6 -6
  6. data/Gemfile.lock +37 -25
  7. data/LICENSE.txt +21 -21
  8. data/README.md +74 -74
  9. data/Rakefile +10 -10
  10. data/assets/shaders/fragment/g_buffer.glsl +30 -30
  11. data/assets/shaders/fragment/lighting.glsl +115 -115
  12. data/assets/shaders/include/light_struct.glsl +11 -11
  13. data/assets/shaders/include/material_struct.glsl +16 -16
  14. data/assets/shaders/vertex/g_buffer.glsl +28 -28
  15. data/assets/shaders/vertex/lighting.glsl +24 -24
  16. data/assets/textures/ui/circle.png +0 -0
  17. data/assets/textures/ui/circle_small.png +0 -0
  18. data/assets/textures/ui/rounded.png +0 -0
  19. data/assets/textures/ui/rounded_bottom.png +0 -0
  20. data/assets/textures/ui/rounded_left.png +0 -0
  21. data/assets/textures/ui/rounded_left_bottom.png +0 -0
  22. data/assets/textures/ui/rounded_left_top.png +0 -0
  23. data/assets/textures/ui/rounded_right.png +0 -0
  24. data/assets/textures/ui/rounded_right_bottom.png +0 -0
  25. data/assets/textures/ui/rounded_right_top.png +0 -0
  26. data/assets/textures/ui/rounded_small.png +0 -0
  27. data/assets/textures/ui/rounded_tiny.png +0 -0
  28. data/assets/textures/ui/rounded_top.png +0 -0
  29. data/assets/textures/ui/square.png +0 -0
  30. data/bin/console +14 -14
  31. data/bin/setup +8 -8
  32. data/cyberarm_engine.gemspec +35 -36
  33. data/lib/cyberarm_engine/animator.rb +219 -219
  34. data/lib/cyberarm_engine/background.rb +156 -158
  35. data/lib/cyberarm_engine/background_image.rb +93 -93
  36. data/lib/cyberarm_engine/background_nine_slice.rb +182 -142
  37. data/lib/cyberarm_engine/bounding_box.rb +150 -150
  38. data/lib/cyberarm_engine/builtin/intro_state.rb +130 -130
  39. data/lib/cyberarm_engine/cache/download_manager.rb +123 -123
  40. data/lib/cyberarm_engine/cache.rb +4 -4
  41. data/lib/cyberarm_engine/common.rb +133 -131
  42. data/lib/cyberarm_engine/config_file.rb +46 -46
  43. data/lib/cyberarm_engine/console/command.rb +157 -157
  44. data/lib/cyberarm_engine/console/commands/help_command.rb +43 -43
  45. data/lib/cyberarm_engine/console/subcommand.rb +99 -99
  46. data/lib/cyberarm_engine/console.rb +248 -248
  47. data/lib/cyberarm_engine/event_bus.rb +39 -0
  48. data/lib/cyberarm_engine/game_object.rb +244 -244
  49. data/lib/cyberarm_engine/game_state.rb +134 -124
  50. data/lib/cyberarm_engine/gosu_ext/draw_arc.rb +111 -111
  51. data/lib/cyberarm_engine/gosu_ext/draw_circle.rb +30 -30
  52. data/lib/cyberarm_engine/gosu_ext/draw_path.rb +17 -17
  53. data/lib/cyberarm_engine/model/material.rb +21 -21
  54. data/lib/cyberarm_engine/model/mesh.rb +131 -131
  55. data/lib/cyberarm_engine/model/parser.rb +74 -74
  56. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -138
  57. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -154
  58. data/lib/cyberarm_engine/model.rb +216 -216
  59. data/lib/cyberarm_engine/model_cache.rb +31 -31
  60. data/lib/cyberarm_engine/notification.rb +82 -82
  61. data/lib/cyberarm_engine/notification_manager.rb +241 -241
  62. data/lib/cyberarm_engine/opengl/light.rb +52 -52
  63. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -46
  64. data/lib/cyberarm_engine/opengl/perspective_camera.rb +41 -41
  65. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -249
  66. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +167 -167
  67. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +307 -307
  68. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +33 -33
  69. data/lib/cyberarm_engine/opengl/shader.rb +408 -408
  70. data/lib/cyberarm_engine/opengl/texture.rb +69 -69
  71. data/lib/cyberarm_engine/opengl.rb +53 -53
  72. data/lib/cyberarm_engine/pathfinding/graph.rb +64 -0
  73. data/lib/cyberarm_engine/pathfinding/graph_search.rb +6 -0
  74. data/lib/cyberarm_engine/pathfinding/graph_searches/astar_search.rb +6 -0
  75. data/lib/cyberarm_engine/pathfinding/graph_searches/breadth_first_search.rb +27 -0
  76. data/lib/cyberarm_engine/pathfinding/graph_searches/dijkstra_search.rb +6 -0
  77. data/lib/cyberarm_engine/pathfinding/graphs/grid.rb +52 -0
  78. data/lib/cyberarm_engine/ray.rb +56 -56
  79. data/lib/cyberarm_engine/result.rb +19 -0
  80. data/lib/cyberarm_engine/stats.rb +200 -200
  81. data/lib/cyberarm_engine/text.rb +288 -260
  82. data/lib/cyberarm_engine/timer.rb +27 -23
  83. data/lib/cyberarm_engine/transform.rb +296 -296
  84. data/lib/cyberarm_engine/trees/aabb_node.rb +126 -126
  85. data/lib/cyberarm_engine/trees/aabb_tree.rb +55 -55
  86. data/lib/cyberarm_engine/trees/aabb_tree_debug.rb +29 -29
  87. data/lib/cyberarm_engine/ui/border_canvas.rb +102 -102
  88. data/lib/cyberarm_engine/ui/dialog.rb +24 -0
  89. data/lib/cyberarm_engine/ui/dsl.rb +170 -142
  90. data/lib/cyberarm_engine/ui/element.rb +664 -662
  91. data/lib/cyberarm_engine/ui/elements/button.rb +99 -100
  92. data/lib/cyberarm_engine/ui/elements/check_box.rb +58 -54
  93. data/lib/cyberarm_engine/ui/elements/container.rb +413 -407
  94. data/lib/cyberarm_engine/ui/elements/edit_box.rb +200 -179
  95. data/lib/cyberarm_engine/ui/elements/edit_line.rb +299 -297
  96. data/lib/cyberarm_engine/ui/elements/flow.rb +15 -15
  97. data/lib/cyberarm_engine/ui/elements/image.rb +78 -72
  98. data/lib/cyberarm_engine/ui/elements/list_box.rb +79 -79
  99. data/lib/cyberarm_engine/ui/elements/menu.rb +27 -27
  100. data/lib/cyberarm_engine/ui/elements/menu_item.rb +6 -6
  101. data/lib/cyberarm_engine/ui/elements/progress.rb +95 -93
  102. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -6
  103. data/lib/cyberarm_engine/ui/elements/slider.rb +111 -107
  104. data/lib/cyberarm_engine/ui/elements/stack.rb +11 -11
  105. data/lib/cyberarm_engine/ui/elements/text_block.rb +236 -222
  106. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +71 -67
  107. data/lib/cyberarm_engine/ui/elements/widget.rb +45 -0
  108. data/lib/cyberarm_engine/ui/event.rb +54 -54
  109. data/lib/cyberarm_engine/ui/gui_state.rb +402 -326
  110. data/lib/cyberarm_engine/ui/page.rb +39 -0
  111. data/lib/cyberarm_engine/ui/style.rb +94 -61
  112. data/lib/cyberarm_engine/ui/theme.rb +237 -225
  113. data/lib/cyberarm_engine/vector.rb +312 -312
  114. data/lib/cyberarm_engine/version.rb +4 -4
  115. data/lib/cyberarm_engine/window.rb +234 -195
  116. data/lib/cyberarm_engine.rb +88 -76
  117. data/mrbgem.rake +29 -29
  118. metadata +30 -5
@@ -1,72 +1,78 @@
1
- module CyberarmEngine
2
- class Element
3
- class Image < Element
4
- def initialize(path_or_image, options = {}, block = nil)
5
- super(options, block)
6
- @path = path_or_image if path_or_image.is_a?(String)
7
-
8
- @image = Gosu::Image.new(path_or_image, retro: @options[:retro], tileable: @options[:tileable]) if @path
9
- @image = path_or_image unless @path
10
-
11
- @scale_x = 1
12
- @scale_y = 1
13
- end
14
-
15
- def render
16
- @image.draw(
17
- @style.border_thickness_left + @style.padding_left + @x,
18
- @style.border_thickness_top + @style.padding_top + @y,
19
- @z + 2,
20
- @scale_x, @scale_y, @style.color
21
- )
22
- end
23
-
24
- def clicked_left_mouse_button(_sender, _x, _y)
25
- @block.call(self) if @block
26
-
27
- :handled
28
- end
29
-
30
- def layout
31
- _width = dimensional_size(@style.width, :width)
32
- _height = dimensional_size(@style.height, :height)
33
-
34
- if _width && _height
35
- @scale_x = _width.to_f / @image.width
36
- @scale_y = _height.to_f / @image.height
37
- elsif _width
38
- @scale_x = _width.to_f / @image.width
39
- @scale_y = @scale_x
40
- elsif _height
41
- @scale_y = _height.to_f / @image.height
42
- @scale_x = @scale_y
43
- else
44
- @scale_x = 1
45
- @scale_y = 1
46
- end
47
-
48
- @width = _width || (@image.width * @scale_x).floor
49
- @height = _height || (@image.height * @scale_y).floor
50
-
51
- update_background
52
- end
53
-
54
- def value
55
- @image
56
- end
57
-
58
- def value=(path_or_image, retro: false, tileable: false)
59
- @path = path_or_image if path_or_image.is_a?(String)
60
-
61
- @image = Gosu::Image.new(path_or_image, retro: retro, tileable: tileable) if @path
62
- @image = path_or_image unless @path
63
-
64
- recalculate
65
- end
66
-
67
- def path
68
- @path
69
- end
70
- end
71
- end
72
- end
1
+ module CyberarmEngine
2
+ class Element
3
+ class Image < Element
4
+ def initialize(path_or_image, options = {}, block = nil)
5
+ super(options, block)
6
+ @path = path_or_image if path_or_image.is_a?(String)
7
+
8
+ @image = Gosu::Image.new(path_or_image, retro: @options[:retro], tileable: @options[:tileable]) if @path
9
+ @image = path_or_image unless @path
10
+
11
+ @scale_x = 1
12
+ @scale_y = 1
13
+ end
14
+
15
+ def render
16
+ @image.draw(
17
+ styled(:margin_left) + styled(:border_thickness_left) + styled(:padding_left) + @x,
18
+ styled(:margin_top) + styled(:border_thickness_top) + styled(:padding_top) + @y,
19
+ @z + 2,
20
+ @scale_x, @scale_y, styled(:color)
21
+ )
22
+ end
23
+
24
+ def clicked_left_mouse_button(_sender, _x, _y)
25
+ @block.call(self) if @block
26
+
27
+ :handled
28
+ end
29
+
30
+ def layout
31
+ _width = dimensional_size(@style.width, :width)
32
+ _height = dimensional_size(@style.height, :height)
33
+
34
+ if _width && _height
35
+ @scale_x = _width.to_f / @image.width
36
+ @scale_y = _height.to_f / @image.height
37
+ elsif _width
38
+ @scale_x = _width.to_f / @image.width
39
+ @scale_y = @scale_x
40
+ elsif _height
41
+ @scale_y = _height.to_f / @image.height
42
+ @scale_x = @scale_y
43
+ else
44
+ @scale_x = 1
45
+ @scale_y = 1
46
+ end
47
+
48
+ @width = _width || (@image.width * @scale_x).floor
49
+ @height = _height || (@image.height * @scale_y).floor
50
+
51
+ update_background
52
+ end
53
+
54
+ def value
55
+ @image
56
+ end
57
+
58
+ def value=(path_or_image, retro: false, tileable: false)
59
+ old_value = self.value
60
+
61
+ @path = path_or_image if path_or_image.is_a?(String)
62
+
63
+ @image = Gosu::Image.new(path_or_image, retro: retro, tileable: tileable) if @path
64
+ @image = path_or_image unless @path
65
+
66
+ recalculate
67
+
68
+ publish(:changed, @image) if old_value != self.value
69
+
70
+ self.value
71
+ end
72
+
73
+ def path
74
+ @path
75
+ end
76
+ end
77
+ end
78
+ end
@@ -1,79 +1,79 @@
1
- module CyberarmEngine
2
- class Element
3
- class ListBox < Button
4
- attr_accessor :items
5
- attr_reader :choose
6
-
7
- def initialize(options = {}, block = nil)
8
- @items = options[:items] || []
9
- @choose = options[:choose] || @items.first
10
-
11
- super(@choose, options, block)
12
-
13
- @style.background_canvas.background = default(:background)
14
-
15
- @menu = Menu.new(parent: self, theme: @options[:theme])
16
-
17
- self.choose = @choose
18
- end
19
-
20
- def render
21
- super
22
-
23
- w = @text.textobject.text_width("▼")
24
- @text.textobject.draw_text("▼", @x + content_width - w, @y + @style.padding_top, @z, 1, 1, @text.color)
25
- end
26
-
27
- def choose=(item)
28
- valid = @items.detect { |i| i == item }
29
-
30
- unless valid
31
- warn "Invalid value '#{item}' for choose, valid options were: #{@items.map { |i| "#{i.inspect}" }.join(", ")}"
32
- item = @items.first
33
-
34
- raise "No items list" unless item
35
- end
36
-
37
- @choose = item
38
-
39
- self.value = item.to_s
40
-
41
- recalculate
42
- end
43
-
44
- def released_left_mouse_button(_sender, _x, _y)
45
- show_menu
46
-
47
- :handled
48
- end
49
-
50
- def clicked_left_mouse_button(_sender, _x, _y)
51
- # @block&.call(self.value) if @enabled
52
-
53
- :handled
54
- end
55
-
56
- def show_menu
57
- @menu.clear do
58
-
59
- @menu.style.width = width
60
-
61
- @items.each do |item|
62
- # prevent already selected item from appearing in list
63
- # NOTE: Remove this? Might be kinda confusing...
64
- next if item == self.value
65
-
66
- root.gui_state.menu_item(item, width: 1.0, margin: 0, border_color: 0x00ffffff) do
67
- self.choose = item
68
- @block&.call(self.value)
69
- end
70
- end
71
- end
72
-
73
- recalculate
74
-
75
- @menu.show
76
- end
77
- end
78
- end
79
- end
1
+ module CyberarmEngine
2
+ class Element
3
+ class ListBox < Button
4
+ attr_accessor :items
5
+ attr_reader :choose
6
+
7
+ def initialize(options = {}, block = nil)
8
+ @items = options[:items] || []
9
+ @choose = options[:choose] || @items.first
10
+
11
+ super(@choose, options, block)
12
+
13
+ @background_canvas.background = default(:background)
14
+
15
+ @menu = Menu.new(parent: self, theme: @options[:theme])
16
+
17
+ self.choose = @choose
18
+ end
19
+
20
+ def render
21
+ super
22
+
23
+ w = @text.textobject.text_width("▼")
24
+ @text.textobject.draw_text("▼", @x + content_width - w, @y + styled(:padding_top), @z, 1, 1, @text.color)
25
+ end
26
+
27
+ def choose=(item)
28
+ valid = @items.detect { |i| i == item }
29
+
30
+ unless valid
31
+ warn "Invalid value '#{item}' for choose, valid options were: #{@items.map { |i| "#{i.inspect}" }.join(", ")}"
32
+ item = @items.first
33
+
34
+ raise "No items list" unless item
35
+ end
36
+
37
+ @choose = item
38
+
39
+ self.value = item.to_s
40
+
41
+ recalculate
42
+ end
43
+
44
+ def released_left_mouse_button(_sender, _x, _y)
45
+ show_menu
46
+
47
+ :handled
48
+ end
49
+
50
+ def clicked_left_mouse_button(_sender, _x, _y)
51
+ # @block&.call(self.value) if @enabled
52
+
53
+ :handled
54
+ end
55
+
56
+ def show_menu
57
+ @menu.clear do
58
+
59
+ @menu.style.width = width - (@menu.styled(:border_thickness_left) + @menu.styled(:border_thickness_right))
60
+
61
+ @items.each do |item|
62
+ # prevent already selected item from appearing in list
63
+ # NOTE: Remove this? Might be kinda confusing...
64
+ next if item == self.value
65
+
66
+ root.gui_state.menu_item(item, width: 1.0, margin: 0, border_color: 0x00ffffff) do
67
+ self.choose = item
68
+ @block&.call(self.value)
69
+ end
70
+ end
71
+ end
72
+
73
+ recalculate
74
+
75
+ @menu.show
76
+ end
77
+ end
78
+ end
79
+ end
@@ -1,27 +1,27 @@
1
- module CyberarmEngine
2
- class Element
3
- class Menu < Stack
4
- def recalculate
5
- super
6
-
7
- recalculate_menu
8
- end
9
-
10
- def recalculate_menu
11
- # FIXME: properly find scrollable parent, if any.
12
- parent_scroll_top = parent&.parent ? parent.parent.scroll_top : 0
13
-
14
- @x = @parent.x
15
- @y = parent_scroll_top + @parent.y + @parent.height
16
-
17
- @y = (parent_scroll_top + @parent.y) - height if @y + height > window.height
18
- end
19
-
20
- def show
21
- recalculate
22
-
23
- root.gui_state.show_menu(self)
24
- end
25
- end
26
- end
27
- end
1
+ module CyberarmEngine
2
+ class Element
3
+ class Menu < Stack
4
+ def recalculate
5
+ super
6
+
7
+ recalculate_menu
8
+ end
9
+
10
+ def recalculate_menu
11
+ # FIXME: properly find scrollable parent, if any.
12
+ parent_scroll_top = parent&.parent ? parent.parent.scroll_top : 0
13
+
14
+ @x = @parent.x + @parent.styled(:border_thickness_left)
15
+ @y = parent_scroll_top + @parent.y + @parent.height + @parent.styled(:border_thickness_top)
16
+
17
+ @y = (parent_scroll_top + @parent.y + @parent.styled(:border_thickness_top)) - height if @y + height > window.height
18
+ end
19
+
20
+ def show
21
+ recalculate
22
+
23
+ root.gui_state.show_menu(self)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,6 +1,6 @@
1
- module CyberarmEngine
2
- class Element
3
- class MenuItem < Button
4
- end
5
- end
6
- end
1
+ module CyberarmEngine
2
+ class Element
3
+ class MenuItem < Button
4
+ end
5
+ end
6
+ end
@@ -1,93 +1,95 @@
1
- module CyberarmEngine
2
- class Element
3
- class Progress < Element
4
- attr_reader :type
5
-
6
- def initialize(options = {}, block = nil)
7
- super(options, block)
8
-
9
- @animation_speed = options[:animation_speed] || 3_000
10
- @marquee_width = options[:marquee_width] || 0.25
11
- @marquee_offset = 0
12
- @marquee_animation_time = Gosu.milliseconds
13
- @type = options[:type] || :linear
14
- @fraction_background = Background.new(background: @style.fraction_background)
15
- self.value = options[:fraction] || 0.0
16
- end
17
-
18
- def render
19
- @fraction_background.draw
20
- end
21
-
22
- def layout
23
- _width = dimensional_size(@style.width, :width)
24
- _height = dimensional_size(@style.height, :height)
25
- @width = _width
26
- @height = _height
27
-
28
- update_background
29
- end
30
-
31
- def update_background
32
- super
33
-
34
- @fraction_background.x = (@style.border_thickness_left + @style.padding_left + @x) + @marquee_offset
35
- @fraction_background.y = @style.border_thickness_top + @style.padding_top + @y
36
- @fraction_background.z = @z
37
- @fraction_background.width = @width * (@type == :marquee ? @marquee_width : @fraction)
38
- @fraction_background.height = @height
39
-
40
- @fraction_background.background = @style.fraction_background
41
- end
42
-
43
- def update
44
- super
45
-
46
- return unless @type == :marquee
47
-
48
- marquee_width = @width * @marquee_width
49
- range = @width + marquee_width
50
-
51
- @marquee_offset = (@width * (Gosu.milliseconds - @marquee_animation_time) / @animation_speed) - marquee_width
52
- @marquee_animation_time = Gosu.milliseconds if @marquee_offset > range
53
-
54
- update_background
55
- root.gui_state.request_repaint
56
- end
57
-
58
- def type=(type)
59
- @type = type
60
-
61
- case type
62
- when :linear
63
- @marquee_offset = 0
64
- when :marquee
65
- @marquee_offset = 0
66
- @marquee_animation_time = Gosu.milliseconds
67
- else
68
- raise ArgumentError, "Only types :linear and :marquee are supported"
69
- end
70
-
71
- update_background
72
- end
73
-
74
- def value
75
- @fraction
76
- end
77
-
78
- def value=(decimal)
79
- raise "value must be number" unless decimal.is_a?(Numeric)
80
-
81
- old_value = @fraction
82
-
83
- @fraction = decimal.clamp(0.0, 1.0)
84
- update_background
85
-
86
- root.gui_state.request_repaint if @fraction != old_value
87
-
88
- publish(:changed, @fraction)
89
- @fraction
90
- end
91
- end
92
- end
93
- end
1
+ module CyberarmEngine
2
+ class Element
3
+ class Progress < Element
4
+ attr_reader :type
5
+
6
+ def initialize(options = {}, block = nil)
7
+ super(options, block)
8
+
9
+ @animation_speed = options[:animation_speed] || 3_000
10
+ @marquee_width = options[:marquee_width] || 0.25
11
+ @marquee_offset = 0
12
+ @marquee_animation_time = Gosu.milliseconds
13
+ @type = options[:type] || :linear
14
+ @fraction_background = Background.new(background: styled(:fraction_background))
15
+ self.value = options[:fraction] || 0.0
16
+ end
17
+
18
+ def render
19
+ @fraction_background.draw
20
+ end
21
+
22
+ def layout
23
+ _width = dimensional_size(@style.width, :width)
24
+ _height = dimensional_size(@style.height, :height)
25
+ @width = _width
26
+ @height = _height
27
+
28
+ update_background
29
+ end
30
+
31
+ def update_background
32
+ super
33
+
34
+ @fraction_background.x = (styled(:border_thickness_left) + styled(:padding_left) + @x) + @marquee_offset
35
+ @fraction_background.y = styled(:border_thickness_top) + styled(:padding_top) + @y
36
+ @fraction_background.z = @z
37
+ @fraction_background.width = @width * (@type == :marquee ? @marquee_width : @fraction)
38
+ @fraction_background.height = @height
39
+
40
+ @fraction_background.background = styled(:fraction_background)
41
+ end
42
+
43
+ def update
44
+ super
45
+
46
+ return unless @type == :marquee
47
+
48
+ marquee_width = @width * @marquee_width
49
+ range = @width + marquee_width
50
+
51
+ @marquee_offset = (@width * (Gosu.milliseconds - @marquee_animation_time) / @animation_speed) - marquee_width
52
+ @marquee_animation_time = Gosu.milliseconds if @marquee_offset > range
53
+
54
+ update_background
55
+ root.gui_state.request_repaint
56
+ end
57
+
58
+ def type=(type)
59
+ @type = type
60
+
61
+ case type
62
+ when :linear
63
+ @marquee_offset = 0
64
+ when :marquee
65
+ @marquee_offset = 0
66
+ @marquee_animation_time = Gosu.milliseconds
67
+ else
68
+ raise ArgumentError, "Only types :linear and :marquee are supported"
69
+ end
70
+
71
+ update_background
72
+ end
73
+
74
+ def value
75
+ @fraction
76
+ end
77
+
78
+ def value=(decimal)
79
+ raise "value must be number" unless decimal.is_a?(Numeric)
80
+
81
+ old_value = @fraction
82
+
83
+ @fraction = decimal.clamp(0.0, 1.0)
84
+ update_background
85
+
86
+ if @fraction != old_value
87
+ root.gui_state.request_repaint
88
+ publish(:changed, @fraction)
89
+ end
90
+
91
+ @fraction
92
+ end
93
+ end
94
+ end
95
+ end
@@ -1,6 +1,6 @@
1
- module CyberarmEngine
2
- class Element
3
- class Radio < Element
4
- end
5
- end
6
- end
1
+ module CyberarmEngine
2
+ class Element
3
+ class Radio < Element
4
+ end
5
+ end
6
+ end