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,138 +1,138 @@
1
- module CyberarmEngine
2
- class ColladaParser < Model::Parser
3
- def self.handles
4
- [:dae]
5
- end
6
-
7
- def parse
8
- @collada = Nokogiri::XML(File.read(@model.file_path))
9
-
10
- @collada.css("library_materials material").each do |material|
11
- parse_material(material)
12
- end
13
-
14
- @collada.css("library_geometries geometry").each do |geometry|
15
- parse_geometry(geometry)
16
- end
17
-
18
- @model.calculate_bounding_box(@model.vertices, @model.bounding_box)
19
- @model.objects.each do |o|
20
- @model.calculate_bounding_box(o.vertices, o.bounding_box)
21
- end
22
- end
23
-
24
- def parse_material(material)
25
- name = material.attributes["id"].value
26
- effect_id = material.at_css("instance_effect").attributes["url"].value
27
-
28
- mat = Model::Material.new(name)
29
- effect = @collada.at_css("[id=\"#{effect_id.sub('#', '')}\"]")
30
-
31
- emission = effect.at_css("emission color")
32
- diffuse = effect.at_css("diffuse color").children.first.to_s.split(" ").map { |c| Float(c) }
33
-
34
- mat.diffuse = Color.new(*diffuse[0..2])
35
-
36
- add_material(name, mat)
37
- end
38
-
39
- def parse_geometry(geometry)
40
- geometry_id = geometry.attributes["id"].value
41
- geometry_name = geometry.attributes["name"].value
42
-
43
- change_object(geometry_id, geometry_name)
44
-
45
- mesh = geometry.at_css("mesh")
46
-
47
- get_positions(geometry_id, mesh)
48
- get_normals(geometry_id, mesh)
49
- get_texture_coordinates(geometry_id, mesh)
50
-
51
- project_node(geometry_name)
52
- build_faces(geometry_id, mesh)
53
- end
54
-
55
- def get_positions(id, mesh)
56
- positions = mesh.at_css("[id=\"#{id}-positions\"]")
57
- array = positions.at_css("[id=\"#{id}-positions-array\"]")
58
-
59
- stride = Integer(positions.at_css("[source=\"##{id}-positions-array\"]").attributes["stride"].value)
60
- list = array.children.first.to_s.split(" ").map { |f| Float(f) }.each_slice(stride).each do |slice|
61
- position = Vector.new(*slice)
62
- @model.current_object.vertices << position
63
- @model.vertices << position
64
- end
65
- end
66
-
67
- def get_normals(id, mesh)
68
- normals = mesh.at_css("[id=\"#{id}-normals\"]")
69
- array = normals.at_css("[id=\"#{id}-normals-array\"]")
70
-
71
- stride = Integer(normals.at_css("[source=\"##{id}-normals-array\"]").attributes["stride"].value)
72
- list = array.children.first.to_s.split(" ").map { |f| Float(f) }.each_slice(stride).each do |slice|
73
- normal = Vector.new(*slice)
74
- @model.current_object.normals << normal
75
- @model.normals << normal
76
- end
77
- end
78
-
79
- def get_texture_coordinates(id, mesh)
80
- end
81
-
82
- def project_node(name)
83
- @collada.css("library_visual_scenes visual_scene node").each do |node|
84
- next unless node.attributes["name"].value == name
85
-
86
- transform = Transform.new(node.at_css("matrix").children.first.to_s.split(" ").map { |f| Float(f) })
87
-
88
- @model.current_object.vertices.each do |vert|
89
- v = vert.multiply_transform(transform)
90
- vert.x = v.x
91
- vert.y = v.y
92
- vert.z = v.z
93
- vert.w = v.w
94
- end
95
-
96
- break
97
- end
98
- end
99
-
100
- def build_faces(_id, mesh)
101
- material_name = mesh.at_css("triangles").attributes["material"].value
102
- set_material(material_name)
103
-
104
- positions_index = []
105
- normals_index = []
106
- uvs_index = []
107
-
108
- mesh.at_css("triangles p").children.first.to_s.split(" ").map { |i| Integer(i) }.each_slice(3).each do |slice|
109
- positions_index << slice[0]
110
- normals_index << slice[1]
111
- uvs_index << slice[2]
112
- end
113
-
114
- norm_index = 0
115
- positions_index.each_slice(3) do |slice|
116
- face = Face.new
117
- face.vertices = []
118
- face.uvs = []
119
- face.normals = []
120
- face.colors = []
121
- face.material = current_material
122
- face.smoothing = @model.smoothing
123
-
124
- slice.each do |index|
125
- face.vertices << @model.vertices[index]
126
- # face.uvs << @model.uvs[index]
127
- face.normals << @model.normals[normals_index[norm_index]]
128
- face.colors << current_material.diffuse
129
-
130
- norm_index += 1
131
- end
132
-
133
- @model.current_object.faces << face
134
- @model.faces << face
135
- end
136
- end
137
- end
138
- end
1
+ module CyberarmEngine
2
+ class ColladaParser < Model::Parser
3
+ def self.handles
4
+ [:dae]
5
+ end
6
+
7
+ def parse
8
+ @collada = Nokogiri::XML(File.read(@model.file_path))
9
+
10
+ @collada.css("library_materials material").each do |material|
11
+ parse_material(material)
12
+ end
13
+
14
+ @collada.css("library_geometries geometry").each do |geometry|
15
+ parse_geometry(geometry)
16
+ end
17
+
18
+ @model.calculate_bounding_box(@model.vertices, @model.bounding_box)
19
+ @model.objects.each do |o|
20
+ @model.calculate_bounding_box(o.vertices, o.bounding_box)
21
+ end
22
+ end
23
+
24
+ def parse_material(material)
25
+ name = material.attributes["id"].value
26
+ effect_id = material.at_css("instance_effect").attributes["url"].value
27
+
28
+ mat = Model::Material.new(name)
29
+ effect = @collada.at_css("[id=\"#{effect_id.sub('#', '')}\"]")
30
+
31
+ emission = effect.at_css("emission color")
32
+ diffuse = effect.at_css("diffuse color").children.first.to_s.split(" ").map { |c| Float(c) }
33
+
34
+ mat.diffuse = Color.new(*diffuse[0..2])
35
+
36
+ add_material(name, mat)
37
+ end
38
+
39
+ def parse_geometry(geometry)
40
+ geometry_id = geometry.attributes["id"].value
41
+ geometry_name = geometry.attributes["name"].value
42
+
43
+ change_object(geometry_id, geometry_name)
44
+
45
+ mesh = geometry.at_css("mesh")
46
+
47
+ get_positions(geometry_id, mesh)
48
+ get_normals(geometry_id, mesh)
49
+ get_texture_coordinates(geometry_id, mesh)
50
+
51
+ project_node(geometry_name)
52
+ build_faces(geometry_id, mesh)
53
+ end
54
+
55
+ def get_positions(id, mesh)
56
+ positions = mesh.at_css("[id=\"#{id}-positions\"]")
57
+ array = positions.at_css("[id=\"#{id}-positions-array\"]")
58
+
59
+ stride = Integer(positions.at_css("[source=\"##{id}-positions-array\"]").attributes["stride"].value)
60
+ list = array.children.first.to_s.split(" ").map { |f| Float(f) }.each_slice(stride).each do |slice|
61
+ position = Vector.new(*slice)
62
+ @model.current_object.vertices << position
63
+ @model.vertices << position
64
+ end
65
+ end
66
+
67
+ def get_normals(id, mesh)
68
+ normals = mesh.at_css("[id=\"#{id}-normals\"]")
69
+ array = normals.at_css("[id=\"#{id}-normals-array\"]")
70
+
71
+ stride = Integer(normals.at_css("[source=\"##{id}-normals-array\"]").attributes["stride"].value)
72
+ list = array.children.first.to_s.split(" ").map { |f| Float(f) }.each_slice(stride).each do |slice|
73
+ normal = Vector.new(*slice)
74
+ @model.current_object.normals << normal
75
+ @model.normals << normal
76
+ end
77
+ end
78
+
79
+ def get_texture_coordinates(id, mesh)
80
+ end
81
+
82
+ def project_node(name)
83
+ @collada.css("library_visual_scenes visual_scene node").each do |node|
84
+ next unless node.attributes["name"].value == name
85
+
86
+ transform = Transform.new(node.at_css("matrix").children.first.to_s.split(" ").map { |f| Float(f) })
87
+
88
+ @model.current_object.vertices.each do |vert|
89
+ v = vert.multiply_transform(transform)
90
+ vert.x = v.x
91
+ vert.y = v.y
92
+ vert.z = v.z
93
+ vert.w = v.w
94
+ end
95
+
96
+ break
97
+ end
98
+ end
99
+
100
+ def build_faces(_id, mesh)
101
+ material_name = mesh.at_css("triangles").attributes["material"].value
102
+ set_material(material_name)
103
+
104
+ positions_index = []
105
+ normals_index = []
106
+ uvs_index = []
107
+
108
+ mesh.at_css("triangles p").children.first.to_s.split(" ").map { |i| Integer(i) }.each_slice(3).each do |slice|
109
+ positions_index << slice[0]
110
+ normals_index << slice[1]
111
+ uvs_index << slice[2]
112
+ end
113
+
114
+ norm_index = 0
115
+ positions_index.each_slice(3) do |slice|
116
+ face = Face.new
117
+ face.vertices = []
118
+ face.uvs = []
119
+ face.normals = []
120
+ face.colors = []
121
+ face.material = current_material
122
+ face.smoothing = @model.smoothing
123
+
124
+ slice.each do |index|
125
+ face.vertices << @model.vertices[index]
126
+ # face.uvs << @model.uvs[index]
127
+ face.normals << @model.normals[normals_index[norm_index]]
128
+ face.colors << current_material.diffuse
129
+
130
+ norm_index += 1
131
+ end
132
+
133
+ @model.current_object.faces << face
134
+ @model.faces << face
135
+ end
136
+ end
137
+ end
138
+ end
@@ -1,154 +1,154 @@
1
- module CyberarmEngine
2
- class WavefrontParser < Model::Parser
3
- def self.handles
4
- [:obj]
5
- end
6
-
7
- def parse
8
- lines = 0
9
- list = File.read(@model.file_path).split("\n")
10
- list.each do |line|
11
- lines += 1
12
- line = line.strip
13
-
14
- array = line.split(" ")
15
- case array[0]
16
- when "mtllib"
17
- @model.material_file = array[1]
18
- parse_mtllib
19
- when "usemtl"
20
- set_material(array[1])
21
- when "o"
22
- change_object(nil, array[1])
23
- when "s"
24
- set_smoothing(array[1])
25
- when "v"
26
- add_vertex(array)
27
- when "vt"
28
- add_texture_coordinate(array)
29
-
30
- when "vn"
31
- add_normal(array)
32
-
33
- when "f"
34
- verts = []
35
- uvs = []
36
- norms = []
37
- array[1..3].each do |f|
38
- verts << f.split("/")[0]
39
- uvs << f.split("/")[1]
40
- norms << f.split("/")[2]
41
- end
42
-
43
- face = Face.new
44
- face.vertices = []
45
- face.uvs = []
46
- face.normals = []
47
- face.colors = []
48
- face.material = current_material
49
- face.smoothing = @model.smoothing
50
-
51
- mat = face.material.diffuse
52
- color = mat
53
-
54
- verts.each_with_index do |v, index|
55
- if uvs.first != ""
56
- face.vertices << @model.vertices[Integer(v) - 1]
57
- face.uvs << @model.uvs[Integer(uvs[index]) - 1]
58
- face.normals << @model.normals[Integer(norms[index]) - 1]
59
- face.colors << color
60
- else
61
- face.vertices << @model.vertices[Integer(v) - 1]
62
- face.uvs << nil
63
- face.normals << @model.normals[Integer(norms[index]) - 1]
64
- face.colors << color
65
- end
66
- end
67
-
68
- @model.current_object.faces << face
69
- @model.faces << face
70
- end
71
- end
72
-
73
- @model.calculate_bounding_box(@model.vertices, @model.bounding_box)
74
- @model.objects.each do |o|
75
- @model.calculate_bounding_box(o.vertices, o.bounding_box)
76
- end
77
- end
78
-
79
- def parse_mtllib
80
- file = File.open(@model.file_path.sub(File.basename(@model.file_path), "") + @model.material_file, "r")
81
- file.readlines.each do |line|
82
- array = line.strip.split(" ")
83
- case array.first
84
- when "newmtl"
85
- material = Model::Material.new(array.last)
86
- @model.current_material = array.last
87
- @model.materials[array.last] = material
88
- when "Ns" # Specular Exponent
89
- when "Ka" # Ambient color
90
- @model.materials[@model.current_material].ambient = Color.new(Float(array[1]), Float(array[2]),
91
- Float(array[3]))
92
- when "Kd" # Diffuse color
93
- @model.materials[@model.current_material].diffuse = Color.new(Float(array[1]), Float(array[2]),
94
- Float(array[3]))
95
- when "Ks" # Specular color
96
- @model.materials[@model.current_material].specular = Color.new(Float(array[1]), Float(array[2]),
97
- Float(array[3]))
98
- when "Ke" # Emissive
99
- when "Ni" # Unknown (Blender Specific?)
100
- when "d" # Dissolved (Transparency)
101
- when "illum" # Illumination model
102
- when "map_Kd" # Diffuse texture
103
- texture = File.basename(array[1])
104
- texture_path = "#{File.expand_path('../../', @model.file_path)}/textures/#{texture}"
105
- @model.materials[@model.current_material].set_texture(texture_path)
106
- end
107
- end
108
- end
109
-
110
- def set_smoothing(value)
111
- @model.smoothing = value == "1"
112
- end
113
-
114
- def add_vertex(array)
115
- @model.vertex_count += 1
116
- vert = nil
117
- if array.size == 5
118
- vert = Vector.new(Float(array[1]), Float(array[2]), Float(array[3]), Float(array[4]))
119
- elsif array.size == 4
120
- vert = Vector.new(Float(array[1]), Float(array[2]), Float(array[3]), 1.0)
121
- else
122
- raise
123
- end
124
- @model.current_object.vertices << vert
125
- @model.vertices << vert
126
- end
127
-
128
- def add_normal(array)
129
- vert = nil
130
- if array.size == 5
131
- vert = Vector.new(Float(array[1]), Float(array[2]), Float(array[3]), Float(array[4]))
132
- elsif array.size == 4
133
- vert = Vector.new(Float(array[1]), Float(array[2]), Float(array[3]), 1.0)
134
- else
135
- raise
136
- end
137
- @model.current_object.normals << vert
138
- @model.normals << vert
139
- end
140
-
141
- def add_texture_coordinate(array)
142
- texture = nil
143
- if array.size == 4
144
- texture = Vector.new(Float(array[1]), 1 - Float(array[2]), Float(array[3]))
145
- elsif array.size == 3
146
- texture = Vector.new(Float(array[1]), 1 - Float(array[2]), 1.0)
147
- else
148
- raise
149
- end
150
- @model.uvs << texture
151
- @model.current_object.uvs << texture
152
- end
153
- end
154
- end
1
+ module CyberarmEngine
2
+ class WavefrontParser < Model::Parser
3
+ def self.handles
4
+ [:obj]
5
+ end
6
+
7
+ def parse
8
+ lines = 0
9
+ list = File.read(@model.file_path).split("\n")
10
+ list.each do |line|
11
+ lines += 1
12
+ line = line.strip
13
+
14
+ array = line.split(" ")
15
+ case array[0]
16
+ when "mtllib"
17
+ @model.material_file = array[1]
18
+ parse_mtllib
19
+ when "usemtl"
20
+ set_material(array[1])
21
+ when "o"
22
+ change_object(nil, array[1])
23
+ when "s"
24
+ set_smoothing(array[1])
25
+ when "v"
26
+ add_vertex(array)
27
+ when "vt"
28
+ add_texture_coordinate(array)
29
+
30
+ when "vn"
31
+ add_normal(array)
32
+
33
+ when "f"
34
+ verts = []
35
+ uvs = []
36
+ norms = []
37
+ array[1..3].each do |f|
38
+ verts << f.split("/")[0]
39
+ uvs << f.split("/")[1]
40
+ norms << f.split("/")[2]
41
+ end
42
+
43
+ face = Face.new
44
+ face.vertices = []
45
+ face.uvs = []
46
+ face.normals = []
47
+ face.colors = []
48
+ face.material = current_material
49
+ face.smoothing = @model.smoothing
50
+
51
+ mat = face.material.diffuse
52
+ color = mat
53
+
54
+ verts.each_with_index do |v, index|
55
+ if uvs.first != ""
56
+ face.vertices << @model.vertices[Integer(v) - 1]
57
+ face.uvs << @model.uvs[Integer(uvs[index]) - 1]
58
+ face.normals << @model.normals[Integer(norms[index]) - 1]
59
+ face.colors << color
60
+ else
61
+ face.vertices << @model.vertices[Integer(v) - 1]
62
+ face.uvs << nil
63
+ face.normals << @model.normals[Integer(norms[index]) - 1]
64
+ face.colors << color
65
+ end
66
+ end
67
+
68
+ @model.current_object.faces << face
69
+ @model.faces << face
70
+ end
71
+ end
72
+
73
+ @model.calculate_bounding_box(@model.vertices, @model.bounding_box)
74
+ @model.objects.each do |o|
75
+ @model.calculate_bounding_box(o.vertices, o.bounding_box)
76
+ end
77
+ end
78
+
79
+ def parse_mtllib
80
+ file = File.open(@model.file_path.sub(File.basename(@model.file_path), "") + @model.material_file, "r")
81
+ file.readlines.each do |line|
82
+ array = line.strip.split(" ")
83
+ case array.first
84
+ when "newmtl"
85
+ material = Model::Material.new(array.last)
86
+ @model.current_material = array.last
87
+ @model.materials[array.last] = material
88
+ when "Ns" # Specular Exponent
89
+ when "Ka" # Ambient color
90
+ @model.materials[@model.current_material].ambient = Color.new(Float(array[1]), Float(array[2]),
91
+ Float(array[3]))
92
+ when "Kd" # Diffuse color
93
+ @model.materials[@model.current_material].diffuse = Color.new(Float(array[1]), Float(array[2]),
94
+ Float(array[3]))
95
+ when "Ks" # Specular color
96
+ @model.materials[@model.current_material].specular = Color.new(Float(array[1]), Float(array[2]),
97
+ Float(array[3]))
98
+ when "Ke" # Emissive
99
+ when "Ni" # Unknown (Blender Specific?)
100
+ when "d" # Dissolved (Transparency)
101
+ when "illum" # Illumination model
102
+ when "map_Kd" # Diffuse texture
103
+ texture = File.basename(array[1])
104
+ texture_path = "#{File.expand_path('../../', @model.file_path)}/textures/#{texture}"
105
+ @model.materials[@model.current_material].set_texture(texture_path)
106
+ end
107
+ end
108
+ end
109
+
110
+ def set_smoothing(value)
111
+ @model.smoothing = value == "1"
112
+ end
113
+
114
+ def add_vertex(array)
115
+ @model.vertex_count += 1
116
+ vert = nil
117
+ if array.size == 5
118
+ vert = Vector.new(Float(array[1]), Float(array[2]), Float(array[3]), Float(array[4]))
119
+ elsif array.size == 4
120
+ vert = Vector.new(Float(array[1]), Float(array[2]), Float(array[3]), 1.0)
121
+ else
122
+ raise
123
+ end
124
+ @model.current_object.vertices << vert
125
+ @model.vertices << vert
126
+ end
127
+
128
+ def add_normal(array)
129
+ vert = nil
130
+ if array.size == 5
131
+ vert = Vector.new(Float(array[1]), Float(array[2]), Float(array[3]), Float(array[4]))
132
+ elsif array.size == 4
133
+ vert = Vector.new(Float(array[1]), Float(array[2]), Float(array[3]), 1.0)
134
+ else
135
+ raise
136
+ end
137
+ @model.current_object.normals << vert
138
+ @model.normals << vert
139
+ end
140
+
141
+ def add_texture_coordinate(array)
142
+ texture = nil
143
+ if array.size == 4
144
+ texture = Vector.new(Float(array[1]), 1 - Float(array[2]), Float(array[3]))
145
+ elsif array.size == 3
146
+ texture = Vector.new(Float(array[1]), 1 - Float(array[2]), 1.0)
147
+ else
148
+ raise
149
+ end
150
+ @model.uvs << texture
151
+ @model.current_object.uvs << texture
152
+ end
153
+ end
154
+ end