cyberarm_engine 0.25.0 → 0.30.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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -8
  3. data/.rubocop.yml +7 -7
  4. data/.travis.yml +5 -5
  5. data/Gemfile +6 -6
  6. data/Gemfile.lock +37 -25
  7. data/LICENSE.txt +21 -21
  8. data/README.md +74 -74
  9. data/Rakefile +10 -10
  10. data/assets/shaders/fragment/g_buffer.glsl +30 -30
  11. data/assets/shaders/fragment/lighting.glsl +115 -115
  12. data/assets/shaders/include/light_struct.glsl +11 -11
  13. data/assets/shaders/include/material_struct.glsl +16 -16
  14. data/assets/shaders/vertex/g_buffer.glsl +28 -28
  15. data/assets/shaders/vertex/lighting.glsl +24 -24
  16. data/assets/textures/ui/circle.png +0 -0
  17. data/assets/textures/ui/circle_small.png +0 -0
  18. data/assets/textures/ui/rounded.png +0 -0
  19. data/assets/textures/ui/rounded_bottom.png +0 -0
  20. data/assets/textures/ui/rounded_left.png +0 -0
  21. data/assets/textures/ui/rounded_left_bottom.png +0 -0
  22. data/assets/textures/ui/rounded_left_top.png +0 -0
  23. data/assets/textures/ui/rounded_right.png +0 -0
  24. data/assets/textures/ui/rounded_right_bottom.png +0 -0
  25. data/assets/textures/ui/rounded_right_top.png +0 -0
  26. data/assets/textures/ui/rounded_small.png +0 -0
  27. data/assets/textures/ui/rounded_tiny.png +0 -0
  28. data/assets/textures/ui/rounded_top.png +0 -0
  29. data/assets/textures/ui/square.png +0 -0
  30. data/bin/console +14 -14
  31. data/bin/setup +8 -8
  32. data/cyberarm_engine.gemspec +35 -36
  33. data/lib/cyberarm_engine/animator.rb +219 -219
  34. data/lib/cyberarm_engine/background.rb +156 -158
  35. data/lib/cyberarm_engine/background_image.rb +93 -93
  36. data/lib/cyberarm_engine/background_nine_slice.rb +182 -142
  37. data/lib/cyberarm_engine/bounding_box.rb +150 -150
  38. data/lib/cyberarm_engine/builtin/intro_state.rb +130 -130
  39. data/lib/cyberarm_engine/cache/download_manager.rb +123 -123
  40. data/lib/cyberarm_engine/cache.rb +4 -4
  41. data/lib/cyberarm_engine/common.rb +133 -131
  42. data/lib/cyberarm_engine/config_file.rb +46 -46
  43. data/lib/cyberarm_engine/console/command.rb +157 -157
  44. data/lib/cyberarm_engine/console/commands/help_command.rb +43 -43
  45. data/lib/cyberarm_engine/console/subcommand.rb +99 -99
  46. data/lib/cyberarm_engine/console.rb +248 -248
  47. data/lib/cyberarm_engine/event_bus.rb +39 -0
  48. data/lib/cyberarm_engine/game_object.rb +244 -244
  49. data/lib/cyberarm_engine/game_state.rb +134 -124
  50. data/lib/cyberarm_engine/gosu_ext/draw_arc.rb +111 -111
  51. data/lib/cyberarm_engine/gosu_ext/draw_circle.rb +30 -30
  52. data/lib/cyberarm_engine/gosu_ext/draw_path.rb +17 -17
  53. data/lib/cyberarm_engine/model/material.rb +21 -21
  54. data/lib/cyberarm_engine/model/mesh.rb +131 -131
  55. data/lib/cyberarm_engine/model/parser.rb +74 -74
  56. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -138
  57. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -154
  58. data/lib/cyberarm_engine/model.rb +216 -216
  59. data/lib/cyberarm_engine/model_cache.rb +31 -31
  60. data/lib/cyberarm_engine/notification.rb +82 -82
  61. data/lib/cyberarm_engine/notification_manager.rb +241 -241
  62. data/lib/cyberarm_engine/opengl/light.rb +52 -52
  63. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -46
  64. data/lib/cyberarm_engine/opengl/perspective_camera.rb +41 -41
  65. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -249
  66. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +167 -167
  67. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +307 -307
  68. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +33 -33
  69. data/lib/cyberarm_engine/opengl/shader.rb +408 -408
  70. data/lib/cyberarm_engine/opengl/texture.rb +69 -69
  71. data/lib/cyberarm_engine/opengl.rb +53 -53
  72. data/lib/cyberarm_engine/pathfinding/graph.rb +64 -0
  73. data/lib/cyberarm_engine/pathfinding/graph_search.rb +6 -0
  74. data/lib/cyberarm_engine/pathfinding/graph_searches/astar_search.rb +6 -0
  75. data/lib/cyberarm_engine/pathfinding/graph_searches/breadth_first_search.rb +27 -0
  76. data/lib/cyberarm_engine/pathfinding/graph_searches/dijkstra_search.rb +6 -0
  77. data/lib/cyberarm_engine/pathfinding/graphs/grid.rb +52 -0
  78. data/lib/cyberarm_engine/ray.rb +56 -56
  79. data/lib/cyberarm_engine/result.rb +19 -0
  80. data/lib/cyberarm_engine/stats.rb +200 -200
  81. data/lib/cyberarm_engine/text.rb +288 -260
  82. data/lib/cyberarm_engine/timer.rb +27 -23
  83. data/lib/cyberarm_engine/transform.rb +296 -296
  84. data/lib/cyberarm_engine/trees/aabb_node.rb +126 -126
  85. data/lib/cyberarm_engine/trees/aabb_tree.rb +55 -55
  86. data/lib/cyberarm_engine/trees/aabb_tree_debug.rb +29 -29
  87. data/lib/cyberarm_engine/ui/border_canvas.rb +102 -102
  88. data/lib/cyberarm_engine/ui/dialog.rb +24 -0
  89. data/lib/cyberarm_engine/ui/dsl.rb +170 -142
  90. data/lib/cyberarm_engine/ui/element.rb +664 -662
  91. data/lib/cyberarm_engine/ui/elements/button.rb +99 -100
  92. data/lib/cyberarm_engine/ui/elements/check_box.rb +58 -54
  93. data/lib/cyberarm_engine/ui/elements/container.rb +413 -407
  94. data/lib/cyberarm_engine/ui/elements/edit_box.rb +200 -179
  95. data/lib/cyberarm_engine/ui/elements/edit_line.rb +299 -297
  96. data/lib/cyberarm_engine/ui/elements/flow.rb +15 -15
  97. data/lib/cyberarm_engine/ui/elements/image.rb +78 -72
  98. data/lib/cyberarm_engine/ui/elements/list_box.rb +79 -79
  99. data/lib/cyberarm_engine/ui/elements/menu.rb +27 -27
  100. data/lib/cyberarm_engine/ui/elements/menu_item.rb +6 -6
  101. data/lib/cyberarm_engine/ui/elements/progress.rb +95 -93
  102. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -6
  103. data/lib/cyberarm_engine/ui/elements/slider.rb +111 -107
  104. data/lib/cyberarm_engine/ui/elements/stack.rb +11 -11
  105. data/lib/cyberarm_engine/ui/elements/text_block.rb +236 -222
  106. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +71 -67
  107. data/lib/cyberarm_engine/ui/elements/widget.rb +45 -0
  108. data/lib/cyberarm_engine/ui/event.rb +54 -54
  109. data/lib/cyberarm_engine/ui/gui_state.rb +402 -326
  110. data/lib/cyberarm_engine/ui/page.rb +39 -0
  111. data/lib/cyberarm_engine/ui/style.rb +94 -61
  112. data/lib/cyberarm_engine/ui/theme.rb +237 -225
  113. data/lib/cyberarm_engine/vector.rb +312 -312
  114. data/lib/cyberarm_engine/version.rb +4 -4
  115. data/lib/cyberarm_engine/window.rb +234 -195
  116. data/lib/cyberarm_engine.rb +88 -76
  117. data/mrbgem.rake +29 -29
  118. metadata +30 -5
@@ -1,131 +1,131 @@
1
- module CyberarmEngine
2
- class Model
3
- class Mesh
4
- attr_reader :id, :name, :vertices, :uvs, :normals, :materials, :bounding_box, :debug_color
5
- attr_accessor :faces, :scale
6
-
7
- def initialize(id, name)
8
- @id = id
9
- @name = name
10
- @vertices = []
11
- @uvs = []
12
- @normals = []
13
- @faces = []
14
- @materials = []
15
- @bounding_box = BoundingBox.new
16
- @debug_color = Color.new(1.0, 1.0, 1.0)
17
-
18
- @scale = 1.0
19
-
20
- # Faces array packs everything:
21
- # vertex = index[0]
22
- # uv = index[1]
23
- # normal = index[2]
24
- # material = index[3]
25
- end
26
-
27
- def has_texture?
28
- @materials.find { |mat| mat.texture_id } ? true : false
29
- end
30
-
31
- def reflatten
32
- @vertices_list = nil
33
- @uvs_list = nil
34
- @normals_list = nil
35
-
36
- flattened_vertices
37
- flattened_uvs
38
- flattened_normals
39
- end
40
-
41
- def flattened_vertices
42
- unless @vertices_list
43
- @debug_color = @faces.first.material.diffuse
44
-
45
- list = []
46
- @faces.each do |face|
47
- face.vertices.each do |v|
48
- next unless v
49
-
50
- list << v.x * @scale
51
- list << v.y * @scale
52
- list << v.z * @scale
53
- list << v.weight
54
- end
55
- end
56
-
57
- @vertices_list_size = list.size
58
- @vertices_list = list.pack("f*")
59
- end
60
-
61
- @vertices_list
62
- end
63
-
64
- def flattened_vertices_size
65
- @vertices_list_size
66
- end
67
-
68
- def flattened_uvs
69
- unless @uvs_list
70
- list = []
71
- @faces.each do |face|
72
- face.uvs.each do |v|
73
- next unless v
74
-
75
- list << v.x
76
- list << v.y
77
- list << v.z
78
- end
79
- end
80
-
81
- @uvs_list_size = list.size
82
- @uvs_list = list.pack("f*")
83
- end
84
-
85
- @uvs_list
86
- end
87
-
88
- def flattened_normals
89
- unless @normals_list
90
- list = []
91
- @faces.each do |face|
92
- face.normals.each do |n|
93
- next unless n
94
-
95
- list << n.x
96
- list << n.y
97
- list << n.z
98
- end
99
- end
100
-
101
- @normals_list_size = list.size
102
- @normals_list = list.pack("f*")
103
- end
104
-
105
- @normals_list
106
- end
107
-
108
- def flattened_materials
109
- unless @materials_list
110
- list = []
111
- @faces.each do |face|
112
- material = face.material
113
- next unless material
114
-
115
- face.vertices.each do # Add material to each vertex
116
- list << material.diffuse.red
117
- list << material.diffuse.green
118
- list << material.diffuse.blue
119
- # list << material.alpha
120
- end
121
- end
122
-
123
- @materials_list_size = list.size
124
- @materials_list = list.pack("f*")
125
- end
126
-
127
- @materials_list
128
- end
129
- end
130
- end
131
- end
1
+ module CyberarmEngine
2
+ class Model
3
+ class Mesh
4
+ attr_reader :id, :name, :vertices, :uvs, :normals, :materials, :bounding_box, :debug_color
5
+ attr_accessor :faces, :scale
6
+
7
+ def initialize(id, name)
8
+ @id = id
9
+ @name = name
10
+ @vertices = []
11
+ @uvs = []
12
+ @normals = []
13
+ @faces = []
14
+ @materials = []
15
+ @bounding_box = BoundingBox.new
16
+ @debug_color = Color.new(1.0, 1.0, 1.0)
17
+
18
+ @scale = 1.0
19
+
20
+ # Faces array packs everything:
21
+ # vertex = index[0]
22
+ # uv = index[1]
23
+ # normal = index[2]
24
+ # material = index[3]
25
+ end
26
+
27
+ def has_texture?
28
+ @materials.find { |mat| mat.texture_id } ? true : false
29
+ end
30
+
31
+ def reflatten
32
+ @vertices_list = nil
33
+ @uvs_list = nil
34
+ @normals_list = nil
35
+
36
+ flattened_vertices
37
+ flattened_uvs
38
+ flattened_normals
39
+ end
40
+
41
+ def flattened_vertices
42
+ unless @vertices_list
43
+ @debug_color = @faces.first.material.diffuse
44
+
45
+ list = []
46
+ @faces.each do |face|
47
+ face.vertices.each do |v|
48
+ next unless v
49
+
50
+ list << v.x * @scale
51
+ list << v.y * @scale
52
+ list << v.z * @scale
53
+ list << v.weight
54
+ end
55
+ end
56
+
57
+ @vertices_list_size = list.size
58
+ @vertices_list = list.pack("f*")
59
+ end
60
+
61
+ @vertices_list
62
+ end
63
+
64
+ def flattened_vertices_size
65
+ @vertices_list_size
66
+ end
67
+
68
+ def flattened_uvs
69
+ unless @uvs_list
70
+ list = []
71
+ @faces.each do |face|
72
+ face.uvs.each do |v|
73
+ next unless v
74
+
75
+ list << v.x
76
+ list << v.y
77
+ list << v.z
78
+ end
79
+ end
80
+
81
+ @uvs_list_size = list.size
82
+ @uvs_list = list.pack("f*")
83
+ end
84
+
85
+ @uvs_list
86
+ end
87
+
88
+ def flattened_normals
89
+ unless @normals_list
90
+ list = []
91
+ @faces.each do |face|
92
+ face.normals.each do |n|
93
+ next unless n
94
+
95
+ list << n.x
96
+ list << n.y
97
+ list << n.z
98
+ end
99
+ end
100
+
101
+ @normals_list_size = list.size
102
+ @normals_list = list.pack("f*")
103
+ end
104
+
105
+ @normals_list
106
+ end
107
+
108
+ def flattened_materials
109
+ unless @materials_list
110
+ list = []
111
+ @faces.each do |face|
112
+ material = face.material
113
+ next unless material
114
+
115
+ face.vertices.each do # Add material to each vertex
116
+ list << material.diffuse.red
117
+ list << material.diffuse.green
118
+ list << material.diffuse.blue
119
+ # list << material.alpha
120
+ end
121
+ end
122
+
123
+ @materials_list_size = list.size
124
+ @materials_list = list.pack("f*")
125
+ end
126
+
127
+ @materials_list
128
+ end
129
+ end
130
+ end
131
+ end
@@ -1,74 +1,74 @@
1
- module CyberarmEngine
2
- TextureCoordinate = Struct.new(:u, :v, :weight)
3
- Point = Struct.new(:x, :y)
4
- Color = Struct.new(:red, :green, :blue, :alpha)
5
- Face = Struct.new(:vertices, :uvs, :normals, :colors, :material, :smoothing)
6
-
7
- class Model
8
- class Parser
9
- @@parsers = []
10
-
11
- def self.handles
12
- raise NotImplementedError,
13
- "Model::Parser#handles must return an array of file extensions that this parser supports"
14
- end
15
-
16
- def self.inherited(parser)
17
- @@parsers << parser
18
- end
19
-
20
- def self.find(file_type)
21
- @@parsers.find do |parser|
22
- parser.handles.include?(file_type)
23
- end
24
- end
25
-
26
- def self.supported_formats
27
- @@parsers.map { |parser| parser.handles }.flatten.map { |s| ".#{s}" }.join(", ")
28
- end
29
-
30
- def initialize(model)
31
- @model = model
32
- end
33
-
34
- def parse
35
- end
36
-
37
- def set_object(id: nil, name: nil)
38
- _model = nil
39
-
40
- if id
41
- _model = @model.objects.find { |o| o.id == id }
42
- elsif name
43
- _model = @model.objects.find { |o| o.name == name }
44
- else
45
- raise "Must provide either an id: or name:"
46
- end
47
-
48
- if _model
49
- @model.current_object = _model
50
- else
51
- raise "Couldn't find Mesh!"
52
- end
53
- end
54
-
55
- def change_object(id, name)
56
- @model.objects << Model::Mesh.new(id, name)
57
- @model.current_object = @model.objects.last
58
- end
59
-
60
- def set_material(name)
61
- @model.current_material = name
62
- @model.current_object.materials << current_material
63
- end
64
-
65
- def add_material(name, material)
66
- @model.materials[name] = material
67
- end
68
-
69
- def current_material
70
- @model.materials[@model.current_material]
71
- end
72
- end
73
- end
74
- end
1
+ module CyberarmEngine
2
+ TextureCoordinate = Struct.new(:u, :v, :weight)
3
+ Point = Struct.new(:x, :y)
4
+ Color = Struct.new(:red, :green, :blue, :alpha)
5
+ Face = Struct.new(:vertices, :uvs, :normals, :colors, :material, :smoothing)
6
+
7
+ class Model
8
+ class Parser
9
+ @@parsers = []
10
+
11
+ def self.handles
12
+ raise NotImplementedError,
13
+ "Model::Parser#handles must return an array of file extensions that this parser supports"
14
+ end
15
+
16
+ def self.inherited(parser)
17
+ @@parsers << parser
18
+ end
19
+
20
+ def self.find(file_type)
21
+ @@parsers.find do |parser|
22
+ parser.handles.include?(file_type)
23
+ end
24
+ end
25
+
26
+ def self.supported_formats
27
+ @@parsers.map { |parser| parser.handles }.flatten.map { |s| ".#{s}" }.join(", ")
28
+ end
29
+
30
+ def initialize(model)
31
+ @model = model
32
+ end
33
+
34
+ def parse
35
+ end
36
+
37
+ def set_object(id: nil, name: nil)
38
+ _model = nil
39
+
40
+ if id
41
+ _model = @model.objects.find { |o| o.id == id }
42
+ elsif name
43
+ _model = @model.objects.find { |o| o.name == name }
44
+ else
45
+ raise "Must provide either an id: or name:"
46
+ end
47
+
48
+ if _model
49
+ @model.current_object = _model
50
+ else
51
+ raise "Couldn't find Mesh!"
52
+ end
53
+ end
54
+
55
+ def change_object(id, name)
56
+ @model.objects << Model::Mesh.new(id, name)
57
+ @model.current_object = @model.objects.last
58
+ end
59
+
60
+ def set_material(name)
61
+ @model.current_material = name
62
+ @model.current_object.materials << current_material
63
+ end
64
+
65
+ def add_material(name, material)
66
+ @model.materials[name] = material
67
+ end
68
+
69
+ def current_material
70
+ @model.materials[@model.current_material]
71
+ end
72
+ end
73
+ end
74
+ end
@@ -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