From d9206b04881d39faf7e3dd6c17823cd606dc0e25 Mon Sep 17 00:00:00 2001 From: paulaboks Date: Mon, 30 Mar 2026 14:41:18 -0300 Subject: [PATCH] Visuak break progress ! --- assets/sprites/textures/break_0.png | Bin 138 -> 87 bytes assets/sprites/textures/break_1.png | Bin 156 -> 103 bytes assets/sprites/textures/break_2.png | Bin 174 -> 139 bytes assets/sprites/textures/break_3.png | Bin 206 -> 148 bytes assets/sprites/textures/break_4.png | Bin 0 -> 159 bytes assets/sprites/textures/break_5.png | Bin 0 -> 166 bytes assets/sprites/textures/break_6.png | Bin 0 -> 180 bytes assets/sprites/textures/break_7.png | Bin 0 -> 188 bytes assets/sprites/textures/break_8.png | Bin 0 -> 206 bytes client/player.ts | 2 +- client/renderer/models.ts | 123 +++++--------- client/systems/player_controls.ts | 5 +- client/systems/render_system.ts | 7 +- client/systems/rendering/player.ts | 54 +++++- client/workers/chunk_mesh_worker.ts | 249 +++++++++++++++++++++++++++- 15 files changed, 340 insertions(+), 100 deletions(-) create mode 100644 assets/sprites/textures/break_4.png create mode 100644 assets/sprites/textures/break_5.png create mode 100644 assets/sprites/textures/break_6.png create mode 100644 assets/sprites/textures/break_7.png create mode 100644 assets/sprites/textures/break_8.png diff --git a/assets/sprites/textures/break_0.png b/assets/sprites/textures/break_0.png index 3deef5c6ab9d2d1c16a4e566de4289e7a5a1ba21..09fe5a60df57de0c103597dc12eb7562f4dd4603 100644 GIT binary patch delta 57 zcmeBT44HB*K~y-6?T;}Iz#t3*amB-&m-}hy6aDT~iZDVKA& zdmEA-`Ilv18G&y0}^x*dZ O0000d%B!6{DL_t(Ijnz^?3cw%?YsVfIU#>sPPHvgB;us7T5Lz`cp_=^; z060A$87=?>Kr-f^A{kkG#r8JRO`x^rrIhmttw*P+;+R+M_kF$Zk$^&7)LPxl%>AP6 zsTDydE+HD*Yzm=3G|uIJkdd`sj?+aS5kAKOm=&eR=NGhR01E&B07*qoM6N<$f{PSB At^fc4 diff --git a/assets/sprites/textures/break_3.png b/assets/sprites/textures/break_3.png index 098d68407c7837046d89fd3689c2b1dafbff4e9e..4ff09d3342b2918743ca4b37d829247cf1ced64d 100644 GIT binary patch delta 119 zcmV--0Eqw20h9rdByd|vL_t(IjqOh{4uC)iE5?Vx%i(8r;s#GH;$R%?0;H5u;Kw^q zRaV?q5hS6iBsu1mV~Vq8f8LeV2LNDZLlhCy{(k2pcNYKa!0vZZl6197tHfAkQ226 zWUaMs$KG2-L{xuiR}jtYfN|m|{>E;M=0Bzz^BFD gfPaEmW~Nd23qzCcpjKNN&;S4c07*qoM6N<$g7Jb;-2eap diff --git a/assets/sprites/textures/break_4.png b/assets/sprites/textures/break_4.png new file mode 100644 index 0000000000000000000000000000000000000000..227f8024c2b4cda4ea04e3188a5cf8fbe05e7487 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`X`U{QAr`%F`wjUT40xD@j~u=; z-Q3=o*@#(HwWF0$f90iLF|+?_aWZV){ZzMxL8EsGqr%Si>}f0wM%k}w);*SV>0G<@ zuz=v<-&;Q|zPEe!%$>_C7q82*F1d>BP{ZBzEV;|n%IrP{j3QbVy_=C$KAZh@M7=k-S-9Nopwrj zcP_NZYc6BNoJCugDJiY$f4gQ$)5e&@(8XVRZ%%0R-aE5W?>b|_=?^>gYNpRV_f4&- Q7-%trr>mdKI;Vst0QfIMUjP6A literal 0 HcmV?d00001 diff --git a/assets/sprites/textures/break_6.png b/assets/sprites/textures/break_6.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d97db864ec24aff5d990bf34be760f64b4ad33 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr`%7gD&zlC~&k~YkxTX z^!$s$Ws9b)-C8O=d11MX*2VRTO51{7o1Iz1Eoc~TyZ?;@Yrqlaje8{v1p-3#mTnQ7 z;l6xj(j4)()w1V5`!F=>Wv%sbIZ|`!+ZC<@o!%W~@8cFS{y+G}a&dyzq=|;{a_srC eo&7F$#~JrjuV*g!b4Cd03!P@j;9u5BUk`DwUAgMCkl@z4uP(K+D;yDfRUub)l}RGG zAUij%aclW3yFKT-zb$s`W6&tMSe>q<^sM@g&LiKO37Y?VBYBE<>}6zH^#03%E3Rfe nrILzFzdm27yQ&8mMBNMNyv4(dNAzS6wUa7<4KG8fyaBf-qq}UA^7H9Kl6ddeAPLfjFLj? zuZ_?CSXSh|Gb(Ssb(Z*<&qfo3w=$)y-I{m&UbL%ANPT9wz}Ytqg^x7;9n0%^@j*hJ zdDZ)rgxjvu=e#X!;X3jDX5Ms;1Iv%zYp8FENLv>8gWGxXy9Hs("blocks", block.block)!; if (player_component.breaking_block) { + player_component.breaking_block = { x: block.x, y: block.y, z: block.z }; player_component.break_progress_max = block_info.toughness ?? 9999; player_component.break_progress += delta; if (player_component.break_progress >= player_component.break_progress_max) { diff --git a/client/systems/render_system.ts b/client/systems/render_system.ts index 60c4856..233e418 100644 --- a/client/systems/render_system.ts +++ b/client/systems/render_system.ts @@ -7,7 +7,7 @@ import { Camera } from "$/client/components/camera.ts"; import { render_animated_sprite, render_sprite } from "./rendering/sprites.ts"; import { render_dimension } from "./rendering/dimension.ts"; -import { render_player_crosshair, render_player_hotbar } from "./rendering/player.ts"; +import { render_player_breaking, render_player_crosshair, render_player_hotbar } from "./rendering/player.ts"; import { PlayerComponent } from "../player.ts"; import { begin_mode_3d, end_mode_3d } from "../renderer/core.ts"; @@ -32,6 +32,11 @@ export class RenderSystem extends System { if (dimension) { render_dimension(dimension, camera); } + + const player_component = entity.get(PlayerComponent); + if (player_component) { + render_player_breaking(player_component); + } } end_mode_3d(); diff --git a/client/systems/rendering/player.ts b/client/systems/rendering/player.ts index aa8b3e8..d15a34f 100644 --- a/client/systems/rendering/player.ts +++ b/client/systems/rendering/player.ts @@ -1,9 +1,20 @@ -import { SLOT_SIZE } from "$/common/constants.ts"; +import { SLOT_SIZE, TEXTURE_SIZE } from "$/common/constants.ts"; import { AssetManager } from "$/client/assets.ts"; import { PlayerInventory } from "../../inventory.ts"; import { draw_item, draw_nine_slice } from "./render_utils.ts"; -import { canvas, draw_rect_stroke, push_back_face, Texture } from "$/client/renderer/mod.ts"; +import { + canvas, + draw_rect_stroke, + push_back_face, + push_bottom_face, + push_front_face, + push_left_face, + push_right_face, + push_top_face, + Texture, +} from "$/client/renderer/mod.ts"; import { PlayerComponent } from "../../player.ts"; +import { get_sprite_region } from "../../../common/utils.ts"; const PADDING = 10; @@ -68,3 +79,42 @@ export function render_player_crosshair() { [0, 0, 0, 0.6], ); } + +const FACE_FUNCTIONS = [ + push_back_face, + push_bottom_face, + push_front_face, + push_left_face, + push_right_face, + push_top_face, +]; +export function render_player_breaking(player_component: PlayerComponent) { + const block = player_component.breaking_block; + if (block) { + const tex = AssetManager.instance.get("bworld:textures"); + + const progress = Math.max( + 0, + Math.min(1, player_component.break_progress / player_component.break_progress_max), + ); + const break_sprite = Math.round(progress * 8); + + if (Number.isNaN(break_sprite)) { + return; + } + const region = get_sprite_region(`bworld:break_${break_sprite}`); + + for (const fn of FACE_FUNCTIONS) { + fn( + tex, + block.x, + block.y, + block.z, + region.x * TEXTURE_SIZE, + region.y * TEXTURE_SIZE, + TEXTURE_SIZE, + TEXTURE_SIZE, + ); + } + } +} diff --git a/client/workers/chunk_mesh_worker.ts b/client/workers/chunk_mesh_worker.ts index 261f822..f935844 100644 --- a/client/workers/chunk_mesh_worker.ts +++ b/client/workers/chunk_mesh_worker.ts @@ -2,16 +2,249 @@ import type { BlockRegistry } from "$/common/everything_registry.ts"; import type { SpriteRegion } from "$/common/constants.ts"; -import { - push_back_face, - push_bottom_face, - push_front_face, - push_left_face, - push_right_face, - push_top_face, -} from "../renderer/models.ts"; import type { Texture } from "../renderer/types.ts"; +const pad = 0.5; + +function push_vertex( + vertices: Float32Array, + i: number, + px: number, + py: number, + pz: number, + u: number, + v: number, + r: number, + g: number, + b: number, + a: number, +) { + vertices[i++] = px; + vertices[i++] = py; + vertices[i++] = pz; + vertices[i++] = u; + vertices[i++] = v; + vertices[i++] = r; + vertices[i++] = g; + vertices[i++] = b; + vertices[i++] = a; + + return i; +} + +export function push_front_face( + vertices: Float32Array, + i: number, + 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; + + i = push_vertex(vertices, i, x, y, z2, u0, v1, r, g, b, a); + i = push_vertex(vertices, i, x2, y, z2, u1, v1, r, g, b, a); + i = push_vertex(vertices, i, x2, y2, z2, u1, v0, r, g, b, a); + + i = push_vertex(vertices, i, x, y, z2, u0, v1, r, g, b, a); + i = push_vertex(vertices, i, x2, y2, z2, u1, v0, r, g, b, a); + i = push_vertex(vertices, i, x, y2, z2, u0, v0, r, g, b, a); + + return i; +} + +export function push_back_face( + vertices: Float32Array, + i: number, + 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; + + i = push_vertex(vertices, i, x2, y, z, u0, v1, r, g, b, a); + i = push_vertex(vertices, i, x, y, z, u1, v1, r, g, b, a); + i = push_vertex(vertices, i, x, y2, z, u1, v0, r, g, b, a); + + i = push_vertex(vertices, i, x2, y, z, u0, v1, r, g, b, a); + i = push_vertex(vertices, i, x, y2, z, u1, v0, r, g, b, a); + i = push_vertex(vertices, i, x2, y2, z, u0, v0, r, g, b, a); + + return i; +} + +export function push_left_face( + vertices: Float32Array, + i: number, + 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; + + i = push_vertex(vertices, i, x, y, z, u0, v1, r, g, b, a); + i = push_vertex(vertices, i, x, y, z2, u1, v1, r, g, b, a); + i = push_vertex(vertices, i, x, y2, z2, u1, v0, r, g, b, a); + + i = push_vertex(vertices, i, x, y, z, u0, v1, r, g, b, a); + i = push_vertex(vertices, i, x, y2, z2, u1, v0, r, g, b, a); + i = push_vertex(vertices, i, x, y2, z, u0, v0, r, g, b, a); + + return i; +} + +export function push_right_face( + vertices: Float32Array, + i: number, + 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; + + i = push_vertex(vertices, i, x2, y, z2, u0, v1, r, g, b, a); + i = push_vertex(vertices, i, x2, y, z, u1, v1, r, g, b, a); + i = push_vertex(vertices, i, x2, y2, z, u1, v0, r, g, b, a); + + i = push_vertex(vertices, i, x2, y, z2, u0, v1, r, g, b, a); + i = push_vertex(vertices, i, x2, y2, z, u1, v0, r, g, b, a); + i = push_vertex(vertices, i, x2, y2, z2, u0, v0, r, g, b, a); + + return i; +} + +export function push_top_face( + vertices: Float32Array, + i: number, + 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; + + i = push_vertex(vertices, i, x, y2, z2, u0, v1, r, g, b, a); + i = push_vertex(vertices, i, x2, y2, z2, u1, v1, r, g, b, a); + i = push_vertex(vertices, i, x2, y2, z, u1, v0, r, g, b, a); + + i = push_vertex(vertices, i, x, y2, z2, u0, v1, r, g, b, a); + i = push_vertex(vertices, i, x2, y2, z, u1, v0, r, g, b, a); + i = push_vertex(vertices, i, x, y2, z, u0, v0, r, g, b, a); + + return i; +} + +export function push_bottom_face( + vertices: Float32Array, + i: number, + 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; + + i = push_vertex(vertices, i, x, y, z, u0, v1, r, g, b, a); + i = push_vertex(vertices, i, x2, y, z, u1, v1, r, g, b, a); + i = push_vertex(vertices, i, x2, y, z2, u1, v0, r, g, b, a); + + i = push_vertex(vertices, i, x, y, z, u0, v1, r, g, b, a); + i = push_vertex(vertices, i, x2, y, z2, u1, v0, r, g, b, a); + i = push_vertex(vertices, i, x, y, z2, u0, v0, r, g, b, a); + + return i; +} + type TexturesInfo = Record; const CHUNK_SIZE = 16;