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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -0
  3. data/Gemfile +1 -1
  4. data/README.md +33 -3
  5. data/Rakefile +1 -1
  6. data/assets/textures/default.png +0 -0
  7. data/cyberarm_engine.gemspec +11 -8
  8. data/lib/cyberarm_engine.rb +24 -4
  9. data/lib/cyberarm_engine/animator.rb +56 -0
  10. data/lib/cyberarm_engine/background.rb +19 -15
  11. data/lib/cyberarm_engine/background_nine_slice.rb +125 -0
  12. data/lib/cyberarm_engine/bounding_box.rb +18 -18
  13. data/lib/cyberarm_engine/cache.rb +4 -0
  14. data/lib/cyberarm_engine/cache/download_manager.rb +121 -0
  15. data/lib/cyberarm_engine/common.rb +16 -16
  16. data/lib/cyberarm_engine/config_file.rb +46 -0
  17. data/lib/cyberarm_engine/game_object.rb +63 -72
  18. data/lib/cyberarm_engine/game_state.rb +7 -4
  19. data/lib/cyberarm_engine/model.rb +207 -0
  20. data/lib/cyberarm_engine/model/material.rb +21 -0
  21. data/lib/cyberarm_engine/model/model_object.rb +131 -0
  22. data/lib/cyberarm_engine/model/parser.rb +74 -0
  23. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -0
  24. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -0
  25. data/lib/cyberarm_engine/model_cache.rb +31 -0
  26. data/lib/cyberarm_engine/opengl.rb +28 -0
  27. data/lib/cyberarm_engine/opengl/light.rb +50 -0
  28. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -0
  29. data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -0
  30. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -0
  31. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -0
  32. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +289 -0
  33. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -0
  34. data/lib/cyberarm_engine/opengl/shader.rb +406 -0
  35. data/lib/cyberarm_engine/opengl/texture.rb +69 -0
  36. data/lib/cyberarm_engine/ray.rb +5 -5
  37. data/lib/cyberarm_engine/stats.rb +21 -0
  38. data/lib/cyberarm_engine/text.rb +45 -31
  39. data/lib/cyberarm_engine/timer.rb +1 -1
  40. data/lib/cyberarm_engine/transform.rb +221 -9
  41. data/lib/cyberarm_engine/ui/border_canvas.rb +4 -3
  42. data/lib/cyberarm_engine/ui/dsl.rb +68 -50
  43. data/lib/cyberarm_engine/ui/element.rb +57 -18
  44. data/lib/cyberarm_engine/ui/elements/button.rb +86 -16
  45. data/lib/cyberarm_engine/ui/elements/check_box.rb +24 -32
  46. data/lib/cyberarm_engine/ui/elements/container.rb +88 -24
  47. data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -0
  48. data/lib/cyberarm_engine/ui/elements/edit_line.rb +180 -27
  49. data/lib/cyberarm_engine/ui/elements/flow.rb +1 -3
  50. data/lib/cyberarm_engine/ui/elements/image.rb +12 -9
  51. data/lib/cyberarm_engine/ui/elements/label.rb +96 -15
  52. data/lib/cyberarm_engine/ui/elements/list_box.rb +68 -0
  53. data/lib/cyberarm_engine/ui/elements/progress.rb +6 -5
  54. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -0
  55. data/lib/cyberarm_engine/ui/elements/slider.rb +104 -0
  56. data/lib/cyberarm_engine/ui/elements/stack.rb +1 -3
  57. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +40 -31
  58. data/lib/cyberarm_engine/ui/event.rb +8 -7
  59. data/lib/cyberarm_engine/ui/gui_state.rb +89 -6
  60. data/lib/cyberarm_engine/ui/style.rb +10 -9
  61. data/lib/cyberarm_engine/ui/theme.rb +39 -21
  62. data/lib/cyberarm_engine/vector.rb +132 -38
  63. data/lib/cyberarm_engine/version.rb +2 -2
  64. data/lib/cyberarm_engine/{engine.rb → window.rb} +30 -19
  65. metadata +87 -16
  66. data/lib/cyberarm_engine/shader.rb +0 -205
@@ -1,4 +1,4 @@
1
1
  module CyberarmEngine
2
- NAME = "InDev"
3
- VERSION = "0.12.0"
2
+ NAME = "InDev".freeze
3
+ VERSION = "0.15.0".freeze
4
4
  end
@@ -1,10 +1,11 @@
1
1
  module CyberarmEngine
2
- class Engine < Gosu::Window
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-@current_frame_time
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.class == klass && options[:setup]
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
- return state
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), cy + Gosu.offset_y(a2, r), color, z)
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.12.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: 2019-10-08 00:00:00.000000000 Z
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.14.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.14.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: rake
84
+ name: minitest
43
85
  requirement: !ruby/object:Gem::Requirement
44
86
  requirements:
45
87
  - - "~>"
46
88
  - !ruby/object:Gem::Version
47
- version: '10.0'
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: '10.0'
96
+ version: '5.0'
55
97
  - !ruby/object:Gem::Dependency
56
- name: minitest
98
+ name: rake
57
99
  requirement: !ruby/object:Gem::Requirement
58
100
  requirements:
59
101
  - - "~>"
60
102
  - !ruby/object:Gem::Version
61
- version: '5.0'
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: '5.0'
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/engine.rb
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/shader.rb
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.0.4
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