A hackable template for creating small and fast browser games.
1import {Vec4} from "../../lib/math.js";
2import {vec4_copy, vec4_scale} from "../../lib/vec4.js";
3import {Entity} from "../../lib/world.js";
4import {DrawKind} from "../components/com_draw.js";
5import {PickableAABB, PickableKind} from "../components/com_pickable.js";
6import {RenderKind} from "../components/com_render.js";
7import {Game} from "../game.js";
8import {Has} from "../world.js";
9
10const QUERY = Has.Pickable;
11
12export function sys_highlight(game: Game, delta: number) {
13 for (let i = 0; i < game.World.Signature.length; i++) {
14 if ((game.World.Signature[i] & QUERY) == QUERY) {
15 let pickable = game.World.Pickable[i];
16 switch (pickable.Kind) {
17 case PickableKind.AABB: {
18 update_aabb(game, i, pickable);
19 break;
20 }
21 }
22 }
23 }
24}
25
26function update_aabb(game: Game, entity: Entity, pickable: PickableAABB) {
27 let selectable = game.World.Selectable[entity];
28 let children = game.World.Children[entity];
29
30 let box_entity = children.Children[0];
31 let box_draw = game.World.Draw[box_entity];
32 if (box_draw.Kind !== DrawKind.Selection) {
33 throw new Error("(sys_highlight) DrawKind not supported.");
34 }
35
36 let mesh_entity = children.Children[1];
37 let mesh_render = game.World.Render[mesh_entity];
38
39 let mesh_color: Vec4;
40 switch (mesh_render.Kind) {
41 case RenderKind.ColoredUnlit:
42 case RenderKind.TexturedUnlit:
43 mesh_color = mesh_render.Color;
44 break;
45 case RenderKind.ColoredShaded:
46 case RenderKind.TexturedShaded:
47 case RenderKind.MappedShaded:
48 mesh_color = mesh_render.DiffuseColor;
49 break;
50 default:
51 throw new Error("(sys_highlight) RenderKind not supported.");
52 }
53
54 if (game.Picked?.Entity === entity) {
55 vec4_copy(mesh_color, pickable.Color);
56 vec4_scale(mesh_color, mesh_color, 1.5);
57 } else {
58 vec4_copy(mesh_color, pickable.Color);
59 }
60
61 if (selectable.Selected) {
62 game.World.Signature[box_entity] |= Has.Draw;
63 box_draw.Size = 30 / game.CameraDolly;
64 } else {
65 game.World.Signature[box_entity] &= ~Has.Draw;
66 }
67}