diff options
| author | spicyjpeg <thatspicyjpeg@gmail.com> | 2023-05-11 19:11:35 +0200 |
|---|---|---|
| committer | spicyjpeg <thatspicyjpeg@gmail.com> | 2023-05-11 19:11:35 +0200 |
| commit | 3b696fc431a9c3f2aa7ea4f27aec20ce5dd67859 (patch) | |
| tree | 3cf2dc24f38ad1b532f0ec913c3604d334e79872 /examples/beginner/cppdemo | |
| parent | ca6b54f3c15a7b00a5ede64ba452f2955a421a1e (diff) | |
| download | psn00bsdk-3b696fc431a9c3f2aa7ea4f27aec20ce5dd67859.tar.gz | |
Add C++ standard library headers, update beginner/cppdemo
Diffstat (limited to 'examples/beginner/cppdemo')
| -rw-r--r-- | examples/beginner/cppdemo/main.cpp | 274 |
1 files changed, 134 insertions, 140 deletions
diff --git a/examples/beginner/cppdemo/main.cpp b/examples/beginner/cppdemo/main.cpp index fd2e3a8..f55f952 100644 --- a/examples/beginner/cppdemo/main.cpp +++ b/examples/beginner/cppdemo/main.cpp @@ -1,157 +1,151 @@ -/* Work in progress example, need to add comments. +/* Work in progress example, need to add comments. * * Basically a quick little example that showcases C++ classes are * functioning in PSn00bSDK. - Lameguy64 * - * First written in December 18, 2020. + * First written in December 18, 2020. * * Changelog: * - * May 10, 2021 - Variable types updated for psxgpu.h changes. + * May 11, 2023 - Updated the example to use C++ standard library headers, + * renamed the class and cleaned up some methods. + * May 10, 2021 - Variable types updated for psxgpu.h changes. * */ - -#include <sys/types.h> -#include <stdio.h> -#include <stdlib.h> + +#include <cstddef> +#include <cstdint> +#include <cstdio> +#include <cstdlib> #include <psxgte.h> #include <psxgpu.h> -class GraphClass -{ - u_long *_ot[2]; - u_char *_pri[2]; - u_char *_nextpri; +/* Example class */ + +class RenderContext { +private: + std::uint32_t *_ot[2]; + std::uint8_t *_pri[2]; + std::uint8_t *_nextpri; + + int _ot_count, _db; - int _ot_count; - int _db; - - DISPENV _disp[2]; + DISPENV _disp[2]; DRAWENV _draw[2]; - + public: + RenderContext(std::size_t ot_len = 8, std::size_t pri_len = 8192); + ~RenderContext(void); + void setupBuffers(int w, int h, int r, int g, int b); + void flip(void); + + template<typename T> inline T *addPrimitive(void) { + auto pri = reinterpret_cast<T *>(_nextpri); + addPrim(_ot[_db], pri); + + _nextpri += sizeof(T); + return pri; + } +}; + +RenderContext::RenderContext(std::size_t ot_len, std::size_t pri_len) { + _ot[0] = new std::uint32_t[ot_len]; + _ot[1] = new std::uint32_t[ot_len]; + + _db = 0; + _ot_count = ot_len; + ClearOTagR(_ot[0], _ot_count); + ClearOTagR(_ot[1], _ot_count); + + _pri[0] = new std::uint8_t[pri_len]; + _pri[1] = new std::uint8_t[pri_len]; + + _nextpri = _pri[0]; + + std::printf("RenderContext::RenderContext: Buffers allocated.\n"); +} + +RenderContext::~RenderContext(void) { + delete[] _ot[0]; + delete[] _ot[1]; + + delete[] _pri[0]; + delete[] _pri[1]; + + std::printf("RenderContext::RenderContext: Buffers freed.\n"); +} + +void RenderContext::setupBuffers(int w, int h, int r, int g, int b) { + SetDefDispEnv(&_disp[0], 0, h, w, h); + SetDefDispEnv(&_disp[1], 0, 0, w, h); + SetDefDrawEnv(&_draw[0], 0, 0, w, h); + SetDefDrawEnv(&_draw[1], 0, h, w, h); + + setRGB0(&_draw[0], r, g, b); + _draw[0].isbg = 1; + _draw[0].dtd = 1; - GraphClass( int ot_len = 8, int pri_len = 8192 ) - { - _ot[0] = (u_long*)malloc( sizeof(u_long)*ot_len ); - _ot[1] = (u_long*)malloc( sizeof(u_long)*ot_len ); - - _db = 0; - _ot_count = ot_len; - ClearOTagR( _ot[0], _ot_count ); - ClearOTagR( _ot[1], _ot_count ); - - _pri[0] = (u_char*)malloc( pri_len ); - _pri[1] = (u_char*)malloc( pri_len ); - - _nextpri = _pri[0]; - - printf( "GraphClass::GraphClass: Buffers allocated.\n" ); - - } /* GraphClass */ - - virtual ~GraphClass() - { - /* free the OTs and primitive buffers */ - free( _ot[0] ); - free( _ot[1] ); - - free( _pri[0] ); - free( _pri[1] ); - - printf( "GraphClass::GraphClass: Buffers freed.\n" ); - - } /* ~GraphClass */ - - void SetRes( int w, int h ) - { - SetDefDispEnv( &_disp[0], 0, h, w, h ); - SetDefDispEnv( &_disp[1], 0, 0, w, h ); - - SetDefDrawEnv( &_draw[0], 0, 0, w, h ); - SetDefDrawEnv( &_draw[1], 0, h, w, h ); - - setRGB0( &_draw[0], 63, 0, 127 ); - _draw[0].isbg = 1; - _draw[0].dtd = 1; - setRGB0( &_draw[1], 63, 0, 127 ); - _draw[1].isbg = 1; - _draw[1].dtd = 1; - - PutDispEnv( &_disp[0] ); - PutDrawEnv( &_draw[0] ); - - } /* SetRes */ - - void IncPri( int bytes ) - { - _nextpri += bytes; - - } /* IncPri */ - - void SetPri( u_char *ptr ) - { - _nextpri = ptr; - - } /* SetPri */ - - u_char *GetNextPri( void ) - { - return( _nextpri ); - - } /* GetNextPri */ - - u_long *GetOt( void ) - { - return( _ot[_db] ); - - } /* GetOt */ - - void Display( void ) - { - VSync( 0 ); - DrawSync( 0 ); - SetDispMask( 1 ); - - _db = !_db; - - PutDispEnv( &_disp[_db] ); - PutDrawEnv( &_draw[_db] ); - - DrawOTag( _ot[!_db]+(_ot_count-1) ); - - ClearOTagR( _ot[_db], _ot_count ); - _nextpri = _pri[_db]; - - } /* Display */ - -}; /* GraphClass */ - -GraphClass *otable; - -int main( int argc, const char *argv[] ) -{ - TILE *tile; - - ResetGraph( 0 ); - - otable = new GraphClass(); - - otable->SetRes( 320, 240 ); - - while( 1 ) - { - tile = (TILE*)otable->GetNextPri(); - setTile( tile ); - setXY0( tile, 32, 32 ); - setWH( tile, 128, 128 ); - setRGB0( tile, 255, 255, 0 ); - addPrim( otable->GetOt(), tile ); - otable->IncPri( sizeof(TILE) ); - - otable->Display(); + setRGB0(&_draw[1], r, g, b); + _draw[1].isbg = 1; + _draw[1].dtd = 1; + + PutDispEnv(&_disp[0]); + PutDrawEnv(&_draw[0]); +} + +void RenderContext::flip(void) { + DrawSync(0); + VSync(0); + + _db ^= 1; + + PutDispEnv(&_disp[_db]); + PutDrawEnv(&_draw[_db]); + + DrawOTag(_ot[_db ^ 1] + _ot_count - 1); + ClearOTagR(_ot[_db], _ot_count); + + _nextpri = _pri[_db]; +} + +/* Main */ + +static constexpr int SCREEN_XRES = 320; +static constexpr int SCREEN_YRES = 240; + +static constexpr int BGCOLOR_R = 63; +static constexpr int BGCOLOR_G = 0; +static constexpr int BGCOLOR_B = 127; + +int main(int argc, const char **argv) { + ResetGraph(0); + SetDispMask(1); + + RenderContext ctx; + ctx.setupBuffers(SCREEN_XRES, SCREEN_YRES, BGCOLOR_R, BGCOLOR_G, BGCOLOR_B); + + int x = 0, y = 0; + int dx = 1, dy = 1; + + for (;;) { + // Update the position and velocity of the bouncing square. + if (x < 0 || x > (SCREEN_XRES - 64)) + dx = -dx; + if (y < 0 || y > (SCREEN_YRES - 64)) + dy = -dy; + + x += dx; + y += dy; + + // Draw the square. + auto tile = ctx.addPrimitive<TILE>(); + setTile(tile); + setXY0 (tile, x, y); + setWH (tile, 64, 64); + setRGB0(tile, 255, 255, 0); + + ctx.flip(); } - - return( 0 ); - -} /* main */
\ No newline at end of file + + return 0; +} |
