|
use super::*; |
|
|
|
|
|
impl Bezier { |
|
|
|
pub fn set_start(&mut self, s: DVec2) { |
|
self.start = s; |
|
} |
|
|
|
|
|
pub fn set_end(&mut self, e: DVec2) { |
|
self.end = e; |
|
} |
|
|
|
|
|
pub fn set_handle_start(&mut self, h1: DVec2) { |
|
match self.handles { |
|
BezierHandles::Linear => { |
|
self.handles = BezierHandles::Quadratic { handle: h1 }; |
|
} |
|
BezierHandles::Quadratic { ref mut handle } => { |
|
*handle = h1; |
|
} |
|
BezierHandles::Cubic { ref mut handle_start, .. } => { |
|
*handle_start = h1; |
|
} |
|
}; |
|
} |
|
|
|
|
|
pub fn set_handle_end(&mut self, h2: DVec2) { |
|
match self.handles { |
|
BezierHandles::Linear => { |
|
self.handles = BezierHandles::Cubic { |
|
handle_start: self.start, |
|
handle_end: h2, |
|
}; |
|
} |
|
BezierHandles::Quadratic { handle } => { |
|
self.handles = BezierHandles::Cubic { handle_start: handle, handle_end: h2 }; |
|
} |
|
BezierHandles::Cubic { ref mut handle_end, .. } => { |
|
*handle_end = h2; |
|
} |
|
}; |
|
} |
|
|
|
|
|
pub fn start(&self) -> DVec2 { |
|
self.start |
|
} |
|
|
|
|
|
pub fn end(&self) -> DVec2 { |
|
self.end |
|
} |
|
|
|
|
|
pub fn handle_start(&self) -> Option<DVec2> { |
|
self.handles.start() |
|
} |
|
|
|
|
|
pub fn handle_end(&self) -> Option<DVec2> { |
|
self.handles.end() |
|
} |
|
|
|
|
|
|
|
|
|
|
|
pub fn get_points(&self) -> impl Iterator<Item = DVec2> + use<> { |
|
match self.handles { |
|
BezierHandles::Linear => [self.start, self.end, DVec2::ZERO, DVec2::ZERO].into_iter().take(2), |
|
BezierHandles::Quadratic { handle } => [self.start, handle, self.end, DVec2::ZERO].into_iter().take(3), |
|
BezierHandles::Cubic { handle_start, handle_end } => [self.start, handle_start, handle_end, self.end].into_iter().take(4), |
|
} |
|
} |
|
} |
|
|