cyberarm_engine 0.9.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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