aboutsummaryrefslogtreecommitdiff
path: root/src_testbed/objects
diff options
context:
space:
mode:
Diffstat (limited to 'src_testbed/objects')
-rw-r--r--src_testbed/objects/ball.rs76
-rw-r--r--src_testbed/objects/box_node.rs76
-rw-r--r--src_testbed/objects/capsule.rs77
-rw-r--r--src_testbed/objects/cone.rs77
-rw-r--r--src_testbed/objects/convex.rs96
-rw-r--r--src_testbed/objects/cylinder.rs77
-rw-r--r--src_testbed/objects/heightfield.rs128
-rw-r--r--src_testbed/objects/mesh.rs111
-rw-r--r--src_testbed/objects/mod.rs12
-rw-r--r--src_testbed/objects/node.rs547
-rw-r--r--src_testbed/objects/plane.rs132
-rw-r--r--src_testbed/objects/polyline.rs67
12 files changed, 401 insertions, 1075 deletions
diff --git a/src_testbed/objects/ball.rs b/src_testbed/objects/ball.rs
deleted file mode 100644
index df43341..0000000
--- a/src_testbed/objects/ball.rs
+++ /dev/null
@@ -1,76 +0,0 @@
-use crate::objects::node::{self, GraphicsNode};
-use kiss3d::window::Window;
-use na::Point3;
-use rapier::geometry::{ColliderHandle, ColliderSet};
-use rapier::math::Isometry;
-
-pub struct Ball {
- color: Point3<f32>,
- 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,
- ) -> Ball {
- #[cfg(feature = "dim2")]
- let node = window.add_circle(radius);
- #[cfg(feature = "dim3")]
- let node = window.add_sphere(radius);
-
- let mut res = Ball {
- color,
- base_color: color,
- gfx: node,
- collider,
- delta,
- };
-
- // res.gfx.set_texture_from_file(&Path::new("media/kitten.png"), "kitten");
- res.gfx.set_color(color.x, color.y, color.z);
- 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.gfx.set_color(color.x, color.y, color.z);
- self.color = color;
- self.base_color = color;
- }
-
- pub fn update(&mut self, colliders: &ColliderSet) {
- node::update_scene_node(
- &mut self.gfx,
- colliders,
- self.collider,
- &self.color,
- &self.delta,
- );
- }
-
- pub fn scene_node(&self) -> &GraphicsNode {
- &self.gfx
- }
-
- pub fn scene_node_mut(&mut self) -> &mut GraphicsNode {
- &mut self.gfx
- }
-
- pub fn object(&self) -> ColliderHandle {
- self.collider
- }
-}
diff --git a/src_testbed/objects/box_node.rs b/src_testbed/objects/box_node.rs
deleted file mode 100644
index 0586d77..0000000
--- a/src_testbed/objects/box_node.rs
+++ /dev/null
@@ -1,76 +0,0 @@
-use crate::objects::node::{self, GraphicsNode};
-use kiss3d::window;
-use na::Point3;
-use rapier::geometry::{ColliderHandle, ColliderSet};
-use rapier::math::{Isometry, Vector};
-
-pub struct Box {
- color: Point3<f32>,
- 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,
- ) -> Box {
- let extents = half_extents * 2.0;
- #[cfg(feature = "dim2")]
- let node = window.add_rectangle(extents.x, extents.y);
- #[cfg(feature = "dim3")]
- let node = window.add_cube(extents.x, extents.y, extents.z);
-
- let mut res = Box {
- color,
- base_color: color,
- gfx: node,
- collider,
- delta,
- };
-
- res.gfx.set_color(color.x, color.y, color.z);
- 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.gfx.set_color(color.x, color.y, color.z);
- self.color = color;
- self.base_color = color;
- }
-
- pub fn update(&mut self, colliders: &ColliderSet) {
- node::update_scene_node(
- &mut self.gfx,
- colliders,
- self.collider,
- &self.color,
- &self.delta,
- );
- }
-
- pub fn scene_node(&self) -> &GraphicsNode {
- &self.gfx
- }
-
- pub fn scene_node_mut(&mut self) -> &mut GraphicsNode {
- &mut self.gfx
- }
-
- pub fn object(&self) -> ColliderHandle {
- self.collider
- }
-}
diff --git a/src_testbed/objects/capsule.rs b/src_testbed/objects/capsule.rs
deleted file mode 100644
index 3d3e88f..0000000
--- a/src_testbed/objects/capsule.rs
+++ /dev/null
@@ -1,77 +0,0 @@
-use crate::objects::node::{self, GraphicsNode};
-use kiss3d::window;
-use na::Point3;
-use rapier::geometry::{self, ColliderHandle, ColliderSet};
-use rapier::math::Isometry;
-
-pub struct Capsule {
- color: Point3<f32>,
- 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,
- ) -> Capsule {
- let r = capsule.radius;
- let h = capsule.half_height() * 2.0;
- #[cfg(feature = "dim2")]
- let node = window.add_planar_capsule(r, h);
- #[cfg(feature = "dim3")]
- let node = window.add_capsule(r, h);
-
- let mut res = Capsule {
- color,
- base_color: color,
- gfx: node,
- collider,
- delta: delta * capsule.transform_wrt_y(),
- };
-
- res.gfx.set_color(color.x, color.y, color.z);
- 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 update(&mut self, colliders: &ColliderSet) {
- node::update_scene_node(
- &mut self.gfx,
- colliders,
- self.collider,
- &self.color,
- &self.delta,
- );
- }
-
- pub fn set_color(&mut self, color: Point3<f32>) {
- self.gfx.set_color(color.x, color.y, color.z);
- self.color = color;
- self.base_color = color;
- }
-
- pub fn scene_node(&self) -> &GraphicsNode {
- &self.gfx
- }
-
- pub fn scene_node_mut(&mut self) -> &mut GraphicsNode {
- &mut self.gfx
- }
-
- pub fn object(&self) -> ColliderHandle {
- self.collider
- }
-}
diff --git a/src_testbed/objects/cone.rs b/src_testbed/objects/cone.rs
deleted file mode 100644
index 7aa2039..0000000
--- a/src_testbed/objects/cone.rs
+++ /dev/null
@@ -1,77 +0,0 @@
-use crate::objects::node::{self, GraphicsNode};
-use kiss3d::window::Window;
-use na::Point3;
-use rapier::geometry::{ColliderHandle, ColliderSet};
-use rapier::math::Isometry;
-
-pub struct Cone {
- color: Point3<f32>,
- 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>,
- window: &mut Window,
- ) -> Cone {
- #[cfg(feature = "dim2")]
- let node = window.add_rectangle(radius, half_height);
- #[cfg(feature = "dim3")]
- let node = window.add_cone(radius, half_height * 2.0);
-
- let mut res = Cone {
- color,
- base_color: color,
- gfx: node,
- collider,
- delta,
- };
-
- // res.gfx.set_texture_from_file(&Path::new("media/kitten.png"), "kitten");
- res.gfx.set_color(color.x, color.y, color.z);
- 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.gfx.set_color(color.x, color.y, color.z);
- self.color = color;
- self.base_color = color;
- }
-
- pub fn update(&mut self, colliders: &ColliderSet) {
- node::update_scene_node(
- &mut self.gfx,
- colliders,
- self.collider,
- &self.color,
- &self.delta,
- );
- }
-
- pub fn scene_node(&self) -> &GraphicsNode {
- &self.gfx
- }
-
- pub fn scene_node_mut(&mut self) -> &mut GraphicsNode {
- &mut self.gfx
- }
-
- pub fn object(&self) -> ColliderHandle {
- self.collider
- }
-}
diff --git a/src_testbed/objects/convex.rs b/src_testbed/objects/convex.rs
deleted file mode 100644
index 95ef74a..0000000
--- a/src_testbed/objects/convex.rs
+++ /dev/null
@@ -1,96 +0,0 @@
-#![allow(warnings)] // TODO: remove this.
-
-#[cfg(feature = "dim2")]
-use crate::math::Vector;
-use crate::math::{Isometry, Point};
-use crate::objects::node::{self, GraphicsNode};
-use kiss3d::window::Window;
-use na::Point3;
-use rapier::geometry::{ColliderHandle, ColliderSet};
-
-pub struct Convex {
- color: Point3<f32>,
- 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 = {
- 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");
- res.gfx.set_color(color.x, color.y, color.z);
- 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.gfx.set_color(color.x, color.y, color.z);
- self.color = color;
- self.base_color = color;
- }
-
- pub fn update(&mut self, colliders: &ColliderSet) {
- node::update_scene_node(
- &mut self.gfx,
- colliders,
- self.body,
- &self.color,
- &self.delta,
- );
- }
-
- pub fn scene_node(&self) -> &GraphicsNode {
- &self.gfx
- }
-
- pub fn scene_node_mut(&mut self) -> &mut GraphicsNode {
- &mut self.gfx
- }
-
- pub fn object(&self) -> ColliderHandle {
- self.body
- }
-}
diff --git a/src_testbed/objects/cylinder.rs b/src_testbed/objects/cylinder.rs
deleted file mode 100644
index ff4dc72..0000000
--- a/src_testbed/objects/cylinder.rs
+++ /dev/null
@@ -1,77 +0,0 @@
-use crate::objects::node::{self, GraphicsNode};
-use kiss3d::window::Window;
-use na::Point3;
-use rapier::geometry::{ColliderHandle, ColliderSet};
-use rapier::math::Isometry;
-
-pub struct Cylinder {
- color: Point3<f32>,
- 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>,
- window: &mut Window,
- ) -> Cylinder {
- #[cfg(feature = "dim2")]
- let node = window.add_rectangle(radius, half_height);
- #[cfg(feature = "dim3")]
- let node = window.add_cylinder(radius, half_height * 2.0);
-
- let mut res = Cylinder {
- color,
- base_color: color,
- gfx: node,
- collider,
- delta,
- };
-
- // res.gfx.set_texture_from_file(&Path::new("media/kitten.png"), "kitten");
- res.gfx.set_color(color.x, color.y, color.z);
- 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.gfx.set_color(color.x, color.y, color.z);
- self.color = color;
- self.base_color = color;
- }
-
- pub fn update(&mut self, colliders: &ColliderSet) {
- node::update_scene_node(
- &mut self.gfx,
- colliders,
- self.collider,
- &self.color,
- &self.delta,
- );
- }
-
- pub fn scene_node(&self) -> &GraphicsNode {
- &self.gfx
- }
-
- pub fn scene_node_mut(&mut self) -> &mut GraphicsNode {
- &mut self.gfx
- }
-
- pub fn object(&self) -> ColliderHandle {
- self.collider
- }
-}
diff --git a/src_testbed/objects/heightfield.rs b/src_testbed/objects/heightfield.rs
deleted file mode 100644
index 913a732..0000000
--- a/src_testbed/objects/heightfield.rs
+++ /dev/null
@@ -1,128 +0,0 @@
-use kiss3d::window::Window;
-use na::{self, Point3};
-use parry::shape;
-use rapier::geometry::{ColliderHandle, ColliderSet};
-#[cfg(feature = "dim2")]
-use rapier::math::Point;
-#[cfg(feature = "dim3")]
-use {
- crate::objects::node::{self, GraphicsNode},
- kiss3d::resource::Mesh,
- rapier::math::Vector,
- std::cell::RefCell,
-};
-
-pub struct HeightField {
- color: Point3<f32>,
- base_color: Point3<f32>,
- #[cfg(feature = "dim2")]
- vertices: Vec<Point<f32>>,
- #[cfg(feature = "dim3")]
- gfx: GraphicsNode,
- collider: ColliderHandle,
-}
-
-impl HeightField {
- #[cfg(feature = "dim2")]
- pub fn new(
- collider: ColliderHandle,
- heightfield: &shape::HeightField,
- color: Point3<f32>,
- _: &mut Window,
- ) -> HeightField {
- let mut vertices = Vec::new();
-
- for seg in heightfield.segments() {
- vertices.push(seg.a);
- vertices.push(seg.b);
- }
-
- HeightField {
- color,
- base_color: color,
- vertices,
- collider,
- }
- }
-
- #[cfg(feature = "dim3")]
- pub fn new(
- collider: ColliderHandle,
- heightfield: &shape::HeightField,
- color: Point3<f32>,
- window: &mut Window,
- ) -> HeightField {
- 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_mesh(Rc::new(RefCell::new(mesh)), Vector::repeat(1.0)),
- collider: collider,
- };
-
- res.gfx.enable_backface_culling(false);
- res.gfx.set_color(color.x, color.y, color.z);
-
- 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>) {
- #[cfg(feature = "dim3")]
- {
- self.gfx.set_color(color.x, color.y, color.z);
- }
- self.color = color;
- self.base_color = color;
- }
-
- #[cfg(feature = "dim3")]
- pub fn update(&mut self, colliders: &ColliderSet) {
- node::update_scene_node(
- &mut self.gfx,
- colliders,
- self.collider,
- &self.color,
- &na::Isometry::identity(),
- );
- }
-
- #[cfg(feature = "dim2")]
- pub fn update(&mut self, _colliders: &ColliderSet) {}
-
- #[cfg(feature = "dim3")]
- pub fn scene_node(&self) -> &GraphicsNode {
- &self.gfx
- }
-
- #[cfg(feature = "dim3")]
- pub fn scene_node_mut(&mut self) -> &mut GraphicsNode {
- &mut self.gfx
- }
-
- pub fn object(&self) -> ColliderHandle {
- self.collider
- }
-
- #[cfg(feature = "dim2")]
- pub fn draw(&mut self, window: &mut Window) {
- for vtx in self.vertices.chunks(2) {
- window.draw_planar_line(&vtx[0], &vtx[1], &self.color)
- }
- }
-}
diff --git a/src_testbed/objects/mesh.rs b/src_testbed/objects/mesh.rs
deleted file mode 100644
index 5505de3..0000000
--- a/src_testbed/objects/mesh.rs
+++ /dev/null
@@ -1,111 +0,0 @@
-use crate::objects::node::{self, GraphicsNode};
-use kiss3d::window;
-use na::Point3;
-use rapier::geometry::{ColliderHandle, ColliderSet};
-use rapier::math::{Isometry, Point};
-use std::cell::RefCell;
-use std::rc::Rc;
-
-pub struct Mesh {
- color: Point3<f32>,
- base_color: Point3<f32>,
- gfx: GraphicsNode,
- collider: ColliderHandle,
-}
-
-impl Mesh {
- pub fn new(
- collider: ColliderHandle,
- vertices: Vec<Point<f32>>,
- indices: Vec<[u32; 3]>,
- color: Point3<f32>,
- window: &mut window::Window,
- ) -> Mesh {
- let vs = vertices;
- 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;
-
- #[cfg(feature = "dim2")]
- {
- mesh = kiss3d::resource::PlanarMesh::new(vs, is, None, false);
- gfx = window.add_planar_mesh(
- Rc::new(RefCell::new(mesh)),
- crate::math::Vector::from_element(1.0),
- );
- }
-
- #[cfg(feature = "dim3")]
- {
- mesh = kiss3d::resource::Mesh::new(vs, is, None, None, false);
- gfx = window.add_mesh(Rc::new(RefCell::new(mesh)), na::Vector3::from_element(1.0));
- }
-
- let mut res = Mesh {
- color,
- base_color: color,
- gfx,
- collider,
- };
-
- res.gfx.enable_backface_culling(false);
- res.gfx.set_color(color.x, color.y, color.z);
- 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.gfx.set_color(color.x, color.y, color.z);
- self.color = color;
- self.base_color = color;
- }
-
- pub fn update(&mut self, colliders: &ColliderSet) {
- node::update_scene_node(
- &mut self.gfx,
- colliders,
- self.collider,
- &self.color,
- &Isometry::identity(),
- );
-
- // // Update if some deformation occurred.
- // // FIXME: don't update if it did not move.
- // if let Some(c) = colliders.get(self.collider) {
- // if let ColliderAnchor::OnDeformableBody { .. } = c.anchor() {
- // let shape = c.shape().as_shape::<TriMesh<f32>>().unwrap();
- // let vtx = shape.points();
- //
- // self.gfx.modify_vertices(&mut |vertices| {
- // for (v, new_v) in vertices.iter_mut().zip(vtx.iter()) {
- // *v = *new_v
- // }
- // });
- // self.gfx.recompute_normals();
- // }
- // }
- }
-
- pub fn scene_node(&self) -> &GraphicsNode {
- &self.gfx
- }
-
- pub fn scene_node_mut(&mut self) -> &mut GraphicsNode {
- &mut self.gfx
- }
-
- pub fn object(&self) -> ColliderHandle {
- self.collider
- }
-}
diff --git a/src_testbed/objects/mod.rs b/src_testbed/objects/mod.rs
index 8e12dbe..492bc84 100644
--- a/src_testbed/objects/mod.rs
+++ b/src_testbed/objects/mod.rs
@@ -1,13 +1 @@
-pub mod ball;
-pub mod box_node;
-pub mod capsule;
-pub mod cone;
-pub mod convex;
-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 1bc491f..be2fa71 100644
--- a/src_testbed/objects/node.rs
+++ b/src_testbed/objects/node.rs
@@ -1,177 +1,432 @@
-use crate::objects::ball::Ball;
-use crate::objects::box_node::Box;
-use crate::objects::capsule::Capsule;
-use crate::objects::convex::Convex;
-use crate::objects::heightfield::HeightField;
-use crate::objects::mesh::Mesh;
+use bevy::prelude::*;
+use bevy::render::mesh::{Indices, VertexAttributeValues};
+
//use crate::objects::plane::Plane;
-use crate::objects::polyline::Polyline;
-use kiss3d::window::Window;
-use na::Point3;
+use na::{Point3, Vector3};
+use std::collections::HashMap;
-use crate::objects::cone::Cone;
-use crate::objects::cylinder::Cylinder;
-use rapier::geometry::{ColliderHandle, ColliderSet};
+use bevy::render::pipeline::PrimitiveTopology;
+use bevy::render::wireframe::Wireframe;
+use rapier::geometry::{ColliderHandle, ColliderSet, Shape, ShapeType};
+#[cfg(feature = "dim3")]
+use rapier::geometry::{Cone, Cylinder};
use rapier::math::Isometry;
-
#[cfg(feature = "dim2")]
-pub type GraphicsNode = kiss3d::scene::PlanarSceneNode;
-#[cfg(feature = "dim3")]
-pub type GraphicsNode = kiss3d::scene::SceneNode;
-
-pub enum Node {
- // Plane(Plane),
- Ball(Ball),
- Box(Box),
- HeightField(HeightField),
- Capsule(Capsule),
- Polyline(Polyline),
- Mesh(Mesh),
- Convex(Convex),
- Cylinder(Cylinder),
- Cone(Cone),
+use {
+ na::{Point2, Vector2},
+ rapier::geometry::{Ball, Cuboid},
+};
+
+pub struct EntityWithGraphics {
+ pub entity: Entity,
+ pub color: Point3<f32>,
+ pub base_color: Point3<f32>,
+ pub collider: ColliderHandle,
+ pub delta: Isometry<f32>,
+ material: Handle<StandardMaterial>,
}
-impl Node {
- pub fn select(&mut self) {
- match *self {
- // Node::Plane(ref mut n) => n.select(),
- Node::Ball(ref mut n) => n.select(),
- Node::Box(ref mut n) => n.select(),
- Node::Capsule(ref mut n) => n.select(),
- Node::HeightField(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(),
- Node::Cone(ref mut n) => n.select(),
+impl EntityWithGraphics {
+ pub fn spawn(
+ commands: &mut Commands,
+ meshes: &mut Assets<Mesh>,
+ materials: &mut Assets<StandardMaterial>,
+ prefab_meshs: &HashMap<ShapeType, Handle<Mesh>>,
+ shape: &dyn Shape,
+ collider: ColliderHandle,
+ collider_pos: Isometry<f32>,
+ delta: Isometry<f32>,
+ color: Point3<f32>,
+ sensor: bool,
+ ) -> Self {
+ let entity = commands.spawn().id();
+
+ let scale = collider_mesh_scale(shape);
+ let mesh = prefab_meshs
+ .get(&shape.shape_type())
+ .cloned()
+ .or_else(|| generate_collider_mesh(shape).map(|m| meshes.add(m)))
+ .expect("Could not build the collider's render mesh");
+
+ let bevy_color = Color::rgb(color.x, color.y, color.z);
+ let shape_pos = collider_pos * delta;
+ let mut transform = Transform::from_scale(scale);
+ transform.translation.x = shape_pos.translation.vector.x;
+ transform.translation.y = shape_pos.translation.vector.y;
+ #[cfg(feature = "dim3")]
+ {
+ transform.translation.z = shape_pos.translation.vector.z;
+ transform.rotation = Quat::from_xyzw(
+ shape_pos.rotation.i,
+ shape_pos.rotation.j,
+ shape_pos.rotation.k,
+ shape_pos.rotation.w,
+ );
+ }
+ #[cfg(feature = "dim2")]
+ {
+ if sensor {
+ transform.translation.z = -10.0;
+ }
+ transform.rotation = Quat::from_rotation_z(shape_pos.rotation.angle());
+ }
+
+ let material = StandardMaterial {
+ metallic: 0.5,
+ roughness: 0.5,
+ double_sided: true, // TODO: this doesn't do anything?
+ ..StandardMaterial::from(bevy_color)
+ };
+ let material_handle = materials.add(material);
+ let material_weak_handle = material_handle.clone_weak();
+ let pbr = PbrBundle {
+ mesh,
+ material: material_handle,
+ transform,
+ ..Default::default()
+ };
+
+ let mut entity_commands = commands.entity(entity);
+ entity_commands.insert_bundle(pbr);
+
+ if sensor {
+ entity_commands.insert(Wireframe);
+ }
+
+ EntityWithGraphics {
+ entity,
+ color,
+ base_color: color,
+ collider,
+ delta,
+ material: material_weak_handle,
}
}
- pub fn unselect(&mut self) {
- match *self {
- // Node::Plane(ref mut n) => n.unselect(),
- Node::Ball(ref mut n) => n.unselect(),
- Node::Box(ref mut n) => n.unselect(),
- Node::Capsule(ref mut n) => n.unselect(),
- Node::HeightField(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(),
- Node::Cone(ref mut n) => n.unselect(),
+ pub fn select(&mut self, materials: &mut Assets<StandardMaterial>) {
+ // NOTE: we don't just call `self.set_color` because that would
+ // overwrite self.base_color too.
+ self.color = Point3::new(1.0, 0.0, 0.0);
+ if let Some(material) = materials.get_mut(&self.material) {
+ material.base_color = Color::rgb(self.color.x, self.color.y, self.color.z);
}
}
- pub fn update(&mut self, colliders: &ColliderSet) {
- match *self {
- // Node::Plane(ref mut n) => n.update(colliders),
- Node::Ball(ref mut n) => n.update(colliders),
- Node::Box(ref mut n) => n.update(colliders),
- Node::Capsule(ref mut n) => n.update(colliders),
- Node::HeightField(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),
- Node::Cone(ref mut n) => n.update(colliders),
+ pub fn unselect(&mut self, materials: &mut Assets<StandardMaterial>) {
+ self.set_color(materials, self.base_color);
+ }
+
+ pub fn set_color(&mut self, materials: &mut Assets<StandardMaterial>, color: Point3<f32>) {
+ if let Some(material) = materials.get_mut(&self.material) {
+ material.base_color = Color::rgb(color.x, color.y, color.z);
}
+ self.color = color;
+ self.base_color = color;
}
- #[cfg(feature = "dim2")]
- pub fn draw(&mut self, window: &mut Window) {
- match *self {
- Node::Polyline(ref mut n) => n.draw(window),
- Node::HeightField(ref mut n) => n.draw(window),
- // Node::Plane(ref mut n) => n.draw(_window),
- _ => {}
+ pub fn update(&mut self, colliders: &ColliderSet, components: &mut Query<(&mut Transform,)>) {
+ if let Some(co) = colliders.get(self.collider) {
+ if let Ok(mut pos) = components.get_component_mut::<Transform>(self.entity) {
+ let co_pos = co.position() * self.delta;
+ pos.translation.x = co_pos.translation.vector.x;
+ pos.translation.y = co_pos.translation.vector.y;
+ #[cfg(feature = "dim3")]
+ {
+ pos.translation.z = co_pos.translation.vector.z;
+ pos.rotation = Quat::from_xyzw(
+ co_pos.rotation.i,
+ co_pos.rotation.j,
+ co_pos.rotation.k,
+ co_pos.rotation.w,
+ );
+ }
+ #[cfg(feature = "dim2")]
+ {
+ pos.rotation = Quat::from_rotation_z(co_pos.rotation.angle());
+ }
+ }
}
}
+ pub fn object(&self) -> ColliderHandle {
+ self.collider
+ }
+
+ #[cfg(feature = "dim2")]
+ pub fn gen_prefab_meshes(
+ out: &mut HashMap<ShapeType, Handle<Mesh>>,
+ meshes: &mut Assets<Mesh>,
+ ) {
+ //
+ // Cuboid mesh
+ //
+ let cuboid = bevy_mesh_from_polyline(Cuboid::new(Vector2::new(1.0, 1.0)).to_polyline());
+ out.insert(ShapeType::Cuboid, meshes.add(cuboid));
+
+ //
+ // Ball mesh
+ //
+ let ball = bevy_mesh_from_polyline(Ball::new(1.0).to_polyline(30));
+ out.insert(ShapeType::Ball, meshes.add(ball));
+ }
+
#[cfg(feature = "dim3")]
- pub fn draw(&mut self, _: &mut Window) {}
-
- pub fn scene_node(&self) -> Option<&GraphicsNode> {
- match *self {
- // #[cfg(feature = "dim3")]
- // Node::Plane(ref n) => Some(n.scene_node()),
- Node::Ball(ref n) => Some(n.scene_node()),