# Resource formats ## Common types - `Matrix3`: 3x3 matrix of `Float` in columns - `Vec3`: 3 component `Float` vector - `Affine3`: `Matrix3` and `Vec3` translation ## Dictionary format ``` [kkkk vvvv KK... VV...]... ^ ^ ^ ^ | | | | value | | | key | | 16-bit kalue length | 16-bit key length ``` ## PrefabIndex | Key | Value Type | | -------- | ---------- | | \ | `Res` | ## Prefab | Key | Value Type | | | ------------- | ------------------------------ | --------- | | `mesh` | `Affine3`, `Res` | Multi key | | `collision` | `Affine3`, `Res` | Multi key | | `light` | `Vec3`, `Res` | Multi key | | `environment` | `Res` | | ## MeshPart Vertex attribute arrays (va_\*) are resources that contain a packed float32 array. ombinations of g_\*, va_\* and tex_\* are multiplied except normal which is added. Defaults should be the identity for that operation, so default is 1 / white except normals are zero. | Key | Value Type | | | -------------------- | ------------------- | ------------------ | | `name` | `String` | | | `index` | `Res<[u32; 3]>` | | | `armature` | `Res` | | | `g_metallic` | `Float` | | | `g_roughness` | `Float` | | | `g_albedo` | `Vec3` | | | `g_alpha` | `Float` | | | `g_transmission` | `Float` | | | `g_emission` | `Vec3` | | | `g_refractive_index` | `Float` | | | `g_attenuation` | `Vec3` | | | `g_dispersion` | `Float` | | | `g_thickness` | `Float` | | | `g_unlit` | | | | `g_double_sided` | | | | `va_position` | `Res<[Vec3]>` | | | `va_normal` | `Res<[Vec3]>` | | | `va_tangent` | `Res<[Vec3]>` | | | `va_texcoord` | `Res<[Vec2]>` | | | `va_roughness` | `Res<[Float]>` | | | `va_metallic` | `Res<[Float]>` | | | `va_albedo` | `Res<[Vec3]>` | | | `va_alpha` | `Res<[Float]>` | | | `va_transmission` | `Res<[Float]>` | | | `va_emission` | `Res<[Vec3]>` | | | `va_joint_weight` | `Res<[[Float; 4]]>` | | | `va_joint_index` | `Res<[[u16; 4]]>` | | | `tex_normal` | `Res` | Use color channels | | `tex_roughness` | `Res` | Use green channel | | `tex_metallic` | `Res` | Use blue channel | | `tex_albedo` | `Res` | Use color channels | | `tex_alpha` | `Res` | Use alpha channel | | `tex_transmission` | `Res` | Use red channel | | `tex_emission` | `Res` | Use color channels | | `tex_thickness` | `Res` | Use green channel | | `tex_occlusion` | `Res` | Use red channel | | `hint_mirror` | | | | `hint_static` | | | - **Attenuation**: Attenuation coefficient for each color channel due to scattering within the material volume expressed as e-folding distance (m^-1). See [KHR_materials_volume]. - **Transmission**: Equivalent to `transmissionFactor` and `transmissionTexture` of [KHR_materials_transmission]. - **Refractive Index**: Equivalent to `ior` of [KHR_materials_ior] - **Thickness**: Equivalent to `thicknessFactor` and `thicknessTexture` of [KHR_materials_volume]. - **Dispersion**: 20 / Abbe Number. Equivalent to `dispersion` of [KHR_materials_dispersion]. - **Unlit**: Directly transfers \*_albedo to the screen if set. No lighting shaders are applied. See [KHR_materials_unlit] - **Double Sided**: Disable backface culling for this mesh. Equivalent to `material.doubleSided` of glTF 2.0. - **Mirror Hint**: Suggest a client to render reflections of this surface properly e.g. show use a texture that shows output of another render pass from the mirrors perspective. It can be assumed that the mesh is on a single plane. - **Static Hint**: Object will not move often. This allows implementations to choose instanced rending when MeshPart are added more than once. ## Armature Armature is used for humanoid avatar rigging and generally follows VRM specification. Joints are arranged in a hierarchy where transforms are inherited. Attribute values are zipped similar to vertex attributes. | Key | Value Type | | | ----------- | ----------- | -------------------------------------- | | `parent` | `[u16]` | Parent indecies, Root points to itself | | `transform` | `[Affine3]` | | | `name` | `[String]` | Each string prefixed with u16 length | - **Names**: Indirectly controlled joints have an empty name. All other bones are named like in [VRMC_vrm]. ## LightPart | Key | Value Type | | ---------- | ------------------------ | | `name` | `String` | | `radius` | `Float` | | `emission` | `Vec3` | | `spot` | `Vec3`, `Float`, `Float` | - **Emission**: Luminous intensity in candela per channel. Equivalent of `color` multiplied with `intensity` of [KHR_lights_punctual]. - **Radius**: Radius for soft shadow calculation. If set, the light source can be modelled to be a light emitting sphere of that radius. Not suported by glTF. - **Spot**: Normalized direction vector, inner and outer cone radius like `innerConeAngle` and `outerConeAngle` in [KHR_lights_punctual]. ## EnvironmentPart | Key | Value Type | | | -------- | -------------- | ------------------------ | | `skybox` | `Res` | OpenEXR support required | | `sun` | `Vec3`, `Vec3` | Direction, Color | - **Skybox**: Equirectangular projection is used. TODO: Unit for Luminous intensity? lm/sr? ## Texture WebP ## CollisionPart Only one key for shape should be set. | Key | Value Type | | | ------------------- | ------------------------- | -------------------------- | | `restitution_coeff` | `Float` | | | `friction_kinetic` | `Float` | Coeffient | | `friction_static` | `Float` | Coeffient | | `sh_box` | `Vec3` | Side lengths | | `sh_sphere` | `Float` | Radius | | `sh_cylinder` | `Float`, `Float`, `Float` | Bottom/Top Radius, Height | | `sh_capsule` | `Float`, `Float`, `Float` | Bottom/Top Radius, Height | | `sh_convex_hull` | `Res<[Vec3]>` | Convex hull points | | `sh_mesh` | `Res`, `Res<[Vec3]>` | Mesh index + vertex buffer | [KHR_materials_transmission]: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_transmission [KHR_materials_ior]: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_ior [KHR_materials_volume]: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_volume [KHR_materials_dispersion]: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion [KHR_lights_punctual]: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_lights_punctual [KHR_lights_unlit]: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_lights_unlit [VRMC_vrm]: https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_vrm-1.0 [VRMC_springBone]: https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_springBone-1.0