cyberarm_engine 0.19.0 → 0.19.1

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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +8 -8
  3. data/.rubocop.yml +7 -7
  4. data/.travis.yml +5 -5
  5. data/Gemfile +6 -6
  6. data/LICENSE.txt +21 -21
  7. data/README.md +74 -74
  8. data/Rakefile +10 -10
  9. data/bin/console +14 -14
  10. data/bin/setup +8 -8
  11. data/cyberarm_engine.gemspec +39 -39
  12. data/lib/cyberarm_engine/animator.rb +219 -219
  13. data/lib/cyberarm_engine/background.rb +179 -179
  14. data/lib/cyberarm_engine/background_nine_slice.rb +142 -142
  15. data/lib/cyberarm_engine/bounding_box.rb +150 -150
  16. data/lib/cyberarm_engine/builtin/intro_state.rb +130 -130
  17. data/lib/cyberarm_engine/cache/download_manager.rb +121 -121
  18. data/lib/cyberarm_engine/cache.rb +4 -4
  19. data/lib/cyberarm_engine/common.rb +113 -113
  20. data/lib/cyberarm_engine/config_file.rb +46 -46
  21. data/lib/cyberarm_engine/console/command.rb +157 -157
  22. data/lib/cyberarm_engine/console/commands/help_command.rb +43 -43
  23. data/lib/cyberarm_engine/console/subcommand.rb +99 -99
  24. data/lib/cyberarm_engine/console.rb +248 -248
  25. data/lib/cyberarm_engine/game_object.rb +248 -248
  26. data/lib/cyberarm_engine/game_state.rb +97 -97
  27. data/lib/cyberarm_engine/model/material.rb +21 -21
  28. data/lib/cyberarm_engine/model/model_object.rb +131 -131
  29. data/lib/cyberarm_engine/model/parser.rb +74 -74
  30. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -138
  31. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -154
  32. data/lib/cyberarm_engine/model.rb +212 -212
  33. data/lib/cyberarm_engine/model_cache.rb +31 -31
  34. data/lib/cyberarm_engine/opengl/light.rb +50 -50
  35. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -46
  36. data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -38
  37. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -249
  38. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -164
  39. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +298 -298
  40. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -22
  41. data/lib/cyberarm_engine/opengl/shader.rb +406 -406
  42. data/lib/cyberarm_engine/opengl/texture.rb +69 -69
  43. data/lib/cyberarm_engine/opengl.rb +28 -28
  44. data/lib/cyberarm_engine/ray.rb +56 -56
  45. data/lib/cyberarm_engine/stats.rb +21 -21
  46. data/lib/cyberarm_engine/text.rb +197 -197
  47. data/lib/cyberarm_engine/timer.rb +23 -23
  48. data/lib/cyberarm_engine/transform.rb +296 -296
  49. data/lib/cyberarm_engine/ui/border_canvas.rb +102 -102
  50. data/lib/cyberarm_engine/ui/dsl.rb +139 -139
  51. data/lib/cyberarm_engine/ui/element.rb +488 -488
  52. data/lib/cyberarm_engine/ui/elements/button.rb +97 -97
  53. data/lib/cyberarm_engine/ui/elements/check_box.rb +54 -54
  54. data/lib/cyberarm_engine/ui/elements/container.rb +256 -256
  55. data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -179
  56. data/lib/cyberarm_engine/ui/elements/edit_line.rb +263 -263
  57. data/lib/cyberarm_engine/ui/elements/flow.rb +15 -15
  58. data/lib/cyberarm_engine/ui/elements/image.rb +72 -72
  59. data/lib/cyberarm_engine/ui/elements/list_box.rb +88 -82
  60. data/lib/cyberarm_engine/ui/elements/progress.rb +51 -51
  61. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -6
  62. data/lib/cyberarm_engine/ui/elements/slider.rb +104 -104
  63. data/lib/cyberarm_engine/ui/elements/stack.rb +11 -11
  64. data/lib/cyberarm_engine/ui/elements/text_block.rb +162 -162
  65. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +65 -65
  66. data/lib/cyberarm_engine/ui/event.rb +54 -54
  67. data/lib/cyberarm_engine/ui/gui_state.rb +256 -256
  68. data/lib/cyberarm_engine/ui/style.rb +49 -49
  69. data/lib/cyberarm_engine/ui/theme.rb +207 -207
  70. data/lib/cyberarm_engine/vector.rb +293 -293
  71. data/lib/cyberarm_engine/version.rb +4 -4
  72. data/lib/cyberarm_engine/window.rb +120 -120
  73. data/lib/cyberarm_engine.rb +71 -71
  74. metadata +3 -3
@@ -1,212 +1,212 @@
1
- module CyberarmEngine
2
- class Model
3
- attr_accessor :objects, :materials, :vertices, :uvs, :texures, :normals, :faces, :colors, :bones, :material_file,
4
- :current_material, :current_object, :vertex_count, :smoothing
5
- attr_reader :position, :bounding_box, :textured_material, :file_path, :positions_buffer_id, :colors_buffer_id,
6
- :normals_buffer_id, :uvs_buffer_id, :textures_buffer_id, :vertex_array_id, :aabb_tree,
7
- :vertices_count
8
-
9
- def initialize(file_path:)
10
- @file_path = file_path
11
-
12
- @material_file = nil
13
- @current_object = nil
14
- @current_material = nil
15
- @vertex_count = 0
16
-
17
- @objects = []
18
- @materials = {}
19
- @vertices = []
20
- @colors = []
21
- @uvs = []
22
- @normals = []
23
- @faces = []
24
- @bones = []
25
- @smoothing = 0
26
-
27
- @vertices_count = 0
28
-
29
- @bounding_box = BoundingBox.new
30
- start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond)
31
-
32
- type = File.basename(file_path).split(".").last.to_sym
33
- parser = Model::Parser.find(type)
34
- raise "Unsupported model type '.#{type}', supported models are: #{Model::Parser.supported_formats}" unless parser
35
-
36
- parse(parser)
37
-
38
- @vertices_count = @vertices.size
39
-
40
- @has_texture = false
41
-
42
- @materials.each do |_key, material|
43
- @has_texture = true if material.texture_id
44
- end
45
-
46
- allocate_gl_objects
47
- populate_vertex_buffer
48
- configure_vao
49
-
50
- @objects.each { |o| @vertex_count += o.vertices.size }
51
-
52
- start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond)
53
- # build_collision_tree
54
- end
55
-
56
- def parse(parser)
57
- parser.new(self).parse
58
- end
59
-
60
- def calculate_bounding_box(vertices, bounding_box)
61
- unless bounding_box.min.x.is_a?(Float)
62
- vertex = vertices.last
63
- bounding_box.min.x = vertex.x
64
- bounding_box.min.y = vertex.y
65
- bounding_box.min.z = vertex.z
66
-
67
- bounding_box.max.x = vertex.x
68
- bounding_box.max.y = vertex.y
69
- bounding_box.max.z = vertex.z
70
- end
71
-
72
- vertices.each do |vertex|
73
- bounding_box.min.x = vertex.x if vertex.x <= bounding_box.min.x
74
- bounding_box.min.y = vertex.y if vertex.y <= bounding_box.min.y
75
- bounding_box.min.z = vertex.z if vertex.z <= bounding_box.min.z
76
-
77
- bounding_box.max.x = vertex.x if vertex.x >= bounding_box.max.x
78
- bounding_box.max.y = vertex.y if vertex.y >= bounding_box.max.y
79
- bounding_box.max.z = vertex.z if vertex.z >= bounding_box.max.z
80
- end
81
- end
82
-
83
- def allocate_gl_objects
84
- # Allocate arrays for future use
85
- @vertex_array_id = nil
86
- buffer = " " * 4
87
- glGenVertexArrays(1, buffer)
88
- @vertex_array_id = buffer.unpack1("L2")
89
-
90
- # Allocate buffers for future use
91
- @positions_buffer_id = nil
92
- buffer = " " * 4
93
- glGenBuffers(1, buffer)
94
- @positions_buffer_id = buffer.unpack1("L2")
95
-
96
- @colors_buffer_id = nil
97
- buffer = " " * 4
98
- glGenBuffers(1, buffer)
99
- @colors_buffer_id = buffer.unpack1("L2")
100
-
101
- @normals_buffer_id = nil
102
- buffer = " " * 4
103
- glGenBuffers(1, buffer)
104
- @normals_buffer_id = buffer.unpack1("L2")
105
-
106
- @uvs_buffer_id = nil
107
- buffer = " " * 4
108
- glGenBuffers(1, buffer)
109
- @uvs_buffer_id = buffer.unpack1("L2")
110
- end
111
-
112
- def populate_vertex_buffer
113
- pos = []
114
- colors = []
115
- norms = []
116
- uvs = []
117
-
118
- @faces.each do |face|
119
- pos << face.vertices.map { |vert| [vert.x, vert.y, vert.z] }
120
- colors << face.colors.map { |color| [color.red, color.green, color.blue] }
121
- norms << face.normals.map { |vert| [vert.x, vert.y, vert.z, vert.weight] }
122
-
123
- uvs << face.uvs.map { |vert| [vert.x, vert.y, vert.z] } if has_texture?
124
- end
125
-
126
- glBindBuffer(GL_ARRAY_BUFFER, @positions_buffer_id)
127
- glBufferData(GL_ARRAY_BUFFER, pos.flatten.size * Fiddle::SIZEOF_FLOAT, pos.flatten.pack("f*"), GL_STATIC_DRAW)
128
-
129
- glBindBuffer(GL_ARRAY_BUFFER, @colors_buffer_id)
130
- glBufferData(GL_ARRAY_BUFFER, colors.flatten.size * Fiddle::SIZEOF_FLOAT, colors.flatten.pack("f*"),
131
- GL_STATIC_DRAW)
132
-
133
- glBindBuffer(GL_ARRAY_BUFFER, @normals_buffer_id)
134
- glBufferData(GL_ARRAY_BUFFER, norms.flatten.size * Fiddle::SIZEOF_FLOAT, norms.flatten.pack("f*"), GL_STATIC_DRAW)
135
-
136
- if has_texture?
137
- glBindBuffer(GL_ARRAY_BUFFER, @uvs_buffer_id)
138
- glBufferData(GL_ARRAY_BUFFER, uvs.flatten.size * Fiddle::SIZEOF_FLOAT, uvs.flatten.pack("f*"), GL_STATIC_DRAW)
139
- end
140
-
141
- glBindBuffer(GL_ARRAY_BUFFER, 0)
142
- end
143
-
144
- def configure_vao
145
- glBindVertexArray(@vertex_array_id)
146
- gl_error?
147
-
148
- # index, size, type, normalized, stride, pointer
149
- # vertices (positions)
150
- glBindBuffer(GL_ARRAY_BUFFER, @positions_buffer_id)
151
- gl_error?
152
-
153
- # inPosition
154
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nil)
155
- gl_error?
156
- # colors
157
- glBindBuffer(GL_ARRAY_BUFFER, @colors_buffer_id)
158
- # inColor
159
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, nil)
160
- gl_error?
161
- # normals
162
- glBindBuffer(GL_ARRAY_BUFFER, @normals_buffer_id)
163
- # inNormal
164
- glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, nil)
165
- gl_error?
166
-
167
- if has_texture?
168
- # uvs
169
- glBindBuffer(GL_ARRAY_BUFFER, @uvs_buffer_id)
170
- # inUV
171
- glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, nil)
172
- gl_error?
173
- end
174
-
175
- glBindBuffer(GL_ARRAY_BUFFER, 0)
176
- glBindVertexArray(0)
177
- end
178
-
179
- def build_collision_tree
180
- @aabb_tree = AABBTree.new
181
-
182
- @faces.each do |face|
183
- box = BoundingBox.new
184
- box.min = face.vertices.first.dup
185
- box.max = face.vertices.first.dup
186
-
187
- face.vertices.each do |vertex|
188
- if vertex.sum < box.min.sum
189
- box.min = vertex.dup
190
- elsif vertex.sum > box.max.sum
191
- box.max = vertex.dup
192
- end
193
- end
194
-
195
- # FIXME: Handle negatives
196
- box.min *= 1.5
197
- box.max *= 1.5
198
- @aabb_tree.insert(face, box)
199
- end
200
- end
201
-
202
- def has_texture?
203
- @has_texture
204
- end
205
-
206
- def release_gl_resources
207
- if @vertex_array_id
208
-
209
- end
210
- end
211
- end
212
- end
1
+ module CyberarmEngine
2
+ class Model
3
+ attr_accessor :objects, :materials, :vertices, :uvs, :texures, :normals, :faces, :colors, :bones, :material_file,
4
+ :current_material, :current_object, :vertex_count, :smoothing
5
+ attr_reader :position, :bounding_box, :textured_material, :file_path, :positions_buffer_id, :colors_buffer_id,
6
+ :normals_buffer_id, :uvs_buffer_id, :textures_buffer_id, :vertex_array_id, :aabb_tree,
7
+ :vertices_count
8
+
9
+ def initialize(file_path:)
10
+ @file_path = file_path
11
+
12
+ @material_file = nil
13
+ @current_object = nil
14
+ @current_material = nil
15
+ @vertex_count = 0
16
+
17
+ @objects = []
18
+ @materials = {}
19
+ @vertices = []
20
+ @colors = []
21
+ @uvs = []
22
+ @normals = []
23
+ @faces = []
24
+ @bones = []
25
+ @smoothing = 0
26
+
27
+ @vertices_count = 0
28
+
29
+ @bounding_box = BoundingBox.new
30
+ start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond)
31
+
32
+ type = File.basename(file_path).split(".").last.to_sym
33
+ parser = Model::Parser.find(type)
34
+ raise "Unsupported model type '.#{type}', supported models are: #{Model::Parser.supported_formats}" unless parser
35
+
36
+ parse(parser)
37
+
38
+ @vertices_count = @vertices.size
39
+
40
+ @has_texture = false
41
+
42
+ @materials.each do |_key, material|
43
+ @has_texture = true if material.texture_id
44
+ end
45
+
46
+ allocate_gl_objects
47
+ populate_vertex_buffer
48
+ configure_vao
49
+
50
+ @objects.each { |o| @vertex_count += o.vertices.size }
51
+
52
+ start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond)
53
+ # build_collision_tree
54
+ end
55
+
56
+ def parse(parser)
57
+ parser.new(self).parse
58
+ end
59
+
60
+ def calculate_bounding_box(vertices, bounding_box)
61
+ unless bounding_box.min.x.is_a?(Float)
62
+ vertex = vertices.last
63
+ bounding_box.min.x = vertex.x
64
+ bounding_box.min.y = vertex.y
65
+ bounding_box.min.z = vertex.z
66
+
67
+ bounding_box.max.x = vertex.x
68
+ bounding_box.max.y = vertex.y
69
+ bounding_box.max.z = vertex.z
70
+ end
71
+
72
+ vertices.each do |vertex|
73
+ bounding_box.min.x = vertex.x if vertex.x <= bounding_box.min.x
74
+ bounding_box.min.y = vertex.y if vertex.y <= bounding_box.min.y
75
+ bounding_box.min.z = vertex.z if vertex.z <= bounding_box.min.z
76
+
77
+ bounding_box.max.x = vertex.x if vertex.x >= bounding_box.max.x
78
+ bounding_box.max.y = vertex.y if vertex.y >= bounding_box.max.y
79
+ bounding_box.max.z = vertex.z if vertex.z >= bounding_box.max.z
80
+ end
81
+ end
82
+
83
+ def allocate_gl_objects
84
+ # Allocate arrays for future use
85
+ @vertex_array_id = nil
86
+ buffer = " " * 4
87
+ glGenVertexArrays(1, buffer)
88
+ @vertex_array_id = buffer.unpack1("L2")
89
+
90
+ # Allocate buffers for future use
91
+ @positions_buffer_id = nil
92
+ buffer = " " * 4
93
+ glGenBuffers(1, buffer)
94
+ @positions_buffer_id = buffer.unpack1("L2")
95
+
96
+ @colors_buffer_id = nil
97
+ buffer = " " * 4
98
+ glGenBuffers(1, buffer)
99
+ @colors_buffer_id = buffer.unpack1("L2")
100
+
101
+ @normals_buffer_id = nil
102
+ buffer = " " * 4
103
+ glGenBuffers(1, buffer)
104
+ @normals_buffer_id = buffer.unpack1("L2")
105
+
106
+ @uvs_buffer_id = nil
107
+ buffer = " " * 4
108
+ glGenBuffers(1, buffer)
109
+ @uvs_buffer_id = buffer.unpack1("L2")
110
+ end
111
+
112
+ def populate_vertex_buffer
113
+ pos = []
114
+ colors = []
115
+ norms = []
116
+ uvs = []
117
+
118
+ @faces.each do |face|
119
+ pos << face.vertices.map { |vert| [vert.x, vert.y, vert.z] }
120
+ colors << face.colors.map { |color| [color.red, color.green, color.blue] }
121
+ norms << face.normals.map { |vert| [vert.x, vert.y, vert.z, vert.weight] }
122
+
123
+ uvs << face.uvs.map { |vert| [vert.x, vert.y, vert.z] } if has_texture?
124
+ end
125
+
126
+ glBindBuffer(GL_ARRAY_BUFFER, @positions_buffer_id)
127
+ glBufferData(GL_ARRAY_BUFFER, pos.flatten.size * Fiddle::SIZEOF_FLOAT, pos.flatten.pack("f*"), GL_STATIC_DRAW)
128
+
129
+ glBindBuffer(GL_ARRAY_BUFFER, @colors_buffer_id)
130
+ glBufferData(GL_ARRAY_BUFFER, colors.flatten.size * Fiddle::SIZEOF_FLOAT, colors.flatten.pack("f*"),
131
+ GL_STATIC_DRAW)
132
+
133
+ glBindBuffer(GL_ARRAY_BUFFER, @normals_buffer_id)
134
+ glBufferData(GL_ARRAY_BUFFER, norms.flatten.size * Fiddle::SIZEOF_FLOAT, norms.flatten.pack("f*"), GL_STATIC_DRAW)
135
+
136
+ if has_texture?
137
+ glBindBuffer(GL_ARRAY_BUFFER, @uvs_buffer_id)
138
+ glBufferData(GL_ARRAY_BUFFER, uvs.flatten.size * Fiddle::SIZEOF_FLOAT, uvs.flatten.pack("f*"), GL_STATIC_DRAW)
139
+ end
140
+
141
+ glBindBuffer(GL_ARRAY_BUFFER, 0)
142
+ end
143
+
144
+ def configure_vao
145
+ glBindVertexArray(@vertex_array_id)
146
+ gl_error?
147
+
148
+ # index, size, type, normalized, stride, pointer
149
+ # vertices (positions)
150
+ glBindBuffer(GL_ARRAY_BUFFER, @positions_buffer_id)
151
+ gl_error?
152
+
153
+ # inPosition
154
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nil)
155
+ gl_error?
156
+ # colors
157
+ glBindBuffer(GL_ARRAY_BUFFER, @colors_buffer_id)
158
+ # inColor
159
+ glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, nil)
160
+ gl_error?
161
+ # normals
162
+ glBindBuffer(GL_ARRAY_BUFFER, @normals_buffer_id)
163
+ # inNormal
164
+ glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, nil)
165
+ gl_error?
166
+
167
+ if has_texture?
168
+ # uvs
169
+ glBindBuffer(GL_ARRAY_BUFFER, @uvs_buffer_id)
170
+ # inUV
171
+ glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, nil)
172
+ gl_error?
173
+ end
174
+
175
+ glBindBuffer(GL_ARRAY_BUFFER, 0)
176
+ glBindVertexArray(0)
177
+ end
178
+
179
+ def build_collision_tree
180
+ @aabb_tree = AABBTree.new
181
+
182
+ @faces.each do |face|
183
+ box = BoundingBox.new
184
+ box.min = face.vertices.first.dup
185
+ box.max = face.vertices.first.dup
186
+
187
+ face.vertices.each do |vertex|
188
+ if vertex.sum < box.min.sum
189
+ box.min = vertex.dup
190
+ elsif vertex.sum > box.max.sum
191
+ box.max = vertex.dup
192
+ end
193
+ end
194
+
195
+ # FIXME: Handle negatives
196
+ box.min *= 1.5
197
+ box.max *= 1.5
198
+ @aabb_tree.insert(face, box)
199
+ end
200
+ end
201
+
202
+ def has_texture?
203
+ @has_texture
204
+ end
205
+
206
+ def release_gl_resources
207
+ if @vertex_array_id
208
+
209
+ end
210
+ end
211
+ end
212
+ end
@@ -1,31 +1,31 @@
1
- module CyberarmEngine
2
- module ModelCache
3
- CACHE = {}
4
-
5
- def self.find_or_cache(manifest:)
6
- model_file = manifest.file_path + "/model/#{manifest.model}"
7
-
8
- type = File.basename(model_file).split(".").last.to_sym
9
-
10
- if model = load_model_from_cache(type, model_file)
11
- model
12
- else
13
- model = CyberarmEngine::Model.new(file_path: model_file)
14
- cache_model(type, model_file, model)
15
-
16
- model
17
- end
18
- end
19
-
20
- def self.load_model_from_cache(type, model_file)
21
- return CACHE[type][model_file] if CACHE[type].is_a?(Hash) && (CACHE[type][model_file])
22
-
23
- false
24
- end
25
-
26
- def self.cache_model(type, model_file, model)
27
- CACHE[type] = {} unless CACHE[type].is_a?(Hash)
28
- CACHE[type][model_file] = model
29
- end
30
- end
31
- end
1
+ module CyberarmEngine
2
+ module ModelCache
3
+ CACHE = {}
4
+
5
+ def self.find_or_cache(manifest:)
6
+ model_file = manifest.file_path + "/model/#{manifest.model}"
7
+
8
+ type = File.basename(model_file).split(".").last.to_sym
9
+
10
+ if model = load_model_from_cache(type, model_file)
11
+ model
12
+ else
13
+ model = CyberarmEngine::Model.new(file_path: model_file)
14
+ cache_model(type, model_file, model)
15
+
16
+ model
17
+ end
18
+ end
19
+
20
+ def self.load_model_from_cache(type, model_file)
21
+ return CACHE[type][model_file] if CACHE[type].is_a?(Hash) && (CACHE[type][model_file])
22
+
23
+ false
24
+ end
25
+
26
+ def self.cache_model(type, model_file, model)
27
+ CACHE[type] = {} unless CACHE[type].is_a?(Hash)
28
+ CACHE[type][model_file] = model
29
+ end
30
+ end
31
+ end
@@ -1,50 +1,50 @@
1
- module CyberarmEngine
2
- class Light
3
- DIRECTIONAL = 0
4
- POINT = 1
5
- SPOT = 2
6
-
7
- attr_reader :light_id
8
- attr_accessor :type, :ambient, :diffuse, :specular, :position, :direction, :intensity
9
-
10
- def initialize(
11
- id:,
12
- type: Light::POINT,
13
- ambient: Vector.new(0.5, 0.5, 0.5),
14
- diffuse: Vector.new(1, 1, 1),
15
- specular: Vector.new(0.2, 0.2, 0.2),
16
- position: Vector.new(0, 0, 0),
17
- direction: Vector.new(0, 0, 0),
18
- intensity: 1
19
- )
20
- @light_id = id
21
- @type = type
22
-
23
- @ambient = ambient
24
- @diffuse = diffuse
25
- @specular = specular
26
- @position = position
27
- @direction = direction
28
-
29
- @intensity = intensity
30
- end
31
-
32
- def draw
33
- glLightfv(@light_id, GL_AMBIENT, convert(@ambient).pack("f*"))
34
- glLightfv(@light_id, GL_DIFFUSE, convert(@diffuse, true).pack("f*"))
35
- glLightfv(@light_id, GL_SPECULAR, convert(@specular, true).pack("f*"))
36
- glLightfv(@light_id, GL_POSITION, convert(@position).pack("f*"))
37
- glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1)
38
- glEnable(GL_LIGHTING)
39
- glEnable(@light_id)
40
- end
41
-
42
- def convert(struct, apply_intensity = false)
43
- if apply_intensity
44
- struct.to_a.compact.map { |i| i * @intensity }
45
- else
46
- struct.to_a.compact
47
- end
48
- end
49
- end
50
- end
1
+ module CyberarmEngine
2
+ class Light
3
+ DIRECTIONAL = 0
4
+ POINT = 1
5
+ SPOT = 2
6
+
7
+ attr_reader :light_id
8
+ attr_accessor :type, :ambient, :diffuse, :specular, :position, :direction, :intensity
9
+
10
+ def initialize(
11
+ id:,
12
+ type: Light::POINT,
13
+ ambient: Vector.new(0.5, 0.5, 0.5),
14
+ diffuse: Vector.new(1, 1, 1),
15
+ specular: Vector.new(0.2, 0.2, 0.2),
16
+ position: Vector.new(0, 0, 0),
17
+ direction: Vector.new(0, 0, 0),
18
+ intensity: 1
19
+ )
20
+ @light_id = id
21
+ @type = type
22
+
23
+ @ambient = ambient
24
+ @diffuse = diffuse
25
+ @specular = specular
26
+ @position = position
27
+ @direction = direction
28
+
29
+ @intensity = intensity
30
+ end
31
+
32
+ def draw
33
+ glLightfv(@light_id, GL_AMBIENT, convert(@ambient).pack("f*"))
34
+ glLightfv(@light_id, GL_DIFFUSE, convert(@diffuse, true).pack("f*"))
35
+ glLightfv(@light_id, GL_SPECULAR, convert(@specular, true).pack("f*"))
36
+ glLightfv(@light_id, GL_POSITION, convert(@position).pack("f*"))
37
+ glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1)
38
+ glEnable(GL_LIGHTING)
39
+ glEnable(@light_id)
40
+ end
41
+
42
+ def convert(struct, apply_intensity = false)
43
+ if apply_intensity
44
+ struct.to_a.compact.map { |i| i * @intensity }
45
+ else
46
+ struct.to_a.compact
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,46 +1,46 @@
1
- module CyberarmEngine
2
- class OrthographicCamera
3
- attr_accessor :position, :orientation, :zoom, :left, :right, :bottom, :top,
4
- :min_view_distance, :max_view_distance
5
-
6
- def initialize(
7
- position:, right:, top:, orientation: Vector.new(0, 0, 0),
8
- zoom: 1, left: 0, bottom: 0,
9
- min_view_distance: 0.1, max_view_distance: 200.0
10
- )
11
- @position = position
12
- @orientation = orientation
13
-
14
- @zoom = zoom
15
-
16
- @left = left
17
- @right = right
18
- @bottom = bottom
19
- @top = top
20
-
21
- @min_view_distance = min_view_distance
22
- @max_view_distance = max_view_distance
23
- end
24
-
25
- # Immediate mode renderering fallback
26
- def draw
27
- glMatrixMode(GL_PROJECTION)
28
- glLoadIdentity
29
- glOrtho(@left, @right, @bottom, @top, @min_view_distance, @max_view_distance)
30
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
31
- glRotatef(@orientation.x, 1, 0, 0)
32
- glRotatef(@orientation.y, 0, 1, 0)
33
- glTranslatef(-@position.x, -@position.y, -@position.z)
34
- glMatrixMode(GL_MODELVIEW)
35
- glLoadIdentity
36
- end
37
-
38
- def projection_matrix
39
- Transform.orthographic(@left, @right, @bottom, @top, @min_view_distance, @max_view_distance)
40
- end
41
-
42
- def view_matrix
43
- Transform.translate_3d(@position * -1) * Transform.rotate_3d(@orientation)
44
- end
45
- end
46
- end
1
+ module CyberarmEngine
2
+ class OrthographicCamera
3
+ attr_accessor :position, :orientation, :zoom, :left, :right, :bottom, :top,
4
+ :min_view_distance, :max_view_distance
5
+
6
+ def initialize(
7
+ position:, right:, top:, orientation: Vector.new(0, 0, 0),
8
+ zoom: 1, left: 0, bottom: 0,
9
+ min_view_distance: 0.1, max_view_distance: 200.0
10
+ )
11
+ @position = position
12
+ @orientation = orientation
13
+
14
+ @zoom = zoom
15
+
16
+ @left = left
17
+ @right = right
18
+ @bottom = bottom
19
+ @top = top
20
+
21
+ @min_view_distance = min_view_distance
22
+ @max_view_distance = max_view_distance
23
+ end
24
+
25
+ # Immediate mode renderering fallback
26
+ def draw
27
+ glMatrixMode(GL_PROJECTION)
28
+ glLoadIdentity
29
+ glOrtho(@left, @right, @bottom, @top, @min_view_distance, @max_view_distance)
30
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
31
+ glRotatef(@orientation.x, 1, 0, 0)
32
+ glRotatef(@orientation.y, 0, 1, 0)
33
+ glTranslatef(-@position.x, -@position.y, -@position.z)
34
+ glMatrixMode(GL_MODELVIEW)
35
+ glLoadIdentity
36
+ end
37
+
38
+ def projection_matrix
39
+ Transform.orthographic(@left, @right, @bottom, @top, @min_view_distance, @max_view_distance)
40
+ end
41
+
42
+ def view_matrix
43
+ Transform.translate_3d(@position * -1) * Transform.rotate_3d(@orientation)
44
+ end
45
+ end
46
+ end