Module: TinyGLTF

Defined in:
lib/tiny_gltf.rb,
lib/tiny_gltf/version.rb,
ext/tiny_gltf/rb_tiny_gltf_init.c

Defined Under Namespace

Modules: Base Classes: Accessor, Animation, AnimationChannel, AnimationSampler, Asset, Buffer, BufferView, Camera, Error, Image, Light, Material, Mesh, Model, Node, Primitive, Sampler, Scene, Skin, Texture

Constant Summary collapse

IMAGE_URI_1PX_WHITE_OPAQUE_PNG =

If a sampler exists but does not reference an image, the GLTF spec indicates we should use a default image. You can specify your own default image by calling Model#default_image=. The default default image is constructed using this data, which represents a PNG-encoded, 1-pixel, opaque white image.

('data:image/png;base64,iVBORw0KGgoAAAANS'+
'UhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVR4'+
'nGP6DwABBQECz6AuzQAAAABJRU5ErkJggg==').freeze
VERSION =
"2.5.0.5"

Class Method Summary collapse

Class Method Details

.load(filename_or_data[, base_dir]) ⇒ new Model

Loads a model from the given file or data string. The data string can be ASCII or binary GLTF. base_dir is used to look up external dependencies such as images. If base_dir is omitted, it defaults to either the directory containing the file (if loading a file), or '.' (if loading a data string).

Returns the new model, or raises an error if the model could not be loaded.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'ext/tiny_gltf/rb_tiny_gltf.cpp', line 16

VALUE rb_tgltf_load(int argc, VALUE *argv, VALUE self) {
  TinyGLTF gltf;
  VALUE rstr, rbase_dir;
  rb_scan_args(argc, argv, "11", &rstr, &rbase_dir);
  VALUE is_file = rb_funcall(rb_cFile, rb_intern("exist?"), 1, rstr);

  if (NIL_P(rbase_dir)) {
    if (is_file == Qtrue) {
      rbase_dir = rb_funcall(rb_cFile, rb_intern("dirname"), 1, rstr);
    } else {
      rbase_dir = rb_str_new2(".");
    }
  }

  if (is_file) {
    VALUE rfile = rb_funcall(rb_cFile, rb_intern("open"), 2, rstr, rb_str_new2("rb"));
    rstr = rb_funcall(rfile, rb_intern("read"), 0);
    rb_funcall(rfile, rb_intern("close"), 0);
  }

  try {
    Model model;
    std::string err, warn, base_dir(StringValueCStr(rbase_dir));
    bool res;
    if (RSTRING_LEN(rstr) > 0 && *RSTRING_PTR(rstr) == 'g') { // 'glTF'
      res = gltf.LoadBinaryFromMemory(&model, &err, &warn,
                                      (unsigned char *) RSTRING_PTR(rstr), (unsigned int) RSTRING_LEN(rstr), base_dir);
    } else {
      res = gltf.LoadASCIIFromString( &model, &err, &warn,
                                      RSTRING_PTR(rstr), (unsigned int) RSTRING_LEN(rstr), base_dir);
    }
    if (err.size()  > 0) rb_raise(rb_eTinyGLTFError, "%s", err.c_str());
    if (warn.size() > 0) rb_raise(rb_eTinyGLTFError, "%s", warn.c_str());
    if (!res) rb_raise(rb_eTinyGLTFError, "unknown failure to load model");
    return rModel_new(&model);
  } catch(const std::exception &ex) {
    rb_raise(rb_eTinyGLTFError, "%s", ex.what());
  }
  return Qnil;
}