From 57b07ae84f682ceddade00a4cddc83d16d20d182 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Tue, 6 Sep 2022 00:02:48 +0200 Subject: [PATCH] First import of some cool bits of 2D graphics --- .gitignore | 2 + CMakeLists.txt | 25 +++++ CMakePresets.json | 23 +++++ iso.xml | 34 +++++++ main.c | 252 ++++++++++++++++++++++++++++++++++++++++++++++ player128-16.tim | Bin 0 -> 49172 bytes player128.tim | Bin 0 -> 25120 bytes shambler128.tim | Bin 0 -> 21024 bytes system.cnf | 4 + 9 files changed, 340 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 CMakePresets.json create mode 100644 iso.xml create mode 100644 main.c create mode 100644 player128-16.tim create mode 100644 player128.tim create mode 100644 shambler128.tim create mode 100644 system.cnf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e524d79 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode/ +build/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..ba452a5 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,25 @@ +# PSn00bSDK example CMake script +# (C) 2021 spicyjpeg - MPL licensed + +cmake_minimum_required(VERSION 3.20) + +project( + PSn00bSDK-template + LANGUAGES C CXX ASM + VERSION 1.0.0 + DESCRIPTION "PSn00bSDK template" + HOMEPAGE_URL "http://lameguy64.net/?page=psn00bsdk" +) + +psn00bsdk_add_executable(template STATIC main.c) + +psn00bsdk_target_incbin(template PRIVATE tim_player128 player128.tim) +psn00bsdk_target_incbin(template PRIVATE tim_player16bpp player128-16.tim) +psn00bsdk_target_incbin(template PRIVATE tim_shambler shambler128.tim) + +psn00bsdk_add_cd_image( + iso # Target name + template # Output file name (= template.bin + template.cue) + iso.xml # Path to config file + DEPENDS template +) diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..d08b334 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,23 @@ +{ + "version": 2, + "cmakeMinimumRequired": { + "major": 3, + "minor": 20, + "patch": 0 + }, + "configurePresets": [ + { + "name": "default", + "displayName": "Default configuration", + "description": "Use this preset to build the project using PSn00bSDK.", + "generator": "Ninja", + "binaryDir": "${sourceDir}/build", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_TOOLCHAIN_FILE": "$env{PSN00BSDK_LIBS}/cmake/sdk.cmake", + "PSN00BSDK_TC": "", + "PSN00BSDK_TARGET": "mipsel-none-elf" + } + } + ] +} diff --git a/iso.xml b/iso.xml new file mode 100644 index 0000000..477c636 --- /dev/null +++ b/iso.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/main.c b/main.c new file mode 100644 index 0000000..f89b179 --- /dev/null +++ b/main.c @@ -0,0 +1,252 @@ +/* + * LibPSn00b Example Programs + * + * Hello World Example + * 2019-2020 Meido-Tek Productions / PSn00bSDK Project + * + * The obligatory hello world example normally included in nearly every + * SDK package. This example should also get you started in how to manage + * the display using psxgpu. + * + * Example by Lameguy64 + * + * + * Changelog: + * + * January 1, 2020 - Initial version + */ + +#include +#include +#include +#include +#include + +#define OTLEN 8 + +// Define display/draw environments for double buffering +DISPENV disp[2]; +DRAWENV draw[2]; +int db; + +u_long ot[2][OTLEN]; // Ordering tables, two arrays for double buffering. These are basically "layers" for drawing. +char primbuff[2][32768]; // Primitive buffer, just a raw buffer of bytes to use as a pool for primitives +char *nextpri; + +extern u_long tim_player128[]; +extern u_long tim_player16bpp[]; +extern u_long tim_shambler[]; + +TIM_IMAGE playerTex; +TIM_IMAGE shamblerTex; + +void loadTexture(u_long* tim, TIM_IMAGE* tparam) +{ + GetTimInfo(tim, tparam); + + // This freezes up if the TIM image has weird dimensions, such as the ones from Quake... + LoadImage(tparam->prect, tparam->paddr); + + // Upload CLUT for palettized images + if (tparam->mode & 0x8) + { + LoadImage(tparam->crect, tparam->caddr); + } + + DrawSync(0); +} + +// Init function +void init(void) +{ + // This not only resets the GPU but it also installs the library's + // ISR subsystem to the kernel + ResetGraph(0); + + // Define display environments, first on top and second on bottom + SetDefDispEnv(&disp[0], 0, 0, 320, 240); + SetDefDispEnv(&disp[1], 0, 240, 320, 240); + + // Define drawing environments, first on bottom and second on top + SetDefDrawEnv(&draw[0], 0, 240, 320, 240); + SetDefDrawEnv(&draw[1], 0, 0, 320, 240); + + // Set and enable clear color + setRGB0(&draw[0], 96, 0, 96); + setRGB0(&draw[1], 96, 0, 96); + draw[0].isbg = 1; + draw[1].isbg = 1; + + // Clear double buffer counter + db = 0; + + // Apply the GPU environments + PutDispEnv(&disp[db]); + PutDrawEnv(&draw[db]); + + // Load test font + FntLoad(960, 0); + + // Open up a test font text stream of 100 characters + FntOpen(0, 8, 320, 224, 0, 100); + + nextpri = primbuff[0]; + + loadTexture(tim_player128, &playerTex); + loadTexture(tim_player16bpp, &playerTex); + loadTexture(tim_shambler, &shamblerTex); + + // Set texture page for the entire drawing environment. Nice in some cases perhaps, but not what we need. + //draw[0].tpage = getTPage(playerTex.mode & 0x3, 0, playerTex.prect->x, playerTex.prect->y); + //draw[1].tpage = getTPage(playerTex.mode & 0x3, 0, playerTex.prect->x, playerTex.prect->y); +} + +// Display function +void display(void) +{ + // Wait for all drawing to complete + // TODO: this should be interleaved with the double buffered ordering table draw commands, to minimize CPU idle time while waiting for the GPU + DrawSync(0); + + // Wait for vertical sync to cap the logic to 60fps (or 50 in PAL mode) + // and prevent screen tearing + VSync(0); + + // Switch pages + PutDispEnv(&disp[db]); + PutDrawEnv(&draw[db]); + + // Enable display output, ResetGraph() disables it by default + SetDispMask(1); + + DrawOTag(ot[db] + OTLEN - 1); // This performs a DMA transfer to quickly send all the primitives off to the GPU + + // Flip buffer index + db = !db; + + nextpri = primbuff[db]; +} + +static void lerpcol(int r0, int g0, int b0, int r1, int g1, int b1, int lerp, int* rout, int* gout, int* bout) // lerp = 0-4096 +{ + int invlerp = 4096 - lerp; + + *rout = (r0 * invlerp + r1 * lerp) >> 12; + *gout = (g0 * invlerp + g1 * lerp) >> 12; + *bout = (b0 * invlerp + b1 * lerp) >> 12; +} + +void addTile(int x, int y, int w, int h, int r, int g, int b) +{ + // Initialize tile primitive + TILE *tile = (TILE*)nextpri; + setTile(tile); + setXY0(tile, x, y); + setWH(tile, w, h); + setRGB0(tile, r, g, b); + + addPrim(ot[db], tile); + nextpri += sizeof(TILE); +} + +void addColoredTriangle(int x0, int y0, int x1, int y1, int x2, int y2, unsigned int rgb0, unsigned int rgb1, unsigned int rgb2) +{ + POLY_G3 *poly = (POLY_G3*)nextpri; + setPolyG3(poly); + setXY3(poly, x0, y0, x1, y1, x2, y2); + setRGB0(poly, (rgb0 >> 16) & 0xFF, (rgb0 >> 8) & 0xFF, rgb0 & 0xFF); + setRGB1(poly, (rgb1 >> 16) & 0xFF, (rgb1 >> 8) & 0xFF, rgb1 & 0xFF); + setRGB2(poly, (rgb2 >> 16) & 0xFF, (rgb2 >> 8) & 0xFF, rgb2 & 0xFF); + + addPrim(ot[db], poly); + nextpri += sizeof(POLY_G3); +} + +void addTexturedTriangle(int x0, int y0, int x1, int y1, int x2, int y2, short u0, short v0, short u1, short v1, short u2, short v2, TIM_IMAGE *img) +{ + short uoffs = (img->prect->x % 64) << (2 - (img->mode & 0x3)); + short voffs = (img->prect->y & 0xFF); + + POLY_FT3 *poly = (POLY_FT3*)nextpri; + setPolyFT3(poly); + setXY3(poly, x0, y0, x1, y1, x2, y2); + setUV3(poly, uoffs + u0, voffs + v0, uoffs + u1, voffs + v1, uoffs + u2, voffs + v2); + setRGB0(poly, 128, 128, 128); + setClut(poly, img->crect->x, img->crect->y); + setTPage(poly, img->mode & 0x3, 0, img->prect->x, img->prect->y); + + addPrim(ot[db], poly); + nextpri += sizeof(POLY_FT3); +} + +void addTexturedSprite(int x, int y, int w, int h, TIM_IMAGE *img) +{ + short uoffs = (img->prect->x % 64) << (2 - (img->mode & 0x3)); + short voffs = (img->prect->y & 0xFF); + + SPRT *sprite = (SPRT*)nextpri; + setSprt(sprite); + setXY0(sprite, x, y); + setWH(sprite, w, h); + setUV0(sprite, uoffs, voffs); + setClut(sprite, img->crect->x, img->crect->y); + setRGB0(sprite, 128, 128, 128); + addPrim(ot[db], sprite); + nextpri += sizeof(SPRT); + + DR_TPAGE *tpage = (DR_TPAGE*)nextpri; + setDrawTPage(tpage, 0, 1, getTPage(img->mode & 0x3, 0, img->prect->x, img->prect->y)); + addPrim(ot[db], tpage); + nextpri += sizeof(DR_TPAGE); +} + +void drawStuff(int counter) +{ + ClearOTagR(ot[db], OTLEN); + + // Print the obligatory hello world and counter to show that the + // program isn't locking up to the last created text stream + FntPrint(-1, "HELLO WORLD\n"); + FntPrint(-1, "COUNTER=%d, SIN=%d\n", counter, isin(counter)); + FntPrint(-1, "Image x %d y %d w %d h %d mode 0x%x\n", playerTex.prect->x, playerTex.prect->y, playerTex.prect->w, playerTex.prect->h, playerTex.mode); + + // Draw the last created text stream + FntFlush(-1); + + int r, g, b; + + lerpcol(255, 255, 0, 255, 0, 0, (icos(counter * 32) + 4096) >> 1, &r, &g, &b); + addTile(32, 32, 64, 64, r, g, b); + + lerpcol(0, 255, 255, 0, 255, 0, (icos(counter * 24 + 512) + 4096) >> 1, &r, &g, &b); + addTile(128, 160, 48, 48, r, g, b); + + addColoredTriangle(260, 140, 220, 220, 300, 220, 0xFF0000, 0x00FF00, 0x0000FF); + addTexturedTriangle(260, 40, 220, 120, 300, 120, 0, 94, 74, 124, 58, 1, &playerTex); + addTexturedSprite(20, 140, 80, 80, &playerTex); + addTexturedSprite(80, 40, 154, 114, &shamblerTex); +} + +// Main function, program entrypoint +int main(int argc, const char *argv[]) +{ + int counter; + + // Init stuff + init(); + + // Main loop + counter = 0; + while(1) + { + drawStuff(counter); + + // Update display + display(); + + // Increment the counter + counter++; + } + + return 0; +} diff --git a/player128-16.tim b/player128-16.tim new file mode 100644 index 0000000000000000000000000000000000000000..574d39cda4bff2b889a0d0642f0a14282feccc63 GIT binary patch literal 49172 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 literal 0 HcmV?d00001 diff --git a/player128.tim b/player128.tim new file mode 100644 index 0000000000000000000000000000000000000000..443265ed87c277fbec0b361f2826250d0a5e28f7 GIT binary patch literal 25120 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 literal 0 HcmV?d00001 diff --git a/shambler128.tim b/shambler128.tim new file mode 100644 index 0000000000000000000000000000000000000000..dc5a572c6784472c37ac8febd6f88a380660967e GIT binary patch literal 21024 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 z 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 Qfkz5FQs9vSZ=C}F2N0KO{{R30 literal 0 HcmV?d00001 diff --git a/system.cnf b/system.cnf new file mode 100644 index 0000000..e221726 --- /dev/null +++ b/system.cnf @@ -0,0 +1,4 @@ +BOOT=cdrom:\template.exe;1 +TCB=4 +EVENT=10 +STACK=801FFFF0