reaa
This commit is contained in:
		
							parent
							
								
									717c45260d
								
							
						
					
					
						commit
						9e26b69f7b
					
				
					 2 changed files with 56 additions and 15 deletions
				
			
		
							
								
								
									
										2
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -1,5 +1,5 @@ | ||||||
| CC = gcc | CC = gcc | ||||||
| CFLAGS = -pg -g -O2 | CFLAGS = -pg -g -O2 -Wall  | ||||||
| LDFLAGS = -pg -g  | LDFLAGS = -pg -g  | ||||||
| LDLIBS = -lraylib -lm | LDLIBS = -lraylib -lm | ||||||
| objects  = c3d.o | objects  = c3d.o | ||||||
|  |  | ||||||
							
								
								
									
										65
									
								
								c3d.c
									
										
									
									
									
								
							
							
						
						
									
										65
									
								
								c3d.c
									
										
									
									
									
								
							|  | @ -84,6 +84,8 @@ double Max(double a, double b){ | ||||||
|     return a; |     return a; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | //sort triangle verts so that point A is the "highest" point (lowest y val) and point C is the "lowest" pont (highest y val)
 | ||||||
| void Tri2DSortByY(Tri2D * t){ | void Tri2DSortByY(Tri2D * t){ | ||||||
|     Vector2 temp; |     Vector2 temp; | ||||||
|     if (t->a.y > t->b.y) { |     if (t->a.y > t->b.y) { | ||||||
|  | @ -104,7 +106,12 @@ void Tri2DSortByY(Tri2D * t){ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| //Draws triangle with a flat top. Note A and B must be the top points with C being the bottom "spike"
 | //Draws triangle with a flat top. Note A and B must be the top points with C being the bottom "spike"
 | ||||||
| void FillTopFlatZbuffer(Zee zee[][1080], Tri2D* t) { | void FillTopFlatZbuffer(Zee zee[][1080], Tri2D* t, Tri2D * tp) { | ||||||
|  |     if (t->b.x < t->a.x) { | ||||||
|  | 	Vector2 e = t->b; | ||||||
|  | 	t->b = t->a; | ||||||
|  | 	t->a = e; | ||||||
|  |     } | ||||||
|     //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 atocslopeinv = (t->c.x - t->a.x) / (t->c.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 a and c
 | ||||||
|     float btocslopinv = (t->c.x - t->b.x) / (t->c.y - t->b.y); //dif in x from start to end with b and c 
 |     float btocslopinv = (t->c.x - t->b.x) / (t->c.y - t->b.y); //dif in x from start to end with b and c 
 | ||||||
|  | @ -116,17 +123,24 @@ void FillTopFlatZbuffer(Zee zee[][1080], Tri2D* t) { | ||||||
|     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 = tp; | ||||||
| 	    } | 	    } | ||||||
| 	} | 	} | ||||||
| 	curx1 -= atocslopeinv; //subtract because we are working backwards (reason why we start with point c in slope equtn)
 | 	curx1 -= atocslopeinv; //subtract because we are working backwards (reason why we start with point c in slope equtn)
 | ||||||
| 	curx2 -= btocslopinv; | 	curx2 -= btocslopinv; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | void PrintTri2D(Tri2D t) { | ||||||
|  |     printf("{(TRI2D) A: (%f, %f), B: (%f, %f), C:(%f,%f) }\n ",t.a.x,t.a.y,t.b.x, t.b.y, t.c.x, t.c.y);  | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| //Draws triangle with a flat bottomp. 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, Tri2D * tp) { | ||||||
|  |     if (t->c.x < t->b.x) { | ||||||
|  | 	Vector2 e = t->c; | ||||||
|  | 	t->c = t->b; | ||||||
|  | 	t->b = e; | ||||||
|  |     } | ||||||
|     //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 
 | ||||||
|  | @ -138,7 +152,7 @@ void FillBottomFlatZbuffer(Zee zee[][1080], Tri2D* t) { | ||||||
|     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){ | ||||||
| 	    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 = tp; | ||||||
| 	    } | 	    } | ||||||
| 	} | 	} | ||||||
| 	curx1 += atobslopeinv; | 	curx1 += atobslopeinv; | ||||||
|  | @ -147,16 +161,38 @@ void FillBottomFlatZbuffer(Zee zee[][1080], Tri2D* t) { | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void DrawTriZuff(Zee zbuf[][1080], Tri2D t){ |  | ||||||
|     Tri2DSortByY(&t); |  | ||||||
| 
 | 
 | ||||||
|     if (t.b.y == t.c.y) { | 
 | ||||||
| 	FillBottomFlatZbuffer(zbuf,&t); | void DrawTriZuff(Zee zbuf[][1080], Tri2D * t){ | ||||||
|  |     Tri2DSortByY(t); | ||||||
|  | 
 | ||||||
|  |     if (t->b.y == t->c.y) { // if bottom of triangle is flat
 | ||||||
|  | 	FillBottomFlatZbuffer(zbuf,t,t); | ||||||
|     } |     } | ||||||
|     else if (t.a.y == t.b.y) { |     else if (t->a.y == t->b.y) { //if top of triangle is flat
 | ||||||
| 	FillTopFlatZbuffer(zbuf,&t); |  | ||||||
|     } else{ //funny split tri
 |  | ||||||
| 	 | 	 | ||||||
|  | 	FillTopFlatZbuffer(zbuf,t,t); | ||||||
|  | 
 | ||||||
|  |     } else{ //funny split tri
 | ||||||
|  | 	Vector2 v4; //v4 is the vertex on the line between a and c. It is used to split the triangle into a top and bottom
 | ||||||
|  | 	v4.y = t->b.y; | ||||||
|  | 	float slope = (float)((t->c.x) - (t->a.x)) /((float)(t->c.y - t->a.y)); //get slope in run over rise becasue we need to find x
 | ||||||
|  | 	float changeiny = (float) (t->b.y - t->a.y); | ||||||
|  | 	float officalxpos = t->a.x + (slope*changeiny); | ||||||
|  | 	v4.x = officalxpos; | ||||||
|  | 	Tri2D bottomflattrires; | ||||||
|  | 	bottomflattrires.a = t->a; | ||||||
|  | 	bottomflattrires.b = t->b; | ||||||
|  | 	bottomflattrires.c = v4; | ||||||
|  | 	bottomflattrires.color = t->color; | ||||||
|  | 	Tri2D topflattrires; | ||||||
|  | 	topflattrires.a = t->b; | ||||||
|  | 	topflattrires.b = v4; | ||||||
|  | 	topflattrires.c = t->c; | ||||||
|  | 	topflattrires.color = t->color; | ||||||
|  | 
 | ||||||
|  | 	FillBottomFlatZbuffer(zbuf, &bottomflattrires, t); | ||||||
|  | 	FillTopFlatZbuffer(zbuf, &topflattrires, t); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|      |      | ||||||
|  | @ -431,6 +467,9 @@ int main() { | ||||||
| 
 | 
 | ||||||
|      |      | ||||||
|     Tri2D blank = (Tri2D) { (Vector2){-10,-10},(Vector2){-10,-10}, (Vector2){-10,-10}}; |     Tri2D blank = (Tri2D) { (Vector2){-10,-10},(Vector2){-10,-10}, (Vector2){-10,-10}}; | ||||||
|  | 
 | ||||||
|  |     Tri2D norm =  (Tri2D){ (Vector2){500,50},(Vector2){0,0},(Vector2){250,500},GREEN}; | ||||||
|  |      | ||||||
|     while (!WindowShouldClose()) { |     while (!WindowShouldClose()) { | ||||||
| 	float frametime = GetFrameTime(); | 	float frametime = GetFrameTime(); | ||||||
| 	CtrlLocalCam(&camera,frametime); | 	CtrlLocalCam(&camera,frametime); | ||||||
|  | @ -485,6 +524,8 @@ int main() { | ||||||
| 	//FillTopFlatZbuffer(ZBuff, &fullscreentritop);
 | 	//FillTopFlatZbuffer(ZBuff, &fullscreentritop);
 | ||||||
| 	//FillBottomFlatZbuffer(ZBuff, &fullscreentribottom);
 | 	//FillBottomFlatZbuffer(ZBuff, &fullscreentribottom);
 | ||||||
| 
 | 
 | ||||||
|  | 	DrawTriZuff(ZBuff, &norm); | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	int index = 0; | 	int index = 0; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue