# 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 | | `armature` | `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` | `u32` | | | `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<[Vec4]>` | Tangent+Handedness | | `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<[[u32; 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_hide_first_person` | | | | `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. - **Hide First-Person Hint**: Object should not be rendered if the prefab is the own avatar and first person view is used. This is set for the head and hair that should not be visible to yourself. See `thirdPersonOnly` variant of [VRMC_vrm] `firstPerson.meshAnnotations.firstPersonFlag`. ## ArmaturePart 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