aboutsummaryrefslogtreecommitdiff
path: root/src_testbed/objects
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2021-01-29 14:42:32 +0100
committerGitHub <noreply@github.com>2021-01-29 14:42:32 +0100
commit7ca46f38cde6cf8bf8bf41ea6067ae5bc938205c (patch)
tree3781b9d7c92a6a8111573ba4cae1c5d41435950e /src_testbed/objects
parente6fc8f67faf3e37afe38d683cbd930d457f289be (diff)
parent825f33efaec4ce6a8903751e836a0ea9c466ff92 (diff)
downloadrapier-7ca46f38cde6cf8bf8bf41ea6067ae5bc938205c.tar.gz
rapier-7ca46f38cde6cf8bf8bf41ea6067ae5bc938205c.tar.bz2
rapier-7ca46f38cde6cf8bf8bf41ea6067ae5bc938205c.zip
Merge pull request #79 from dimforge/split_geom
Move most of the geometric code to another crate.
Diffstat (limited to 'src_testbed/objects')
-rw-r--r--src_testbed/objects/ball.rs5
-rw-r--r--src_testbed/objects/box_node.rs5
-rw-r--r--src_testbed/objects/capsule.rs5
-rw-r--r--src_testbed/objects/cone.rs5
-rw-r--r--src_testbed/objects/convex.rs23
-rw-r--r--src_testbed/objects/cylinder.rs5
-rw-r--r--src_testbed/objects/heightfield.rs28
-rw-r--r--src_testbed/objects/mesh.rs7
-rw-r--r--src_testbed/objects/mod.rs1
-rw-r--r--src_testbed/objects/node.rs29
-rw-r--r--src_testbed/objects/polyline.rs64
11 files changed, 103 insertions, 74 deletions
diff --git a/src_testbed/objects/ball.rs b/src_testbed/objects/ball.rs
index f72c284..df43341 100644
--- a/src_testbed/objects/ball.rs
+++ b/src_testbed/objects/ball.rs
@@ -9,11 +9,13 @@ pub struct Ball {
base_color: Point3<f32>,
gfx: GraphicsNode,
collider: ColliderHandle,
+ delta: Isometry<f32>,
}
impl Ball {
pub fn new(
collider: ColliderHandle,
+ delta: Isometry<f32>,
radius: f32,
color: Point3<f32>,
window: &mut Window,
@@ -28,6 +30,7 @@ impl Ball {
base_color: color,
gfx: node,
collider,
+ delta,
};
// res.gfx.set_texture_from_file(&Path::new("media/kitten.png"), "kitten");
@@ -55,7 +58,7 @@ impl Ball {
colliders,
self.collider,
&self.color,
- &Isometry::identity(),
+ &self.delta,
);
}
diff --git a/src_testbed/objects/box_node.rs b/src_testbed/objects/box_node.rs
index 493ffba..0586d77 100644
--- a/src_testbed/objects/box_node.rs
+++ b/src_testbed/objects/box_node.rs
@@ -9,11 +9,13 @@ pub struct Box {
base_color: Point3<f32>,
gfx: GraphicsNode,
collider: ColliderHandle,
+ delta: Isometry<f32>,
}
impl Box {
pub fn new(
collider: ColliderHandle,
+ delta: Isometry<f32>,
half_extents: Vector<f32>,
color: Point3<f32>,
window: &mut window::Window,
@@ -29,6 +31,7 @@ impl Box {
base_color: color,
gfx: node,
collider,
+ delta,
};
res.gfx.set_color(color.x, color.y, color.z);
@@ -55,7 +58,7 @@ impl Box {
colliders,
self.collider,
&self.color,
- &Isometry::identity(),
+ &self.delta,
);
}
diff --git a/src_testbed/objects/capsule.rs b/src_testbed/objects/capsule.rs
index 23160be..3d3e88f 100644
--- a/src_testbed/objects/capsule.rs
+++ b/src_testbed/objects/capsule.rs
@@ -9,11 +9,13 @@ pub struct Capsule {
base_color: Point3<f32>,
gfx: GraphicsNode,
collider: ColliderHandle,
+ delta: Isometry<f32>,
}
impl Capsule {
pub fn new(
collider: ColliderHandle,
+ delta: Isometry<f32>,
capsule: &geometry::Capsule,
color: Point3<f32>,
window: &mut window::Window,
@@ -30,6 +32,7 @@ impl Capsule {
base_color: color,
gfx: node,
collider,
+ delta: delta * capsule.transform_wrt_y(),
};
res.gfx.set_color(color.x, color.y, color.z);
@@ -50,7 +53,7 @@ impl Capsule {
colliders,
self.collider,
&self.color,
- &Isometry::identity(),
+ &self.delta,
);
}
diff --git a/src_testbed/objects/cone.rs b/src_testbed/objects/cone.rs
index 58b014f..7aa2039 100644
--- a/src_testbed/objects/cone.rs
+++ b/src_testbed/objects/cone.rs
@@ -9,11 +9,13 @@ pub struct Cone {
base_color: Point3<f32>,
gfx: GraphicsNode,
collider: ColliderHandle,
+ delta: Isometry<f32>,
}
impl Cone {
pub fn new(
collider: ColliderHandle,
+ delta: Isometry<f32>,
half_height: f32,
radius: f32,
color: Point3<f32>,
@@ -29,6 +31,7 @@ impl Cone {
base_color: color,
gfx: node,
collider,
+ delta,
};
// res.gfx.set_texture_from_file(&Path::new("media/kitten.png"), "kitten");
@@ -56,7 +59,7 @@ impl Cone {
colliders,
self.collider,
&self.color,
- &Isometry::identity(),
+ &self.delta,
);
}
diff --git a/src_testbed/objects/convex.rs b/src_testbed/objects/convex.rs
index 0347144..95ef74a 100644
--- a/src_testbed/objects/convex.rs
+++ b/src_testbed/objects/convex.rs
@@ -13,25 +13,44 @@ pub struct Convex {
base_color: Point3<f32>,
gfx: GraphicsNode,
body: ColliderHandle,
+ delta: Isometry<f32>,
}
impl Convex {
pub fn new(
body: ColliderHandle,
+ delta: Isometry<f32>,
vertices: Vec<Point<f32>>,
+ #[cfg(feature = "dim3")] indices: Vec<[u32; 3]>,
color: Point3<f32>,
window: &mut Window,
) -> Convex {
#[cfg(feature = "dim2")]
let node = window.add_convex_polygon(vertices, Vector::from_element(1.0));
#[cfg(feature = "dim3")]
- let node = unimplemented!();
+ let node = {
+ use std::cell::RefCell;
+ use std::rc::Rc;
+ let mut mesh_vertices = Vec::new();
+ let mut mesh_indices = Vec::new();
+ for idx in indices {
+ let i = mesh_vertices.len() as u16;
+ mesh_vertices.push(vertices[idx[0] as usize]);
+ mesh_vertices.push(vertices[idx[1] as usize]);
+ mesh_vertices.push(vertices[idx[2] as usize]);
+ mesh_indices.push(Point3::new(i, i + 1, i + 2));
+ }
+
+ let mesh = kiss3d::resource::Mesh::new(mesh_vertices, mesh_indices, None, None, false);
+ window.add_mesh(Rc::new(RefCell::new(mesh)), na::Vector3::from_element(1.0))
+ };
let mut res = Convex {
color,
base_color: color,
gfx: node,
body,
+ delta,
};
// res.gfx.set_texture_from_file(&Path::new("media/kitten.png"), "kitten");
@@ -59,7 +78,7 @@ impl Convex {
colliders,
self.body,
&self.color,
- &Isometry::identity(),
+ &self.delta,
);
}
diff --git a/src_testbed/objects/cylinder.rs b/src_testbed/objects/cylinder.rs
index 01a6737..ff4dc72 100644
--- a/src_testbed/objects/cylinder.rs
+++ b/src_testbed/objects/cylinder.rs
@@ -9,11 +9,13 @@ pub struct Cylinder {
base_color: Point3<f32>,
gfx: GraphicsNode,
collider: ColliderHandle,
+ delta: Isometry<f32>,
}
impl Cylinder {
pub fn new(
collider: ColliderHandle,
+ delta: Isometry<f32>,
half_height: f32,
radius: f32,
color: Point3<f32>,
@@ -29,6 +31,7 @@ impl Cylinder {
base_color: color,
gfx: node,
collider,
+ delta,
};
// res.gfx.set_texture_from_file(&Path::new("media/kitten.png"), "kitten");
@@ -56,7 +59,7 @@ impl Cylinder {
colliders,
self.collider,
&self.color,
- &Isometry::identity(),
+ &self.delta,
);
}
diff --git a/src_testbed/objects/heightfield.rs b/src_testbed/objects/heightfield.rs
index 0815592..913a732 100644
--- a/src_testbed/objects/heightfield.rs
+++ b/src_testbed/objects/heightfield.rs
@@ -1,15 +1,16 @@
-#[cfg(feature = "dim3")]
-use crate::objects::node::{self, GraphicsNode};
use kiss3d::window::Window;
use na::{self, Point3};
-use ncollide::shape;
-#[cfg(feature = "dim3")]
-use ncollide::transformation::ToTriMesh;
+use parry::shape;
use rapier::geometry::{ColliderHandle, ColliderSet};
#[cfg(feature = "dim2")]
use rapier::math::Point;
#[cfg(feature = "dim3")]
-use rapier::math::Vector;
+use {
+ crate::objects::node::{self, GraphicsNode},
+ kiss3d::resource::Mesh,
+ rapier::math::Vector,
+ std::cell::RefCell,
+};
pub struct HeightField {
color: Point3<f32>,
@@ -25,7 +26,7 @@ impl HeightField {
#[cfg(feature = "dim2")]
pub fn new(
collider: ColliderHandle,
- heightfield: &shape::HeightField<f32>,
+ heightfield: &shape::HeightField,
color: Point3<f32>,
_: &mut Window,
) -> HeightField {
@@ -47,16 +48,23 @@ impl HeightField {
#[cfg(feature = "dim3")]
pub fn new(
collider: ColliderHandle,
- heightfield: &shape::HeightField<f32>,
+ heightfield: &shape::HeightField,
color: Point3<f32>,
window: &mut Window,
) -> HeightField {
- let mesh = heightfield.to_trimesh(());
+ use std::rc::Rc;
+
+ let (vertices, indices) = heightfield.to_trimesh();
+ let indices = indices
+ .into_iter()
+ .map(|idx| Point3::new(idx[0] as u16, idx[1] as u16, idx[2] as u16))
+ .collect();
+ let mesh = Mesh::new(vertices, indices, None, None, false);
let mut res = HeightField {
color,
base_color: color,
- gfx: window.add_trimesh(mesh, Vector::repeat(1.0)),
+ gfx: window.add_mesh(Rc::new(RefCell::new(mesh)), Vector::repeat(1.0)),
collider: collider,
};
diff --git a/src_testbed/objects/mesh.rs b/src_testbed/objects/mesh.rs
index 5187a8b..5505de3 100644
--- a/src_testbed/objects/mesh.rs
+++ b/src_testbed/objects/mesh.rs
@@ -17,12 +17,15 @@ impl Mesh {
pub fn new(
collider: ColliderHandle,
vertices: Vec<Point<f32>>,
- indices: Vec<Point3<u32>>,
+ indices: Vec<[u32; 3]>,
color: Point3<f32>,
window: &mut window::Window,
) -> Mesh {
let vs = vertices;
- let is = indices.into_iter().map(na::convert).collect();
+ let is = indices
+ .into_iter()
+ .map(|idx| Point3::new(idx[0] as u16, idx[1] as u16, idx[2] as u16))
+ .collect();
let mesh;
let gfx;
diff --git a/src_testbed/objects/mod.rs b/src_testbed/objects/mod.rs
index e4d7bc4..8e12dbe 100644
--- a/src_testbed/objects/mod.rs
+++ b/src_testbed/objects/mod.rs
@@ -7,6 +7,7 @@ pub mod cylinder;
pub mod heightfield;
pub mod mesh;
pub mod node;
+pub mod polyline;
//pub mod plane;
//#[cfg(feature = "dim2")]
//pub mod polyline;
diff --git a/src_testbed/objects/node.rs b/src_testbed/objects/node.rs
index d1de799..1bc491f 100644
--- a/src_testbed/objects/node.rs
+++ b/src_testbed/objects/node.rs
@@ -5,8 +5,7 @@ use crate::objects::convex::Convex;
use crate::objects::heightfield::HeightField;
use crate::objects::mesh::Mesh;
//use crate::objects::plane::Plane;
-//#[cfg(feature = "dim2")]
-//use crate::objects::polyline::Polyline;
+use crate::objects::polyline::Polyline;
use kiss3d::window::Window;
use na::Point3;
@@ -26,8 +25,7 @@ pub enum Node {
Box(Box),
HeightField(HeightField),
Capsule(Capsule),
- // #[cfg(feature = "dim2")]
- // Polyline(Polyline),
+ Polyline(Polyline),
Mesh(Mesh),
Convex(Convex),
Cylinder(Cylinder),
@@ -42,8 +40,7 @@ impl Node {
Node::Box(ref mut n) => n.select(),
Node::Capsule(ref mut n) => n.select(),
Node::HeightField(ref mut n) => n.select(),
- // #[cfg(feature = "dim2")]
- // Node::Polyline(ref mut n) => n.select(),
+ Node::Polyline(ref mut n) => n.select(),
Node::Mesh(ref mut n) => n.select(),
Node::Convex(ref mut n) => n.select(),
Node::Cylinder(ref mut n) => n.select(),
@@ -58,8 +55,7 @@ impl Node {
Node::Box(ref mut n) => n.unselect(),
Node::Capsule(ref mut n) => n.unselect(),
Node::HeightField(ref mut n) => n.unselect(),
- // #[cfg(feature = "dim2")]
- // Node::Polyline(ref mut n) => n.unselect(),
+ Node::Polyline(ref mut n) => n.unselect(),
Node::Mesh(ref mut n) => n.unselect(),
Node::Convex(ref mut n) => n.unselect(),
Node::Cylinder(ref mut n) => n.unselect(),
@@ -74,8 +70,7 @@ impl Node {
Node::Box(ref mut n) => n.update(colliders),
Node::Capsule(ref mut n) => n.update(colliders),
Node::HeightField(ref mut n) => n.update(colliders),
- // #[cfg(feature = "dim2")]
- // Node::Polyline(ref mut n) => n.update(colliders),
+ Node::Polyline(ref mut n) => n.update(colliders),
Node::Mesh(ref mut n) => n.update(colliders),
Node::Convex(ref mut n) => n.update(colliders),
Node::Cylinder(ref mut n) => n.update(colliders),
@@ -86,7 +81,7 @@ impl Node {
#[cfg(feature = "dim2")]
pub fn draw(&mut self, window: &mut Window) {
match *self {
- // Node::Polyline(ref mut n) => n.draw(_window),
+ Node::Polyline(ref mut n) => n.draw(window),
Node::HeightField(ref mut n) => n.draw(window),
// Node::Plane(ref mut n) => n.draw(_window),
_ => {}
@@ -109,8 +104,9 @@ impl Node {
Node::Convex(ref n) => Some(n.scene_node()),
Node::Cylinder(ref n) => Some(n.scene_node()),
Node::Cone(ref n) => Some(n.scene_node()),
+ Node::Polyline(_) => None,
#[cfg(feature = "dim2")]
- _ => None,
+ Node::HeightField(_) => None,
}
}
@@ -127,8 +123,9 @@ impl Node {
Node::Convex(ref mut n) => Some(n.scene_node_mut()),
Node::Cylinder(ref mut n) => Some(n.scene_node_mut()),
Node::Cone(ref mut n) => Some(n.scene_node_mut()),
+ Node::Polyline(_) => None,
#[cfg(feature = "dim2")]
- _ => None,
+ Node::HeightField(_) => None,
}
}
@@ -139,8 +136,7 @@ impl Node {
Node::Box(ref n) => n.object(),
Node::Capsule(ref n) => n.object(),
Node::HeightField(ref n) => n.object(),
- // #[cfg(feature = "dim2")]
- // Node::Polyline(ref n) => n.object(),
+ Node::Polyline(ref n) => n.object(),
Node::Mesh(ref n) => n.object(),
Node::Convex(ref n) => n.object(),
Node::Cylinder(ref n) => n.object(),
@@ -155,8 +151,7 @@ impl Node {
Node::Box(ref mut n) => n.set_color(color),
Node::Capsule(ref mut n) => n.set_color(color),
Node::HeightField(ref mut n) => n.set_color(color),
- // #[cfg(feature = "dim2")]
- // Node::Polyline(ref mut n) => n.set_color(color),
+ Node::Polyline(ref mut n) => n.set_color(color),
Node::Mesh(ref mut n) => n.set_color(color),
Node::Convex(ref mut n) => n.set_color(color),
Node::Cylinder(ref mut n) => n.set_color(color),
diff --git a/src_testbed/objects/polyline.rs b/src_testbed/objects/polyline.rs
index 77841ae..98a8f24 100644
--- a/src_testbed/objects/polyline.rs
+++ b/src_testbed/objects/polyline.rs
@@ -1,38 +1,32 @@
use kiss3d::window::Window;
-use na::{Isometry2, Point2, Point3};
-use ncollide2d::shape;
-use nphysics2d::object::{ColliderAnchor, DefaultColliderHandle, DefaultColliderSet};
+use na::Point3;
+use rapier::geometry::{ColliderHandle, ColliderSet};
+use rapier::math::{Isometry, Point};
pub struct Polyline {
color: Point3<f32>,
base_color: Point3<f32>,
- vertices: Vec<Point2<f32>>,
- indices: Vec<Point2<usize>>,
- collider: DefaultColliderHandle,
- pos: Isometry2<f32>,
+ vertices: Vec<Point<f32>>,
+ indices: Vec<[u32; 2]>,
+ collider: ColliderHandle,
+ pos: Isometry<f32>,
}
impl Polyline {
pub fn new(
- collider: DefaultColliderHandle,
- colliders: &DefaultColliderSet<f32>,
- _: Isometry2<f32>,
- vertices: Vec<Point2<f32>>,
- indices: Vec<Point2<usize>>,
+ collider: ColliderHandle,
+ vertices: Vec<Point<f32>>,
+ indices: Vec<[u32; 2]>,
color: Point3<f32>,
- _: &mut Window,
) -> Polyline {
- let mut res = Polyline {
+ Polyline {
color,
- pos: Isometry2::identity(),
+ pos: Isometry::identity(),
base_color: color,
vertices,
indices,
collider,
- };
-
- res.update(colliders);
- res
+ }
}
pub fn select(&mut self) {
@@ -48,32 +42,26 @@ impl Polyline {
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 update(&mut self, colliders: &ColliderSet) {
+ self.pos = colliders
+ .get(self.collider)
+ .map(|c| *c.position())
+ .unwrap_or(Isometry::identity());
}
- pub fn object(&self) -> DefaultColliderHandle {
+ pub fn object(&self) -> ColliderHandle {
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)
+ let p1 = self.pos * self.vertices[idx[0] as usize];
+ let p2 = self.pos * self.vertices[idx[1] as usize];
+
+ #[cfg(feature = "dim2")]
+ window.draw_planar_line(&p1, &p2, &self.color);
+ #[cfg(feature = "dim3")]
+ window.draw_line(&p1, &p2, &self.color);
}
}
}