Terrain generation
This commit is contained in:
@@ -1,14 +0,0 @@
|
||||
import { System } from "$/common/ecs/mod.ts";
|
||||
import { Position } from "$/common/components/position.ts";
|
||||
import { Sprite } from "../components/sprite.ts";
|
||||
import { ClientWorld } from "../client_world.ts";
|
||||
import { ClickableSprite } from "../components/clickable.ts";
|
||||
import { point_inside_rec } from "$/common/utils.ts";
|
||||
import { InputManager } from "../input_manager.ts";
|
||||
import { Camera } from "../components/camera.ts";
|
||||
import { canvas } from "../renderer/mod.ts";
|
||||
|
||||
export class ClickableSystem extends System {
|
||||
update(world: ClientWorld, _delta: number): void {
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import { distance_point_point, get_sprite_region } from "$/common/utils.ts";
|
||||
import { Chunk, CHUNK_SIDE_SIZE, Dimension } from "$/client/components/dimension.ts";
|
||||
import { Chunk, CHUNK_SIZE, Dimension } from "$/client/components/dimension.ts";
|
||||
import { TEXTURE_SIZE } from "$/common/constants.ts";
|
||||
import { EverythingRegistry, TileRegistry } from "$/common/everything_registry.ts";
|
||||
import { flush_buffer, gl, push_cube_to_mesh, set_current_texture } from "$/client/renderer/mod.ts";
|
||||
@@ -9,10 +9,7 @@ export function render_dimension(dimension: Dimension, camera: Camera) {
|
||||
set_current_texture(dimension.image.tex);
|
||||
for (const chunk of dimension.chunks) {
|
||||
if (chunk.dirty) {
|
||||
if (chunk.vertexBuffer && chunk.vertexTransparentBuffer) {
|
||||
gl.deleteBuffer(chunk.vertexBuffer);
|
||||
gl.deleteBuffer(chunk.vertexTransparentBuffer);
|
||||
}
|
||||
dimension.delete_chunk_mesh(chunk);
|
||||
chunk.dirty = false;
|
||||
make_chunk_mesh(chunk, dimension, camera);
|
||||
}
|
||||
@@ -80,8 +77,8 @@ function make_chunk_mesh(chunk: Chunk, dimension: Dimension, camera: Camera) {
|
||||
|
||||
const [x, y, z] = dimension.index_to_xyz(i);
|
||||
|
||||
const wx = chunk.x * CHUNK_SIDE_SIZE + x;
|
||||
const wz = chunk.z * CHUNK_SIDE_SIZE + z;
|
||||
const wx = chunk.x * CHUNK_SIZE + x;
|
||||
const wz = chunk.z * CHUNK_SIZE + z;
|
||||
|
||||
const show_face = (x: number, y: number, z: number) => {
|
||||
const block = dimension.get_block(x, y, z);
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
import { System } from "$/common/ecs/mod.ts";
|
||||
import { ClientWorld } from "../client_world.ts";
|
||||
import { Position } from "../../common/components/position.ts";
|
||||
import { CHUNK_SIZE } from "../components/dimension.ts";
|
||||
import { PlayerComponent } from "$/client/player.ts";
|
||||
|
||||
export class WorldGenerationSystem extends System {
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
update(world: ClientWorld, _delta: number): void {
|
||||
const [player] = world.get_tag("player")!;
|
||||
const position = player.get(Position)!;
|
||||
const player_component = player.get(PlayerComponent)!;
|
||||
const dimension = world.dimension;
|
||||
|
||||
const player_chunk_x = Math.floor(position.x / CHUNK_SIZE);
|
||||
const player_chunk_z = Math.floor(position.z / CHUNK_SIZE);
|
||||
|
||||
const render_distance = player_component.render_distance;
|
||||
|
||||
for (const chunk of dimension.chunks) {
|
||||
if (Math.abs(chunk.x - player_chunk_x) > render_distance) {
|
||||
dimension.unload_chunk(chunk.x, chunk.z);
|
||||
}
|
||||
if (Math.abs(chunk.z - player_chunk_z) > render_distance) {
|
||||
dimension.unload_chunk(chunk.x, chunk.z);
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = player_chunk_x - render_distance; i <= player_chunk_x + render_distance; i += 1) {
|
||||
for (let j = player_chunk_z - render_distance; j <= player_chunk_z + render_distance; j += 1) {
|
||||
const maybe_chunk = dimension.chunks.find((chunk) => chunk.x === i && chunk.z === j);
|
||||
if (!maybe_chunk || !maybe_chunk.generated) {
|
||||
console.log("loading chunk", i, j);
|
||||
dimension.load_chunk(i, j);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user