# vang ## ✅ TODO ### updated plan * ComponentFlags impl. * Initial query implementation. no filter (check perf) * Impl filters * Check comments * Simple example * Publish initally to npm with very simple doc pages * Move onto std/3d lib. * rapier.js physics * three.js visuals * geckos.io netcode ### Plan * redo packages - imp - @imp/shared - @imp/collections * create simple core ecs (no query with filter etc) & testing (gotta be faster than ts-jest) * core should be a mix of uecs + bevyecs * publish to github * create other features #### Rework * use bevy-ecs as reference * redo entity allocation https://github.com/bevyengine/bevy/blob/main/crates/bevy_ecs/src/entity/mod.rs * redo world https://github.com/bevyengine/bevy/blob/main/crates/bevy_ecs/src/world/mod.rs ### Storage/World * optimize create/delete/destroy operations * disable/enable components * added/changed/removed filter impl. * disabled filter impl. * create plugin define * dont allow "new Component" (ruins pooling) * ComponentSparseSet grow/shrink * better storage types (@see below) ```typescript= type Storage = { slice(id: ComponentId): ComponentSlice; sliceOrInsert(id: ComponentId): ComponentSlice; /** * */ entitySliceOfSmallest(components: Entity): EntitySlice; } type Sliceable = { slice(from: number, to: number): Slice } type Slice<I = number, T = unknown> = { at(index: I): T; length: number; } type ArraySlice<T> = Slice<number, T> type ComponentSlice<T extends Component = Component> = Slice<Entity, T> type EntitySlice = Slice<number, T> ``` * use name 'trait' where needed ("FilterTrait", "ComponentTrait") * rename ComponentFlags -> ComponentSet * use name 'ComponentFlags' for states like "ADDED", "REMOVED", "CHANGED", "DISABLED" ### Scheduler * add systems at runtime * enable/disable systems at runtime ### World Builder * use arbitary order when defining groups * create `group` util function for defining groups * add `groups` method to add several groups * be able to use objets created by `groups` when selecting order * plugin support * throw if multiple groups with same name has been registered * go over naming (systems, components etc.) ### Collections * move to seperate package * simplify Vec. ## 📜 Example ```typescript import { World, query, group } from "vang"; import { added, not, changed } from "vang/filters" function box_system(world: World) { for (const [box, tr] of query(Box, not(Transform2D)) { tr.y -= box.weight; } } const PostUpdateGroup = group("post-update", { after: "update"}); const PreUpdateGroup = group("pre-update", { before: "update"}); const RenderingGroup = group("rendering", { rel: "update" order: -10000 }); const world = World.build() .with({ capacity: 1000 }) .groups(PostUpdateGroup, PreUpdateGroup, RenderingGroup) .group("debug-update", { before: PreUpdateGroup }) .systems(PostUpdateGroup, box_system): ``` ### Plugins ```typescript= // 3dplugin.ts import { plugin } from "vang"; type Options = { rendering: boolean; } export default plugin<Options>({ name: `${package.name}`, version: `${package.version}`, register: (builder, opts) => { builder.group("transforms-update", { after: "update" }) if (opts.rendering) { // add rendering components/ctx } } }) // game.ts import Std3DPlugin from "@imp/std/3d" const world = World.build() .plugin(Std3DPlugin({ rendering: false })) ``` ## 📦 Packages ### `vang` Contains the core _ECS_ project. ```typescript export type { Component, ComponentType } export type { Resource, ResourceType } export type { Plugin } export type { System } export { World, query, ComponentFlags, ComponentSet } ``` ### `vang/filter` Query filters. ```typescript export { added, removed, changed, disabled, observe, not, filter } ``` ### `@vang/std/3d` Default 3D plugin for creating 3D games * 3D position, scale, rotation etc. * threejs rendering * parent hierarchy ### `@vang/shared` Shared utility & common types/classes. ### `@vang/collections` Collections such as: * Vec * SparseSet * SlotMap ### `@vang/app` More "generic" engine version ### `@vang/net` Netcode implementation. Will probly use geckos.io & their TypedSchema packages as a start & expand/create my own if I feel thats needed or if I want to 😅 ### `@vang/devtools` inspector devtools. @see flecs, ecsy for examples