Working version of original project

This commit is contained in:
John Hunter
2025-01-01 23:55:53 +00:00
parent b6b252c69d
commit 041d876fe5
8 changed files with 368 additions and 502 deletions
+2 -1
View File
@@ -1 +1,2 @@
/target
/target
pipeline_cache.bin
Generated
+17 -10
View File
@@ -1,6 +1,6 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
version = 4
[[package]]
name = "ab_glyph"
@@ -546,6 +546,17 @@ dependencies = [
"winit",
]
[[package]]
name = "egui_plot"
version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c226cae80a6ee10c4d3aaf9e33bd9e9b2f1c0116b6036bdc2a1cfc9d2d0dcc10"
dependencies = [
"ahash",
"egui",
"emath",
]
[[package]]
name = "egui_winit_vulkano"
version = "0.27.0"
@@ -621,6 +632,7 @@ version = "0.1.0"
dependencies = [
"bytemuck",
"egui",
"egui_plot",
"egui_winit_vulkano",
"foldhash",
"glam",
@@ -2083,9 +2095,9 @@ checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"
[[package]]
name = "syn"
version = "2.0.93"
version = "2.0.94"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058"
checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3"
dependencies = [
"proc-macro2",
"quote",
@@ -2897,9 +2909,9 @@ dependencies = [
[[package]]
name = "winnow"
version = "0.6.20"
version = "0.6.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b"
checksum = "e6f5bb5257f2407a5425c6e749bfd9692192a73e70a6060516ac04f889087d68"
dependencies = [
"memchr",
]
@@ -3101,8 +3113,3 @@ dependencies = [
name = "vulkano-taskgraph"
version = "0.34.0"
source = "git+https://github.com/vulkano-rs/vulkano#ea30f65280360b1e1bc907cd42d4eb355fed3c9d"
[[patch.unused]]
name = "vulkano-win"
version = "0.34.0"
source = "git+https://github.com/vulkano-rs/vulkano#ea30f65280360b1e1bc907cd42d4eb355fed3c9d"
+1 -1
View File
@@ -22,6 +22,7 @@ glam = "0.29"
egui = "0.30"
egui_winit_vulkano = "0.27"
egui_plot = "0.30.0"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
@@ -40,5 +41,4 @@ vulkano-macros = { git = "https://github.com/vulkano-rs/vulkano" }
vulkano-shaders = { git = "https://github.com/vulkano-rs/vulkano" }
vulkano-taskgraph = { git = "https://github.com/vulkano-rs/vulkano" }
vulkano-util = { git = "https://github.com/vulkano-rs/vulkano" }
vulkano-win = { git = "https://github.com/vulkano-rs/vulkano" }
egui_winit_vulkano = { git = "https://github.com/Molive-0/egui_winit_vulkano" }
+9 -14
View File
@@ -1,10 +1,8 @@
use egui::{
plot::{Line, Plot, PlotPoints},
Color32, Frame, Id,
};
use egui::{Color32, Frame, Id};
use egui_plot::{Line, Plot, PlotPoints};
use egui_winit_vulkano::Gui;
use crate::objects::{Light, Mesh, CSG};
use crate::objects::{CSG, Light, Mesh};
fn sized_text(ui: &mut egui::Ui, text: impl Into<String>, size: f32) {
ui.label(egui::RichText::new(text).size(size));
@@ -94,16 +92,13 @@ pub(crate) fn gui_up(gui: &mut Gui, state: &mut GState) {
.text("Position.z"),
);
ui.add(
egui::Slider::new(&mut mesh.rot.x.0, 0.0..=360.0)
.text("Rotation.x"),
egui::Slider::new(&mut mesh.rot.x, 0.0..=360.0).text("Rotation.x"),
);
ui.add(
egui::Slider::new(&mut mesh.rot.y.0, 0.0..=360.0)
.text("Rotation.y"),
egui::Slider::new(&mut mesh.rot.y, 0.0..=360.0).text("Rotation.y"),
);
ui.add(
egui::Slider::new(&mut mesh.rot.z.0, 0.0..=360.0)
.text("Rotation.z"),
egui::Slider::new(&mut mesh.rot.z, 0.0..=360.0).text("Rotation.z"),
);
ui.add(egui::Slider::new(&mut mesh.scale.x, 0.0..=2.0).text("Scale.x"));
ui.add(egui::Slider::new(&mut mesh.scale.y, 0.0..=2.0).text("Scale.y"));
@@ -134,13 +129,13 @@ pub(crate) fn gui_up(gui: &mut Gui, state: &mut GState) {
.text("Position.z"),
);
ui.add(
egui::Slider::new(&mut csg.rot.x.0, 0.0..=360.0).text("Rotation.x"),
egui::Slider::new(&mut csg.rot.x, 0.0..=360.0).text("Rotation.x"),
);
ui.add(
egui::Slider::new(&mut csg.rot.y.0, 0.0..=360.0).text("Rotation.y"),
egui::Slider::new(&mut csg.rot.y, 0.0..=360.0).text("Rotation.y"),
);
ui.add(
egui::Slider::new(&mut csg.rot.z.0, 0.0..=360.0).text("Rotation.z"),
egui::Slider::new(&mut csg.rot.z, 0.0..=360.0).text("Rotation.z"),
);
ui.add(egui::Slider::new(&mut csg.scale.x, 0.0..=2.0).text("Scale.x"));
ui.add(egui::Slider::new(&mut csg.scale.y, 0.0..=2.0).text("Scale.y"));
+36 -120
View File
@@ -1,9 +1,6 @@
use cgmath::{Array, ElementWise, InnerSpace, MetricSpace, VectorSpace};
use glam::{self, FloatExt, Mat2, Mat3, Mat4, Vec2, Vec3, Vec4};
use crate::{
instruction_set::InstructionSet::*, objects::Inputs, Float, Mat2, Mat3, Mat4, Vec2, Vec3, Vec4,
CSG,
};
use crate::{CSG, Float, instruction_set::InstructionSet::*, objects::Inputs};
#[derive(Clone, Debug)]
pub(crate) struct Interpreter<'csg> {
@@ -169,85 +166,61 @@ impl<'csg> Interpreter<'csg> {
}
macro_rules! mul {
($self:ident, $instruction:ident, $type1:ty,Float) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: Float = $self.pull($instruction.constants[1]);
$self.push(in1 * in2);
};
($self:ident, $instruction:ident, $type1:ty, $type2:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: $type2 = $self.pull($instruction.constants[1]);
$self.push(in1.mul_element_wise(in2));
$self.push(in1 * in2);
};
}
macro_rules! div {
($self:ident, $instruction:ident, $type1:ty,Float) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: Float = $self.pull($instruction.constants[1]);
$self.push(in1 / in2);
};
($self:ident, $instruction:ident, $type1:ty, $type2:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: $type2 = $self.pull($instruction.constants[1]);
$self.push(in1.div_element_wise(in2));
$self.push(in1 / in2);
};
}
macro_rules! add {
($self:ident, $instruction:ident,Float,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
let in2: Float = $self.pull($instruction.constants[1]);
$self.push(in1 + in2);
};
($self:ident, $instruction:ident, $type1:ty, $type2:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: $type2 = $self.pull($instruction.constants[1]);
$self.push(in1.add_element_wise(in2));
$self.push(in1 + in2);
};
}
macro_rules! sub {
($self:ident, $instruction:ident,Float,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
let in2: Float = $self.pull($instruction.constants[1]);
$self.push(in1 - in2);
};
($self:ident, $instruction:ident, $type1:ty, $type2:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: $type2 = $self.pull($instruction.constants[1]);
$self.push(in1.sub_element_wise(in2));
$self.push(in1 - in2);
};
}
macro_rules! modulo {
($self:ident, $instruction:ident,Float,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
let in2: Float = $self.pull($instruction.constants[1]);
$self.push(in1 % in2);
};
($self:ident, $instruction:ident, $type1:ty, $type2:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: $type2 = $self.pull($instruction.constants[1]);
$self.push(in1.rem_element_wise(in2));
$self.push(in1 % in2);
};
}
macro_rules! pow {
($self:ident, $instruction:ident,Float,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
let in2: Float = $self.pull($instruction.constants[1]);
$self.push(in1.powf(in2));
};
($self:ident, $instruction:ident, $type1:ty,Float) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: Float = $self.pull($instruction.constants[1]);
$self.push(in1.map(|x| x.powf(in2)));
$self.push(in1.powf(in2));
};
($self:ident, $instruction:ident, $type1:ty, $type2:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: $type2 = $self.pull($instruction.constants[1]);
$self.push(in1.zip(in2, Float::powf));
$self.push(<$type1>::from_slice(
&in1.to_array()
.iter()
.zip(in2.to_array().iter())
.map(|(x, y)| x.powf(*y))
.collect::<Vec<_>>(),
));
};
}
@@ -284,17 +257,11 @@ macro_rules! clamp {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: $type2 = $self.pull($instruction.constants[1]);
let in3: $type3 = $self.pull($instruction.constants[2]);
$self.push(in1.zip(in2, Float::max).zip(in3, Float::min));
$self.push(in1.clamp(in2, in3));
};
}
macro_rules! mix {
($self:ident, $instruction:ident,Float,Float,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
let in2: Float = $self.pull($instruction.constants[1]);
let in3: Float = $self.pull($instruction.constants[2]);
$self.push((in1 * ((1 as Float) - in3)) + (in2 * in3));
};
($self:ident, $instruction:ident, $type1:ty, $type2:ty,Float) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: $type2 = $self.pull($instruction.constants[1]);
@@ -305,54 +272,37 @@ macro_rules! mix {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: $type2 = $self.pull($instruction.constants[1]);
let in3: $type3 = $self.pull($instruction.constants[2]);
$self.push(
(in1.mul_element_wise(<$type3>::from_value(1 as Float).sub_element_wise(in3)))
+ (in2.mul_element_wise(in3)),
);
$self.push((in1 * (<$type3>::splat(1 as Float) - in3)) + (in2 * in3));
};
}
macro_rules! fma {
($self:ident, $instruction:ident,Float,Float,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
let in2: Float = $self.pull($instruction.constants[1]);
let in3: Float = $self.pull($instruction.constants[2]);
$self.push(in1.mul_add(in2, in3));
};
($self:ident, $instruction:ident, $type1:ty, $type2:ty, $type3:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: $type1 = $self.pull($instruction.constants[1]);
let in3: $type3 = $self.pull($instruction.constants[2]);
$self.push((in1.mul_element_wise(in2)) + in3);
$self.push(in1.mul_add(in2, in3));
};
}
macro_rules! square {
($self:ident, $instruction:ident,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
$self.push(in1 * in1);
};
($self:ident, $instruction:ident, $type1:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
$self.push(in1.mul_element_wise(in1));
$self.push(in1 * in1);
};
}
macro_rules! cube {
($self:ident, $instruction:ident,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
$self.push(in1 * in1 * in1);
};
($self:ident, $instruction:ident, $type1:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
$self.push(in1.mul_element_wise(in1).mul_element_wise(in1));
$self.push(in1 * in1 * in1);
};
}
macro_rules! len {
($self:ident, $instruction:ident, $type1:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
$self.push(in1.magnitude());
$self.push(in1.length());
};
}
@@ -378,13 +328,9 @@ macro_rules! matinvert {
}
macro_rules! absolute {
($self:ident, $instruction:ident,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
$self.push(in1.abs());
};
($self:ident, $instruction:ident, $type1:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
$self.push(in1.map(Float::abs));
$self.push(in1.abs());
};
}
@@ -405,35 +351,27 @@ macro_rules! sign {
}
macro_rules! floor {
($self:ident, $instruction:ident,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
$self.push(in1.floor());
};
($self:ident, $instruction:ident, $type1:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
$self.push(in1.map(Float::floor));
$self.push(in1.floor());
};
}
macro_rules! ceiling {
($self:ident, $instruction:ident,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
$self.push(in1.ceil());
};
($self:ident, $instruction:ident, $type1:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
$self.push(in1.map(Float::ceil));
$self.push(in1.ceil());
};
}
macro_rules! fract {
($self:ident, $instruction:ident,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
$self.push(in1.fract());
$self.push(in1 - in1.floor());
};
($self:ident, $instruction:ident, $type1:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
$self.push(in1.map(Float::fract));
$self.push(in1.fract_gl());
};
}
@@ -451,22 +389,18 @@ macro_rules! squareroot {
macro_rules! inversesquareroot {
($self:ident, $instruction:ident,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
$self.push((1 as Float) / in1.sqrt());
$self.push(in1.sqrt().recip());
};
($self:ident, $instruction:ident, $type1:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
$self.push(in1.map(|x| (1 as Float) / x.sqrt()));
$self.push(in1.map(|x| x.sqrt().recip()));
};
}
macro_rules! exponent {
($self:ident, $instruction:ident,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
$self.push(in1.exp());
};
($self:ident, $instruction:ident, $type1:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
$self.push(in1.map(Float::exp));
$self.push(in1.exp());
};
}
@@ -636,50 +570,32 @@ macro_rules! hyperbolicarctangent {
}
macro_rules! min {
($self:ident, $instruction:ident, $type1:ty,Float) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: Float = $self.pull($instruction.constants[1]);
$self.push(in1.min(in2));
};
($self:ident, $instruction:ident, $type1:ty, $type2:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: $type2 = $self.pull($instruction.constants[1]);
$self.push(in1.zip(in2, Float::min));
$self.push(in1.min(in2));
};
}
macro_rules! max {
($self:ident, $instruction:ident, $type1:ty,Float) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: Float = $self.pull($instruction.constants[1]);
$self.push(in1.max(in2));
};
($self:ident, $instruction:ident, $type1:ty, $type2:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
let in2: $type2 = $self.pull($instruction.constants[1]);
$self.push(in1.zip(in2, Float::max));
$self.push(in1.max(in2));
};
}
macro_rules! round {
($self:ident, $instruction:ident,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
$self.push(in1.round());
};
($self:ident, $instruction:ident, $type1:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
$self.push(in1.map(Float::round));
$self.push(in1.round());
};
}
macro_rules! trunc {
($self:ident, $instruction:ident,Float) => {
let in1: Float = $self.pull($instruction.constants[0]);
$self.push(in1.trunc());
};
($self:ident, $instruction:ident, $type1:ty) => {
let in1: $type1 = $self.pull($instruction.constants[0]);
$self.push(in1.map(Float::trunc));
$self.push(in1.trunc());
};
}
@@ -1649,7 +1565,7 @@ impl<'csg> Interpreter<'csg> {
OPSDFSphere => {
let r: Float = self.pull(instruction.constants[0]);
let p: Vec3 = self.pull(instruction.constants[1]);
self.push(p.magnitude() - r);
self.push(p.length() - r);
},
OPSDFBox => {
@@ -1657,7 +1573,7 @@ impl<'csg> Interpreter<'csg> {
let p: Vec3 = self.pull(instruction.constants[1]);
let q = p.map(Float::abs) - r;
self.push(
(q.map(|x| x.max(0 as Float))).magnitude() + q.x.max(q.y.max(q.z)).min(0.),
(q.map(|x| x.max(0 as Float))).length() + q.x.max(q.y.max(q.z)).min(0.),
);
},
@@ -1665,7 +1581,7 @@ impl<'csg> Interpreter<'csg> {
let t: Vec2 = self.pull(instruction.constants[0]);
let p: Vec3 = self.pull(instruction.constants[1]);
let q = Vec2::new(((p.x * p.x) + (p.z * p.z)).sqrt() - t.x, p.y);
self.push(q.magnitude() - t.y);
self.push(q.length() - t.y);
},
OPNop => {},
+297 -353
View File
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -5,11 +5,12 @@ use std::{
};
use serde::{
Deserialize,
de::{
self, DeserializeSeed, EnumAccess, IntoDeserializer, MapAccess, SeqAccess, VariantAccess,
Visitor,
},
forward_to_deserialize_any, Deserialize,
forward_to_deserialize_any,
};
use utf8::BufReadDecoder;
+4 -2
View File
@@ -155,7 +155,8 @@ pub(crate) fn load_obj(
..Default::default()
},
AllocationCreateInfo {
memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
memory_type_filter: MemoryTypeFilter::PREFER_HOST
| MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
allocate_preference: MemoryAllocatePreference::AlwaysAllocate,
..Default::default()
},
@@ -170,7 +171,8 @@ pub(crate) fn load_obj(
..Default::default()
},
AllocationCreateInfo {
memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
memory_type_filter: MemoryTypeFilter::PREFER_HOST
| MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
allocate_preference: MemoryAllocatePreference::AlwaysAllocate,
..Default::default()
},