assimp-ffi 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +25 -0
- data/README.md +2 -0
- data/assimp.gemspec +14 -0
- data/lib/assimp/anim.rb +131 -0
- data/lib/assimp/base.rb +197 -0
- data/lib/assimp/camera.rb +25 -0
- data/lib/assimp/color4.rb +24 -0
- data/lib/assimp/config.rb +34 -0
- data/lib/assimp/defs.rb +25 -0
- data/lib/assimp/export.rb +58 -0
- data/lib/assimp/fileio.rb +48 -0
- data/lib/assimp/import.rb +226 -0
- data/lib/assimp/importerdesc.rb +42 -0
- data/lib/assimp/light.rb +49 -0
- data/lib/assimp/material.rb +407 -0
- data/lib/assimp/matrix3x3.rb +100 -0
- data/lib/assimp/matrix4x4.rb +178 -0
- data/lib/assimp/mesh.rb +250 -0
- data/lib/assimp/metadata.rb +53 -0
- data/lib/assimp/postprocess.rb +81 -0
- data/lib/assimp/quaternion.rb +47 -0
- data/lib/assimp/scene.rb +168 -0
- data/lib/assimp/texture.rb +31 -0
- data/lib/assimp/types.rb +93 -0
- data/lib/assimp/vector2.rb +14 -0
- data/lib/assimp/vector3.rb +99 -0
- data/lib/assimp/version.rb +52 -0
- data/lib/assimp-ffi.rb +25 -0
- metadata +92 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c2f350f15b0e5131cd2404dadc2a26aad6d818abf3eab0fb7766e47e99eef6cd
|
4
|
+
data.tar.gz: d28e89aefa90d07b6a0e04812d0590b7fd117ac5b3cc933920d549e0813b521c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f13d6c65bc8a7074c0e9b1b471d2667707ab14f20890bfb951e703bb77f2d17e4c765252884ff0ac2c226e72680bd47273d7715f1f13de2fe33f5a7b8b5c379c
|
7
|
+
data.tar.gz: 61796c36f6d41e14e116a1e3c5d831e2534175298ab7af5eeead0bf31dfb619253f154a62d0b14bb1403dd8aa3ba1f293a04079448a50e7f5d6371eaf4e23fd9
|
data/LICENSE
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
BSD 2-Clause License
|
2
|
+
|
3
|
+
Copyright (c) 2019, Brice Videau
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
7
|
+
modification, are permitted provided that the following conditions are met:
|
8
|
+
|
9
|
+
* Redistributions of source code must retain the above copyright notice, this
|
10
|
+
list of conditions and the following disclaimer.
|
11
|
+
|
12
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
14
|
+
and/or other materials provided with the distribution.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
20
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
21
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
22
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
23
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
24
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
data/assimp.gemspec
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'assimp-ffi'
|
3
|
+
s.version = "0.1.0"
|
4
|
+
s.author = "Brice Videau"
|
5
|
+
s.email = "brice.videau@imag.fr"
|
6
|
+
s.homepage = "https://github.com/Kerilk/assimp-ruby"
|
7
|
+
s.summary = "Open Asset Import Library bindings"
|
8
|
+
s.description = "FFI bindings of Assimp (Open Asset Import Library bindings) for version 4.1.0 onward"
|
9
|
+
s.files = Dir['assimp.gemspec', 'LICENSE', 'README.md', 'lib/**/*']
|
10
|
+
s.has_rdoc = false
|
11
|
+
s.license = 'BSD-2-Clause'
|
12
|
+
s.required_ruby_version = '>= 2.1.0'
|
13
|
+
s.add_dependency 'ffi', '~> 1.9', '>=1.9.19'
|
14
|
+
end
|
data/lib/assimp/anim.rb
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
module Assimp
|
2
|
+
|
3
|
+
class VectorKey < FFI::Struct
|
4
|
+
extend StructAccessors
|
5
|
+
layout :time, :double,
|
6
|
+
:value, Vector3D
|
7
|
+
struct_attr_accessor :time,
|
8
|
+
:value
|
9
|
+
end
|
10
|
+
|
11
|
+
class QuatKey < FFI::Struct
|
12
|
+
extend StructAccessors
|
13
|
+
layout :time, :double,
|
14
|
+
:value, Quaternion
|
15
|
+
struct_attr_accessor :time,
|
16
|
+
:value
|
17
|
+
end
|
18
|
+
|
19
|
+
class MeshKey < FFI::Struct
|
20
|
+
extend StructAccessors
|
21
|
+
layout :time, :double,
|
22
|
+
:value, :uint
|
23
|
+
struct_attr_accessor :time,
|
24
|
+
:value
|
25
|
+
end
|
26
|
+
|
27
|
+
class MeshMorphKey < FFI::Struct
|
28
|
+
extend StructAccessors
|
29
|
+
layout :time, :double,
|
30
|
+
:values, :pointer, #uint[num_values_and_weights]
|
31
|
+
:weights, :pointer, #double[num_values_and_weights]
|
32
|
+
:num_values_and_weights, :uint
|
33
|
+
struct_attr_accessor :time,
|
34
|
+
:num_values_and_weights
|
35
|
+
struct_array_attr_accessor [:values, :uint, :num_values_and_weights],
|
36
|
+
[:weights, :double, :num_values_and_weights]
|
37
|
+
end
|
38
|
+
|
39
|
+
AnimBehaviour = enum(:anim_behavior, [
|
40
|
+
:DEFAULT,
|
41
|
+
:CONSTANT,
|
42
|
+
:LINEAR,
|
43
|
+
:REPEAT
|
44
|
+
])
|
45
|
+
|
46
|
+
class NodeAnim < FFI::Struct
|
47
|
+
extend StructAccessors
|
48
|
+
layout :node_name, String,
|
49
|
+
:num_position_keys, :uint,
|
50
|
+
:position_keys, :pointer, #VectorKey
|
51
|
+
:num_rotation_keys, :uint,
|
52
|
+
:rotation_keys, :pointer, #QuatKey
|
53
|
+
:num_scaling_keys, :uint,
|
54
|
+
:scaling_keys, :pointer, #VectorKey
|
55
|
+
:pre_state, AnimBehaviour,
|
56
|
+
:post_state, AnimBehaviour
|
57
|
+
struct_attr_accessor :node_name,
|
58
|
+
:num_position_keys,
|
59
|
+
:num_rotation_keys,
|
60
|
+
:num_scaling_keys,
|
61
|
+
:pre_state,
|
62
|
+
:post_state
|
63
|
+
|
64
|
+
struct_array_attr_accessor [:position_keys, VectorKey],
|
65
|
+
[:rotation_keys, QuatKey],
|
66
|
+
[:scaling_keys, VectorKey]
|
67
|
+
|
68
|
+
def to_s
|
69
|
+
node_name
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
class MeshAnim < FFI::Struct
|
75
|
+
extend StructAccessors
|
76
|
+
layout :name, String,
|
77
|
+
:num_keys, :uint,
|
78
|
+
:keys, :pointer #MeshKey
|
79
|
+
struct_attr_accessor :name,
|
80
|
+
:num_keys
|
81
|
+
struct_array_attr_accessor [:keys, MeshKey]
|
82
|
+
|
83
|
+
def to_s
|
84
|
+
name
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
class MeshMorphAnim < FFI::Struct
|
90
|
+
extend StructAccessors
|
91
|
+
layout :name, String,
|
92
|
+
:num_keys, :uint,
|
93
|
+
:keys, :pointer #MeshMorphKey
|
94
|
+
struct_attr_accessor :name,
|
95
|
+
:num_keys
|
96
|
+
struct_array_attr_accessor [:keys, MeshMorphKey]
|
97
|
+
|
98
|
+
def to_s
|
99
|
+
name
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
class Animation < FFI::Struct
|
105
|
+
extend StructAccessors
|
106
|
+
layout :name, String,
|
107
|
+
:duration, :double,
|
108
|
+
:ticks_per_second, :double,
|
109
|
+
:num_channels, :uint,
|
110
|
+
:channels, :pointer, #NodeAnim*
|
111
|
+
:num_mesh_channels, :uint,
|
112
|
+
:mesh_channels, :pointer, #MeshAnim*
|
113
|
+
:num_morph_mesh_channels, :uint,
|
114
|
+
:morph_mesh_channels, :pointer #MeshMorphAnim*
|
115
|
+
struct_attr_accessor :name,
|
116
|
+
:duration,
|
117
|
+
:ticks_per_second,
|
118
|
+
:num_channels,
|
119
|
+
:num_mesh_channels,
|
120
|
+
:num_morph_mesh_channels
|
121
|
+
struct_ref_array_attr_accessor [:channels, NodeAnim],
|
122
|
+
[:mesh_channels, MeshAnim],
|
123
|
+
[:morph_mesh_channels, MeshMorphAnim]
|
124
|
+
|
125
|
+
def to_s
|
126
|
+
name
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
data/lib/assimp/base.rb
ADDED
@@ -0,0 +1,197 @@
|
|
1
|
+
module Assimp
|
2
|
+
extend FFI::Library
|
3
|
+
ffi_lib 'assimp'
|
4
|
+
|
5
|
+
class String < FFI::Struct
|
6
|
+
end
|
7
|
+
|
8
|
+
module StructAccessors
|
9
|
+
|
10
|
+
def self.extended(mod)
|
11
|
+
mod.instance_variable_set(:@__has_ref, false)
|
12
|
+
end
|
13
|
+
|
14
|
+
def has_ref?
|
15
|
+
@__has_ref
|
16
|
+
end
|
17
|
+
|
18
|
+
def struct_attr_reader(*args)
|
19
|
+
args.each { |attr|
|
20
|
+
raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
|
21
|
+
if @layout[attr].type.kind_of?( FFI::StructByValue ) && @layout[attr].type.struct_class == Assimp::String
|
22
|
+
define_method(attr) { self[attr].data }
|
23
|
+
else
|
24
|
+
define_method(attr) { self[attr] }
|
25
|
+
end
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def struct_attr_writer(*args)
|
30
|
+
args.each { |attr|
|
31
|
+
raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
|
32
|
+
if @layout[attr].type.kind_of?( FFI::StructByValue ) && @layout[attr].type.struct_class == Assimp::String
|
33
|
+
define_method(attr.to_s+"=") { |o| self[attr].data = o }
|
34
|
+
elsif @layout[attr].type.kind_of?( FFI::StructByValue ) && @layout[attr].type.struct_class.has_ref?
|
35
|
+
@__has_ref = true
|
36
|
+
define_method(attr.to_s+"=") { |o| self.instance_variable_set(:"@#{attr}", o); self[attr] = o }
|
37
|
+
else
|
38
|
+
define_method(attr.to_s+"=") { |o| self[attr] = o }
|
39
|
+
end
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
def struct_attr_accessor(*args)
|
44
|
+
struct_attr_reader(*args)
|
45
|
+
struct_attr_writer(*args)
|
46
|
+
end
|
47
|
+
|
48
|
+
def struct_array_attr_reader(*args)
|
49
|
+
args.each { |attr, klass, count|
|
50
|
+
raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
|
51
|
+
t = nil
|
52
|
+
s = nil
|
53
|
+
if klass.kind_of? Symbol
|
54
|
+
t = Assimp::find_type(klass)
|
55
|
+
s = t.size
|
56
|
+
define_method(attr) do
|
57
|
+
n = ( count ? self[count] : self[:"num_#{attr}"] )
|
58
|
+
p = self[attr]
|
59
|
+
if n == 0 || p.null?
|
60
|
+
[]
|
61
|
+
else
|
62
|
+
n.times.collect { |i|
|
63
|
+
p.get(t, i*s)
|
64
|
+
}
|
65
|
+
end
|
66
|
+
end
|
67
|
+
elsif klass.kind_of?(Class) && klass < FFI::Struct
|
68
|
+
s = klass.size
|
69
|
+
define_method(attr) do
|
70
|
+
n = ( count ? self[count] : self[:"num_#{attr}"] )
|
71
|
+
p = self[attr]
|
72
|
+
if n == 0 || p.null?
|
73
|
+
[]
|
74
|
+
else
|
75
|
+
n.times.collect { |i|
|
76
|
+
klass.new(p+i*s)
|
77
|
+
}
|
78
|
+
end
|
79
|
+
end
|
80
|
+
else
|
81
|
+
raise "Invalid type: #{klass.inspect} for #{attr.inspect}!"
|
82
|
+
end
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
def struct_array_attr_writer(*args)
|
87
|
+
args.each { |attr, klass, count|
|
88
|
+
raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
|
89
|
+
@__has_ref = true
|
90
|
+
t = nil
|
91
|
+
s = nil
|
92
|
+
if klass.kind_of? Symbol
|
93
|
+
t = Assimp::find_type(klass)
|
94
|
+
s = t.size
|
95
|
+
define_method(:"#{attr}=") do |values|
|
96
|
+
values = [] if values.nil?
|
97
|
+
if count
|
98
|
+
self[count] = values.length
|
99
|
+
else
|
100
|
+
self[:"num_#{attr}"] = values.length
|
101
|
+
end
|
102
|
+
ptr = (values.length == 0 ? nil : FFI::MemoryPointer::new(t, values.length))
|
103
|
+
values.each_with_index { |v, i|
|
104
|
+
ptr.put(t, i*s, v)
|
105
|
+
}
|
106
|
+
self.instance_variable_set(:"@#{attr}", ptr)
|
107
|
+
self[attr] = ptr
|
108
|
+
values
|
109
|
+
end
|
110
|
+
elsif klass.kind_of?(Class) && klass < FFI::Struct
|
111
|
+
s = klass.size
|
112
|
+
k = klass
|
113
|
+
define_method(:"#{attr}=") do |values|
|
114
|
+
values = [] if values.nil?
|
115
|
+
if count
|
116
|
+
self[count] = values.length
|
117
|
+
else
|
118
|
+
self[:"num_#{attr}"] = values.length
|
119
|
+
end
|
120
|
+
ptr = (values.length == 0 ? nil : FFI::MemoryPointer::new(klass, values.length))
|
121
|
+
values.each_with_index { |v, i|
|
122
|
+
ptr.put_array_of_uint8(i*s, v.pointer.read_array_of_uint8(s))
|
123
|
+
}
|
124
|
+
if k.has_ref?
|
125
|
+
self.instance_variable_set(:"@#{attr}", [ptr, values])
|
126
|
+
else
|
127
|
+
self.instance_variable_set(:"@#{attr}", ptr)
|
128
|
+
end
|
129
|
+
self[attr] = ptr
|
130
|
+
values
|
131
|
+
end
|
132
|
+
else
|
133
|
+
raise "Invalid type: #{klass.inspect} for #{attr.inspect}!"
|
134
|
+
end
|
135
|
+
}
|
136
|
+
end
|
137
|
+
|
138
|
+
def struct_array_attr_checker(*args)
|
139
|
+
args.each { |attr, klass, count|
|
140
|
+
raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
|
141
|
+
define_method(:"#{attr}?") do
|
142
|
+
! self[attr].null?
|
143
|
+
end
|
144
|
+
}
|
145
|
+
end
|
146
|
+
|
147
|
+
def struct_array_attr_accessor(*args)
|
148
|
+
struct_array_attr_reader(*args)
|
149
|
+
struct_array_attr_writer(*args)
|
150
|
+
struct_array_attr_checker(*args)
|
151
|
+
end
|
152
|
+
|
153
|
+
def struct_ref_array_attr_reader(*args)
|
154
|
+
args.each { |attr, klass, count|
|
155
|
+
raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
|
156
|
+
define_method(attr) do
|
157
|
+
n = ( count ? self[count] : self[:"num_#{attr}"] )
|
158
|
+
p = self[attr]
|
159
|
+
if n == 0 || p.null?
|
160
|
+
[]
|
161
|
+
else
|
162
|
+
ptrs = p.read_array_of_pointer(self[:"num_#{attr}"])
|
163
|
+
ptrs.collect { |ptr| ptr.null? ? nil : klass::new(ptr) }
|
164
|
+
end
|
165
|
+
end
|
166
|
+
}
|
167
|
+
end
|
168
|
+
|
169
|
+
def struct_ref_array_attr_writer(*args)
|
170
|
+
args.each { |attr, klass, count|
|
171
|
+
raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
|
172
|
+
@__has_ref = true
|
173
|
+
define_method(:"#{attr}=") do |values|
|
174
|
+
values = [] if values.nil?
|
175
|
+
if count
|
176
|
+
self[count] = values.length
|
177
|
+
else
|
178
|
+
self[:"num_#{attr}"] = values.length
|
179
|
+
end
|
180
|
+
ptr = (values.length == 0 ? nil : FFI::MemoryPointer::new(:pointer, values.length))
|
181
|
+
ptr.write_array_of_pointer(values.collect(&:pointer)) if ptr
|
182
|
+
self.instance_variable_set(:"@#{attr}", [ptr, values.dup])
|
183
|
+
self[attr] = ptr
|
184
|
+
values
|
185
|
+
end
|
186
|
+
}
|
187
|
+
end
|
188
|
+
|
189
|
+
def struct_ref_array_attr_accessor(*args)
|
190
|
+
struct_ref_array_attr_reader(*args)
|
191
|
+
struct_ref_array_attr_writer(*args)
|
192
|
+
struct_array_attr_checker(*args)
|
193
|
+
end
|
194
|
+
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Assimp
|
2
|
+
|
3
|
+
class Camera < FFI::Struct
|
4
|
+
extend StructAccessors
|
5
|
+
layout :name, String,
|
6
|
+
:position, Vector3D,
|
7
|
+
:up, Vector3D,
|
8
|
+
:look_at, Vector3D,
|
9
|
+
:horizontal_fov, :float,
|
10
|
+
:clip_plane_near, :float,
|
11
|
+
:aspect, :float
|
12
|
+
struct_attr_accessor :name,
|
13
|
+
:position,
|
14
|
+
:up,
|
15
|
+
:look_at,
|
16
|
+
:horizontal_fov,
|
17
|
+
:clip_plane_near,
|
18
|
+
:aspect
|
19
|
+
def to_s
|
20
|
+
name
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Assimp
|
2
|
+
|
3
|
+
class Color4D < FFI::Struct
|
4
|
+
extend StructAccessors
|
5
|
+
layout :r, :ai_real,
|
6
|
+
:g, :ai_real,
|
7
|
+
:b, :ai_real,
|
8
|
+
:a, :ai_real
|
9
|
+
struct_attr_accessor :r, :g, :b, :a
|
10
|
+
|
11
|
+
def set(r, g, b, a)
|
12
|
+
self.r = r
|
13
|
+
self.g = g
|
14
|
+
self.b = b
|
15
|
+
self.a = a
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
"[#{r}, #{g}, #{b}, #{a}]"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Assimp
|
2
|
+
|
3
|
+
Components = bitmask(:components, [
|
4
|
+
:NORMALS, 1,
|
5
|
+
:TANGENTS_AND_BITANGENTS,
|
6
|
+
:COLORS,
|
7
|
+
:TEXCOORDS,
|
8
|
+
:BONEWEIGHTS,
|
9
|
+
:ANIMATIONS,
|
10
|
+
:TEXTURES,
|
11
|
+
:LIGHTS,
|
12
|
+
:CAMERAS,
|
13
|
+
:MESHES,
|
14
|
+
:MATERIALS,
|
15
|
+
:COLORS0, 20,
|
16
|
+
:COLORS1,
|
17
|
+
:COLORS2,
|
18
|
+
:COLORS3,
|
19
|
+
:COLORS4,
|
20
|
+
:TEXCOORDS0, 25,
|
21
|
+
:TEXCOORDS1,
|
22
|
+
:TEXCOORDS2,
|
23
|
+
:TEXCOORDS3,
|
24
|
+
:TEXCOORDS4,
|
25
|
+
:TEXCOORDS5,
|
26
|
+
:TEXCOORDS6,
|
27
|
+
])
|
28
|
+
|
29
|
+
UVTRAFO_SCALING = 0x1
|
30
|
+
UVTRAFO_ROTATION = 0x2
|
31
|
+
UVTRAFO_TRANSLATION = 0x4
|
32
|
+
UVTRAFO_ALL = UVTRAFO_SCALING | UVTRAFO_ROTATION | UVTRAFO_TRANSLATION
|
33
|
+
|
34
|
+
end
|
data/lib/assimp/defs.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Assimp
|
2
|
+
|
3
|
+
if ENV["ASSIMP_DOUBLE_PRECISION"]
|
4
|
+
typedef :double, :ai_real
|
5
|
+
typedef :long_long, :ai_int
|
6
|
+
typedef :ulong_long, :ai_uint
|
7
|
+
else
|
8
|
+
typedef :float, :ai_real
|
9
|
+
typedef :int, :ai_int
|
10
|
+
typedef :uint, :ai_uint
|
11
|
+
end
|
12
|
+
|
13
|
+
MATH_PI = 3.141592653589793238462643383279
|
14
|
+
MATH_TWO_PI = MATH_PI * 2.0
|
15
|
+
MATH_HALF_PI = MATH_PI * 0.5
|
16
|
+
|
17
|
+
def deg_to_rad(x)
|
18
|
+
x * 0.0174532925
|
19
|
+
end
|
20
|
+
|
21
|
+
def rad_to_deg(x)
|
22
|
+
x * 57.2957795
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Assimp
|
2
|
+
|
3
|
+
class ExportFormatDesc < FFI::ManagedStruct
|
4
|
+
extend StructAccessors
|
5
|
+
layout :id, :string,
|
6
|
+
:description, :string,
|
7
|
+
:file_extension, :string
|
8
|
+
struct_attr_reader :id,
|
9
|
+
:description,
|
10
|
+
:file_extension
|
11
|
+
|
12
|
+
def self.release(ptr)
|
13
|
+
Assimp::aiReleaseExportFormatDescription(ptr)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
attach_function :aiGetExportFormatCount, [], :size_t
|
19
|
+
attach_function :aiGetExportFormatDescription, [:size_t], ExportFormatDesc.ptr
|
20
|
+
attach_function :aiReleaseExportFormatDescription, [ExportFormatDesc.ptr], :void
|
21
|
+
|
22
|
+
def self.export_format_descriptions
|
23
|
+
count = Assimp::aiGetExportFormatCount
|
24
|
+
count.times.collect { |i|
|
25
|
+
Assimp::aiGetExportFormatDescription(i)
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
attach_function :aiCopyScene, [Scene.ptr, :pointer], :void
|
30
|
+
attach_function :aiFreeScene, [Scene.ptr], :void
|
31
|
+
attach_function :aiExportScene, [Scene.ptr, :string, :string, PostProcessSteps], Return
|
32
|
+
attach_function :aiExportSceneEx, [Scene.ptr, :string, :string, FileIO.ptr, PostProcessSteps], Return
|
33
|
+
|
34
|
+
class ExportDataBlob < FFI::Struct
|
35
|
+
extend StructAccessors
|
36
|
+
layout :size, :size_t,
|
37
|
+
:data, :pointer,
|
38
|
+
:name, String,
|
39
|
+
:next, ExportDataBlob.ptr
|
40
|
+
struct_attr_reader :size,
|
41
|
+
:data,
|
42
|
+
:name,
|
43
|
+
:next
|
44
|
+
|
45
|
+
def to_s
|
46
|
+
name
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.releaser(ptr)
|
50
|
+
Assimp::aiReleaseExportBlob(ptr)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
attach_function :aiExportSceneToBlob, [Scene.ptr, :string, PostProcessSteps], :pointer #ExportDataBlob.ptr
|
56
|
+
attach_function :aiReleaseExportBlob, [ExportDataBlob.ptr], :void
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Assimp
|
2
|
+
|
3
|
+
class FileIO < FFI::Struct
|
4
|
+
end
|
5
|
+
|
6
|
+
class File < FFI::Struct
|
7
|
+
end
|
8
|
+
|
9
|
+
callback :file_write_proc, [File.ptr, :string, :size_t, :size_t], :size_t
|
10
|
+
callback :file_read_proc, [File.ptr, :string, :size_t, :size_t], :size_t
|
11
|
+
callback :file_tell_proc, [File.ptr], :size_t
|
12
|
+
callback :file_flush_proc, [File.ptr], :void
|
13
|
+
callback :file_seek, [File.ptr, :size_t, Origin], Return
|
14
|
+
|
15
|
+
callback :file_open_proc, [FileIO.ptr, :string, :string], File.ptr
|
16
|
+
callback :file_close_proc, [FileIO.ptr, File.ptr], :void
|
17
|
+
|
18
|
+
typedef :pointer, :user_data #byte
|
19
|
+
|
20
|
+
class FileIO
|
21
|
+
extend StructAccessors
|
22
|
+
layout :open_proc, :file_open_proc,
|
23
|
+
:close_proc, :file_close_proc,
|
24
|
+
:user_data, :user_data
|
25
|
+
struct_attr_accessor :open_proc,
|
26
|
+
:close_proc
|
27
|
+
struct_attr_reader :user_data
|
28
|
+
end
|
29
|
+
|
30
|
+
class File
|
31
|
+
extend StructAccessors
|
32
|
+
layout :read_proc, :file_read_proc,
|
33
|
+
:write_proc, :file_write_proc,
|
34
|
+
:tell_proc, :file_tell_proc,
|
35
|
+
:file_size_proc, :file_tell_proc,
|
36
|
+
:seek_proc, :file_seek,
|
37
|
+
:flush_proc, :file_flush_proc,
|
38
|
+
:user_data, :user_data
|
39
|
+
struct_attr_accessor :read_proc,
|
40
|
+
:write_proc,
|
41
|
+
:tell_proc,
|
42
|
+
:file_size_proc,
|
43
|
+
:seek_proc,
|
44
|
+
:flush_proc
|
45
|
+
struct_attr_reader :user_data
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|