cyberarm_engine 0.9.0 → 0.10.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 13dd35ba206e4239217450cd996f67797a204b97ff4b4bedf5ab77b8b8fa30cb
4
- data.tar.gz: d2c4bd2d4f94d0d008fd828d4a8ed7bfea0670bbebaf74dd19f7bda01fd1b0c5
3
+ metadata.gz: 47bffc9332cd383b41477f88733dd1f228b8f4b8b37a44e847c617db030aefd8
4
+ data.tar.gz: eb4534834cf3271c7bc0d12a8eccc8d8b79a0d1280c47e95d821639c1eebad35
5
5
  SHA512:
6
- metadata.gz: 76274df828fc73fae6d3ec1c220815e90cc193c49dfc879495205c63e52a0a617e16740987d06deb2c9c39624eae53c9d47d51799b178fdb3bdc2c38995ee3d0
7
- data.tar.gz: 1e7a9b9532d93adc3256cd1ed1d8a0c92c41b682850afdee2f91e56ebc0459b16ede6c05a6fa29e7b2f7ad8b51d95b51750d383c36ab059003ff102d0abfc79b
6
+ metadata.gz: 63f0ca02246ebd4891dd9da5ba6e5fd844b6a21599223dd19993691c9c2964f07235ff2a643c4b292e6bea3ab7a359e3460ae438ca13a130d628b2c937826d3f
7
+ data.tar.gz: 87188e527112f553c3dd7a42fb1a39a447799018e62a91431dc539ea1fdb1319b65156582cef376ba481532f1a801b01d5e7e4b58c0988ad69bd67c0ff077000
@@ -9,6 +9,8 @@ require_relative "cyberarm_engine/engine"
9
9
 
10
10
  require_relative "cyberarm_engine/lib/bounding_box"
11
11
  require_relative "cyberarm_engine/lib/vector"
12
+ require_relative "cyberarm_engine/lib/ray"
13
+ require_relative "cyberarm_engine/lib/shader" if defined?(OpenGL)
12
14
  require_relative "cyberarm_engine/background"
13
15
 
14
16
  require_relative "cyberarm_engine/objects/text"
@@ -0,0 +1,55 @@
1
+ module CyberarmEngine
2
+ class Ray
3
+ def initialize(origin, direction)
4
+ raise "Origin must be a Vector!" unless origin.is_a?(Vector)
5
+ raise "Direction must be a Vector!" unless direction.is_a?(Vector)
6
+
7
+ @origin = origin
8
+ @direction = direction
9
+
10
+ @inverse_direction = @direction.inverse
11
+ end
12
+
13
+ def intersect?(intersectable)
14
+ if intersectable.is_a?(BoundingBox)
15
+ intersect_bounding_box?(intersectable)
16
+ else
17
+ raise NotImplementedError, "Ray intersection test for #{intersectable.class} not implemented."
18
+ end
19
+ end
20
+
21
+ # Based on: https://tavianator.com/fast-branchless-raybounding-box-intersections/
22
+ def intersect_bounding_box?(box)
23
+ tmin = -Float::INFINITY
24
+ tmax = Float::INFINITY
25
+
26
+ tx1 = (box.min.x - @origin.x) * @inverse_direction.x
27
+ tx2 = (box.max.x - @origin.x) * @inverse_direction.x
28
+
29
+ tmin = max(tmin, min(tx1, tx2))
30
+ tmax = min(tmax, max(tx1, tx2))
31
+
32
+ ty1 = (box.min.y - @origin.y) * @inverse_direction.y
33
+ ty2 = (box.max.y - @origin.y) * @inverse_direction.y
34
+
35
+ tmin = max(tmin, min(ty1, ty2))
36
+ tmax = min(tmax, max(ty1, ty2))
37
+
38
+ tz1 = (box.min.z - @origin.z) * @inverse_direction.z
39
+ tz2 = (box.max.z - @origin.z) * @inverse_direction.z
40
+
41
+ tmin = max(tmin, min(tz1, tz2))
42
+ tmax = min(tmax, max(tz1, tz2))
43
+
44
+ return tmax >= max(tmin, 0.0);
45
+ end
46
+
47
+ def min(x, y)
48
+ ((x) < (y) ? (x) : (y))
49
+ end
50
+
51
+ def max(x, y)
52
+ ((x) > (y) ? (x) : (y))
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,197 @@
1
+ module CyberarmEngine
2
+ # Ref: https://github.com/vaiorabbit/ruby-opengl/blob/master/sample/OrangeBook/brick.rb
3
+ class Shader
4
+ include OpenGL
5
+
6
+ def self.add(name, instance)
7
+ @shaders ||= {}
8
+ @shaders[name] = instance
9
+ end
10
+
11
+ def self.use(name, &block)
12
+ shader = @shaders.dig(name)
13
+ if shader
14
+ shader.use(&block)
15
+ else
16
+ raise ArgumentError, "Shader '#{name}' not found!"
17
+ end
18
+ end
19
+
20
+ def self.active_shader
21
+ @active_shader
22
+ end
23
+
24
+ def self.active_shader=(instance)
25
+ @active_shader = instance
26
+ end
27
+
28
+ def self.stop
29
+ shader = Shader.active_shader
30
+
31
+ if shader
32
+ shader.stop
33
+ else
34
+ raise ArgumentError, "No active shader to stop!"
35
+ end
36
+ end
37
+
38
+ def self.attribute_location(variable)
39
+ raise RuntimeError, "No active shader!" unless Shader.active_shader
40
+ Shader.active_shader.attribute_location(variable)
41
+ end
42
+
43
+ def self.set_uniform(variable, value)
44
+ raise RuntimeError, "No active shader!" unless Shader.active_shader
45
+ Shader.active_shader.set_uniform(variable, value)
46
+ end
47
+
48
+ attr_reader :name, :program
49
+ def initialize(name:, vertex: "shaders/default.vert", fragment:)
50
+ @name = name
51
+ @vertex_file = vertex
52
+ @fragment_file = fragment
53
+ @compiled = false
54
+
55
+ @program = nil
56
+
57
+ @error_buffer_size = 1024
58
+ @variable_missing = {}
59
+
60
+ raise ArgumentError, "Shader files not found: #{@vertex_file} or #{@fragment_file}" unless shader_files_exist?
61
+
62
+ create_shaders
63
+ compile_shaders
64
+
65
+ # Only add shader if it successfully compiles
66
+ if @compiled
67
+ Shader.add(@name, self)
68
+ else
69
+ puts "FAILED to compile shader: #{@name}", ""
70
+ end
71
+ end
72
+
73
+ def shader_files_exist?
74
+ File.exist?(@vertex_file) && File.exist?(@fragment_file)
75
+ end
76
+
77
+ def create_shaders
78
+ @vertex = glCreateShader(GL_VERTEX_SHADER)
79
+ @fragment = glCreateShader(GL_FRAGMENT_SHADER)
80
+
81
+ source = [File.read(@vertex_file)].pack('p')
82
+ size = [File.size(@vertex_file)].pack('I')
83
+ glShaderSource(@vertex, 1, source, size)
84
+
85
+ source = [File.read(@fragment_file)].pack('p')
86
+ size = [File.size(@fragment_file)].pack('I')
87
+ glShaderSource(@fragment, 1, source, size)
88
+ end
89
+
90
+ def compile_shaders
91
+ return unless shader_files_exist?
92
+
93
+ glCompileShader(@vertex)
94
+ buffer = ' '
95
+ glGetShaderiv(@vertex, GL_COMPILE_STATUS, buffer)
96
+ compiled = buffer.unpack('L')[0]
97
+
98
+ if compiled == 0
99
+ log = ' ' * @error_buffer_size
100
+ glGetShaderInfoLog(@vertex, @error_buffer_size, nil, log)
101
+ puts "Shader Error: Program \"#{@name}\""
102
+ puts " Vectex Shader InfoLog:", " #{log.strip.split("\n").join("\n ")}\n\n"
103
+ puts " Shader Compiled status: #{compiled}"
104
+ puts " NOTE: assignment of uniforms in shaders is illegal!"
105
+ puts
106
+ return
107
+ end
108
+
109
+ glCompileShader(@fragment)
110
+ buffer = ' '
111
+ glGetShaderiv(@fragment, GL_COMPILE_STATUS, buffer)
112
+ compiled = buffer.unpack('L')[0]
113
+
114
+ if compiled == 0
115
+ log = ' ' * @error_buffer_size
116
+ glGetShaderInfoLog(@fragment, @error_buffer_size, nil, log)
117
+ puts "Shader Error: Program \"#{@name}\""
118
+ puts " Fragment Shader InfoLog:", " #{log.strip.split("\n").join("\n ")}\n\n"
119
+ puts " Shader Compiled status: #{compiled}"
120
+ puts " NOTE: assignment of uniforms in shader is illegal!"
121
+ puts
122
+ return
123
+ end
124
+
125
+ @program = glCreateProgram
126
+ glAttachShader(@program, @vertex)
127
+ glAttachShader(@program, @fragment)
128
+ glLinkProgram(@program)
129
+
130
+ buffer = ' '
131
+ glGetProgramiv(@program, GL_LINK_STATUS, buffer)
132
+ linked = buffer.unpack('L')[0]
133
+
134
+ if linked == 0
135
+ log = ' ' * @error_buffer_size
136
+ glGetProgramInfoLog(@program, @error_buffer_size, nil, log)
137
+ puts "Shader Error: Program \"#{@name}\""
138
+ puts " Program InfoLog:", " #{log.strip.split("\n").join("\n ")}\n\n"
139
+ end
140
+
141
+ @compiled = linked == 0 ? false : true
142
+ end
143
+
144
+ # Returns the location of a uniform variable
145
+ def variable(variable)
146
+ loc = glGetUniformLocation(@program, variable)
147
+ if (loc == -1)
148
+ puts "Shader Error: Program \"#{@name}\" has no such uniform named \"#{variable}\"", " Is it used in the shader? GLSL may have optimized it out.", " Is it miss spelled?" unless @variable_missing[variable]
149
+ @variable_missing[variable] = true
150
+ end
151
+ return loc
152
+ end
153
+
154
+ def use(&block)
155
+ return unless compiled?
156
+ raise "Another shader is already in use! #{Shader.active_shader.name.inspect}" if Shader.active_shader
157
+ Shader.active_shader=self
158
+
159
+ glUseProgram(@program)
160
+
161
+ if block
162
+ block.call(self)
163
+ stop
164
+ end
165
+ end
166
+
167
+ def stop
168
+ Shader.active_shader = nil if Shader.active_shader == self
169
+ glUseProgram(0)
170
+ end
171
+
172
+ def compiled?
173
+ @compiled
174
+ end
175
+
176
+ def attribute_location(variable)
177
+ glGetUniformLocation(@program, variable)
178
+ end
179
+
180
+ def set_uniform(variable, value, location = nil)
181
+ attr_loc = location ? location : attribute_location(variable)
182
+
183
+ case value.class.to_s.downcase.to_sym
184
+ when :integer
185
+ glUniform1i(attr_loc, value)
186
+ when :float
187
+ glUniform1f(attr_loc, value)
188
+ when :string
189
+ when :array
190
+ else
191
+ raise NotImplementedError, "Shader support for #{value.class.inspect} not implemented."
192
+ end
193
+
194
+ Window.handle_gl_error
195
+ end
196
+ end
197
+ end
@@ -2,8 +2,8 @@ module CyberarmEngine
2
2
  class Text
3
3
  CACHE = {}
4
4
 
5
- attr_accessor :x, :y, :z, :size, :factor_x, :factor_y, :color, :shadow, :shadow_size, :options
6
- attr_reader :text, :textobject
5
+ attr_accessor :x, :y, :z, :size, :options
6
+ attr_reader :text, :textobject, :factor_x, :factor_y, :color, :shadow, :shadow_size, :shadow_alpha, :shadow_color
7
7
 
8
8
  def initialize(text, options={})
9
9
  @text = text.to_s || ""
@@ -22,6 +22,8 @@ module CyberarmEngine
22
22
  @shadow = true if options[:shadow] == nil
23
23
  @shadow_size = options[:shadow_size] ? options[:shadow_size] : 1
24
24
  @shadow_alpha= options[:shadow_alpha] ? options[:shadow_alpha] : 30
25
+ @shadow_alpha= options[:shadow_alpha] ? options[:shadow_alpha] : 30
26
+ @shadow_color= options[:shadow_color]
25
27
  @textobject = check_cache(@size, @font)
26
28
 
27
29
  if @alignment
@@ -67,6 +69,35 @@ module CyberarmEngine
67
69
  @text = string
68
70
  end
69
71
 
72
+ def factor_x=(n)
73
+ @rendered_shadow = nil
74
+ @factor_x = n
75
+ end
76
+ def factor_y=(n)
77
+ @rendered_shadow = nil
78
+ @factor_y = n
79
+ end
80
+ def color=(color)
81
+ @rendered_shadow = nil
82
+ @color = color
83
+ end
84
+ def shadow=(boolean)
85
+ @rendered_shadow = nil
86
+ @shadow = boolean
87
+ end
88
+ def shadow_size=(n)
89
+ @rendered_shadow = nil
90
+ @shadow_size = n
91
+ end
92
+ def shadow_alpha=(n)
93
+ @rendered_shadow = nil
94
+ @shadow_alpha = n
95
+ end
96
+ def shadow_color=(n)
97
+ @rendered_shadow = nil
98
+ @shadow_color = n
99
+ end
100
+
70
101
  def width
71
102
  textobject.text_width(@text)
72
103
  end
@@ -77,9 +108,8 @@ module CyberarmEngine
77
108
 
78
109
  def draw
79
110
  if @shadow && !ARGV.join.include?("--no-shadow")
80
- @shadow_alpha = 30 if @color.alpha > 30
81
- @shadow_alpha = @color.alpha if @color.alpha <= 30
82
- shadow_color = Gosu::Color.rgba(@color.red, @color.green, @color.blue, @shadow_alpha)
111
+ shadow_alpha = @color.alpha <= 30 ? @color.alpha : @shadow_alpha
112
+ shadow_color = @shadow_color ? @shadow_color : Gosu::Color.rgba(@color.red, @color.green, @color.blue, shadow_alpha)
83
113
 
84
114
  _x = @shadow_size
85
115
  _y = @shadow_size
@@ -162,7 +162,7 @@ module CyberarmEngine
162
162
 
163
163
  def width
164
164
  if visible?
165
- (@style.border_thickness_left + @style.padding_left) + @width + (@style.padding_right + @style.border_thickness_right)
165
+ inner_width + @width
166
166
  else
167
167
  0
168
168
  end
@@ -172,9 +172,13 @@ module CyberarmEngine
172
172
  @style.margin_left + width + @style.margin_right
173
173
  end
174
174
 
175
+ def inner_width
176
+ (@style.border_thickness_left + @style.padding_left) + (@style.padding_right + @style.border_thickness_right)
177
+ end
178
+
175
179
  def height
176
180
  if visible?
177
- (@style.border_thickness_top + @style.padding_top) + @height + (@style.padding_bottom + @style.border_thickness_bottom)
181
+ inner_height + @height
178
182
  else
179
183
  0
180
184
  end
@@ -184,6 +188,10 @@ module CyberarmEngine
184
188
  @style.margin_top + height + @style.margin_bottom
185
189
  end
186
190
 
191
+ def inner_height
192
+ (@style.border_thickness_top + @style.padding_top) + (@style.padding_bottom + @style.border_thickness_bottom)
193
+ end
194
+
187
195
  private def dimensional_size(size, dimension)
188
196
  raise "dimension must be either :width or :height" unless dimension == :width || dimension == :height
189
197
  if size && size.is_a?(Numeric)
@@ -43,6 +43,9 @@ module CyberarmEngine
43
43
  def left_mouse_button(sender, x, y)
44
44
  super
45
45
  window.text_input = @text_input
46
+
47
+ @caret_last_interval = Gosu.milliseconds
48
+ @show_caret = true
46
49
  end
47
50
 
48
51
  def enter(sender)
@@ -1,4 +1,4 @@
1
1
  module CyberarmEngine
2
2
  NAME = "InDev"
3
- VERSION = "0.9.0"
3
+ VERSION = "0.10.0"
4
4
  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.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyberarm
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-27 00:00:00.000000000 Z
11
+ date: 2019-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gosu
@@ -89,6 +89,8 @@ files:
89
89
  - lib/cyberarm_engine/game_object.rb
90
90
  - lib/cyberarm_engine/game_state.rb
91
91
  - lib/cyberarm_engine/lib/bounding_box.rb
92
+ - lib/cyberarm_engine/lib/ray.rb
93
+ - lib/cyberarm_engine/lib/shader.rb
92
94
  - lib/cyberarm_engine/lib/vector.rb
93
95
  - lib/cyberarm_engine/objects/text.rb
94
96
  - lib/cyberarm_engine/objects/timer.rb
@@ -130,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
132
  - !ruby/object:Gem::Version
131
133
  version: '0'
132
134
  requirements: []
133
- rubygems_version: 3.0.3
135
+ rubygems_version: 3.0.4
134
136
  signing_key:
135
137
  specification_version: 4
136
138
  summary: Make games quickly and easily with gosu