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 +4 -4
- data/lib/cyberarm_engine.rb +2 -0
- data/lib/cyberarm_engine/lib/ray.rb +55 -0
- data/lib/cyberarm_engine/lib/shader.rb +197 -0
- data/lib/cyberarm_engine/objects/text.rb +35 -5
- data/lib/cyberarm_engine/ui/element.rb +10 -2
- data/lib/cyberarm_engine/ui/elements/edit_line.rb +3 -0
- data/lib/cyberarm_engine/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47bffc9332cd383b41477f88733dd1f228b8f4b8b37a44e847c617db030aefd8
|
4
|
+
data.tar.gz: eb4534834cf3271c7bc0d12a8eccc8d8b79a0d1280c47e95d821639c1eebad35
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 63f0ca02246ebd4891dd9da5ba6e5fd844b6a21599223dd19993691c9c2964f07235ff2a643c4b292e6bea3ab7a359e3460ae438ca13a130d628b2c937826d3f
|
7
|
+
data.tar.gz: 87188e527112f553c3dd7a42fb1a39a447799018e62a91431dc539ea1fdb1319b65156582cef376ba481532f1a801b01d5e7e4b58c0988ad69bd67c0ff077000
|
data/lib/cyberarm_engine.rb
CHANGED
@@ -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, :
|
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
|
-
|
81
|
-
|
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
|
-
|
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
|
-
|
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)
|
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.
|
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-
|
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.
|
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
|