cyberarm_engine 0.24.5 → 0.25.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.
- checksums.yaml +4 -4
- data/.gitignore +8 -8
- data/.rubocop.yml +7 -7
- data/.travis.yml +5 -5
- data/Gemfile +6 -6
- data/Gemfile.lock +25 -24
- data/LICENSE.txt +21 -21
- data/README.md +74 -74
- data/Rakefile +10 -10
- data/assets/shaders/fragment/g_buffer.glsl +30 -30
- data/assets/shaders/fragment/lighting.glsl +115 -115
- data/assets/shaders/include/light_struct.glsl +11 -11
- data/assets/shaders/include/material_struct.glsl +16 -16
- data/assets/shaders/vertex/g_buffer.glsl +28 -28
- data/assets/shaders/vertex/lighting.glsl +24 -24
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/cyberarm_engine.gemspec +36 -36
- data/lib/cyberarm_engine/animator.rb +219 -219
- data/lib/cyberarm_engine/background.rb +158 -180
- data/lib/cyberarm_engine/background_image.rb +93 -93
- data/lib/cyberarm_engine/background_nine_slice.rb +142 -142
- data/lib/cyberarm_engine/bounding_box.rb +150 -150
- data/lib/cyberarm_engine/builtin/intro_state.rb +130 -130
- data/lib/cyberarm_engine/cache/download_manager.rb +123 -123
- data/lib/cyberarm_engine/cache.rb +4 -4
- data/lib/cyberarm_engine/common.rb +131 -128
- data/lib/cyberarm_engine/config_file.rb +46 -46
- data/lib/cyberarm_engine/console/command.rb +157 -157
- data/lib/cyberarm_engine/console/commands/help_command.rb +43 -43
- data/lib/cyberarm_engine/console/subcommand.rb +99 -99
- data/lib/cyberarm_engine/console.rb +248 -248
- data/lib/cyberarm_engine/game_object.rb +244 -244
- data/lib/cyberarm_engine/game_state.rb +124 -124
- data/lib/cyberarm_engine/gosu_ext/draw_arc.rb +111 -98
- data/lib/cyberarm_engine/gosu_ext/draw_circle.rb +30 -30
- data/lib/cyberarm_engine/gosu_ext/draw_path.rb +17 -17
- data/lib/cyberarm_engine/model/material.rb +21 -21
- data/lib/cyberarm_engine/model/mesh.rb +131 -131
- data/lib/cyberarm_engine/model/parser.rb +74 -74
- data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -138
- data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -154
- data/lib/cyberarm_engine/model.rb +216 -216
- data/lib/cyberarm_engine/model_cache.rb +31 -31
- data/lib/cyberarm_engine/notification.rb +82 -82
- data/lib/cyberarm_engine/notification_manager.rb +241 -241
- data/lib/cyberarm_engine/opengl/light.rb +52 -52
- data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -46
- data/lib/cyberarm_engine/opengl/perspective_camera.rb +41 -41
- data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -249
- data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +167 -167
- data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +307 -307
- data/lib/cyberarm_engine/opengl/renderer/renderer.rb +33 -33
- data/lib/cyberarm_engine/opengl/shader.rb +408 -408
- data/lib/cyberarm_engine/opengl/texture.rb +69 -69
- data/lib/cyberarm_engine/opengl.rb +53 -53
- data/lib/cyberarm_engine/ray.rb +56 -56
- data/lib/cyberarm_engine/stats.rb +200 -200
- data/lib/cyberarm_engine/text.rb +260 -260
- data/lib/cyberarm_engine/timer.rb +23 -23
- data/lib/cyberarm_engine/transform.rb +296 -296
- data/lib/cyberarm_engine/trees/aabb_node.rb +126 -126
- data/lib/cyberarm_engine/trees/aabb_tree.rb +55 -55
- data/lib/cyberarm_engine/trees/aabb_tree_debug.rb +29 -29
- data/lib/cyberarm_engine/ui/border_canvas.rb +102 -102
- data/lib/cyberarm_engine/ui/dsl.rb +142 -142
- data/lib/cyberarm_engine/ui/element.rb +662 -662
- data/lib/cyberarm_engine/ui/elements/button.rb +100 -100
- data/lib/cyberarm_engine/ui/elements/check_box.rb +54 -54
- data/lib/cyberarm_engine/ui/elements/container.rb +407 -404
- data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -179
- data/lib/cyberarm_engine/ui/elements/edit_line.rb +297 -297
- data/lib/cyberarm_engine/ui/elements/flow.rb +15 -15
- data/lib/cyberarm_engine/ui/elements/image.rb +72 -72
- data/lib/cyberarm_engine/ui/elements/list_box.rb +79 -79
- data/lib/cyberarm_engine/ui/elements/menu.rb +27 -27
- data/lib/cyberarm_engine/ui/elements/menu_item.rb +6 -6
- data/lib/cyberarm_engine/ui/elements/progress.rb +93 -93
- data/lib/cyberarm_engine/ui/elements/radio.rb +6 -6
- data/lib/cyberarm_engine/ui/elements/slider.rb +107 -107
- data/lib/cyberarm_engine/ui/elements/stack.rb +11 -11
- data/lib/cyberarm_engine/ui/elements/text_block.rb +222 -216
- data/lib/cyberarm_engine/ui/elements/toggle_button.rb +67 -67
- data/lib/cyberarm_engine/ui/event.rb +54 -54
- data/lib/cyberarm_engine/ui/gui_state.rb +326 -321
- data/lib/cyberarm_engine/ui/style.rb +61 -50
- data/lib/cyberarm_engine/ui/theme.rb +225 -225
- data/lib/cyberarm_engine/vector.rb +312 -312
- data/lib/cyberarm_engine/version.rb +4 -4
- data/lib/cyberarm_engine/window.rb +195 -195
- data/lib/cyberarm_engine.rb +76 -70
- data/mrbgem.rake +29 -29
- metadata +3 -3
|
@@ -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
|