Files
bworld/client/renderer/models.ts
T
2026-09-24 18:34:16 -03:00

260 lines
6.3 KiB
TypeScript

import { push_vertex } from "./core.ts";
import type { Texture } from "./types.ts";
const pad = 0.5;
export function push_front_face(
texture: Texture,
x: number,
y: number,
z: number,
sx: number,
sy: number,
sw: number,
sh: number,
r = 1,
g = 1,
b = 1,
a = 1,
) {
const x2 = x + 1;
const y2 = y + 1;
const z2 = z + 1;
const u0 = (sx + pad) / texture.width;
const v0 = (sy + pad) / texture.height;
const u1 = (sx + sw - pad) / texture.width;
const v1 = (sy + sh - pad) / texture.height;
push_vertex(x, y, z2, u0, v1, r, g, b, a);
push_vertex(x2, y, z2, u1, v1, r, g, b, a);
push_vertex(x2, y2, z2, u1, v0, r, g, b, a);
push_vertex(x, y, z2, u0, v1, r, g, b, a);
push_vertex(x2, y2, z2, u1, v0, r, g, b, a);
push_vertex(x, y2, z2, u0, v0, r, g, b, a);
}
export function push_back_face(
texture: Texture,
x: number,
y: number,
z: number,
sx: number,
sy: number,
sw: number,
sh: number,
r = 1,
g = 1,
b = 1,
a = 1,
) {
const x2 = x + 1;
const y2 = y + 1;
const u0 = (sx + pad) / texture.width;
const v0 = (sy + pad) / texture.height;
const u1 = (sx + sw - pad) / texture.width;
const v1 = (sy + sh - pad) / texture.height;
push_vertex(x2, y, z, u0, v1, r, g, b, a);
push_vertex(x, y, z, u1, v1, r, g, b, a);
push_vertex(x, y2, z, u1, v0, r, g, b, a);
push_vertex(x2, y, z, u0, v1, r, g, b, a);
push_vertex(x, y2, z, u1, v0, r, g, b, a);
push_vertex(x2, y2, z, u0, v0, r, g, b, a);
}
export function push_left_face(
texture: Texture,
x: number,
y: number,
z: number,
sx: number,
sy: number,
sw: number,
sh: number,
r = 1,
g = 1,
b = 1,
a = 1,
) {
const y2 = y + 1;
const z2 = z + 1;
const u0 = (sx + pad) / texture.width;
const v0 = (sy + pad) / texture.height;
const u1 = (sx + sw - pad) / texture.width;
const v1 = (sy + sh - pad) / texture.height;
push_vertex(x, y, z, u0, v1, r, g, b, a);
push_vertex(x, y, z2, u1, v1, r, g, b, a);
push_vertex(x, y2, z2, u1, v0, r, g, b, a);
push_vertex(x, y, z, u0, v1, r, g, b, a);
push_vertex(x, y2, z2, u1, v0, r, g, b, a);
push_vertex(x, y2, z, u0, v0, r, g, b, a);
}
export function push_right_face(
texture: Texture,
x: number,
y: number,
z: number,
sx: number,
sy: number,
sw: number,
sh: number,
r = 1,
g = 1,
b = 1,
a = 1,
) {
const x2 = x + 1;
const y2 = y + 1;
const z2 = z + 1;
const u0 = (sx + pad) / texture.width;
const v0 = (sy + pad) / texture.height;
const u1 = (sx + sw - pad) / texture.width;
const v1 = (sy + sh - pad) / texture.height;
push_vertex(x2, y, z2, u0, v1, r, g, b, a);
push_vertex(x2, y, z, u1, v1, r, g, b, a);
push_vertex(x2, y2, z, u1, v0, r, g, b, a);
push_vertex(x2, y, z2, u0, v1, r, g, b, a);
push_vertex(x2, y2, z, u1, v0, r, g, b, a);
push_vertex(x2, y2, z2, u0, v0, r, g, b, a);
}
export function push_top_face(
texture: Texture,
x: number,
y: number,
z: number,
sx: number,
sy: number,
sw: number,
sh: number,
r = 1,
g = 1,
b = 1,
a = 1,
) {
const x2 = x + 1;
const z2 = z + 1;
const y2 = y + 1;
const u0 = (sx + pad) / texture.width;
const v0 = (sy + pad) / texture.height;
const u1 = (sx + sw - pad) / texture.width;
const v1 = (sy + sh - pad) / texture.height;
push_vertex(x, y2, z2, u0, v1, r, g, b, a);
push_vertex(x2, y2, z2, u1, v1, r, g, b, a);
push_vertex(x2, y2, z, u1, v0, r, g, b, a);
push_vertex(x, y2, z2, u0, v1, r, g, b, a);
push_vertex(x2, y2, z, u1, v0, r, g, b, a);
push_vertex(x, y2, z, u0, v0, r, g, b, a);
}
export function push_bottom_face(
texture: Texture,
x: number,
y: number,
z: number,
sx: number,
sy: number,
sw: number,
sh: number,
r = 1,
g = 1,
b = 1,
a = 1,
) {
const x2 = x + 1;
const z2 = z + 1;
const u0 = (sx + pad) / texture.width;
const v0 = (sy + pad) / texture.height;
const u1 = (sx + sw - pad) / texture.width;
const v1 = (sy + sh - pad) / texture.height;
push_vertex(x, y, z, u0, v1, r, g, b, a);
push_vertex(x2, y, z, u1, v1, r, g, b, a);
push_vertex(x2, y, z2, u1, v0, r, g, b, a);
push_vertex(x, y, z, u0, v1, r, g, b, a);
push_vertex(x2, y, z2, u1, v0, r, g, b, a);
push_vertex(x, y, z2, u0, v0, r, g, b, a);
}
// solid colored box, draw it with white_tex as the current texture
export function push_box(
x: number,
y: number,
z: number,
width: number,
height: number,
depth: number,
r = 1,
g = 1,
b = 1,
a = 1,
) {
const x2 = x + width;
const y2 = y + height;
const z2 = z + depth;
// front
push_vertex(x, y, z2, 0, 1, r, g, b, a);
push_vertex(x2, y, z2, 1, 1, r, g, b, a);
push_vertex(x2, y2, z2, 1, 0, r, g, b, a);
push_vertex(x, y, z2, 0, 1, r, g, b, a);
push_vertex(x2, y2, z2, 1, 0, r, g, b, a);
push_vertex(x, y2, z2, 0, 0, r, g, b, a);
// back
push_vertex(x2, y, z, 0, 1, r * 0.8, g * 0.8, b * 0.8, a);
push_vertex(x, y, z, 1, 1, r * 0.8, g * 0.8, b * 0.8, a);
push_vertex(x, y2, z, 1, 0, r * 0.8, g * 0.8, b * 0.8, a);
push_vertex(x2, y, z, 0, 1, r * 0.8, g * 0.8, b * 0.8, a);
push_vertex(x, y2, z, 1, 0, r * 0.8, g * 0.8, b * 0.8, a);
push_vertex(x2, y2, z, 0, 0, r * 0.8, g * 0.8, b * 0.8, a);
// left
push_vertex(x, y, z, 0, 1, r * 0.9, g * 0.9, b * 0.9, a);
push_vertex(x, y, z2, 1, 1, r * 0.9, g * 0.9, b * 0.9, a);
push_vertex(x, y2, z2, 1, 0, r * 0.9, g * 0.9, b * 0.9, a);
push_vertex(x, y, z, 0, 1, r * 0.9, g * 0.9, b * 0.9, a);
push_vertex(x, y2, z2, 1, 0, r * 0.9, g * 0.9, b * 0.9, a);
push_vertex(x, y2, z, 0, 0, r * 0.9, g * 0.9, b * 0.9, a);
// right
push_vertex(x2, y, z2, 0, 1, r * 0.9, g * 0.9, b * 0.9, a);
push_vertex(x2, y, z, 1, 1, r * 0.9, g * 0.9, b * 0.9, a);
push_vertex(x2, y2, z, 1, 0, r * 0.9, g * 0.9, b * 0.9, a);
push_vertex(x2, y, z2, 0, 1, r * 0.9, g * 0.9, b * 0.9, a);
push_vertex(x2, y2, z, 1, 0, r * 0.9, g * 0.9, b * 0.9, a);
push_vertex(x2, y2, z2, 0, 0, r * 0.9, g * 0.9, b * 0.9, a);
// top
push_vertex(x, y2, z2, 0, 1, r, g, b, a);
push_vertex(x2, y2, z2, 1, 1, r, g, b, a);
push_vertex(x2, y2, z, 1, 0, r, g, b, a);
push_vertex(x, y2, z2, 0, 1, r, g, b, a);
push_vertex(x2, y2, z, 1, 0, r, g, b, a);
push_vertex(x, y2, z, 0, 0, r, g, b, a);
// bottom
push_vertex(x, y, z, 0, 1, r * 0.6, g * 0.6, b * 0.6, a);
push_vertex(x2, y, z, 1, 1, r * 0.6, g * 0.6, b * 0.6, a);
push_vertex(x2, y, z2, 1, 0, r * 0.6, g * 0.6, b * 0.6, a);
push_vertex(x, y, z, 0, 1, r * 0.6, g * 0.6, b * 0.6, a);
push_vertex(x2, y, z2, 1, 0, r * 0.6, g * 0.6, b * 0.6, a);
push_vertex(x, y, z2, 0, 0, r * 0.6, g * 0.6, b * 0.6, a);
}