// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.ui.gfx;

using fuchsia.mem;

// Commands that are used to modify the state of a |Session|.
// TODO(SCN-237): reorder Command definitions to match the order in this union.
union Command {
  CreateResourceCmd create_resource;
  ReleaseResourceCmd release_resource;
  ExportResourceCmd export_resource;
  ImportResourceCmd import_resource;

  // Tagging commands.
  SetTagCmd set_tag;

  // Grouping commands.
  DetachCmd detach;

  // Spatial commands.
  SetTranslationCmd set_translation;
  SetScaleCmd set_scale;
  SetRotationCmd set_rotation;
  SetAnchorCmd set_anchor;
  SetSizeCmd set_size;
  SetOpacityCmd set_opacity;

  SendSizeChangeHintCmdHACK send_size_change_hint_hack;

  // Node-specific commands.
  AddChildCmd add_child;  // TODO: Should we require a DetachCmd before
                              // re-parenting?
  AddPartCmd add_part;
  DetachChildrenCmd detach_children;
  SetShapeCmd set_shape;
  SetMaterialCmd set_material;
  SetClipCmd set_clip;
  SetHitTestBehaviorCmd set_hit_test_behavior;
  SetViewPropertiesCmd set_view_properties;
  TakeSnapshotCmdHACK take_snapshot_cmd;

  // Camera and lighting commands.
  SetCameraCmd set_camera;
  SetCameraTransformCmd set_camera_transform;
  SetCameraProjectionCmd set_camera_projection;
  SetStereoCameraProjectionCmd set_stereo_camera_projection;
  SetCameraPoseBufferCmd set_camera_pose_buffer;
  SetLightColorCmd set_light_color;
  SetLightDirectionCmd set_light_direction;
  AddLightCmd add_light;
  DetachLightCmd detach_light;
  DetachLightsCmd detach_lights;

  SetTextureCmd set_texture;
  SetColorCmd set_color;

  // Mesh commands.
  BindMeshBuffersCmd bind_mesh_buffers;

  // Layer and renderer commands.
  AddLayerCmd add_layer;
  RemoveLayerCmd remove_layer;
  RemoveAllLayersCmd remove_all_layers;
  SetLayerStackCmd set_layer_stack;
  SetRendererCmd set_renderer;
  SetRendererParamCmd set_renderer_param;

  // Events.
  SetEventMaskCmd set_event_mask;

  // Diagnostic commands.
  SetLabelCmd set_label;

  // Debugging commands.
  SetDisableClippingCmd set_disable_clipping;

  // TODO(SCN-1026): Remove this.
  SetImportFocusCmd set_import_focus;
};

// Instructs the compositor to create the specified |Resource|, and to register
// it in a table so that it can be referenced by subsequent commands.
struct CreateResourceCmd {
  // An ID that is currently not used within the session.
  uint32 id;
  ResourceArgs resource;
};

// Releases the client's reference to the resource; it is then illegal to use
// the ID in subsequent Commands.  Other references to the resource may exist,
// so releasing the resource does not result in its immediate destruction; it is
// only destroyed once the last reference is released.  For example, the
// resource may be required to render an in-progress frame, or it may be
// referred to by another resource).  However, the ID will be immediately
// unregistered, and may be reused to create a new resource.
struct ReleaseResourceCmd {
  // ID of the resource to be dereferenced.
  uint32 id;
};

// Create an external reference to the specified resource, which can then be
// imported into another Session by passing a handle to |token|'s peer to
// ImportResourceCmd; see that comment for more details.
//
// The importing client is typically in a different process than the exporter.
// No specific mechanism is provided for transferring a token from an exporter
// to an importer; collaborators may choose any out-of-band API they wish to do
// so.
struct ExportResourceCmd {
  uint32 id;
  handle<eventpair> token;
};

// Import a resource that was exported via ExportResourceCmd().  |token| is
// a handle to the eventpair peer that was used to export the resource, and
// |spec| describes the type of the imported resource, and the commands which
// can legally be applied to it.  Afterward, |id| can be used to refer to the
// resource in an Command, similarly (but not identically: see below) to a
// resource that was created in the session.  For example, you can add children
// to an imported EntityNode via AddChildCmd.
//
// However, note that the importer does not gain full access to the imported
// resource, but rather to an attenuated subset of its capabilities.  For
// example, you cannot use a DetachCmd to detach an imported EntityNode from
// its parent.
//
// Unlike ExportResourceCmd, there is no configurable timeout.  There is an
// expectation that the exported resource will become available in a short
// amount of time.  TODO: this needs elaboration... e.g. we might notify via the
// SessionListener when we know that the link will never be made (e.g. if the
// peer of the import token is destroyed).
//
// TODO: describe how the imported resource behaves if the exported resource
// isn't yet available, or becomes unavailable (e.g. an imported Material might
// act as a plain white texture).
struct ImportResourceCmd {
  uint32 id;
  handle<eventpair> token;
  ImportSpec spec;
};

// Maximum length for a resource label.
const uint32 kLabelMaxLength = 32;

// Sets/clears a label to help developers identify the purpose of the resource
// when using diagnostic tools.
//
// The label serves no functional purpose in the scene graph.  It exists only
// to help developers understand its structure.  The scene manager may truncate
// or discard labels at will.
//
// Constraints:
// - The label's maximum length is |kLabelMaxLength| characters.
// - Setting the label to an empty string clears it.
struct SetLabelCmd {
  uint32 id;
  string label;
};

// Add a node as a child to another node.
//
// Constraints:
// - |id| refs a Node with the has_children characteristic.
// - |child_id| refs any Node.
//
// Discussion:
// The child node is first removed from its existing parent, as if DetachCmd
// was applied first.
struct AddChildCmd {
  uint32 node_id;
  uint32 child_id;
};

// Add a node as a part of another node.  The implications of being a part
// rather than a child differ based on the type of the part.  However, one
// implication is constant: removing all of a node's children (e.g. via
// DetachChildrenCmd) does not affect its parts.  This is similar to the
// "shadow DOM" in a web browser: the controls of a <video> element are
// implemented as using the shadow DOM, and do no show up amongst the children
// of that element.
//
// Constraints:
// - |id| refs a Node with the has_parts characteristic.
// - |part_id| refs any Node.
//
// Discussion:
// The part node is first removed from its existing parent, as if DetachCmd
// was applied first.
struct AddPartCmd {
  uint32 node_id;
  uint32 part_id;
};

interface SnapshotCallbackHACK {
  1: OnData(fuchsia.mem.Buffer data);
};

struct TakeSnapshotCmdHACK {
  uint32 node_id;
  SnapshotCallbackHACK callback;
};

// Detaches a parentable object from its parent (e.g. a node from a parent node,
// or a layer from a layer stack).  It is illegal to apply this command to a
// non-parentable object.  No-op if the target object currently has no parent.
//
// Constraints:
// - |id| refs a parentable object
//
// Discussion:
// For nodes, this command will detach a node from its parent, regardless of
// whether it is a part or a child of its parent.
struct DetachCmd {
  uint32 id;
};

// Detaches all of a node's children (but not its parts).
struct DetachChildrenCmd {
  uint32 node_id;
};

// Sets/clears a node's tag value.
//
// A session can apply a tag value to any node to which it has access, including
// imported nodes.  These tags are private to the session and cannot be read
// or modified by other sessions.  When multiple sessions import the same node,
// each session will only observe its own tag values.
//
// Hit test results for a session only include nodes which the session has
// tagged with a non-zero value.  Therefore a session can use tag values to
// associate nodes with their functional purpose when picked.
//
// Constraints:
// - |node_id| refs a |Node|.
// - |tag_value| is the tag value to assign, or 0 to remove the tag.
struct SetTagCmd {
  uint32 node_id;
  uint32 tag_value;
};

// Sets a Resource's (typically a Node's) translation.
//
// Constraints:
// - |id| refs a Resource with the has_transform characteristic.
struct SetTranslationCmd {
  uint32 id;
  Vector3Value value;
};

// Sets a Resource's (typically a Node's) scale.
//
// Constraints:
// - |id| refs a Resource with the has_transform characteristic.
struct SetScaleCmd {
  uint32 id;
  Vector3Value value;
};

// Sets a Resource's (typically a Node's) rotation.
//
// Constraints:
// - |id| refs a Resource with the has_transform characteristic.
struct SetRotationCmd {
  uint32 id;
  QuaternionValue value;
};

// Sets a Resource's (typically a Node's) anchor point.
//
// Constraints:
// - |id| refs a Resource with the has_transform characteristic.
struct SetAnchorCmd {
  uint32 id;
  Vector3Value value;
};

// Sets an object's size.
//
// Constraints:
// - |id| refs a resizeable object.
// - some objects that support this command may have additional constraints
//   (e.g. in some cases |depth| must be zero).
struct SetSizeCmd {
  uint32 id;
  Vector2Value value;
};

// Sends a hint about a pending size change to the given node and all nodes
// below. This is generally sent before an animation.
//
// |width_change_factor| and |height_change_factor| is how much bigger or smaller
// the item is expected to be in the near future. This one number encapsulate
// both changes in scale, as well as changes to layout width and height.
struct SendSizeChangeHintCmdHACK {
  uint32 node_id;
  float32 width_change_factor;
  float32 height_change_factor;
};

// Sets a node's opacity.
//
// Constraints:
// - |node_id| refs a |Node| with the has_opacity characteristic.
// - |opacity| is in the range [0, 1].
struct SetOpacityCmd {
  uint32 node_id;
  float32 opacity;
};

// Sets/clears a node's shape.
//
// Constraints:
// - |node_id| refs a |Node| with the has_shape characteristic.
// - |shape_id| refs a |Shape|, or nothing.
// - if this command causes the target to have both a |Shape| and a |Material|,
//   then these must be compatible with each other (see README.md regarding
//   "Shape/Material Compatibility").
// TODO: add "Shape/Material Compatibility section"
//
// Discussion:
// In order to be painted, a node requires both a |Shape| and a |Material|.
// Without a material, a node can still participate in hit-testing and clipping.
// Without a shape, a node cannot do any of the above.
struct SetShapeCmd {
  uint32 node_id;
  uint32 shape_id;
};

// Sets/clears a node's material.
//
// Constraints:
// - |node_id| refs a |Node| with the has_material characteristic.
// - |material_id| refs a |Material|, or nothing.
// - if this command causes the target to have both a |Shape| and a |Material|,
//   then these must be compatible with each other (see README.md regarding
//   "Shape/Material Compatibility").
// TODO: add "Shape/Material Compatibility section"
//
// Discussion:
// In order to be painted, a node requires both a |Shape| and a |Material|.
// Without a material, a node can still participate in hit-testing and clipping.
// Without a shape, a node cannot do any of the above.
struct SetMaterialCmd {
  uint32 node_id;
  uint32 material_id;
};

// Sets/clears a node's clip.
//
// Constraints:
// - |node_id| refs a |Node| with the has_clip characteristic.
// - |clip_id| a |Node| with the is_clip characteristic, or nothing.  If the
//   referenced node is not rooted, then it will have no effect (since its
//   full world-transform cannot be determined).
// - |clip_to_self| If false, children are only clipped to the region specified
//   by |clip_id|.  If true, children are additionally clipped to the node's
//   shape (as determined by its ShapeNode parts).
//
// Discussion:
// If a node has a clip, it will be applied to both the parts and the children
// of the node.  Under some circumstances (TBD), a clip will not be applicable
// to a node; in such cases it will be as though no clip has been specified for
// the node.
// TODO: elaborate on the circumstances under which a clip is inapplicable.
// For example, consider a 3D space that looks through a portal into a 2D space
// that uses a clip for a circular reveal.  It would not be meaningful to clip
// objects on the outside (i.e. in the 3D space).
struct SetClipCmd {
  uint32 node_id;
  uint32 clip_id;
  bool clip_to_self;
};

// Sets a node's hit test behavior.
//
// Discussion:
// By default, hit testing is performed on the node's content, its parts,
// and its children.
struct SetHitTestBehaviorCmd {
  uint32 node_id;
  HitTestBehavior hit_test_behavior;
};

// Sets the properties for a ViewHolder's attached View.
//
// Constraints:
// - |view_holder_id| refs a |ViewHolder|.
struct SetViewPropertiesCmd {
  uint32 view_holder_id;
  ViewProperties properties;
};

// Sets a renderer's camera.
//
// Constraints:
// - |renderer_id| refs a |Renderer|.
// - |camera_id| refs a |Camera|, or stops rendering by passing zero.
// - |matrix| is a value or variable of type kMatrix4x4.
struct SetCameraCmd {
  uint32 renderer_id;
  uint32 camera_id;
};

// Sets a camera's view matrix.
// This operation can be applied to both Cameras and StereoCameras.
//
// Constraints:
// - |camera_id| refs a |Camera|.
// - |eye_position| is the position of the eye.
// - |eye_look_at| is the point is the scene the that eye is pointed at.
// - |eye_up| defines the camera's "up" vector.
struct SetCameraTransformCmd {
  uint32 camera_id;
  Vector3Value eye_position;
  Vector3Value eye_look_at;
  Vector3Value eye_up;
};

// Sets a camera's projection matrix.
// This operation cannot be applied to a StereoCamera.
//
// Constraints:
// - |camera_id| refs a |Camera| that is not a |StereoCamera|.
// - |fovy| is the Y-axis field of view, in radians.
//
// NOTE: A default orthographic projection is specified by setting |fovy| to
// zero.  In this case, the camera transform is ignored.
struct SetCameraProjectionCmd {
  uint32 camera_id;
  FloatValue fovy;  // Y-axis field of view, in radians.
};

// Sets a StereoCamera's projection matrices.
// This operation can only be applied to a StereoCamera.
//
// Constraints:
// - |camera_id| refs a |StereoCamera|.
// - |left_projection| is the projection matrix for the left eye.
// - |right_projection| is the projection matrix for the right eye.
//
// These projection matrices may also contain a transform in camera space for
// their eye if needed.
struct SetStereoCameraProjectionCmd {
  uint32 camera_id;
  Matrix4Value left_projection;
  Matrix4Value right_projection;
};

// Sets the "pose buffer" for the camera identified by |camera_id|.
// This operation can be applied to both Cameras and StereoCameras.
//
// This will override any position and rotation set for the camera and will
// make it take its position and rotation from the pose buffer each frame
// based on the presentation time for that frame.
//
// A pose buffer represents a ring buffer of poses for a fixed number of time
// points in the future. Each entry in the buffer identified by |buffer_id| is
// a quaternion and a position layed out as follows:
//
// struct Pose {
//   // Quaternion
//   float32 a;
//   float32 b;
//   float32 c;
//   float32 d;
//
//   // Position
//   float32 x;
//   float32 y;
//   float32 z;
//
//   // Reserved/Padding
//   byte[4] reserved;
// }
//
// The buffer can be thought of as a packed array of |num_entries| Pose structs
// and is required to be at least num_entries * sizeof(Pose) bytes.
//
// The quaternions and positions are specified in the space of the camera's
// parent node.
//
// |base_time| is a base time point expressed in nanoseconds in the
// |CLOCK_MONOTONIC| timebase and |time_interval| is the time in nanoseconds
// between entries in the buffer. |base_time| must be in the past.
//
// For a given point in time |t| expressed in nanoseconds in the
// |CLOCK_MONOTONIC| timebase the index of the corresponding pose in
// the pose buffer can be computed as follows:
//
// index(t) = ((t - base_time) / time_interval) % num_entries
//
// poses[index(t)] is valid for t over the time interval (t - time_interval, t]
// and should be expected to updated continuously without synchronization
// for the duration of that interval. If a single pose value is needed for
// multiple non-atomic operations a value should be latched and stored outside
// the pose buffer.
//
// Because the poses are not protected by any synchronization primitives it is
// possible that when a pose is latched it will be only partially updated, and
// the pose being read will contain some components from the pose before it is
// updated and some components from the updated pose. The safety of using these
// "torn" poses relies on two things:
//
// 1) Sequential poses written to poses[index(t)] are very similar to each
// other numerically, so that if some components are taken from the first and
// some are taken from another the result is numerically similar to both
//
// 2) The space of positions and quaternions is locally flat at the scale of
// changes between sequential updates, which guarantees that two poses which
// are numerically similar also represent semantically similar poses (i.e.
// there are no discontinuities which will cause a small numerical change in
// the position or quaterninon to cause a large change in the encoded pose)
// For positions this is guaranteed because Scenic uses a Euclidean 3-space
// which is globally flat and for quaternions this is guaranteed because
// quaternions encode rotation as points on a unit 4-sphere, and spheres are
// locally flat. For more details on the encoding of rotations in quaterions
// see https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation
//
// This commanderation is intended for late latching camera pose to support
// low-latency motion-tracked rendering.
struct SetCameraPoseBufferCmd {
  uint32 camera_id;
  uint32 buffer_id;
  uint32 num_entries;
  int64 base_time;
  uint64 time_interval;
};

// Sets the color of the Light identified by |light_id|.
struct SetLightColorCmd {
  uint32 light_id;
  ColorRgbValue color;
};

// Sets the direction of the DirectionalLight identified by |light_id|.
struct SetLightDirectionCmd {
  uint32 light_id;
  Vector3Value direction;
};

// Adds the light specified by |light_id| specified by |light_id| to the scene
// identified by |scene_id|.
struct AddLightCmd {
  uint32 scene_id;
  uint32 light_id;
};

// Detach the light specified by |light_id| from the scene that it is attached
// to, if any.
struct DetachLightCmd {
  uint32 light_id;
};

// Detach all lights from the scene specified by |scene_id|.
struct DetachLightsCmd {
  uint32 scene_id;
};

// Sets/clears a material's texture.
//
// Constraints:
// - |material_id| refs a |Material|.
// - |texture_id| refs a |Image|, |ImagePipe|, or nothing.
//
// If no texture is provided (i.e. |texture_id| is zero), a solid color is used.
// If a texture is provided, then the value sampled from the texture is
// multiplied by the color.
struct SetTextureCmd {
  uint32 material_id;
  uint32 texture_id;  // Refers to an Image resource.  May be zero (no texture).
};

// Sets a material's color.
//
// Constraints:
// - |material_id| refs a |Material|.
//
// If a texture is set on the material, then the value sampled from the texture
// is multiplied by the color.
struct SetColorCmd {
  uint32 material_id;
  ColorRgbaValue color;
};

// Set a mesh's indices and vertices.
//
// |mesh_id| refs the Mesh to be updated.
// |index_buffer_id| refs a Buffer that contains the mesh indices.
// |index_format| defines how the index buffer data is to be interpreted.
// |index_offset| number of bytes from the start of the index Buffer.
// |index_count| number of indices.
// |vertex_buffer_id| refs a Buffer that contains the mesh vertices.
// |vertex_format| defines how the vertex buffer data is to be interpreted.
// |vertex_offset| number of bytes from the start of the vertex Buffer.
// |vertex_count| number of vertices.
// |bounding_box| must contain all vertices within the specified range.
//
// The MeshVertexFormat defines which per-vertex attributes are provided by the
// mesh, and the size of each attribute (and therefore the size of each vertex).
// The attributes are ordered within the vertex in the same order that they
// appear within the MeshVertexFormat struct.  For example, if the values are
// kVector3, kNone and kVector2, then:
//   - each vertex has a position and UV-coordinates, but no surface normal.
//   - the 3D position occupies bytes 0-11 (3 dimensions * 4 bytes per float32).
//   - the UV coords occupy bytes 12-19, since no surface normal is provided.
enum MeshIndexFormat {
  // TODO(SCN-275): only kUint32 is currently supported.
  kUint16 = 1;
  kUint32 = 2;
};

struct MeshVertexFormat {
  // kVector2 or kVector3.
  ValueType position_type;
  // kVector2 or kVector3 (must match position_type), or kNone.
  ValueType normal_type;
  // kVector2 or kNone.
  ValueType tex_coord_type;
};

struct BindMeshBuffersCmd {
  uint32 mesh_id;
  uint32 index_buffer_id;
  MeshIndexFormat index_format;
  uint64 index_offset;
  uint32 index_count;
  uint32 vertex_buffer_id;
  MeshVertexFormat vertex_format;
  uint64 vertex_offset;
  uint32 vertex_count;
  BoundingBox bounding_box;
};

// Add a layer to a layer stack.
// Constraints:
// - |layer_stack_id| refs a |LayerStack|.
// - |layer_id| refs a |Layer|.
// - The layer must not already belong to a different stack; it must first be
//   detached.
struct AddLayerCmd {
  uint32 layer_stack_id;
  uint32 layer_id;
};

// Remove a layer from a layer stack.
// Constraints:
// - |layer_stack_id| refs a |LayerStack|.
// - |layer_id| refs a |Layer|.
// - The layer must belong to this stack.
struct RemoveLayerCmd {
  uint32 layer_stack_id;
  uint32 layer_id;
};

// Remove all layers from a layer stack.
// Constraints
// - |layer_stack_id| refs a |LayerStack|.
struct RemoveAllLayersCmd {
  uint32 layer_stack_id;
};

// Set a compositor's layer stack, replacing the current stack (if any).
// Constraints:
// - |compositor_id| refs a |DisplayCompositor| or |ImagePipeCompositor|.
// - |layer_stack_id| refs a |LayerStack|.
struct SetLayerStackCmd {
  uint32 compositor_id;
  uint32 layer_stack_id;
};

// Set a layer's renderer, replacing the current renderer (if any).
// Constraints:
// - |layer_id| refs a |Layer|.
// - |renderer_id| refs a |Renderer|.
struct SetRendererCmd {
  uint32 layer_id;
  uint32 renderer_id;
};

// Sets a parameter that affects how a renderer renders a scene.
//
// |renderer_id| refs the Renderer that is being modified.
// |param| describes the parameter that should be set, and to what.
struct SetRendererParamCmd {
  uint32 renderer_id;
  RendererParam param;
};

// Sets which events a resource should deliver to the session listener.
// This command replaces any prior event mask for the resource.
//
// The initial event mask for a resource is zero, meaning no events are
// reported.
//
// Constraints:
// - |resource_id| is a valid resource id
// - |event_mask| is zero or a combination of |k*EventMask| bits OR'ed together.
struct SetEventMaskCmd {
  uint32 id;
  uint32 event_mask;
};

// Set whether clipping should be disabled for the specified renderer.  For a
// newly-created renderer, clipping will NOT be disabled (i.e. it will be
// enabled).
//
// NOTE: this disables visual clipping only; objects are still clipped for the
// purposes of hit-testing.
//
// |renderer_id| refs the target renderer.
// |disable_clipping| specifies whether the clipping should be disabled.
struct SetDisableClippingCmd {
  uint32 renderer_id;
  bool disable_clipping;
};

// TODO(SCN-1026): Remove this.
struct SetImportFocusCmd {
  uint32 id;
  bool focusable;
};
