import { CHUNK_SIZE, Dimension } from "$/client/components/dimension.ts"; import { Camera } from "$/client/components/camera.ts"; import { draw_terrain, set_current_texture } from "$/client/renderer/mod.ts"; // solid and cutout terrain, drawn before entities export function render_dimension_opaque(dimension: Dimension, camera: Camera) { dimension.request_meshes(camera); dimension.update_translucent_sorting(camera); set_current_texture(dimension.image.tex); for (const chunk of dimension.chunks.values()) { const mesh = chunk.meshes.solid; if (mesh) { draw_terrain("solid", mesh.vertex_buffer, mesh.quad_count); } } for (const chunk of dimension.chunks.values()) { const mesh = chunk.meshes.cutout; if (mesh) { draw_terrain("cutout", mesh.vertex_buffer, mesh.quad_count); } } } // translucent terrain, drawn after entities so they show through water and glass. // chunks go back to front, and each chunk's quads are already sorted back to front export function render_dimension_translucent(dimension: Dimension, camera: Camera) { const distance_sq = (x: number, z: number) => { const dx = (x + 0.5) * CHUNK_SIZE - camera.x; const dz = (z + 0.5) * CHUNK_SIZE - camera.z; return dx * dx + dz * dz; }; const chunks = [...dimension.chunks.values()] .filter((chunk) => chunk.meshes.translucent) .map((chunk) => ({ mesh: chunk.meshes.translucent!, distance: distance_sq(chunk.x, chunk.z) })) .sort((a, b) => b.distance - a.distance); set_current_texture(dimension.image.tex); for (const { mesh } of chunks) { draw_terrain("translucent", mesh.vertex_buffer, mesh.quad_count, mesh.index_buffer); } }