cyberarm_engine 0.12.0 → 0.15.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 +24 -4
- 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 +68 -50
- data/lib/cyberarm_engine/ui/element.rb +57 -18
- data/lib/cyberarm_engine/ui/elements/button.rb +86 -16
- data/lib/cyberarm_engine/ui/elements/check_box.rb +24 -32
- 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 +12 -9
- data/lib/cyberarm_engine/ui/elements/label.rb +96 -15
- data/lib/cyberarm_engine/ui/elements/list_box.rb +68 -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/toggle_button.rb +40 -31
- data/lib/cyberarm_engine/ui/event.rb +8 -7
- data/lib/cyberarm_engine/ui/gui_state.rb +89 -6
- data/lib/cyberarm_engine/ui/style.rb +10 -9
- data/lib/cyberarm_engine/ui/theme.rb +39 -21
- data/lib/cyberarm_engine/vector.rb +132 -38
- data/lib/cyberarm_engine/version.rb +2 -2
- data/lib/cyberarm_engine/{engine.rb → window.rb} +30 -19
- metadata +87 -16
- data/lib/cyberarm_engine/shader.rb +0 -205
@@ -1,10 +1,11 @@
|
|
1
1
|
module CyberarmEngine
|
2
|
-
class
|
2
|
+
class Window < Gosu::Window
|
3
3
|
IMAGES = {}
|
4
|
-
SAMPLES= {}
|
5
|
-
SONGS
|
4
|
+
SAMPLES = {}
|
5
|
+
SONGS = {}
|
6
6
|
|
7
7
|
attr_accessor :show_cursor
|
8
|
+
attr_writer :exit_on_opengl_error
|
8
9
|
attr_reader :last_frame_time
|
9
10
|
|
10
11
|
def self.now
|
@@ -12,19 +13,20 @@ module CyberarmEngine
|
|
12
13
|
end
|
13
14
|
|
14
15
|
def self.dt
|
15
|
-
$window.last_frame_time/1000.0
|
16
|
+
$window.last_frame_time / 1000.0
|
16
17
|
end
|
17
18
|
|
18
|
-
def initialize(width: 800, height: 600, fullscreen: false, update_interval: 1000.0/60, resizable: false)
|
19
|
+
def initialize(width: 800, height: 600, fullscreen: false, update_interval: 1000.0 / 60, resizable: false, borderless: false)
|
19
20
|
@show_cursor = false
|
20
21
|
|
21
|
-
super(width, height, fullscreen: fullscreen, update_interval: update_interval, resizable: resizable)
|
22
|
+
super(width, height, fullscreen: fullscreen, update_interval: update_interval, resizable: resizable, borderless: borderless)
|
22
23
|
$window = self
|
23
|
-
@last_frame_time = Gosu.milliseconds-1
|
24
|
+
@last_frame_time = Gosu.milliseconds - 1
|
24
25
|
@current_frame_time = Gosu.milliseconds
|
25
26
|
self.caption = "CyberarmEngine #{CyberarmEngine::VERSION} #{Gosu.language}"
|
26
27
|
|
27
28
|
@states = []
|
29
|
+
@exit_on_opengl_error = false
|
28
30
|
|
29
31
|
setup if defined?(setup)
|
30
32
|
end
|
@@ -34,8 +36,10 @@ module CyberarmEngine
|
|
34
36
|
end
|
35
37
|
|
36
38
|
def update
|
39
|
+
Stats.clear
|
40
|
+
|
37
41
|
current_state.update if current_state
|
38
|
-
@last_frame_time = Gosu.milliseconds
|
42
|
+
@last_frame_time = Gosu.milliseconds - @current_frame_time
|
39
43
|
@current_frame_time = Gosu.milliseconds
|
40
44
|
end
|
41
45
|
|
@@ -44,7 +48,15 @@ module CyberarmEngine
|
|
44
48
|
end
|
45
49
|
|
46
50
|
def dt
|
47
|
-
@last_frame_time/1000.0
|
51
|
+
@last_frame_time / 1000.0
|
52
|
+
end
|
53
|
+
|
54
|
+
def aspect_ratio
|
55
|
+
width / height.to_f
|
56
|
+
end
|
57
|
+
|
58
|
+
def exit_on_opengl_error?
|
59
|
+
@exit_on_opengl_error
|
48
60
|
end
|
49
61
|
|
50
62
|
def button_down(id)
|
@@ -57,8 +69,8 @@ module CyberarmEngine
|
|
57
69
|
current_state.button_up(id) if current_state
|
58
70
|
end
|
59
71
|
|
60
|
-
def push_state(klass, options={})
|
61
|
-
options = {setup: true}.merge(options)
|
72
|
+
def push_state(klass, options = {})
|
73
|
+
options = { setup: true }.merge(options)
|
62
74
|
|
63
75
|
if klass.instance_of?(klass.class) && defined?(klass.options)
|
64
76
|
@states << klass
|
@@ -66,12 +78,12 @@ module CyberarmEngine
|
|
66
78
|
else
|
67
79
|
@states << klass.new(options) if child_of?(klass, GameState)
|
68
80
|
@states << klass.new if child_of?(klass, Element::Container)
|
69
|
-
current_state.setup if current_state.
|
81
|
+
current_state.setup if current_state.instance_of?(klass) && options[:setup]
|
70
82
|
end
|
71
83
|
end
|
72
84
|
|
73
85
|
private def child_of?(input, klass)
|
74
|
-
input.ancestors.detect {|c| c == klass}
|
86
|
+
input.ancestors.detect { |c| c == klass }
|
75
87
|
end
|
76
88
|
|
77
89
|
def current_state
|
@@ -79,10 +91,8 @@ module CyberarmEngine
|
|
79
91
|
end
|
80
92
|
|
81
93
|
def previous_state
|
82
|
-
if @states.size > 1 && state = @states[@states.size-2]
|
83
|
-
|
84
|
-
else
|
85
|
-
return nil
|
94
|
+
if @states.size > 1 && state = @states[@states.size - 2]
|
95
|
+
state
|
86
96
|
end
|
87
97
|
end
|
88
98
|
|
@@ -91,10 +101,11 @@ module CyberarmEngine
|
|
91
101
|
end
|
92
102
|
|
93
103
|
# Sourced from https://gist.github.com/ippa/662583
|
94
|
-
def draw_circle(cx,cy,r, z = 9999,color = Gosu::Color::GREEN, step = 10)
|
104
|
+
def draw_circle(cx, cy, r, z = 9999, color = Gosu::Color::GREEN, step = 10)
|
95
105
|
0.step(360, step) do |a1|
|
96
106
|
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),
|
107
|
+
draw_line(cx + Gosu.offset_x(a1, r), cy + Gosu.offset_y(a1, r), color, cx + Gosu.offset_x(a2, r),
|
108
|
+
cy + Gosu.offset_y(a2, r), color, z)
|
98
109
|
end
|
99
110
|
end
|
100
111
|
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.15.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: 2020-12-31 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,23 +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
|
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
|
92
157
|
- lib/cyberarm_engine/ray.rb
|
93
|
-
- lib/cyberarm_engine/
|
158
|
+
- lib/cyberarm_engine/stats.rb
|
94
159
|
- lib/cyberarm_engine/text.rb
|
95
160
|
- lib/cyberarm_engine/timer.rb
|
96
161
|
- lib/cyberarm_engine/transform.rb
|
@@ -100,11 +165,15 @@ files:
|
|
100
165
|
- lib/cyberarm_engine/ui/elements/button.rb
|
101
166
|
- lib/cyberarm_engine/ui/elements/check_box.rb
|
102
167
|
- lib/cyberarm_engine/ui/elements/container.rb
|
168
|
+
- lib/cyberarm_engine/ui/elements/edit_box.rb
|
103
169
|
- lib/cyberarm_engine/ui/elements/edit_line.rb
|
104
170
|
- lib/cyberarm_engine/ui/elements/flow.rb
|
105
171
|
- lib/cyberarm_engine/ui/elements/image.rb
|
106
172
|
- lib/cyberarm_engine/ui/elements/label.rb
|
173
|
+
- lib/cyberarm_engine/ui/elements/list_box.rb
|
107
174
|
- lib/cyberarm_engine/ui/elements/progress.rb
|
175
|
+
- lib/cyberarm_engine/ui/elements/radio.rb
|
176
|
+
- lib/cyberarm_engine/ui/elements/slider.rb
|
108
177
|
- lib/cyberarm_engine/ui/elements/stack.rb
|
109
178
|
- lib/cyberarm_engine/ui/elements/toggle_button.rb
|
110
179
|
- lib/cyberarm_engine/ui/event.rb
|
@@ -113,15 +182,17 @@ files:
|
|
113
182
|
- lib/cyberarm_engine/ui/theme.rb
|
114
183
|
- lib/cyberarm_engine/vector.rb
|
115
184
|
- lib/cyberarm_engine/version.rb
|
185
|
+
- lib/cyberarm_engine/window.rb
|
116
186
|
homepage: https://github.com/cyberarm/cyberarm_engine
|
117
187
|
licenses:
|
118
188
|
- MIT
|
119
189
|
metadata:
|
120
190
|
allowed_push_host: https://rubygems.org
|
121
|
-
post_install_message:
|
191
|
+
post_install_message:
|
122
192
|
rdoc_options: []
|
123
193
|
require_paths:
|
124
194
|
- lib
|
195
|
+
- assets
|
125
196
|
required_ruby_version: !ruby/object:Gem::Requirement
|
126
197
|
requirements:
|
127
198
|
- - ">="
|
@@ -133,8 +204,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
204
|
- !ruby/object:Gem::Version
|
134
205
|
version: '0'
|
135
206
|
requirements: []
|
136
|
-
rubygems_version: 3.
|
137
|
-
signing_key:
|
207
|
+
rubygems_version: 3.2.3
|
208
|
+
signing_key:
|
138
209
|
specification_version: 4
|
139
210
|
summary: Make games quickly and easily with gosu
|
140
211
|
test_files: []
|
@@ -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
|