tiny_obj 0.1.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.
@@ -0,0 +1,235 @@
1
+ #define TINYOBJLOADER_IMPLEMENTATION
2
+ #define TINYOBJLOADER_USE_DOUBLE
3
+ #include "rb_tinyobj.h"
4
+ #include <stdlib.h>
5
+
6
+ #define NIL_OR_STR(cstr) (strlen(cstr) > 0 ? Qnil : rb_str_new2(cstr))
7
+
8
+ VALUE build_rb_texopt(tinyobj::texture_option_t *opt) {
9
+ VALUE rt = rb_hash_new();
10
+ if (opt->colorspace.size() > 0)
11
+ rb_hash_aset(rt, ID2SYM(rb_intern("colorspace")), rb_str_new2(opt->colorspace.c_str()));
12
+ const char *type_str = NULL;
13
+ switch(opt->type) {
14
+ case tinyobj::TEXTURE_TYPE_NONE: type_str = "none"; break;
15
+ case tinyobj::TEXTURE_TYPE_SPHERE: type_str = "sphere"; break;
16
+ case tinyobj::TEXTURE_TYPE_CUBE_TOP: type_str = "cube_top"; break;
17
+ case tinyobj::TEXTURE_TYPE_CUBE_BOTTOM: type_str = "cube_bottom"; break;
18
+ case tinyobj::TEXTURE_TYPE_CUBE_FRONT: type_str = "cube_front"; break;
19
+ case tinyobj::TEXTURE_TYPE_CUBE_BACK: type_str = "cube_back"; break;
20
+ case tinyobj::TEXTURE_TYPE_CUBE_LEFT: type_str = "cube_left"; break;
21
+ case tinyobj::TEXTURE_TYPE_CUBE_RIGHT: type_str = "cube_right"; break;
22
+ default: type_str = "unknown";
23
+ }
24
+ VALUE rb_origin_offset = rb_ary_new2(3),
25
+ rb_scale = rb_ary_new2(3),
26
+ rb_turbulence = rb_ary_new2(3);
27
+ for (int i = 0; i < 3; i++) {
28
+ rb_ary_push(rb_origin_offset, DBL2NUM(opt->origin_offset[i]));
29
+ rb_ary_push(rb_scale, DBL2NUM(opt->scale[i]));
30
+ rb_ary_push(rb_turbulence, DBL2NUM(opt->turbulence[i]));
31
+ }
32
+ rb_hash_aset(rt, ID2SYM(rb_intern("type")), ID2SYM(rb_intern(type_str)));
33
+ rb_hash_aset(rt, ID2SYM(rb_intern("sharpness")), DBL2NUM(opt->sharpness));
34
+ rb_hash_aset(rt, ID2SYM(rb_intern("brightness")), DBL2NUM(opt->brightness));
35
+ rb_hash_aset(rt, ID2SYM(rb_intern("contrast")), DBL2NUM(opt->contrast));
36
+ rb_hash_aset(rt, ID2SYM(rb_intern("origin_offset")), rb_origin_offset);
37
+ rb_hash_aset(rt, ID2SYM(rb_intern("scale")), rb_scale);
38
+ rb_hash_aset(rt, ID2SYM(rb_intern("turbulence")), rb_turbulence);
39
+ rb_hash_aset(rt, ID2SYM(rb_intern("clamp")), opt->clamp ? Qtrue : Qfalse);
40
+ rb_hash_aset(rt, ID2SYM(rb_intern("blendu")), opt->blendu ? Qtrue : Qfalse);
41
+ rb_hash_aset(rt, ID2SYM(rb_intern("blendv")), opt->blendv ? Qtrue : Qfalse);
42
+ rb_hash_aset(rt, ID2SYM(rb_intern("imfchan")), rb_str_new(&opt->imfchan, 1));
43
+ rb_hash_aset(rt, ID2SYM(rb_intern("bump_multiplier")), DBL2NUM(opt->bump_multiplier));
44
+
45
+ return rt;
46
+ }
47
+
48
+ extern "C" {
49
+ VALUE rb_tinyobj_load(int argc, VALUE *argv, VALUE self) {
50
+ VALUE fn, dir;
51
+ rb_scan_args(argc, argv, "11", &fn, &dir);
52
+ if (NIL_P(dir)) {
53
+ dir = rb_funcall(rb_cFile, rb_intern("dirname"), 1, fn);
54
+ }
55
+
56
+ VALUE ret = rb_hash_new();
57
+
58
+ tinyobj::attrib_t attrib;
59
+ std::vector<tinyobj::shape_t> shapes;
60
+ std::vector<tinyobj::material_t> materials;
61
+ std::string warn, err;
62
+ bool result = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, StringValuePtr(fn), StringValuePtr(dir));
63
+
64
+ if (!err.empty())
65
+ rb_raise(rb_eRuntimeError, "error loading OBJ: %s", err.c_str());
66
+
67
+ rb_hash_aset(ret, ID2SYM(rb_intern("success")), result ? Qtrue : Qfalse);
68
+
69
+ if (!warn.empty())
70
+ rb_hash_aset(ret, ID2SYM(rb_intern("warnings")), rb_str_new2(warn.c_str()));
71
+
72
+ VALUE rb_materials = rb_ary_new2(materials.size());
73
+ for (size_t m = 0; m < materials.size(); m++) {
74
+ VALUE rb_material = rb_hash_new();
75
+ rb_ary_push(rb_materials, rb_material);
76
+ VALUE rb_ambient = rb_ary_new2(3),
77
+ rb_diffuse = rb_ary_new2(3),
78
+ rb_specular = rb_ary_new2(3),
79
+ rb_transmittance = rb_ary_new2(3),
80
+ rb_emission = rb_ary_new2(3);
81
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("ambient")), rb_ambient);
82
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("diffuse")), rb_diffuse);
83
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("specular")), rb_specular);
84
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("transmittance")), rb_transmittance);
85
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("emission")), rb_emission);
86
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("name")), NIL_OR_STR(materials[m].name.c_str()));
87
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("shininess")), DBL2NUM(materials[m].shininess));
88
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("ior")), DBL2NUM(materials[m].ior));
89
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("dissolve")), DBL2NUM(materials[m].dissolve));
90
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("illum")), DBL2NUM(materials[m].illum));
91
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("ambient_texname")), NIL_OR_STR(materials[m].ambient_texname.c_str()));
92
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("diffuse_texname")), NIL_OR_STR(materials[m].diffuse_texname.c_str()));
93
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("specular_texname")), NIL_OR_STR(materials[m].specular_texname.c_str()));
94
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("specular_highlight_texname")), NIL_OR_STR(materials[m].specular_highlight_texname.c_str()));
95
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("bump_texname")), NIL_OR_STR(materials[m].bump_texname.c_str()));
96
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("displacement_texname")), NIL_OR_STR(materials[m].displacement_texname.c_str()));
97
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("alpha_texname")), NIL_OR_STR(materials[m].alpha_texname.c_str()));
98
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("reflection_texname")), NIL_OR_STR(materials[m].reflection_texname.c_str()));
99
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("roughness")), DBL2NUM(materials[m].roughness));
100
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("metallic")), DBL2NUM(materials[m].metallic));
101
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("sheen")), DBL2NUM(materials[m].sheen));
102
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("clearcoat_thickness")), DBL2NUM(materials[m].clearcoat_thickness));
103
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("clearcoat_roughness")), DBL2NUM(materials[m].clearcoat_roughness));
104
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("anisotropy")), DBL2NUM(materials[m].anisotropy));
105
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("anisotropy_rotation")), DBL2NUM(materials[m].anisotropy_rotation));
106
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("roughness_texname")), NIL_OR_STR(materials[m].roughness_texname.c_str()));
107
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("metallic_texname")), NIL_OR_STR(materials[m].metallic_texname.c_str()));
108
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("sheen_texname")), NIL_OR_STR(materials[m].sheen_texname.c_str()));
109
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("emissive_texname")), NIL_OR_STR(materials[m].emissive_texname.c_str()));
110
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("normal_texname")), NIL_OR_STR(materials[m].normal_texname.c_str()));
111
+ for (int i = 0; i < 3; i++) {
112
+ rb_ary_push(rb_ambient, DBL2NUM(materials[m].ambient[i]));
113
+ rb_ary_push(rb_diffuse, DBL2NUM(materials[m].diffuse[i]));
114
+ rb_ary_push(rb_specular, DBL2NUM(materials[m].specular[i]));
115
+ rb_ary_push(rb_transmittance, DBL2NUM(materials[m].transmittance[i]));
116
+ rb_ary_push(rb_emission, DBL2NUM(materials[m].emission[i]));
117
+ }
118
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("ambient_texopt")), build_rb_texopt(&materials[m].ambient_texopt));
119
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("diffuse_texopt")), build_rb_texopt(&materials[m].diffuse_texopt));
120
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("specular_texopt")), build_rb_texopt(&materials[m].specular_texopt));
121
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("specular_highlight_texopt")), build_rb_texopt(&materials[m].specular_highlight_texopt));
122
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("bump_texopt")), build_rb_texopt(&materials[m].bump_texopt));
123
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("displacement_texopt")), build_rb_texopt(&materials[m].displacement_texopt));
124
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("alpha_texopt")), build_rb_texopt(&materials[m].alpha_texopt));
125
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("reflection_texopt")), build_rb_texopt(&materials[m].reflection_texopt));
126
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("roughness_texopt")), build_rb_texopt(&materials[m].roughness_texopt));
127
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("metallic_texopt")), build_rb_texopt(&materials[m].metallic_texopt));
128
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("sheen_texopt")), build_rb_texopt(&materials[m].sheen_texopt));
129
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("emissive_texopt")), build_rb_texopt(&materials[m].emissive_texopt));
130
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("normal_texopt")), build_rb_texopt(&materials[m].normal_texopt));
131
+ VALUE rb_unknown_parameter = Qnil;
132
+ typedef std::map<std::string, std::string>::iterator it_type;
133
+ for (it_type iterator = materials[m].unknown_parameter.begin(); iterator != materials[m].unknown_parameter.end(); iterator++) {
134
+ if (NIL_P(rb_unknown_parameter)) rb_unknown_parameter = rb_hash_new();
135
+ rb_hash_aset(rb_unknown_parameter, rb_str_new2(iterator->first.c_str()), rb_str_new2(iterator->second.c_str()));
136
+ }
137
+ if (!NIL_P(rb_unknown_parameter))
138
+ rb_hash_aset(rb_material, ID2SYM(rb_intern("unknown_parameters")), rb_unknown_parameter);
139
+ }
140
+
141
+ VALUE rb_vertices = rb_ary_new2(attrib.vertices.size()),
142
+ rb_normals = rb_ary_new2(attrib.normals.size()),
143
+ rb_texcoords = rb_ary_new2(attrib.texcoords.size()),
144
+ rb_colors = rb_ary_new2(attrib.colors.size());
145
+ rb_hash_aset(ret, ID2SYM(rb_intern("vertices")), rb_vertices);
146
+ rb_hash_aset(ret, ID2SYM(rb_intern("normals")), rb_normals);
147
+ rb_hash_aset(ret, ID2SYM(rb_intern("texcoords")), rb_texcoords);
148
+ rb_hash_aset(ret, ID2SYM(rb_intern("colors")), rb_colors);
149
+ for (size_t i = 0; i < attrib.vertices.size(); i++)
150
+ rb_ary_push(rb_vertices, DBL2NUM(attrib.vertices[i]));
151
+ for (size_t i = 0; i < attrib.normals.size(); i++)
152
+ rb_ary_push(rb_normals, DBL2NUM(attrib.normals[i]));
153
+ for (size_t i = 0; i < attrib.texcoords.size(); i++)
154
+ rb_ary_push(rb_texcoords, DBL2NUM(attrib.texcoords[i]));
155
+ for (size_t i = 0; i < attrib.colors.size(); i++)
156
+ rb_ary_push(rb_colors, DBL2NUM(attrib.colors[i]));
157
+
158
+ VALUE rb_shapes = rb_ary_new2(shapes.size());
159
+ rb_hash_aset(ret, ID2SYM(rb_intern("shapes")), rb_shapes);
160
+ for (size_t s = 0; s < shapes.size(); s++) {
161
+ VALUE rb_shape = rb_hash_new();
162
+ VALUE rb_mesh = rb_hash_new();
163
+ VALUE rb_path = rb_hash_new();
164
+ rb_ary_push(rb_shapes, rb_shape);
165
+ rb_hash_aset(rb_shape, ID2SYM(rb_intern("name")), rb_str_new2(shapes[s].name.c_str()));
166
+ rb_hash_aset(rb_shape, ID2SYM(rb_intern("mesh")), rb_mesh);
167
+ rb_hash_aset(rb_shape, ID2SYM(rb_intern("path")), rb_path);
168
+
169
+ VALUE rb_path_indices = rb_ary_new2(shapes[s].path.indices.size());
170
+ rb_hash_aset(rb_shape, ID2SYM(rb_intern("indices")), rb_path_indices);
171
+ for (size_t i = 0; i < shapes[s].path.indices.size(); i++) {
172
+ rb_ary_push(rb_path_indices, INT2NUM(shapes[s].path.indices[i]));
173
+ }
174
+
175
+ VALUE rb_mesh_indices = rb_ary_new2(shapes[s].mesh.indices.size());
176
+ rb_hash_aset(rb_mesh, ID2SYM(rb_intern("indices")), rb_mesh_indices);
177
+ for (size_t i = 0; i < shapes[s].mesh.indices.size(); i++) {
178
+ VALUE index = rb_hash_new();
179
+ if (shapes[s].mesh.indices[i].vertex_index != -1)
180
+ rb_hash_aset(index, ID2SYM(rb_intern("vertex_index")), INT2NUM(shapes[s].mesh.indices[i].vertex_index));
181
+ if (shapes[s].mesh.indices[i].normal_index != -1)
182
+ rb_hash_aset(index, ID2SYM(rb_intern("normal_index")), INT2NUM(shapes[s].mesh.indices[i].normal_index));
183
+ if (shapes[s].mesh.indices[i].texcoord_index != -1)
184
+ rb_hash_aset(index, ID2SYM(rb_intern("texcoord_index")), INT2NUM(shapes[s].mesh.indices[i].texcoord_index));
185
+ rb_ary_push(rb_mesh_indices, index);
186
+ }
187
+
188
+ VALUE rb_mesh_num_face_vertices = rb_ary_new2(shapes[s].mesh.num_face_vertices.size());
189
+ rb_hash_aset(rb_mesh, ID2SYM(rb_intern("num_face_vertices")), rb_mesh_num_face_vertices);
190
+ for (size_t i = 0; i < shapes[s].mesh.num_face_vertices.size(); i++) {
191
+ int v = (int) shapes[s].mesh.num_face_vertices[i];
192
+ rb_ary_push(rb_mesh_num_face_vertices, INT2NUM(v));
193
+ }
194
+
195
+ VALUE rb_mesh_material_ids = rb_ary_new2(shapes[s].mesh.material_ids.size());
196
+ rb_hash_aset(rb_mesh, ID2SYM(rb_intern("material_ids")), rb_mesh_material_ids);
197
+ for (size_t i = 0; i < shapes[s].mesh.material_ids.size(); i++) {
198
+ int v = (int) shapes[s].mesh.material_ids[i];
199
+ rb_ary_push(rb_mesh_material_ids, INT2NUM(v));
200
+ }
201
+
202
+ VALUE rb_mesh_smoothing_group_ids = rb_ary_new2(shapes[s].mesh.smoothing_group_ids.size());
203
+ rb_hash_aset(rb_mesh, ID2SYM(rb_intern("smoothing_group_ids")), rb_mesh_smoothing_group_ids);
204
+ for (size_t i = 0; i < shapes[s].mesh.smoothing_group_ids.size(); i++) {
205
+ long v = (long) shapes[s].mesh.smoothing_group_ids[i];
206
+ rb_ary_push(rb_mesh_smoothing_group_ids, v == 0 ? Qnil : LONG2NUM(v));
207
+ }
208
+
209
+ VALUE rb_mesh_tags = rb_ary_new2(shapes[s].mesh.tags.size());
210
+ rb_hash_aset(rb_mesh, ID2SYM(rb_intern("tags")), rb_mesh_tags);
211
+ for (size_t i = 0; i < shapes[s].mesh.tags.size(); i++) {
212
+ VALUE rb_tag = rb_hash_new();
213
+ rb_ary_push(rb_mesh_tags, rb_tag);
214
+ rb_hash_aset(rb_tag, ID2SYM(rb_intern("name")), rb_str_new2(shapes[s].mesh.tags[i].name.c_str()));
215
+ VALUE rb_int_values = rb_ary_new2(shapes[s].mesh.tags[i].intValues.size());
216
+ rb_hash_aset(rb_tag, ID2SYM(rb_intern("int_values")), rb_int_values);
217
+ for (size_t j = 0; j < shapes[s].mesh.tags[i].intValues.size(); j++) {
218
+ rb_ary_push(rb_int_values, INT2NUM(shapes[s].mesh.tags[i].intValues[j]));
219
+ }
220
+ VALUE rb_float_values = rb_ary_new2(shapes[s].mesh.tags[i].floatValues.size());
221
+ rb_hash_aset(rb_tag, ID2SYM(rb_intern("float_values")), rb_float_values);
222
+ for (size_t j = 0; j < shapes[s].mesh.tags[i].floatValues.size(); j++) {
223
+ rb_ary_push(rb_float_values, INT2NUM(shapes[s].mesh.tags[i].floatValues[j]));
224
+ }
225
+ VALUE rb_string_values = rb_ary_new2(shapes[s].mesh.tags[i].stringValues.size());
226
+ rb_hash_aset(rb_tag, ID2SYM(rb_intern("string_values")), rb_string_values);
227
+ for (size_t j = 0; j < shapes[s].mesh.tags[i].stringValues.size(); j++) {
228
+ rb_ary_push(rb_string_values, rb_str_new2(shapes[s].mesh.tags[i].stringValues[j].c_str()));
229
+ }
230
+ }
231
+ }
232
+
233
+ return ret;
234
+ }
235
+ }
@@ -0,0 +1 @@
1
+ require 'tinyobj'
@@ -0,0 +1,3 @@
1
+ module TinyOBJ
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,6 @@
1
+ require "tiny_obj/version"
2
+ require "tiny_obj/tiny_obj"
3
+
4
+ module TinyOBJ
5
+ class Error < StandardError; end
6
+ end
@@ -0,0 +1,39 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "tiny_obj/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "tiny_obj"
7
+ spec.version = TinyOBJ::VERSION
8
+ spec.authors = ["Colin MacKenzie IV"]
9
+ spec.email = ["sinisterchipmunk@gmail.com"]
10
+
11
+ spec.summary = %q{Ruby bindings for TinyOBJ}
12
+ spec.homepage = "https://github.com/sinisterchipmunk/tinyobj-ruby"
13
+ spec.license = "MIT"
14
+
15
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
16
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
17
+ if spec.respond_to?(:metadata)
18
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
19
+ spec.metadata["homepage_uri"] = spec.homepage
20
+ else
21
+ raise "RubyGems 2.0 or newer is required to protect against " \
22
+ "public gem pushes."
23
+ end
24
+
25
+ # Specify which files should be added to the gem when it is released.
26
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
27
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
28
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
29
+ end
30
+ spec.bindir = "exe"
31
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
+ spec.require_paths = ["lib"]
33
+ spec.extensions = ["ext/tiny_obj/extconf.rb"]
34
+
35
+ spec.add_development_dependency "bundler", "~> 1.17"
36
+ spec.add_development_dependency "rake", "~> 10.0"
37
+ spec.add_development_dependency "rake-compiler"
38
+ spec.add_development_dependency "minitest", "~> 5.0"
39
+ end
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tiny_obj
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Colin MacKenzie IV
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-11-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.17'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.17'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.0'
69
+ description:
70
+ email:
71
+ - sinisterchipmunk@gmail.com
72
+ executables: []
73
+ extensions:
74
+ - ext/tiny_obj/extconf.rb
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - ".travis.yml"
79
+ - Gemfile
80
+ - Gemfile.lock
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - bin/console
85
+ - bin/setup
86
+ - ext/tiny_obj/extconf.rb
87
+ - ext/tiny_obj/init_tinyobj.c
88
+ - ext/tiny_obj/rb_tinyobj.h
89
+ - ext/tiny_obj/tiny_obj_loader.h
90
+ - ext/tiny_obj/tinyobj.cpp
91
+ - lib/tiny_obj.rb
92
+ - lib/tiny_obj/version.rb
93
+ - lib/tinyobj.rb
94
+ - tiny_obj.gemspec
95
+ homepage: https://github.com/sinisterchipmunk/tinyobj-ruby
96
+ licenses:
97
+ - MIT
98
+ metadata:
99
+ allowed_push_host: https://rubygems.org
100
+ homepage_uri: https://github.com/sinisterchipmunk/tinyobj-ruby
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 2.7.8
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: Ruby bindings for TinyOBJ
121
+ test_files: []