blob: 3966e0ed395d90a5878dd491ea738afa67542861 [file] [log] [blame]
// 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";