Files
deltaengine/src/main.cpp
T
2026-02-21 16:28:09 +01:00

172 lines
6.2 KiB
C++

#define SDL_MAIN_USE_CALLBACKS 1
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
#include <float.h>
#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<DeltaRenderTriangle> 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)
{
}