cyberarm_engine 0.12.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
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