tiny_gltf 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/.gitignore +14 -0
- data/.travis.yml +7 -0
- data/.yardopts +2 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +31 -0
- data/LICENSE.txt +21 -0
- data/README.md +63 -0
- data/Rakefile +24 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/ext/tiny_gltf/extconf.rb +5 -0
- data/ext/tiny_gltf/json.hpp +14722 -0
- data/ext/tiny_gltf/rb_tiny_gltf.cpp +55 -0
- data/ext/tiny_gltf/rb_tiny_gltf.h +118 -0
- data/ext/tiny_gltf/rb_tiny_gltf_accessor.cpp +42 -0
- data/ext/tiny_gltf/rb_tiny_gltf_animation.cpp +21 -0
- data/ext/tiny_gltf/rb_tiny_gltf_animation_channel.cpp +13 -0
- data/ext/tiny_gltf/rb_tiny_gltf_animation_sampler.cpp +16 -0
- data/ext/tiny_gltf/rb_tiny_gltf_asset.cpp +15 -0
- data/ext/tiny_gltf/rb_tiny_gltf_buffer.cpp +16 -0
- data/ext/tiny_gltf/rb_tiny_gltf_buffer_view.cpp +16 -0
- data/ext/tiny_gltf/rb_tiny_gltf_camera.cpp +29 -0
- data/ext/tiny_gltf/rb_tiny_gltf_extension_map.cpp +12 -0
- data/ext/tiny_gltf/rb_tiny_gltf_image.cpp +25 -0
- data/ext/tiny_gltf/rb_tiny_gltf_init.c +81 -0
- data/ext/tiny_gltf/rb_tiny_gltf_light.cpp +16 -0
- data/ext/tiny_gltf/rb_tiny_gltf_material.cpp +14 -0
- data/ext/tiny_gltf/rb_tiny_gltf_mesh.cpp +37 -0
- data/ext/tiny_gltf/rb_tiny_gltf_model.cpp +52 -0
- data/ext/tiny_gltf/rb_tiny_gltf_node.cpp +67 -0
- data/ext/tiny_gltf/rb_tiny_gltf_parameter_map.cpp +39 -0
- data/ext/tiny_gltf/rb_tiny_gltf_primitive.cpp +35 -0
- data/ext/tiny_gltf/rb_tiny_gltf_sampler.cpp +16 -0
- data/ext/tiny_gltf/rb_tiny_gltf_scene.cpp +17 -0
- data/ext/tiny_gltf/rb_tiny_gltf_skin.cpp +17 -0
- data/ext/tiny_gltf/rb_tiny_gltf_texture.cpp +14 -0
- data/ext/tiny_gltf/rb_tiny_gltf_types.cpp +229 -0
- data/ext/tiny_gltf/rb_tiny_gltf_value.cpp +32 -0
- data/ext/tiny_gltf/stb_image.h +6509 -0
- data/ext/tiny_gltf/stb_image_write.h +1831 -0
- data/ext/tiny_gltf/tiny_gltf.h +4830 -0
- data/lib/tiny_gltf.rb +260 -0
- data/lib/tiny_gltf/version.rb +3 -0
- data/tiny_gltf.gemspec +43 -0
- metadata +189 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
#include "rb_tiny_gltf.h"
|
2
|
+
|
3
|
+
VALUE rLight_new(const Light *light) {
|
4
|
+
VALUE rlight = rb_funcall(rb_cLight, rb_intern("new"), 0);
|
5
|
+
// *Light_unwrap(rlight) = *light;
|
6
|
+
|
7
|
+
VALUE rcolor = rb_ary_new();
|
8
|
+
for (size_t i = 0; i < light->color.size(); i++)
|
9
|
+
rb_ary_push(rcolor, DBL2NUM(light->color[i]));
|
10
|
+
|
11
|
+
rb_ivar_set(rlight, rb_intern("@name"), rb_str_new2(light->name.c_str()));
|
12
|
+
rb_ivar_set(rlight, rb_intern("@type"), rb_intern(light->type.c_str()));
|
13
|
+
rb_ivar_set(rlight, rb_intern("@color"), rcolor);
|
14
|
+
|
15
|
+
return rlight;
|
16
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#include "rb_tiny_gltf.h"
|
2
|
+
|
3
|
+
VALUE rMaterial_new(const Material *matr) {
|
4
|
+
VALUE rmatr = rb_funcall(rb_cMaterial, rb_intern("new"), 0);
|
5
|
+
// *Material_unwrap(rmatr) = *matr;
|
6
|
+
|
7
|
+
rb_ivar_set(rmatr, rb_intern("@name"), rb_str_new2(matr->name.c_str()));
|
8
|
+
rb_ivar_set(rmatr, rb_intern("@values"), rParameterMap_new(&matr->values));
|
9
|
+
rb_ivar_set(rmatr, rb_intern("@additional_values"), rParameterMap_new(&matr->additionalValues));
|
10
|
+
rb_ivar_set(rmatr, rb_intern("@extensions"), rExtensionMap_new(&matr->extensions));
|
11
|
+
rb_ivar_set(rmatr, rb_intern("@extras"), rValue_new(&matr->extras));
|
12
|
+
|
13
|
+
return rmatr;
|
14
|
+
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#include "rb_tiny_gltf.h"
|
2
|
+
|
3
|
+
VALUE rMesh_new(const Mesh *mesh) {
|
4
|
+
VALUE rmesh = rb_funcall(rb_cMesh, rb_intern("new"), 0);
|
5
|
+
// *Mesh_unwrap(rmesh) = *mesh;
|
6
|
+
|
7
|
+
VALUE rtargets = rb_ary_new();
|
8
|
+
for (size_t i = 0; i < mesh->targets.size(); i++) {
|
9
|
+
VALUE rtarget = rb_hash_new();
|
10
|
+
rb_ary_push(rtargets, rtarget);
|
11
|
+
for (std::map<std::string, int>::const_iterator it = mesh->targets[i].begin();
|
12
|
+
it != mesh->targets[i].end(); ++it) {
|
13
|
+
std::string key = it->first;
|
14
|
+
std::transform(key.begin(), key.end(), key.begin(), ::tolower);
|
15
|
+
rb_hash_aset(rtarget, ID2SYM(rb_intern(key.c_str())), INT2NUM(it->second));
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
VALUE rprimitives = rb_ary_new();
|
20
|
+
for (size_t i = 0; i < mesh->primitives.size(); i++) {
|
21
|
+
rb_ary_push(rprimitives, rPrimitive_new(&mesh->primitives[i]));
|
22
|
+
}
|
23
|
+
|
24
|
+
VALUE rweights = rb_ary_new();
|
25
|
+
for (size_t i = 0; i < mesh->weights.size(); i++) {
|
26
|
+
rb_ary_push(rprimitives, DBL2NUM(mesh->weights[i]));
|
27
|
+
}
|
28
|
+
|
29
|
+
rb_ivar_set(rmesh, rb_intern("@name"), rb_str_new2(mesh->name.c_str()));
|
30
|
+
rb_ivar_set(rmesh, rb_intern("@primitives"), rprimitives);
|
31
|
+
rb_ivar_set(rmesh, rb_intern("@weights"), rweights);
|
32
|
+
rb_ivar_set(rmesh, rb_intern("@extensions"), rExtensionMap_new(&mesh->extensions));
|
33
|
+
rb_ivar_set(rmesh, rb_intern("@morph_targets"), rtargets);
|
34
|
+
rb_ivar_set(rmesh, rb_intern("@extras"), rValue_new(&mesh->extras));
|
35
|
+
|
36
|
+
return rmesh;
|
37
|
+
}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#include "rb_tiny_gltf.h"
|
2
|
+
|
3
|
+
VALUE rModel_new(const Model *model) {
|
4
|
+
VALUE rmodel = rb_funcall(rb_cModel, rb_intern("new"), 0);
|
5
|
+
// *Model_unwrap(rmodel) = *model;
|
6
|
+
|
7
|
+
VALUE rext_used = rb_ary_new();
|
8
|
+
for (size_t i = 0; i < model->extensionsUsed.size(); i++)
|
9
|
+
rb_ary_push(rext_used, rb_str_new2(model->extensionsUsed[i].c_str()));
|
10
|
+
|
11
|
+
VALUE rext_required = rb_ary_new();
|
12
|
+
for (size_t i = 0; i < model->extensionsRequired.size(); i++)
|
13
|
+
rb_ary_push(rext_required, rb_str_new2(model->extensionsRequired[i].c_str()));
|
14
|
+
|
15
|
+
rb_ivar_set(rmodel, rb_intern("@asset"), rAsset_new(&model->asset));
|
16
|
+
rb_ivar_set(rmodel, rb_intern("@default_scene_index"), INT2NUM(model->defaultScene));
|
17
|
+
rb_ivar_set(rmodel, rb_intern("@extensions"), rExtensionMap_new(&model->extensions));
|
18
|
+
rb_ivar_set(rmodel, rb_intern("@extras"), rValue_new(&model->extras));
|
19
|
+
rb_ivar_set(rmodel, rb_intern("@extensions_used"), rext_used);
|
20
|
+
rb_ivar_set(rmodel, rb_intern("@extensions_required"), rext_required);
|
21
|
+
|
22
|
+
/*
|
23
|
+
VALUE ary = rb_funcall(rmodel, rb_intern("accessors"), 0);
|
24
|
+
for (size_t i = 0; i < model->accessors.size(); i++) {
|
25
|
+
rb_ary_push(ary, rAccessor_new(&model->accessors[i]));
|
26
|
+
}
|
27
|
+
*/
|
28
|
+
#define CONCAT_VECTOR_TO_RARRAY3(klass, name, method) { \
|
29
|
+
VALUE ary = rb_funcall(rmodel, rb_intern(method), 0); \
|
30
|
+
for (size_t i = 0; i < model->name.size(); i++) { \
|
31
|
+
rb_ary_push(ary, r ## klass ## _new(&model->name[i])); \
|
32
|
+
} \
|
33
|
+
}
|
34
|
+
#define CONCAT_VECTOR_TO_RARRAY(klass, name) CONCAT_VECTOR_TO_RARRAY3(klass, name, #name)
|
35
|
+
|
36
|
+
CONCAT_VECTOR_TO_RARRAY(Accessor, accessors);
|
37
|
+
CONCAT_VECTOR_TO_RARRAY(Animation, animations);
|
38
|
+
CONCAT_VECTOR_TO_RARRAY(Buffer, buffers);
|
39
|
+
CONCAT_VECTOR_TO_RARRAY3(BufferView, bufferViews, "buffer_views");
|
40
|
+
CONCAT_VECTOR_TO_RARRAY(Material, materials);
|
41
|
+
CONCAT_VECTOR_TO_RARRAY(Mesh, meshes);
|
42
|
+
CONCAT_VECTOR_TO_RARRAY(Node, nodes);
|
43
|
+
CONCAT_VECTOR_TO_RARRAY(Texture, textures);
|
44
|
+
CONCAT_VECTOR_TO_RARRAY(Image, images);
|
45
|
+
CONCAT_VECTOR_TO_RARRAY(Skin, skins);
|
46
|
+
CONCAT_VECTOR_TO_RARRAY(Sampler, samplers);
|
47
|
+
CONCAT_VECTOR_TO_RARRAY(Camera, cameras);
|
48
|
+
CONCAT_VECTOR_TO_RARRAY(Scene, scenes);
|
49
|
+
CONCAT_VECTOR_TO_RARRAY(Light, lights);
|
50
|
+
|
51
|
+
return rmodel;
|
52
|
+
}
|
@@ -0,0 +1,67 @@
|
|
1
|
+
#include "rb_tiny_gltf.h"
|
2
|
+
|
3
|
+
VALUE rNode_new(const Node *node) {
|
4
|
+
VALUE rnode = rb_funcall(rb_cNode, rb_intern("new"), 0);
|
5
|
+
// *Node_unwrap(rnode) = *node;
|
6
|
+
|
7
|
+
VALUE rweights = rb_ary_new();
|
8
|
+
for (size_t i = 0; i < node->weights.size(); i++)
|
9
|
+
rb_ary_push(rweights, DBL2NUM(node->weights[i]));
|
10
|
+
|
11
|
+
VALUE rchildren = rb_ary_new();
|
12
|
+
for (size_t i = 0; i < node->children.size(); i++)
|
13
|
+
rb_ary_push(rchildren, INT2NUM(node->children[i]));
|
14
|
+
|
15
|
+
VALUE rmatrix = Qnil, rrotation = Qnil, rtranslation = Qnil, rscale = Qnil;
|
16
|
+
if (node->matrix.size() == 0) {
|
17
|
+
rrotation = rb_ary_new();
|
18
|
+
if (node->rotation.size() == 0) {
|
19
|
+
rb_ary_push(rrotation, INT2NUM(0));
|
20
|
+
rb_ary_push(rrotation, INT2NUM(0));
|
21
|
+
rb_ary_push(rrotation, INT2NUM(0));
|
22
|
+
rb_ary_push(rrotation, INT2NUM(1));
|
23
|
+
} else {
|
24
|
+
for (size_t i = 0; i < node->rotation.size(); i++)
|
25
|
+
rb_ary_push(rrotation, INT2NUM(node->rotation[i]));
|
26
|
+
}
|
27
|
+
|
28
|
+
rscale = rb_ary_new();
|
29
|
+
if (node->rotation.size() == 0) {
|
30
|
+
rb_ary_push(rscale, INT2NUM(0));
|
31
|
+
rb_ary_push(rscale, INT2NUM(0));
|
32
|
+
rb_ary_push(rscale, INT2NUM(0));
|
33
|
+
} else {
|
34
|
+
for (size_t i = 0; i < node->scale.size(); i++)
|
35
|
+
rb_ary_push(rscale, INT2NUM(node->scale[i]));
|
36
|
+
}
|
37
|
+
|
38
|
+
rtranslation = rb_ary_new();
|
39
|
+
if (node->translation.size() == 0) {
|
40
|
+
rb_ary_push(rtranslation, INT2NUM(0));
|
41
|
+
rb_ary_push(rtranslation, INT2NUM(0));
|
42
|
+
rb_ary_push(rtranslation, INT2NUM(0));
|
43
|
+
} else {
|
44
|
+
for (size_t i = 0; i < node->translation.size(); i++)
|
45
|
+
rb_ary_push(rtranslation, INT2NUM(node->translation[i]));
|
46
|
+
}
|
47
|
+
} else {
|
48
|
+
rmatrix = rb_ary_new();
|
49
|
+
for (size_t i = 0; i < node->matrix.size(); i++)
|
50
|
+
rb_ary_push(rmatrix, INT2NUM(node->matrix[i]));
|
51
|
+
}
|
52
|
+
|
53
|
+
rb_ivar_set(rnode, rb_intern("@name"), rb_str_new2(node->name.c_str()));
|
54
|
+
rb_ivar_set(rnode, rb_intern("@camera_index"), INT2NUM(node->camera));
|
55
|
+
rb_ivar_set(rnode, rb_intern("@skin_index"), INT2NUM(node->skin));
|
56
|
+
rb_ivar_set(rnode, rb_intern("@mesh_index"), INT2NUM(node->mesh));
|
57
|
+
rb_ivar_set(rnode, rb_intern("@children_indices"), rchildren);
|
58
|
+
rb_ivar_set(rnode, rb_intern("@rotation"), rrotation);
|
59
|
+
rb_ivar_set(rnode, rb_intern("@translation"), rtranslation);
|
60
|
+
rb_ivar_set(rnode, rb_intern("@scale"), rscale);
|
61
|
+
rb_ivar_set(rnode, rb_intern("@matrix"), rmatrix);
|
62
|
+
rb_ivar_set(rnode, rb_intern("@weights"), rweights);
|
63
|
+
rb_ivar_set(rnode, rb_intern("@extensions"), rExtensionMap_new(&node->extensions));
|
64
|
+
rb_ivar_set(rnode, rb_intern("@extras"), rValue_new(&node->extras));
|
65
|
+
|
66
|
+
return rnode;
|
67
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#include "rb_tiny_gltf.h"
|
2
|
+
|
3
|
+
VALUE rParameterMap_new(const ParameterMap *value) {
|
4
|
+
VALUE res = Qnil;
|
5
|
+
|
6
|
+
for (ParameterMap::const_iterator paramIt = value->begin(); paramIt != value->end();
|
7
|
+
++paramIt) {
|
8
|
+
if (NIL_P(res)) res = rb_hash_new();
|
9
|
+
VALUE key = ID2SYM(rb_intern(paramIt->first.c_str()));
|
10
|
+
VALUE val = Qnil;
|
11
|
+
|
12
|
+
if (paramIt->second.number_array.size()) {
|
13
|
+
val = rb_ary_new();
|
14
|
+
for (size_t i = 0; i < paramIt->second.number_array.size(); i++)
|
15
|
+
rb_ary_push(val, DBL2NUM(paramIt->second.number_array[i]));
|
16
|
+
} else if (paramIt->second.json_double_value.size()) {
|
17
|
+
val = rb_hash_new();
|
18
|
+
for (std::map<std::string, double>::const_iterator it =
|
19
|
+
paramIt->second.json_double_value.begin();
|
20
|
+
it != paramIt->second.json_double_value.end(); ++it) {
|
21
|
+
if (it->first == "index") {
|
22
|
+
rb_hash_aset(val, ID2SYM(rb_intern("index")), INT2NUM(paramIt->second.TextureIndex()));
|
23
|
+
} else {
|
24
|
+
rb_hash_aset(val, ID2SYM(rb_intern(it->first.c_str())), DBL2NUM(it->second));
|
25
|
+
}
|
26
|
+
}
|
27
|
+
} else if (!paramIt->second.string_value.empty()) {
|
28
|
+
val = rb_str_new2(paramIt->second.string_value.c_str());
|
29
|
+
} else if (paramIt->second.has_number_value) {
|
30
|
+
val = DBL2NUM(paramIt->second.number_value);
|
31
|
+
} else {
|
32
|
+
val = paramIt->second.bool_value ? Qtrue : Qfalse;
|
33
|
+
}
|
34
|
+
|
35
|
+
rb_hash_aset(res, key, val);
|
36
|
+
}
|
37
|
+
|
38
|
+
return res;
|
39
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#include "rb_tiny_gltf.h"
|
2
|
+
|
3
|
+
VALUE rPrimitive_new(const Primitive *prim) {
|
4
|
+
VALUE rprim = rb_funcall(rb_cPrimitive, rb_intern("new"), 0);
|
5
|
+
// *Primitive_unwrap(rprim) = *prim;
|
6
|
+
|
7
|
+
VALUE rattrs = rb_hash_new();
|
8
|
+
for (std::map<std::string, int>::const_iterator it = prim->attributes.begin();
|
9
|
+
it != prim->attributes.end(); ++it) {
|
10
|
+
std::string key = it->first;
|
11
|
+
std::transform(key.begin(), key.end(), key.begin(), ::tolower);
|
12
|
+
rb_hash_aset(rattrs, ID2SYM(rb_intern(key.c_str())), INT2NUM(it->second));
|
13
|
+
}
|
14
|
+
|
15
|
+
VALUE rtargets = rb_ary_new();
|
16
|
+
for (size_t i = 0; i < prim->targets.size(); i++) {
|
17
|
+
VALUE rtarget = rb_hash_new();
|
18
|
+
rb_ary_push(rtargets, rtarget);
|
19
|
+
for (std::map<std::string, int>::const_iterator it = prim->targets[i].begin();
|
20
|
+
it != prim->targets[i].end(); ++it) {
|
21
|
+
std::string key = it->first;
|
22
|
+
std::transform(key.begin(), key.end(), key.begin(), ::tolower);
|
23
|
+
rb_hash_aset(rtarget, ID2SYM(rb_intern(key.c_str())), INT2NUM(it->second));
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
rb_ivar_set(rprim, rb_intern("@attributes"), rattrs);
|
28
|
+
rb_ivar_set(rprim, rb_intern("@material_index"), INT2NUM(prim->material));
|
29
|
+
rb_ivar_set(rprim, rb_intern("@indices"), INT2NUM(prim->indices));
|
30
|
+
rb_ivar_set(rprim, rb_intern("@mode"), mode_to_sym(prim->mode));
|
31
|
+
rb_ivar_set(rprim, rb_intern("@morph_targets"), rtargets);
|
32
|
+
rb_ivar_set(rprim, rb_intern("@extras"), rValue_new(&prim->extras));
|
33
|
+
|
34
|
+
return rprim;
|
35
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#include "rb_tiny_gltf.h"
|
2
|
+
|
3
|
+
VALUE rSampler_new(const Sampler *sampler) {
|
4
|
+
VALUE rsampler = rb_funcall(rb_cSampler, rb_intern("new"), 0);
|
5
|
+
// *Sampler_unwrap(rsampler) = *sampler;
|
6
|
+
|
7
|
+
rb_ivar_set(rsampler, rb_intern("@name"), rb_str_new2(sampler->name.c_str()));
|
8
|
+
rb_ivar_set(rsampler, rb_intern("@min_filter"), texture_filter_to_sym(sampler->minFilter));
|
9
|
+
rb_ivar_set(rsampler, rb_intern("@mag_filter"), texture_filter_to_sym(sampler->magFilter));
|
10
|
+
rb_ivar_set(rsampler, rb_intern("@wrap_s"), texture_wrap_to_sym(sampler->wrapS));
|
11
|
+
rb_ivar_set(rsampler, rb_intern("@wrap_t"), texture_wrap_to_sym(sampler->wrapT));
|
12
|
+
rb_ivar_set(rsampler, rb_intern("@wrap_r"), texture_wrap_to_sym(sampler->wrapR));
|
13
|
+
rb_ivar_set(rsampler, rb_intern("@extras"), rValue_new(&sampler->extras));
|
14
|
+
|
15
|
+
return rsampler;
|
16
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#include "rb_tiny_gltf.h"
|
2
|
+
|
3
|
+
VALUE rScene_new(const Scene *scene) {
|
4
|
+
VALUE rscene = rb_funcall(rb_cScene, rb_intern("new"), 0);
|
5
|
+
// *Scene_unwrap(rscene) = *scene;
|
6
|
+
|
7
|
+
VALUE rnodes = rb_ary_new();
|
8
|
+
for (size_t i = 0; i < scene->nodes.size(); i++)
|
9
|
+
rb_ary_push(rnodes, INT2NUM(scene->nodes[i]));
|
10
|
+
|
11
|
+
rb_ivar_set(rscene, rb_intern("@name"), rb_str_new2(scene->name.c_str()));
|
12
|
+
rb_ivar_set(rscene, rb_intern("@nodes"), rnodes);
|
13
|
+
rb_ivar_set(rscene, rb_intern("@extensions"), rExtensionMap_new(&scene->extensions));
|
14
|
+
rb_ivar_set(rscene, rb_intern("@extras"), rValue_new(&scene->extras));
|
15
|
+
|
16
|
+
return rscene;
|
17
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#include "rb_tiny_gltf.h"
|
2
|
+
|
3
|
+
VALUE rSkin_new(const Skin *skin) {
|
4
|
+
VALUE rskin = rb_funcall(rb_cSkin, rb_intern("new"), 0);
|
5
|
+
// *Skin_unwrap(rskin) = *skin;
|
6
|
+
|
7
|
+
VALUE rjoints = rb_ary_new();
|
8
|
+
for (size_t i = 0; i < skin->joints.size(); i++)
|
9
|
+
rb_ary_push(rjoints, INT2NUM(skin->joints[i]));
|
10
|
+
|
11
|
+
rb_ivar_set(rskin, rb_intern("@name"), rb_str_new2(skin->name.c_str()));
|
12
|
+
rb_ivar_set(rskin, rb_intern("@inverse_bind_matrices"), INT2NUM(skin->inverseBindMatrices));
|
13
|
+
rb_ivar_set(rskin, rb_intern("@skeleton_root_node_index"), INT2NUM(skin->skeleton));
|
14
|
+
rb_ivar_set(rskin, rb_intern("@joints"), rjoints);
|
15
|
+
|
16
|
+
return rskin;
|
17
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#include "rb_tiny_gltf.h"
|
2
|
+
|
3
|
+
VALUE rTexture_new(const Texture *texture) {
|
4
|
+
VALUE rtexture = rb_funcall(rb_cTexture, rb_intern("new"), 0);
|
5
|
+
// *Texture_unwrap(rtexture) = *texture;
|
6
|
+
|
7
|
+
rb_ivar_set(rtexture, rb_intern("@name"), rb_str_new2(texture->name.c_str()));
|
8
|
+
rb_ivar_set(rtexture, rb_intern("@sampler_index"), INT2NUM(texture->sampler));
|
9
|
+
rb_ivar_set(rtexture, rb_intern("@source_index"), INT2NUM(texture->source));
|
10
|
+
rb_ivar_set(rtexture, rb_intern("@extensions"), rExtensionMap_new(&texture->extensions));
|
11
|
+
rb_ivar_set(rtexture, rb_intern("@extras"), rValue_new(&texture->extras));
|
12
|
+
|
13
|
+
return rtexture;
|
14
|
+
}
|
@@ -0,0 +1,229 @@
|
|
1
|
+
#include "rb_tiny_gltf.h"
|
2
|
+
|
3
|
+
/*
|
4
|
+
void model_free(void* data) {
|
5
|
+
Model *model = (Model *) data;
|
6
|
+
delete model;
|
7
|
+
}
|
8
|
+
|
9
|
+
size_t model_size(const void* data) {
|
10
|
+
return sizeof(Model);
|
11
|
+
}
|
12
|
+
|
13
|
+
static const rb_data_type_t T_Model = {
|
14
|
+
.wrap_struct_name = "TinyGLTFModel",
|
15
|
+
.function = {
|
16
|
+
.dmark = NULL,
|
17
|
+
.dfree = model_free,
|
18
|
+
.dsize = model_size,
|
19
|
+
.reserved = { 0, 0 }
|
20
|
+
},
|
21
|
+
.parent = NULL,
|
22
|
+
.data = NULL,
|
23
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
24
|
+
};
|
25
|
+
|
26
|
+
VALUE alloc_model(VALUE klass) {
|
27
|
+
return TypedData_Wrap_Struct(klass, &T_Model, new Model());
|
28
|
+
}
|
29
|
+
|
30
|
+
VALUE Model_is_equal(VALUE self, VALUE other) {
|
31
|
+
Model *a, *b;
|
32
|
+
TypedData_Get_Struct(self, Model, &T_Model, a);
|
33
|
+
TypedData_Get_Struct(other, Model, &T_Model, b);
|
34
|
+
return (*a) == (*b) ? Qtrue : Qfalse;
|
35
|
+
}
|
36
|
+
*/
|
37
|
+
#define DEFN_GLTF_TYPE(klass) \
|
38
|
+
void klass ## _free(void* data) { \
|
39
|
+
klass *obj = (klass *) data; \
|
40
|
+
delete obj; \
|
41
|
+
} \
|
42
|
+
\
|
43
|
+
size_t klass ## _size(const void* data) { \
|
44
|
+
return sizeof(klass); \
|
45
|
+
} \
|
46
|
+
\
|
47
|
+
const rb_data_type_t T_ ## klass = { \
|
48
|
+
.wrap_struct_name = "TinyGLTF" #klass, \
|
49
|
+
.function = { \
|
50
|
+
.dmark = NULL, \
|
51
|
+
.dfree = klass ## _free, \
|
52
|
+
.dsize = klass ## _size, \
|
53
|
+
.reserved = { 0, 0 } \
|
54
|
+
}, \
|
55
|
+
.parent = NULL, \
|
56
|
+
.data = NULL, \
|
57
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY \
|
58
|
+
}; \
|
59
|
+
\
|
60
|
+
VALUE klass ## _alloc(VALUE k) { \
|
61
|
+
return TypedData_Wrap_Struct(k, &T_ ## klass, new klass()); \
|
62
|
+
} \
|
63
|
+
\
|
64
|
+
VALUE klass ## _is_equal(VALUE self, VALUE other) { \
|
65
|
+
klass *a, *b; \
|
66
|
+
TypedData_Get_Struct(self, klass, &T_ ## klass, a); \
|
67
|
+
TypedData_Get_Struct(other, klass, &T_ ## klass, b); \
|
68
|
+
return (*a) == (*b) ? Qtrue : Qfalse; \
|
69
|
+
}
|
70
|
+
|
71
|
+
DEFN_GLTF_TYPE(Model);
|
72
|
+
DEFN_GLTF_TYPE(Asset);
|
73
|
+
DEFN_GLTF_TYPE(Accessor);
|
74
|
+
DEFN_GLTF_TYPE(Animation);
|
75
|
+
DEFN_GLTF_TYPE(AnimationChannel);
|
76
|
+
DEFN_GLTF_TYPE(AnimationSampler);
|
77
|
+
DEFN_GLTF_TYPE(Buffer);
|
78
|
+
DEFN_GLTF_TYPE(BufferView);
|
79
|
+
DEFN_GLTF_TYPE(Material);
|
80
|
+
DEFN_GLTF_TYPE(Mesh);
|
81
|
+
DEFN_GLTF_TYPE(Node);
|
82
|
+
DEFN_GLTF_TYPE(Primitive);
|
83
|
+
DEFN_GLTF_TYPE(Texture);
|
84
|
+
DEFN_GLTF_TYPE(Image);
|
85
|
+
DEFN_GLTF_TYPE(Skin);
|
86
|
+
DEFN_GLTF_TYPE(Sampler);
|
87
|
+
DEFN_GLTF_TYPE(Camera);
|
88
|
+
DEFN_GLTF_TYPE(Scene);
|
89
|
+
DEFN_GLTF_TYPE(Light);
|
90
|
+
|
91
|
+
VALUE mode_to_sym(int mode) {
|
92
|
+
switch(mode) {
|
93
|
+
case TINYGLTF_MODE_POINTS: return ID2SYM(rb_intern("points"));
|
94
|
+
case TINYGLTF_MODE_LINE: return ID2SYM(rb_intern("line"));
|
95
|
+
case TINYGLTF_MODE_LINE_LOOP: return ID2SYM(rb_intern("line_loop"));
|
96
|
+
case TINYGLTF_MODE_TRIANGLES: return ID2SYM(rb_intern("triangles"));
|
97
|
+
case TINYGLTF_MODE_TRIANGLE_STRIP: return ID2SYM(rb_intern("triangle_strip"));
|
98
|
+
case TINYGLTF_MODE_TRIANGLE_FAN: return ID2SYM(rb_intern("triangle_fan"));
|
99
|
+
default: return ID2SYM(rb_intern("unknown"));
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
VALUE component_type_to_sym(int type) {
|
104
|
+
switch(type) {
|
105
|
+
case TINYGLTF_COMPONENT_TYPE_BYTE: return ID2SYM(rb_intern("byte"));
|
106
|
+
case TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE: return ID2SYM(rb_intern("ubyte"));
|
107
|
+
case TINYGLTF_COMPONENT_TYPE_SHORT: return ID2SYM(rb_intern("short"));
|
108
|
+
case TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT: return ID2SYM(rb_intern("ushort"));
|
109
|
+
case TINYGLTF_COMPONENT_TYPE_INT: return ID2SYM(rb_intern("int"));
|
110
|
+
case TINYGLTF_COMPONENT_TYPE_UNSIGNED_INT: return ID2SYM(rb_intern("uint"));
|
111
|
+
case TINYGLTF_COMPONENT_TYPE_FLOAT: return ID2SYM(rb_intern("float"));
|
112
|
+
case TINYGLTF_COMPONENT_TYPE_DOUBLE: return ID2SYM(rb_intern("double"));
|
113
|
+
default: return ID2SYM(rb_intern("unknown"));
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
VALUE texture_filter_to_sym(int filter) {
|
118
|
+
switch(filter) {
|
119
|
+
case TINYGLTF_TEXTURE_FILTER_NEAREST: return ID2SYM(rb_intern("nearest"));
|
120
|
+
case TINYGLTF_TEXTURE_FILTER_LINEAR: return ID2SYM(rb_intern("linear"));
|
121
|
+
case TINYGLTF_TEXTURE_FILTER_NEAREST_MIPMAP_NEAREST: return ID2SYM(rb_intern("nearest_mipmap_nearest"));
|
122
|
+
case TINYGLTF_TEXTURE_FILTER_LINEAR_MIPMAP_NEAREST: return ID2SYM(rb_intern("linear_mipmap_nearest"));
|
123
|
+
case TINYGLTF_TEXTURE_FILTER_NEAREST_MIPMAP_LINEAR: return ID2SYM(rb_intern("nearest_mipmap_linear"));
|
124
|
+
case TINYGLTF_TEXTURE_FILTER_LINEAR_MIPMAP_LINEAR: return ID2SYM(rb_intern("linear_mipmap_linear"));
|
125
|
+
default: return ID2SYM(rb_intern("unknown"));
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
VALUE texture_wrap_to_sym(int wrap) {
|
130
|
+
switch(wrap) {
|
131
|
+
case TINYGLTF_TEXTURE_WRAP_REPEAT: return ID2SYM(rb_intern("repeat"));
|
132
|
+
case TINYGLTF_TEXTURE_WRAP_CLAMP_TO_EDGE: return ID2SYM(rb_intern("clamp_to_edge"));
|
133
|
+
case TINYGLTF_TEXTURE_WRAP_MIRRORED_REPEAT: return ID2SYM(rb_intern("mirrored_repeat"));
|
134
|
+
default: return ID2SYM(rb_intern("unknown"));
|
135
|
+
}
|
136
|
+
}
|
137
|
+
|
138
|
+
VALUE parameter_type_to_sym(int type) {
|
139
|
+
switch(type) {
|
140
|
+
case TINYGLTF_PARAMETER_TYPE_BYTE: return ID2SYM(rb_intern("byte"));
|
141
|
+
case TINYGLTF_PARAMETER_TYPE_UNSIGNED_BYTE: return ID2SYM(rb_intern("ubyte"));
|
142
|
+
case TINYGLTF_PARAMETER_TYPE_SHORT: return ID2SYM(rb_intern("short"));
|
143
|
+
case TINYGLTF_PARAMETER_TYPE_UNSIGNED_SHORT: return ID2SYM(rb_intern("ushort"));
|
144
|
+
case TINYGLTF_PARAMETER_TYPE_INT: return ID2SYM(rb_intern("int"));
|
145
|
+
case TINYGLTF_PARAMETER_TYPE_UNSIGNED_INT: return ID2SYM(rb_intern("uint"));
|
146
|
+
case TINYGLTF_PARAMETER_TYPE_FLOAT: return ID2SYM(rb_intern("float"));
|
147
|
+
case TINYGLTF_PARAMETER_TYPE_FLOAT_VEC2: return ID2SYM(rb_intern("float_vec2"));
|
148
|
+
case TINYGLTF_PARAMETER_TYPE_FLOAT_VEC3: return ID2SYM(rb_intern("float_vec3"));
|
149
|
+
case TINYGLTF_PARAMETER_TYPE_FLOAT_VEC4: return ID2SYM(rb_intern("float_vec4"));
|
150
|
+
case TINYGLTF_PARAMETER_TYPE_INT_VEC2: return ID2SYM(rb_intern("int_vec2"));
|
151
|
+
case TINYGLTF_PARAMETER_TYPE_INT_VEC3: return ID2SYM(rb_intern("int_vec3"));
|
152
|
+
case TINYGLTF_PARAMETER_TYPE_INT_VEC4: return ID2SYM(rb_intern("int_vec4"));
|
153
|
+
case TINYGLTF_PARAMETER_TYPE_BOOL: return ID2SYM(rb_intern("bool"));
|
154
|
+
case TINYGLTF_PARAMETER_TYPE_BOOL_VEC2: return ID2SYM(rb_intern("bool_vec2"));
|
155
|
+
case TINYGLTF_PARAMETER_TYPE_BOOL_VEC3: return ID2SYM(rb_intern("bool_vec3"));
|
156
|
+
case TINYGLTF_PARAMETER_TYPE_BOOL_VEC4: return ID2SYM(rb_intern("bool_vec4"));
|
157
|
+
case TINYGLTF_PARAMETER_TYPE_FLOAT_MAT2: return ID2SYM(rb_intern("float_mat2"));
|
158
|
+
case TINYGLTF_PARAMETER_TYPE_FLOAT_MAT3: return ID2SYM(rb_intern("float_mat3"));
|
159
|
+
case TINYGLTF_PARAMETER_TYPE_FLOAT_MAT4: return ID2SYM(rb_intern("float_mat4"));
|
160
|
+
case TINYGLTF_PARAMETER_TYPE_SAMPLER_2D: return ID2SYM(rb_intern("sampler_2d"));
|
161
|
+
default: return ID2SYM(rb_intern("unknown"));
|
162
|
+
}
|
163
|
+
}
|
164
|
+
|
165
|
+
VALUE type_to_sym(int type) {
|
166
|
+
switch(type) {
|
167
|
+
case TINYGLTF_TYPE_VEC2: return ID2SYM(rb_intern("vec2"));
|
168
|
+
case TINYGLTF_TYPE_VEC3: return ID2SYM(rb_intern("vec3"));
|
169
|
+
case TINYGLTF_TYPE_VEC4: return ID2SYM(rb_intern("vec4"));
|
170
|
+
case TINYGLTF_TYPE_MAT2: return ID2SYM(rb_intern("mat2"));
|
171
|
+
case TINYGLTF_TYPE_MAT3: return ID2SYM(rb_intern("mat3"));
|
172
|
+
case TINYGLTF_TYPE_MAT4: return ID2SYM(rb_intern("mat4"));
|
173
|
+
case TINYGLTF_TYPE_SCALAR: return ID2SYM(rb_intern("scalar"));
|
174
|
+
case TINYGLTF_TYPE_VECTOR: return ID2SYM(rb_intern("vector"));
|
175
|
+
case TINYGLTF_TYPE_MATRIX: return ID2SYM(rb_intern("matrix"));
|
176
|
+
default: return ID2SYM(rb_intern("unknown"));
|
177
|
+
}
|
178
|
+
}
|
179
|
+
|
180
|
+
VALUE image_format_to_sym(int fmt) {
|
181
|
+
switch(fmt) {
|
182
|
+
case TINYGLTF_IMAGE_FORMAT_JPEG: return ID2SYM(rb_intern("jpeg"));
|
183
|
+
case TINYGLTF_IMAGE_FORMAT_PNG: return ID2SYM(rb_intern("png"));
|
184
|
+
case TINYGLTF_IMAGE_FORMAT_BMP: return ID2SYM(rb_intern("bmp"));
|
185
|
+
case TINYGLTF_IMAGE_FORMAT_GIF: return ID2SYM(rb_intern("gif"));
|
186
|
+
default: return ID2SYM(rb_intern("unknown"));
|
187
|
+
}
|
188
|
+
}
|
189
|
+
|
190
|
+
VALUE texture_format_to_sym(int fmt) {
|
191
|
+
switch(fmt) {
|
192
|
+
case TINYGLTF_TEXTURE_FORMAT_ALPHA: return ID2SYM(rb_intern("alpha"));
|
193
|
+
case TINYGLTF_TEXTURE_FORMAT_RGB: return ID2SYM(rb_intern("rgb"));
|
194
|
+
case TINYGLTF_TEXTURE_FORMAT_RGBA: return ID2SYM(rb_intern("rgba"));
|
195
|
+
case TINYGLTF_TEXTURE_FORMAT_LUMINANCE: return ID2SYM(rb_intern("luminance"));
|
196
|
+
case TINYGLTF_TEXTURE_FORMAT_LUMINANCE_ALPHA: return ID2SYM(rb_intern("luminance_alpha"));
|
197
|
+
default: return ID2SYM(rb_intern("unknown"));
|
198
|
+
}
|
199
|
+
}
|
200
|
+
|
201
|
+
VALUE texture_target_to_sym(int tgt) {
|
202
|
+
switch(tgt) {
|
203
|
+
case TINYGLTF_TEXTURE_TARGET_TEXTURE2D: return ID2SYM(rb_intern("texture2d"));
|
204
|
+
default: return ID2SYM(rb_intern("unknown"));
|
205
|
+
}
|
206
|
+
}
|
207
|
+
|
208
|
+
VALUE texture_type_to_sym(int type) {
|
209
|
+
switch(type) {
|
210
|
+
case TINYGLTF_TEXTURE_TYPE_UNSIGNED_BYTE: return ID2SYM(rb_intern("ubyte"));
|
211
|
+
default: return ID2SYM(rb_intern("unknown"));
|
212
|
+
}
|
213
|
+
}
|
214
|
+
|
215
|
+
VALUE target_to_sym(int tgt) {
|
216
|
+
switch(tgt) {
|
217
|
+
case TINYGLTF_TARGET_ARRAY_BUFFER: return ID2SYM(rb_intern("array_buffer"));
|
218
|
+
case TINYGLTF_TARGET_ELEMENT_ARRAY_BUFFER: return ID2SYM(rb_intern("element_array_buffer"));
|
219
|
+
default: return ID2SYM(rb_intern("unknown"));
|
220
|
+
}
|
221
|
+
}
|
222
|
+
|
223
|
+
VALUE shader_type_to_sym(int type) {
|
224
|
+
switch(type) {
|
225
|
+
case TINYGLTF_SHADER_TYPE_VERTEX_SHADER: return ID2SYM(rb_intern("vertex_shader"));
|
226
|
+
case TINYGLTF_SHADER_TYPE_FRAGMENT_SHADER: return ID2SYM(rb_intern("fragment_shader"));
|
227
|
+
default: return ID2SYM(rb_intern("unknown"));
|
228
|
+
}
|
229
|
+
}
|