Browse Source

drawH/VLine should now work fine in all conditions.

Godzil 3 years ago
parent
commit
7a93dec54d
3 changed files with 31 additions and 25 deletions
  1. 19 15
      source/display.c
  2. 8 8
      source/include/display.h
  3. 4 2
      source/main.c

+ 19 - 15
source/display.c

@@ -23,8 +23,8 @@ SDL_Window *window = NULL;
 SDL_Renderer *renderer = NULL;
 uint32_t *frameBuffer = NULL;
 SDL_Texture *frameBufferTexture = NULL;
-uint32_t windowWidth = 800;
-uint32_t windowHeight = 600;
+int32_t windowWidth = 800;
+int32_t windowHeight = 600;
 
 /***********************************************************************************************************************
  * Functions
@@ -110,12 +110,14 @@ void drawPixel(uint32_t x, uint32_t y, uint32_t colour)
     }
 }
 
-void drawVLine(uint32_t x, uint32_t y0, uint32_t y1, uint32_t colour)
+void drawVLine(int32_t x, int32_t y0, int32_t y1, uint32_t colour)
 {
     uint32_t i;
     if (y0 > y1) { i = y1; y1 = y0; y0 = i; }
 
-    if ((x < 0) || (x > windowWidth))
+    if ( ((x < 0) || (x > windowWidth)) ||
+         ((y0 < 0) && (y1 < 0)) ||
+         ((y0 > windowHeight) && (y1 > windowHeight)) )
     {
         return;
     }
@@ -131,12 +133,14 @@ void drawVLine(uint32_t x, uint32_t y0, uint32_t y1, uint32_t colour)
     }
 }
 
-void drawHLine(uint32_t x0, uint32_t y, uint32_t x1, uint32_t colour)
+void drawHLine(int32_t x0, int32_t y, int32_t x1, uint32_t colour)
 {
     uint32_t i;
     if (x0 > x1) { i = x1; x1 = x0; x0 = i; }
 
-    if ((y < 0) || (y > windowHeight))
+    if ( ((y < 0) || (y > windowHeight)) ||
+         ((x0 < 0) && (x1 < 0)) ||
+         ((x0 > windowWidth) && (x1 > windowWidth)) )
     {
         return;
     }
@@ -152,7 +156,7 @@ void drawHLine(uint32_t x0, uint32_t y, uint32_t x1, uint32_t colour)
     }
 }
 
-void clearFrameBuffer(uint32_t colour)
+void clearFrameBuffer(int32_t colour)
 {
     uint32_t x, y;
     for (y = 0 ; y < windowHeight ; y++)
@@ -166,7 +170,7 @@ void clearFrameBuffer(uint32_t colour)
 
 void drawGrid(int spacing, uint32_t colour)
 {
-    uint32_t x, y;
+    int32_t x, y;
     for (y = 0 ; y < windowHeight ; y++)
     {
         for (x = 0 ; x < windowWidth ; x++)
@@ -179,7 +183,7 @@ void drawGrid(int spacing, uint32_t colour)
     }
 }
 
-void drawRectangle(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t colour)
+void drawRectangle(int32_t x, int32_t y, int32_t w, uint32_t h, uint32_t colour)
 {
     uint32_t j;
 
@@ -190,11 +194,11 @@ void drawRectangle(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t colo
 }
 
 /* FIXME: Some out of screen line may render weirdly. Will fix that later */
-void drawLine(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t colour)
+void drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t colour)
 {
     int i;
-    int32_t deltaX = (int32_t)x1 - (int32_t)x0;
-    int32_t deltaY = (int32_t)y1 - (int32_t)y0;
+    int32_t deltaX = x1 - x0;
+    int32_t deltaY = y1 - y0;
 
     int32_t sideLength = ( abs(deltaX) >= abs(deltaY) ) ? abs(deltaX) : abs(deltaY);
 
@@ -211,8 +215,8 @@ void drawLine(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t colou
     }
     else
     {
-        double currentX = (int32_t)x0;
-        double currentY = (int32_t)y0;
+        double currentX = x0;
+        double currentY = y0;
 
         for (i = 0 ; i < sideLength ; i++)
         {
@@ -223,7 +227,7 @@ void drawLine(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t colou
     }
 }
 
-void drawTriangle(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2, uint32_t colour)
+void drawTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t colour)
 {
     drawLine(x0, y0, x1, y1, colour);
     drawLine(x1, y1, x2, y2, colour);

+ 8 - 8
source/include/display.h

@@ -26,8 +26,8 @@ extern SDL_Window *window;
 extern SDL_Renderer *renderer;
 extern uint32_t *frameBuffer;
 extern SDL_Texture *frameBufferTexture;
-extern uint32_t windowWidth;
-extern uint32_t windowHeight;
+extern int32_t windowWidth;
+extern int32_t windowHeight;
 
 /***********************************************************************************************************************
  * Prototypes
@@ -41,12 +41,12 @@ void renderFrameBuffer();
 /* --- Drawing functions --- */
 void drawPixel(uint32_t x, uint32_t y, uint32_t colour);
 
-void clearFrameBuffer(uint32_t colour);
+void clearFrameBuffer(int32_t colour);
 void drawGrid(int spacing, uint32_t colour);
-void drawRectangle(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t colour);
-void drawVLine(uint32_t x, uint32_t y0, uint32_t y1, uint32_t colour);
-void drawHLine(uint32_t x0, uint32_t y, uint32_t x1, uint32_t colour);
-void drawLine(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t colour);
-void drawTriangle(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2, uint32_t colour);
+void drawRectangle(int32_t x, int32_t y, int32_t w, uint32_t h, uint32_t colour);
+void drawVLine(int32_t x, int32_t y0, int32_t y1, uint32_t colour);
+void drawHLine(int32_t x0, int32_t y, int32_t x1, uint32_t colour);
+void drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t colour);
+void drawTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t colour);
 
 #endif /* THREEDENGINE_SOURCE_INCLUDE_DISPLAY_H */

+ 4 - 2
source/main.c

@@ -94,9 +94,11 @@ vec2_t orthographicPointProjection(vec3_t point)
 vec2_t perspectivePointProjection(vec3_t point)
 {
     vec2_t ret;
+    double divisor = point.z;
+    if (divisor == 0) { divisor += 0.00001; }
 
-    ret.x = (point.x/point.z) * (fovFactor/2.);
-    ret.y = (point.y/point.z) * (fovFactor/2.);
+    ret.x = (point.x / divisor) * (fovFactor/2.);
+    ret.y = (point.y / divisor) * (fovFactor/2.);
 
     return ret;
 }