From a78ac08d576cab343b20fe991bf196b51a20f74e Mon Sep 17 00:00:00 2001 From: Dylan Missuwe Date: Wed, 19 Jan 2022 19:52:24 +0100 Subject: [PATCH 1/6] added a rotating 3d wireframe to the main demo file --- examples-api-use/demo-main.cc | 222 +++++++++++++++++++++++++++------- 1 file changed, 177 insertions(+), 45 deletions(-) diff --git a/examples-api-use/demo-main.cc b/examples-api-use/demo-main.cc index a055dfe9c..02ced66cb 100644 --- a/examples-api-use/demo-main.cc +++ b/examples-api-use/demo-main.cc @@ -53,6 +53,133 @@ class DemoRunner { * class DemoRunner to generate new frames. */ +// Simple 3d wireframe generator +class WireCube : public DemoRunner { +public: + WireCube(Canvas *m) : DemoRunner(m) {} + + void Run() override + { + while(!interrupt_received) + { + //you can define your own shape here if you want + //(x, y, z) + double verts[8*3] = { + -1,-1,-1, //0 4---------5 ^ +z + -1,-1, 1, //1 /| /| | + -1, 1,-1, //2 6-|-------7 | | + -1, 1, 1, //3 | | | | | + 1,-1,-1, //4 | | | | o--------> +x + 1,-1, 1, //5 | 0---------1 + 1, 1,-1, //6 |/ |/ + 1, 1, 1 //7 2---------3 + }; + + uint16_t faces[6*4] = { + 4,6,7,5, + 6,2,3,7, + 7,3,1,5, + 5,1,0,4, + 4,0,2,6, + 0,2,3,1, + }; + + // create smooth color transitions + int red = sin(freq*k + rad/3*1) * 128 + 127; + int grn = sin(freq*k + rad/3*2) * 128 + 127; + int blu = sin(freq*k + rad/3*3) * 128 + 127; + + // draw complete mesh with rotated vertices and color + int faceSize = sizeof(faces)/sizeof(faces[0]); + drawMesh(rotate(verts,8,k,k/3,k/2), faces,faceSize/4, red, grn, blu); + + // sleep and then clear canvas + usleep(20*1000); + canvas()->Fill(0,0,0); + k+=0.05; + } + } + +private: + FrameCanvas *off_screen_canvas_; + + double k = 0; + double zoom = canvas()->width(); + double freq = 0.1; //color changing frequency + double camDist = 4.0; //distance the camera is to the wireframe + double pi = 3.14159265; + double rad = 2*pi; + + void drawMesh(double verts[], uint16_t faces[],int faceCnt, int r, int g, int b) + { + // get center of the matrix + const int cx = canvas()->width()/2; + const int cy = canvas()->height()/2; + + // for every face + for (int i=0; i)\n" "\t9 - Volume bars (-m )\n" "\t10 - Evolution of color (-m )\n" - "\t11 - Brightness pulse generator\n"); + "\t11 - Brightness pulse generator\n" + "\t12 - Rotating 3d cube\n"); fprintf(stderr, "Example:\n\t%s -D 1 runtext.ppm\n" "Scrolls the runtext until Ctrl-C is pressed\n", progname); return 1; @@ -1112,60 +1240,64 @@ int main(int argc, char *argv[]) { // the matrix continuously. DemoRunner *demo_runner = NULL; switch (demo) { - case 0: - demo_runner = new RotatingBlockGenerator(canvas); - break; - - case 1: - case 2: - if (demo_parameter) { - ImageScroller *scroller = new ImageScroller(matrix, - demo == 1 ? 1 : -1, - scroll_ms); - if (!scroller->LoadPPM(demo_parameter)) + case 0: + demo_runner = new RotatingBlockGenerator(canvas); + break; + + case 1: + case 2: + if (demo_parameter) { + ImageScroller *scroller = new ImageScroller(matrix, + demo == 1 ? 1 : -1, + scroll_ms); + if (!scroller->LoadPPM(demo_parameter)) + return 1; + demo_runner = scroller; + } else { + fprintf(stderr, "Demo %d Requires PPM image as parameter\n", demo); return 1; - demo_runner = scroller; - } else { - fprintf(stderr, "Demo %d Requires PPM image as parameter\n", demo); - return 1; - } - break; + } + break; - case 3: - demo_runner = new SimpleSquare(canvas); - break; + case 3: + demo_runner = new SimpleSquare(canvas); + break; - case 4: - demo_runner = new ColorPulseGenerator(matrix); - break; + case 4: + demo_runner = new ColorPulseGenerator(matrix); + break; - case 5: - demo_runner = new GrayScaleBlock(canvas); - break; + case 5: + demo_runner = new GrayScaleBlock(canvas); + break; - case 6: - demo_runner = new Sandpile(canvas, scroll_ms); - break; + case 6: + demo_runner = new Sandpile(canvas, scroll_ms); + break; - case 7: - demo_runner = new GameLife(canvas, scroll_ms); - break; + case 7: + demo_runner = new GameLife(canvas, scroll_ms); + break; - case 8: - demo_runner = new Ant(canvas, scroll_ms); - break; + case 8: + demo_runner = new Ant(canvas, scroll_ms); + break; - case 9: - demo_runner = new VolumeBars(canvas, scroll_ms, canvas->width()/2); - break; + case 9: + demo_runner = new VolumeBars(canvas, scroll_ms, canvas->width()/2); + break; - case 10: - demo_runner = new GeneticColors(canvas, scroll_ms); - break; + case 10: + demo_runner = new GeneticColors(canvas, scroll_ms); + break; - case 11: - demo_runner = new BrightnessPulseGenerator(matrix); - break; + case 11: + demo_runner = new BrightnessPulseGenerator(matrix); + break; + + case 12: + demo_runner = new WireCube(canvas); + break; } if (demo_runner == NULL) From b3e20871c562aabba2acfab4adefb7d930a6653a Mon Sep 17 00:00:00 2001 From: Dylan Missuwe Date: Wed, 19 Jan 2022 20:35:45 +0100 Subject: [PATCH 2/6] updated formating and readme --- examples-api-use/README.md | 1 + examples-api-use/demo-main.cc | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/examples-api-use/README.md b/examples-api-use/README.md index 24cda4108..0d960691c 100644 --- a/examples-api-use/README.md +++ b/examples-api-use/README.md @@ -51,6 +51,7 @@ Demos, choosen with -D 9 - Volume bars (-m ) 10 - Evolution of color (-m ) 11 - Brightness pulse generator + 12 - Colorful rotating 3d cube Example: ./demo -D 1 runtext.ppm Scrolls the runtext until Ctrl-C is pressed diff --git a/examples-api-use/demo-main.cc b/examples-api-use/demo-main.cc index 02ced66cb..dadf168f6 100644 --- a/examples-api-use/demo-main.cc +++ b/examples-api-use/demo-main.cc @@ -65,14 +65,14 @@ class WireCube : public DemoRunner { //you can define your own shape here if you want //(x, y, z) double verts[8*3] = { - -1,-1,-1, //0 4---------5 ^ +z - -1,-1, 1, //1 /| /| | - -1, 1,-1, //2 6-|-------7 | | - -1, 1, 1, //3 | | | | | - 1,-1,-1, //4 | | | | o--------> +x - 1,-1, 1, //5 | 0---------1 - 1, 1,-1, //6 |/ |/ - 1, 1, 1 //7 2---------3 + -1,-1,-1, //0 4---------5 ^ +z + -1,-1, 1, //1 /| /| | + -1, 1,-1, //2 6-|-------7 | | + -1, 1, 1, //3 | | | | | + 1,-1,-1, //4 | | | | o--------> +x + 1,-1, 1, //5 | 0---------1 + 1, 1,-1, //6 |/ |/ + 1, 1, 1 //7 2---------3 }; uint16_t faces[6*4] = { @@ -1177,7 +1177,7 @@ static int usage(const char *progname) { "\t9 - Volume bars (-m )\n" "\t10 - Evolution of color (-m )\n" "\t11 - Brightness pulse generator\n" - "\t12 - Rotating 3d cube\n"); + "\t12 - Colorful rotating 3d cube\n"); fprintf(stderr, "Example:\n\t%s -D 1 runtext.ppm\n" "Scrolls the runtext until Ctrl-C is pressed\n", progname); return 1; From 4a4515f4781b6d0e53446182fef050de1577abc2 Mon Sep 17 00:00:00 2001 From: Dylan Missuwe Date: Thu, 20 Jan 2022 02:00:58 +0000 Subject: [PATCH 3/6] further optimisations for the 3d wirecube example --- examples-api-use/demo-main.cc | 54 ++++++++++++++-------------------- examples-api-use/input-example | 0 examples-api-use/pixel-mover | 0 3 files changed, 22 insertions(+), 32 deletions(-) create mode 100755 examples-api-use/input-example create mode 100755 examples-api-use/pixel-mover diff --git a/examples-api-use/demo-main.cc b/examples-api-use/demo-main.cc index dadf168f6..319e2bb25 100644 --- a/examples-api-use/demo-main.cc +++ b/examples-api-use/demo-main.cc @@ -74,14 +74,11 @@ class WireCube : public DemoRunner { 1, 1,-1, //6 |/ |/ 1, 1, 1 //7 2---------3 }; - - uint16_t faces[6*4] = { - 4,6,7,5, - 6,2,3,7, - 7,3,1,5, - 5,1,0,4, - 4,0,2,6, - 0,2,3,1, + + uint16_t edges[12*4] = { + 0,1, 1,3, 3,2, 2,0, + 0,4, 1,5, 2,6, 3,7, + 4,5, 5,7, 7,6, 6,4, }; // create smooth color transitions @@ -90,8 +87,8 @@ class WireCube : public DemoRunner { int blu = sin(freq*k + rad/3*3) * 128 + 127; // draw complete mesh with rotated vertices and color - int faceSize = sizeof(faces)/sizeof(faces[0]); - drawMesh(rotate(verts,8,k,k/3,k/2), faces,faceSize/4, red, grn, blu); + int edgeSize = sizeof(edges)/sizeof(edges[0]); + drawMesh(rotate(verts,8,k,k/3,k/2), edges, edgeSize/2, red, grn, blu); // sleep and then clear canvas usleep(20*1000); @@ -110,34 +107,27 @@ class WireCube : public DemoRunner { double pi = 3.14159265; double rad = 2*pi; - void drawMesh(double verts[], uint16_t faces[],int faceCnt, int r, int g, int b) + void drawMesh(double verts[], uint16_t edges[],int edgeCnt, int r, int g, int b) { // get center of the matrix const int cx = canvas()->width()/2; const int cy = canvas()->height()/2; - // for every face - for (int i=0; i Date: Thu, 20 Jan 2022 02:07:19 +0000 Subject: [PATCH 4/6] Revert "further optimisations for the 3d wirecube example" This reverts commit 4a4515f4781b6d0e53446182fef050de1577abc2. --- examples-api-use/demo-main.cc | 54 ++++++++++++++++++++-------------- examples-api-use/input-example | 0 examples-api-use/pixel-mover | 0 3 files changed, 32 insertions(+), 22 deletions(-) delete mode 100755 examples-api-use/input-example delete mode 100755 examples-api-use/pixel-mover diff --git a/examples-api-use/demo-main.cc b/examples-api-use/demo-main.cc index 319e2bb25..dadf168f6 100644 --- a/examples-api-use/demo-main.cc +++ b/examples-api-use/demo-main.cc @@ -74,11 +74,14 @@ class WireCube : public DemoRunner { 1, 1,-1, //6 |/ |/ 1, 1, 1 //7 2---------3 }; - - uint16_t edges[12*4] = { - 0,1, 1,3, 3,2, 2,0, - 0,4, 1,5, 2,6, 3,7, - 4,5, 5,7, 7,6, 6,4, + + uint16_t faces[6*4] = { + 4,6,7,5, + 6,2,3,7, + 7,3,1,5, + 5,1,0,4, + 4,0,2,6, + 0,2,3,1, }; // create smooth color transitions @@ -87,8 +90,8 @@ class WireCube : public DemoRunner { int blu = sin(freq*k + rad/3*3) * 128 + 127; // draw complete mesh with rotated vertices and color - int edgeSize = sizeof(edges)/sizeof(edges[0]); - drawMesh(rotate(verts,8,k,k/3,k/2), edges, edgeSize/2, red, grn, blu); + int faceSize = sizeof(faces)/sizeof(faces[0]); + drawMesh(rotate(verts,8,k,k/3,k/2), faces,faceSize/4, red, grn, blu); // sleep and then clear canvas usleep(20*1000); @@ -107,27 +110,34 @@ class WireCube : public DemoRunner { double pi = 3.14159265; double rad = 2*pi; - void drawMesh(double verts[], uint16_t edges[],int edgeCnt, int r, int g, int b) + void drawMesh(double verts[], uint16_t faces[],int faceCnt, int r, int g, int b) { // get center of the matrix const int cx = canvas()->width()/2; const int cy = canvas()->height()/2; - // for every edge - for (int i=0;i Date: Thu, 20 Jan 2022 02:10:39 +0000 Subject: [PATCH 5/6] further optimisations for the 3d wirecube example --- examples-api-use/demo-main.cc | 76 +++++++++++++++-------------------- 1 file changed, 33 insertions(+), 43 deletions(-) diff --git a/examples-api-use/demo-main.cc b/examples-api-use/demo-main.cc index dadf168f6..361d64201 100644 --- a/examples-api-use/demo-main.cc +++ b/examples-api-use/demo-main.cc @@ -74,25 +74,22 @@ class WireCube : public DemoRunner { 1, 1,-1, //6 |/ |/ 1, 1, 1 //7 2---------3 }; - - uint16_t faces[6*4] = { - 4,6,7,5, - 6,2,3,7, - 7,3,1,5, - 5,1,0,4, - 4,0,2,6, - 0,2,3,1, + + uint16_t edges[12*4] = { + 0,1, 1,3, 3,2, 2,0, + 0,4, 1,5, 2,6, 3,7, + 4,5, 5,7, 7,6, 6,4, }; - + // create smooth color transitions int red = sin(freq*k + rad/3*1) * 128 + 127; int grn = sin(freq*k + rad/3*2) * 128 + 127; int blu = sin(freq*k + rad/3*3) * 128 + 127; - + // draw complete mesh with rotated vertices and color - int faceSize = sizeof(faces)/sizeof(faces[0]); - drawMesh(rotate(verts,8,k,k/3,k/2), faces,faceSize/4, red, grn, blu); - + int edgeSize = sizeof(edges)/sizeof(edges[0]); + drawMesh(rotate(verts,8,k,k/3,k/2), edges, edgeSize/2, red, grn, blu); + // sleep and then clear canvas usleep(20*1000); canvas()->Fill(0,0,0); @@ -110,34 +107,27 @@ class WireCube : public DemoRunner { double pi = 3.14159265; double rad = 2*pi; - void drawMesh(double verts[], uint16_t faces[],int faceCnt, int r, int g, int b) + void drawMesh(double verts[], uint16_t edges[],int edgeCnt, int r, int g, int b) { // get center of the matrix const int cx = canvas()->width()/2; const int cy = canvas()->height()/2; - - // for every face - for (int i=0; i Date: Thu, 20 Jan 2022 17:23:05 +0100 Subject: [PATCH 6/6] Update demo-main.cc --- examples-api-use/demo-main.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples-api-use/demo-main.cc b/examples-api-use/demo-main.cc index 361d64201..b32375700 100644 --- a/examples-api-use/demo-main.cc +++ b/examples-api-use/demo-main.cc @@ -65,14 +65,14 @@ class WireCube : public DemoRunner { //you can define your own shape here if you want //(x, y, z) double verts[8*3] = { - -1,-1,-1, //0 4---------5 ^ +z + -1,-1,-1, //0 1---------5 ^ +z -1,-1, 1, //1 /| /| | - -1, 1,-1, //2 6-|-------7 | | + -1, 1,-1, //2 3-|-------7 | | -1, 1, 1, //3 | | | | | 1,-1,-1, //4 | | | | o--------> +x - 1,-1, 1, //5 | 0---------1 + 1,-1, 1, //5 | 0---------4 1, 1,-1, //6 |/ |/ - 1, 1, 1 //7 2---------3 + 1, 1, 1 //7 2---------6 }; uint16_t edges[12*4] = {