|
@@ -16,6 +16,7 @@
|
|
|
|
|
|
#include <log.h>
|
|
|
|
|
|
+#include <3dengine.h>
|
|
|
#include <array.h>
|
|
|
#include <matrix.h>
|
|
|
#include <triangle.h>
|
|
@@ -44,13 +45,19 @@ bool displayVertex = false;
|
|
|
bool doNotCull = false;
|
|
|
bool doZBuffer = true;
|
|
|
bool doClipping = true;
|
|
|
-enum displayMode_t currentDisplayMode = DISPLAY_MODE_WIREFRAME;
|
|
|
-matrix4_t projectionMatrix;
|
|
|
-matrix4_t viewMatrix;
|
|
|
-light_t globalLight;
|
|
|
-double updateTime, renderTime, waitTime;
|
|
|
-int trianglesCount, trianglesTotal;
|
|
|
-triangle_t *projectedTriangles = NULL;
|
|
|
+bool doPerspectiveCorrection = true;
|
|
|
+
|
|
|
+static mesh_t mesh;
|
|
|
+static int windowHeight;
|
|
|
+static int windowWidth;
|
|
|
+
|
|
|
+static enum displayMode_t currentDisplayMode = DISPLAY_MODE_WIREFRAME;
|
|
|
+static matrix4_t projectionMatrix;
|
|
|
+static matrix4_t viewMatrix;
|
|
|
+static light_t globalLight;
|
|
|
+static double updateTime, renderTime, waitTime;
|
|
|
+static int trianglesCount, trianglesTotal;
|
|
|
+static triangle_t *projectedTriangles = NULL;
|
|
|
static const vec3_t origin = {0, 0, 0 };
|
|
|
|
|
|
void setup()
|
|
@@ -61,28 +68,6 @@ void setup()
|
|
|
double zNear = 1;
|
|
|
double zFar = 20;
|
|
|
|
|
|
- frameBuffer = (uint32_t *)calloc(windowWidth * windowHeight, sizeof(uint32_t));
|
|
|
- if (!frameBuffer)
|
|
|
- {
|
|
|
- Log(TLOG_PANIC, NULL, "Memory allocation error.");
|
|
|
- goto exit;
|
|
|
- }
|
|
|
-
|
|
|
- zBuffer = (double *)calloc(windowWidth * windowHeight, sizeof(double));
|
|
|
- if (!frameBuffer)
|
|
|
- {
|
|
|
- Log(TLOG_PANIC, NULL, "Memory allocation error.");
|
|
|
- goto exit;
|
|
|
- }
|
|
|
-
|
|
|
- frameBufferTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_STREAMING, windowWidth,
|
|
|
- windowHeight);
|
|
|
- if (frameBufferTexture == NULL)
|
|
|
- {
|
|
|
- Log(TLOG_PANIC, NULL, "SDL Texture creation error: %s", SDL_GetError());
|
|
|
- goto exit;
|
|
|
- }
|
|
|
-
|
|
|
projectionMatrix = mat4Perspective(aspectRatioY, FOV, zNear, zFar);
|
|
|
|
|
|
initFrustumPlanes(FOV, aspectRatioX, zNear, zFar);
|
|
@@ -92,132 +77,90 @@ void setup()
|
|
|
globalLight.direction.z = 1;
|
|
|
vec3Normalize(&globalLight.direction);
|
|
|
|
|
|
- /* Load texture */
|
|
|
- //meshTexture = (colour_t *)REDBRICK_TEXTURE;
|
|
|
- loadTextureDateFromPng("assets/f117.png");
|
|
|
-
|
|
|
-
|
|
|
/* Load object */
|
|
|
- loadOBJFile("assets/f117.obj");
|
|
|
- //loadCubeMeshData();
|
|
|
+ loadOBJFile(&mesh,"assets/f117.obj");
|
|
|
+ //loadCubeMeshData(&mesh);
|
|
|
|
|
|
- trianglesTotal = arrayGetSize(mesh.faces);
|
|
|
+ /* Load texture */
|
|
|
+ loadTextureDateFromPng(&mesh.texture, "assets/f117.png");
|
|
|
|
|
|
-exit:
|
|
|
- return;
|
|
|
+ trianglesTotal = arrayGetSize(mesh.faces);
|
|
|
}
|
|
|
|
|
|
void processInput()
|
|
|
{
|
|
|
SDL_Event event;
|
|
|
- SDL_PollEvent(&event);
|
|
|
-
|
|
|
- switch (event.type)
|
|
|
+ while(SDL_PollEvent(&event))
|
|
|
{
|
|
|
- case SDL_QUIT:isRunning = false;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDL_KEYDOWN:
|
|
|
- switch(event.key.keysym.sym)
|
|
|
+ switch (event.type)
|
|
|
{
|
|
|
- case SDLK_ESCAPE:
|
|
|
- isRunning = false;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_1:
|
|
|
- displayVertex = true;
|
|
|
- currentDisplayMode = DISPLAY_MODE_WIREFRAME;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_2:
|
|
|
- displayVertex = false;
|
|
|
- currentDisplayMode = DISPLAY_MODE_WIREFRAME;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_3:
|
|
|
- displayVertex = false;
|
|
|
- currentDisplayMode = DISPLAY_MODE_SOLID;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_4:
|
|
|
- displayVertex = false;
|
|
|
- currentDisplayMode = DISPLAY_MODE_SOLID_WIRE;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_5:
|
|
|
- displayVertex = false;
|
|
|
- currentDisplayMode = DISPLAY_MODE_TEXTURED;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_6:
|
|
|
- displayVertex = false;
|
|
|
- currentDisplayMode = DISPLAY_MODE_TEXTURED_WIRE;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_u:
|
|
|
- doNotCull = false;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_j:
|
|
|
- doNotCull = true;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_i:
|
|
|
- doPerpectiveCorrection = false;
|
|
|
+ case SDL_QUIT:isRunning = false;
|
|
|
break;
|
|
|
|
|
|
- case SDLK_k:
|
|
|
- doPerpectiveCorrection = true;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_o:
|
|
|
- doZBuffer = true;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_l:
|
|
|
- doZBuffer = false;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_y:
|
|
|
- doClipping = true;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_h:
|
|
|
- doClipping = false;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_w:
|
|
|
- camera.forwardVelocity = vec3ScalarMult(camera.direction, 5 * deltaTime);
|
|
|
- camera.position = vec3AddVectors(camera.position, camera.forwardVelocity);
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_d:
|
|
|
- camera.yawAngle += 1.0 * deltaTime;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_s:
|
|
|
- camera.forwardVelocity = vec3ScalarMult(camera.direction, 5 * deltaTime);
|
|
|
- camera.position = vec3SubVectors(camera.position, camera.forwardVelocity);
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_a:
|
|
|
- camera.yawAngle -= 1.0 * deltaTime;
|
|
|
- break;
|
|
|
-
|
|
|
- case SDLK_UP:
|
|
|
- camera.position.y += 3.0 * deltaTime;
|
|
|
+ case SDL_KEYDOWN:
|
|
|
+ switch (event.key.keysym.sym)
|
|
|
+ {
|
|
|
+ case SDLK_1:
|
|
|
+ displayVertex = true;
|
|
|
+ currentDisplayMode = DISPLAY_MODE_WIREFRAME;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_2:
|
|
|
+ displayVertex = false;
|
|
|
+ currentDisplayMode = DISPLAY_MODE_WIREFRAME;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_3:
|
|
|
+ displayVertex = false;
|
|
|
+ currentDisplayMode = DISPLAY_MODE_SOLID;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_4:
|
|
|
+ displayVertex = false;
|
|
|
+ currentDisplayMode = DISPLAY_MODE_SOLID_WIRE;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_5:
|
|
|
+ displayVertex = false;
|
|
|
+ currentDisplayMode = DISPLAY_MODE_TEXTURED;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_6:
|
|
|
+ displayVertex = false;
|
|
|
+ currentDisplayMode = DISPLAY_MODE_TEXTURED_WIRE;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_ESCAPE: isRunning = false; break;
|
|
|
+ case SDLK_u: doNotCull = false; break;
|
|
|
+ case SDLK_j: doNotCull = true; break;
|
|
|
+ case SDLK_i: doPerspectiveCorrection = false; break;
|
|
|
+ case SDLK_k: doPerspectiveCorrection = true; break;
|
|
|
+ case SDLK_o: doZBuffer = true; break;
|
|
|
+ case SDLK_l: doZBuffer = false; break;
|
|
|
+ case SDLK_y: doClipping = true; break;
|
|
|
+ case SDLK_h: doClipping = false; break;
|
|
|
+
|
|
|
+ case SDLK_w:
|
|
|
+ camera.forwardVelocity = vec3ScalarMult(camera.direction, 5 * deltaTime);
|
|
|
+ camera.position = vec3AddVectors(camera.position, camera.forwardVelocity);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_d: camera.yawAngle += 1.0 * deltaTime; break;
|
|
|
+ case SDLK_s:
|
|
|
+ camera.forwardVelocity = vec3ScalarMult(camera.direction, 5 * deltaTime);
|
|
|
+ camera.position = vec3SubVectors(camera.position, camera.forwardVelocity);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_a: camera.yawAngle -= 1.0 * deltaTime; break;
|
|
|
+ case SDLK_UP: camera.position.y += 3.0 * deltaTime; break;
|
|
|
+ case SDLK_DOWN: camera.position.y -= 3.0 * deltaTime; break;
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
- case SDLK_DOWN:
|
|
|
- camera.position.y -= 3.0 * deltaTime;
|
|
|
+ default:
|
|
|
break;
|
|
|
}
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- break;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
uint32_t getMicroSecTime()
|
|
@@ -227,7 +170,7 @@ uint32_t getMicroSecTime()
|
|
|
return ((curTime.tv_sec) * 1000 * 1000) + (curTime.tv_usec);
|
|
|
}
|
|
|
|
|
|
-static void projectTriangle(triangle_t *workTriangle, vec3_t *triangleNormal, colour_t colour)
|
|
|
+static void projectTriangle(triangle_t *workTriangle, vec3_t *triangleNormal, texture_t *texture, colour_t colour)
|
|
|
{
|
|
|
int j;
|
|
|
struct triangle_t currentTriangle = *workTriangle;
|
|
@@ -236,7 +179,6 @@ static void projectTriangle(triangle_t *workTriangle, vec3_t *triangleNormal, co
|
|
|
{
|
|
|
vec4_t projected = mat4ProdVec4Project(projectionMatrix, workTriangle->points[j]);
|
|
|
|
|
|
-
|
|
|
projected.x *= windowWidth / 2.;
|
|
|
projected.y *= windowHeight / 2.;
|
|
|
|
|
@@ -265,7 +207,7 @@ static void projectTriangle(triangle_t *workTriangle, vec3_t *triangleNormal, co
|
|
|
workTriangle->points[1].z +
|
|
|
workTriangle->points[2].z) / 3.0;
|
|
|
|
|
|
- currentTriangle.texture = meshTexture;
|
|
|
+ currentTriangle.texture = texture;
|
|
|
arrayAdd(projectedTriangles, currentTriangle);
|
|
|
}
|
|
|
|
|
@@ -304,8 +246,7 @@ void update()
|
|
|
worldMatrix = mat4ProdMat4(mat4RotationY(mesh.rotation.y), worldMatrix);
|
|
|
worldMatrix = mat4ProdMat4(mat4RotationX(mesh.rotation.x), worldMatrix);
|
|
|
worldMatrix = mat4ProdMat4(mat4Translate(mesh.translation.x, mesh.translation.y, mesh.translation.z), worldMatrix);
|
|
|
-
|
|
|
- /* Not sure for now */
|
|
|
+ /* Last apply the view matrix */
|
|
|
worldMatrix = mat4ProdMat4(viewMatrix, worldMatrix);
|
|
|
|
|
|
arrayEmpty(projectedTriangles);
|
|
@@ -327,10 +268,7 @@ void update()
|
|
|
for(j = 0; j < 3; j++)
|
|
|
{
|
|
|
transformedVertices[j] = vec4FromVec3(vertices[j]);
|
|
|
-
|
|
|
transformedVertices[j] = mat4ProdVec4(worldMatrix, transformedVertices[j]);
|
|
|
-
|
|
|
- //transformedVertices[j] = mat4ProdVec4(viewMatrix, transformedVertices[j]);
|
|
|
}
|
|
|
|
|
|
vec3_t vectorBA = vec3SubVectors(vec3FromVec4(transformedVertices[1]), vec3FromVec4(transformedVertices[0]));
|
|
@@ -366,7 +304,7 @@ void update()
|
|
|
createTriangleFromPolygon(&polygon, trianglesAfterClipping, &numberOfClippedTriangles);
|
|
|
for(j = 0; j < numberOfClippedTriangles; j++)
|
|
|
{
|
|
|
- projectTriangle(&trianglesAfterClipping[j], &triangleNormal, mesh.faces[i].colour);
|
|
|
+ projectTriangle(&trianglesAfterClipping[j], &triangleNormal, &mesh.texture, mesh.faces[i].colour);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
@@ -387,7 +325,7 @@ void update()
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- projectTriangle(&workTriangle, &triangleNormal, mesh.faces[i].colour);
|
|
|
+ projectTriangle(&workTriangle, &triangleNormal, &mesh.texture, mesh.faces[i].colour);
|
|
|
};
|
|
|
}
|
|
|
|
|
@@ -406,8 +344,8 @@ void render()
|
|
|
int i;
|
|
|
uint32_t ticks = getMicroSecTime();
|
|
|
|
|
|
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
|
|
- SDL_RenderClear(renderer);
|
|
|
+ clearFrameBuffer(MAKE_RGB(0, 0, 0));
|
|
|
+ clearZBuffer();
|
|
|
|
|
|
int triangleCount = arrayGetSize(projectedTriangles);
|
|
|
|
|
@@ -454,12 +392,9 @@ void render()
|
|
|
MAKE_RGB(255, 0, 0));
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
renderFrameBuffer();
|
|
|
- clearFrameBuffer(MAKE_RGB(0, 0, 0));
|
|
|
- clearZBuffer();
|
|
|
|
|
|
renderTime = (renderTime + (getMicroSecTime() - ticks) / 1000.) / 2.0;
|
|
|
|
|
@@ -469,8 +404,9 @@ void render()
|
|
|
drawText(5, 41, 0x11FF22, "FPS: %.1f | dT: %.3f", 1000 / (waitTime + updateTime + renderTime), deltaTime);
|
|
|
drawText(5, 53, 0x11FF22, "Triangles: %d / %d", triangleCount, trianglesTotal);
|
|
|
drawText(5, 65, 0x11FF22, "Cull: %c | PeCo: %c | ZB: %c, | CP: %c",
|
|
|
- doNotCull?'N':'Y', doPerpectiveCorrection?'Y':'N', doZBuffer?'Y':'N', doClipping?'Y':'N');
|
|
|
- SDL_RenderPresent(renderer);
|
|
|
+ doNotCull?'N':'Y', doPerspectiveCorrection ? 'Y' : 'N', doZBuffer ? 'Y' : 'N', doClipping ? 'Y' : 'N');
|
|
|
+
|
|
|
+ displayWindowRender();
|
|
|
}
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
@@ -481,6 +417,9 @@ int main(int argc, char *argv[])
|
|
|
|
|
|
Log(TLOG_ALWAYS, NULL, "Booting 3D Engine (version %s)!", VERSION);
|
|
|
|
|
|
+ windowWidth = 1024;
|
|
|
+ windowHeight = 768;
|
|
|
+
|
|
|
for (param_i = 1 ; (param_i < argc) && (argv[param_i][0] == '-') ; param_i++)
|
|
|
{
|
|
|
switch (argv[param_i][1])
|
|
@@ -497,7 +436,7 @@ int main(int argc, char *argv[])
|
|
|
}
|
|
|
no_more_params:
|
|
|
|
|
|
- isRunning = initialiseWindow(fullScreen);
|
|
|
+ isRunning = initialiseWindow(windowWidth, windowHeight, fullScreen);
|
|
|
|
|
|
setup();
|
|
|
|
|
@@ -509,8 +448,8 @@ no_more_params:
|
|
|
}
|
|
|
|
|
|
arrayFree(projectedTriangles);
|
|
|
- textureCleanup();
|
|
|
- meshFree();
|
|
|
+ textureCleanup(&mesh.texture);
|
|
|
+ meshFree(&mesh);
|
|
|
destroyWindow();
|
|
|
|
|
|
return 0;
|