Repository files navigation

GLTFKit2

GLTFKit2 is an efficient glTF loader and exporter for Objective-C and Swift.

This project is a spiritual successor of the GLTFKit project, with many of the same aims, but some notable differences. GLTFKit2:

  • includes import and export (WIP), while GLTFKit was read-only.
  • strives to be as interoperable as possible, with extensions for Model I/O, SceneKit, and QuickLook.
  • tries to retain all of the information from the asset file, meaning extensions and extras are available to client code even if they are unrecognized by the loader.
  • uses cgltf and JSMN internally to load the JSON portion of glTF files, which is more efficient than parsing with NSJSONSerialization.

Usage

Using the Framework

The GLTFKit2 Xcode project is completely self-contained and can be used to build a Cocoa framework for macOS. If you want to use GLTFKit2 as a framework, link to it and embed it in your target. You can also opt to include the source directly in your app target.

Loading Assets

To load a glTF 2.0 model, import <GLTFKit2/GLTFKit2.h> and use the GLTFAsset class. Since assets can take a while to load, prefer to use the async loading methods.

Objective-C:

[GLTFAsset loadAssetWithURL:url
options:@{}
handler:^(float progress, GLTFAssetStatus status, GLTFAsset *asset, NSError *error, BOOL *stop)
{
// Check for completion and/or error, use asset if complete, etc.
}

Swift:

GLTFAsset.load(with: url, options:[:]){(progress, status, maybeAsset, maybeError, _)in
// Check for completion and/or error, use asset if complete, etc.
}

The URL must be a local file URL. Loading of remote assets and resources is not supported.

Interoperating with SceneKit

The framework can be used to easily transform glTF assets into SCNScenes to interoperate with SceneKit.

First, load the asset as shown above. Then, to get the default scene of a glTF asset, use the SCNScene class extension method +[SCNScene sceneWithGLTFAsset:].

Using Draco Mesh Decompression

GLTFKit2 supports meshes compressed with the Draco geometry compression library through a plugin system. To activate Draco decompression support, implement the GLTFDracoMeshDecompressor protocol in your target, then set the dracoDecompressorClassName property on GLTFAsset to the name of the conforming class. The framework will then use the supplied class to convert compressed mesh data into glTF primitives which are suitable for rendering. A sample Draco decompressor class is provided in the macOS GLTFViewer target. You are responsible for compiling and linking to the Draco library itself in your own target. If you would prefer not to compile the library yourself, consider using DracoSwift.

Using KTX2 with Basis Universal

GLTFKit2 optionally supports the KHR_texture_basisu extension for loading KTX2 with Basis Universal textures via libktx. This repository contains a pre-built XCFramework with Universal binaries for macOS and iOS. If you wish to use KTX2 textures in your target, simply add GLTFKit2/deps/libktx/ktx.xcframework to the GLTFKit2 framework target, and it will automatically be detected and used to load KTX2 textures, whether embedded or stored externally in ktx2 files.

Status and Conformance

Below is a checklist of glTF features and their current level of support.

Status

  • Import
  • Export

Encodings

  • JSON
  • Binary (.glb)

Buffer Storage

  • External references (buffer.uri)
  • Base-64 encoded buffers

Well-Known Vertex Accessor Semantics

  • POSITION
  • NORMAL
  • TANGENT
  • TEXCOORD_0
  • TEXCOORD_1
  • COLOR_0
  • JOINTS_0
  • WEIGHTS_0

Primitive Types

  • Points
  • Lines
  • Line Loop
  • Line Strip
  • Triangles
  • Triangle Strip
  • Triangle Fan

Images

  • External image references (image.uri)
  • Base-64 encoded images
  • PNG
  • JPEG
  • TIFF

Materials

  • Base color factor
  • Metallic factor
  • Roughness factor
  • Emissive factor
  • Base color map
  • Metallic-roughness map
  • Occlusion map
  • Emissive map
  • Normal texture scale
  • Alpha mode
    • Opaque alpha mode
    • Mask alpha mode
    • Blend alpha mode
  • Double-sided materials

Samplers

  • Wrap mode
  • Minification/magnification filters
  • Mipmaps

Cameras

  • Perspective cameras
  • Orthographic cameras

Morph Targets

  • Morph targets

Animation

  • Translation animations
  • Rotation animations
  • Scale animations
  • Morph target weight animations
  • Linear interpolation
  • Discrete animations
  • Cubic spline interpolation

Skinning

  • Joint matrix calculation

Sparse Accessors

  • Sparse accessors

Extensions

  • EXT_mesh_gpu_instancing
  • EXT_meshopt_compression
  • KHR_draco_mesh_compression (via plug-in)
  • KHR_emissive_strength
  • KHR_lights_punctual
  • KHR_materials_anisotropy
  • KHR_materials_clearcoat
  • KHR_materials_diffuse_transmission
  • KHR_materials_dispersion
  • KHR_materials_ior
  • KHR_materials_iridescence
  • KHR_materials_sheen
  • KHR_materials_specular
  • KHR_materials_transmission
  • KHR_materials_unlit
  • KHR_materials_variants
  • KHR_materials_volume
  • KHR_mesh_quantization
  • KHR_texture_basisu
  • KHR_texture_transform
  • KHR_xmp_json_ld

Extension support indicates that an extension's features are available as first-class objects through the GLTFAsset API. Not all features are available after an asset is bridged to another framework (e.g. SceneKit) that does not have support for such features. In particular, no Apple-provided rendering engine supports transmission or volume rendering at this time.

Conformance

This implementation is known to be non-conforming to the glTF 2.0 specification and is under active development.

Contributing

Pull requests are welcome, but will be audited strictly in order to maintain code style. If you have any concerns about contributing, please raise an issue on Github so we can talk about it.

License

Copyright (c) 2021—2024 Warren Moore
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 

About

A glTF 2.0 asset loader and exporter for Objective-C and Swift.

Topics

Resources

Stars

233 stars

Watchers

19 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

GLTFKit2

GLTFKit2 is an efficient glTF loader and exporter for Objective-C and Swift.

This project is a spiritual successor of the GLTFKit project, with many of the same aims, but some notable differences. GLTFKit2:

  • includes import and export (WIP), while GLTFKit was read-only.
  • strives to be as interoperable as possible, with extensions for Model I/O, SceneKit, and QuickLook.
  • tries to retain all of the information from the asset file, meaning extensions and extras are available to client code even if they are unrecognized by the loader.
  • uses cgltf and JSMN internally to load the JSON portion of glTF files, which is more efficient than parsing with NSJSONSerialization.

Usage

Using the Framework

The GLTFKit2 Xcode project is completely self-contained and can be used to build a Cocoa framework for macOS. If you want to use GLTFKit2 as a framework, link to it and embed it in your target. You can also opt to include the source directly in your app target.

Loading Assets

To load a glTF 2.0 model, import <GLTFKit2/GLTFKit2.h> and use the GLTFAsset class. Since assets can take a while to load, prefer to use the async loading methods.

Objective-C:

[GLTFAsset loadAssetWithURL:url
options:@{}
handler:^(float progress, GLTFAssetStatus status, GLTFAsset *asset, NSError *error, BOOL *stop)
{
// Check for completion and/or error, use asset if complete, etc.
}

Swift:

GLTFAsset.load(with: url, options:[:]){(progress, status, maybeAsset, maybeError, _)in
// Check for completion and/or error, use asset if complete, etc.
}

The URL must be a local file URL. Loading of remote assets and resources is not supported.

Interoperating with SceneKit

The framework can be used to easily transform glTF assets into SCNScenes to interoperate with SceneKit.

First, load the asset as shown above. Then, to get the default scene of a glTF asset, use the SCNScene class extension method +[SCNScene sceneWithGLTFAsset:].

Using Draco Mesh Decompression

GLTFKit2 supports meshes compressed with the Draco geometry compression library through a plugin system. To activate Draco decompression support, implement the GLTFDracoMeshDecompressor protocol in your target, then set the dracoDecompressorClassName property on GLTFAsset to the name of the conforming class. The framework will then use the supplied class to convert compressed mesh data into glTF primitives which are suitable for rendering. A sample Draco decompressor class is provided in the macOS GLTFViewer target. You are responsible for compiling and linking to the Draco library itself in your own target. If you would prefer not to compile the library yourself, consider using DracoSwift.

Using KTX2 with Basis Universal

GLTFKit2 optionally supports the KHR_texture_basisu extension for loading KTX2 with Basis Universal textures via libktx. This repository contains a pre-built XCFramework with Universal binaries for macOS and iOS. If you wish to use KTX2 textures in your target, simply add GLTFKit2/deps/libktx/ktx.xcframework to the GLTFKit2 framework target, and it will automatically be detected and used to load KTX2 textures, whether embedded or stored externally in ktx2 files.

Status and Conformance

Below is a checklist of glTF features and their current level of support.

Status

  • Import
  • Export

Encodings

  • JSON
  • Binary (.glb)

Buffer Storage

  • External references (buffer.uri)
  • Base-64 encoded buffers

Well-Known Vertex Accessor Semantics

  • POSITION
  • NORMAL
  • TANGENT
  • TEXCOORD_0
  • TEXCOORD_1
  • COLOR_0
  • JOINTS_0
  • WEIGHTS_0

Primitive Types

  • Points
  • Lines
  • Line Loop
  • Line Strip
  • Triangles
  • Triangle Strip
  • Triangle Fan

Images

  • External image references (image.uri)
  • Base-64 encoded images
  • PNG
  • JPEG
  • TIFF

Materials

  • Base color factor
  • Metallic factor
  • Roughness factor
  • Emissive factor
  • Base color map
  • Metallic-roughness map
  • Occlusion map
  • Emissive map
  • Normal texture scale
  • Alpha mode
    • Opaque alpha mode
    • Mask alpha mode
    • Blend alpha mode
  • Double-sided materials

Samplers

  • Wrap mode
  • Minification/magnification filters
  • Mipmaps

Cameras

  • Perspective cameras
  • Orthographic cameras

Morph Targets

  • Morph targets

Animation

  • Translation animations
  • Rotation animations
  • Scale animations
  • Morph target weight animations
  • Linear interpolation
  • Discrete animations
  • Cubic spline interpolation

Skinning

  • Joint matrix calculation

Sparse Accessors

  • Sparse accessors

Extensions

  • EXT_mesh_gpu_instancing
  • EXT_meshopt_compression
  • KHR_draco_mesh_compression (via plug-in)
  • KHR_emissive_strength
  • KHR_lights_punctual
  • KHR_materials_anisotropy
  • KHR_materials_clearcoat
  • KHR_materials_diffuse_transmission
  • KHR_materials_dispersion
  • KHR_materials_ior
  • KHR_materials_iridescence
  • KHR_materials_sheen
  • KHR_materials_specular
  • KHR_materials_transmission
  • KHR_materials_unlit
  • KHR_materials_variants
  • KHR_materials_volume
  • KHR_mesh_quantization
  • KHR_texture_basisu
  • KHR_texture_transform
  • KHR_xmp_json_ld

Extension support indicates that an extension's features are available as first-class objects through the GLTFAsset API. Not all features are available after an asset is bridged to another framework (e.g. SceneKit) that does not have support for such features. In particular, no Apple-provided rendering engine supports transmission or volume rendering at this time.

Conformance

This implementation is known to be non-conforming to the glTF 2.0 specification and is under active development.

Contributing

Pull requests are welcome, but will be audited strictly in order to maintain code style. If you have any concerns about contributing, please raise an issue on Github so we can talk about it.

License

Copyright (c) 2021—2024 Warren Moore
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 

About

A glTF 2.0 asset loader and exporter for Objective-C and Swift.

Topics

Resources

Stars

233 stars

Watchers

19 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GLTFKit2

GLTFKit2 is an efficient glTF loader and exporter for Objective-C and Swift.

This project is a spiritual successor of the GLTFKit project, with many of the same aims, but some notable differences. GLTFKit2:

  • includes import and export (WIP), while GLTFKit was read-only.
  • strives to be as interoperable as possible, with extensions for Model I/O, SceneKit, and QuickLook.
  • tries to retain all of the information from the asset file, meaning extensions and extras are available to client code even if they are unrecognized by the loader.
  • uses cgltf and JSMN internally to load the JSON portion of glTF files, which is more efficient than parsing with NSJSONSerialization.

Usage

Using the Framework

The GLTFKit2 Xcode project is completely self-contained and can be used to build a Cocoa framework for macOS. If you want to use GLTFKit2 as a framework, link to it and embed it in your target. You can also opt to include the source directly in your app target.

Loading Assets

To load a glTF 2.0 model, import <GLTFKit2/GLTFKit2.h> and use the GLTFAsset class. Since assets can take a while to load, prefer to use the async loading methods.

Objective-C:

[GLTFAsset loadAssetWithURL:url
options:@{}
handler:^(float progress, GLTFAssetStatus status, GLTFAsset *asset, NSError *error, BOOL *stop)
{
// Check for completion and/or error, use asset if complete, etc.
}

Swift:

GLTFAsset.load(with: url, options:[:]){(progress, status, maybeAsset, maybeError, _)in
// Check for completion and/or error, use asset if complete, etc.
}

The URL must be a local file URL. Loading of remote assets and resources is not supported.

Interoperating with SceneKit

The framework can be used to easily transform glTF assets into SCNScenes to interoperate with SceneKit.

First, load the asset as shown above. Then, to get the default scene of a glTF asset, use the SCNScene class extension method +[SCNScene sceneWithGLTFAsset:].

Using Draco Mesh Decompression

GLTFKit2 supports meshes compressed with the Draco geometry compression library through a plugin system. To activate Draco decompression support, implement the GLTFDracoMeshDecompressor protocol in your target, then set the dracoDecompressorClassName property on GLTFAsset to the name of the conforming class. The framework will then use the supplied class to convert compressed mesh data into glTF primitives which are suitable for rendering. A sample Draco decompressor class is provided in the macOS GLTFViewer target. You are responsible for compiling and linking to the Draco library itself in your own target. If you would prefer not to compile the library yourself, consider using DracoSwift.

Using KTX2 with Basis Universal

GLTFKit2 optionally supports the KHR_texture_basisu extension for loading KTX2 with Basis Universal textures via libktx. This repository contains a pre-built XCFramework with Universal binaries for macOS and iOS. If you wish to use KTX2 textures in your target, simply add GLTFKit2/deps/libktx/ktx.xcframework to the GLTFKit2 framework target, and it will automatically be detected and used to load KTX2 textures, whether embedded or stored externally in ktx2 files.

Status and Conformance

Below is a checklist of glTF features and their current level of support.

Status

  • Import
  • Export

Encodings

  • JSON
  • Binary (.glb)

Buffer Storage

  • External references (buffer.uri)
  • Base-64 encoded buffers

Well-Known Vertex Accessor Semantics

  • POSITION
  • NORMAL
  • TANGENT
  • TEXCOORD_0
  • TEXCOORD_1
  • COLOR_0
  • JOINTS_0
  • WEIGHTS_0

Primitive Types

  • Points
  • Lines
  • Line Loop
  • Line Strip
  • Triangles
  • Triangle Strip
  • Triangle Fan

Images

  • External image references (image.uri)
  • Base-64 encoded images
  • PNG
  • JPEG
  • TIFF

Materials

  • Base color factor
  • Metallic factor
  • Roughness factor
  • Emissive factor
  • Base color map
  • Metallic-roughness map
  • Occlusion map
  • Emissive map
  • Normal texture scale
  • Alpha mode
    • Opaque alpha mode
    • Mask alpha mode
    • Blend alpha mode
  • Double-sided materials

Samplers

  • Wrap mode
  • Minification/magnification filters
  • Mipmaps

Cameras

  • Perspective cameras
  • Orthographic cameras

Morph Targets

  • Morph targets

Animation

  • Translation animations
  • Rotation animations
  • Scale animations
  • Morph target weight animations
  • Linear interpolation
  • Discrete animations
  • Cubic spline interpolation

Skinning

  • Joint matrix calculation

Sparse Accessors

  • Sparse accessors

Extensions

  • EXT_mesh_gpu_instancing
  • EXT_meshopt_compression
  • KHR_draco_mesh_compression (via plug-in)
  • KHR_emissive_strength
  • KHR_lights_punctual
  • KHR_materials_anisotropy
  • KHR_materials_clearcoat
  • KHR_materials_diffuse_transmission
  • KHR_materials_dispersion
  • KHR_materials_ior
  • KHR_materials_iridescence
  • KHR_materials_sheen
  • KHR_materials_specular
  • KHR_materials_transmission
  • KHR_materials_unlit
  • KHR_materials_variants
  • KHR_materials_volume
  • KHR_mesh_quantization
  • KHR_texture_basisu
  • KHR_texture_transform
  • KHR_xmp_json_ld

Extension support indicates that an extension's features are available as first-class objects through the GLTFAsset API. Not all features are available after an asset is bridged to another framework (e.g. SceneKit) that does not have support for such features. In particular, no Apple-provided rendering engine supports transmission or volume rendering at this time.

Conformance

This implementation is known to be non-conforming to the glTF 2.0 specification and is under active development.

Contributing

Pull requests are welcome, but will be audited strictly in order to maintain code style. If you have any concerns about contributing, please raise an issue on Github so we can talk about it.

License

Copyright (c) 2021—2024 Warren Moore
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 

About

A glTF 2.0 asset loader and exporter for Objective-C and Swift.

Topics

Resources

Stars

233 stars

Watchers

19 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GLTFKit2

GLTFKit2 is an efficient glTF loader and exporter for Objective-C and Swift.

This project is a spiritual successor of the GLTFKit project, with many of the same aims, but some notable differences. GLTFKit2:

  • includes import and export (WIP), while GLTFKit was read-only.
  • strives to be as interoperable as possible, with extensions for Model I/O, SceneKit, and QuickLook.
  • tries to retain all of the information from the asset file, meaning extensions and extras are available to client code even if they are unrecognized by the loader.
  • uses cgltf and JSMN internally to load the JSON portion of glTF files, which is more efficient than parsing with NSJSONSerialization.

Usage

Using the Framework

The GLTFKit2 Xcode project is completely self-contained and can be used to build a Cocoa framework for macOS. If you want to use GLTFKit2 as a framework, link to it and embed it in your target. You can also opt to include the source directly in your app target.

Loading Assets

To load a glTF 2.0 model, import <GLTFKit2/GLTFKit2.h> and use the GLTFAsset class. Since assets can take a while to load, prefer to use the async loading methods.

Objective-C:

[GLTFAsset loadAssetWithURL:url
options:@{}
handler:^(float progress, GLTFAssetStatus status, GLTFAsset *asset, NSError *error, BOOL *stop)
{
// Check for completion and/or error, use asset if complete, etc.
}

Swift:

GLTFAsset.load(with: url, options:[:]){(progress, status, maybeAsset, maybeError, _)in
// Check for completion and/or error, use asset if complete, etc.
}

The URL must be a local file URL. Loading of remote assets and resources is not supported.

Interoperating with SceneKit

The framework can be used to easily transform glTF assets into SCNScenes to interoperate with SceneKit.

First, load the asset as shown above. Then, to get the default scene of a glTF asset, use the SCNScene class extension method +[SCNScene sceneWithGLTFAsset:].

Using Draco Mesh Decompression

GLTFKit2 supports meshes compressed with the Draco geometry compression library through a plugin system. To activate Draco decompression support, implement the GLTFDracoMeshDecompressor protocol in your target, then set the dracoDecompressorClassName property on GLTFAsset to the name of the conforming class. The framework will then use the supplied class to convert compressed mesh data into glTF primitives which are suitable for rendering. A sample Draco decompressor class is provided in the macOS GLTFViewer target. You are responsible for compiling and linking to the Draco library itself in your own target. If you would prefer not to compile the library yourself, consider using DracoSwift.

Using KTX2 with Basis Universal

GLTFKit2 optionally supports the KHR_texture_basisu extension for loading KTX2 with Basis Universal textures via libktx. This repository contains a pre-built XCFramework with Universal binaries for macOS and iOS. If you wish to use KTX2 textures in your target, simply add GLTFKit2/deps/libktx/ktx.xcframework to the GLTFKit2 framework target, and it will automatically be detected and used to load KTX2 textures, whether embedded or stored externally in ktx2 files.

Status and Conformance

Below is a checklist of glTF features and their current level of support.

Status

  • Import
  • Export

Encodings

  • JSON
  • Binary (.glb)

Buffer Storage

  • External references (buffer.uri)
  • Base-64 encoded buffers

Well-Known Vertex Accessor Semantics

  • POSITION
  • NORMAL
  • TANGENT
  • TEXCOORD_0
  • TEXCOORD_1
  • COLOR_0
  • JOINTS_0
  • WEIGHTS_0

Primitive Types

  • Points
  • Lines
  • Line Loop
  • Line Strip
  • Triangles
  • Triangle Strip
  • Triangle Fan

Images

  • External image references (image.uri)
  • Base-64 encoded images
  • PNG
  • JPEG
  • TIFF

Materials

  • Base color factor
  • Metallic factor
  • Roughness factor
  • Emissive factor
  • Base color map
  • Metallic-roughness map
  • Occlusion map
  • Emissive map
  • Normal texture scale
  • Alpha mode
    • Opaque alpha mode
    • Mask alpha mode
    • Blend alpha mode
  • Double-sided materials

Samplers

  • Wrap mode
  • Minification/magnification filters
  • Mipmaps

Cameras

  • Perspective cameras
  • Orthographic cameras

Morph Targets

  • Morph targets

Animation

  • Translation animations
  • Rotation animations
  • Scale animations
  • Morph target weight animations
  • Linear interpolation
  • Discrete animations
  • Cubic spline interpolation

Skinning

  • Joint matrix calculation

Sparse Accessors

  • Sparse accessors

Extensions

  • EXT_mesh_gpu_instancing
  • EXT_meshopt_compression
  • KHR_draco_mesh_compression (via plug-in)
  • KHR_emissive_strength
  • KHR_lights_punctual
  • KHR_materials_anisotropy
  • KHR_materials_clearcoat
  • KHR_materials_diffuse_transmission
  • KHR_materials_dispersion
  • KHR_materials_ior
  • KHR_materials_iridescence
  • KHR_materials_sheen
  • KHR_materials_specular
  • KHR_materials_transmission
  • KHR_materials_unlit
  • KHR_materials_variants
  • KHR_materials_volume
  • KHR_mesh_quantization
  • KHR_texture_basisu
  • KHR_texture_transform
  • KHR_xmp_json_ld

Extension support indicates that an extension's features are available as first-class objects through the GLTFAsset API. Not all features are available after an asset is bridged to another framework (e.g. SceneKit) that does not have support for such features. In particular, no Apple-provided rendering engine supports transmission or volume rendering at this time.

Conformance

This implementation is known to be non-conforming to the glTF 2.0 specification and is under active development.

Contributing

Pull requests are welcome, but will be audited strictly in order to maintain code style. If you have any concerns about contributing, please raise an issue on Github so we can talk about it.

License

Copyright (c) 2021—2024 Warren Moore
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 

About

A glTF 2.0 asset loader and exporter for Objective-C and Swift.

Topics

Resources

Stars

233 stars

Watchers

19 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

GLTFKit2

GLTFKit2 is an efficient glTF loader and exporter for Objective-C and Swift.

This project is a spiritual successor of the GLTFKit project, with many of the same aims, but some notable differences. GLTFKit2:

  • includes import and export (WIP), while GLTFKit was read-only.
  • strives to be as interoperable as possible, with extensions for Model I/O, SceneKit, and QuickLook.
  • tries to retain all of the information from the asset file, meaning extensions and extras are available to client code even if they are unrecognized by the loader.
  • uses cgltf and JSMN internally to load the JSON portion of glTF files, which is more efficient than parsing with NSJSONSerialization.

Usage

Using the Framework

The GLTFKit2 Xcode project is completely self-contained and can be used to build a Cocoa framework for macOS. If you want to use GLTFKit2 as a framework, link to it and embed it in your target. You can also opt to include the source directly in your app target.

Loading Assets

To load a glTF 2.0 model, import <GLTFKit2/GLTFKit2.h> and use the GLTFAsset class. Since assets can take a while to load, prefer to use the async loading methods.

Objective-C:

[GLTFAsset loadAssetWithURL:url
options:@{}
handler:^(float progress, GLTFAssetStatus status, GLTFAsset *asset, NSError *error, BOOL *stop)
{
// Check for completion and/or error, use asset if complete, etc.
}

Swift:

GLTFAsset.load(with: url, options:[:]){(progress, status, maybeAsset, maybeError, _)in
// Check for completion and/or error, use asset if complete, etc.
}

The URL must be a local file URL. Loading of remote assets and resources is not supported.

Interoperating with SceneKit

The framework can be used to easily transform glTF assets into SCNScenes to interoperate with SceneKit.

First, load the asset as shown above. Then, to get the default scene of a glTF asset, use the SCNScene class extension method +[SCNScene sceneWithGLTFAsset:].

Using Draco Mesh Decompression

GLTFKit2 supports meshes compressed with the Draco geometry compression library through a plugin system. To activate Draco decompression support, implement the GLTFDracoMeshDecompressor protocol in your target, then set the dracoDecompressorClassName property on GLTFAsset to the name of the conforming class. The framework will then use the supplied class to convert compressed mesh data into glTF primitives which are suitable for rendering. A sample Draco decompressor class is provided in the macOS GLTFViewer target. You are responsible for compiling and linking to the Draco library itself in your own target. If you would prefer not to compile the library yourself, consider using DracoSwift.

Using KTX2 with Basis Universal

GLTFKit2 optionally supports the KHR_texture_basisu extension for loading KTX2 with Basis Universal textures via libktx. This repository contains a pre-built XCFramework with Universal binaries for macOS and iOS. If you wish to use KTX2 textures in your target, simply add GLTFKit2/deps/libktx/ktx.xcframework to the GLTFKit2 framework target, and it will automatically be detected and used to load KTX2 textures, whether embedded or stored externally in ktx2 files.

Status and Conformance

Below is a checklist of glTF features and their current level of support.

Status

  • Import
  • Export

Encodings

  • JSON
  • Binary (.glb)

Buffer Storage

  • External references (buffer.uri)
  • Base-64 encoded buffers

Well-Known Vertex Accessor Semantics

  • POSITION
  • NORMAL
  • TANGENT
  • TEXCOORD_0
  • TEXCOORD_1
  • COLOR_0
  • JOINTS_0
  • WEIGHTS_0

Primitive Types

  • Points
  • Lines
  • Line Loop
  • Line Strip
  • Triangles
  • Triangle Strip
  • Triangle Fan

Images

  • External image references (image.uri)
  • Base-64 encoded images
  • PNG
  • JPEG
  • TIFF

Materials

  • Base color factor
  • Metallic factor
  • Roughness factor
  • Emissive factor
  • Base color map
  • Metallic-roughness map
  • Occlusion map
  • Emissive map
  • Normal texture scale
  • Alpha mode
    • Opaque alpha mode
    • Mask alpha mode
    • Blend alpha mode
  • Double-sided materials

Samplers

  • Wrap mode
  • Minification/magnification filters
  • Mipmaps

Cameras

  • Perspective cameras
  • Orthographic cameras

Morph Targets

  • Morph targets

Animation

  • Translation animations
  • Rotation animations
  • Scale animations
  • Morph target weight animations
  • Linear interpolation
  • Discrete animations
  • Cubic spline interpolation

Skinning

  • Joint matrix calculation

Sparse Accessors

  • Sparse accessors

Extensions

  • EXT_mesh_gpu_instancing
  • EXT_meshopt_compression
  • KHR_draco_mesh_compression (via plug-in)
  • KHR_emissive_strength
  • KHR_lights_punctual
  • KHR_materials_anisotropy
  • KHR_materials_clearcoat
  • KHR_materials_diffuse_transmission
  • KHR_materials_dispersion
  • KHR_materials_ior
  • KHR_materials_iridescence
  • KHR_materials_sheen
  • KHR_materials_specular
  • KHR_materials_transmission
  • KHR_materials_unlit
  • KHR_materials_variants
  • KHR_materials_volume
  • KHR_mesh_quantization
  • KHR_texture_basisu
  • KHR_texture_transform
  • KHR_xmp_json_ld

Extension support indicates that an extension's features are available as first-class objects through the GLTFAsset API. Not all features are available after an asset is bridged to another framework (e.g. SceneKit) that does not have support for such features. In particular, no Apple-provided rendering engine supports transmission or volume rendering at this time.

Conformance

This implementation is known to be non-conforming to the glTF 2.0 specification and is under active development.

Contributing

Pull requests are welcome, but will be audited strictly in order to maintain code style. If you have any concerns about contributing, please raise an issue on Github so we can talk about it.

License

Copyright (c) 2021—2024 Warren Moore
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 

About

A glTF 2.0 asset loader and exporter for Objective-C and Swift.

Topics

Resources

Stars

233 stars

Watchers

19 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GLTFKit2

GLTFKit2 is an efficient glTF loader and exporter for Objective-C and Swift.

This project is a spiritual successor of the GLTFKit project, with many of the same aims, but some notable differences. GLTFKit2:

  • includes import and export (WIP), while GLTFKit was read-only.
  • strives to be as interoperable as possible, with extensions for Model I/O, SceneKit, and QuickLook.
  • tries to retain all of the information from the asset file, meaning extensions and extras are available to client code even if they are unrecognized by the loader.
  • uses cgltf and JSMN internally to load the JSON portion of glTF files, which is more efficient than parsing with NSJSONSerialization.

Usage

Using the Framework

The GLTFKit2 Xcode project is completely self-contained and can be used to build a Cocoa framework for macOS. If you want to use GLTFKit2 as a framework, link to it and embed it in your target. You can also opt to include the source directly in your app target.

Loading Assets

To load a glTF 2.0 model, import <GLTFKit2/GLTFKit2.h> and use the GLTFAsset class. Since assets can take a while to load, prefer to use the async loading methods.

Objective-C:

[GLTFAsset loadAssetWithURL:url
options:@{}
handler:^(float progress, GLTFAssetStatus status, GLTFAsset *asset, NSError *error, BOOL *stop)
{
// Check for completion and/or error, use asset if complete, etc.
}

Swift:

GLTFAsset.load(with: url, options:[:]){(progress, status, maybeAsset, maybeError, _)in
// Check for completion and/or error, use asset if complete, etc.
}

The URL must be a local file URL. Loading of remote assets and resources is not supported.

Interoperating with SceneKit

The framework can be used to easily transform glTF assets into SCNScenes to interoperate with SceneKit.

First, load the asset as shown above. Then, to get the default scene of a glTF asset, use the SCNScene class extension method +[SCNScene sceneWithGLTFAsset:].

Using Draco Mesh Decompression

GLTFKit2 supports meshes compressed with the Draco geometry compression library through a plugin system. To activate Draco decompression support, implement the GLTFDracoMeshDecompressor protocol in your target, then set the dracoDecompressorClassName property on GLTFAsset to the name of the conforming class. The framework will then use the supplied class to convert compressed mesh data into glTF primitives which are suitable for rendering. A sample Draco decompressor class is provided in the macOS GLTFViewer target. You are responsible for compiling and linking to the Draco library itself in your own target. If you would prefer not to compile the library yourself, consider using DracoSwift.

Using KTX2 with Basis Universal

GLTFKit2 optionally supports the KHR_texture_basisu extension for loading KTX2 with Basis Universal textures via libktx. This repository contains a pre-built XCFramework with Universal binaries for macOS and iOS. If you wish to use KTX2 textures in your target, simply add GLTFKit2/deps/libktx/ktx.xcframework to the GLTFKit2 framework target, and it will automatically be detected and used to load KTX2 textures, whether embedded or stored externally in ktx2 files.

Status and Conformance

Below is a checklist of glTF features and their current level of support.

Status

  • Import
  • Export

Encodings

  • JSON
  • Binary (.glb)

Buffer Storage

  • External references (buffer.uri)
  • Base-64 encoded buffers

Well-Known Vertex Accessor Semantics

  • POSITION
  • NORMAL
  • TANGENT
  • TEXCOORD_0
  • TEXCOORD_1
  • COLOR_0
  • JOINTS_0
  • WEIGHTS_0

Primitive Types

  • Points
  • Lines
  • Line Loop
  • Line Strip
  • Triangles
  • Triangle Strip
  • Triangle Fan

Images

  • External image references (image.uri)
  • Base-64 encoded images
  • PNG
  • JPEG
  • TIFF

Materials

  • Base color factor
  • Metallic factor
  • Roughness factor
  • Emissive factor
  • Base color map
  • Metallic-roughness map
  • Occlusion map
  • Emissive map
  • Normal texture scale
  • Alpha mode
    • Opaque alpha mode
    • Mask alpha mode
    • Blend alpha mode
  • Double-sided materials

Samplers

  • Wrap mode
  • Minification/magnification filters
  • Mipmaps

Cameras

  • Perspective cameras
  • Orthographic cameras

Morph Targets

  • Morph targets

Animation

  • Translation animations
  • Rotation animations
  • Scale animations
  • Morph target weight animations
  • Linear interpolation
  • Discrete animations
  • Cubic spline interpolation

Skinning

  • Joint matrix calculation

Sparse Accessors

  • Sparse accessors

Extensions

  • EXT_mesh_gpu_instancing
  • EXT_meshopt_compression
  • KHR_draco_mesh_compression (via plug-in)
  • KHR_emissive_strength
  • KHR_lights_punctual
  • KHR_materials_anisotropy
  • KHR_materials_clearcoat
  • KHR_materials_diffuse_transmission
  • KHR_materials_dispersion
  • KHR_materials_ior
  • KHR_materials_iridescence
  • KHR_materials_sheen
  • KHR_materials_specular
  • KHR_materials_transmission
  • KHR_materials_unlit
  • KHR_materials_variants
  • KHR_materials_volume
  • KHR_mesh_quantization
  • KHR_texture_basisu
  • KHR_texture_transform
  • KHR_xmp_json_ld

Extension support indicates that an extension's features are available as first-class objects through the GLTFAsset API. Not all features are available after an asset is bridged to another framework (e.g. SceneKit) that does not have support for such features. In particular, no Apple-provided rendering engine supports transmission or volume rendering at this time.

Conformance

This implementation is known to be non-conforming to the glTF 2.0 specification and is under active development.

Contributing

Pull requests are welcome, but will be audited strictly in order to maintain code style. If you have any concerns about contributing, please raise an issue on Github so we can talk about it.

License

Copyright (c) 2021—2024 Warren Moore
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 

About

A glTF 2.0 asset loader and exporter for Objective-C and Swift.

Topics

Resources

Stars

233 stars

Watchers

19 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GLTFKit2

GLTFKit2 is an efficient glTF loader and exporter for Objective-C and Swift.

This project is a spiritual successor of the GLTFKit project, with many of the same aims, but some notable differences. GLTFKit2:

  • includes import and export (WIP), while GLTFKit was read-only.
  • strives to be as interoperable as possible, with extensions for Model I/O, SceneKit, and QuickLook.
  • tries to retain all of the information from the asset file, meaning extensions and extras are available to client code even if they are unrecognized by the loader.
  • uses cgltf and JSMN internally to load the JSON portion of glTF files, which is more efficient than parsing with NSJSONSerialization.

Usage

Using the Framework

The GLTFKit2 Xcode project is completely self-contained and can be used to build a Cocoa framework for macOS. If you want to use GLTFKit2 as a framework, link to it and embed it in your target. You can also opt to include the source directly in your app target.

Loading Assets

To load a glTF 2.0 model, import <GLTFKit2/GLTFKit2.h> and use the GLTFAsset class. Since assets can take a while to load, prefer to use the async loading methods.

Objective-C:

[GLTFAsset loadAssetWithURL:url
options:@{}
handler:^(float progress, GLTFAssetStatus status, GLTFAsset *asset, NSError *error, BOOL *stop)
{
// Check for completion and/or error, use asset if complete, etc.
}

Swift:

GLTFAsset.load(with: url, options:[:]){(progress, status, maybeAsset, maybeError, _)in
// Check for completion and/or error, use asset if complete, etc.
}

The URL must be a local file URL. Loading of remote assets and resources is not supported.

Interoperating with SceneKit

The framework can be used to easily transform glTF assets into SCNScenes to interoperate with SceneKit.

First, load the asset as shown above. Then, to get the default scene of a glTF asset, use the SCNScene class extension method +[SCNScene sceneWithGLTFAsset:].

Using Draco Mesh Decompression

GLTFKit2 supports meshes compressed with the Draco geometry compression library through a plugin system. To activate Draco decompression support, implement the GLTFDracoMeshDecompressor protocol in your target, then set the dracoDecompressorClassName property on GLTFAsset to the name of the conforming class. The framework will then use the supplied class to convert compressed mesh data into glTF primitives which are suitable for rendering. A sample Draco decompressor class is provided in the macOS GLTFViewer target. You are responsible for compiling and linking to the Draco library itself in your own target. If you would prefer not to compile the library yourself, consider using DracoSwift.

Using KTX2 with Basis Universal

GLTFKit2 optionally supports the KHR_texture_basisu extension for loading KTX2 with Basis Universal textures via libktx. This repository contains a pre-built XCFramework with Universal binaries for macOS and iOS. If you wish to use KTX2 textures in your target, simply add GLTFKit2/deps/libktx/ktx.xcframework to the GLTFKit2 framework target, and it will automatically be detected and used to load KTX2 textures, whether embedded or stored externally in ktx2 files.

Status and Conformance

Below is a checklist of glTF features and their current level of support.

Status

  • Import
  • Export

Encodings

  • JSON
  • Binary (.glb)

Buffer Storage

  • External references (buffer.uri)
  • Base-64 encoded buffers

Well-Known Vertex Accessor Semantics

  • POSITION
  • NORMAL
  • TANGENT
  • TEXCOORD_0
  • TEXCOORD_1
  • COLOR_0
  • JOINTS_0
  • WEIGHTS_0

Primitive Types

  • Points
  • Lines
  • Line Loop
  • Line Strip
  • Triangles
  • Triangle Strip
  • Triangle Fan

Images

  • External image references (image.uri)
  • Base-64 encoded images
  • PNG
  • JPEG
  • TIFF

Materials

  • Base color factor
  • Metallic factor
  • Roughness factor
  • Emissive factor
  • Base color map
  • Metallic-roughness map
  • Occlusion map
  • Emissive map
  • Normal texture scale
  • Alpha mode
    • Opaque alpha mode
    • Mask alpha mode
    • Blend alpha mode
  • Double-sided materials

Samplers

  • Wrap mode
  • Minification/magnification filters
  • Mipmaps

Cameras

  • Perspective cameras
  • Orthographic cameras

Morph Targets

  • Morph targets

Animation

  • Translation animations
  • Rotation animations
  • Scale animations
  • Morph target weight animations
  • Linear interpolation
  • Discrete animations
  • Cubic spline interpolation

Skinning

  • Joint matrix calculation

Sparse Accessors

  • Sparse accessors

Extensions

  • EXT_mesh_gpu_instancing
  • EXT_meshopt_compression
  • KHR_draco_mesh_compression (via plug-in)
  • KHR_emissive_strength
  • KHR_lights_punctual
  • KHR_materials_anisotropy
  • KHR_materials_clearcoat
  • KHR_materials_diffuse_transmission
  • KHR_materials_dispersion
  • KHR_materials_ior
  • KHR_materials_iridescence
  • KHR_materials_sheen
  • KHR_materials_specular
  • KHR_materials_transmission
  • KHR_materials_unlit
  • KHR_materials_variants
  • KHR_materials_volume
  • KHR_mesh_quantization
  • KHR_texture_basisu
  • KHR_texture_transform
  • KHR_xmp_json_ld

Extension support indicates that an extension's features are available as first-class objects through the GLTFAsset API. Not all features are available after an asset is bridged to another framework (e.g. SceneKit) that does not have support for such features. In particular, no Apple-provided rendering engine supports transmission or volume rendering at this time.

Conformance

This implementation is known to be non-conforming to the glTF 2.0 specification and is under active development.

Contributing

Pull requests are welcome, but will be audited strictly in order to maintain code style. If you have any concerns about contributing, please raise an issue on Github so we can talk about it.

License

Copyright (c) 2021—2024 Warren Moore
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 

About

A glTF 2.0 asset loader and exporter for Objective-C and Swift.

Topics

Resources

Stars

233 stars

Watchers

19 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

GLTFKit2

GLTFKit2 is an efficient glTF loader and exporter for Objective-C and Swift.

This project is a spiritual successor of the GLTFKit project, with many of the same aims, but some notable differences. GLTFKit2:

  • includes import and export (WIP), while GLTFKit was read-only.
  • strives to be as interoperable as possible, with extensions for Model I/O, SceneKit, and QuickLook.
  • tries to retain all of the information from the asset file, meaning extensions and extras are available to client code even if they are unrecognized by the loader.
  • uses cgltf and JSMN internally to load the JSON portion of glTF files, which is more efficient than parsing with NSJSONSerialization.

Usage

Using the Framework

The GLTFKit2 Xcode project is completely self-contained and can be used to build a Cocoa framework for macOS. If you want to use GLTFKit2 as a framework, link to it and embed it in your target. You can also opt to include the source directly in your app target.

Loading Assets

To load a glTF 2.0 model, import <GLTFKit2/GLTFKit2.h> and use the GLTFAsset class. Since assets can take a while to load, prefer to use the async loading methods.

Objective-C:

[GLTFAsset loadAssetWithURL:url
options:@{}
handler:^(float progress, GLTFAssetStatus status, GLTFAsset *asset, NSError *error, BOOL *stop)
{
// Check for completion and/or error, use asset if complete, etc.
}

Swift:

GLTFAsset.load(with: url, options:[:]){(progress, status, maybeAsset, maybeError, _)in
// Check for completion and/or error, use asset if complete, etc.
}

The URL must be a local file URL. Loading of remote assets and resources is not supported.

Interoperating with SceneKit

The framework can be used to easily transform glTF assets into SCNScenes to interoperate with SceneKit.

First, load the asset as shown above. Then, to get the default scene of a glTF asset, use the SCNScene class extension method +[SCNScene sceneWithGLTFAsset:].

Using Draco Mesh Decompression

GLTFKit2 supports meshes compressed with the Draco geometry compression library through a plugin system. To activate Draco decompression support, implement the GLTFDracoMeshDecompressor protocol in your target, then set the dracoDecompressorClassName property on GLTFAsset to the name of the conforming class. The framework will then use the supplied class to convert compressed mesh data into glTF primitives which are suitable for rendering. A sample Draco decompressor class is provided in the macOS GLTFViewer target. You are responsible for compiling and linking to the Draco library itself in your own target. If you would prefer not to compile the library yourself, consider using DracoSwift.

Using KTX2 with Basis Universal

GLTFKit2 optionally supports the KHR_texture_basisu extension for loading KTX2 with Basis Universal textures via libktx. This repository contains a pre-built XCFramework with Universal binaries for macOS and iOS. If you wish to use KTX2 textures in your target, simply add GLTFKit2/deps/libktx/ktx.xcframework to the GLTFKit2 framework target, and it will automatically be detected and used to load KTX2 textures, whether embedded or stored externally in ktx2 files.

Status and Conformance

Below is a checklist of glTF features and their current level of support.

Status

  • Import
  • Export

Encodings

  • JSON
  • Binary (.glb)

Buffer Storage

  • External references (buffer.uri)
  • Base-64 encoded buffers

Well-Known Vertex Accessor Semantics

  • POSITION
  • NORMAL
  • TANGENT
  • TEXCOORD_0
  • TEXCOORD_1
  • COLOR_0
  • JOINTS_0
  • WEIGHTS_0

Primitive Types

  • Points
  • Lines
  • Line Loop
  • Line Strip
  • Triangles
  • Triangle Strip
  • Triangle Fan

Images

  • External image references (image.uri)
  • Base-64 encoded images
  • PNG
  • JPEG
  • TIFF

Materials

  • Base color factor
  • Metallic factor
  • Roughness factor
  • Emissive factor
  • Base color map
  • Metallic-roughness map
  • Occlusion map
  • Emissive map
  • Normal texture scale
  • Alpha mode
    • Opaque alpha mode
    • Mask alpha mode
    • Blend alpha mode
  • Double-sided materials

Samplers

  • Wrap mode
  • Minification/magnification filters
  • Mipmaps

Cameras

  • Perspective cameras
  • Orthographic cameras

Morph Targets

  • Morph targets

Animation

  • Translation animations
  • Rotation animations
  • Scale animations
  • Morph target weight animations
  • Linear interpolation
  • Discrete animations
  • Cubic spline interpolation

Skinning

  • Joint matrix calculation

Sparse Accessors

  • Sparse accessors

Extensions

  • EXT_mesh_gpu_instancing
  • EXT_meshopt_compression
  • KHR_draco_mesh_compression (via plug-in)
  • KHR_emissive_strength
  • KHR_lights_punctual
  • KHR_materials_anisotropy
  • KHR_materials_clearcoat
  • KHR_materials_diffuse_transmission
  • KHR_materials_dispersion
  • KHR_materials_ior
  • KHR_materials_iridescence
  • KHR_materials_sheen
  • KHR_materials_specular
  • KHR_materials_transmission
  • KHR_materials_unlit
  • KHR_materials_variants
  • KHR_materials_volume
  • KHR_mesh_quantization
  • KHR_texture_basisu
  • KHR_texture_transform
  • KHR_xmp_json_ld

Extension support indicates that an extension's features are available as first-class objects through the GLTFAsset API. Not all features are available after an asset is bridged to another framework (e.g. SceneKit) that does not have support for such features. In particular, no Apple-provided rendering engine supports transmission or volume rendering at this time.

Conformance

This implementation is known to be non-conforming to the glTF 2.0 specification and is under active development.

Contributing

Pull requests are welcome, but will be audited strictly in order to maintain code style. If you have any concerns about contributing, please raise an issue on Github so we can talk about it.

License

Copyright (c) 2021—2024 Warren Moore
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 

About

A glTF 2.0 asset loader and exporter for Objective-C and Swift.

Topics

Resources

Stars

233 stars

Watchers

19 watching

Forks

Releases

Contributors

Languages