aboutsummaryrefslogtreecommitdiff
path: root/src_testbed/objects/polyline.rs
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2020-08-25 22:10:25 +0200
committerSébastien Crozet <developer@crozet.re>2020-08-25 22:10:25 +0200
commit754a48b7ff6d8c58b1ee08651e60112900b60455 (patch)
tree7d777a6c003f1f5d8f8d24f533f35a95a88957fe /src_testbed/objects/polyline.rs
downloadrapier-754a48b7ff6d8c58b1ee08651e60112900b60455.tar.gz
rapier-754a48b7ff6d8c58b1ee08651e60112900b60455.tar.bz2
rapier-754a48b7ff6d8c58b1ee08651e60112900b60455.zip
First public release of Rapier.v0.1.0
Diffstat (limited to 'src_testbed/objects/polyline.rs')
-rw-r--r--src_testbed/objects/polyline.rs79
1 files changed, 79 insertions, 0 deletions
diff --git a/src_testbed/objects/polyline.rs b/src_testbed/objects/polyline.rs
new file mode 100644
index 0000000..77841ae
--- /dev/null
+++ b/src_testbed/objects/polyline.rs
@@ -0,0 +1,79 @@
+use kiss3d::window::Window;
+use na::{Isometry2, Point2, Point3};
+use ncollide2d::shape;
+use nphysics2d::object::{ColliderAnchor, DefaultColliderHandle, DefaultColliderSet};
+
+pub struct Polyline {
+ color: Point3<f32>,
+ base_color: Point3<f32>,
+ vertices: Vec<Point2<f32>>,
+ indices: Vec<Point2<usize>>,
+ collider: DefaultColliderHandle,
+ pos: Isometry2<f32>,
+}
+
+impl Polyline {
+ pub fn new(
+ collider: DefaultColliderHandle,
+ colliders: &DefaultColliderSet<f32>,
+ _: Isometry2<f32>,
+ vertices: Vec<Point2<f32>>,
+ indices: Vec<Point2<usize>>,
+ color: Point3<f32>,
+ _: &mut Window,
+ ) -> Polyline {
+ let mut res = Polyline {
+ color,
+ pos: Isometry2::identity(),
+ base_color: color,
+ vertices,
+ indices,
+ collider,
+ };
+
+ res.update(colliders);
+ res
+ }
+
+ pub fn select(&mut self) {
+ self.color = Point3::new(1.0, 0.0, 0.0);
+ }
+
+ pub fn unselect(&mut self) {
+ self.color = self.base_color;
+ }
+
+ pub fn set_color(&mut self, color: Point3<f32>) {
+ self.color = color;
+ self.base_color = color;
+ }
+
+ pub fn update(&mut self, colliders: &DefaultColliderSet<f32>) {
+ // Update if some deformation occurred.
+ // FIXME: don't update if it did not move.
+ if let Some(c) = colliders.get(self.collider) {
+ self.pos = *c.position();
+ if let ColliderAnchor::OnDeformableBody { .. } = c.anchor() {
+ let shape = c.shape().as_shape::<shape::Polyline<f32>>().unwrap();
+ self.vertices = shape.points().to_vec();
+ self.indices.clear();
+
+ for e in shape.edges() {
+ self.indices.push(e.indices);
+ }
+ }
+ }
+ }
+
+ pub fn object(&self) -> DefaultColliderHandle {
+ self.collider
+ }
+
+ pub fn draw(&mut self, window: &mut Window) {
+ for idx in &self.indices {
+ let p1 = self.pos * self.vertices[idx.x];
+ let p2 = self.pos * self.vertices[idx.y];
+ window.draw_planar_line(&p1, &p2, &self.color)
+ }
+ }
+}