Compare commits
No commits in common. 'dev' and 'master' have entirely different histories.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
|
|
||||||
pub mod core;
|
pub mod core;
|
||||||
|
pub mod movement;
|
||||||
@ -1,11 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "physics"
|
|
||||||
description = "The Physics Module For the Game"
|
|
||||||
version = "0.1.0"
|
|
||||||
edition = "2021"
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
bevy = { workspace = true }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,137 +0,0 @@
|
|||||||
|
|
||||||
use bevy::prelude::*;
|
|
||||||
|
|
||||||
#[derive(Component)]
|
|
||||||
pub struct Velocity
|
|
||||||
{
|
|
||||||
pub value: Vec3,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Velocity
|
|
||||||
{
|
|
||||||
fn default() -> Self
|
|
||||||
{
|
|
||||||
Self { value: Vec3::new(0.0, 0.0, 0.0)}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Velocity
|
|
||||||
{
|
|
||||||
pub fn new(x: f32, y: f32, z: f32) -> Self{
|
|
||||||
Self { value: Vec3::new(x, y, z) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Component)]
|
|
||||||
pub struct AABB
|
|
||||||
{
|
|
||||||
min_extents: Vec3,
|
|
||||||
max_extents: Vec3,
|
|
||||||
half_size: Vec3,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AABB
|
|
||||||
{
|
|
||||||
// CONSTRUCTORS
|
|
||||||
pub fn from_point_and_size(center: Vec3, dimensions: Vec3) -> Self
|
|
||||||
{
|
|
||||||
let half_size = dimensions * 0.5;
|
|
||||||
Self {
|
|
||||||
min_extents: center - half_size,
|
|
||||||
max_extents: center + half_size,
|
|
||||||
half_size
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn from_point_and_mesh(center: Vec3, mesh: Handle<Mesh>) -> Self
|
|
||||||
{
|
|
||||||
// TODO: Build an AABB around the given mesh
|
|
||||||
// Find the smallest and largets vertices on each axis
|
|
||||||
// and use those to set the extents of the AABB
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ACCESSORS
|
|
||||||
pub fn get_center_point(&self) -> Vec3
|
|
||||||
{
|
|
||||||
Vec3::new(self.min_extents.x + self.half_size.x,
|
|
||||||
self.min_extents.y + self.half_size.y,
|
|
||||||
self.min_extents.z + self.half_size.z)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_half_size(&self) -> Vec3
|
|
||||||
{
|
|
||||||
self.half_size.clone()
|
|
||||||
}
|
|
||||||
|
|
||||||
// INTERFACE METHODS
|
|
||||||
pub fn set_position(&mut self, position: Vec3)
|
|
||||||
{
|
|
||||||
self.min_extents = Vec3::new(
|
|
||||||
position.x - self.half_size.x,
|
|
||||||
position.y - self.half_size.y,
|
|
||||||
position.z - self.half_size.z);
|
|
||||||
|
|
||||||
self.max_extents = Vec3::new(
|
|
||||||
position.x + self.half_size.x,
|
|
||||||
position.y + self.half_size.y,
|
|
||||||
position.z + self.half_size.z);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn set_size(&mut self, size: Vec3)
|
|
||||||
{
|
|
||||||
let center = self.get_center_point();
|
|
||||||
self.half_size = size * 0.5;
|
|
||||||
|
|
||||||
self.min_extents = Vec3::new(
|
|
||||||
center.x - self.half_size.x,
|
|
||||||
center.y - self.half_size.y,
|
|
||||||
center.z - self.half_size.z);
|
|
||||||
|
|
||||||
self.max_extents = Vec3::new(
|
|
||||||
center.x + self.half_size.x,
|
|
||||||
center.y + self.half_size.y,
|
|
||||||
center.z + self.half_size.z);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn translate(&mut self, translation: Vec3)
|
|
||||||
{
|
|
||||||
self.min_extents.x += translation.x;
|
|
||||||
self.min_extents.y += translation.y;
|
|
||||||
self.min_extents.z += translation.z;
|
|
||||||
|
|
||||||
self.max_extents.x += translation.x;
|
|
||||||
self.max_extents.y += translation.y;
|
|
||||||
self.max_extents.z += translation.z;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn contains_point(&self, test_point: Vec3) -> bool
|
|
||||||
{
|
|
||||||
if test_point.x < self.min_extents.x { return false; }
|
|
||||||
if test_point.y < self.min_extents.y { return false; }
|
|
||||||
if test_point.z < self.min_extents.z { return false; }
|
|
||||||
|
|
||||||
if test_point.x > self.max_extents.x { return false; }
|
|
||||||
if test_point.y > self.max_extents.y { return false; }
|
|
||||||
if test_point.z > self.max_extents.z { return false; }
|
|
||||||
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn intersects_with(&self, other: &AABB) -> bool
|
|
||||||
{
|
|
||||||
if self.min_extents.x > other.max_extents.x ||
|
|
||||||
other.min_extents.x > self.max_extents.x { return false }
|
|
||||||
|
|
||||||
if self.min_extents.y > other.max_extents.y ||
|
|
||||||
other.min_extents.y > self.max_extents.y { return false }
|
|
||||||
|
|
||||||
if self.min_extents.z > other.max_extents.z ||
|
|
||||||
other.min_extents.z > self.max_extents.z { return false }
|
|
||||||
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Component)]
|
|
||||||
pub struct ColliderDebug;
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
|
|
||||||
pub mod components;
|
|
||||||
pub mod systems;
|
|
||||||
|
|
||||||
use bevy::{pbr::wireframe::WireframePlugin, prelude::*};
|
|
||||||
|
|
||||||
pub struct PhysicsPlugin
|
|
||||||
{
|
|
||||||
pub debug_draw_colliders: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Plugin for PhysicsPlugin
|
|
||||||
{
|
|
||||||
fn build(&self, app: &mut App)
|
|
||||||
{
|
|
||||||
app.add_plugins(WireframePlugin)
|
|
||||||
.add_systems(Update, systems::update_movement);
|
|
||||||
|
|
||||||
if self.debug_draw_colliders
|
|
||||||
{
|
|
||||||
app.add_systems(Update, systems::debug_draw_aabbs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for PhysicsPlugin
|
|
||||||
{
|
|
||||||
fn default() -> Self {
|
|
||||||
Self { debug_draw_colliders: false }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,77 +0,0 @@
|
|||||||
|
|
||||||
use bevy::{pbr::wireframe::{Wireframe, WireframeColor}, prelude::*};
|
|
||||||
|
|
||||||
use crate::components::{ColliderDebug, Velocity, AABB};
|
|
||||||
|
|
||||||
pub(crate) fn update_movement(mut moving_objects: Query<(&Velocity, &mut Transform)>, time: Res<Time>)
|
|
||||||
{
|
|
||||||
for (velocity, mut transform) in moving_objects.iter_mut()
|
|
||||||
{
|
|
||||||
transform.translation += velocity.value * time.delta_seconds();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn update_colliders()
|
|
||||||
{
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn debug_draw_aabbs(
|
|
||||||
mut commands: Commands,
|
|
||||||
aabbs: Query<(Entity, &AABB), Without<ColliderDebug>>,
|
|
||||||
mut meshes: ResMut<Assets<Mesh>>,
|
|
||||||
mut materials: ResMut<Assets<StandardMaterial>>
|
|
||||||
){
|
|
||||||
|
|
||||||
|
|
||||||
// TODO: Spawn one of these for each collider in the scene,
|
|
||||||
// need to set the scale, rotation and translation to match the AABB
|
|
||||||
for (entity, _aabb) in aabbs.iter()
|
|
||||||
{
|
|
||||||
let cube_mesh_handle: Handle<Mesh> = meshes.add(Cuboid::default());
|
|
||||||
commands.entity(entity).insert((PbrBundle
|
|
||||||
{
|
|
||||||
mesh: cube_mesh_handle,
|
|
||||||
material: materials.add(StandardMaterial
|
|
||||||
{
|
|
||||||
base_color: Color::Rgba { red: 0.0, green: 1.0, blue: 0.0, alpha: 0.25 },
|
|
||||||
alpha_mode: AlphaMode::Blend,
|
|
||||||
..default()
|
|
||||||
}),
|
|
||||||
|
|
||||||
transform: Transform::from_xyz(0.0, 7.25, -1.0)
|
|
||||||
//.with_rotation(Quat::from_rotation_y(45.0))
|
|
||||||
.with_rotation(Quat::from_rotation_x(45.0)),
|
|
||||||
..default()
|
|
||||||
},
|
|
||||||
|
|
||||||
Wireframe,
|
|
||||||
WireframeColor { color: Color::GREEN },
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// TEST CUBE
|
|
||||||
// Spawns a cube with a colored wireframe and partially transparent body
|
|
||||||
// Should be able to update the material on the fly to change the colors
|
|
||||||
// to red when the AABB is intersecting another AABB
|
|
||||||
// commands.spawn((PbrBundle {
|
|
||||||
// mesh: cube_mesh_handle,
|
|
||||||
// material: materials.add(StandardMaterial {
|
|
||||||
// base_color: Color::Rgba { red: 0.0, green: 1.0, blue: 0.0, alpha: 0.25 },
|
|
||||||
// alpha_mode: AlphaMode::Blend,
|
|
||||||
// ..default()
|
|
||||||
// }),
|
|
||||||
// transform: Transform::from_xyz(0.0, 7.25, -1.0)
|
|
||||||
// //.with_rotation(Quat::from_rotation_y(45.0))
|
|
||||||
// .with_rotation(Quat::from_rotation_x(45.0)),
|
|
||||||
// ..default()
|
|
||||||
// },
|
|
||||||
// Wireframe, WireframeColor { color: Color::GREEN },
|
|
||||||
// ));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn debug_update_colliders(colliders: Query<&ColliderDebug>)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue