From 4ea008366dd07bc02ed60c7a79f147f45cd8d2ee Mon Sep 17 00:00:00 2001 From: Daniele Verducci Date: Sat, 14 Jan 2023 10:39:52 +0100 Subject: [PATCH] Initial commit --- v1/raycaster.py | 282 ++++++++++++ v2/assets/texture_wall.png | Bin 0 -> 24738 bytes v2/raycaster.py | 410 +++++++++++++++++ v3/assets/texture_temple.png | Bin 0 -> 24902 bytes v3/assets/texture_wall_brick.png | Bin 0 -> 24738 bytes v3/assets/texture_wall_brick_door_center.png | Bin 0 -> 21145 bytes v3/assets/texture_wall_brick_door_left.png | Bin 0 -> 24825 bytes v3/assets/texture_wall_brick_door_right.png | Bin 0 -> 24510 bytes v3/assets/texture_wall_brick_flag.png | Bin 0 -> 23426 bytes v3/raycaster.py | 458 +++++++++++++++++++ 10 files changed, 1150 insertions(+) create mode 100755 v1/raycaster.py create mode 100644 v2/assets/texture_wall.png create mode 100755 v2/raycaster.py create mode 100644 v3/assets/texture_temple.png create mode 100644 v3/assets/texture_wall_brick.png create mode 100644 v3/assets/texture_wall_brick_door_center.png create mode 100644 v3/assets/texture_wall_brick_door_left.png create mode 100644 v3/assets/texture_wall_brick_door_right.png create mode 100644 v3/assets/texture_wall_brick_flag.png create mode 100755 v3/raycaster.py diff --git a/v1/raycaster.py b/v1/raycaster.py new file mode 100755 index 0000000..67f91b7 --- /dev/null +++ b/v1/raycaster.py @@ -0,0 +1,282 @@ +#!/usr/bin/env python3 + +# RAYCASTER +# Inspired by https://www.youtube.com/watch?v=gYRrGTC7GtA +# +# pip install pysdl2 pysdl2-dll + +import sys +import sdl2.ext +import math +import time + +MAP_WIN_WIDTH = 640 +MAP_WIN_HEIGHT = 640 +RAYCAST_WIN_WIDTH = 800 +RAYCAST_WIN_HEIGHT = 480 +DUNGEON_WIDTH = MAP_WIN_WIDTH +DUNGEON_HEIGHT = MAP_WIN_HEIGHT +PLAYER_SPEED = 10 +PLAYER_ROTATION_SPEED = 0.17 +RAY_LENGTH = 100 +MAP_SCALE = 40 + +MAP = [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +] +MAP_SIZE = 16 +DOF = 2*MAP_SIZE # Depth Of Field + +class Main: + + def __init__(self): + # Check valid map + if len(MAP) != MAP_SIZE * MAP_SIZE: + raise ValueError("Map size is {}, but should be a power of {}".format(len(MAP), MAP_SIZE)) + + # Graphics + sdl2.ext.init() + self.mapWindow = sdl2.ext.Window("2D Map", size=(MAP_WIN_WIDTH, MAP_WIN_HEIGHT)) + self.mapWindow.show() + self.mapSurface = self.mapWindow.get_surface() + + self.raycastWindow = sdl2.ext.Window("3D View", size=(RAYCAST_WIN_WIDTH, RAYCAST_WIN_HEIGHT)) + self.raycastWindow.show() + self.raycastSurface = self.raycastWindow.get_surface() + + # Player + self.player_position = {"x": int(DUNGEON_WIDTH/2), "y": int(DUNGEON_HEIGHT/2), "r": 0} # r is rotation in radiants + + return + + def run(self): + lastFpsCalcTime = 0 + frames = 0 + + running = True + while running: + events = sdl2.ext.get_events() + for event in events: + if event.type == sdl2.SDL_QUIT: + running = False + break + if event.type == sdl2.SDL_KEYDOWN: + # Rotate player + if event.key.keysym.sym == sdl2.SDLK_LEFT: + self.player_position["r"] = self.player_position["r"] - PLAYER_ROTATION_SPEED + elif event.key.keysym.sym == sdl2.SDLK_RIGHT: + self.player_position["r"] = self.player_position["r"] + PLAYER_ROTATION_SPEED + + # Compute deltax and deltay based on player direction + player_delta_x = math.cos(self.player_position["r"]) * PLAYER_SPEED + player_delta_y = math.sin(self.player_position["r"]) * PLAYER_SPEED + + # Move player based on its direction + if event.key.keysym.sym == sdl2.SDLK_UP: + self.player_position["y"] = int(self.player_position["y"] + player_delta_y) + self.player_position["x"] = int(self.player_position["x"] + player_delta_x) + elif event.key.keysym.sym == sdl2.SDLK_DOWN: + self.player_position["y"] = int(self.player_position["y"] - player_delta_y) + self.player_position["x"] = int(self.player_position["x"] - player_delta_x) + + # Limit position into dungeon bounds + if self.player_position["x"] < 0: + self.player_position["x"] = 0 + if self.player_position["x"] > DUNGEON_WIDTH: + self.player_position["x"] = DUNGEON_WIDTH + if self.player_position["y"] < 0: + self.player_position["y"] = 0 + if self.player_position["y"] > DUNGEON_HEIGHT: + self.player_position["y"] = DUNGEON_HEIGHT + if self.player_position["r"] > 2*math.pi: + self.player_position["r"] = 0 + if self.player_position["r"] < 0: + self.player_position["r"] = 2*math.pi + + self.draw() + self.mapWindow.refresh() + self.raycastWindow.refresh() + + # Calculate FPS + frames = frames + 1 + if time.time() - lastFpsCalcTime > 1: + fps = frames/(time.time() - lastFpsCalcTime) + print(int(fps)) + frames = 0 + lastFpsCalcTime = time.time() + + return 0 + + def draw(self): + sdl2.ext.draw.fill(self.mapSurface, sdl2.ext.Color(0,0,0,255)) # Clears map screen + sdl2.ext.draw.fill(self.raycastSurface, sdl2.ext.Color(0,0,128,255), (0, 0, RAYCAST_WIN_WIDTH, RAYCAST_WIN_HEIGHT/2)) # Clears upper raycast screen (draws ceiling) + sdl2.ext.draw.fill(self.raycastSurface, sdl2.ext.Color(0,128,0,255), (0, RAYCAST_WIN_HEIGHT/2, RAYCAST_WIN_WIDTH, RAYCAST_WIN_HEIGHT/2)) # Clears upper raycast screen (draws floor) + + self.draw2Dmap() + self.drawPlayer() + self.drawRays() + + def drawPlayer(self): + # Player in 2D map + sdl2.ext.draw.fill(self.mapSurface, sdl2.ext.Color(0,255,0,255), (self.player_position["x"] - 2, self.player_position["y"] - 2, 4, 4)) + # Player line of sight in 2D map + ray = { + "x": int(self.player_position["x"] + math.cos(self.player_position["r"]) * 50), # deltaX + playerX + "y": int(self.player_position["y"] + math.sin(self.player_position["r"]) * 50) # deltaY + playerY + } + sdl2.ext.draw.line(self.mapSurface, sdl2.ext.Color(255,0,0,255), (self.player_position["x"], self.player_position["y"], ray["x"], ray["y"])) + + + def draw2Dmap(self): + # 2D map + for i in range(len(MAP)): + posX = i % MAP_SIZE * MAP_SCALE + posY = math.floor(i / MAP_SIZE) * MAP_SCALE + color = 0 + if MAP[i] == 1: + color = 255 + sdl2.ext.draw.fill(self.mapSurface, sdl2.ext.Color(color,color,color,255), (posX, posY, MAP_SCALE - 1, MAP_SCALE - 1)) + + def drawRays(self): + # Casts rays for raycasting + playerAngle = self.player_position["r"] + + # Cast one ray for every window pixel, from -0,5 rads to +0,5 rads (about 60° viewing angle) + for i in range(RAYCAST_WIN_WIDTH): + rayAngle = playerAngle + (i/RAYCAST_WIN_WIDTH) - 0.5 + if rayAngle < 0: + rayAngle = math.pi * 2 + rayAngle + if rayAngle > math.pi * 2: + rayAngle = rayAngle - math.pi * 2 + + # Check horizontal lines + dof = 0 # Depth of field + if rayAngle == 0 or rayAngle == math.pi: + # Looking left or right (ray will never intersect parallel lines) + rayY = self.player_position["y"] + rayX = self.player_position["x"] + DOF * MAP_SCALE + dof = DOF # Set depth of field to maximum to avoid unneeded checks + elif rayAngle > math.pi: + # Looking up + aTan = -1/math.tan(rayAngle) + rayY = (int(self.player_position["y"] / MAP_SCALE) * MAP_SCALE) - 0.00001 + rayX = (self.player_position["y"] - rayY) * aTan + self.player_position["x"] + yOffset = -MAP_SCALE + xOffset = -yOffset * aTan + else: + # Looking down + aTan = -1/math.tan(rayAngle) + rayY = (int(self.player_position["y"] / MAP_SCALE) * MAP_SCALE) + MAP_SCALE + rayX = (self.player_position["y"] - rayY) * aTan + self.player_position["x"] + yOffset = MAP_SCALE + xOffset = -yOffset * aTan + + # Check if we reached a wall + while dof < DOF: + mapX = int(rayX / MAP_SCALE) + mapY = int(rayY / MAP_SCALE) + mapArrayPosition = mapY * MAP_SIZE + mapX + if mapArrayPosition >= 0 and mapArrayPosition < MAP_SIZE*MAP_SIZE and MAP[mapArrayPosition] != 0: + dof = DOF # Hit the wall: we are done, no need to do other checks + else: + # Didn't hit the wall: check successive horizontal line + rayX = rayX + xOffset + rayY = rayY + yOffset + dof = dof + 1 + + # Save horyzontal probe rays for later comparison with vertical + horizRayX = rayX + horizRayY = rayY + + # Check vertical lines + dof = 0 # Depth of field + nTan = -math.tan(rayAngle) + xOffset = 0 + yOffset = 0 + if rayAngle == math.pi * 0.5 or rayAngle == math.pi * 1.5: + #if rayAngle == 0 or rayAngle == math.pi: + # Looking up or down (ray will never intersect vertical lines) + rayX = self.player_position["x"] + rayY = self.player_position["y"] + DOF * MAP_SCALE + dof = DOF # Set depth of field to maximum to avoid unneeded checks + elif rayAngle > math.pi * 0.5 and rayAngle < math.pi * 1.5: + # Looking left + rayX = (int(self.player_position["x"] / MAP_SCALE) * MAP_SCALE) - 0.00001 + rayY = (self.player_position["x"] - rayX) * nTan + self.player_position["y"] + xOffset = -MAP_SCALE + yOffset = -xOffset * nTan + else: + # Looking right + rayX = (int(self.player_position["x"] / MAP_SCALE) * MAP_SCALE) + MAP_SCALE + rayY = (self.player_position["x"] - rayX) * nTan + self.player_position["y"] + xOffset = MAP_SCALE + yOffset = -xOffset * nTan + + # Check if we reached a wall + while dof < DOF: + mapX = int(rayX / MAP_SCALE) + mapY = int(rayY / MAP_SCALE) + mapArrayPosition = mapY * MAP_SIZE + mapX + if mapArrayPosition >= 0 and mapArrayPosition < MAP_SIZE*MAP_SIZE-1 and MAP[mapArrayPosition] != 0: + dof = DOF # Hit the wall: we are done, no need to do other checks + else: + # Didn't hit the wall: check successive horizontal line + rayX = rayX + xOffset + rayY = rayY + yOffset + dof = dof + 1 + + horizDist = self.dist(self.player_position["x"], self.player_position["y"], horizRayX, horizRayY) + vertDist = self.dist(self.player_position["x"], self.player_position["y"], rayX, rayY) + shortestDist = vertDist + if vertDist > horizDist: + rayX = horizRayX + rayY = horizRayY + shortestDist = horizDist + + # Draw rays in 2D view + sdl2.ext.draw.line(self.mapSurface, sdl2.ext.Color(0,0,255,255), (self.player_position["x"], self.player_position["y"], rayX, rayY)) + + + # ------ Draw 3D view ------ + + # Calculate line height based on distance + lineHeight = MAP_SCALE * RAYCAST_WIN_HEIGHT / shortestDist + if lineHeight > RAYCAST_WIN_HEIGHT: + lineHeight = RAYCAST_WIN_HEIGHT + # Center line vertically in window + lineOffset = RAYCAST_WIN_HEIGHT / 2 - lineHeight / 2 + + # Simulate lighting based on wall incidence + color = sdl2.ext.Color(255,255,255,255) + if vertDist > horizDist: + color = sdl2.ext.Color(200,200,200,255) + + # Draw line + sdl2.ext.draw.line(self.raycastSurface, color, (i, int(lineOffset), i, int(lineOffset + lineHeight))) + + def dist(self, ax, ay, bx, by): + return math.sqrt((bx-ax)*(bx-ax) + (by-ay)*(by-ay)) + + + +if __name__ == '__main__': + try: + main = Main() + main.run() + except KeyboardInterrupt: + exit(0) diff --git a/v2/assets/texture_wall.png b/v2/assets/texture_wall.png new file mode 100644 index 0000000000000000000000000000000000000000..298560816b317a7f29e3ba7e61342ad12dc5f1f0 GIT binary patch literal 24738 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 MAP_WIN_WIDTH: + self.player_position["x"] = MAP_WIN_WIDTH + if self.player_position["y"] < 0: + self.player_position["y"] = 0 + if self.player_position["y"] > MAP_WIN_HEIGHT: + self.player_position["y"] = MAP_WIN_HEIGHT + if self.player_position["r"] > 2*math.pi: + self.player_position["r"] = 0 + if self.player_position["r"] < 0: + self.player_position["r"] = 2*math.pi + + self.draw() + if not MAP_HIDDEN: + self.mapWindow.refresh() + self.raycastWindow.refresh() + + # Calculate FPS + frames = frames + 1 + if time.time() - lastFpsCalcTime > 1: + fps = frames/(time.time() - lastFpsCalcTime) + print(int(fps)) + frames = 0 + lastFpsCalcTime = time.time() + + return 0 + + def movePlayerRelative(self, player_delta_x, player_delta_y): + # Prevent player from going into walls (X axis) + newPlayerX = int(self.player_position["x"] + player_delta_x) + mapX = int(newPlayerX / MAP_SCALE) + mapY = int(self.player_position["y"] / MAP_SCALE) + mapArrayPosition = mapY * MAP_SIZE + mapX + if mapArrayPosition >= 0 and mapArrayPosition < MAP_SIZE*MAP_SIZE-1 and MAP[mapArrayPosition] == 0: + # Move player (X) + self.player_position["x"] = newPlayerX + + # Prevent player from going into walls (Y axis) + newPlayerY = int(self.player_position["y"] + player_delta_y) + mapX = int(self.player_position["x"] / MAP_SCALE) + mapY = int(newPlayerY / MAP_SCALE) + mapArrayPosition = mapY * MAP_SIZE + mapX + if mapArrayPosition >= 0 and mapArrayPosition < MAP_SIZE*MAP_SIZE-1 and MAP[mapArrayPosition] == 0: + # Move player (Y) + self.player_position["y"] = newPlayerY + + def draw(self): + if not MAP_HIDDEN: + self.draw2Dmap() + self.drawPlayer() + self.drawRays() + + def drawPlayer(self): + # Player in 2D map + sdl2.ext.draw.fill(self.mapSurface, sdl2.ext.Color(0,255,0,255), (self.player_position["x"] - 2, self.player_position["y"] - 2, 4, 4)) + # Player line of sight in 2D map + ray = { + "x": int(self.player_position["x"] + math.cos(self.player_position["r"]) * 50), # deltaX + playerX + "y": int(self.player_position["y"] + math.sin(self.player_position["r"]) * 50) # deltaY + playerY + } + sdl2.ext.draw.line(self.mapSurface, sdl2.ext.Color(255,0,0,255), (self.player_position["x"], self.player_position["y"], ray["x"], ray["y"])) + + + def draw2Dmap(self): + # 2D map + sdl2.ext.draw.fill(self.mapSurface, sdl2.ext.Color(0,0,0,255)) # Clears map screen + for i in range(len(MAP)): + posX = i % MAP_SIZE * MAP_SCALE + posY = math.floor(i / MAP_SIZE) * MAP_SCALE + color = 0 + if MAP[i] > 0: + color = 255 + sdl2.ext.draw.fill(self.mapSurface, sdl2.ext.Color(color,color,color,255), (posX, posY, MAP_SCALE - 1, MAP_SCALE - 1)) + + def drawRays(self): + sdl2.ext.draw.fill(self.raycastSurface, CEILING_COLOR, (0, 0, RAYCAST_WIN_WIDTH, RAYCAST_WIN_HEIGHT/2)) # Clears upper raycast screen (draws ceiling) + sdl2.ext.draw.fill(self.raycastSurface, FLOOR_COLOR, (0, RAYCAST_WIN_HEIGHT/2, RAYCAST_WIN_WIDTH, RAYCAST_WIN_HEIGHT/2)) # Clears upper raycast screen (draws floor) + + # Casts rays for raycasting + playerAngle = self.player_position["r"] + + # Cast one ray for every window pixel, from -0,5 rads to +0,5 rads (about 60° viewing angle) + for i in range(RAYCAST_RENDER_WIDTH): + rayAngle = playerAngle + (i/RAYCAST_RENDER_WIDTH) - 0.5 + if rayAngle < 0: + rayAngle = math.pi * 2 + rayAngle + if rayAngle > math.pi * 2: + rayAngle = rayAngle - math.pi * 2 + + # Which map wall tiles have been hit by rayX and rayY + mapBlockHitX = 0 + mapBlockHitY = 0 + + # Check horizontal lines + dof = 0 # Depth of field + if rayAngle == 0 or rayAngle == math.pi: + # Looking left or right (ray will never intersect parallel lines) + rayY = self.player_position["y"] + rayX = self.player_position["x"] + DOF * MAP_SCALE + dof = DOF # Set depth of field to maximum to avoid unneeded checks + elif rayAngle > math.pi: + # Looking up + aTan = -1/math.tan(rayAngle) + rayY = (int(self.player_position["y"] / MAP_SCALE) * MAP_SCALE) - 0.00001 + rayX = (self.player_position["y"] - rayY) * aTan + self.player_position["x"] + yOffset = -MAP_SCALE + xOffset = -yOffset * aTan + else: + # Looking down + aTan = -1/math.tan(rayAngle) + rayY = (int(self.player_position["y"] / MAP_SCALE) * MAP_SCALE) + MAP_SCALE + rayX = (self.player_position["y"] - rayY) * aTan + self.player_position["x"] + yOffset = MAP_SCALE + xOffset = -yOffset * aTan + + # Check if we reached a wall + while dof < DOF: + mapX = int(rayX / MAP_SCALE) + mapY = int(rayY / MAP_SCALE) + mapArrayPosition = mapY * MAP_SIZE + mapX + if mapArrayPosition >= 0 and mapArrayPosition < MAP_SIZE*MAP_SIZE and MAP[mapArrayPosition] != 0: + dof = DOF # Hit the wall: we are done, no need to do other checks + mapBlockHitY = MAP[mapArrayPosition] # Save which map wall tile we reached + else: + # Didn't hit the wall: check successive horizontal line + rayX = rayX + xOffset + rayY = rayY + yOffset + dof = dof + 1 + + # Save horyzontal probe rays for later comparison with vertical + horizRayX = rayX + horizRayY = rayY + + # Check vertical lines + dof = 0 # Depth of field + nTan = -math.tan(rayAngle) + xOffset = 0 + yOffset = 0 + if rayAngle == math.pi * 0.5 or rayAngle == math.pi * 1.5: + #if rayAngle == 0 or rayAngle == math.pi: + # Looking up or down (ray will never intersect vertical lines) + rayX = self.player_position["x"] + rayY = self.player_position["y"] + DOF * MAP_SCALE + dof = DOF # Set depth of field to maximum to avoid unneeded checks + elif rayAngle > math.pi * 0.5 and rayAngle < math.pi * 1.5: + # Looking left + rayX = (int(self.player_position["x"] / MAP_SCALE) * MAP_SCALE) - 0.00001 + rayY = (self.player_position["x"] - rayX) * nTan + self.player_position["y"] + xOffset = -MAP_SCALE + yOffset = -xOffset * nTan + else: + # Looking right + rayX = (int(self.player_position["x"] / MAP_SCALE) * MAP_SCALE) + MAP_SCALE + rayY = (self.player_position["x"] - rayX) * nTan + self.player_position["y"] + xOffset = MAP_SCALE + yOffset = -xOffset * nTan + + # Check if we reached a wall + while dof < DOF: + mapX = int(rayX / MAP_SCALE) + mapY = int(rayY / MAP_SCALE) + mapArrayPosition = mapY * MAP_SIZE + mapX + if mapArrayPosition >= 0 and mapArrayPosition < MAP_SIZE*MAP_SIZE-1 and MAP[mapArrayPosition] != 0: + dof = DOF # Hit the wall: we are done, no need to do other checks + mapBlockHitX = MAP[mapArrayPosition] # Save which map wall tile we reached + else: + # Didn't hit the wall: check successive horizontal line + rayX = rayX + xOffset + rayY = rayY + yOffset + dof = dof + 1 + + horizDist = self.dist(self.player_position["x"], self.player_position["y"], horizRayX, horizRayY) + vertDist = self.dist(self.player_position["x"], self.player_position["y"], rayX, rayY) + shortestDist = vertDist + if vertDist > horizDist: + rayX = horizRayX + rayY = horizRayY + shortestDist = horizDist + + if not MAP_HIDDEN: + # Draw rays in 2D view + sdl2.ext.draw.line(self.mapSurface, sdl2.ext.Color(0,0,255,255), (self.player_position["x"], self.player_position["y"], rayX, rayY)) + + + # ------ Draw 3D view ------ + + # Calculate line height based on distance + lineHeight = MAP_SCALE * RAYCAST_RENDER_HEIGHT / shortestDist + # Center line vertically in window + lineOffset = RAYCAST_RENDER_HEIGHT / 2 - lineHeight / 2 + + # Draw pixels vertically from top to bottom to obtain a line + textureSegmentEnd = 0 + for textureColumnPixel in range(0, TEXTURE_SIZE): + # Calc texture segment length on screen + textureSegmentLength = lineHeight / TEXTURE_SIZE + if textureSegmentEnd == 0: + # First iteration: calculate segment start + textureSegmentStart = lineOffset + textureColumnPixel * textureSegmentLength + else: + # Next iterations: use the previous segment end (avoids rounding errors) + textureSegmentStart = textureSegmentEnd + textureSegmentEnd = textureSegmentStart + textureSegmentLength + # Obtain texture value in the pixel representing the current segment and calculate shading + if vertDist > horizDist: + texIndex = mapBlockHitY - 1 # The texture covering the selected map tile (0 is no texture, 1 is texture at self.textures[0] etc) + texColumn = int(rayX / (MAP_SCALE / TEXTURE_SIZE) % TEXTURE_SIZE) + shading = True + else: + texIndex = mapBlockHitX - 1 # The texture covering the selected map tile + texColumn = int(rayY / (MAP_SCALE / TEXTURE_SIZE) % TEXTURE_SIZE) + shading = False + + # Obtain texture pixel color + color = self.textures[texIndex][texColumn + textureColumnPixel * TEXTURE_SIZE] + # Calculate color resulting from texture pixel value + shading + if shading: + color = self.shade(color) + + # Clipping + lineEnd = textureSegmentEnd + if lineEnd > RAYCAST_RENDER_HEIGHT: + lineEnd = RAYCAST_RENDER_HEIGHT + lineStart = textureSegmentStart + if lineStart < 0: + lineStart = 0 + if lineEnd < lineStart: + continue + + # Upscaling + lineStart = lineStart * RAYCAST_RESOLUTION_SCALING + lineEnd = lineEnd * RAYCAST_RESOLUTION_SCALING + + # Draw segment + for repeat in range(1, RAYCAST_RESOLUTION_SCALING + 1): + x = i * RAYCAST_RESOLUTION_SCALING + repeat + self.drawVline(self.raycastSurface, color, x, int(lineStart), int(lineEnd)) + + def drawVline(self, surface, color, x, startY, endY): + if x < 0 or x > RAYCAST_WIN_WIDTH or startY < 0 or endY > RAYCAST_WIN_HEIGHT or endY < startY: + print("Trying to write outside bounds: vertical line with x {} from y {} to y {}".format(x, startY, endY)) + return + + startIdx = startY * RAYCAST_WIN_WIDTH + x + for idx in range(startIdx, endY * RAYCAST_WIN_WIDTH + x, RAYCAST_WIN_WIDTH): + self.raycast_u32_pixels[idx] = color + + def shade(self, color): + # Obtain channels + b = color & 0b000000000000000011111111 + g = color >> 8 & 0b000000000000000011111111 + r = color >> 16 & 0b000000000000000011111111 + # Dim channels (and limit to 255, because python doesn't have a fixed byte length) + b = (b >> 1) + g = (g >> 1) + r = (r >> 1) + # Compose color + return b + (g << 8) + (r << 16) + + def dist(self, ax, ay, bx, by): + return math.sqrt((bx-ax)*(bx-ax) + (by-ay)*(by-ay)) + + def loadTexture(self, pngFilePath): + # Loads a texture from png file and converts to sdl2-friendly format + reader = png.Reader(filename=pngFilePath) + w, h, pixels, metadata = reader.read_flat() + if metadata['alpha']: + raise ValueError("Textures with alpha channel are not supported") + if w != TEXTURE_SIZE or h != TEXTURE_SIZE: + raise ValueError("Texture {} is not {}x{}, but {}x{}".format(pngFilePath, TEXTURE_SIZE, TEXTURE_SIZE, w, h)) + # Convert to sdl2-friendly format + converted = [] + for i in range(0, len(pixels), 3): + # PNG is RGB, SDL surface is BGR + converted.append(pixels[i+2] + (pixels[i+1] << 8) + (pixels[i] << 16)) # BGR + return converted + + + +if __name__ == '__main__': + try: + main = Main() + main.run() + except KeyboardInterrupt: + exit(0) diff --git a/v3/assets/texture_temple.png b/v3/assets/texture_temple.png new file mode 100644 index 0000000000000000000000000000000000000000..eb60c063fb841fed693bfac1c319a36ffdaad2a9 GIT binary patch literal 24902 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 t&62>%tlGYIb?@xtB+% literal 0 HcmV?d00001 diff --git a/v3/assets/texture_wall_brick.png b/v3/assets/texture_wall_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..298560816b317a7f29e3ba7e61342ad12dc5f1f0 GIT binary patch literal 24738 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�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 T*5g8&00000NkvXXu0mjfru+M$ literal 0 HcmV?d00001 diff --git a/v3/assets/texture_wall_brick_door_left.png b/v3/assets/texture_wall_brick_door_left.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e5ec0f7566c5db9c8ea7a0a2ce9857163cc17d GIT binary patch literal 24825 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 IM6N<$f+Y?bf&c&j literal 0 HcmV?d00001 diff --git a/v3/assets/texture_wall_brick_door_right.png b/v3/assets/texture_wall_brick_door_right.png new file mode 100644 index 0000000000000000000000000000000000000000..f650c6969cdd11e26b2ba19651691ea3cdf7ee8d GIT binary patch literal 24510 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 MAP_WIN_WIDTH: + self.player_position["x"] = MAP_WIN_WIDTH + if self.player_position["y"] < 0: + self.player_position["y"] = 0 + if self.player_position["y"] > MAP_WIN_HEIGHT: + self.player_position["y"] = MAP_WIN_HEIGHT + if self.player_position["r"] > 2*math.pi: + self.player_position["r"] = 0 + if self.player_position["r"] < 0: + self.player_position["r"] = 2*math.pi + + # Open doors + if keystate[sdl2.SDL_SCANCODE_SPACE]: + self.openDoor() + + self.draw() + if not MAP_HIDDEN: + self.mapWindow.refresh() + self.raycastWindow.refresh() + + # Calculate FPS + frames = frames + 1 + if time.time() - lastFpsCalcTime > 1: + fps = frames/(time.time() - lastFpsCalcTime) + print(int(fps)) + frames = 0 + lastFpsCalcTime = time.time() + + return 0 + + def movePlayerRelative(self, player_delta_x, player_delta_y): + # Prevent player from going into walls (X axis) + newPlayerX = int(self.player_position["x"] + player_delta_x) + mapX = int(newPlayerX / MAP_SCALE) + mapY = int(self.player_position["y"] / MAP_SCALE) + mapArrayPosition = mapY * MAP_SIZE + mapX + if mapArrayPosition >= 0 and mapArrayPosition < MAP_SIZE*MAP_SIZE-1 and MAP[mapArrayPosition] == 0: + # Move player (X) + self.player_position["x"] = newPlayerX + + # Prevent player from going into walls (Y axis) + newPlayerY = int(self.player_position["y"] + player_delta_y) + mapX = int(self.player_position["x"] / MAP_SCALE) + mapY = int(newPlayerY / MAP_SCALE) + mapArrayPosition = mapY * MAP_SIZE + mapX + if mapArrayPosition >= 0 and mapArrayPosition < MAP_SIZE*MAP_SIZE-1 and MAP[mapArrayPosition] == 0: + # Move player (Y) + self.player_position["y"] = newPlayerY + + def draw(self): + if not MAP_HIDDEN: + self.draw2Dmap() + self.drawPlayer() + self.drawRays() + + def drawPlayer(self): + # Player in 2D map + sdl2.ext.draw.fill(self.mapSurface, sdl2.ext.Color(0,255,0,255), (self.player_position["x"] - 2, self.player_position["y"] - 2, 4, 4)) + # Player line of sight in 2D map + ray = { + "x": int(self.player_position["x"] + math.cos(self.player_position["r"]) * 50), # deltaX + playerX + "y": int(self.player_position["y"] + math.sin(self.player_position["r"]) * 50) # deltaY + playerY + } + sdl2.ext.draw.line(self.mapSurface, sdl2.ext.Color(255,0,0,255), (self.player_position["x"], self.player_position["y"], ray["x"], ray["y"])) + + + def draw2Dmap(self): + # 2D map + sdl2.ext.draw.fill(self.mapSurface, sdl2.ext.Color(0,0,0,255)) # Clears map screen + for i in range(len(MAP)): + posX = i % MAP_SIZE * MAP_SCALE + posY = math.floor(i / MAP_SIZE) * MAP_SCALE + color = 0 + if MAP[i] > 0: + color = 255 + sdl2.ext.draw.fill(self.mapSurface, sdl2.ext.Color(color,color,color,255), (posX, posY, MAP_SCALE - 1, MAP_SCALE - 1)) + + def drawRays(self): + sdl2.ext.draw.fill(self.raycastSurface, CEILING_COLOR, (0, 0, RAYCAST_WIN_WIDTH, RAYCAST_WIN_HEIGHT/2)) # Clears upper raycast screen (draws ceiling) + sdl2.ext.draw.fill(self.raycastSurface, FLOOR_COLOR, (0, RAYCAST_WIN_HEIGHT/2, RAYCAST_WIN_WIDTH, RAYCAST_WIN_HEIGHT/2)) # Clears upper raycast screen (draws floor) + + # Casts rays for raycasting + playerAngle = self.player_position["r"] + + # Cast one ray for every window pixel, from -0,5 rads to +0,5 rads (about 60° viewing angle) + for i in range(RAYCAST_RENDER_WIDTH): + rayAngle = playerAngle + (i/RAYCAST_RENDER_WIDTH) - 0.5 + if rayAngle < 0: + rayAngle = math.pi * 2 + rayAngle + if rayAngle > math.pi * 2: + rayAngle = rayAngle - math.pi * 2 + + # Which map wall tiles have been hit by rayX and rayY + mapBlockHitX = 0 + mapBlockHitY = 0 + + # Check horizontal lines + dof = 0 # Depth of field + if rayAngle == 0 or rayAngle == math.pi: + # Looking left or right (ray will never intersect parallel lines) + rayY = self.player_position["y"] + rayX = self.player_position["x"] + DOF * MAP_SCALE + dof = DOF # Set depth of field to maximum to avoid unneeded checks + elif rayAngle > math.pi: + # Looking up + aTan = -1/math.tan(rayAngle) + rayY = (int(self.player_position["y"] / MAP_SCALE) * MAP_SCALE) - 0.00001 + rayX = (self.player_position["y"] - rayY) * aTan + self.player_position["x"] + yOffset = -MAP_SCALE + xOffset = -yOffset * aTan + else: + # Looking down + aTan = -1/math.tan(rayAngle) + rayY = (int(self.player_position["y"] / MAP_SCALE) * MAP_SCALE) + MAP_SCALE + rayX = (self.player_position["y"] - rayY) * aTan + self.player_position["x"] + yOffset = MAP_SCALE + xOffset = -yOffset * aTan + + # Check if we reached a wall + while dof < DOF: + mapX = int(rayX / MAP_SCALE) + mapY = int(rayY / MAP_SCALE) + mapArrayPosition = mapY * MAP_SIZE + mapX + if mapArrayPosition >= 0 and mapArrayPosition < MAP_SIZE*MAP_SIZE and MAP[mapArrayPosition] != 0: + dof = DOF # Hit the wall: we are done, no need to do other checks + mapBlockHitY = MAP[mapArrayPosition] # Save which map wall tile we reached + else: + # Didn't hit the wall: check successive horizontal line + rayX = rayX + xOffset + rayY = rayY + yOffset + dof = dof + 1 + + # Save horyzontal probe rays for later comparison with vertical + horizRayX = rayX + horizRayY = rayY + + # Check vertical lines + dof = 0 # Depth of field + nTan = -math.tan(rayAngle) + xOffset = 0 + yOffset = 0 + if rayAngle == math.pi * 0.5 or rayAngle == math.pi * 1.5: + #if rayAngle == 0 or rayAngle == math.pi: + # Looking up or down (ray will never intersect vertical lines) + rayX = self.player_position["x"] + rayY = self.player_position["y"] + DOF * MAP_SCALE + dof = DOF # Set depth of field to maximum to avoid unneeded checks + elif rayAngle > math.pi * 0.5 and rayAngle < math.pi * 1.5: + # Looking left + rayX = (int(self.player_position["x"] / MAP_SCALE) * MAP_SCALE) - 0.00001 + rayY = (self.player_position["x"] - rayX) * nTan + self.player_position["y"] + xOffset = -MAP_SCALE + yOffset = -xOffset * nTan + else: + # Looking right + rayX = (int(self.player_position["x"] / MAP_SCALE) * MAP_SCALE) + MAP_SCALE + rayY = (self.player_position["x"] - rayX) * nTan + self.player_position["y"] + xOffset = MAP_SCALE + yOffset = -xOffset * nTan + + # Check if we reached a wall + while dof < DOF: + mapX = int(rayX / MAP_SCALE) + mapY = int(rayY / MAP_SCALE) + mapArrayPosition = mapY * MAP_SIZE + mapX + if mapArrayPosition >= 0 and mapArrayPosition < MAP_SIZE*MAP_SIZE-1 and MAP[mapArrayPosition] != 0: + dof = DOF # Hit the wall: we are done, no need to do other checks + mapBlockHitX = MAP[mapArrayPosition] # Save which map wall tile we reached + else: + # Didn't hit the wall: check successive horizontal line + rayX = rayX + xOffset + rayY = rayY + yOffset + dof = dof + 1 + + horizDist = self.dist(self.player_position["x"], self.player_position["y"], horizRayX, horizRayY) + vertDist = self.dist(self.player_position["x"], self.player_position["y"], rayX, rayY) + shortestDist = vertDist + if vertDist > horizDist: + rayX = horizRayX + rayY = horizRayY + shortestDist = horizDist + + if not MAP_HIDDEN: + # Draw rays in 2D view + sdl2.ext.draw.line(self.mapSurface, sdl2.ext.Color(0,0,255,255), (self.player_position["x"], self.player_position["y"], rayX, rayY)) + + + # ------ Draw 3D view ------ + + # Calculate line height based on distance + lineHeight = MAP_SCALE * RAYCAST_RENDER_HEIGHT / shortestDist + # Center line vertically in window + lineOffset = RAYCAST_RENDER_HEIGHT / 2 - lineHeight / 2 + + # Draw pixels vertically from top to bottom to obtain a line + textureSegmentEnd = 0 + for textureColumnPixel in range(0, TEXTURE_SIZE): + # Calc texture segment length on screen + textureSegmentLength = lineHeight / TEXTURE_SIZE + if textureSegmentEnd == 0: + # First iteration: calculate segment start + textureSegmentStart = lineOffset + textureColumnPixel * textureSegmentLength + else: + # Next iterations: use the previous segment end (avoids rounding errors) + textureSegmentStart = textureSegmentEnd + textureSegmentEnd = textureSegmentStart + textureSegmentLength + # Obtain texture value in the pixel representing the current segment and calculate shading + if vertDist > horizDist: + texIndex = mapBlockHitY - 1 # The texture covering the selected map tile (0 is no texture, 1 is texture at self.textures[0] etc) + texColumn = int(rayX / (MAP_SCALE / TEXTURE_SIZE) % TEXTURE_SIZE) + shading = True + else: + texIndex = mapBlockHitX - 1 # The texture covering the selected map tile + texColumn = int(rayY / (MAP_SCALE / TEXTURE_SIZE) % TEXTURE_SIZE) + shading = False + + # Obtain texture pixel color + color = self.textures[texIndex][texColumn + textureColumnPixel * TEXTURE_SIZE] + # Calculate color resulting from texture pixel value + shading + if shading: + color = self.shade(color) + + # Clipping + lineEnd = textureSegmentEnd + if lineEnd > RAYCAST_RENDER_HEIGHT: + lineEnd = RAYCAST_RENDER_HEIGHT + lineStart = textureSegmentStart + if lineStart < 0: + lineStart = 0 + if lineEnd < lineStart: + continue + + # Draw segment (all is scaled x4) + x = i * 4 + for idx in range(int(lineStart * 4) * RAYCAST_WIN_WIDTH + x, int(lineEnd * 4) * RAYCAST_WIN_WIDTH + x, RAYCAST_WIN_WIDTH): + self.raycast_u32_pixels[idx] = color + self.raycast_u32_pixels[idx + 1] = color + self.raycast_u32_pixels[idx + 2] = color + self.raycast_u32_pixels[idx + 3] = color + + def shade(self, color): + # Obtain channels + b = color & 0b000000000000000011111111 + g = color >> 8 & 0b000000000000000011111111 + r = color >> 16 & 0b000000000000000011111111 + # Dim channels (and limit to 255, because python doesn't have a fixed byte length) + b = (b >> 1) + g = (g >> 1) + r = (r >> 1) + # Compose color + return b + (g << 8) + (r << 16) + + def dist(self, ax, ay, bx, by): + return math.sqrt((bx-ax)*(bx-ax) + (by-ay)*(by-ay)) + + def loadTexture(self, pngFilePath): + # Loads a texture from png file and converts to sdl2-friendly format + reader = png.Reader(filename=pngFilePath) + w, h, pixels, metadata = reader.read_flat() + if w != TEXTURE_SIZE or h != TEXTURE_SIZE: + raise ValueError("Texture {} is not {}x{}, but {}x{}".format(pngFilePath, TEXTURE_SIZE, TEXTURE_SIZE, w, h)) + color_length = 3 # RGB + if metadata['alpha']: + color_length = 4 # RGBA (but alpha is ignored) + # Convert to sdl2-friendly format + converted = [] + for i in range(0, len(pixels), color_length): + # PNG is RGB, SDL surface is BGR + converted.append(pixels[i+2] + (pixels[i+1] << 8) + (pixels[i] << 16)) # BGR + return converted + + def openDoor(self): + # Opens a door near the user + # Works by modifying the map (removing the door) + + # Find where is the user + mapX = int(self.player_position["x"] / MAP_SCALE) + mapY = int(self.player_position["y"] / MAP_SCALE) + mapArrayPosition = mapY * MAP_SIZE + mapX + + # Find in which direction the user is looking + playerAngle = self.player_position["r"] + lookingAtMapArrayPosition = 0 + if playerAngle > math.pi / 4 and playerAngle <= 3 * math.pi / 4: + # Looking up + lookingAtMapArrayPosition = mapArrayPosition - MAP_SIZE + elif playerAngle > 3 * math.pi / 4 and playerAngle <= 5 * math.pi / 4: + # Looking left + lookingAtMapArrayPosition = mapArrayPosition - 1 + elif playerAngle > 5 * math.pi / 4 and playerAngle <= 7 * math.pi / 4: + # Looking down + lookingAtMapArrayPosition = mapArrayPosition + MAP_SIZE + else: + # Looking right + lookingAtMapArrayPosition = mapArrayPosition + 1 + + if MAP[lookingAtMapArrayPosition] == MAP_DOOR_CELL_TYPE: + # Player looking at a door: open it ("remove" it, leaving an empty space) + MAP[lookingAtMapArrayPosition] = 0 + else: + print("Player looking at cell #{} of type {}: nothing to do".format(lookingAtMapArrayPosition, MAP[lookingAtMapArrayPosition])) + + + +if __name__ == '__main__': + try: + main = Main() + main.run() + except KeyboardInterrupt: + exit(0)