From 313a1a723ad3f815623d50227db50393b94b8e3e Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Thu, 26 Mar 2026 15:18:22 -0500 Subject: [PATCH] feat: thermal radiation + specific heat --- .../assets/config/parts/chassis.part.toml | 3 +- .../assets/config/parts/hearty.part.toml | 10 +++-- .../assets/config/parts/housing.part.toml | 4 +- crates/unified/src/config/part.rs | 2 + crates/unified/src/ecs.rs | 5 +++ crates/unified/src/server/heat/conduction.rs | 5 +++ crates/unified/src/server/heat/mod.rs | 2 + crates/unified/src/server/heat/radiation.rs | 44 +++++++++++++++++++ crates/unified/src/server/mod.rs | 2 + crates/unified/src/server/part.rs | 7 ++- 10 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 crates/unified/src/server/heat/conduction.rs create mode 100644 crates/unified/src/server/heat/radiation.rs diff --git a/crates/unified/assets/config/parts/chassis.part.toml b/crates/unified/assets/config/parts/chassis.part.toml index ee79df9895f780a769efc40d27ba9634921f31e8..5e01790f758b0268b8aabf2909cbc7392b5af408 100644 --- a/crates/unified/assets/config/parts/chassis.part.toml +++ b/crates/unified/assets/config/parts/chassis.part.toml @@ -2,6 +2,7 @@ name = "Chassis" sprite_connected = "textures/chassis.png" sprite_disconnected = "textures/chassis.png" +emissivity = 1.0 [physics] width = 50 @@ -27,4 +28,4 @@ snap = { translation = [ 0.0, -25.0, 0.0 ], rotation = 0.0 } [[joint]] id = "Left" target = { translation = [ -50.0, 0.0, 0.0 ], rotation = -270.0 } -snap = { translation = [ -25.0, 0.0, 0.0 ], rotation = 0.0 } \ No newline at end of file +snap = { translation = [ -25.0, 0.0, 0.0 ], rotation = 0.0 } diff --git a/crates/unified/assets/config/parts/hearty.part.toml b/crates/unified/assets/config/parts/hearty.part.toml index 51c34700c03110a3ce9032c1708b7f7bf119c761..8b99f5a49452d5975d5d1dbec8601a8f5b9eb83b 100644 --- a/crates/unified/assets/config/parts/hearty.part.toml +++ b/crates/unified/assets/config/parts/hearty.part.toml @@ -2,6 +2,8 @@ name = "Hearty" sprite_connected = "textures/hearty.png" sprite_disconnected = "textures/hearty.png" +emissivity = 0.1 +specific_heat = 100.0 [physics] width = 50 @@ -13,28 +15,28 @@ id = "bottom left" apply_force_at_local = [ -25.0, -25.0 ] thrust_vector = [ 0.0, 2500.0 ] exhaust_temperature = 1000.0 -heat_constant = 0.1 +heat_constant = 10.0 [[thruster]] id = "bottom right" apply_force_at_local = [ 25.0, -25.0 ] thrust_vector = [ 0.0, 2500.0 ] exhaust_temperature = 1000.0 -heat_constant = 0.1 +heat_constant = 10.0 [[thruster]] id = "top left" apply_force_at_local = [ -25.0, 25.0 ] thrust_vector = [ 0.0, -2500.0 ] exhaust_temperature = 1000.0 -heat_constant = 0.1 +heat_constant = 10.0 [[thruster]] id = "top right" apply_force_at_local = [ 25.0, 25.0 ] thrust_vector = [ 0.0, -2500.0 ] exhaust_temperature = 1000.0 -heat_constant = 0.1 +heat_constant = 10.0 [[joint]] id = "Top" diff --git a/crates/unified/assets/config/parts/housing.part.toml b/crates/unified/assets/config/parts/housing.part.toml index 20961b2b084d5d22de62577044168713a701d510..5ea25e5aad3dd808223bab504e3d69a3067176c9 100644 --- a/crates/unified/assets/config/parts/housing.part.toml +++ b/crates/unified/assets/config/parts/housing.part.toml @@ -2,6 +2,8 @@ name = "Housing" sprite_connected = "textures/thruster_on.png" sprite_disconnected = "textures/thruster_off.png" +emissivity = 0.2 +specific_heat = 100.0 [physics] width = 50 @@ -13,7 +15,7 @@ id = "main" apply_force_at_local = [ 0, 0 ] thrust_vector = [ 0.0, -20000.0 ] exhaust_temperature = 1000.0 -heat_constant = 0.1 +heat_constant = 10.0 [[joint]] id = "Top" diff --git a/crates/unified/src/config/part.rs b/crates/unified/src/config/part.rs index cdd3bdc784721f52ee540fe6e6e75a0419f0598f..c7344cb7d61ac404f72a31001b8121eda21fb142 100644 --- a/crates/unified/src/config/part.rs +++ b/crates/unified/src/config/part.rs @@ -21,6 +21,8 @@ pub struct PartPartConfig { pub name: String, pub sprite_connected: String, pub sprite_disconnected: String, + pub emissivity: f32, + pub specific_heat: f32, } #[derive(Deserialize, TypePath, Serialize, Clone, Debug, PartialEq)] pub struct PartPhysicsConfig { diff --git a/crates/unified/src/ecs.rs b/crates/unified/src/ecs.rs index fa1aa69f9a3c900a1d9e0d1378d1048788b0500e..a34849011ea98c38e600ccb9ec8b0322f98ccf1f 100644 --- a/crates/unified/src/ecs.rs +++ b/crates/unified/src/ecs.rs @@ -124,3 +124,8 @@ pub struct Cooler { pub cool_temperature: f32, pub heat_cooling_constant: f32, } +#[derive(Component, Serialize, Deserialize, Debug)] +pub struct Radiator { + pub emissivity: f32, + pub surface_area: f32, +} diff --git a/crates/unified/src/server/heat/conduction.rs b/crates/unified/src/server/heat/conduction.rs new file mode 100644 index 0000000000000000000000000000000000000000..a6c45e1e23bbf44af0deef8569ba85c52dc458fd --- /dev/null +++ b/crates/unified/src/server/heat/conduction.rs @@ -0,0 +1,5 @@ +use bevy::app::App; + +pub fn heat_conduction_plugin(app: &mut App) { + +} diff --git a/crates/unified/src/server/heat/mod.rs b/crates/unified/src/server/heat/mod.rs index c2212ad8ead3e69a34f46a4bb89c03292bd4e59a..02720900f92bfba340dbb77f3f765f921f20fb5b 100644 --- a/crates/unified/src/server/heat/mod.rs +++ b/crates/unified/src/server/heat/mod.rs @@ -1 +1,3 @@ pub mod cooling; +pub mod radiation; +pub mod conduction; diff --git a/crates/unified/src/server/heat/radiation.rs b/crates/unified/src/server/heat/radiation.rs new file mode 100644 index 0000000000000000000000000000000000000000..0fa30700def1877adcaa7d46cfbaeb236f20729d --- /dev/null +++ b/crates/unified/src/server/heat/radiation.rs @@ -0,0 +1,44 @@ +use crate::{attachment::PartInShip, ecs::{Part, Player, Radiator, Temperature}, prelude::*}; + +const STEFAN_BOLTZMANN: f32 = 5.670374419E-8; +const T_ENV: f32 = 4.0; // units: Kelvin + +pub fn heat_radiation_plugin(app: &mut App) { + app.add_systems(Update, part_radiation); +} + +fn part_radiation( + time: Res