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