A hackable template for creating small and fast browser games.
at main 67 lines 2.2 kB view raw
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}