Working on canvas, now having little squares wherever I want, next up is figuring out how to resize the canvas to the window size
This commit is contained in:
		
							parent
							
								
									56ae0e63b9
								
							
						
					
					
						commit
						747e9f9595
					
				| @ -24,9 +24,8 @@ pub fn App(cx: Scope) -> impl IntoView { | |||||||
| 
 | 
 | ||||||
|         // content for this welcome page
 |         // content for this welcome page
 | ||||||
|         <Router> |         <Router> | ||||||
|             <main class="text-white bg-indigo-950 min-h-screen "> |             <main class="text-white bg-indigo-950 min-h-screen relative"> | ||||||
|             <Background /> |                 <div class="max-w-3xl container mx-auto p-4 md:p-0 md:pb-14 relative z-50"> | ||||||
|                 <div class="max-w-3xl container mx-auto p-4 md:p-0 md:pb-14"> |  | ||||||
|                     <nav class="py-4 flex space-x-4"> |                     <nav class="py-4 flex space-x-4"> | ||||||
|                         <a href="/">"Home"</a> |                         <a href="/">"Home"</a> | ||||||
|                         <a href="/blog">"Blog"</a> |                         <a href="/blog">"Blog"</a> | ||||||
| @ -38,6 +37,7 @@ pub fn App(cx: Scope) -> impl IntoView { | |||||||
|                         <Route path="/blog" view=|cx| view! { cx, <Blog/> }/> |                         <Route path="/blog" view=|cx| view! { cx, <Blog/> }/> | ||||||
|                     </Routes> |                     </Routes> | ||||||
|                 </div> |                 </div> | ||||||
|  |                 <Background class="absolute h-screen w-screen top-0 z-0"/> | ||||||
|             </main> |             </main> | ||||||
|         </Router> |         </Router> | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -1,11 +1,13 @@ | |||||||
| use std::f64; |  | ||||||
| use leptos::html::Canvas; | use leptos::html::Canvas; | ||||||
| use leptos::*; | use leptos::*; | ||||||
|  | use std::f64; | ||||||
| use wasm_bindgen::JsCast; | use wasm_bindgen::JsCast; | ||||||
| use wasm_bindgen::JsValue; | use wasm_bindgen::JsValue; | ||||||
| 
 | 
 | ||||||
|  | use crate::space_colonization::SpaceColonization; | ||||||
|  | 
 | ||||||
| #[component] | #[component] | ||||||
| pub fn Background(cx: Scope) -> impl IntoView { | pub fn Background(cx: Scope, class: &'static str) -> impl IntoView { | ||||||
|     let canvas = create_node_ref::<Canvas>(cx); |     let canvas = create_node_ref::<Canvas>(cx); | ||||||
| 
 | 
 | ||||||
|     canvas.on_load(cx, move |_| { |     canvas.on_load(cx, move |_| { | ||||||
| @ -44,10 +46,31 @@ pub fn Background(cx: Scope) -> impl IntoView { | |||||||
|             .arc(90.0, 65.0, 5.0, 0.0, f64::consts::PI * 2.0) |             .arc(90.0, 65.0, 5.0, 0.0, f64::consts::PI * 2.0) | ||||||
|             .unwrap(); |             .unwrap(); | ||||||
| 
 | 
 | ||||||
|  |         log!("before stroke"); | ||||||
|         context.stroke(); |         context.stroke(); | ||||||
|  | 
 | ||||||
|  |         let sc = SpaceColonization::new(); | ||||||
|  |         context.set_fill_style(&JsValue::from("yellow")); | ||||||
|  |         log!("About to render nodes"); | ||||||
|  |         for n in sc.nodes.iter() { | ||||||
|  |             context.fill_rect(n.position.x.into(), n.position.y.into(), 5.0, 5.0); | ||||||
|  |             log!("filled node at position = {:#?}", n.position); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         context.set_fill_style(&JsValue::from("magenta")); | ||||||
|  |         for a in sc.attractors.iter() { | ||||||
|  |             context.fill_rect(a.position.x.into(), a.position.y.into(), 5.0, 5.0); | ||||||
|  |             log!("filled node at position = {:#?}", a.position); | ||||||
|  |         } | ||||||
|  |         context.fill_rect(100.0, 100.0, 5.0, 5.0); | ||||||
|  |         context.fill_rect(200.0, 200.0, 5.0, 5.0); | ||||||
|  |         context.fill_rect(300.0, 300.0, 5.0, 5.0); | ||||||
|  |         context.fill_rect(400.0, 400.0, 5.0, 5.0); | ||||||
|  |         context.fill_rect(500.0, 500.0, 5.0, 5.0); | ||||||
|     }); |     }); | ||||||
|  |     let class = format!("canvas {}", class); | ||||||
|     view! { cx, |     view! { cx, | ||||||
|         <div class="canvas fixed h-screen w-screen"> |         <div class={class}> | ||||||
|             <canvas node_ref=canvas></canvas> |             <canvas node_ref=canvas></canvas> | ||||||
|         </div> |         </div> | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -1,3 +1,4 @@ | |||||||
|  | mod space_colonization; | ||||||
| pub mod app; | pub mod app; | ||||||
| mod components; | mod components; | ||||||
| mod routes; | mod routes; | ||||||
|  | |||||||
							
								
								
									
										46
									
								
								src/space_colonization/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/space_colonization/mod.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | |||||||
|  | #[derive(Debug)] | ||||||
|  | pub struct Point { | ||||||
|  |     pub x: u16, | ||||||
|  |     pub y: u16, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub struct Attractor { | ||||||
|  |     pub position: Point, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub struct Node { | ||||||
|  |     pub position: Point, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub struct SpaceColonization { | ||||||
|  |     max_point: Point, | ||||||
|  |     kill_distance: u16, | ||||||
|  |     attraction_force: u16, | ||||||
|  |     density: u16, | ||||||
|  |     pub nodes: Vec<Node>, | ||||||
|  |     pub attractors: Vec<Attractor>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl SpaceColonization { | ||||||
|  |     pub fn new() -> SpaceColonization { | ||||||
|  |         let mut nodes = Vec::new(); | ||||||
|  |         nodes.push(Node { position: Point  { x: 100, y: 100 } }); | ||||||
|  |         let mut attractors = Vec::new(); | ||||||
|  |         attractors.push(Attractor { position: Point  { x: 10, y: 10 } }); | ||||||
|  |         attractors.push(Attractor { position: Point  { x: 20, y: 20 } }); | ||||||
|  |         attractors.push(Attractor { position: Point  { x: 30, y: 30 } }); | ||||||
|  |         attractors.push(Attractor { position: Point  { x: 40, y: 40 } }); | ||||||
|  |         attractors.push(Attractor { position: Point  { x: 50, y: 50 } }); | ||||||
|  |         attractors.push(Attractor { position: Point  { x: 60, y: 60 } }); | ||||||
|  |         attractors.push(Attractor { position: Point  { x: 70, y: 70 } }); | ||||||
|  | 
 | ||||||
|  |         SpaceColonization { | ||||||
|  |             max_point: Point { x: 500, y: 500 }, | ||||||
|  |             kill_distance: 10, | ||||||
|  |             attraction_force: 15, | ||||||
|  |             density: 10, | ||||||
|  |             nodes, | ||||||
|  |             attractors, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user