aboutsummaryrefslogtreecommitdiff
path: root/examples/beginner/cppdemo/main.cpp
diff options
context:
space:
mode:
authorspicyjpeg <thatspicyjpeg@gmail.com>2023-05-11 19:11:35 +0200
committerspicyjpeg <thatspicyjpeg@gmail.com>2023-05-11 19:11:35 +0200
commit3b696fc431a9c3f2aa7ea4f27aec20ce5dd67859 (patch)
tree3cf2dc24f38ad1b532f0ec913c3604d334e79872 /examples/beginner/cppdemo/main.cpp
parentca6b54f3c15a7b00a5ede64ba452f2955a421a1e (diff)
downloadpsn00bsdk-3b696fc431a9c3f2aa7ea4f27aec20ce5dd67859.tar.gz
Add C++ standard library headers, update beginner/cppdemo
Diffstat (limited to 'examples/beginner/cppdemo/main.cpp')
-rw-r--r--examples/beginner/cppdemo/main.cpp274
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;
+}