diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9fd76c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/target +/build +/disk +cake.cdi diff --git a/Cargo.toml b/Cargo.toml index a8c96ad..3dd01b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ name = "dccake" version = "0.1.0" edition = "2021" +build = "src/build.rs" [profile.release] opt-level = 3 diff --git a/Justfile b/Justfile index 874fe23..67c1d2a 100644 --- a/Justfile +++ b/Justfile @@ -1,17 +1,19 @@ -BUILD:="build" +BUILD:="disk" PROJECT_NAME:="cake" TARGET:="target/sh-elf/release/dccake.elf" logo: - convert cake.png -resize 256x256 cakes.png - convert cakes.png +dither -colors 127 cakec.png + mkdir -p build + convert assets/cake.png -resize 320x90 build/cakes.png + convert build/cakes.png +dither -colors 127 build/cakec.png build: logo kos-cargo build --release - sh-elf-objcopy -R .stack -O binary {{TARGET}} output.bin - $KOS_BASE/utils/scramble/scramble output.bin {{BUILD}}/1ST_READ.bin + sh-elf-objcopy -R .stack -O binary {{TARGET}} build/output.bin mkdir -p {{BUILD}} + mkdir -p build + $KOS_BASE/utils/scramble/scramble build/output.bin {{BUILD}}/1ST_READ.bin rm {{BUILD}}/IP.BIN || true - makeip ip.txt -l /tmp/cakec.png {{BUILD}}/IP.BIN - mkisofs -C 0,11702 -V {{PROJECT_NAME}} -G {{BUILD}}/IP.BIN -r -J -l -o {{PROJECT_NAME}}.iso {{BUILD}} - cdi4dc {{PROJECT_NAME}}.iso {{PROJECT_NAME}}.cdi + makeip ip.txt -l build/cakec.png {{BUILD}}/IP.BIN + mkisofs -C 0,11702 -V {{PROJECT_NAME}} -G {{BUILD}}/IP.BIN -r -J -l -o build/{{PROJECT_NAME}}.iso {{BUILD}} + cdi4dc build/{{PROJECT_NAME}}.iso {{PROJECT_NAME}}.cdi diff --git a/build.rs b/src/build.rs similarity index 69% rename from build.rs rename to src/build.rs index e62b51a..f8c3b42 100644 --- a/build.rs +++ b/src/build.rs @@ -1,13 +1,13 @@ fn main() { - generate_textures(vec!["tex_claw", "tex_dc", "tex_dcwiki", "tex_gcc", "tex_kos", "tex_rust"]); + generate_textures(vec!["caketops", "exterior", "interiors", "slices"]); } fn generate_textures(names: Vec<&str>) { let vqenc_cmd = format!("{}/utils/vqenc/vqenc", std::env::var("KOS_BASE").unwrap()); for texname in names { - let jpgfile = format!("rsrc/{}.jpg", texname); - let vqfile = format!("rsrc/{}.vq", texname); + let jpgfile = format!("assets/{}.jpg", texname); + let vqfile = format!("assets/{}.vq", texname); let outfile = format!("{}/{}.vq", std::env::var("OUT_DIR").unwrap(), texname); std::process::Command::new(&vqenc_cmd) .args(["-t", "-v", &jpgfile]) diff --git a/src/main.rs b/src/main.rs index e7a11a9..3713a79 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,226 @@ +use kos::ffi::{ + dc::maple, + MAPLE_FOREACH, +}; +use gldc::{ + gl::*, glext::*, glkos::*, glu::*, +}; + +// Include texture data generated by build script +static CLAW_DATA: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/exterior.vq")); +static DC_DATA: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/exterior.vq")); +static DCWIKI_DATA: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/exterior.vq")); +static GCC_DATA: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/interiors.vq")); +static KOS_DATA: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/caketops.vq")); +static RUST_DATA: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/slices.vq")); + fn main() { - println!("Hello, world!"); + unsafe { + // Initialize GLdc + glKosInit(); + + // Say hello to the world! + println!("\nHello, world from Rust! - gldc-cube example"); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45.0, 640.0 / 480.0, 0.1, 100.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glEnable(GL_TEXTURE_2D); + glShadeModel(GL_SMOOTH); + glClearColor(0.0, 0.0, 0.0, 0.5); + glClearDepth(1.0); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + + let mut tex_claw: u32 = 0; + glGenTextures(1, &mut tex_claw); + glBindTexture(GL_TEXTURE_2D, tex_claw); + glCompressedTexImage2DARB(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_565_VQ_TWID_KOS, + 512, 512, 0, CLAW_DATA.len() as u32, CLAW_DATA.as_ptr() as *const c_void); + + let mut tex_dc: u32 = 0; + glGenTextures(1, &mut tex_dc); + glBindTexture(GL_TEXTURE_2D, tex_dc); + glCompressedTexImage2DARB(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_565_VQ_TWID_KOS, + 512, 512, 0, DC_DATA.len() as u32, DC_DATA.as_ptr() as *const c_void); + + let mut tex_dcwiki: u32 = 0; + glGenTextures(1, &mut tex_dcwiki); + glBindTexture(GL_TEXTURE_2D, tex_dcwiki); + glCompressedTexImage2DARB(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_565_VQ_TWID_KOS, + 512, 512, 0, DCWIKI_DATA.len() as u32, DCWIKI_DATA.as_ptr() as *const c_void); + + let mut tex_gcc: u32 = 0; + glGenTextures(1, &mut tex_gcc); + glBindTexture(GL_TEXTURE_2D, tex_gcc); + glCompressedTexImage2DARB(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_565_VQ_TWID_KOS, + 512, 512, 0, GCC_DATA.len() as u32, GCC_DATA.as_ptr() as *const c_void); + + let mut tex_kos: u32 = 0; + glGenTextures(1, &mut tex_kos); + glBindTexture(GL_TEXTURE_2D, tex_kos); + glCompressedTexImage2DARB(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_565_VQ_TWID_KOS, + 512, 512, 0, KOS_DATA.len() as u32, KOS_DATA.as_ptr() as *const c_void); + + let mut tex_rust: u32 = 0; + glGenTextures(1, &mut tex_rust); + glBindTexture(GL_TEXTURE_2D, tex_rust); + glCompressedTexImage2DARB(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_565_VQ_TWID_KOS, + 512, 512, 0, RUST_DATA.len() as u32, RUST_DATA.as_ptr() as *const c_void); + + let mut xrot: f32 = 0.0; + let mut yrot: f32 = 0.0; + let mut zrot: f32 = 0.0; + + let mut draw_gl = || { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glLoadIdentity(); + glTranslatef(0.0, 0.0, -5.0); + + glRotatef(xrot, 1.0, 0.0, 0.0); + glRotatef(yrot, 0.0, 1.0, 0.0); + glRotatef(zrot, 0.0, 0.0, 1.0); + + // Front face + glBindTexture(GL_TEXTURE_2D, tex_claw); + glBegin(GL_QUADS); + + glColor3f(1.0, 1.0, 1.0); + glTexCoord2f(1.0, 0.0); + glVertex3f(-1.0, -1.0, 1.0); + glTexCoord2f(0.0, 0.0); + glVertex3f(1.0, -1.0, 1.0); + glTexCoord2f(0.0, 1.0); + glVertex3f(1.0, 1.0, 1.0); + glTexCoord2f(1.0, 1.0); + glVertex3f(-1.0, 1.0, 1.0); + + glEnd(); + + // Back face + glBindTexture(GL_TEXTURE_2D, tex_gcc); + glBegin(GL_QUADS); + + glColor3f(1.0, 1.0, 1.0); + glTexCoord2f(0.0, 0.0); + glVertex3f(-1.0, -1.0, -1.0); + glTexCoord2f(0.0, 1.0); + glVertex3f(-1.0, 1.0, -1.0); + glTexCoord2f(1.0, 1.0); + glVertex3f(1.0, 1.0, -1.0); + glTexCoord2f(1.0, 0.0); + glVertex3f(1.0, -1.0, -1.0); + + glEnd(); + + // Top face + glBindTexture(GL_TEXTURE_2D, tex_dcwiki); + glBegin(GL_QUADS); + + glColor3f(1.0, 1.0, 1.0); + glTexCoord2f(1.0, 1.0); + glVertex3f(-1.0, 1.0, -1.0); + glTexCoord2f(1.0, 0.0); + glVertex3f(-1.0, 1.0, 1.0); + glTexCoord2f(0.0, 0.0); + glVertex3f(1.0, 1.0, 1.0); + glTexCoord2f(0.0, 1.0); + glVertex3f(1.0, 1.0, -1.0); + + glEnd(); + + // Bottom face + glBindTexture(GL_TEXTURE_2D, tex_kos); + glBegin(GL_QUADS); + + glColor3f(1.0, 1.0, 1.0); + glTexCoord2f(0.0, 1.0); + glVertex3f(-1.0, -1.0, -1.0); + glTexCoord2f(1.0, 1.0); + glVertex3f(1.0, -1.0, -1.0); + glTexCoord2f(1.0, 0.0); + glVertex3f(1.0, -1.0, 1.0); + glTexCoord2f(0.0, 0.0); + glVertex3f(-1.0, -1.0, 1.0); + + glEnd(); + + // Right face + glBindTexture(GL_TEXTURE_2D, tex_dc); + glBegin(GL_QUADS); + + glColor3f(0.0, 1.0, 0.0); + glTexCoord2f(0.0, 0.0); + glVertex3f(1.0, -1.0, -1.0); + glColor3f(0.3, 0.5, 1.0); + glTexCoord2f(0.0, 1.0); + glVertex3f(1.0, 1.0, -1.0); + glColor3f(1.0, 0.3, 0.5); + glTexCoord2f(1.0, 1.0); + glVertex3f(1.0, 1.0, 1.0); + glColor3f(0.5, 0.5, 0.5); + glTexCoord2f(1.0, 0.0); + glVertex3f(1.0, -1.0, 1.0); + + glEnd(); + + // Left face + glBindTexture(GL_TEXTURE_2D, tex_rust); + glBegin(GL_QUADS); + + glColor3f(1.0, 0.0, 0.0); + glTexCoord2f(1.0, 0.0); + glVertex3f(-1.0, -1.0, -1.0); + glColor3f(1.0, 1.0, 0.0); + glTexCoord2f(0.0, 0.0); + glVertex3f(-1.0, -1.0, 1.0); + glColor3f(0.0, 1.0, 1.0); + glTexCoord2f(0.0, 1.0); + glVertex3f(-1.0, 1.0, 1.0); + glColor3f(0.0, 0.0, 1.0); + glTexCoord2f(1.0, 1.0); + glVertex3f(-1.0, 1.0, -1.0); + + glEnd(); + + xrot += 56.0; + yrot += 44.0; + zrot += 72.0; + }; + + + // Done setting up, now let's loop! + loop { + let mut done = false; + + MAPLE_FOREACH!(maple::MAPLE_FUNC_CONTROLLER, maple::controller::cont_state_t, state, || { + if ((*state).buttons & maple::controller::CONT_START) != 0 { + println!("Start pressed! Quitting..."); + done = true; + } + }); + + + if done == true { + break; + } + + draw_gl(); + + glKosSwapBuffers(); + } + + // Clean up our textures + glDeleteTextures(1, &mut tex_claw); + glDeleteTextures(1, &mut tex_dc); + glDeleteTextures(1, &mut tex_dcwiki); + glDeleteTextures(1, &mut tex_gcc); + glDeleteTextures(1, &mut tex_kos); + glDeleteTextures(1, &mut tex_rust); + } + + println!("Bye!"); }