tiny_gltf 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.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.travis.yml +7 -0
  4. data/.yardopts +2 -0
  5. data/Gemfile +6 -0
  6. data/Gemfile.lock +31 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +63 -0
  9. data/Rakefile +24 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/ext/tiny_gltf/extconf.rb +5 -0
  13. data/ext/tiny_gltf/json.hpp +14722 -0
  14. data/ext/tiny_gltf/rb_tiny_gltf.cpp +55 -0
  15. data/ext/tiny_gltf/rb_tiny_gltf.h +118 -0
  16. data/ext/tiny_gltf/rb_tiny_gltf_accessor.cpp +42 -0
  17. data/ext/tiny_gltf/rb_tiny_gltf_animation.cpp +21 -0
  18. data/ext/tiny_gltf/rb_tiny_gltf_animation_channel.cpp +13 -0
  19. data/ext/tiny_gltf/rb_tiny_gltf_animation_sampler.cpp +16 -0
  20. data/ext/tiny_gltf/rb_tiny_gltf_asset.cpp +15 -0
  21. data/ext/tiny_gltf/rb_tiny_gltf_buffer.cpp +16 -0
  22. data/ext/tiny_gltf/rb_tiny_gltf_buffer_view.cpp +16 -0
  23. data/ext/tiny_gltf/rb_tiny_gltf_camera.cpp +29 -0
  24. data/ext/tiny_gltf/rb_tiny_gltf_extension_map.cpp +12 -0
  25. data/ext/tiny_gltf/rb_tiny_gltf_image.cpp +25 -0
  26. data/ext/tiny_gltf/rb_tiny_gltf_init.c +81 -0
  27. data/ext/tiny_gltf/rb_tiny_gltf_light.cpp +16 -0
  28. data/ext/tiny_gltf/rb_tiny_gltf_material.cpp +14 -0
  29. data/ext/tiny_gltf/rb_tiny_gltf_mesh.cpp +37 -0
  30. data/ext/tiny_gltf/rb_tiny_gltf_model.cpp +52 -0
  31. data/ext/tiny_gltf/rb_tiny_gltf_node.cpp +67 -0
  32. data/ext/tiny_gltf/rb_tiny_gltf_parameter_map.cpp +39 -0
  33. data/ext/tiny_gltf/rb_tiny_gltf_primitive.cpp +35 -0
  34. data/ext/tiny_gltf/rb_tiny_gltf_sampler.cpp +16 -0
  35. data/ext/tiny_gltf/rb_tiny_gltf_scene.cpp +17 -0
  36. data/ext/tiny_gltf/rb_tiny_gltf_skin.cpp +17 -0
  37. data/ext/tiny_gltf/rb_tiny_gltf_texture.cpp +14 -0
  38. data/ext/tiny_gltf/rb_tiny_gltf_types.cpp +229 -0
  39. data/ext/tiny_gltf/rb_tiny_gltf_value.cpp +32 -0
  40. data/ext/tiny_gltf/stb_image.h +6509 -0
  41. data/ext/tiny_gltf/stb_image_write.h +1831 -0
  42. data/ext/tiny_gltf/tiny_gltf.h +4830 -0
  43. data/lib/tiny_gltf.rb +260 -0
  44. data/lib/tiny_gltf/version.rb +3 -0
  45. data/tiny_gltf.gemspec +43 -0
  46. metadata +189 -0
@@ -0,0 +1,55 @@
1
+ #define TINYGLTF_IMPLEMENTATION
2
+ #define STB_IMAGE_IMPLEMENTATION
3
+ #define STB_IMAGE_WRITE_IMPLEMENTATION
4
+ #include "rb_tiny_gltf.h"
5
+
6
+ /* call-seq: GLTF.load(filename_or_data[, base_dir]) => new Model
7
+ *
8
+ * Loads a model from the given file or data string. The data string can be
9
+ * ASCII or binary GLTF. `base_dir` is used to look up external dependencies
10
+ * such as images. If `base_dir` is omitted, it defaults to either the
11
+ * directory containing the file (if loading a file), or `'.'` (if loading a
12
+ * data string).
13
+ *
14
+ * Returns the new model, or raises an error if the model could not be loaded.
15
+ */
16
+ VALUE rb_tgltf_load(int argc, VALUE *argv, VALUE self) {
17
+ TinyGLTF gltf;
18
+ VALUE rstr, rbase_dir;
19
+ rb_scan_args(argc, argv, "11", &rstr, &rbase_dir);
20
+ VALUE is_file = rb_funcall(rb_cFile, rb_intern("exist?"), 1, rstr);
21
+
22
+ if (NIL_P(rbase_dir)) {
23
+ if (is_file == Qtrue) {
24
+ rbase_dir = rb_funcall(rb_cFile, rb_intern("dirname"), 1, rstr);
25
+ } else {
26
+ rbase_dir = rb_str_new2(".");
27
+ }
28
+ }
29
+
30
+ if (is_file) {
31
+ VALUE rfile = rb_funcall(rb_cFile, rb_intern("open"), 2, rstr, rb_str_new2("rb"));
32
+ rstr = rb_funcall(rfile, rb_intern("read"), 0);
33
+ rb_funcall(rfile, rb_intern("close"), 0);
34
+ }
35
+
36
+ try {
37
+ Model model;
38
+ std::string err, warn, base_dir(StringValueCStr(rbase_dir));
39
+ bool res;
40
+ if (RSTRING_LEN(rstr) > 0 && *RSTRING_PTR(rstr) == 'g') { // 'glTF'
41
+ res = gltf.LoadBinaryFromMemory(&model, &err, &warn,
42
+ (unsigned char *) RSTRING_PTR(rstr), (unsigned int) RSTRING_LEN(rstr), base_dir);
43
+ } else {
44
+ res = gltf.LoadASCIIFromString( &model, &err, &warn,
45
+ RSTRING_PTR(rstr), (unsigned int) RSTRING_LEN(rstr), base_dir);
46
+ }
47
+ if (err.size() > 0) rb_raise(rb_eTinyGLTFError, "%s", err.c_str());
48
+ if (warn.size() > 0) rb_raise(rb_eTinyGLTFError, "%s", warn.c_str());
49
+ if (!res) rb_raise(rb_eTinyGLTFError, "unknown failure to load model");
50
+ return rModel_new(&model);
51
+ } catch(const std::exception &ex) {
52
+ rb_raise(rb_eTinyGLTFError, "%s", ex.what());
53
+ }
54
+ return Qnil;
55
+ }
@@ -0,0 +1,118 @@
1
+ #ifndef TINY_GLTF_H
2
+ #define TINY_GLTF_H 1
3
+
4
+ #if __cplusplus
5
+ #include "tiny_gltf.h"
6
+ using namespace tinygltf;
7
+ extern "C" {
8
+ #endif
9
+
10
+ #include "ruby.h"
11
+
12
+ void Init_tiny_gltf(void);
13
+ VALUE rb_tgltf_load(int argc, VALUE *argv, VALUE self);
14
+
15
+ extern VALUE rb_mTinyGLTF,
16
+ rb_eTinyGLTFError;
17
+
18
+ /*
19
+ extern VALUE rb_cModel;
20
+ extern const rb_data_type_t T_Model;
21
+ VALUE Model_is_equal(VALUE self, VALUE other);
22
+ VALUE Model_alloc(VALUE klass);
23
+ */
24
+ #define GLTF_TYPE(name) \
25
+ extern VALUE rb_c ## name; \
26
+ extern const rb_data_type_t T_ ## name; \
27
+ VALUE name ## _is_equal(VALUE self, VALUE other); \
28
+ VALUE name ## _alloc(VALUE klass);
29
+
30
+ GLTF_TYPE(Model);
31
+ GLTF_TYPE(Accessor);
32
+ GLTF_TYPE(Asset);
33
+ GLTF_TYPE(Animation);
34
+ GLTF_TYPE(AnimationSampler);
35
+ GLTF_TYPE(AnimationChannel);
36
+ GLTF_TYPE(Buffer);
37
+ GLTF_TYPE(BufferView);
38
+ GLTF_TYPE(Material);
39
+ GLTF_TYPE(Mesh);
40
+ GLTF_TYPE(Node);
41
+ GLTF_TYPE(Primitive);
42
+ GLTF_TYPE(Texture);
43
+ GLTF_TYPE(Image);
44
+ GLTF_TYPE(Skin);
45
+ GLTF_TYPE(Sampler);
46
+ GLTF_TYPE(Camera);
47
+ GLTF_TYPE(Scene);
48
+ GLTF_TYPE(Light);
49
+
50
+ VALUE mode_to_sym(int mode);
51
+ VALUE component_type_to_sym(int type);
52
+ VALUE texture_filter_to_sym(int filter);
53
+ VALUE texture_wrap_to_sym(int wrap);
54
+ VALUE parameter_type_to_sym(int type);
55
+ VALUE type_to_sym(int type);
56
+ VALUE image_format_to_sym(int fmt);
57
+ VALUE texture_format_to_sym(int fmt);
58
+ VALUE texture_target_to_sym(int tgt);
59
+ VALUE texture_type_to_sym(int type);
60
+ VALUE target_to_sym(int tgt);
61
+ VALUE shader_type_to_sym(int type);
62
+
63
+ VALUE Accessor_byte_stride(VALUE self, VALUE buffer_view);
64
+
65
+ #if __cplusplus
66
+ /*
67
+ VALUE rModel_new(const Model *);
68
+ */
69
+ #define GLTF_RUBY_WRAP(klass) VALUE r ## klass ## _new(const klass *);
70
+
71
+ /*
72
+ static inline Model *Model_unwrap(VALUE val) {
73
+ Model *a = NULL;
74
+ TypedData_Get_Struct(val, Model, &T_Model, a);
75
+ if (a == NULL)
76
+ rb_raise(rb_eArgError, "BUG: " #name " is NULL");
77
+ return a;
78
+ }
79
+ */
80
+ #define GLTF_RUBY_UNWRAP(klass) \
81
+ static inline klass *klass ## _unwrap(VALUE val) { \
82
+ klass *a = NULL; \
83
+ TypedData_Get_Struct(val, klass, &T_ ## klass, a); \
84
+ if (a == NULL) \
85
+ rb_raise(rb_eArgError, "BUG: " #klass " is NULL"); \
86
+ return a; \
87
+ }
88
+
89
+ #define GLTF_RUBY_WRAPPERS(klass) GLTF_RUBY_WRAP(klass); \
90
+ GLTF_RUBY_UNWRAP(klass);
91
+
92
+ GLTF_RUBY_WRAP(ExtensionMap);
93
+ GLTF_RUBY_WRAP(ParameterMap);
94
+ GLTF_RUBY_WRAP(Value);
95
+
96
+ GLTF_RUBY_WRAPPERS(Asset);
97
+ GLTF_RUBY_WRAPPERS(Primitive);
98
+ GLTF_RUBY_WRAPPERS(Model);
99
+ GLTF_RUBY_WRAPPERS(Accessor);
100
+ GLTF_RUBY_WRAPPERS(Animation);
101
+ GLTF_RUBY_WRAPPERS(AnimationSampler);
102
+ GLTF_RUBY_WRAPPERS(AnimationChannel);
103
+ GLTF_RUBY_WRAPPERS(Buffer);
104
+ GLTF_RUBY_WRAPPERS(BufferView);
105
+ GLTF_RUBY_WRAPPERS(Material);
106
+ GLTF_RUBY_WRAPPERS(Mesh);
107
+ GLTF_RUBY_WRAPPERS(Node);
108
+ GLTF_RUBY_WRAPPERS(Texture);
109
+ GLTF_RUBY_WRAPPERS(Image);
110
+ GLTF_RUBY_WRAPPERS(Skin);
111
+ GLTF_RUBY_WRAPPERS(Sampler);
112
+ GLTF_RUBY_WRAPPERS(Camera);
113
+ GLTF_RUBY_WRAPPERS(Scene);
114
+ GLTF_RUBY_WRAPPERS(Light);
115
+ }
116
+ #endif
117
+
118
+ #endif /* TINY_GLTF_H */
@@ -0,0 +1,42 @@
1
+ #include "rb_tiny_gltf.h"
2
+
3
+ VALUE rAccessor_new(const Accessor *accessor) {
4
+ VALUE raccessor = rb_funcall(rb_cAccessor, rb_intern("new"), 0);
5
+ *Accessor_unwrap(raccessor) = *accessor;
6
+
7
+ rb_ivar_set(raccessor, rb_intern("@buffer_view_index"), INT2NUM(accessor->bufferView));
8
+ rb_ivar_set(raccessor, rb_intern("@component_type"), component_type_to_sym(accessor->componentType));
9
+ rb_ivar_set(raccessor, rb_intern("@count"), SIZET2NUM(accessor->count));
10
+ rb_ivar_set(raccessor, rb_intern("@name"), rb_str_new2(accessor->name.c_str()));
11
+ rb_ivar_set(raccessor, rb_intern("@byte_offset"), SIZET2NUM(accessor->byteOffset));
12
+ rb_ivar_set(raccessor, rb_intern("@normalized"), accessor->normalized ? Qtrue : Qfalse);
13
+ rb_ivar_set(raccessor, rb_intern("@type"), type_to_sym(accessor->type));
14
+ rb_ivar_set(raccessor, rb_intern("@extras"), rValue_new(&accessor->extras));
15
+ rb_ivar_set(raccessor, rb_intern("@min"), Qnil);
16
+ rb_ivar_set(raccessor, rb_intern("@max"), Qnil);
17
+
18
+ if (accessor->minValues.size() > 0) {
19
+ VALUE ary = rb_ary_new();
20
+ for (size_t i = 0; i < accessor->minValues.size(); i++)
21
+ rb_ary_push(ary, DBL2NUM(accessor->minValues[i]));
22
+ rb_ivar_set(raccessor, rb_intern("@min"), ary);
23
+ }
24
+
25
+ if (accessor->maxValues.size() > 0) {
26
+ VALUE ary = rb_ary_new();
27
+ for (size_t i = 0; i < accessor->maxValues.size(); i++)
28
+ rb_ary_push(ary, DBL2NUM(accessor->maxValues[i]));
29
+ rb_ivar_set(raccessor, rb_intern("@max"), ary);
30
+ }
31
+
32
+ return raccessor;
33
+ }
34
+
35
+ /* call-seq: byte_stride(buffer_view) => Numeric
36
+ *
37
+ * Returns the calculated byte stride for this accessor and the given buffer
38
+ * view.
39
+ */
40
+ VALUE Accessor_byte_stride(VALUE self, VALUE buffer_view) {
41
+ return INT2NUM(Accessor_unwrap(self)->ByteStride(*BufferView_unwrap(buffer_view)));
42
+ }
@@ -0,0 +1,21 @@
1
+ #include "rb_tiny_gltf.h"
2
+
3
+ VALUE rAnimation_new(const Animation *animation) {
4
+ VALUE ranimation = rb_funcall(rb_cAnimation, rb_intern("new"), 0);
5
+ // *Animation_unwrap(ranimation) = *animation;
6
+
7
+ VALUE rchannels = rb_ary_new();
8
+ for (size_t i = 0; i < animation->channels.size(); i++)
9
+ rb_ary_push(rchannels, rAnimationChannel_new(&animation->channels[i]));
10
+
11
+ VALUE rsamplers = rb_ary_new();
12
+ for (size_t i = 0; i < animation->samplers.size(); i++)
13
+ rb_ary_push(rsamplers, rAnimationSampler_new(&animation->samplers[i]));
14
+
15
+ rb_ivar_set(ranimation, rb_intern("@name"), rb_str_new2(animation->name.c_str()));
16
+ rb_ivar_set(ranimation, rb_intern("@channels"), rchannels);
17
+ rb_ivar_set(ranimation, rb_intern("@rsamplers"), rsamplers);
18
+ rb_ivar_set(ranimation, rb_intern("@extras"), rValue_new(&animation->extras));
19
+
20
+ return ranimation;
21
+ }
@@ -0,0 +1,13 @@
1
+ #include "rb_tiny_gltf.h"
2
+
3
+ VALUE rAnimationChannel_new(const AnimationChannel *animation_channel) {
4
+ VALUE ranimation_channel = rb_funcall(rb_cAnimationChannel, rb_intern("new"), 0);
5
+ // *AnimationChannel_unwrap(ranimation_channel) = *animation_channel;
6
+
7
+ rb_ivar_set(ranimation_channel, rb_intern("@sampler_index"), INT2NUM(animation_channel->sampler));
8
+ rb_ivar_set(ranimation_channel, rb_intern("@target_node_index"), INT2NUM(animation_channel->target_node));
9
+ rb_ivar_set(ranimation_channel, rb_intern("@target_path"), rb_intern(animation_channel->target_path.c_str()));
10
+ rb_ivar_set(ranimation_channel, rb_intern("@extras"), rValue_new(&animation_channel->extras));
11
+
12
+ return ranimation_channel;
13
+ }
@@ -0,0 +1,16 @@
1
+ #include "rb_tiny_gltf.h"
2
+
3
+ VALUE rAnimationSampler_new(const AnimationSampler *animation_sampler) {
4
+ VALUE ranimation_sampler = rb_funcall(rb_cAnimationSampler, rb_intern("new"), 0);
5
+ // *AnimationSampler_unwrap(ranimation_sampler) = *animation_sampler;
6
+
7
+ std::string interp = animation_sampler->interpolation;
8
+ std::transform(interp.begin(), interp.end(), interp.begin(), ::tolower);
9
+
10
+ rb_ivar_set(ranimation_sampler, rb_intern("@input"), INT2NUM(animation_sampler->input));
11
+ rb_ivar_set(ranimation_sampler, rb_intern("@output"), INT2NUM(animation_sampler->output));
12
+ rb_ivar_set(ranimation_sampler, rb_intern("@interpolation"), rb_intern(interp.c_str()));
13
+ rb_ivar_set(ranimation_sampler, rb_intern("@extras"), rValue_new(&animation_sampler->extras));
14
+
15
+ return ranimation_sampler;
16
+ }
@@ -0,0 +1,15 @@
1
+ #include "rb_tiny_gltf.h"
2
+
3
+ VALUE rAsset_new(const Asset *asset) {
4
+ VALUE rasset = rb_funcall(rb_cAsset, rb_intern("new"), 0);
5
+ // *Asset_unwrap(rasset) = *asset;
6
+
7
+ rb_ivar_set(rasset, rb_intern("@version"), rb_str_new2(asset->version.c_str()));
8
+ rb_ivar_set(rasset, rb_intern("@generator"), rb_str_new2(asset->generator.c_str()));
9
+ rb_ivar_set(rasset, rb_intern("@min_version"), rb_str_new2(asset->minVersion.c_str()));
10
+ rb_ivar_set(rasset, rb_intern("@copyright"), rb_str_new2(asset->copyright.c_str()));
11
+ rb_ivar_set(rasset, rb_intern("@extensions"), rExtensionMap_new(&asset->extensions));
12
+ rb_ivar_set(rasset, rb_intern("@extras"), rValue_new(&asset->extras));
13
+
14
+ return rasset;
15
+ }
@@ -0,0 +1,16 @@
1
+ #include "rb_tiny_gltf.h"
2
+
3
+ VALUE rBuffer_new(const Buffer *buf) {
4
+ VALUE rbuf = rb_funcall(rb_cBuffer, rb_intern("new"), 0);
5
+ // *Buffer_unwrap(rbuf) = *buf;
6
+
7
+ rb_ivar_set(rbuf, rb_intern("@name"), rb_str_new2(buf->name.c_str()));
8
+ rb_ivar_set(rbuf, rb_intern("@data"), rb_str_new((char *) buf->data.data(), buf->data.size()));
9
+ rb_ivar_set(rbuf, rb_intern("@uri"), Qnil);
10
+ rb_ivar_set(rbuf, rb_intern("@extras"), rValue_new(&buf->extras));
11
+
12
+ if (buf->uri.size() > 0)
13
+ rb_ivar_set(rbuf, rb_intern("@uri"), rb_str_new2(buf->uri.c_str()));
14
+
15
+ return rbuf;
16
+ }
@@ -0,0 +1,16 @@
1
+ #include "rb_tiny_gltf.h"
2
+
3
+ VALUE rBufferView_new(const BufferView *view) {
4
+ VALUE rbuf = rb_funcall(rb_cBufferView, rb_intern("new"), 0);
5
+ *BufferView_unwrap(rbuf) = *view;
6
+
7
+ rb_ivar_set(rbuf, rb_intern("@name"), rb_str_new2(view->name.c_str()));
8
+ rb_ivar_set(rbuf, rb_intern("@buffer_index"), INT2NUM(view->buffer));
9
+ rb_ivar_set(rbuf, rb_intern("@byte_offset"), SIZET2NUM(view->byteOffset));
10
+ rb_ivar_set(rbuf, rb_intern("@byte_length"), SIZET2NUM(view->byteLength));
11
+ rb_ivar_set(rbuf, rb_intern("@byte_stride"), SIZET2NUM(view->byteStride));
12
+ rb_ivar_set(rbuf, rb_intern("@target"), target_to_sym(view->target));
13
+ rb_ivar_set(rbuf, rb_intern("@extras"), rValue_new(&view->extras));
14
+
15
+ return rbuf;
16
+ }
@@ -0,0 +1,29 @@
1
+ #include "rb_tiny_gltf.h"
2
+
3
+ VALUE rCamera_new(const Camera *camera) {
4
+ VALUE rcamera = rb_funcall(rb_cCamera, rb_intern("new"), 0);
5
+ // *Camera_unwrap(rcamera) = *camera;
6
+
7
+ rb_ivar_set(rcamera, rb_intern("@name"), rb_str_new2(camera->name.c_str()));
8
+ rb_ivar_set(rcamera, rb_intern("@type"), rb_intern(camera->type.c_str()));
9
+ rb_ivar_set(rcamera, rb_intern("@extensions"), rExtensionMap_new(&camera->extensions));
10
+ rb_ivar_set(rcamera, rb_intern("@extras"), rValue_new(&camera->extras));
11
+
12
+ if (!strcmp(camera->type.c_str(), "perspective")) {
13
+ rb_ivar_set(rcamera, rb_intern("@aspect_ratio"), DBL2NUM(camera->perspective.aspectRatio));
14
+ rb_ivar_set(rcamera, rb_intern("@yfov"), DBL2NUM(camera->perspective.yfov));
15
+ rb_ivar_set(rcamera, rb_intern("@znear"), DBL2NUM(camera->perspective.znear));
16
+ if (camera->perspective.zfar == 0.0)
17
+ rb_ivar_set(rcamera, rb_intern("@zfar"), rb_const_get(rb_cFloat, rb_intern("INFINITY")));
18
+ else
19
+ rb_ivar_set(rcamera, rb_intern("@zfar"), DBL2NUM(camera->perspective.zfar));
20
+ } else {
21
+ rb_ivar_set(rcamera, rb_intern("@xmag"), DBL2NUM(camera->orthographic.xmag));
22
+ rb_ivar_set(rcamera, rb_intern("@ymag"), DBL2NUM(camera->orthographic.ymag));
23
+ rb_ivar_set(rcamera, rb_intern("@znear"), DBL2NUM(camera->orthographic.znear));
24
+ rb_ivar_set(rcamera, rb_intern("@zfar"), DBL2NUM(camera->orthographic.zfar));
25
+ }
26
+
27
+ return rcamera;
28
+ }
29
+
@@ -0,0 +1,12 @@
1
+ #include "rb_tiny_gltf.h"
2
+
3
+ VALUE rExtensionMap_new(const ExtensionMap *value) {
4
+ VALUE res = Qnil;
5
+
6
+ for (ExtensionMap::const_iterator iterator = value->begin(); iterator != value->end(); iterator++) {
7
+ if (NIL_P(res)) res = rb_hash_new();
8
+ rb_hash_aset(res, rb_str_new2(iterator->first.c_str()), rValue_new(&iterator->second));
9
+ }
10
+
11
+ return res;
12
+ }
@@ -0,0 +1,25 @@
1
+ #include "rb_tiny_gltf.h"
2
+
3
+ VALUE rImage_new(const Image *img) {
4
+ VALUE rimg = rb_funcall(rb_cImage, rb_intern("new"), 0);
5
+ // *Image_unwrap(rimg) = *img;
6
+
7
+ rb_ivar_set(rimg, rb_intern("@name"), rb_str_new2(img->name.c_str()));
8
+ rb_ivar_set(rimg, rb_intern("@data"), rb_str_new((char *) img->image.data(), img->image.size()));
9
+ rb_ivar_set(rimg, rb_intern("@uri"), Qnil);
10
+ rb_ivar_set(rimg, rb_intern("@mime_type"), Qnil);
11
+ rb_ivar_set(rimg, rb_intern("@extras"), rValue_new(&img->extras));
12
+ rb_ivar_set(rimg, rb_intern("@width"), INT2NUM(img->width));
13
+ rb_ivar_set(rimg, rb_intern("@height"), INT2NUM(img->height));
14
+ rb_ivar_set(rimg, rb_intern("@components"), INT2NUM(img->component));
15
+ rb_ivar_set(rimg, rb_intern("@buffer_view_index"), INT2NUM(img->bufferView));
16
+ rb_ivar_set(rimg, rb_intern("@extensions"), rExtensionMap_new(&img->extensions));
17
+
18
+ if (img->uri.size() > 0)
19
+ rb_ivar_set(rimg, rb_intern("@uri"), rb_str_new2(img->uri.c_str()));
20
+
21
+ if (img->mimeType.size() > 0)
22
+ rb_ivar_set(rimg, rb_intern("@mime_type"), rb_str_new2(img->mimeType.c_str()));
23
+
24
+ return rimg;
25
+ }
@@ -0,0 +1,81 @@
1
+ #include "rb_tiny_gltf.h"
2
+
3
+ VALUE rb_mTinyGLTF,
4
+ rb_eTinyGLTFError,
5
+ rb_cModel,
6
+ rb_cAccessor,
7
+ rb_cAsset,
8
+ rb_cAnimation,
9
+ rb_cAnimationChannel,
10
+ rb_cAnimationSampler,
11
+ rb_cBuffer,
12
+ rb_cBufferView,
13
+ rb_cMaterial,
14
+ rb_cMesh,
15
+ rb_cNode,
16
+ rb_cPrimitive,
17
+ rb_cTexture,
18
+ rb_cImage,
19
+ rb_cSkin,
20
+ rb_cSampler,
21
+ rb_cCamera,
22
+ rb_cScene,
23
+ rb_cLight;
24
+
25
+ void Init_tiny_gltf(void) {
26
+ rb_mTinyGLTF = rb_define_module("TinyGLTF");
27
+
28
+ // not part of the macro below just to help the yardoc parser out
29
+ rb_cModel = rb_define_class_under(rb_mTinyGLTF, "Model", rb_cObject);
30
+ rb_cAccessor = rb_define_class_under(rb_mTinyGLTF, "Accessor", rb_cObject);
31
+ rb_cAsset = rb_define_class_under(rb_mTinyGLTF, "Asset", rb_cObject);
32
+ rb_cAnimation = rb_define_class_under(rb_mTinyGLTF, "Animation", rb_cObject);
33
+ rb_cAnimationChannel = rb_define_class_under(rb_mTinyGLTF, "AnimationChannel", rb_cObject);
34
+ rb_cAnimationSampler = rb_define_class_under(rb_mTinyGLTF, "AnimationSampler", rb_cObject);
35
+ rb_cBuffer = rb_define_class_under(rb_mTinyGLTF, "Buffer", rb_cObject);
36
+ rb_cBufferView = rb_define_class_under(rb_mTinyGLTF, "BufferView", rb_cObject);
37
+ rb_cMaterial = rb_define_class_under(rb_mTinyGLTF, "Material", rb_cObject);
38
+ rb_cMesh = rb_define_class_under(rb_mTinyGLTF, "Mesh", rb_cObject);
39
+ rb_cNode = rb_define_class_under(rb_mTinyGLTF, "Node", rb_cObject);
40
+ rb_cTexture = rb_define_class_under(rb_mTinyGLTF, "Texture", rb_cObject);
41
+ rb_cImage = rb_define_class_under(rb_mTinyGLTF, "Image", rb_cObject);
42
+ rb_cPrimitive = rb_define_class_under(rb_mTinyGLTF, "Primitive", rb_cObject);
43
+ rb_cSkin = rb_define_class_under(rb_mTinyGLTF, "Skin", rb_cObject);
44
+ rb_cSampler = rb_define_class_under(rb_mTinyGLTF, "Sampler", rb_cObject);
45
+ rb_cCamera = rb_define_class_under(rb_mTinyGLTF, "Camera", rb_cObject);
46
+ rb_cScene = rb_define_class_under(rb_mTinyGLTF, "Scene", rb_cObject);
47
+ rb_cLight = rb_define_class_under(rb_mTinyGLTF, "Light", rb_cObject);
48
+
49
+ /*
50
+ rb_define_alloc_func(rb_cModel, Model_alloc);
51
+ rb_define_method(rb_cModel, "==", Model_is_equal, 1);
52
+ */
53
+ #define DEFINE_RB_GLTF_CLASS(name) \
54
+ rb_define_alloc_func(rb_c ## name, name ## _alloc); \
55
+ rb_define_method(rb_c ## name, "==", name ## _is_equal, 1);
56
+
57
+ DEFINE_RB_GLTF_CLASS(Model);
58
+ DEFINE_RB_GLTF_CLASS(Accessor);
59
+ DEFINE_RB_GLTF_CLASS(Asset);
60
+ DEFINE_RB_GLTF_CLASS(Animation);
61
+ DEFINE_RB_GLTF_CLASS(AnimationChannel);
62
+ DEFINE_RB_GLTF_CLASS(AnimationSampler);
63
+ DEFINE_RB_GLTF_CLASS(Buffer);
64
+ DEFINE_RB_GLTF_CLASS(BufferView);
65
+ DEFINE_RB_GLTF_CLASS(Material);
66
+ DEFINE_RB_GLTF_CLASS(Mesh);
67
+ DEFINE_RB_GLTF_CLASS(Node);
68
+ DEFINE_RB_GLTF_CLASS(Texture);
69
+ DEFINE_RB_GLTF_CLASS(Image);
70
+ DEFINE_RB_GLTF_CLASS(Primitive);
71
+ DEFINE_RB_GLTF_CLASS(Skin);
72
+ DEFINE_RB_GLTF_CLASS(Sampler);
73
+ DEFINE_RB_GLTF_CLASS(Camera);
74
+ DEFINE_RB_GLTF_CLASS(Scene);
75
+ DEFINE_RB_GLTF_CLASS(Light);
76
+
77
+ rb_define_method(rb_cAccessor, "byte_stride", Accessor_byte_stride, 1);
78
+
79
+ rb_eTinyGLTFError = rb_define_class_under(rb_mTinyGLTF, "Error", rb_eStandardError);
80
+ rb_define_singleton_method(rb_mTinyGLTF, "load", rb_tgltf_load, -1);
81
+ }