Initial commit
This commit is contained in:
commit
b3f32c1b33
5 changed files with 1781 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
||||||
1579
Cargo.lock
generated
Normal file
1579
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
7
Cargo.toml
Normal file
7
Cargo.toml
Normal 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
19
src/lib.rs
Normal 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
175
src/main.rs
Normal 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()
|
||||||
|
});
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue