cyberarm_engine 0.12.1 → 0.16.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/.rubocop.yml +8 -0
- data/Gemfile +1 -1
- data/README.md +33 -3
- data/Rakefile +1 -1
- data/assets/textures/default.png +0 -0
- data/cyberarm_engine.gemspec +11 -8
- data/lib/cyberarm_engine.rb +25 -7
- data/lib/cyberarm_engine/animator.rb +56 -0
- data/lib/cyberarm_engine/background.rb +19 -15
- data/lib/cyberarm_engine/background_nine_slice.rb +125 -0
- data/lib/cyberarm_engine/bounding_box.rb +18 -18
- data/lib/cyberarm_engine/cache.rb +4 -0
- data/lib/cyberarm_engine/cache/download_manager.rb +121 -0
- data/lib/cyberarm_engine/common.rb +16 -16
- data/lib/cyberarm_engine/config_file.rb +46 -0
- data/lib/cyberarm_engine/game_object.rb +63 -72
- data/lib/cyberarm_engine/game_state.rb +7 -4
- data/lib/cyberarm_engine/model.rb +207 -0
- data/lib/cyberarm_engine/model/material.rb +21 -0
- data/lib/cyberarm_engine/model/model_object.rb +131 -0
- data/lib/cyberarm_engine/model/parser.rb +74 -0
- data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -0
- data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -0
- data/lib/cyberarm_engine/model_cache.rb +31 -0
- data/lib/cyberarm_engine/opengl.rb +28 -0
- data/lib/cyberarm_engine/opengl/light.rb +50 -0
- data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -0
- data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -0
- data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -0
- data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -0
- data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +289 -0
- data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -0
- data/lib/cyberarm_engine/opengl/shader.rb +406 -0
- data/lib/cyberarm_engine/opengl/texture.rb +69 -0
- data/lib/cyberarm_engine/ray.rb +5 -5
- data/lib/cyberarm_engine/stats.rb +21 -0
- data/lib/cyberarm_engine/text.rb +45 -31
- data/lib/cyberarm_engine/timer.rb +1 -1
- data/lib/cyberarm_engine/transform.rb +221 -9
- data/lib/cyberarm_engine/ui/border_canvas.rb +4 -3
- data/lib/cyberarm_engine/ui/dsl.rb +86 -50
- data/lib/cyberarm_engine/ui/element.rb +60 -21
- data/lib/cyberarm_engine/ui/elements/button.rb +121 -28
- data/lib/cyberarm_engine/ui/elements/check_box.rb +25 -33
- data/lib/cyberarm_engine/ui/elements/container.rb +88 -24
- data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -0
- data/lib/cyberarm_engine/ui/elements/edit_line.rb +180 -27
- data/lib/cyberarm_engine/ui/elements/flow.rb +1 -3
- data/lib/cyberarm_engine/ui/elements/image.rb +32 -12
- data/lib/cyberarm_engine/ui/elements/label.rb +122 -16
- data/lib/cyberarm_engine/ui/elements/list_box.rb +82 -0
- data/lib/cyberarm_engine/ui/elements/progress.rb +6 -5
- data/lib/cyberarm_engine/ui/elements/radio.rb +6 -0
- data/lib/cyberarm_engine/ui/elements/slider.rb +104 -0
- data/lib/cyberarm_engine/ui/elements/stack.rb +1 -3
- data/lib/cyberarm_engine/ui/elements/text_block.rb +156 -0
- data/lib/cyberarm_engine/ui/elements/toggle_button.rb +40 -31
- data/lib/cyberarm_engine/ui/event.rb +8 -7
- data/lib/cyberarm_engine/ui/gui_state.rb +94 -6
- data/lib/cyberarm_engine/ui/style.rb +10 -9
- data/lib/cyberarm_engine/ui/theme.rb +85 -22
- data/lib/cyberarm_engine/vector.rb +132 -38
- data/lib/cyberarm_engine/version.rb +2 -2
- data/lib/cyberarm_engine/{engine.rb → window.rb} +32 -19
- metadata +88 -17
- data/lib/cyberarm_engine/gosu_ext/circle.rb +0 -9
- data/lib/cyberarm_engine/shader.rb +0 -205
@@ -1,10 +1,13 @@
|
|
1
1
|
module CyberarmEngine
|
2
|
-
class
|
2
|
+
class Window < Gosu::Window
|
3
|
+
include Common
|
4
|
+
|
3
5
|
IMAGES = {}
|
4
|
-
SAMPLES= {}
|
5
|
-
SONGS
|
6
|
+
SAMPLES = {}
|
7
|
+
SONGS = {}
|
6
8
|
|
7
9
|
attr_accessor :show_cursor
|
10
|
+
attr_writer :exit_on_opengl_error
|
8
11
|
attr_reader :last_frame_time
|
9
12
|
|
10
13
|
def self.now
|
@@ -12,19 +15,20 @@ module CyberarmEngine
|
|
12
15
|
end
|
13
16
|
|
14
17
|
def self.dt
|
15
|
-
$window.last_frame_time/1000.0
|
18
|
+
$window.last_frame_time / 1000.0
|
16
19
|
end
|
17
20
|
|
18
|
-
def initialize(width: 800, height: 600, fullscreen: false, update_interval: 1000.0/60, resizable: false)
|
21
|
+
def initialize(width: 800, height: 600, fullscreen: false, update_interval: 1000.0 / 60, resizable: false, borderless: false)
|
19
22
|
@show_cursor = false
|
20
23
|
|
21
|
-
super(width, height, fullscreen: fullscreen, update_interval: update_interval, resizable: resizable)
|
24
|
+
super(width, height, fullscreen: fullscreen, update_interval: update_interval, resizable: resizable, borderless: borderless)
|
22
25
|
$window = self
|
23
|
-
@last_frame_time = Gosu.milliseconds-1
|
26
|
+
@last_frame_time = Gosu.milliseconds - 1
|
24
27
|
@current_frame_time = Gosu.milliseconds
|
25
28
|
self.caption = "CyberarmEngine #{CyberarmEngine::VERSION} #{Gosu.language}"
|
26
29
|
|
27
30
|
@states = []
|
31
|
+
@exit_on_opengl_error = false
|
28
32
|
|
29
33
|
setup if defined?(setup)
|
30
34
|
end
|
@@ -34,8 +38,10 @@ module CyberarmEngine
|
|
34
38
|
end
|
35
39
|
|
36
40
|
def update
|
41
|
+
Stats.clear
|
42
|
+
|
37
43
|
current_state.update if current_state
|
38
|
-
@last_frame_time = Gosu.milliseconds
|
44
|
+
@last_frame_time = Gosu.milliseconds - @current_frame_time
|
39
45
|
@current_frame_time = Gosu.milliseconds
|
40
46
|
end
|
41
47
|
|
@@ -44,7 +50,15 @@ module CyberarmEngine
|
|
44
50
|
end
|
45
51
|
|
46
52
|
def dt
|
47
|
-
@last_frame_time/1000.0
|
53
|
+
@last_frame_time / 1000.0
|
54
|
+
end
|
55
|
+
|
56
|
+
def aspect_ratio
|
57
|
+
width / height.to_f
|
58
|
+
end
|
59
|
+
|
60
|
+
def exit_on_opengl_error?
|
61
|
+
@exit_on_opengl_error
|
48
62
|
end
|
49
63
|
|
50
64
|
def button_down(id)
|
@@ -57,8 +71,8 @@ module CyberarmEngine
|
|
57
71
|
current_state.button_up(id) if current_state
|
58
72
|
end
|
59
73
|
|
60
|
-
def push_state(klass, options={})
|
61
|
-
options = {setup: true}.merge(options)
|
74
|
+
def push_state(klass, options = {})
|
75
|
+
options = { setup: true }.merge(options)
|
62
76
|
|
63
77
|
if klass.instance_of?(klass.class) && defined?(klass.options)
|
64
78
|
@states << klass
|
@@ -66,12 +80,12 @@ module CyberarmEngine
|
|
66
80
|
else
|
67
81
|
@states << klass.new(options) if child_of?(klass, GameState)
|
68
82
|
@states << klass.new if child_of?(klass, Element::Container)
|
69
|
-
current_state.setup if current_state.
|
83
|
+
current_state.setup if current_state.instance_of?(klass) && options[:setup]
|
70
84
|
end
|
71
85
|
end
|
72
86
|
|
73
87
|
private def child_of?(input, klass)
|
74
|
-
input.ancestors.detect {|c| c == klass}
|
88
|
+
input.ancestors.detect { |c| c == klass }
|
75
89
|
end
|
76
90
|
|
77
91
|
def current_state
|
@@ -79,10 +93,8 @@ module CyberarmEngine
|
|
79
93
|
end
|
80
94
|
|
81
95
|
def previous_state
|
82
|
-
if @states.size > 1 && state = @states[@states.size-2]
|
83
|
-
|
84
|
-
else
|
85
|
-
return nil
|
96
|
+
if @states.size > 1 && state = @states[@states.size - 2]
|
97
|
+
state
|
86
98
|
end
|
87
99
|
end
|
88
100
|
|
@@ -91,10 +103,11 @@ module CyberarmEngine
|
|
91
103
|
end
|
92
104
|
|
93
105
|
# Sourced from https://gist.github.com/ippa/662583
|
94
|
-
def draw_circle(cx,cy,r, z = 9999,color = Gosu::Color::GREEN, step = 10)
|
106
|
+
def draw_circle(cx, cy, r, z = 9999, color = Gosu::Color::GREEN, step = 10)
|
95
107
|
0.step(360, step) do |a1|
|
96
108
|
a2 = a1 + step
|
97
|
-
draw_line(cx + Gosu.offset_x(a1, r), cy + Gosu.offset_y(a1, r), color, cx + Gosu.offset_x(a2, r),
|
109
|
+
draw_line(cx + Gosu.offset_x(a1, r), cy + Gosu.offset_y(a1, r), color, cx + Gosu.offset_x(a2, r),
|
110
|
+
cy + Gosu.offset_y(a2, r), color, z)
|
98
111
|
end
|
99
112
|
end
|
100
113
|
end
|
metadata
CHANGED
@@ -1,29 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cyberarm_engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cyberarm
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: clipboard
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.3.5
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.3.5
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: excon
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.78.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.78.0
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: gosu
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
16
44
|
requirements:
|
17
45
|
- - "~>"
|
18
46
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
47
|
+
version: 1.0.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: gosu_more_drawables
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.3'
|
20
62
|
type: :runtime
|
21
63
|
prerelease: false
|
22
64
|
version_requirements: !ruby/object:Gem::Requirement
|
23
65
|
requirements:
|
24
66
|
- - "~>"
|
25
67
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
68
|
+
version: '0.3'
|
27
69
|
- !ruby/object:Gem::Dependency
|
28
70
|
name: bundler
|
29
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -39,33 +81,33 @@ dependencies:
|
|
39
81
|
- !ruby/object:Gem::Version
|
40
82
|
version: '1.16'
|
41
83
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
84
|
+
name: minitest
|
43
85
|
requirement: !ruby/object:Gem::Requirement
|
44
86
|
requirements:
|
45
87
|
- - "~>"
|
46
88
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
89
|
+
version: '5.0'
|
48
90
|
type: :development
|
49
91
|
prerelease: false
|
50
92
|
version_requirements: !ruby/object:Gem::Requirement
|
51
93
|
requirements:
|
52
94
|
- - "~>"
|
53
95
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
96
|
+
version: '5.0'
|
55
97
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
98
|
+
name: rake
|
57
99
|
requirement: !ruby/object:Gem::Requirement
|
58
100
|
requirements:
|
59
101
|
- - "~>"
|
60
102
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
103
|
+
version: '13.0'
|
62
104
|
type: :development
|
63
105
|
prerelease: false
|
64
106
|
version_requirements: !ruby/object:Gem::Requirement
|
65
107
|
requirements:
|
66
108
|
- - "~>"
|
67
109
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
110
|
+
version: '13.0'
|
69
111
|
description: Yet another game making framework around gosu
|
70
112
|
email:
|
71
113
|
- matthewlikesrobots@gmail.com
|
@@ -74,24 +116,46 @@ extensions: []
|
|
74
116
|
extra_rdoc_files: []
|
75
117
|
files:
|
76
118
|
- ".gitignore"
|
119
|
+
- ".rubocop.yml"
|
77
120
|
- ".travis.yml"
|
78
121
|
- Gemfile
|
79
122
|
- LICENSE.txt
|
80
123
|
- README.md
|
81
124
|
- Rakefile
|
125
|
+
- assets/textures/default.png
|
82
126
|
- bin/console
|
83
127
|
- bin/setup
|
84
128
|
- cyberarm_engine.gemspec
|
85
129
|
- lib/cyberarm_engine.rb
|
130
|
+
- lib/cyberarm_engine/animator.rb
|
86
131
|
- lib/cyberarm_engine/background.rb
|
132
|
+
- lib/cyberarm_engine/background_nine_slice.rb
|
87
133
|
- lib/cyberarm_engine/bounding_box.rb
|
134
|
+
- lib/cyberarm_engine/cache.rb
|
135
|
+
- lib/cyberarm_engine/cache/download_manager.rb
|
88
136
|
- lib/cyberarm_engine/common.rb
|
89
|
-
- lib/cyberarm_engine/
|
137
|
+
- lib/cyberarm_engine/config_file.rb
|
90
138
|
- lib/cyberarm_engine/game_object.rb
|
91
139
|
- lib/cyberarm_engine/game_state.rb
|
92
|
-
- lib/cyberarm_engine/
|
140
|
+
- lib/cyberarm_engine/model.rb
|
141
|
+
- lib/cyberarm_engine/model/material.rb
|
142
|
+
- lib/cyberarm_engine/model/model_object.rb
|
143
|
+
- lib/cyberarm_engine/model/parser.rb
|
144
|
+
- lib/cyberarm_engine/model/parsers/collada_parser.rb
|
145
|
+
- lib/cyberarm_engine/model/parsers/wavefront_parser.rb
|
146
|
+
- lib/cyberarm_engine/model_cache.rb
|
147
|
+
- lib/cyberarm_engine/opengl.rb
|
148
|
+
- lib/cyberarm_engine/opengl/light.rb
|
149
|
+
- lib/cyberarm_engine/opengl/orthographic_camera.rb
|
150
|
+
- lib/cyberarm_engine/opengl/perspective_camera.rb
|
151
|
+
- lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb
|
152
|
+
- lib/cyberarm_engine/opengl/renderer/g_buffer.rb
|
153
|
+
- lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb
|
154
|
+
- lib/cyberarm_engine/opengl/renderer/renderer.rb
|
155
|
+
- lib/cyberarm_engine/opengl/shader.rb
|
156
|
+
- lib/cyberarm_engine/opengl/texture.rb
|
93
157
|
- lib/cyberarm_engine/ray.rb
|
94
|
-
- lib/cyberarm_engine/
|
158
|
+
- lib/cyberarm_engine/stats.rb
|
95
159
|
- lib/cyberarm_engine/text.rb
|
96
160
|
- lib/cyberarm_engine/timer.rb
|
97
161
|
- lib/cyberarm_engine/transform.rb
|
@@ -101,12 +165,17 @@ files:
|
|
101
165
|
- lib/cyberarm_engine/ui/elements/button.rb
|
102
166
|
- lib/cyberarm_engine/ui/elements/check_box.rb
|
103
167
|
- lib/cyberarm_engine/ui/elements/container.rb
|
168
|
+
- lib/cyberarm_engine/ui/elements/edit_box.rb
|
104
169
|
- lib/cyberarm_engine/ui/elements/edit_line.rb
|
105
170
|
- lib/cyberarm_engine/ui/elements/flow.rb
|
106
171
|
- lib/cyberarm_engine/ui/elements/image.rb
|
107
172
|
- lib/cyberarm_engine/ui/elements/label.rb
|
173
|
+
- lib/cyberarm_engine/ui/elements/list_box.rb
|
108
174
|
- lib/cyberarm_engine/ui/elements/progress.rb
|
175
|
+
- lib/cyberarm_engine/ui/elements/radio.rb
|
176
|
+
- lib/cyberarm_engine/ui/elements/slider.rb
|
109
177
|
- lib/cyberarm_engine/ui/elements/stack.rb
|
178
|
+
- lib/cyberarm_engine/ui/elements/text_block.rb
|
110
179
|
- lib/cyberarm_engine/ui/elements/toggle_button.rb
|
111
180
|
- lib/cyberarm_engine/ui/event.rb
|
112
181
|
- lib/cyberarm_engine/ui/gui_state.rb
|
@@ -114,15 +183,17 @@ files:
|
|
114
183
|
- lib/cyberarm_engine/ui/theme.rb
|
115
184
|
- lib/cyberarm_engine/vector.rb
|
116
185
|
- lib/cyberarm_engine/version.rb
|
186
|
+
- lib/cyberarm_engine/window.rb
|
117
187
|
homepage: https://github.com/cyberarm/cyberarm_engine
|
118
188
|
licenses:
|
119
189
|
- MIT
|
120
190
|
metadata:
|
121
191
|
allowed_push_host: https://rubygems.org
|
122
|
-
post_install_message:
|
192
|
+
post_install_message:
|
123
193
|
rdoc_options: []
|
124
194
|
require_paths:
|
125
195
|
- lib
|
196
|
+
- assets
|
126
197
|
required_ruby_version: !ruby/object:Gem::Requirement
|
127
198
|
requirements:
|
128
199
|
- - ">="
|
@@ -134,8 +205,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
134
205
|
- !ruby/object:Gem::Version
|
135
206
|
version: '0'
|
136
207
|
requirements: []
|
137
|
-
rubygems_version: 3.
|
138
|
-
signing_key:
|
208
|
+
rubygems_version: 3.2.3
|
209
|
+
signing_key:
|
139
210
|
specification_version: 4
|
140
211
|
summary: Make games quickly and easily with gosu
|
141
212
|
test_files: []
|
@@ -1,9 +0,0 @@
|
|
1
|
-
module Gosu
|
2
|
-
# Sourced from https://gist.github.com/ippa/662583
|
3
|
-
def self.draw_circle(cx,cy,r, z = 9999,color = Gosu::Color::GREEN, step = 10)
|
4
|
-
0.step(360, step) do |a1|
|
5
|
-
a2 = a1 + step
|
6
|
-
draw_line(cx + Gosu.offset_x(a1, r), cy + Gosu.offset_y(a1, r), color, cx + Gosu.offset_x(a2, r), cy + Gosu.offset_y(a2, r), color, z)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
@@ -1,205 +0,0 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
# Ref: https://github.com/vaiorabbit/ruby-opengl/blob/master/sample/OrangeBook/brick.rb
|
3
|
-
class Shader
|
4
|
-
include OpenGL
|
5
|
-
@@shaders = {}
|
6
|
-
|
7
|
-
def self.add(name, instance)
|
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.available?(name)
|
21
|
-
@@shaders.dig(name).is_a?(Shader)
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.get(name)
|
25
|
-
@@shaders.dig(name)
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.active_shader
|
29
|
-
@active_shader
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.active_shader=(instance)
|
33
|
-
@active_shader = instance
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.stop
|
37
|
-
shader = Shader.active_shader
|
38
|
-
|
39
|
-
if shader
|
40
|
-
shader.stop
|
41
|
-
else
|
42
|
-
raise ArgumentError, "No active shader to stop!"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.attribute_location(variable)
|
47
|
-
raise RuntimeError, "No active shader!" unless Shader.active_shader
|
48
|
-
Shader.active_shader.attribute_location(variable)
|
49
|
-
end
|
50
|
-
|
51
|
-
def self.set_uniform(variable, value)
|
52
|
-
raise RuntimeError, "No active shader!" unless Shader.active_shader
|
53
|
-
Shader.active_shader.set_uniform(variable, value)
|
54
|
-
end
|
55
|
-
|
56
|
-
attr_reader :name, :program
|
57
|
-
def initialize(name:, vertex: "shaders/default.vert", fragment:)
|
58
|
-
@name = name
|
59
|
-
@vertex_file = vertex
|
60
|
-
@fragment_file = fragment
|
61
|
-
@compiled = false
|
62
|
-
|
63
|
-
@program = nil
|
64
|
-
|
65
|
-
@error_buffer_size = 1024
|
66
|
-
@variable_missing = {}
|
67
|
-
|
68
|
-
raise ArgumentError, "Shader files not found: #{@vertex_file} or #{@fragment_file}" unless shader_files_exist?
|
69
|
-
|
70
|
-
create_shaders
|
71
|
-
compile_shaders
|
72
|
-
|
73
|
-
# Only add shader if it successfully compiles
|
74
|
-
if @compiled
|
75
|
-
Shader.add(@name, self)
|
76
|
-
else
|
77
|
-
puts "FAILED to compile shader: #{@name}", ""
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def shader_files_exist?
|
82
|
-
File.exist?(@vertex_file) && File.exist?(@fragment_file)
|
83
|
-
end
|
84
|
-
|
85
|
-
def create_shaders
|
86
|
-
@vertex = glCreateShader(GL_VERTEX_SHADER)
|
87
|
-
@fragment = glCreateShader(GL_FRAGMENT_SHADER)
|
88
|
-
|
89
|
-
source = [File.read(@vertex_file)].pack('p')
|
90
|
-
size = [File.size(@vertex_file)].pack('I')
|
91
|
-
glShaderSource(@vertex, 1, source, size)
|
92
|
-
|
93
|
-
source = [File.read(@fragment_file)].pack('p')
|
94
|
-
size = [File.size(@fragment_file)].pack('I')
|
95
|
-
glShaderSource(@fragment, 1, source, size)
|
96
|
-
end
|
97
|
-
|
98
|
-
def compile_shaders
|
99
|
-
return unless shader_files_exist?
|
100
|
-
|
101
|
-
glCompileShader(@vertex)
|
102
|
-
buffer = ' '
|
103
|
-
glGetShaderiv(@vertex, GL_COMPILE_STATUS, buffer)
|
104
|
-
compiled = buffer.unpack('L')[0]
|
105
|
-
|
106
|
-
if compiled == 0
|
107
|
-
log = ' ' * @error_buffer_size
|
108
|
-
glGetShaderInfoLog(@vertex, @error_buffer_size, nil, log)
|
109
|
-
puts "Shader Error: Program \"#{@name}\""
|
110
|
-
puts " Vectex Shader InfoLog:", " #{log.strip.split("\n").join("\n ")}\n\n"
|
111
|
-
puts " Shader Compiled status: #{compiled}"
|
112
|
-
puts " NOTE: assignment of uniforms in shaders is illegal!"
|
113
|
-
puts
|
114
|
-
return
|
115
|
-
end
|
116
|
-
|
117
|
-
glCompileShader(@fragment)
|
118
|
-
buffer = ' '
|
119
|
-
glGetShaderiv(@fragment, GL_COMPILE_STATUS, buffer)
|
120
|
-
compiled = buffer.unpack('L')[0]
|
121
|
-
|
122
|
-
if compiled == 0
|
123
|
-
log = ' ' * @error_buffer_size
|
124
|
-
glGetShaderInfoLog(@fragment, @error_buffer_size, nil, log)
|
125
|
-
puts "Shader Error: Program \"#{@name}\""
|
126
|
-
puts " Fragment Shader InfoLog:", " #{log.strip.split("\n").join("\n ")}\n\n"
|
127
|
-
puts " Shader Compiled status: #{compiled}"
|
128
|
-
puts " NOTE: assignment of uniforms in shader is illegal!"
|
129
|
-
puts
|
130
|
-
return
|
131
|
-
end
|
132
|
-
|
133
|
-
@program = glCreateProgram
|
134
|
-
glAttachShader(@program, @vertex)
|
135
|
-
glAttachShader(@program, @fragment)
|
136
|
-
glLinkProgram(@program)
|
137
|
-
|
138
|
-
buffer = ' '
|
139
|
-
glGetProgramiv(@program, GL_LINK_STATUS, buffer)
|
140
|
-
linked = buffer.unpack('L')[0]
|
141
|
-
|
142
|
-
if linked == 0
|
143
|
-
log = ' ' * @error_buffer_size
|
144
|
-
glGetProgramInfoLog(@program, @error_buffer_size, nil, log)
|
145
|
-
puts "Shader Error: Program \"#{@name}\""
|
146
|
-
puts " Program InfoLog:", " #{log.strip.split("\n").join("\n ")}\n\n"
|
147
|
-
end
|
148
|
-
|
149
|
-
@compiled = linked == 0 ? false : true
|
150
|
-
end
|
151
|
-
|
152
|
-
# Returns the location of a uniform variable
|
153
|
-
def variable(variable)
|
154
|
-
loc = glGetUniformLocation(@program, variable)
|
155
|
-
if (loc == -1)
|
156
|
-
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]
|
157
|
-
@variable_missing[variable] = true
|
158
|
-
end
|
159
|
-
return loc
|
160
|
-
end
|
161
|
-
|
162
|
-
def use(&block)
|
163
|
-
return unless compiled?
|
164
|
-
raise "Another shader is already in use! #{Shader.active_shader.name.inspect}" if Shader.active_shader
|
165
|
-
Shader.active_shader=self
|
166
|
-
|
167
|
-
glUseProgram(@program)
|
168
|
-
|
169
|
-
if block
|
170
|
-
block.call(self)
|
171
|
-
stop
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
def stop
|
176
|
-
Shader.active_shader = nil if Shader.active_shader == self
|
177
|
-
glUseProgram(0)
|
178
|
-
end
|
179
|
-
|
180
|
-
def compiled?
|
181
|
-
@compiled
|
182
|
-
end
|
183
|
-
|
184
|
-
def attribute_location(variable)
|
185
|
-
glGetUniformLocation(@program, variable)
|
186
|
-
end
|
187
|
-
|
188
|
-
def set_uniform(variable, value, location = nil)
|
189
|
-
attr_loc = location ? location : attribute_location(variable)
|
190
|
-
|
191
|
-
case value.class.to_s.downcase.to_sym
|
192
|
-
when :integer
|
193
|
-
glUniform1i(attr_loc, value)
|
194
|
-
when :float
|
195
|
-
glUniform1f(attr_loc, value)
|
196
|
-
when :string
|
197
|
-
when :array
|
198
|
-
else
|
199
|
-
raise NotImplementedError, "Shader support for #{value.class.inspect} not implemented."
|
200
|
-
end
|
201
|
-
|
202
|
-
Window.handle_gl_error
|
203
|
-
end
|
204
|
-
end
|
205
|
-
end
|