1use crate::ids::SubdId;
5use crate::math::Point3;
6use crate::provenance::SourceObjectAssociation;
7use schemars::JsonSchema;
8use serde::{Deserialize, Serialize};
9
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
12pub struct SubdSurface {
13 pub id: SubdId,
15 pub scheme: SubdScheme,
17 pub vertices: Vec<SubdVertex>,
19 pub edges: Vec<SubdEdge>,
21 pub faces: Vec<SubdFace>,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
25 pub source_object: Option<SourceObjectAssociation>,
26}
27
28#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
30#[serde(rename_all = "snake_case")]
31pub enum SubdScheme {
32 CatmullClark,
34}
35
36#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
38pub struct SubdVertex {
39 pub point: Point3,
41 pub tag: SubdVertexTag,
43}
44
45#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
47#[serde(rename_all = "snake_case")]
48pub enum SubdVertexTag {
49 Smooth,
51 Crease,
53 Corner,
55 Dart,
57}
58
59#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
61pub struct SubdEdge {
62 pub vertices: [u32; 2],
64 pub sharpness: [f64; 2],
66 pub tag: SubdEdgeTag,
68 pub sector_coefficients: [f64; 2],
70}
71
72#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
74#[serde(rename_all = "snake_case")]
75pub enum SubdEdgeTag {
76 Smooth,
78 SmoothX,
80 Crease,
82}
83
84#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
86pub struct SubdFace {
87 pub edges: Vec<SubdEdgeUse>,
89}
90
91#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
93pub struct SubdEdgeUse {
94 pub edge: u32,
96 pub reversed: bool,
98}