| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| namespace impeller.fb; |
| |
| //----------------------------------------------------------------------------- |
| /// Materials. |
| /// |
| |
| struct Color { |
| r: float; |
| g: float; |
| b: float; |
| a: float; |
| } |
| |
| enum ComponentType:byte { |
| k8Bit, |
| k16Bit, |
| } |
| |
| table EmbeddedImage { |
| bytes: [ubyte]; |
| component_count: ubyte = 0; |
| component_type: ComponentType; |
| width: uint; |
| height: uint; |
| } |
| |
| /// The `bytes` field takes precedent over the `uri` field. |
| /// If both the `uri` and `bytes` fields are empty, a fully opaque white |
| /// placeholder will be used. |
| table Texture { |
| /// A Flutter asset URI for a compressed image file to import and decode. |
| uri: string; |
| /// Decompressed image bytes for uploading to the GPU. If this field is not |
| /// empty, it takes precedent over the `uri` field for sourcing the texture. |
| embedded_image: EmbeddedImage; |
| } |
| |
| enum MaterialType:byte { |
| kUnlit, |
| kPhysicallyBased, |
| } |
| |
| /// The final color of each material component is the texture color multiplied |
| /// by the factor of the component. |
| /// Texture fields are indices into the `Scene`->`textures` array. All textures |
| /// are optional -- a texture index value of -1 indicates no texture. |
| table Material { |
| // When the `MaterialType` is `kUnlit`, only the `base_color` fields are used. |
| type: MaterialType; |
| |
| base_color_factor: Color; |
| base_color_texture: int = -1; |
| |
| metallic_factor: float = 0; |
| roughness_factor: float = 0.5; |
| metallic_roughness_texture: int = -1; // Red=Metallic, Green=Roughness. |
| |
| normal_texture: int = -1; // Tangent space normal map. |
| |
| occlusion_texture: int = -1; |
| } |
| |
| //----------------------------------------------------------------------------- |
| /// Geometry. |
| /// |
| |
| struct Vec2 { |
| x: float; |
| y: float; |
| } |
| |
| struct Vec3 { |
| x: float; |
| y: float; |
| z: float; |
| } |
| |
| struct Vec4 { |
| x: float; |
| y: float; |
| z: float; |
| w: float; |
| } |
| |
| // This attribute layout is expected to be identical to that within |
| // `impeller/scene/shaders/geometry.vert`. |
| struct Vertex { |
| position: Vec3; |
| normal: Vec3; |
| tangent: Vec4; // The 4th component determines the handedness of the tangent. |
| texture_coords: Vec2; |
| color: Color; |
| } |
| |
| table UnskinnedVertexBuffer { |
| vertices: [Vertex]; |
| } |
| |
| struct SkinnedVertex { |
| vertex: Vertex; |
| /// Four joint indices corresponding to this mesh's skin transforms. These |
| /// are floats instead of ints because this vertex data is uploaded directly |
| /// to the GPU, and float attributes work for all Impeller backends. |
| joints: Vec4; |
| /// Four weight values that specify the influence of the corresponding |
| /// joints. |
| weights: Vec4; |
| } |
| |
| table SkinnedVertexBuffer { |
| vertices: [SkinnedVertex]; |
| } |
| |
| union VertexBuffer { UnskinnedVertexBuffer, SkinnedVertexBuffer } |
| |
| enum IndexType:byte { |
| k16Bit, |
| k32Bit, |
| } |
| |
| table Indices { |
| data: [ubyte]; |
| count: uint32; |
| type: IndexType; |
| } |
| |
| table MeshPrimitive { |
| vertices: VertexBuffer; |
| indices: Indices; |
| material: Material; |
| } |
| |
| //----------------------------------------------------------------------------- |
| /// Animations. |
| /// |
| |
| table TranslationKeyframes { |
| values: [Vec3]; |
| } |
| |
| table RotationKeyframes { |
| values: [Vec4]; |
| } |
| |
| table ScaleKeyframes { |
| values: [Vec3]; |
| } |
| |
| union Keyframes { TranslationKeyframes, RotationKeyframes, ScaleKeyframes } |
| |
| table Channel { |
| node: int; // Index into `Scene`->`nodes`. |
| timeline: [float]; |
| keyframes: Keyframes; |
| } |
| |
| table Animation { |
| name: string; |
| channels: [Channel]; |
| } |
| |
| table Skin { |
| joints: [int]; // Indices into `Scene`->`nodes`. |
| inverse_bind_matrices: [Matrix]; |
| /// The root joint of the skeleton. |
| skeleton: int; // Index into `Scene`->`nodes`. |
| } |
| |
| //----------------------------------------------------------------------------- |
| /// Scene graph. |
| /// |
| |
| struct Matrix { |
| m: [float:16]; |
| } |
| |
| table Node { |
| name: string; |
| children: [int]; // Indices into `Scene`->`nodes`. |
| transform: Matrix; |
| mesh_primitives: [MeshPrimitive]; |
| skin: Skin; |
| } |
| |
| table Scene { |
| children: [int]; // Indices into `Scene`->`nodes`. |
| transform: Matrix; |
| nodes: [Node]; |
| textures: [Texture]; // Textures may be reused across different materials. |
| animations: [Animation]; |
| } |
| |
| root_type Scene; |
| file_identifier "IPSC"; |