46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
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);
|
|
}
|
|
}
|