260 lines
6.3 KiB
TypeScript
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);
|
|
}
|