#define SDL_MAIN_USE_CALLBACKS 1 #include #include #include #include #include #include #include #include "globals.hpp" #include "math.hpp" #include "renderer/camera.hpp" #include "renderer/calls.hpp" #include "player.hpp" static SDL_Window *window = NULL; static SDL_Renderer *renderer = NULL; DeltaVector2 temp1(125, 150), temp2(150, 120), temp3(100, 100); DeltaVector2 topleft, bottomright, p; Player player = Player(200, -200, 20); double prev = 0, now = 0, deltaTime; SDL_Surface* backbuffer = NULL; std::vector triangles; SDL_Texture* gpuTexture = NULL; SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) { SDL_HideCursor(); SDL_SetAppMetadata("delta engine game", "0.0", "com.miletici.game"); if (!SDL_Init(SDL_INIT_VIDEO)) { SDL_Log("Couldn't initialize SDL: %s", SDL_GetError()); return SDL_APP_FAILURE; } if (!SDL_CreateWindowAndRenderer("game", SIMULATED_WIDTH, SIMULATED_HEIGHT, 0, &window, &renderer)) { SDL_Log("Couldn't create window/renderer: %s", SDL_GetError()); return SDL_APP_FAILURE; } SDL_SetWindowRelativeMouseMode(window, true); SDL_SetRenderLogicalPresentation(renderer, SIMULATED_WIDTH, SIMULATED_HEIGHT, SDL_LOGICAL_PRESENTATION_LETTERBOX); triangles.push_back({ {40, 10, 200}, {40, 210, 0}, {40, 10, 0} , {0, 0}, {1, 1}, {0, 1}}); triangles.push_back({ {40, 210, 200}, {40, 210, 0}, {40, 10, 200}, {1, 0}, {1, 1}, {0, 0} }); backbuffer = SDL_CreateSurface(SIMULATED_WIDTH, SIMULATED_HEIGHT, SDL_PIXELFORMAT_ARGB8888); gpuTexture = SDL_CreateTexture( renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, SIMULATED_WIDTH, SIMULATED_HEIGHT ); SDL_SetRenderVSync(renderer, 1); return SDL_APP_CONTINUE; /* carry on with the program! */ } SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) { if (event->type == SDL_EVENT_QUIT) { return SDL_APP_SUCCESS; } if (event->type == SDL_EVENT_MOUSE_MOTION) { player.angle.x += event->motion.xrel / 100; player.angle.y += event->motion.yrel / 100; } if (event->type == SDL_EVENT_KEY_DOWN) { if (event->key.scancode == SDL_SCANCODE_ESCAPE) return SDL_APP_SUCCESS; } return SDL_APP_CONTINUE; } SDL_AppResult SDL_AppIterate(void *appstate) { now = ((double)SDL_GetTicks()) / 1000.0; deltaTime = now - prev; SDL_SetWindowTitle(window, std::to_string((int)(1 / deltaTime)).c_str()); player.update(deltaTime); // drawing starts here SDL_FillSurfaceRect(backbuffer, NULL, 0xFF000000); // SDL_SetRenderDrawColor(renderer, 255, 0, 255, SDL_ALPHA_OPAQUE); // rasterizeTriangle(renderer, temp1, temp2, temp3); // DeltaVector2 rendered = player.camera.projectPointVec({ 40, 10, 30 }); // SDL_RenderPoint(renderer, rendered.x, rendered.y); // rendered = player.camera.projectPointVec({ 40, 210, 30 }); // SDL_RenderPoint(renderer, rendered.x, rendered.y); // rendered = player.camera.projectPointVec({ 40, 10, -170 }); // SDL_RenderPoint(renderer, rendered.x, rendered.y); // rendered = player.camera.projectPointVec({ 40, 210, -170 }); // SDL_RenderPoint(renderer, rendered.x, rendered.y); if (SDL_MUSTLOCK(backbuffer)) { SDL_LockSurface(backbuffer); } DeltaTriangle triangle1, triangle2; for (auto triangle : triangles) { // DeltaVector2 pointA = player.camera.projectPointVec(triangle.a), pointB = player.camera.projectPointVec(triangle.b), pointC = player.camera.projectPointVec(triangle.c); DeltaTriangle2D out1, out2; int numtriangles = player.camera.projectTriangle({ triangle.a, triangle.b, triangle.c }, out1, out2); // SDL_Log(std::to_string(numtriangles).c_str()); if (numtriangles == 1) { // rasterizeTriangleFast(backbuffer, out1.a, out1.b, out1.c, SDLColorToUint32({ 255, 0, 0, 255 })); // rasterizeTriangleFast(backbuffer, out1.c, out1.b, out1.a, SDLColorToUint32({ 0, 0, 255, 255 })); rasterizeTriangleSurface(backbuffer, out1.a, out1.b, out1.c, SDLColorToUint32({ 0, 255, 0, 255 }), triangle.uva.x, triangle.uva.y, triangle.uvb.x, triangle.uvb.y, triangle.uvc.x, triangle.uvc.y); // SDL_Log(std::to_string(triangle.a.y).c_str()); // SDL_Log(std::to_string(triangle.b.y).c_str()); // SDL_Log(std::to_string(triangle.c.y).c_str()); } if (numtriangles == 2) { // rasterizeTriangleFast(backbuffer, out1.a, out1.b, out1.c, SDLColorToUint32({ 255, 0, 0, 255 })); rasterizeTriangleSurface(backbuffer, out1.a, out1.b, out1.c, SDLColorToUint32({ 0, 255, 0, 255 }), triangle.uva.x, triangle.uva.y, triangle.uvb.x, triangle.uvb.y, triangle.uvc.x, triangle.uvc.y); // rasterizeTriangleFast(backbuffer, out1.c, out1.b, out1.a, SDLColorToUint32({ 0, 255, 0, 255 })); rasterizeTriangleSurface(backbuffer, out2.a, out2.b, out2.c, SDLColorToUint32({ 0, 255, 0, 255 }), triangle.uva.x, triangle.uva.y, triangle.uvb.x, triangle.uvb.y, triangle.uvc.x, triangle.uvc.y); } // int intersected = clipTriangleAgainstNearPlane(0.1, { triangle.a, triangle.b, triangle.c }, triangle1, triangle2); // rasterizeTriangleFast(backbuffer, pointA, pointB, pointC, SDLColorToUint32({ 255, 0, 0, 255 })); // if (intersected == 0) continue; // rasterizeTriangleFast(backbuffer, pointA, pointB, pointC, SDLColorToUint32({ 255, 0, 0, 255 })); // SDL_Log("==="); } SDL_Log("====="); if (SDL_MUSTLOCK(backbuffer)) { SDL_UnlockSurface(backbuffer); } // for (int y = 0; y < SIMULATED_HEIGHT; y++) { // for (int x = 0; x < SIMULATED_WIDTH; x++) { // setPixel(backbuffer, x, y, SDLColorToUint32({ 255, 0, 0 })); // } // } SDL_UpdateTexture(gpuTexture, NULL, backbuffer->pixels, backbuffer->pitch); SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); SDL_RenderClear(renderer); SDL_RenderTexture(renderer, gpuTexture, NULL, NULL); SDL_RenderPresent(renderer); prev = now; return SDL_APP_CONTINUE; } void SDL_AppQuit(void *appstate, SDL_AppResult result) { }