Major optimizations. Also did some perf testing, which is contained in drawmodeperf.org
This commit is contained in:
parent
46678bd628
commit
717c45260d
2
Makefile
2
Makefile
|
@ -1,5 +1,5 @@
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -pg -g
|
CFLAGS = -pg -g -O2
|
||||||
LDFLAGS = -pg -g
|
LDFLAGS = -pg -g
|
||||||
LDLIBS = -lraylib -lm
|
LDLIBS = -lraylib -lm
|
||||||
objects = c3d.o
|
objects = c3d.o
|
||||||
|
|
72
c3d.c
72
c3d.c
|
@ -23,10 +23,6 @@ const float half_fov = fov / 2;
|
||||||
float proj; //HALFWIDTH / tan(half_fov) Inited later
|
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 {
|
struct LocalCam {
|
||||||
Vector3 position;
|
Vector3 position;
|
||||||
|
@ -117,7 +113,7 @@ void FillTopFlatZbuffer(Zee zee[][1080], Tri2D* t) {
|
||||||
double curx1 = t->c.x;
|
double curx1 = t->c.x;
|
||||||
double curx2 = 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){
|
if (0 <= scanline && scanline < RENDERHEIGHT){
|
||||||
for (int i = Max(curx1,0); i < Min(curx2,RENDERWIDTH); i++) {
|
for (int i = Max(curx1,0); i < Min(curx2,RENDERWIDTH); i++) {
|
||||||
zee[i][scanline].triangle = t;
|
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) {
|
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
|
//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 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
|
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
|
//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->c.x;
|
double curx1 = t->a.x;
|
||||||
double curx2 = t->c.x;
|
double curx2 = t->a.x;
|
||||||
|
|
||||||
for(int scanline=t->a.y; scanline < t->c.y; scanline++){
|
for(int scanline=t->a.y; scanline < t->c.y; scanline++){
|
||||||
if (0 <= scanline && scanline < RENDERHEIGHT){
|
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);
|
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));
|
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
|
// Init cube model
|
||||||
// TODO: Load from obj
|
// TODO: Load from obj
|
||||||
|
|
||||||
|
@ -424,14 +425,18 @@ int main() {
|
||||||
|
|
||||||
Tri2D funners = (Tri2D){ (Vector2){50,50},(Vector2){500,50},(Vector2){500,500},GREEN};
|
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 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}};
|
Tri2D blank = (Tri2D) { (Vector2){-10,-10},(Vector2){-10,-10}, (Vector2){-10,-10}};
|
||||||
while (!WindowShouldClose()) {
|
while (!WindowShouldClose()) {
|
||||||
float frametime = GetFrameTime();
|
float frametime = GetFrameTime();
|
||||||
CtrlLocalCam(&camera,frametime);
|
CtrlLocalCam(&camera,frametime);
|
||||||
LocalCamApplyVelo(&camera,frametime);
|
LocalCamApplyVelo(&camera,frametime);
|
||||||
BeginTextureMode(renderTexture);
|
|
||||||
//ClearBackground(BLACK);
|
//ClearBackground(BLACK);
|
||||||
;
|
|
||||||
/* Vector3 TransVector = TransformWithCam(point,&camera); */
|
/* Vector3 TransVector = TransformWithCam(point,&camera); */
|
||||||
/* if (TransVector.z < 0) { */
|
/* if (TransVector.z < 0) { */
|
||||||
/* Vector2 MPos = Conv3Dto2D(TransVector); */
|
/* Vector2 MPos = Conv3Dto2D(TransVector); */
|
||||||
|
@ -451,16 +456,16 @@ int main() {
|
||||||
Tri2DArrayAppend(&Tri2Darr,ConvertTriToTri2D(&TransformedTris.arr[i]));
|
Tri2DArrayAppend(&Tri2Darr,ConvertTriToTri2D(&TransformedTris.arr[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
//memset(ZBuff,0,sizeof(ZBuff));
|
memset(ZBuff,0,sizeof(ZBuff));
|
||||||
memset(display,0,sizeof(display));
|
memset(display,0,sizeof(display));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (int y = 0; y < RENDERHEIGHT; y++){
|
/* for (int y = 0; y < RENDERHEIGHT; y++){ */
|
||||||
for (int x = 0; x<RENDERWIDTH; x++){
|
/* for (int x = 0; x<RENDERWIDTH; x++){ */
|
||||||
ZBuff[x][y].triangle = ␣
|
/* ZBuff[x][y].triangle = ␣ */
|
||||||
}
|
/* } */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
/* for(int i = 0; i < Tri2Darr.length; i++) { */
|
/* for(int i = 0; i < Tri2Darr.length; i++) { */
|
||||||
/* for(int y = 0; y < RENDERHEIGHT; y++){ */
|
/* for(int y = 0; y < RENDERHEIGHT; y++){ */
|
||||||
|
@ -474,8 +479,13 @@ int main() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FillTopFlatZbuffer(ZBuff, &funners);
|
//FillTopFlatZbuffer(ZBuff, &funners);
|
||||||
FillBottomFlatZbuffer(ZBuff,&funners2);
|
//FillBottomFlatZbuffer(ZBuff,&funners2);
|
||||||
|
|
||||||
|
//FillTopFlatZbuffer(ZBuff, &fullscreentritop);
|
||||||
|
//FillBottomFlatZbuffer(ZBuff, &fullscreentribottom);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
for(int y = 0; y < RENDERHEIGHT; y++) {
|
for(int y = 0; y < RENDERHEIGHT; y++) {
|
||||||
|
@ -487,21 +497,35 @@ int main() {
|
||||||
display[index+2] = c->b;
|
display[index+2] = c->b;
|
||||||
display[index+3] = c->a;
|
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;
|
index = index+1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BeginTextureMode(uiraylibtexture);
|
||||||
|
//gui stuff
|
||||||
EndTextureMode();
|
EndTextureMode();
|
||||||
|
|
||||||
|
|
||||||
//Copytexture to main display :0
|
//Copytexture to main display :0
|
||||||
|
|
||||||
BeginDrawing();
|
BeginDrawing();
|
||||||
ClearBackground(BLACK);
|
ClearBackground(BLACK);
|
||||||
UpdateTexture(renderTexture.texture, display);
|
UpdateTexture(render3dtexture.texture, display);
|
||||||
DrawTexturePro(renderTexture.texture, (Rectangle){0,0,renderTexture.texture.width,-renderTexture.texture.height},(Rectangle){0,0,SCREENWIDTH,SCREENHEIGHT},(Vector2){0,0},0,WHITE);
|
|
||||||
|
//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];
|
char fpstext[40];
|
||||||
sprintf(fpstext,"%d",GetFPS());
|
sprintf(fpstext,"%d",GetFPS());
|
||||||
|
|
21
drawmodeperf.org
Normal file
21
drawmodeperf.org
Normal file
|
@ -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 |
|
Loading…
Reference in a new issue