aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs2
-rw-r--r--src/render.rs328
2 files changed, 155 insertions, 175 deletions
diff --git a/src/main.rs b/src/main.rs
index 29e210b..7660429 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -85,7 +85,7 @@ pub fn main() {
.duration_since(start_time)
.expect("Time went back between frames");
let time = f64::from(time.as_millis() as u32) / 1000.0;
- // let time = time * 2.0;
+ let time = time * 3.0;
#[cfg(all(not(feature = "notimeout"), not(feature = "32k")))]
if time > TIMEOUT_DEATH {
diff --git a/src/render.rs b/src/render.rs
index 9e80307..08b17be 100644
--- a/src/render.rs
+++ b/src/render.rs
@@ -1,5 +1,6 @@
use crate::font::BakedFont;
use crate::generated::fonts::{FONT_CHERRY_BOMB_ONE, FONT_GALMURI};
+use rand::distributions::uniform::SampleRange;
use rand::Rng;
use sdl2::pixels::{Color, PixelFormatEnum};
use sdl2::rect::Rect;
@@ -26,6 +27,59 @@ fn dvd_logo_offset(t: f64, screen_size_x: f64, screen_size_y: f64) -> (f64, f64)
(offset_x, offset_y)
}
+fn render_chars_with_rng<R>(
+ canvas: &mut Canvas<Window>,
+ texture_creator: &TextureCreator<WindowContext>,
+ str: impl Iterator<Item = char>,
+ font: impl BakedFont,
+ range_x: &R,
+ range_y: &R,
+ offset_x: &mut f64,
+ offset_y: &i32,
+ colour: Color,
+ rng: &mut impl Rng,
+) where
+ R: SampleRange<i32> + Clone,
+{
+ let mut rng = rng;
+ for c in str {
+ let char = font.get_char(c);
+ canvas
+ .copy(
+ &char.to_texture(texture_creator, colour).unwrap(),
+ None,
+ char.to_rect(
+ offset_x.clone() as i32 + rng.gen_range(range_x.clone()),
+ offset_y.clone() + rng.gen_range(range_y.clone()),
+ ),
+ )
+ .unwrap();
+ *offset_x += char.advance_width;
+ }
+}
+
+fn render_chars_without_rng(
+ canvas: &mut Canvas<Window>,
+ texture_creator: &TextureCreator<WindowContext>,
+ str: impl Iterator<Item = char>,
+ font: impl BakedFont,
+ offset_x: &mut f64,
+ offset_y: &i32,
+ colour: Color,
+) {
+ for c in str {
+ let char = font.get_char(c);
+ canvas
+ .copy(
+ &char.to_texture(texture_creator, colour).unwrap(),
+ None,
+ char.to_rect(offset_x.clone() as i32, offset_y.clone()),
+ )
+ .unwrap();
+ *offset_x += char.advance_width;
+ }
+}
+
pub const START_UWUSPACE: f64 = 0.0;
pub const START_BOUNCE: f64 = 0.5;
pub const START_SIN: f64 = 12.0;
@@ -104,22 +158,15 @@ pub fn render(
(padding_x.round() as i32, padding_y.round() as i32)
};
let mut offset: f64 = 0.0;
- for c in "UwU-Space".chars() {
- let char = FONT_CHERRY_BOMB_ONE.get_char(c);
- canvas
- .copy(
- &char
- .to_texture(
- texture_creator,
- Color::RGB(colourthing, 64, 255 - colourthing),
- )
- .unwrap(),
- None,
- char.to_rect(offset as i32 + offset_x, offset_y),
- )
- .unwrap();
- offset += char.advance_width;
- }
+ render_chars_without_rng(
+ canvas,
+ texture_creator,
+ "UwU-Space".chars(),
+ FONT_CHERRY_BOMB_ONE,
+ &mut f64::from(offset_x),
+ &offset_y,
+ Color::RGB(colourthing, 64, 255 - colourthing),
+ );
}
}
@@ -148,36 +195,30 @@ pub fn render(
let mut i = 0.0;
let strlen = 19;
- let mut uwuoffset_x = 0.0;
- for c in {
+ let mut uwuoffset_x = 18.0;
+ let str = {
if time_seconds + 0.75 >= (SCENE_GREETINGS - SCENE_MOAR) {
- "oh look a 64k rust demo".chars()
+ "oh look a 64k rust demo"
} else {
- "Have some scrollers: x3".chars()
+ "Have some scrollers: x3"
}
- } {
- let char: crate::font::RenderableCharacter = FONT_GALMURI.get_char(c);
- canvas
- .copy(
- &char
- .to_texture(
- texture_creator,
- Color::RGB(colourthing, 64, 255 - colourthing),
- )
- .unwrap(),
- None,
- char.to_rect(
- uwuoffset_x as i32 + 18 + rng.gen_range(-2..2),
- (24) + rng.gen_range(-3..3),
- ),
- )
- .unwrap();
- uwuoffset_x += char.advance_width;
- i += 1.0;
- if i > (time_seconds * (f64::from(strlen) / greeting_header_duration)).floor() {
- break;
- }
- }
+ };
+ let str = str.chars().collect::<Vec<char>>();
+ let str = &str[0..((time_seconds * (f64::from(strlen) / greeting_header_duration)).floor()
+ as usize)
+ .min(str.len())];
+ render_chars_with_rng(
+ canvas,
+ texture_creator,
+ str.iter().map(|v| *v),
+ FONT_GALMURI,
+ &(-2..2),
+ &(-3..3),
+ &mut uwuoffset_x,
+ &24,
+ Color::RGB(colourthing, 64, 255 - colourthing),
+ &mut rng,
+ );
let mut offset_y = 36;
for line in [
"Pls come to CoSin 2025 Credits",
@@ -194,25 +235,7 @@ pub fn render(
let mut offset_x: f64 = f64::from(win_size.0)
- ((time_seconds - greeting_header_duration) * (f64::from(win_size.0) * 0.078125));
- for c in line.chars() {
- let char = FONT_GALMURI.get_char(c);
- canvas
- .copy(
- &char
- .to_texture(
- texture_creator,
- Color::RGB(colourthing, 64, 255 - colourthing),
- )
- .unwrap(),
- None,
- char.to_rect(
- offset_x as i32 + rng.gen_range(-2..2),
- offset_y + rng.gen_range(-2..2),
- ),
- )
- .unwrap();
- offset_x += char.advance_width;
- }
+ render_chars_with_rng(canvas, texture_creator, line.chars(), FONT_GALMURI, &(-2..2), &(-2..2), &mut offset_x,&offset_y, Color::RGB(colourthing, 64, 255 - colourthing), &mut rng);
}
}
}
@@ -222,27 +245,31 @@ pub fn render(
let time_seconds = time_seconds - SCENE_GREETINGS;
// Greetings
let greeting_header_duration = 4.0;
+ let colour = Color::RGB(colourthing, 64, 255 - colourthing);
+ let mut rng = rand::thread_rng();
{
- let mut rng = rand::thread_rng();
-
let mut i = 0.0;
let strlen = 43;
let mut uwuoffset_x = 0.0;
- for c in "Greetings by UwU-Space to:".chars() {
+ let str = "Greetings by UwU-Space to:";
+ let str = str.chars().collect::<Vec<char>>();
+ let str = &str[0..{
+ let f = time_seconds * (f64::from(strlen) / greeting_header_duration);
+ let f = f.floor() as usize;
+ f.min(str.len())
+ }];
+ for c in str {
+ // we dont use the abstraction funcs due to the inline uwu-space
let is_not_uwu = i <= 12.0 || i >= 22.0;
+ i += 1.0;
let char = if is_not_uwu {
- FONT_GALMURI.get_char(c)
+ FONT_GALMURI.get_char(*c)
} else {
- FONT_CHERRY_BOMB_ONE.get_char(c)
+ FONT_CHERRY_BOMB_ONE.get_char(*c)
};
canvas
.copy(
- &char
- .to_texture(
- texture_creator,
- Color::RGB(colourthing, 64, 255 - colourthing),
- )
- .unwrap(),
+ &char.to_texture(texture_creator, colour).unwrap(),
None,
char.to_rect(
uwuoffset_x as i32 + 18 + rng.gen_range(-2..2),
@@ -251,10 +278,6 @@ pub fn render(
)
.unwrap();
uwuoffset_x += char.advance_width;
- i += 1.0;
- if i > (time_seconds * (f64::from(strlen) / greeting_header_duration)).floor() {
- break;
- }
}
let mut offset_y = 36;
let mut line_index = 0;
@@ -265,105 +288,62 @@ pub fn render(
vec!["Shana", "psykon", "Unlock"],
] {
offset_y += 24;
- let mut offset_x = (f64::from(line_index) * 90.0) + f64::from(win_size.0)
- - ((time_seconds - greeting_header_duration) * (f64::from(win_size.0) * 0.078125));
+ let mut offset_x = 18.0
+ + ((f64::from(line_index) * 90.0) + f64::from(win_size.0)
+ - ((time_seconds - greeting_header_duration) * (f64::from(win_size.0) * 0.078125)));
line_index += 1;
- for c in line.join(" ").chars() {
- let char = FONT_GALMURI.get_char(c);
- canvas
- .copy(
- &char
- .to_texture(
- texture_creator,
- Color::RGB(colourthing, 64, 255 - colourthing),
- )
- .unwrap(),
- None,
- char.to_rect(
- offset_x as i32 + 18 + rng.gen_range(-2..2),
- offset_y + rng.gen_range(-2..2),
- ),
- )
- .unwrap();
- offset_x += char.advance_width;
- }
+ render_chars_with_rng(
+ canvas,
+ texture_creator,
+ line.join(" ").chars(),
+ FONT_GALMURI,
+ &(-2..2),
+ &(-2..2),
+ &mut offset_x,
+ &offset_y,
+ colour,
+ &mut rng,
+ );
}
}
// We did most of this at mountainbytes
- {
- let mut offset = 0.0;
- let mut rng = rand::thread_rng();
-
- for c in "we did 90% onsite at mountainbytes 2025,".chars() {
- let char = FONT_GALMURI.get_char(c);
- canvas
- .copy(
- &char
- .to_texture(
- texture_creator,
- Color::RGB(colourthing, 64, 255 - colourthing),
- )
- .unwrap(),
- None,
- char.to_rect(
- offset as i32 + 18 + rng.gen_range(-2..2),
- win_size.1 as i32 - 64 + rng.gen_range(-2..2),
- ),
- )
- .unwrap();
- offset += char.advance_width;
- }
- }
- {
- let mut offset = 0.0;
- let mut rng = rand::thread_rng();
-
- for c in "the rest 2 months ago".chars() {
- let char = FONT_GALMURI.get_char(c);
- canvas
- .copy(
- &char
- .to_texture(
- texture_creator,
- Color::RGB(colourthing, 64, 255 - colourthing),
- )
- .unwrap(),
- None,
- char.to_rect(
- offset as i32 + 24 + rng.gen_range(-2..2),
- win_size.1 as i32 - 32 + rng.gen_range(-2..2),
- ),
- )
- .unwrap();
- offset += char.advance_width;
- }
- }
- // Sorry for shit invite
- {
- let mut offset = 0.0;
- let mut rng = rand::thread_rng();
-
- for c in "sorry for shit invite we have adhd".chars() {
- let char = FONT_GALMURI.get_char(c);
- canvas
- .copy(
- &char
- .to_texture(
- texture_creator,
- Color::RGB(colourthing, 64, 255 - colourthing),
- )
- .unwrap(),
- None,
- char.to_rect(
- offset as i32 + 18 + rng.gen_range(-2..2),
- win_size.1 as i32 - 96 + rng.gen_range(-2..2),
- ),
- )
- .unwrap();
- offset += char.advance_width;
- }
- }
+ render_chars_with_rng(
+ canvas,
+ texture_creator,
+ "sorry for shit invite we have adhd".chars(),
+ FONT_GALMURI,
+ &(-2..2),
+ &(-2..2),
+ &mut 18.0,
+ &(win_size.1 as i32 - 96),
+ colour,
+ &mut rng,
+ );
+ render_chars_with_rng(
+ canvas,
+ texture_creator,
+ "we did 90% onsite at mountainbytes 2025,".chars(),
+ FONT_GALMURI,
+ &(-2..2),
+ &(-2..2),
+ &mut 18.0,
+ &(win_size.1 as i32 - 64),
+ colour,
+ &mut rng,
+ );
+ render_chars_with_rng(
+ canvas,
+ texture_creator,
+ "the rest 2 months ago".chars(),
+ FONT_GALMURI,
+ &(-2..2),
+ &(-2..2),
+ &mut 18.0,
+ &(win_size.1 as i32 - 32),
+ colour,
+ &mut rng,
+ );
}
} else {
if time_seconds >= START_SIN {
@@ -430,9 +410,9 @@ pub fn render(
let time_seconds = time_seconds - START_COMETOCOSIN;
let wrap_width = f64::from(win_size.0);
let mut offset = (18.0 + (time_seconds * 32.0)) % wrap_width;
- // WARNING: we wrap this! if the text is wider than the window, this whole thing falls apart
- for c in "Come to Cosin25 :3".chars() {
- let char = FONT_GALMURI.get_char(c);
+ // World's shittiest marquee implementation
+ for char in "Come to Cosin25 :3".chars() {
+ let char = FONT_GALMURI.get_char(char);
canvas
.copy(
&char