diff options
Diffstat (limited to 'src/level.c')
-rw-r--r-- | src/level.c | 338 |
1 files changed, 0 insertions, 338 deletions
diff --git a/src/level.c b/src/level.c deleted file mode 100644 index 4207827..0000000 --- a/src/level.c +++ /dev/null @@ -1,338 +0,0 @@ -/* - work in progress game made using small3dlib, based on Miloslav Ciz's - quake-like level -*/ - -#include <SDL2/SDL_events.h> -#include <SDL2/SDL_mouse.h> -#include <SDL2/SDL_stdinc.h> - -#include <SDL2/SDL.h> -#include <stdio.h> -#include <time.h> - -#include "leveldefines.h" - -#include "small3dlib.h" - -#include "levelModel.h" -#include "levelTextures.h" - -S3L_Scene scene; - -S3L_Vec4 teleportPoint; - -uint32_t pixels[S3L_MAX_PIXELS]; - -uint32_t frame = 0; -uint8_t* texture = 0; -uint32_t previousTriangle = 1000; -S3L_Vec4 uv0, uv1, uv2; - -typedef struct mouse { - int x, y; - // In this case: the position where the mouse is held at - short trap; // flag for holding mouse at one place -} t_mouse; - -static t_mouse mouse; - -void clearScreen() { - memset(pixels, 255, S3L_MAX_PIXELS * sizeof(uint32_t)); -} - -static inline void setPixel(int x, - int y, - uint8_t red, - uint8_t green, - uint8_t blue) { - uint8_t* p = ((uint8_t*)pixels) + (y * S3L_resolutionX + x) * 4 + 1; - - *p = blue; - ++p; - *p = green; - ++p; - *p = red; -} - -void sampleTexture(S3L_Unit u, S3L_Unit v, uint8_t* r, uint8_t* g, uint8_t* b) { - u = (u * LEVEL_TEXTURE_WIDTH) / S3L_FRACTIONS_PER_UNIT; - v = (v * LEVEL_TEXTURE_HEIGHT) / S3L_FRACTIONS_PER_UNIT; - - u = S3L_wrap(u, LEVEL_TEXTURE_WIDTH); - v = S3L_wrap(v, LEVEL_TEXTURE_HEIGHT); - - const uint8_t* t = texture + (v * LEVEL_TEXTURE_WIDTH + u) * 3; - - *r = *t; - t++; - *g = *t; - t++; - *b = *t; -} - -void drawTeleport(int16_t x, int16_t y, S3L_ScreenCoord size) { - int16_t halfSize = size / 2; - - S3L_ScreenCoord x0 = S3L_max(0, x - halfSize); - S3L_ScreenCoord x1 = S3L_min(S3L_resolutionX, x + halfSize); - S3L_ScreenCoord y0 = S3L_max(0, y - halfSize); - S3L_ScreenCoord y1 = S3L_min(S3L_resolutionY, y + halfSize); - - S3L_ScreenCoord row = y0 - (y - halfSize); - - for (S3L_ScreenCoord j = y0; j < y1; ++j) { - S3L_ScreenCoord i0, i1; - - if (row <= halfSize) { - i0 = S3L_max(x0, x - row); - i1 = S3L_min(x1, x + row); - } else { - i0 = S3L_max(x0, x - size + row); - i1 = S3L_min(x1, x + size - row); - } - - for (S3L_ScreenCoord i = i0; i < i1; ++i) - if (rand() % 8 == 0) - setPixel(i, j, 255, 0, 0); - - row++; - } -} - -void drawPixel(S3L_PixelInfo* p) { - uint8_t r, g, b; -#if TEXTURES - if (p->triangleID != previousTriangle) { - uint8_t material = levelMaterials[p->triangleIndex]; - - switch (material) { - case 0: - texture = level1Texture; - break; - - case 1: - texture = level2Texture; - break; - - case 2: - default: - texture = level3Texture; - break; - } - - S3L_getIndexedTriangleValues(p->triangleIndex, levelUVIndices, levelUVs, - 2, &uv0, &uv1, &uv2); - previousTriangle = p->triangleID; - } - - S3L_Unit uv[2]; - - uv[0] = S3L_interpolateBarycentric(uv0.x, uv1.x, uv2.x, p->barycentric); - uv[1] = S3L_interpolateBarycentric(uv0.y, uv1.y, uv2.y, p->barycentric); - - sampleTexture(uv[0], uv[1], &r, &g, &b); -#else - switch (p->modelIndex) { - case 0: - r = 255; - g = 0; - b = 0; - break; - case 1: - r = 0; - g = 255; - b = 0; - break; - case 2: - default: - r = 0; - g = 0; - b = 255; - break; - } -#endif - -#if FOG - S3L_Unit fog = (p->depth * -#if TEXTURES - 8 -#else - 16 -#endif - ) / - S3L_FRACTIONS_PER_UNIT; - - r = S3L_clamp(((S3L_Unit)r) - fog, 0, 255); - g = S3L_clamp(((S3L_Unit)g) - fog, 0, 255); - b = S3L_clamp(((S3L_Unit)b) - fog, 0, 255); -#endif - - setPixel(p->x, p->y, r, g, b); -} - -static inline uint8_t collision(S3L_Vec4 worldPosition) -{ - worldPosition.x /= S3L_FRACTIONS_PER_UNIT; - worldPosition.z /= -S3L_FRACTIONS_PER_UNIT; - - uint16_t index = worldPosition.z * 8 + worldPosition.x; - - return collisionMap[index]; -} - -static inline void handleCollision(S3L_Vec4 *pos, S3L_Vec4 previousPos) -{ - S3L_Vec4 newPos = *pos; - newPos.x = previousPos.x; - - if (collision(newPos)) - { - newPos = *pos; - newPos.z = previousPos.z; - - if (collision(newPos)) - newPos = previousPos; - } - - *pos = newPos; -} - - -S3L_Transform3D modelTransform; -S3L_DrawConfig conf; - -clock_t nextT; - -int fps = 0; - -void draw() { - S3L_newFrame(); - - clearScreen(); - - S3L_drawScene(scene); - - S3L_Vec4 screenPoint; - - project3DPointToScreen(teleportPoint, scene.camera, &screenPoint); - - if (screenPoint.w > 0 && screenPoint.x >= 0 && - screenPoint.x < S3L_resolutionX && screenPoint.y >= 0 && - screenPoint.y < S3L_resolutionY && - screenPoint.z < S3L_zBufferRead(screenPoint.x, screenPoint.y)) - drawTeleport(screenPoint.x, screenPoint.y, screenPoint.w); - - clock_t nowT = clock(); - - double timeDiff = ((double)(nowT - nextT)) / CLOCKS_PER_SEC; - - fps++; - -#ifdef LOG_FPS - if (timeDiff >= 1.0) { - nextT = nowT; - printf("FPS: %d\n", fps); - - printf("camera: "); - S3L_logTransform3D(scene.camera.transform); - fps = 0; - } -#endif -} - -int main() { - S3L_resolutionX = 1000; - S3L_resolutionY = 600; - SDL_WarpMouseGlobal(HALF_SCREEN_WIDTH, HALF_SCREEN_HEIGHT); - - SDL_Window* window = SDL_CreateWindow( - "level demo", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, - S3L_resolutionX, S3L_resolutionY, SDL_WINDOW_SHOWN); - SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0); - SDL_Texture* texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBX8888, - SDL_TEXTUREACCESS_STATIC, - S3L_resolutionX, S3L_resolutionY); - SDL_Surface* screenSurface = SDL_GetWindowSurface(window); - SDL_Event event; - SDL_SetRelativeMouseMode(SDL_TRUE); - - teleportPoint.x = 6 * S3L_FRACTIONS_PER_UNIT; - teleportPoint.y = -3 * S3L_FRACTIONS_PER_UNIT; - teleportPoint.z = 3 * S3L_FRACTIONS_PER_UNIT / 2; - teleportPoint.w = S3L_FRACTIONS_PER_UNIT; - - nextT = clock(); - - levelModelInit(); - - S3L_sceneInit(&levelModel, 1, &scene); - - int running = 1; - - while (running) // main loop - { - int newWidth = -1, newHeight = -1; - - draw(); - SDL_UpdateTexture(texture, NULL, pixels, - S3L_resolutionX * sizeof(uint32_t)); - - while (SDL_PollEvent(&event)) { - if (event.type == SDL_QUIT) { - running = 0; - } else if (event.type == SDL_MOUSEMOTION) { - if (scene.camera.transform.rotation.x < 130 && - scene.camera.transform.rotation.x > -130) { - scene.camera.transform.rotation.x -= - S3L_clamp((S3L_Unit)event.motion.yrel, -1, 1); - } else { - scene.camera.transform.rotation.x += - (scene.camera.transform.rotation.x == 130) ? -1 : 1; - } - scene.camera.transform.rotation.y -= - S3L_clamp((S3L_Unit)event.motion.xrel, -1, 1); - } - } - - S3L_Vec4 camF, camR; - - S3L_rotationToDirections(scene.camera.transform.rotation, 50, &camF, - &camR, 0); - uint8_t coll = collision(levelModel.transform.translation); - - const uint8_t* state = SDL_GetKeyboardState(NULL); - - if (state[SDL_SCANCODE_W]) - S3L_vec3Add(&scene.camera.transform.translation, camF); - else if (state[SDL_SCANCODE_S]) - S3L_vec3Sub(&scene.camera.transform.translation, camF); - else if (state[SDL_SCANCODE_A]) - S3L_vec3Sub(&scene.camera.transform.translation, camR); - else if (state[SDL_SCANCODE_D]) - S3L_vec3Add(&scene.camera.transform.translation, camR); - - scene.camera.transform.translation.x = - scene.models[1].transform.translation.x - (cameraDirection.x) / S3L_FRACTIONS_PER_UNIT; - - scene.camera.transform.translation.z = - scene.models[1].transform.translation.z - (cameraDirection.z) / S3L_FRACTIONS_PER_UNIT; - - if (state[SDL_SCANCODE_SPACE]) - newHeight = S3L_resolutionY + 4; - else if (state[SDL_SCANCODE_I]) - newHeight = S3L_resolutionY - 4; - else if (state[SDL_SCANCODE_J]) - newWidth = S3L_resolutionX - 4; - else if (state[SDL_SCANCODE_L]) - newWidth = S3L_resolutionX + 4; - - SDL_RenderClear(renderer); - SDL_RenderCopy(renderer,texture,NULL,NULL); - SDL_RenderPresent(renderer); - - frame++; - } - - return 0; -} |