use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum RepresentationPolicy {
#[default]
Preserve,
EvaluatedOccurrence,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct AppearanceRequest {
#[serde(default)]
pub representation_policy: RepresentationPolicy,
pub schema: String,
pub source_revision: String,
pub next_express_id: u32,
pub product_ids: Vec<u32>,
pub image_uri: String,
pub repeat_s: bool,
pub repeat_t: bool,
pub mapping: Mapping,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(tag = "kind", rename_all = "camelCase", deny_unknown_fields)]
pub enum Mapping {
#[serde(rename_all = "camelCase")]
ExistingUv {
scale: [f64; 2],
offset: [f64; 2],
rotation_radians: f64,
},
#[serde(rename_all = "camelCase")]
Planar {
frame: MappingFrame,
origin: [f64; 3],
axis_u: [f64; 3],
axis_v: [f64; 3],
metres_per_tile: [f64; 2],
},
#[serde(rename_all = "camelCase")]
Box {
frame: MappingFrame,
origin: [f64; 3],
metres_per_tile: [f64; 3],
},
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum MappingFrame {
Item,
World,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreatedEntity {
pub express_id: u32,
pub r#type: String,
pub attributes: Vec<Value>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PositionalEdit {
pub express_id: u32,
pub index: usize,
pub value: Value,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AppearanceItem {
pub product_id: u32,
pub geometry_item_id: u32,
pub tex_coords: Vec<[f64; 2]>,
pub tex_coord_index: Vec<[u32; 3]>,
pub source_indices: Vec<u32>,
pub target_indices: Vec<u32>,
pub target_vertex_count: usize,
pub preview_corner_uvs: Vec<f32>,
pub target_corner_normals: Vec<f32>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Exclusion {
pub product_id: u32,
pub reason: String,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AppearancePlan {
pub conversions: Vec<AppearanceConversion>,
pub source_revision: String,
pub next_express_id: u32,
pub next_available_express_id: u32,
pub created: Vec<CreatedEntity>,
pub edits: Vec<PositionalEdit>,
pub removed: Vec<u32>,
pub items: Vec<AppearanceItem>,
pub exclusions: Vec<Exclusion>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AppearanceConversion {
pub product_id: u32,
pub representation_id: u32,
pub source_geometry_item_id: u32,
pub geometry_item_id: u32,
pub source_indices: Vec<u32>,
pub source_positions: Vec<f32>,
pub source_normals: Vec<f32>,
pub source_origin: [f64; 3],
pub source_color: [f32; 4],
pub rtc_offset: [f64; 3],
#[serde(skip_serializing_if = "Vec::is_empty")]
pub source_removed_meshes: Vec<crate::types::mesh::MeshData>,
}