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 +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
|