From 717c45260d845b1bf057d4407ab894aab0814fc4 Mon Sep 17 00:00:00 2001 From: InventorXtreme Date: Tue, 5 Dec 2023 22:49:33 -0500 Subject: [PATCH] Major optimizations. Also did some perf testing, which is contained in drawmodeperf.org --- Makefile | 2 +- c3d.c | 72 ++++++++++++++++++++++++++++++++---------------- drawmodeperf.org | 21 ++++++++++++++ 3 files changed, 70 insertions(+), 25 deletions(-) create mode 100644 drawmodeperf.org diff --git a/Makefile b/Makefile index 8c0484d..bdbe69a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ CC = gcc -CFLAGS = -pg -g +CFLAGS = -pg -g -O2 LDFLAGS = -pg -g LDLIBS = -lraylib -lm objects = c3d.o diff --git a/c3d.c b/c3d.c index 7e4ba8f..5d74f1f 100644 --- a/c3d.c +++ b/c3d.c @@ -23,10 +23,6 @@ const float half_fov = fov / 2; float proj; //HALFWIDTH / tan(half_fov) Inited later -/* - The point is now rendering, but it is in front of and behind us at the same time -*/ - struct LocalCam { Vector3 position; @@ -117,7 +113,7 @@ void FillTopFlatZbuffer(Zee zee[][1080], Tri2D* t) { double curx1 = t->c.x; double curx2 = t->c.x; - for(int scanline=t->c.y; scanline > t->a.y; scanline--){ + for(int scanline=t->c.y; scanline >= t->a.y; scanline--){ if (0 <= scanline && scanline < RENDERHEIGHT){ for (int i = Max(curx1,0); i < Min(curx2,RENDERWIDTH); i++) { zee[i][scanline].triangle = t; @@ -129,15 +125,15 @@ void FillTopFlatZbuffer(Zee zee[][1080], Tri2D* t) { } -//Draws triangle with a flat top. Note B and C must be the bottom points with A being the top "spike" +//Draws triangle with a flat bottomp. Note B and C must be the bottom points with A being the top "spike" void FillBottomFlatZbuffer(Zee zee[][1080], Tri2D* t) { //Becasue we are trying to get the x values in terms of the y values, we need inverse slope float atobslopeinv = (t->b.x - t->a.x) / (t->b.y - t->a.y); //dif in x from start to end with a and c float atocslopeinv = (t->c.x - t->a.x) / (t->c.y - t->a.y); //dif in x from start to end with b and c - //start at bottom of triangle (point c) so that we do not need to determine which vertex is on which side and increment it with its proper slope - double curx1 = t->c.x; - double curx2 = t->c.x; + //start at top of triangle (point c) so that we do not need to determine which vertex is on which side and increment it with its proper slope + double curx1 = t->a.x; + double curx2 = t->a.x; for(int scanline=t->a.y; scanline < t->c.y; scanline++){ if (0 <= scanline && scanline < RENDERHEIGHT){ @@ -385,9 +381,14 @@ int main() { printf("mh:%d mw:%d w:%d h:%d\n", mh, mw, w, h); SetWindowPosition(a.x + (0.5 * mw) - (w / 2), a.y + (0.5 * mh) - (0.5 * h)); - RenderTexture2D renderTexture = LoadRenderTexture(RENDERWIDTH,RENDERHEIGHT); + RenderTexture2D uiraylibtexture = LoadRenderTexture(RENDERWIDTH,RENDERHEIGHT); + RenderTexture2D render3dtexture = LoadRenderTexture(RENDERWIDTH,RENDERHEIGHT); + + Texture2D directaccesstex; + + // Init cube model // TODO: Load from obj @@ -424,14 +425,18 @@ int main() { Tri2D funners = (Tri2D){ (Vector2){50,50},(Vector2){500,50},(Vector2){500,500},GREEN}; Tri2D funners2 = (Tri2D){ (Vector2){600,0},(Vector2){600,500},(Vector2){1000,500},RED}; + + Tri2D fullscreentritop = (Tri2D){ (Vector2){0,0}, (Vector2){1920,0}, (Vector2){1920,1080}, BLUE}; + Tri2D fullscreentribottom = (Tri2D){ (Vector2){0,0}, (Vector2){0,1080}, (Vector2){1920,1080}, RED}; + + Tri2D blank = (Tri2D) { (Vector2){-10,-10},(Vector2){-10,-10}, (Vector2){-10,-10}}; while (!WindowShouldClose()) { float frametime = GetFrameTime(); CtrlLocalCam(&camera,frametime); LocalCamApplyVelo(&camera,frametime); - BeginTextureMode(renderTexture); //ClearBackground(BLACK); - ; + /* Vector3 TransVector = TransformWithCam(point,&camera); */ /* if (TransVector.z < 0) { */ /* Vector2 MPos = Conv3Dto2D(TransVector); */ @@ -451,16 +456,16 @@ int main() { Tri2DArrayAppend(&Tri2Darr,ConvertTriToTri2D(&TransformedTris.arr[i])); } - //memset(ZBuff,0,sizeof(ZBuff)); + memset(ZBuff,0,sizeof(ZBuff)); memset(display,0,sizeof(display)); - for (int y = 0; y < RENDERHEIGHT; y++){ - for (int x = 0; xb; display[index+3] = c->a; */ - display[index] = ZBuff[x][y].triangle->color; + + + if (ZBuff[x][y].triangle != NULL) { + //DrawPixel(x,y,ZBuff[x][y].triangle->color); + + display[index] = ZBuff[x][y].triangle->color; + } index = index+1; } } + BeginTextureMode(uiraylibtexture); + //gui stuff EndTextureMode(); + //Copytexture to main display :0 - + BeginDrawing(); ClearBackground(BLACK); - UpdateTexture(renderTexture.texture, display); - DrawTexturePro(renderTexture.texture, (Rectangle){0,0,renderTexture.texture.width,-renderTexture.texture.height},(Rectangle){0,0,SCREENWIDTH,SCREENHEIGHT},(Vector2){0,0},0,WHITE); + UpdateTexture(render3dtexture.texture, display); + + //Copies render3dtexture to screen + DrawTexturePro(render3dtexture.texture, (Rectangle){0,0,render3dtexture.texture.width, render3dtexture.texture.height}, (Rectangle){0,0,SCREENWIDTH,SCREENHEIGHT},(Vector2){0,0},0,WHITE); + + //Copies uiraylibtexture to screen (not this is not the texture used for 3d stuff + DrawTexturePro(uiraylibtexture.texture, (Rectangle){0,0,uiraylibtexture.texture.width,-uiraylibtexture.texture.height},(Rectangle){0,0,SCREENWIDTH,SCREENHEIGHT},(Vector2){0,0},0,WHITE); char fpstext[40]; sprintf(fpstext,"%d",GetFPS()); diff --git a/drawmodeperf.org b/drawmodeperf.org new file mode 100644 index 0000000..45f667c --- /dev/null +++ b/drawmodeperf.org @@ -0,0 +1,21 @@ +* Performnace compars for C3D without any real rendering, only drawing blank screen and 2D tris +** GCC with profiling and line profiling enabled. No optimization +| RenderType | Displayed on screen | Fps | +| Fill Zbuff with blank tris, do not check for null | Blank Screen | 98-100 | +| '' | Two triangles, not filled screen | 90-92 | +| '' | Two triangles, full screen | 43-44 | +| '' | Four triangles, with the two that did not fill screen being obsured | 42-43 | +| Meset Zbuff to zero, check for null TRIs | Blank Screen | 141-142 | +| '' | Two triangles, not filled screen | 115-117 | +| '' | Two triangles, full screen | 45-46 | +| '' | Four triangles, with the two that did not fill screen being obsured | 42-43 | +** GCC with profiling and line profiling enabled. -O2 flag. +| RenderType | Displayed on screen | Fps | +| Fill Zbuff with blank tris, do not check for null | Blank Screen | 151-157 | +| '' | Two triangles, not filled screen | 151-154 | +| '' | Two triangles, full screen | 121-128 | +| '' | Four triangles, with the two that did not fill screen being obsured | 120-124 | +| Meset Zbuff to zero, check for null TRIs | Blank Screen | 299-301 | +| '' | Two triangles, not filled screen | 154-155 | +| '' | Two triangles, full screen | 120-123 | +| '' | Four triangles, with the two that did not fill screen being | 118-121 |