Initial commit

This commit is contained in:
collin 2026-06-21 21:31:34 +02:00
commit b3f32c1b33
5 changed files with 1781 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/target

1579
Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

7
Cargo.toml Normal file
View file

@ -0,0 +1,7 @@
[package]
name = "rorrim"
version = "0.1.0"
edition = "2024"
[dependencies]
three-d = "0.19.0"

19
src/lib.rs Normal file
View file

@ -0,0 +1,19 @@
#![allow(special_module_name)]
mod main;
// Entry point for wasm
#[cfg(target_arch = "wasm32")]
use wasm_bindgen::prelude::*;
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen(start)]
pub fn start() -> Result<(), JsValue> {
console_log::init_with_level(log::Level::Debug).unwrap();
use log::info;
info!("Logging works!");
std::panic::set_hook(Box::new(console_error_panic_hook::hook));
main::main();
Ok(())
}

175
src/main.rs Normal file
View file

@ -0,0 +1,175 @@
use three_d::*;
fn handle_events(events: &mut [Event]) -> (Mat4, Mat4) {
let mut servo1_new_transform = Mat4::identity();
let mut servo2_new_transform = Mat4::identity();
for event in events.iter_mut() {
match event {
Event::KeyPress {
kind,
modifiers,
handled,
} if !*handled && Key::ArrowLeft == *kind => {
*handled = true;
servo1_new_transform = Mat4::from_angle_x(Deg(1.0))
}
Event::KeyPress {
kind,
modifiers,
handled,
} if !*handled && Key::ArrowRight == *kind => {
*handled = true;
servo1_new_transform = Mat4::from_angle_x(Deg(-1.0))
}
Event::KeyPress {
kind,
modifiers,
handled,
} if !*handled && Key::ArrowUp == *kind => {
*handled = true;
servo2_new_transform = Mat4::from_angle_x(Deg(1.0))
}
Event::KeyPress {
kind,
modifiers,
handled,
} if !*handled && Key::ArrowDown == *kind => {
*handled = true;
servo2_new_transform = Mat4::from_angle_x(Deg(-1.0))
}
_ => {}
}
}
return (servo1_new_transform, servo2_new_transform);
}
pub fn main() {
let window = Window::new(WindowSettings {
title: "rorrim".to_string(),
max_size: Some((1280, 720)),
..Default::default()
})
.unwrap();
let context = window.gl();
let mut camera = Camera::new_perspective(
window.viewport(),
vec3(5.0, 2.0, 2.5),
vec3(0.0, 0.0, -0.5),
vec3(0.0, 1.0, 0.0),
degrees(45.0),
0.1,
1000.0,
);
let mut control = OrbitControl::new(camera.target(), 1.0, 100.0);
let mut servo1 = Gm::new(
Mesh::new(&context, &CpuMesh::cylinder(16)),
PhysicalMaterial::new_transparent(
&context,
&CpuMaterial {
albedo: Srgba {
r: 0,
g: 255,
b: 0,
a: 200,
},
..Default::default()
},
),
);
let servo1_base_transform = Mat4::from_translation(vec3(0.0, 0.0, 0.0))
* Mat4::from_angle_z(Deg(90.0))
* Mat4::from_scale(0.5);
let mut servo1_transform = Mat4::identity();
servo1.set_transformation(servo1_base_transform * servo1_transform);
let mut servo2 = Gm::new(
Mesh::new(&context, &CpuMesh::cylinder(16)),
PhysicalMaterial::new_transparent(
&context,
&CpuMaterial {
albedo: Srgba {
r: 0,
g: 0,
b: 255,
a: 200,
},
..Default::default()
},
),
);
let servo2_base_transform =
Mat4::from_translation(vec3(2.0, 0.0, 0.5)) * Mat4::from_angle_y(Deg(90.0));
let mut servo2_transform = Mat4::identity();
servo2.set_transformation(
servo1_base_transform * servo1_transform * servo2_transform * servo2_base_transform,
);
let mut mirror = Gm::new(
Mesh::new(&context, &CpuMesh::circle(16)),
PhysicalMaterial::new_transparent(
&context,
&CpuMaterial {
albedo: Srgba {
r: 255,
g: 255,
b: 255,
a: 200,
},
..Default::default()
},
),
);
let mirror_base_transform =
Mat4::from_translation(vec3(0.5, 0.0, 1.0)) * Mat4::from_scale(0.75);
mirror.set_transformation(
servo1_base_transform
* servo1_transform
* servo2_base_transform
* servo2_transform
* mirror_base_transform,
);
let axes = Axes::new(&context, 0.01, 2.0);
let light0 = DirectionalLight::new(&context, 1.0, Srgba::WHITE, vec3(0.0, -0.5, -0.5));
let light1 = DirectionalLight::new(&context, 1.0, Srgba::WHITE, vec3(0.0, 0.5, 0.5));
window.render_loop(move |mut frame_input| {
camera.set_viewport(frame_input.viewport);
let (s1n, s2n) = handle_events(&mut frame_input.events);
servo1_transform = servo1_transform * s1n;
servo2_transform = servo2_transform * s2n;
servo1.set_transformation(servo1_base_transform * servo1_transform);
servo2.set_transformation(
servo1_base_transform * servo1_transform * servo2_base_transform * servo2_transform,
);
mirror.set_transformation(
servo1_base_transform
* servo1_transform
* servo2_base_transform
* servo2_transform
* mirror_base_transform,
);
control.handle_events(&mut camera, &mut frame_input.events);
frame_input
.screen()
.clear(ClearState::color_and_depth(0.8, 0.8, 0.8, 1.0, 1.0))
.render(
&camera,
mirror
.into_iter()
.chain(&servo1)
.chain(&servo2)
.chain(&axes),
&[&light0, &light1],
);
FrameOutput::default()
});
}