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 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