Spaces:
Sleeping
Sleeping
from fastapi import FastAPI | |
from fastapi.middleware.cors import CORSMiddleware | |
import numpy as np | |
import random | |
from typing import Dict, List | |
import uvicorn | |
app = FastAPI() | |
# Enable CORS for browser access | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=["*"], | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
# Mock InstantMesh (replace with real model later) | |
def generate_mesh(chunk_x: int, chunk_z: int) -> List[List[float]]: | |
chunk_size = 5 | |
mesh = np.zeros((chunk_size, chunk_size)) | |
prompt = "rocky hill" if random.random() > 0.5 else "flat plains" | |
if "hill" in prompt: | |
mesh[2, 2] = random.randint(2, 5) | |
for i in range(chunk_size): | |
for j in range(chunk_size): | |
dist = np.sqrt((i - 2)**2 + (j - 2)**2) | |
mesh[i, j] = max(0, 5 - dist) | |
else: | |
mesh = np.ones((chunk_size, chunk_size)) * random.uniform(0, 1) | |
return mesh.tolist() | |
# Game state | |
class Game: | |
def __init__(self): | |
self.player_pos = [0, 0] # [x, z] | |
self.world: Dict[tuple, List[List[float]]] = {} | |
self.chunk_size = 5 | |
def get_chunk_coords(self, x: int, z: int) -> tuple: | |
return (x // self.chunk_size, z // self.chunk_size) | |
def generate_chunk(self, chunk_x: int, chunk_z: int): | |
key = (chunk_x, chunk_z) | |
if key not in self.world: | |
print(f"Generating chunk at {key}") | |
self.world[key] = generate_mesh(chunk_x, chunk_z) | |
return self.world[key] | |
game = Game() | |
async def move(dx: int = 0, dz: int = 0): | |
game.player_pos[0] += dx | |
game.player_pos[1] += dz | |
chunk_x, chunk_z = game.get_chunk_coords(game.player_pos[0], game.player_pos[1]) | |
chunk = game.generate_chunk(chunk_x, chunk_z) | |
return { | |
"player_pos": game.player_pos, | |
"chunk": chunk, | |
"chunk_coords": [chunk_x, chunk_z] | |
} | |
if __name__ == "__main__": | |
uvicorn.run(app, host="0.0.0.0", port=7860) |