cyberarm_engine 0.12.1 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) 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 +25 -7
  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 +86 -50
  43. data/lib/cyberarm_engine/ui/element.rb +60 -21
  44. data/lib/cyberarm_engine/ui/elements/button.rb +121 -28
  45. data/lib/cyberarm_engine/ui/elements/check_box.rb +25 -33
  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 +32 -12
  51. data/lib/cyberarm_engine/ui/elements/label.rb +122 -16
  52. data/lib/cyberarm_engine/ui/elements/list_box.rb +82 -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/text_block.rb +156 -0
  58. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +40 -31
  59. data/lib/cyberarm_engine/ui/event.rb +8 -7
  60. data/lib/cyberarm_engine/ui/gui_state.rb +94 -6
  61. data/lib/cyberarm_engine/ui/style.rb +10 -9
  62. data/lib/cyberarm_engine/ui/theme.rb +85 -22
  63. data/lib/cyberarm_engine/vector.rb +132 -38
  64. data/lib/cyberarm_engine/version.rb +2 -2
  65. data/lib/cyberarm_engine/{engine.rb → window.rb} +32 -19
  66. metadata +88 -17
  67. data/lib/cyberarm_engine/gosu_ext/circle.rb +0 -9
  68. data/lib/cyberarm_engine/shader.rb +0 -205
@@ -1,4 +1,4 @@
1
1
  module CyberarmEngine
2
- NAME = "InDev"
3
- VERSION = "0.12.1"
2
+ NAME = "InDev".freeze
3
+ VERSION = "0.16.0".freeze
4
4
  end
@@ -1,10 +1,13 @@
1
1
  module CyberarmEngine
2
- class Engine < Gosu::Window
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-@current_frame_time
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.class == klass && options[:setup]
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
- return state
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), cy + Gosu.offset_y(a2, r), color, z)
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.12.1
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: 2019-10-15 00:00:00.000000000 Z
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.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,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/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
92
- - lib/cyberarm_engine/gosu_ext/circle.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
93
157
  - lib/cyberarm_engine/ray.rb
94
- - lib/cyberarm_engine/shader.rb
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.0.4
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