diff --git a/.gitignore b/.gitignore
index eeb6ca770..84afa7f44 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,7 +23,6 @@ go.work
bin/
logs/
-docs/api
external/bin
interpreter/kaiju-*
*.zip
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 4d4bca067..e718f4aa4 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -49,16 +49,32 @@
"CGO_ENABLED": "1",
}
}, {
- "name": "Documentation Generator",
+ "name": "Generate Documentation",
"type": "go",
"request": "launch",
"mode": "auto",
- "program": "${workspaceFolder}/src/generators/api",
+ "program": "${workspaceFolder}/src/tools/gendocs.go",
+ "args": ["${workspaceFolder}/src"],
"cwd": "${workspaceFolder}",
- "buildFlags": "-tags=generator",
"env": {
- "CGO_ENABLED": "1",
- }
+ "CGO_ENABLED": "1"
+ },
+ "console": "integratedTerminal",
+ "showLog": true,
+ "preLaunchTask": "Install gomarkdoc"
+ }, {
+ "name": "Install Dependencies and Generate Docs",
+ "type": "go",
+ "request": "launch",
+ "mode": "auto",
+ "program": "${workspaceFolder}/src/tools/install_and_generate_docs.go",
+ "args": ["${workspaceFolder}/src"],
+ "cwd": "${workspaceFolder}",
+ "env": {
+ "CGO_ENABLED": "1"
+ },
+ "console": "integratedTerminal",
+ "showLog": true
}, {
"name": "Copy Headers",
"type": "go",
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 47fb16c6f..2b94028be 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -27,7 +27,52 @@
"$go"
],
"group": "build",
- "detail": "go build ${workspaceFolder}/src",
+ "detail": "go build ${workspaceFolder}/src"
+ }, {
+ "label": "Generate Documentation",
+ "type": "shell",
+ "command": "go",
+ "args": [
+ "run",
+ "${workspaceFolder}/src/tools/gendocs.go",
+ "${workspaceFolder}/src"
+ ],
+ "options": {
+ "cwd": "${workspaceFolder}"
+ },
+ "group": {
+ "kind": "build",
+ "isDefault": false
+ },
+ "presentation": {
+ "echo": true,
+ "reveal": "always",
+ "focus": false,
+ "panel": "shared",
+ "showReuseMessage": true,
+ "clear": false
+ },
+ "problemMatcher": [],
+ "detail": "Generate API documentation using go doc"
+ }, {
+ "label": "Install gomarkdoc",
+ "type": "shell",
+ "command": "go",
+ "args": [
+ "install",
+ "github.com/princjef/gomarkdoc/cmd/gomarkdoc@latest"
+ ],
+ "group": "build",
+ "presentation": {
+ "echo": true,
+ "reveal": "always",
+ "focus": false,
+ "panel": "shared",
+ "showReuseMessage": true,
+ "clear": false
+ },
+ "problemMatcher": [],
+ "detail": "Install gomarkdoc dependency"
}
]
}
\ No newline at end of file
diff --git a/docs/api/bootstrap.md b/docs/api/bootstrap.md
new file mode 100644
index 000000000..98fe3c0b7
--- /dev/null
+++ b/docs/api/bootstrap.md
@@ -0,0 +1,51 @@
+
+
+# bootstrap
+
+```go
+import "kaijuengine.com/bootstrap"
+```
+
+## Index
+
+- [func Main\(game GameInterface, platformState any\)](<#Main>)
+- [type GameInterface](<#GameInterface>)
+
+
+
+## func [Main]()
+
+```go
+func Main(game GameInterface, platformState any)
+```
+
+
+
+
+## type [GameInterface]()
+
+GameInterface is the primary interface to implement in order to bootstrap a game/application.
+
+```go
+type GameInterface interface {
+ // Launch is used to bootstrap a game, the game should fill out this
+ // function's details to initialize itself. No updates are provided by the
+ // engine, so it is on the the implementing code to take care of registering
+ // any udpates with the supplied host.
+ Launch(*engine.Host)
+
+ // PluginRegistry is used to expose types to be exported for use in Lua.
+ // Any type returned here will have it's members and functions mapped to
+ // be called by Lua. You can run the engine with the command line argument
+ // "generate=pluginapi" to dump a Lua API file and ensure your exposed
+ // types have been correctly inserted.
+ PluginRegistry() []reflect.Type
+
+ // ContentDatabase must return the database interface for the engine to use
+ // when it is trying to access content. You can use exsiting types that
+ // implement [assets.Database], or you can create your own.
+ ContentDatabase() (assets.Database, error)
+}
+```
+
+Generated by [gomarkdoc]()
diff --git a/docs/api/debug.md b/docs/api/debug.md
new file mode 100644
index 000000000..350008ac3
--- /dev/null
+++ b/docs/api/debug.md
@@ -0,0 +1,112 @@
+
+
+# debug
+
+```go
+import "kaijuengine.com/debug"
+```
+
+## Index
+
+- [Variables](<#variables>)
+- [func Assert\(res bool, msg string\)](<#Assert>)
+- [func Ensure\(res bool\)](<#Ensure>)
+- [func EnsureMsg\(res bool, msg string\)](<#EnsureMsg>)
+- [func EnsureNotError\(err error\)](<#EnsureNotError>)
+- [func EnsureNotNil\(target any\)](<#EnsureNotNil>)
+- [func Halt\(msg string\)](<#Halt>)
+- [func Log\(msg string, args ...any\)](<#Log>)
+- [func Throw\(message string\)](<#Throw>)
+- [func ThrowNotImplemented\(todo string\)](<#ThrowNotImplemented>)
+
+
+## Variables
+
+
+
+```go
+var NotImplementedError = errors.New("not implemented")
+```
+
+
+## func [Assert]()
+
+```go
+func Assert(res bool, msg string)
+```
+
+
+
+
+## func [Ensure]()
+
+```go
+func Ensure(res bool)
+```
+
+
+
+
+## func [EnsureMsg]()
+
+```go
+func EnsureMsg(res bool, msg string)
+```
+
+
+
+
+## func [EnsureNotError]()
+
+```go
+func EnsureNotError(err error)
+```
+
+
+
+
+## func [EnsureNotNil]()
+
+```go
+func EnsureNotNil(target any)
+```
+
+
+
+
+## func [Halt]()
+
+```go
+func Halt(msg string)
+```
+
+
+
+
+## func [Log]()
+
+```go
+func Log(msg string, args ...any)
+```
+
+
+
+
+## func [Throw]()
+
+```go
+func Throw(message string)
+```
+
+
+
+
+## func [ThrowNotImplemented]()
+
+```go
+func ThrowNotImplemented(todo string)
+```
+
+
+
+Generated by [gomarkdoc]()
diff --git a/docs/api/editor.md b/docs/api/editor.md
new file mode 100644
index 000000000..e9974f675
--- /dev/null
+++ b/docs/api/editor.md
@@ -0,0 +1,480 @@
+
+
+# editor
+
+```go
+import "kaijuengine.com/editor"
+```
+
+## Index
+
+- [Constants](<#constants>)
+- [func RegisterPlugin\(key string, plugin editor\_plugin.EditorPlugin\)](<#RegisterPlugin>)
+- [type Editor](<#Editor>)
+ - [func \(ed \*Editor\) BlurInterface\(\)](<#Editor.BlurInterface>)
+ - [func \(ed \*Editor\) Build\(buildMode project.GameBuildMode\)](<#Editor.Build>)
+ - [func \(ed \*Editor\) BuildAndRun\(buildMode project.GameBuildMode\)](<#Editor.BuildAndRun>)
+ - [func \(ed \*Editor\) BuildAndRunCurrentStage\(\)](<#Editor.BuildAndRunCurrentStage>)
+ - [func \(ed \*Editor\) Cache\(\) \*content\_database.Cache](<#Editor.Cache>)
+ - [func \(ed \*Editor\) ContentPreviewer\(\) \*content\_previews.ContentPreviewer](<#Editor.ContentPreviewer>)
+ - [func \(ed \*Editor\) ContentWorkspaceSelected\(\)](<#Editor.ContentWorkspaceSelected>)
+ - [func \(ed \*Editor\) CreateHtmlUiFile\(name string\)](<#Editor.CreateHtmlUiFile>)
+ - [func \(ed \*Editor\) CreateNewCamera\(\)](<#Editor.CreateNewCamera>)
+ - [func \(ed \*Editor\) CreateNewEntity\(\)](<#Editor.CreateNewEntity>)
+ - [func \(ed \*Editor\) CreateNewLight\(\)](<#Editor.CreateNewLight>)
+ - [func \(ed \*Editor\) CreateNewStage\(\)](<#Editor.CreateNewStage>)
+ - [func \(ed \*Editor\) CreatePluginProject\(path string\)](<#Editor.CreatePluginProject>)
+ - [func \(ed \*Editor\) Events\(\) \*editor\_events.EditorEvents](<#Editor.Events>)
+ - [func \(ed \*Editor\) FocusInterface\(\)](<#Editor.FocusInterface>)
+ - [func \(ed \*Editor\) History\(\) \*memento.History](<#Editor.History>)
+ - [func \(ed \*Editor\) Host\(\) \*engine.Host](<#Editor.Host>)
+ - [func \(ed \*Editor\) IsInputFocused\(\) bool](<#Editor.IsInputFocused>)
+ - [func \(ed \*Editor\) OpenCodeEditor\(\)](<#Editor.OpenCodeEditor>)
+ - [func \(ed \*Editor\) OpenStageInStageWorkspace\(id string\)](<#Editor.OpenStageInStageWorkspace>)
+ - [func \(ed \*Editor\) Project\(\) \*project.Project](<#Editor.Project>)
+ - [func \(ed \*Editor\) ProjectFileSystem\(\) \*project\_file\_system.FileSystem](<#Editor.ProjectFileSystem>)
+ - [func \(ed \*Editor\) RecompileWithPlugins\(plugins \[\]editor\_plugin.PluginInfo, onComplete func\(err error\)\) error](<#Editor.RecompileWithPlugins>)
+ - [func \(ed \*Editor\) SaveCurrentStage\(\)](<#Editor.SaveCurrentStage>)
+ - [func \(ed \*Editor\) SaveCurrentStageWithCallback\(cb func\(bool\)\)](<#Editor.SaveCurrentStageWithCallback>)
+ - [func \(ed \*Editor\) Settings\(\) \*editor\_settings.Settings](<#Editor.Settings>)
+ - [func \(ed \*Editor\) SettingsWorkspaceSelected\(\)](<#Editor.SettingsWorkspaceSelected>)
+ - [func \(ed \*Editor\) ShadingWorkspace\(\) \*shading\_workspace.ShadingWorkspace](<#Editor.ShadingWorkspace>)
+ - [func \(ed \*Editor\) ShadingWorkspaceSelected\(\)](<#Editor.ShadingWorkspaceSelected>)
+ - [func \(ed \*Editor\) ShowReferences\(id string\)](<#Editor.ShowReferences>)
+ - [func \(ed \*Editor\) StageView\(\) \*editor\_stage\_view.StageView](<#Editor.StageView>)
+ - [func \(ed \*Editor\) StageWorkspaceSelected\(\)](<#Editor.StageWorkspaceSelected>)
+ - [func \(ed \*Editor\) UIWorkspaceSelected\(\)](<#Editor.UIWorkspaceSelected>)
+ - [func \(ed \*Editor\) UpdateSettings\(\)](<#Editor.UpdateSettings>)
+ - [func \(ed \*Editor\) VfxWorkspace\(\) \*vfx\_workspace.VfxWorkspace](<#Editor.VfxWorkspace>)
+ - [func \(ed \*Editor\) VfxWorkspaceSelected\(\)](<#Editor.VfxWorkspaceSelected>)
+ - [func \(ed \*Editor\) ViewHtmlUi\(id string\)](<#Editor.ViewHtmlUi>)
+- [type EditorGame](<#EditorGame>)
+ - [func \(EditorGame\) ContentDatabase\(\) \(assets.Database, error\)](<#EditorGame.ContentDatabase>)
+ - [func \(EditorGame\) Launch\(host \*engine.Host\)](<#EditorGame.Launch>)
+ - [func \(EditorGame\) PluginRegistry\(\) \[\]reflect.Type](<#EditorGame.PluginRegistry>)
+- [type WorkspaceState](<#WorkspaceState>)
+
+
+## Constants
+
+
+
+```go
+const (
+ WorkspaceStateNone = WorkspaceState(iota)
+ WorkspaceStateStage
+ WorkspaceStateContent
+ WorkspaceStateShading
+ WorkspaceStateVfx
+ WorkspaceStateUI
+ WorkspaceStateSettings
+)
+```
+
+
+
+```go
+const EditorVersion float64 = 0.0013
+```
+
+
+## func [RegisterPlugin]()
+
+```go
+func RegisterPlugin(key string, plugin editor_plugin.EditorPlugin)
+```
+
+
+
+
+## type [Editor]()
+
+Editor is the entry point structure for the entire editor. It acts as the delegate to the various systems and holds the primary members that make up the bulk of the editor identity.
+
+The design goal of the editor is different than that of the \[engine.Host\], as it is not intended to be passed around for access to the system. Instead it will supply interface functions that are needed to the systems that it holds internally.
+
+```go
+type Editor struct {
+ // contains filtered or unexported fields
+}
+```
+
+
+### func \(\*Editor\) [BlurInterface]()
+
+```go
+func (ed *Editor) BlurInterface()
+```
+
+FocusInterface is responsible for disabling the input on the various interfaces that are currently presented to the developer. This primarily includes the menu bar, status bar, and whichever workspace is active.
+
+
+### func \(\*Editor\) [Build]()
+
+```go
+func (ed *Editor) Build(buildMode project.GameBuildMode)
+```
+
+
+
+
+### func \(\*Editor\) [BuildAndRun]()
+
+```go
+func (ed *Editor) BuildAndRun(buildMode project.GameBuildMode)
+```
+
+
+
+
+### func \(\*Editor\) [BuildAndRunCurrentStage]()
+
+```go
+func (ed *Editor) BuildAndRunCurrentStage()
+```
+
+
+
+
+### func \(\*Editor\) [Cache]()
+
+```go
+func (ed *Editor) Cache() *content_database.Cache
+```
+
+
+
+
+### func \(\*Editor\) [ContentPreviewer]()
+
+```go
+func (ed *Editor) ContentPreviewer() *content_previews.ContentPreviewer
+```
+
+
+
+
+### func \(\*Editor\) [ContentWorkspaceSelected]()
+
+```go
+func (ed *Editor) ContentWorkspaceSelected()
+```
+
+ContentWorkspaceSelected will inform the editor that the developer has changed to the content workspace. This is an exposed function to meet the interface needs of \[menu\_bar.MenuBarHandler\].
+
+
+### func \(\*Editor\) [CreateHtmlUiFile]()
+
+```go
+func (ed *Editor) CreateHtmlUiFile(name string)
+```
+
+
+
+
+### func \(\*Editor\) [CreateNewCamera]()
+
+```go
+func (ed *Editor) CreateNewCamera()
+```
+
+
+
+
+### func \(\*Editor\) [CreateNewEntity]()
+
+```go
+func (ed *Editor) CreateNewEntity()
+```
+
+
+
+
+### func \(\*Editor\) [CreateNewLight]()
+
+```go
+func (ed *Editor) CreateNewLight()
+```
+
+
+
+
+### func \(\*Editor\) [CreateNewStage]()
+
+```go
+func (ed *Editor) CreateNewStage()
+```
+
+
+
+
+### func \(\*Editor\) [CreatePluginProject]()
+
+```go
+func (ed *Editor) CreatePluginProject(path string)
+```
+
+
+
+
+### func \(\*Editor\) [Events]()
+
+```go
+func (ed *Editor) Events() *editor_events.EditorEvents
+```
+
+
+
+
+### func \(\*Editor\) [FocusInterface]()
+
+```go
+func (ed *Editor) FocusInterface()
+```
+
+FocusInterface is responsible for enabling the input on the various interfaces that are currently presented to the developer. This primarily includes the menu bar, status bar, and whichever workspace is active.
+
+
+### func \(\*Editor\) [History]()
+
+```go
+func (ed *Editor) History() *memento.History
+```
+
+
+
+
+### func \(\*Editor\) [Host]()
+
+```go
+func (ed *Editor) Host() *engine.Host
+```
+
+
+
+
+### func \(\*Editor\) [IsInputFocused]()
+
+```go
+func (ed *Editor) IsInputFocused() bool
+```
+
+
+
+
+### func \(\*Editor\) [OpenCodeEditor]()
+
+```go
+func (ed *Editor) OpenCodeEditor()
+```
+
+OpenCodeEditor will run a command specified in CodeEditor settings entry directly to the project top level folder. This is an exposed function to meet the interface needs of \[menu\_bar.MenuBarHandler\]. func \(ed \*Editor\) OpenVSCodeProject\(\) \{
+
+
+### func \(\*Editor\) [OpenStageInStageWorkspace]()
+
+```go
+func (ed *Editor) OpenStageInStageWorkspace(id string)
+```
+
+
+
+
+### func \(\*Editor\) [Project]()
+
+```go
+func (ed *Editor) Project() *project.Project
+```
+
+
+
+
+### func \(\*Editor\) [ProjectFileSystem]()
+
+```go
+func (ed *Editor) ProjectFileSystem() *project_file_system.FileSystem
+```
+
+
+
+
+### func \(\*Editor\) [RecompileWithPlugins]()
+
+```go
+func (ed *Editor) RecompileWithPlugins(plugins []editor_plugin.PluginInfo, onComplete func(err error)) error
+```
+
+
+
+
+### func \(\*Editor\) [SaveCurrentStage]()
+
+```go
+func (ed *Editor) SaveCurrentStage()
+```
+
+SaveCurrentStage will save the currently open stage file. This is an exposed function to meet the interface needs of \[menu\_bar.MenuBarHandler\].
+
+
+### func \(\*Editor\) [SaveCurrentStageWithCallback]()
+
+```go
+func (ed *Editor) SaveCurrentStageWithCallback(cb func(bool))
+```
+
+
+
+
+### func \(\*Editor\) [Settings]()
+
+```go
+func (ed *Editor) Settings() *editor_settings.Settings
+```
+
+
+
+
+### func \(\*Editor\) [SettingsWorkspaceSelected]()
+
+```go
+func (ed *Editor) SettingsWorkspaceSelected()
+```
+
+SettingsWorkspaceSelected will inform the editor that the developer has changed to the settings workspace. This is an exposed function to meet the interface needs of \[menu\_bar.MenuBarHandler\].
+
+
+### func \(\*Editor\) [ShadingWorkspace]()
+
+```go
+func (ed *Editor) ShadingWorkspace() *shading_workspace.ShadingWorkspace
+```
+
+
+
+
+### func \(\*Editor\) [ShadingWorkspaceSelected]()
+
+```go
+func (ed *Editor) ShadingWorkspaceSelected()
+```
+
+ShadingWorkspaceSelected will inform the editor that the developer has changed to the shading workspace. This is an exposed function to meet the interface needs of \[menu\_bar.MenuBarHandler\].
+
+
+### func \(\*Editor\) [ShowReferences]()
+
+```go
+func (ed *Editor) ShowReferences(id string)
+```
+
+
+
+
+### func \(\*Editor\) [StageView]()
+
+```go
+func (ed *Editor) StageView() *editor_stage_view.StageView
+```
+
+
+
+
+### func \(\*Editor\) [StageWorkspaceSelected]()
+
+```go
+func (ed *Editor) StageWorkspaceSelected()
+```
+
+StageWorkspaceSelected will inform the editor that the developer has changed to the stage workspace. This is an exposed function to meet the interface needs of \[menu\_bar.MenuBarHandler\].
+
+
+### func \(\*Editor\) [UIWorkspaceSelected]()
+
+```go
+func (ed *Editor) UIWorkspaceSelected()
+```
+
+UIWorkspaceSelected will inform the editor that the developer has changed to the ui workspace. This is an exposed function to meet the interface needs of \[menu\_bar.MenuBarHandler\].
+
+
+### func \(\*Editor\) [UpdateSettings]()
+
+```go
+func (ed *Editor) UpdateSettings()
+```
+
+
+
+
+### func \(\*Editor\) [VfxWorkspace]()
+
+```go
+func (ed *Editor) VfxWorkspace() *vfx_workspace.VfxWorkspace
+```
+
+
+
+
+### func \(\*Editor\) [VfxWorkspaceSelected]()
+
+```go
+func (ed *Editor) VfxWorkspaceSelected()
+```
+
+
+
+
+### func \(\*Editor\) [ViewHtmlUi]()
+
+```go
+func (ed *Editor) ViewHtmlUi(id string)
+```
+
+
+
+
+## type [EditorGame]()
+
+EditorGame satisfies \[bootstrap.GameInterface\] and will allow the engine to bootstrap the editor \(as it would a game\).
+
+```go
+type EditorGame struct{}
+```
+
+
+### func \(EditorGame\) [ContentDatabase]()
+
+```go
+func (EditorGame) ContentDatabase() (assets.Database, error)
+```
+
+
+
+
+### func \(EditorGame\) [Launch]()
+
+```go
+func (EditorGame) Launch(host *engine.Host)
+```
+
+
+
+
+### func \(EditorGame\) [PluginRegistry]()
+
+```go
+func (EditorGame) PluginRegistry() []reflect.Type
+```
+
+
+
+
+## type [WorkspaceState]()
+
+
+
+```go
+type WorkspaceState = uint8
+```
+
+Generated by [gomarkdoc]()
diff --git a/docs/api/engine.md b/docs/api/engine.md
new file mode 100644
index 000000000..70b7b98f4
--- /dev/null
+++ b/docs/api/engine.md
@@ -0,0 +1,1154 @@
+
+
+# engine
+
+```go
+import "kaijuengine.com/engine"
+```
+
+## Index
+
+- [Constants](<#constants>)
+- [Variables](<#variables>)
+- [func LoadLaunchParams\(\)](<#LoadLaunchParams>)
+- [func ReflectValueFromJson\(v any, f reflect.Value\)](<#ReflectValueFromJson>)
+- [func RegisterEntityData\(value EntityData\) error](<#RegisterEntityData>)
+- [type Entity](<#Entity>)
+ - [func NewEntity\(workGroup \*concurrent.WorkGroup\) \*Entity](<#NewEntity>)
+ - [func \(e \*Entity\) Activate\(\)](<#Entity.Activate>)
+ - [func \(e \*Entity\) AddNamedData\(key string, data any\)](<#Entity.AddNamedData>)
+ - [func \(e \*Entity\) ChildAt\(idx int\) \*Entity](<#Entity.ChildAt>)
+ - [func \(e \*Entity\) ChildCount\(\) int](<#Entity.ChildCount>)
+ - [func \(e \*Entity\) Copy\(other \*Entity\)](<#Entity.Copy>)
+ - [func \(e \*Entity\) Deactivate\(\)](<#Entity.Deactivate>)
+ - [func \(e \*Entity\) DestroyShaderData\(\)](<#Entity.DestroyShaderData>)
+ - [func \(e \*Entity\) Duplicate\(workGroup \*concurrent.WorkGroup\) \*Entity](<#Entity.Duplicate>)
+ - [func \(e \*Entity\) FindByName\(name string\) \*Entity](<#Entity.FindByName>)
+ - [func \(e \*Entity\) ForceCleanup\(\)](<#Entity.ForceCleanup>)
+ - [func \(e \*Entity\) HasChildRecursive\(child \*Entity\) bool](<#Entity.HasChildRecursive>)
+ - [func \(e \*Entity\) HasChildren\(\) bool](<#Entity.HasChildren>)
+ - [func \(e \*Entity\) HasParent\(parent \*Entity\) bool](<#Entity.HasParent>)
+ - [func \(e \*Entity\) Id\(\) EntityId](<#Entity.Id>)
+ - [func \(e \*Entity\) IndexOfChild\(child \*Entity\) int](<#Entity.IndexOfChild>)
+ - [func \(e \*Entity\) Init\(workGroup \*concurrent.WorkGroup\)](<#Entity.Init>)
+ - [func \(e \*Entity\) IsActive\(\) bool](<#Entity.IsActive>)
+ - [func \(e \*Entity\) IsDestroyed\(\) bool](<#Entity.IsDestroyed>)
+ - [func \(e \*Entity\) IsRoot\(\) bool](<#Entity.IsRoot>)
+ - [func \(e \*Entity\) Name\(\) string](<#Entity.Name>)
+ - [func \(e \*Entity\) NamedData\(key string\) \[\]any](<#Entity.NamedData>)
+ - [func \(e \*Entity\) RemoveNamedData\(key string, data any\)](<#Entity.RemoveNamedData>)
+ - [func \(e \*Entity\) RemoveNamedDataByName\(key string\)](<#Entity.RemoveNamedDataByName>)
+ - [func \(e \*Entity\) Root\(\) \*Entity](<#Entity.Root>)
+ - [func \(e \*Entity\) SetActive\(isActive bool\)](<#Entity.SetActive>)
+ - [func \(e \*Entity\) SetChildrenOrdered\(\)](<#Entity.SetChildrenOrdered>)
+ - [func \(e \*Entity\) SetChildrenUnordered\(\)](<#Entity.SetChildrenUnordered>)
+ - [func \(e \*Entity\) SetName\(name string\)](<#Entity.SetName>)
+ - [func \(e \*Entity\) SetParent\(newParent \*Entity\)](<#Entity.SetParent>)
+ - [func \(e \*Entity\) ShaderData\(\) rendering.DrawInstance](<#Entity.ShaderData>)
+ - [func \(e \*Entity\) StoreShaderData\(sd rendering.DrawInstance\)](<#Entity.StoreShaderData>)
+- [type EntityData](<#EntityData>)
+- [type EntityId](<#EntityId>)
+- [type FrameId](<#FrameId>)
+- [type Host](<#Host>)
+ - [func NewHost\(name string, logStream \*logging.LogStream, assetDb assets.Database\) \*Host](<#NewHost>)
+ - [func \(host \*Host\) AssetDatabase\(\) assets.Database](<#Host.AssetDatabase>)
+ - [func \(host \*Host\) Audio\(\) \*audio.Audio](<#Host.Audio>)
+ - [func \(host \*Host\) Close\(\)](<#Host.Close>)
+ - [func \(host \*Host\) CollisionManager\(\) \*collision\_system.Manager](<#Host.CollisionManager>)
+ - [func \(h \*Host\) Deadline\(\) \(time.Time, bool\)](<#Host.Deadline>)
+ - [func \(host \*Host\) DestroyEntity\(entity \*Entity\)](<#Host.DestroyEntity>)
+ - [func \(h \*Host\) Done\(\) \<\-chan struct\{\}](<#Host.Done>)
+ - [func \(h \*Host\) Err\(\) error](<#Host.Err>)
+ - [func \(host \*Host\) FontCache\(\) \*rendering.FontCache](<#Host.FontCache>)
+ - [func \(host \*Host\) Frame\(\) FrameId](<#Host.Frame>)
+ - [func \(host \*Host\) Game\(\) any](<#Host.Game>)
+ - [func \(host \*Host\) ImportPlugins\(path string\) error](<#Host.ImportPlugins>)
+ - [func \(host \*Host\) Initialize\(width, height, x, y int, platformState any\) error](<#Host.Initialize>)
+ - [func \(host \*Host\) InitializeAudio\(\) \(err error\)](<#Host.InitializeAudio>)
+ - [func \(host \*Host\) InitializeRenderer\(\) error](<#Host.InitializeRenderer>)
+ - [func \(host \*Host\) Lighting\(\) \*lighting.LightingInformation](<#Host.Lighting>)
+ - [func \(host \*Host\) MaterialCache\(\) \*rendering.MaterialCache](<#Host.MaterialCache>)
+ - [func \(host \*Host\) MeshCache\(\) \*rendering.MeshCache](<#Host.MeshCache>)
+ - [func \(host \*Host\) Name\(\) string](<#Host.Name>)
+ - [func \(host \*Host\) Physics\(\) \*StagePhysics](<#Host.Physics>)
+ - [func \(host \*Host\) Plugins\(\) \[\]\*plugins.LuaVM](<#Host.Plugins>)
+ - [func \(host \*Host\) PrimaryCamera\(\) cameras.Camera](<#Host.PrimaryCamera>)
+ - [func \(host \*Host\) Render\(\)](<#Host.Render>)
+ - [func \(host \*Host\) RunAfterFrames\(wait int, call func\(\)\)](<#Host.RunAfterFrames>)
+ - [func \(host \*Host\) RunAfterNextUIClean\(call func\(\)\)](<#Host.RunAfterNextUIClean>)
+ - [func \(host \*Host\) RunAfterTime\(wait time.Duration, call func\(\)\)](<#Host.RunAfterTime>)
+ - [func \(host \*Host\) RunBeforeRender\(call func\(\)\)](<#Host.RunBeforeRender>)
+ - [func \(host \*Host\) RunNextFrame\(call func\(\)\)](<#Host.RunNextFrame>)
+ - [func \(host \*Host\) RunOnMainThread\(call func\(\)\)](<#Host.RunOnMainThread>)
+ - [func \(host \*Host\) Runtime\(\) float64](<#Host.Runtime>)
+ - [func \(h \*Host\) SetFrameRateLimit\(fps int64\)](<#Host.SetFrameRateLimit>)
+ - [func \(host \*Host\) SetGame\(game any\)](<#Host.SetGame>)
+ - [func \(host \*Host\) ShaderCache\(\) \*rendering.ShaderCache](<#Host.ShaderCache>)
+ - [func \(host \*Host\) StartPhysics\(\)](<#Host.StartPhysics>)
+ - [func \(host \*Host\) Teardown\(\)](<#Host.Teardown>)
+ - [func \(host \*Host\) TextureCache\(\) \*rendering.TextureCache](<#Host.TextureCache>)
+ - [func \(host \*Host\) Threads\(\) \*concurrent.Threads](<#Host.Threads>)
+ - [func \(host \*Host\) UICamera\(\) cameras.Camera](<#Host.UICamera>)
+ - [func \(host \*Host\) UIThreads\(\) \*concurrent.Threads](<#Host.UIThreads>)
+ - [func \(host \*Host\) Update\(deltaTime float64\)](<#Host.Update>)
+ - [func \(h \*Host\) Value\(key any\) any](<#Host.Value>)
+ - [func \(h \*Host\) WaitForFrameRate\(\)](<#Host.WaitForFrameRate>)
+ - [func \(host \*Host\) WorkGroup\(\) \*concurrent.WorkGroup](<#Host.WorkGroup>)
+- [type LaunchParameters](<#LaunchParameters>)
+- [type StagePhysics](<#StagePhysics>)
+ - [func \(p \*StagePhysics\) AddEntity\(entity \*Entity, body \*physics.RigidBody\)](<#StagePhysics.AddEntity>)
+ - [func \(p \*StagePhysics\) Destroy\(\)](<#StagePhysics.Destroy>)
+ - [func \(p \*StagePhysics\) FindCollision\(hit physics.CollisionHit\) \(\*StagePhysicsEntry, bool\)](<#StagePhysics.FindCollision>)
+ - [func \(p \*StagePhysics\) IsActive\(\) bool](<#StagePhysics.IsActive>)
+ - [func \(p \*StagePhysics\) Start\(\)](<#StagePhysics.Start>)
+ - [func \(p \*StagePhysics\) Update\(threads \*concurrent.Threads, deltaTime float64\)](<#StagePhysics.Update>)
+ - [func \(p \*StagePhysics\) World\(\) \*physics.World](<#StagePhysics.World>)
+- [type StagePhysicsEntry](<#StagePhysicsEntry>)
+- [type UpdateId](<#UpdateId>)
+ - [func \(u \*UpdateId\) IsValid\(\) bool](<#UpdateId.IsValid>)
+- [type Updater](<#Updater>)
+ - [func NewConcurrentUpdater\(threads \*concurrent.Threads\) Updater](<#NewConcurrentUpdater>)
+ - [func NewUpdater\(\) Updater](<#NewUpdater>)
+ - [func \(u \*Updater\) AddUpdate\(update func\(float64\)\) UpdateId](<#Updater.AddUpdate>)
+ - [func \(u \*Updater\) Destroy\(\)](<#Updater.Destroy>)
+ - [func \(u \*Updater\) IsConcurrent\(\) bool](<#Updater.IsConcurrent>)
+ - [func \(u \*Updater\) RemoveUpdate\(id \*UpdateId\)](<#Updater.RemoveUpdate>)
+ - [func \(u \*Updater\) Update\(deltaTime float64\)](<#Updater.Update>)
+
+
+## Constants
+
+
+
+```go
+const (
+ DefaultWindowWidth = 1280
+ DefaultWindowHeight = 720
+)
+```
+
+InvalidFrameId can be used to indicate that a frame id is invalid
+
+```go
+const InvalidFrameId = math.MaxUint64
+```
+
+## Variables
+
+
+
+```go
+var DebugEntityDataRegistry = map[string]EntityData{}
+```
+
+
+
+```go
+var LaunchParams = LaunchParameters{}
+```
+
+
+## func [LoadLaunchParams]()
+
+```go
+func LoadLaunchParams()
+```
+
+
+
+
+## func [ReflectValueFromJson]()
+
+```go
+func ReflectValueFromJson(v any, f reflect.Value)
+```
+
+
+
+
+## func [RegisterEntityData]()
+
+```go
+func RegisterEntityData(value EntityData) error
+```
+
+
+
+
+## type [Entity]()
+
+Entity is a struct that represents an arbitrary object in the host system. It contains a 3D transformation and can be a parent of, or a child to, other entities. Entities can also contain arbitrary named data to make it easier to access data that is specific to the entity.
+
+Child entities are unordered by default, you'll need to call \#Entity.SetChildrenOrdered to make them ordered. It is recommended to leave children unordered unless you have a specific reason to order them.
+
+```go
+type Entity struct {
+ Transform matrix.Transform
+ Parent *Entity
+ Children []*Entity
+
+ OnDestroy events.Event
+ OnDestroyRequested events.Event
+ OnActivate events.Event
+ OnDeactivate events.Event
+ // contains filtered or unexported fields
+}
+```
+
+
+### func [NewEntity]()
+
+```go
+func NewEntity(workGroup *concurrent.WorkGroup) *Entity
+```
+
+NewEntity creates a new \#Entity struct and returns it
+
+
+### func \(\*Entity\) [Activate]()
+
+```go
+func (e *Entity) Activate()
+```
+
+Activate will set an active flag on the entity that can be queried with \#Entity.IsActive. It will also set the active flag on all children of the entity. If the entity is already active, this function will do nothing.
+
+
+### func \(\*Entity\) [AddNamedData]()
+
+```go
+func (e *Entity) AddNamedData(key string, data any)
+```
+
+AddNamedData allows you to add arbitrary data to the entity that can be accessed by a string key. This is useful for storing data that is specific to the entity.
+
+Named data is stored in a map of slices, so you can add multiple pieces of data to the same key. It is recommended to compile the data into a single structure so the slice length is 1, but sometimes that's not reasonable.
+
+
+### func \(\*Entity\) [ChildAt]()
+
+```go
+func (e *Entity) ChildAt(idx int) *Entity
+```
+
+ChildAt returns the child entity at the specified index
+
+
+### func \(\*Entity\) [ChildCount]()
+
+```go
+func (e *Entity) ChildCount() int
+```
+
+ChildCount returns the number of children the entity has
+
+
+### func \(\*Entity\) [Copy]()
+
+```go
+func (e *Entity) Copy(other *Entity)
+```
+
+
+
+
+### func \(\*Entity\) [Deactivate]()
+
+```go
+func (e *Entity) Deactivate()
+```
+
+Deactivate will set an active flag on the entity that can be queried with \#Entity.IsActive. It will also set the active flag on all children of the entity. If the entity is already inactive, this function will do nothing.
+
+
+### func \(\*Entity\) [DestroyShaderData]()
+
+```go
+func (e *Entity) DestroyShaderData()
+```
+
+
+
+
+### func \(\*Entity\) [Duplicate]()
+
+```go
+func (e *Entity) Duplicate(workGroup *concurrent.WorkGroup) *Entity
+```
+
+
+
+
+### func \(\*Entity\) [FindByName]()
+
+```go
+func (e *Entity) FindByName(name string) *Entity
+```
+
+FindByName will search the entity and the tree of children for the first entity with the specified name. If no entity is found, nil will be returned.
+
+
+### func \(\*Entity\) [ForceCleanup]()
+
+```go
+func (e *Entity) ForceCleanup()
+```
+
+ForceCleanup will force the full cleanup of the entity, typically this is to be called in very specific scenarios and not directly in game code. Unless there is a good reason \(like this entity no longer bein gin the host\).
+
+
+### func \(\*Entity\) [HasChildRecursive]()
+
+```go
+func (e *Entity) HasChildRecursive(child *Entity) bool
+```
+
+
+
+
+### func \(\*Entity\) [HasChildren]()
+
+```go
+func (e *Entity) HasChildren() bool
+```
+
+HasChildren returns true if the entity has any children
+
+
+### func \(\*Entity\) [HasParent]()
+
+```go
+func (e *Entity) HasParent(parent *Entity) bool
+```
+
+HasParent will loop through each parent and determine if any of them is the parent Entity supplied. If so, then it will return true, false otherwise.
+
+
+### func \(\*Entity\) [Id]()
+
+```go
+func (e *Entity) Id() EntityId
+```
+
+ID returns the unique identifier of the entity. The Id is only valid for entities that are not generated through template instantiation. The Id may also be stripped during game runtime if the entity is never externally referenced by any other part of the system.
+
+
+### func \(\*Entity\) [IndexOfChild]()
+
+```go
+func (e *Entity) IndexOfChild(child *Entity) int
+```
+
+
+
+
+### func \(\*Entity\) [Init]()
+
+```go
+func (e *Entity) Init(workGroup *concurrent.WorkGroup)
+```
+
+
+
+
+### func \(\*Entity\) [IsActive]()
+
+```go
+func (e *Entity) IsActive() bool
+```
+
+IsActive will return true if the entity is active, false otherwise
+
+
+### func \(\*Entity\) [IsDestroyed]()
+
+```go
+func (e *Entity) IsDestroyed() bool
+```
+
+IsDestroyed will return true if the entity is destroyed, false otherwise
+
+
+### func \(\*Entity\) [IsRoot]()
+
+```go
+func (e *Entity) IsRoot() bool
+```
+
+IsRoot returns true if the entity is the root entity in the hierarchy
+
+
+### func \(\*Entity\) [Name]()
+
+```go
+func (e *Entity) Name() string
+```
+
+Name returns the name of the entity
+
+
+### func \(\*Entity\) [NamedData]()
+
+```go
+func (e *Entity) NamedData(key string) []any
+```
+
+NamedData will return the data associated with the specified key. If the key does not exist, nil will be returned.
+
+
+### func \(\*Entity\) [RemoveNamedData]()
+
+```go
+func (e *Entity) RemoveNamedData(key string, data any)
+```
+
+RemoveNamedData will remove the specified data from the entity's named data map. If the key does not exist, this function will do nothing.
+
+\*This will remove the entire slice and all of it's data\*
+
+
+### func \(\*Entity\) [RemoveNamedDataByName]()
+
+```go
+func (e *Entity) RemoveNamedDataByName(key string)
+```
+
+RemoveNamedDataByName will remove all of the stored named data that matches the given key on the entity
+
+
+### func \(\*Entity\) [Root]()
+
+```go
+func (e *Entity) Root() *Entity
+```
+
+Root will return the root entity of the entity's hierarchy
+
+
+### func \(\*Entity\) [SetActive]()
+
+```go
+func (e *Entity) SetActive(isActive bool)
+```
+
+SetActive will set the active flag on the entity that can be queried with \#Entity.IsActive. It will also set the active flag on all children of the entity. If the entity is already active, this function will do nothing.
+
+
+### func \(\*Entity\) [SetChildrenOrdered]()
+
+```go
+func (e *Entity) SetChildrenOrdered()
+```
+
+SetChildrenOrdered sets the children of the entity to be ordered
+
+
+### func \(\*Entity\) [SetChildrenUnordered]()
+
+```go
+func (e *Entity) SetChildrenUnordered()
+```
+
+SetChildrenUnordered sets the children of the entity to be unordered
+
+
+### func \(\*Entity\) [SetName]()
+
+```go
+func (e *Entity) SetName(name string)
+```
+
+SetName sets the name of the entity
+
+
+### func \(\*Entity\) [SetParent]()
+
+```go
+func (e *Entity) SetParent(newParent *Entity)
+```
+
+SetParent will set the parent of the entity. If the entity already has a parent, it will be removed from the parent's children list. If the new parent is nil, the entity will be removed from the hierarchy and will become the root entity. If the new parent is not nil, the entity will be added to the new parent's children list. If the new parent is not active, the entity will be deactivated as well.
+
+This will also handle the transformation parenting internally
+
+
+### func \(\*Entity\) [ShaderData]()
+
+```go
+func (e *Entity) ShaderData() rendering.DrawInstance
+```
+
+
+
+
+### func \(\*Entity\) [StoreShaderData]()
+
+```go
+func (e *Entity) StoreShaderData(sd rendering.DrawInstance)
+```
+
+
+
+
+## type [EntityData]()
+
+
+
+```go
+type EntityData interface {
+ Init(entity *Entity, host *Host)
+}
+```
+
+
+## type [EntityId]()
+
+EntityId is a string that represents a unique identifier for an entity. The identifier is only valid for entities that are not generated through template instantiation. The identifier may also be stripped during game runtime if the entity is never externally referenced by any other part of the system.
+
+```go
+type EntityId string
+```
+
+
+## type [FrameId]()
+
+FrameId is a unique identifier for a frame
+
+```go
+type FrameId = uint64
+```
+
+
+## type [Host]()
+
+Host is the mediator to the entire runtime for the game/editor. It is the main entry point for the game loop and is responsible for managing all entities, the window, and the rendering context. The host can be used to create and manage entities, call update functions on the main thread, and access various caches and resources.
+
+The host is expected to be passed around quite often throughout the program. It is designed to remove things like service locators, singletons, and other global state. You can have multiple hosts in a program to isolate things like windows and game state.
+
+```go
+type Host struct {
+ Window *windowing.Window
+ LogStream *logging.LogStream
+
+ Cameras hostCameras
+
+ Drawings rendering.Drawings
+
+ Closing bool
+ UIUpdater Updater
+ UILateUpdater Updater
+ Updater Updater
+ LateUpdater Updater
+
+ OnClose events.Event
+ CloseSignal chan struct{}
+ // contains filtered or unexported fields
+}
+```
+
+
+### func [NewHost]()
+
+```go
+func NewHost(name string, logStream *logging.LogStream, assetDb assets.Database) *Host
+```
+
+NewHost creates a new host with the given name and log stream. The log stream is the log handler that is used by the slog package functions. A Host that is created through NewHost has no function until \#Host.Initialize is called.
+
+This is primarily called from \#host\_container/New
+
+
+### func \(\*Host\) [AssetDatabase]()
+
+```go
+func (host *Host) AssetDatabase() assets.Database
+```
+
+AssetDatabase returns the asset database for the host
+
+
+### func \(\*Host\) [Audio]()
+
+```go
+func (host *Host) Audio() *audio.Audio
+```
+
+Audio returns the audio system for the host
+
+
+### func \(\*Host\) [Close]()
+
+```go
+func (host *Host) Close()
+```
+
+Close will set the closing flag to true and signal the host to clean up resources and close the window.
+
+
+### func \(\*Host\) [CollisionManager]()
+
+```go
+func (host *Host) CollisionManager() *collision_system.Manager
+```
+
+CollisionManager returns the collision manager for this host
+
+
+### func \(\*Host\) [Deadline]()
+
+```go
+func (h *Host) Deadline() (time.Time, bool)
+```
+
+Deadline is here to fulfil context.Context and will return zero and false
+
+
+### func \(\*Host\) [DestroyEntity]()
+
+```go
+func (host *Host) DestroyEntity(entity *Entity)
+```
+
+DestroyEntity marks the given entity for destruction. The entity will be cleaned up at the beginning of the next frame.
+
+
+### func \(\*Host\) [Done]()
+
+```go
+func (h *Host) Done() <-chan struct{}
+```
+
+Done is here to fulfil context.Context and will cose the CloseSignal channel
+
+
+### func \(\*Host\) [Err]()
+
+```go
+func (h *Host) Err() error
+```
+
+Err is here to fulfil context.Context and will return nil or context.Canceled
+
+
+### func \(\*Host\) [FontCache]()
+
+```go
+func (host *Host) FontCache() *rendering.FontCache
+```
+
+FontCache returns the font cache for the host
+
+
+### func \(\*Host\) [Frame]()
+
+```go
+func (host *Host) Frame() FrameId
+```
+
+Frame will return the current frame id
+
+
+### func \(\*Host\) [Game]()
+
+```go
+func (host *Host) Game() any
+```
+
+Game will return the primary game mediator for the running application. In the editor, this would be \*\[editor.Editor\], in the running game, this will be the \*game\_host.GameHost structure that is generated by the editor and filled out by the developer.
+
+
+### func \(\*Host\) [ImportPlugins]()
+
+```go
+func (host *Host) ImportPlugins(path string) error
+```
+
+ImportPlugins will read all of the plugins that are in the specified folder and prepare them for execution.
+
+
+### func \(\*Host\) [Initialize]()
+
+```go
+func (host *Host) Initialize(width, height, x, y int, platformState any) error
+```
+
+Initializes the various systems and caches that are mediated through the host. This includes the window, the shader cache, the texture cache, the mesh cache, and the font cache, and the camera systems.
+
+
+### func \(\*Host\) [InitializeAudio]()
+
+```go
+func (host *Host) InitializeAudio() (err error)
+```
+
+
+
+
+### func \(\*Host\) [InitializeRenderer]()
+
+```go
+func (host *Host) InitializeRenderer() error
+```
+
+
+
+
+### func \(\*Host\) [Lighting]()
+
+```go
+func (host *Host) Lighting() *lighting.LightingInformation
+```
+
+Lighting returns a pointer to the internal lighting information
+
+
+### func \(\*Host\) [MaterialCache]()
+
+```go
+func (host *Host) MaterialCache() *rendering.MaterialCache
+```
+
+MaterialCache returns the font cache for the host
+
+
+### func \(\*Host\) [MeshCache]()
+
+```go
+func (host *Host) MeshCache() *rendering.MeshCache
+```
+
+MeshCache returns the mesh cache for the host
+
+
+### func \(\*Host\) [Name]()
+
+```go
+func (host *Host) Name() string
+```
+
+Name returns the name of the host
+
+
+### func \(\*Host\) [Physics]()
+
+```go
+func (host *Host) Physics() *StagePhysics
+```
+
+Physics returns the stage physics system
+
+
+### func \(\*Host\) [Plugins]()
+
+```go
+func (host *Host) Plugins() []*plugins.LuaVM
+```
+
+Plugins returns all of the loaded plugins for the host
+
+
+### func \(\*Host\) [PrimaryCamera]()
+
+```go
+func (host *Host) PrimaryCamera() cameras.Camera
+```
+
+
+
+
+### func \(\*Host\) [Render]()
+
+```go
+func (host *Host) Render()
+```
+
+Render will render the scene. This starts by preparing any drawings that are pending. It also creates any pending shaders, textures, and meshes before the start of the render. The frame is then readied, buffers swapped, and any transformations that are dirty on entities are then cleaned.
+
+
+### func \(\*Host\) [RunAfterFrames]()
+
+```go
+func (host *Host) RunAfterFrames(wait int, call func())
+```
+
+RunAfterFrames will call the given function after the given number of frames have passed from the current frame
+
+
+### func \(\*Host\) [RunAfterNextUIClean]()
+
+```go
+func (host *Host) RunAfterNextUIClean(call func())
+```
+
+RunAfterNextUIClean will run the given function on the next frame.
+
+
+### func \(\*Host\) [RunAfterTime]()
+
+```go
+func (host *Host) RunAfterTime(wait time.Duration, call func())
+```
+
+RunAfterTime will call the given function after the given number of time has passed from the current frame
+
+
+### func \(\*Host\) [RunBeforeRender]()
+
+```go
+func (host *Host) RunBeforeRender(call func())
+```
+
+
+
+
+### func \(\*Host\) [RunNextFrame]()
+
+```go
+func (host *Host) RunNextFrame(call func())
+```
+
+RunNextFrame will run the given function on the next frame. This is the same as calling RunAfterFrames\(0, func\(\)\{\}\)
+
+
+### func \(\*Host\) [RunOnMainThread]()
+
+```go
+func (host *Host) RunOnMainThread(call func())
+```
+
+
+
+
+### func \(\*Host\) [Runtime]()
+
+```go
+func (host *Host) Runtime() float64
+```
+
+Runtime will return how long the host has been running in seconds
+
+
+### func \(\*Host\) [SetFrameRateLimit]()
+
+```go
+func (h *Host) SetFrameRateLimit(fps int64)
+```
+
+SetFrameRateLimit will set the frame rate limit for the host. If the frame rate is set to 0, then the frame rate limit will be removed.
+
+If a frame rate is set, then the host will block until the desired frame rate is reached before continuing the update loop.
+
+
+### func \(\*Host\) [SetGame]()
+
+```go
+func (host *Host) SetGame(game any)
+```
+
+SetGame is to be called by the engine in most cases. It is called by the editor when it first starts up to setup the editor game binding. For a game generated by the editor, it will be called when the game is bootstrapped and provide the \*game\_host.GameHost structure. You can call this function at any time you want, but you really only should need to for special cases.
+
+
+### func \(\*Host\) [ShaderCache]()
+
+```go
+func (host *Host) ShaderCache() *rendering.ShaderCache
+```
+
+ShaderCache returns the shader cache for the host
+
+
+### func \(\*Host\) [StartPhysics]()
+
+```go
+func (host *Host) StartPhysics()
+```
+
+
+
+
+### func \(\*Host\) [Teardown]()
+
+```go
+func (host *Host) Teardown()
+```
+
+Teardown will destroy the host and all of its resources. This will also execute the OnClose event. This will also signal the CloseSignal channel.
+
+
+### func \(\*Host\) [TextureCache]()
+
+```go
+func (host *Host) TextureCache() *rendering.TextureCache
+```
+
+TextureCache returns the texture cache for the host
+
+
+### func \(\*Host\) [Threads]()
+
+```go
+func (host *Host) Threads() *concurrent.Threads
+```
+
+Threads returns the long\-running threads for this instance of host
+
+
+### func \(\*Host\) [UICamera]()
+
+```go
+func (host *Host) UICamera() cameras.Camera
+```
+
+
+
+
+### func \(\*Host\) [UIThreads]()
+
+```go
+func (host *Host) UIThreads() *concurrent.Threads
+```
+
+UIThreads returns the long\-running threads for the UI
+
+
+### func \(\*Host\) [Update]()
+
+```go
+func (host *Host) Update(deltaTime float64)
+```
+
+Update is the main update loop for the host. This will poll the window for events, update the entities, and render the scene. This will also check if the window has been closed or crashed and set the closing flag accordingly.
+
+The update order is FrameRunner \-\> Update \-\> LateUpdate \-\> EndUpdate:
+
+\[\-\] FrameRunner: Functions added to RunAfterFrames \[\-\] UIUpdate: Functions added to UIUpdater \[\-\] UILateUpdate: Functions added to UILateUpdater \[\-\] Update: Functions added to Updater \[\-\] LateUpdate: Functions added to LateUpdater \[\-\] EndUpdate: Internal functions for preparing for the next frame
+
+Any destroyed entities will also be ticked for their cleanup. This will also tick the editor entities for cleanup.
+
+
+### func \(\*Host\) [Value]()
+
+```go
+func (h *Host) Value(key any) any
+```
+
+Value is here to fulfil context.Context and will always return nil
+
+
+### func \(\*Host\) [WaitForFrameRate]()
+
+```go
+func (h *Host) WaitForFrameRate()
+```
+
+WaitForFrameRate will block until the desired frame rate limit is reached
+
+
+### func \(\*Host\) [WorkGroup]()
+
+```go
+func (host *Host) WorkGroup() *concurrent.WorkGroup
+```
+
+WorkGroup returns the work group for this instance of host
+
+
+## type [LaunchParameters]()
+
+
+
+```go
+type LaunchParameters struct {
+ Generate string
+ StartStage string
+ Trace bool
+ RecordPGO bool
+ AutoTest bool
+}
+```
+
+
+## type [StagePhysics]()
+
+
+
+```go
+type StagePhysics struct {
+ // contains filtered or unexported fields
+}
+```
+
+
+### func \(\*StagePhysics\) [AddEntity]()
+
+```go
+func (p *StagePhysics) AddEntity(entity *Entity, body *physics.RigidBody)
+```
+
+
+
+
+### func \(\*StagePhysics\) [Destroy]()
+
+```go
+func (p *StagePhysics) Destroy()
+```
+
+
+
+
+### func \(\*StagePhysics\) [FindCollision]()
+
+```go
+func (p *StagePhysics) FindCollision(hit physics.CollisionHit) (*StagePhysicsEntry, bool)
+```
+
+
+
+
+### func \(\*StagePhysics\) [IsActive]()
+
+```go
+func (p *StagePhysics) IsActive() bool
+```
+
+
+
+
+### func \(\*StagePhysics\) [Start]()
+
+```go
+func (p *StagePhysics) Start()
+```
+
+
+
+
+### func \(\*StagePhysics\) [Update]()
+
+```go
+func (p *StagePhysics) Update(threads *concurrent.Threads, deltaTime float64)
+```
+
+
+
+
+### func \(\*StagePhysics\) [World]()
+
+```go
+func (p *StagePhysics) World() *physics.World
+```
+
+
+
+
+## type [StagePhysicsEntry]()
+
+
+
+```go
+type StagePhysicsEntry struct {
+ Entity *Entity
+ Body *physics.RigidBody
+}
+```
+
+
+## type [UpdateId]()
+
+
+
+```go
+type UpdateId int
+```
+
+
+### func \(\*UpdateId\) [IsValid]()
+
+```go
+func (u *UpdateId) IsValid() bool
+```
+
+
+
+
+## type [Updater]()
+
+Updater is a struct that stores update functions to be called when the \#Updater.Update function is called. This simply goes through the list from top to bottom and calls each function.
+
+\*Note that update functions are unordered, so don't rely on the order\*
+
+```go
+type Updater struct {
+ // contains filtered or unexported fields
+}
+```
+
+
+### func [NewConcurrentUpdater]()
+
+```go
+func NewConcurrentUpdater(threads *concurrent.Threads) Updater
+```
+
+NewConcurrentUpdater creates a new concurrent \#Updater struct and returns it
+
+
+### func [NewUpdater]()
+
+```go
+func NewUpdater() Updater
+```
+
+NewUpdater creates a new \#Updater struct and returns it
+
+
+### func \(\*Updater\) [AddUpdate]()
+
+```go
+func (u *Updater) AddUpdate(update func(float64)) UpdateId
+```
+
+AddUpdate adds an update function to the list of updates to be called when the \#Updater.Update function is called. It returns the id of the update function that was added so that it can be removed later.
+
+The update function is added to a back\-buffer so it will not begin updating until the next call to \#Updater.Update.
+
+
+### func \(\*Updater\) [Destroy]()
+
+```go
+func (u *Updater) Destroy()
+```
+
+Destroy cleans up the updater and should be called when the updater is no longer needed. It will close the pending and complete channels and clear the updates map.
+
+
+### func \(\*Updater\) [IsConcurrent]()
+
+```go
+func (u *Updater) IsConcurrent() bool
+```
+
+IsConcurrent will return if this updater is a concurrent updater
+
+
+### func \(\*Updater\) [RemoveUpdate]()
+
+```go
+func (u *Updater) RemoveUpdate(id *UpdateId)
+```
+
+RemoveUpdate removes an update function from the list of updates to be called when the \#Updater.Update function is called. It takes the id of the update function that was returned when the update function was added.
+
+The update function is removed from a back\-buffer so it will not be removed until the next call to \#Updater.Update.
+
+
+### func \(\*Updater\) [Update]()
+
+```go
+func (u *Updater) Update(deltaTime float64)
+```
+
+Update calls all of the update functions that have been added to the updater. It takes a deltaTime parameter that is the approximate amount of time since the last call to \#Updater.Update.
+
+Generated by [gomarkdoc]()
diff --git a/docs/api/framework.md b/docs/api/framework.md
new file mode 100644
index 000000000..9337a4a0c
--- /dev/null
+++ b/docs/api/framework.md
@@ -0,0 +1,417 @@
+
+
+# framework
+
+```go
+import "kaijuengine.com/framework"
+```
+
+## Index
+
+- [func CreateDrawingFromMeshUnlit\(host \*engine.Host, mesh \*rendering.Mesh, textures \[\]\*rendering.Texture\) \(rendering.Drawing, error\)](<#CreateDrawingFromMeshUnlit>)
+- [func CreateDrawingFromMeshUnlitTransparent\(host \*engine.Host, mesh \*rendering.Mesh, textures \[\]\*rendering.Texture\) \(rendering.Drawing, error\)](<#CreateDrawingFromMeshUnlitTransparent>)
+- [func RegisterDrawingSpecification\(spec DrawingSpecification\)](<#RegisterDrawingSpecification>)
+- [func SpawnTemplate\(id string, host \*engine.Host, parent \*engine.Entity\) \(\*engine.Entity, error\)](<#SpawnTemplate>)
+- [func SpawnTemplateWithTransform\(id string, host \*engine.Host, parent \*engine.Entity, pos, rot, scale matrix.Vec3\) \(\*engine.Entity, error\)](<#SpawnTemplateWithTransform>)
+- [type DrawingSpecCreateInfo](<#DrawingSpecCreateInfo>)
+- [type DrawingSpecification](<#DrawingSpecification>)
+ - [func FindDrawingSpecification\(name string\) DrawingSpecification](<#FindDrawingSpecification>)
+ - [func \(s DrawingSpecification\) CreateDrawings\(host \*engine.Host, info DrawingSpecCreateInfo\) \(ModelDrawingSlice, error\)](<#DrawingSpecification.CreateDrawings>)
+ - [func \(s DrawingSpecification\) IsValid\(\) bool](<#DrawingSpecification.IsValid>)
+- [type DrawingSpecificationRenderInfo](<#DrawingSpecificationRenderInfo>)
+- [type EncryptedInt32](<#EncryptedInt32>)
+ - [func \(e \*EncryptedInt32\) Add\(amount int32\)](<#EncryptedInt32.Add>)
+ - [func \(e \*EncryptedInt32\) Decrement\(\)](<#EncryptedInt32.Decrement>)
+ - [func \(e \*EncryptedInt32\) Decrypt\(\)](<#EncryptedInt32.Decrypt>)
+ - [func \(e \*EncryptedInt32\) Encrypt\(\)](<#EncryptedInt32.Encrypt>)
+ - [func \(e \*EncryptedInt32\) Increment\(\)](<#EncryptedInt32.Increment>)
+ - [func \(e \*EncryptedInt32\) SetValue\(value int32\)](<#EncryptedInt32.SetValue>)
+ - [func \(e \*EncryptedInt32\) Subtract\(amount int32\)](<#EncryptedInt32.Subtract>)
+ - [func \(e EncryptedInt32\) Value\(\) int32](<#EncryptedInt32.Value>)
+- [type ModelDrawing](<#ModelDrawing>)
+- [type ModelDrawingSlice](<#ModelDrawingSlice>)
+ - [func CreateDrawingsBasic\(host \*engine.Host, res load\_result.Result\) \(ModelDrawingSlice, error\)](<#CreateDrawingsBasic>)
+ - [func CreateDrawingsPBR\(host \*engine.Host, res load\_result.Result\) \(ModelDrawingSlice, error\)](<#CreateDrawingsPBR>)
+ - [func CreateDrawingsUnlit\(host \*engine.Host, res load\_result.Result\) \(ModelDrawingSlice, error\)](<#CreateDrawingsUnlit>)
+ - [func CreateDrawingsUnlitTransparent\(host \*engine.Host, res load\_result.Result\) \(ModelDrawingSlice, error\)](<#CreateDrawingsUnlitTransparent>)
+ - [func \(s ModelDrawingSlice\) AllDrawings\(\) \[\]rendering.Drawing](<#ModelDrawingSlice.AllDrawings>)
+ - [func \(s ModelDrawingSlice\) AllForNode\(node \*load\_result.Node\) \[\]ModelDrawing](<#ModelDrawingSlice.AllForNode>)
+- [type SkinAnimation](<#SkinAnimation>)
+ - [func NewSkinAnimation\(anim kaiju\_mesh.KaijuMeshAnimation\) SkinAnimation](<#NewSkinAnimation>)
+ - [func \(a \*SkinAnimation\) CurrentFrame\(\) SkinAnimationFrame](<#SkinAnimation.CurrentFrame>)
+ - [func \(a \*SkinAnimation\) FindNextFrameForBone\(boneId int32, pathType kaiju\_mesh.AnimationPathType\) \(SkinAnimationFrame, bool\)](<#SkinAnimation.FindNextFrameForBone>)
+ - [func \(a \*SkinAnimation\) Interpolate\(from, to SkinAnimationFrame\) \[4\]float32](<#SkinAnimation.Interpolate>)
+ - [func \(a \*SkinAnimation\) IsValid\(\) bool](<#SkinAnimation.IsValid>)
+ - [func \(a \*SkinAnimation\) NextFrame\(\) SkinAnimationFrame](<#SkinAnimation.NextFrame>)
+ - [func \(a \*SkinAnimation\) Update\(deltaTime float64\)](<#SkinAnimation.Update>)
+- [type SkinAnimationFrame](<#SkinAnimationFrame>)
+
+
+
+## func [CreateDrawingFromMeshUnlit]()
+
+```go
+func CreateDrawingFromMeshUnlit(host *engine.Host, mesh *rendering.Mesh, textures []*rendering.Texture) (rendering.Drawing, error)
+```
+
+
+
+
+## func [CreateDrawingFromMeshUnlitTransparent]()
+
+```go
+func CreateDrawingFromMeshUnlitTransparent(host *engine.Host, mesh *rendering.Mesh, textures []*rendering.Texture) (rendering.Drawing, error)
+```
+
+
+
+
+## func [RegisterDrawingSpecification]()
+
+```go
+func RegisterDrawingSpecification(spec DrawingSpecification)
+```
+
+
+
+
+## func [SpawnTemplate]()
+
+```go
+func SpawnTemplate(id string, host *engine.Host, parent *engine.Entity) (*engine.Entity, error)
+```
+
+SpawnTemplate loads an entity template asset identified by \`id\` from the host's asset database, deserializes it into a \`stages.EntityDescription\` \(using JSON on desktop debug builds or the archive deserializer in other builds\), and creates a new entity configured from that description. If \`parent\` is non\-nil the new entity will be parented to it. The created entity is initialized via \`stages.SetupEntityFromDescription\` and returned, or an error is returned if the asset cannot be read or deserialized.
+
+
+## func [SpawnTemplateWithTransform]()
+
+```go
+func SpawnTemplateWithTransform(id string, host *engine.Host, parent *engine.Entity, pos, rot, scale matrix.Vec3) (*engine.Entity, error)
+```
+
+SpawnTemplateWithTransform loads an entity template asset identified by \`id\`, creates a new entity from that template \(optionally parented to \`parent\`\), then sets the entity's transform to the provided position, rotation and scale. It is a thin wrapper around \`SpawnTemplate\` that applies the transform before returning the created entity or any encountered error.
+
+Parameters:
+
+- id: template asset id to load from the host's asset database
+- host: the engine host used to create the entity and read assets
+- parent: optional parent entity to attach the new entity to
+- pos, rot, scale: transform components applied to the new entity
+
+Returns the newly created entity or a non\-nil error if the template could not be read or deserialized.
+
+
+## type [DrawingSpecCreateInfo]()
+
+
+
+```go
+type DrawingSpecCreateInfo struct {
+ LoadedMesh load_result.Result
+ Meshes []*rendering.Mesh
+ Textures []*rendering.Texture
+ SkipMatSearch bool
+}
+```
+
+
+## type [DrawingSpecification]()
+
+
+
+```go
+type DrawingSpecification struct {
+ Name string
+ RenderInfo []DrawingSpecificationRenderInfo
+}
+```
+
+
+### func [FindDrawingSpecification]()
+
+```go
+func FindDrawingSpecification(name string) DrawingSpecification
+```
+
+
+
+
+### func \(DrawingSpecification\) [CreateDrawings]()
+
+```go
+func (s DrawingSpecification) CreateDrawings(host *engine.Host, info DrawingSpecCreateInfo) (ModelDrawingSlice, error)
+```
+
+
+
+
+### func \(DrawingSpecification\) [IsValid]()
+
+```go
+func (s DrawingSpecification) IsValid() bool
+```
+
+
+
+
+## type [DrawingSpecificationRenderInfo]()
+
+
+
+```go
+type DrawingSpecificationRenderInfo struct {
+ Material string
+ DataFactory func() rendering.DrawInstance
+}
+```
+
+
+## type [EncryptedInt32]()
+
+
+
+```go
+type EncryptedInt32 struct {
+ RawValue int32
+ // contains filtered or unexported fields
+}
+```
+
+
+### func \(\*EncryptedInt32\) [Add]()
+
+```go
+func (e *EncryptedInt32) Add(amount int32)
+```
+
+
+
+
+### func \(\*EncryptedInt32\) [Decrement]()
+
+```go
+func (e *EncryptedInt32) Decrement()
+```
+
+
+
+
+### func \(\*EncryptedInt32\) [Decrypt]()
+
+```go
+func (e *EncryptedInt32) Decrypt()
+```
+
+
+
+
+### func \(\*EncryptedInt32\) [Encrypt]()
+
+```go
+func (e *EncryptedInt32) Encrypt()
+```
+
+
+
+
+### func \(\*EncryptedInt32\) [Increment]()
+
+```go
+func (e *EncryptedInt32) Increment()
+```
+
+
+
+
+### func \(\*EncryptedInt32\) [SetValue]()
+
+```go
+func (e *EncryptedInt32) SetValue(value int32)
+```
+
+
+
+
+### func \(\*EncryptedInt32\) [Subtract]()
+
+```go
+func (e *EncryptedInt32) Subtract(amount int32)
+```
+
+
+
+
+### func \(EncryptedInt32\) [Value]()
+
+```go
+func (e EncryptedInt32) Value() int32
+```
+
+
+
+
+## type [ModelDrawing]()
+
+
+
+```go
+type ModelDrawing struct {
+ Node *load_result.Node
+ MeshName string
+ Drawing rendering.Drawing
+}
+```
+
+
+## type [ModelDrawingSlice]()
+
+
+
+```go
+type ModelDrawingSlice []ModelDrawing
+```
+
+
+### func [CreateDrawingsBasic]()
+
+```go
+func CreateDrawingsBasic(host *engine.Host, res load_result.Result) (ModelDrawingSlice, error)
+```
+
+
+
+
+### func [CreateDrawingsPBR]()
+
+```go
+func CreateDrawingsPBR(host *engine.Host, res load_result.Result) (ModelDrawingSlice, error)
+```
+
+
+
+
+### func [CreateDrawingsUnlit]()
+
+```go
+func CreateDrawingsUnlit(host *engine.Host, res load_result.Result) (ModelDrawingSlice, error)
+```
+
+
+
+
+### func [CreateDrawingsUnlitTransparent]()
+
+```go
+func CreateDrawingsUnlitTransparent(host *engine.Host, res load_result.Result) (ModelDrawingSlice, error)
+```
+
+
+
+
+### func \(ModelDrawingSlice\) [AllDrawings]()
+
+```go
+func (s ModelDrawingSlice) AllDrawings() []rendering.Drawing
+```
+
+
+
+
+### func \(ModelDrawingSlice\) [AllForNode]()
+
+```go
+func (s ModelDrawingSlice) AllForNode(node *load_result.Node) []ModelDrawing
+```
+
+
+
+
+## type [SkinAnimation]()
+
+
+
+```go
+type SkinAnimation struct {
+ Animation kaiju_mesh.KaijuMeshAnimation
+ // contains filtered or unexported fields
+}
+```
+
+
+### func [NewSkinAnimation]()
+
+```go
+func NewSkinAnimation(anim kaiju_mesh.KaijuMeshAnimation) SkinAnimation
+```
+
+
+
+
+### func \(\*SkinAnimation\) [CurrentFrame]()
+
+```go
+func (a *SkinAnimation) CurrentFrame() SkinAnimationFrame
+```
+
+
+
+
+### func \(\*SkinAnimation\) [FindNextFrameForBone]()
+
+```go
+func (a *SkinAnimation) FindNextFrameForBone(boneId int32, pathType kaiju_mesh.AnimationPathType) (SkinAnimationFrame, bool)
+```
+
+
+
+
+### func \(\*SkinAnimation\) [Interpolate]()
+
+```go
+func (a *SkinAnimation) Interpolate(from, to SkinAnimationFrame) [4]float32
+```
+
+
+
+
+### func \(\*SkinAnimation\) [IsValid]()
+
+```go
+func (a *SkinAnimation) IsValid() bool
+```
+
+
+
+
+### func \(\*SkinAnimation\) [NextFrame]()
+
+```go
+func (a *SkinAnimation) NextFrame() SkinAnimationFrame
+```
+
+
+
+
+### func \(\*SkinAnimation\) [Update]()
+
+```go
+func (a *SkinAnimation) Update(deltaTime float64)
+```
+
+
+
+
+## type [SkinAnimationFrame]()
+
+
+
+```go
+type SkinAnimationFrame struct {
+ Key *kaiju_mesh.AnimKeyFrame
+ Bone *kaiju_mesh.AnimBone
+ AbsTime float64
+}
+```
+
+Generated by [gomarkdoc]()
diff --git a/docs/api/index.md b/docs/api/index.md
new file mode 100644
index 000000000..79f1c404a
--- /dev/null
+++ b/docs/api/index.md
@@ -0,0 +1,26 @@
+# API Documentation
+
+Auto-generated documentation using gomarkdoc.
+
+## Core
+
+- [bootstrap](bootstrap.md)
+
+## Engine
+
+- [engine](engine.md)
+
+## Rendering
+
+- [rendering](rendering.md)
+
+## Other
+
+- [framework](framework.md)
+- [klib](klib.md)
+- [Root Package](root.md)
+- [debug](debug.md)
+- [editor](editor.md)
+- [matrix](matrix.md)
+- [plugins](plugins.md)
+
diff --git a/docs/api/klib.md b/docs/api/klib.md
new file mode 100644
index 000000000..09e5c8543
--- /dev/null
+++ b/docs/api/klib.md
@@ -0,0 +1,1074 @@
+
+
+# klib
+
+```go
+import "kaijuengine.com/klib"
+```
+
+## Index
+
+- [Constants](<#constants>)
+- [Variables](<#variables>)
+- [func AppendUnique\[T comparable\]\(slice \[\]T, values ...T\) \[\]T](<#AppendUnique>)
+- [func BinaryRead\(r io.Reader, data any\) error](<#BinaryRead>)
+- [func BinaryReadInt\(r io.Reader\) \(int32, error\)](<#BinaryReadInt>)
+- [func BinaryReadLen\(r io.Reader\) \(int32, error\)](<#BinaryReadLen>)
+- [func BinaryReadString\(r io.Reader\) \(string, error\)](<#BinaryReadString>)
+- [func BinaryReadStringSlice\(r io.Reader\) \(\[\]string, error\)](<#BinaryReadStringSlice>)
+- [func BinaryReadVar\[T any\]\(r io.Reader\) \(T, error\)](<#BinaryReadVar>)
+- [func BinaryReadVarSlice\[T any\]\(r io.Reader\) \(\[\]T, error\)](<#BinaryReadVarSlice>)
+- [func BinaryWrite\(w io.Writer, data any\) error](<#BinaryWrite>)
+- [func BinaryWriteInt\(w io.Writer, value int\) error](<#BinaryWriteInt>)
+- [func BinaryWriteMap\[K comparable, V any\]\(w io.Writer, data map\[K\]V\) error](<#BinaryWriteMap>)
+- [func BinaryWriteMapLen\[K comparable, V any\]\(w io.Writer, data map\[K\]V\) error](<#BinaryWriteMapLen>)
+- [func BinaryWriteSlice\[T any\]\(w io.Writer, data \[\]T\) error](<#BinaryWriteSlice>)
+- [func BinaryWriteSliceLen\[T any\]\(w io.Writer, data \[\]T\) error](<#BinaryWriteSliceLen>)
+- [func BinaryWriteString\(w io.Writer, str string\) error](<#BinaryWriteString>)
+- [func BinaryWriteStringSlice\(w io.Writer, data \[\]string\) error](<#BinaryWriteStringSlice>)
+- [func ByteArrayToString\(byteArray \[\]byte\) string](<#ByteArrayToString>)
+- [func ByteCountToString\(bytes uint64\) string](<#ByteCountToString>)
+- [func ByteSliceToFloat32Slice\(data \[\]byte\) \[\]float32](<#ByteSliceToFloat32Slice>)
+- [func ByteSliceToUInt16Slice\(data \[\]byte\) \[\]uint16](<#ByteSliceToUInt16Slice>)
+- [func CapitalizeFirst\(s string\) string](<#CapitalizeFirst>)
+- [func Check\(outError \*error, newError error\) bool](<#Check>)
+- [func CheckAll\(res bool\)](<#CheckAll>)
+- [func Clamp\[T cmp.Ordered\]\(current, minimum, maximum T\) T](<#Clamp>)
+- [func ClampAbs\[T Signed\]\(value, minimum T\) T](<#ClampAbs>)
+- [func CleanNumString\(v string\) string](<#CleanNumString>)
+- [func Contains\[T comparable\]\(slice \[\]T, item T\) bool](<#Contains>)
+- [func ConvertByteSliceType\[T any\]\(slice \[\]byte\) \[\]T](<#ConvertByteSliceType>)
+- [func Decrypt\(encryptedData \[\]byte, key \[\]byte\) \(\[\]byte, error\)](<#Decrypt>)
+- [func DelayCall\(d time.Duration, f func\(\), ctx context.Context\)](<#DelayCall>)
+- [func Encrypt\(rawData \[\]byte, key \[\]byte\) \(\[\]byte, error\)](<#Encrypt>)
+- [func ErrorIs\[T error\]\(err error\) bool](<#ErrorIs>)
+- [func ExeExtension\(\) string](<#ExeExtension>)
+- [func ExtractFromSlice\[T, S any\]\(s \[\]S, expression func\(idx int\) T\) \[\]T](<#ExtractFromSlice>)
+- [func FindFirstZeroInByteArray\(arr \[\]byte\) int](<#FindFirstZeroInByteArray>)
+- [func FloatEquals\[T Float\]\(a, b T\) bool](<#FloatEquals>)
+- [func FormatFloatToNDecimals\[T float32 | float64\]\(f T, decimals int\) string](<#FormatFloatToNDecimals>)
+- [func InterfaceUnderlyingPointer\[T any\]\(s T\) unsafe.Pointer](<#InterfaceUnderlyingPointer>)
+- [func IsMobile\(\) bool](<#IsMobile>)
+- [func JsonDecode\[T any\]\(decoder \*json.Decoder, container \*T\) error](<#JsonDecode>)
+- [func MM2PX\[T Number\]\(pixels, mm, targetMM T\) T](<#MM2PX>)
+- [func MapJoin\[T comparable, U any\]\(a, b map\[T\]U\) map\[T\]U](<#MapJoin>)
+- [func MapKeys\[T comparable, U any\]\(m map\[T\]U\) \[\]T](<#MapKeys>)
+- [func MapKeysSorted\[T cmp.Ordered, U any\]\(m map\[T\]U\) \[\]T](<#MapKeysSorted>)
+- [func MapValues\[T comparable, U any\]\(m map\[T\]U\) \[\]U](<#MapValues>)
+- [func Memcpy\(dst unsafe.Pointer, src unsafe.Pointer, size uint64\)](<#Memcpy>)
+- [func Must\(err error\)](<#Must>)
+- [func MustReturn\[T any\]\(ret T, err error\) T](<#MustReturn>)
+- [func MustReturn2\[T, U any\]\(ret1 T, ret2 U, err error\) \(T, U\)](<#MustReturn2>)
+- [func NotYetImplemented\(issueId int\)](<#NotYetImplemented>)
+- [func OpenWebsite\(url string\)](<#OpenWebsite>)
+- [func PrintStack\(\)](<#PrintStack>)
+- [func ReadRootFile\(fs \*os.Root, filePath string\) \(\[\]byte, error\)](<#ReadRootFile>)
+- [func RemakeSlice\[S any\]\(s \[\]S\) \[\]S](<#RemakeSlice>)
+- [func RemoveNils\[S any\]\(slice \[\]\*S\) \[\]\*S](<#RemoveNils>)
+- [func RemoveUnordered\[T any\]\(slice \[\]T, idx int\) \[\]T](<#RemoveUnordered>)
+- [func ReplaceStringRecursive\(s string, old string, new string\) string](<#ReplaceStringRecursive>)
+- [func Should\(err error\) bool](<#Should>)
+- [func ShouldReturn\[T any\]\(ret T, err error\) T](<#ShouldReturn>)
+- [func Shuffle\[T any\]\(slice \[\]T, rng \*rand.Rand\)](<#Shuffle>)
+- [func ShuffleRandom\[T any\]\(slice \[\]T\)](<#ShuffleRandom>)
+- [func SizedStructToByteArray\(s unsafe.Pointer, size int\) \[\]byte](<#SizedStructToByteArray>)
+- [func SliceMove\[S any\]\(s \[\]S, from, to int\)](<#SliceMove>)
+- [func SliceSetCap\[S any\]\(s \[\]S, amount int\) \[\]S](<#SliceSetCap>)
+- [func SliceSetLen\[S any\]\(s \[\]S, newLen int\) \[\]S](<#SliceSetLen>)
+- [func SlicesAreTheSame\[S comparable\]\(a \[\]S, b \[\]S\) bool](<#SlicesAreTheSame>)
+- [func SlicesRemoveElement\[S comparable\]\(s \[\]S, e S\) \[\]S](<#SlicesRemoveElement>)
+- [func SortDirEntries\(entries \[\]os.DirEntry\) \[\]os.DirEntry](<#SortDirEntries>)
+- [func StringValueCompare\(a, b string\) int](<#StringValueCompare>)
+- [func StringsContainsCaseInsensitive\(s \[\]string, value string\) bool](<#StringsContainsCaseInsensitive>)
+- [func StripFloatStringZeros\(fString string\) string](<#StripFloatStringZeros>)
+- [func StructSliceToByteArray\[T any\]\(s \[\]T\) \[\]byte](<#StructSliceToByteArray>)
+- [func StructToByteArray\[T any\]\(s T\) \[\]byte](<#StructToByteArray>)
+- [func TickerWait\(interval, limit time.Duration, condition func\(\) bool\) bool](<#TickerWait>)
+- [func ToSnakeCase\(str string\) string](<#ToSnakeCase>)
+- [func Trace\(message string\)](<#Trace>)
+- [func TraceString\(message string\) string](<#TraceString>)
+- [func TraceStrings\(message string, skip int\) \[\]string](<#TraceStrings>)
+- [func WipeSlice\[S any\]\(s \[\]S\) \[\]S](<#WipeSlice>)
+- [func WriteRootFile\(fs \*os.Root, filePath string, data \[\]byte\) error](<#WriteRootFile>)
+- [type Complex](<#Complex>)
+- [type ErrorList](<#ErrorList>)
+ - [func NewErrorList\(\) ErrorList](<#NewErrorList>)
+ - [func \(e \*ErrorList\) AddAny\(err error\)](<#ErrorList.AddAny>)
+ - [func \(e \*ErrorList\) Any\(\) bool](<#ErrorList.Any>)
+ - [func \(e \*ErrorList\) First\(\) error](<#ErrorList.First>)
+- [type Float](<#Float>)
+- [type Integer](<#Integer>)
+- [type Number](<#Number>)
+- [type Ordered](<#Ordered>)
+- [type Serializable](<#Serializable>)
+- [type Set](<#Set>)
+ - [func NewSet\[T comparable\]\(\) Set\[T\]](<#NewSet>)
+ - [func \(s Set\[T\]\) Add\(val T\)](<#Set[T].Add>)
+ - [func \(s Set\[T\]\) Contains\(val T\) bool](<#Set[T].Contains>)
+ - [func \(s Set\[T\]\) MarshalJSON\(\) \(\[\]byte, error\)](<#Set[T].MarshalJSON>)
+ - [func \(s Set\[T\]\) Remove\(val T\)](<#Set[T].Remove>)
+ - [func \(s Set\[T\]\) ToSlice\(\) \[\]T](<#Set[T].ToSlice>)
+ - [func \(s \*Set\[T\]\) UnmarshalJSON\(data \[\]byte\) error](<#Set[T].UnmarshalJSON>)
+- [type Signed](<#Signed>)
+- [type SignedInteger](<#SignedInteger>)
+- [type Unsigned](<#Unsigned>)
+
+
+## Constants
+
+
+
+```go
+const (
+ ISO8601 = "2006-01-02T15:04:05Z"
+)
+```
+
+## Variables
+
+
+
+```go
+var OpenWebsiteAndroidFunc func(url string)
+```
+
+
+## func [AppendUnique]()
+
+```go
+func AppendUnique[T comparable](slice []T, values ...T) []T
+```
+
+
+
+
+## func [BinaryRead]()
+
+```go
+func BinaryRead(r io.Reader, data any) error
+```
+
+
+
+
+## func [BinaryReadInt]()
+
+```go
+func BinaryReadInt(r io.Reader) (int32, error)
+```
+
+
+
+
+## func [BinaryReadLen]()
+
+```go
+func BinaryReadLen(r io.Reader) (int32, error)
+```
+
+
+
+
+## func [BinaryReadString]()
+
+```go
+func BinaryReadString(r io.Reader) (string, error)
+```
+
+
+
+
+## func [BinaryReadStringSlice]()
+
+```go
+func BinaryReadStringSlice(r io.Reader) ([]string, error)
+```
+
+
+
+
+## func [BinaryReadVar]()
+
+```go
+func BinaryReadVar[T any](r io.Reader) (T, error)
+```
+
+
+
+
+## func [BinaryReadVarSlice]()
+
+```go
+func BinaryReadVarSlice[T any](r io.Reader) ([]T, error)
+```
+
+
+
+
+## func [BinaryWrite]()
+
+```go
+func BinaryWrite(w io.Writer, data any) error
+```
+
+
+
+
+## func [BinaryWriteInt]()
+
+```go
+func BinaryWriteInt(w io.Writer, value int) error
+```
+
+
+
+
+## func [BinaryWriteMap]()
+
+```go
+func BinaryWriteMap[K comparable, V any](w io.Writer, data map[K]V) error
+```
+
+
+
+
+## func [BinaryWriteMapLen]()
+
+```go
+func BinaryWriteMapLen[K comparable, V any](w io.Writer, data map[K]V) error
+```
+
+
+
+
+## func [BinaryWriteSlice]()
+
+```go
+func BinaryWriteSlice[T any](w io.Writer, data []T) error
+```
+
+
+
+
+## func [BinaryWriteSliceLen]()
+
+```go
+func BinaryWriteSliceLen[T any](w io.Writer, data []T) error
+```
+
+
+
+
+## func [BinaryWriteString]()
+
+```go
+func BinaryWriteString(w io.Writer, str string) error
+```
+
+
+
+
+## func [BinaryWriteStringSlice]()
+
+```go
+func BinaryWriteStringSlice(w io.Writer, data []string) error
+```
+
+
+
+
+## func [ByteArrayToString]()
+
+```go
+func ByteArrayToString(byteArray []byte) string
+```
+
+
+
+
+## func [ByteCountToString]()
+
+```go
+func ByteCountToString(bytes uint64) string
+```
+
+
+
+
+## func [ByteSliceToFloat32Slice]()
+
+```go
+func ByteSliceToFloat32Slice(data []byte) []float32
+```
+
+
+
+
+## func [ByteSliceToUInt16Slice]()
+
+```go
+func ByteSliceToUInt16Slice(data []byte) []uint16
+```
+
+
+
+
+## func [CapitalizeFirst]()
+
+```go
+func CapitalizeFirst(s string) string
+```
+
+
+
+
+## func [Check]()
+
+```go
+func Check(outError *error, newError error) bool
+```
+
+
+
+
+## func [CheckAll]()
+
+```go
+func CheckAll(res bool)
+```
+
+
+
+
+## func [Clamp]()
+
+```go
+func Clamp[T cmp.Ordered](current, minimum, maximum T) T
+```
+
+
+
+
+## func [ClampAbs]()
+
+```go
+func ClampAbs[T Signed](value, minimum T) T
+```
+
+
+
+
+## func [CleanNumString]()
+
+```go
+func CleanNumString(v string) string
+```
+
+
+
+
+## func [Contains]()
+
+```go
+func Contains[T comparable](slice []T, item T) bool
+```
+
+
+
+
+## func [ConvertByteSliceType]()
+
+```go
+func ConvertByteSliceType[T any](slice []byte) []T
+```
+
+
+
+
+## func [Decrypt]()
+
+```go
+func Decrypt(encryptedData []byte, key []byte) ([]byte, error)
+```
+
+
+
+
+## func [DelayCall]()
+
+```go
+func DelayCall(d time.Duration, f func(), ctx context.Context)
+```
+
+
+
+
+## func [Encrypt]()
+
+```go
+func Encrypt(rawData []byte, key []byte) ([]byte, error)
+```
+
+
+
+
+## func [ErrorIs]()
+
+```go
+func ErrorIs[T error](err error) bool
+```
+
+
+
+
+## func [ExeExtension]()
+
+```go
+func ExeExtension() string
+```
+
+
+
+
+## func [ExtractFromSlice]()
+
+```go
+func ExtractFromSlice[T, S any](s []S, expression func(idx int) T) []T
+```
+
+
+
+
+## func [FindFirstZeroInByteArray]()
+
+```go
+func FindFirstZeroInByteArray(arr []byte) int
+```
+
+
+
+
+## func [FloatEquals]()
+
+```go
+func FloatEquals[T Float](a, b T) bool
+```
+
+
+
+
+## func [FormatFloatToNDecimals]()
+
+```go
+func FormatFloatToNDecimals[T float32 | float64](f T, decimals int) string
+```
+
+
+
+
+## func [InterfaceUnderlyingPointer]()
+
+```go
+func InterfaceUnderlyingPointer[T any](s T) unsafe.Pointer
+```
+
+
+
+
+## func [IsMobile]()
+
+```go
+func IsMobile() bool
+```
+
+
+
+
+## func [JsonDecode]()
+
+```go
+func JsonDecode[T any](decoder *json.Decoder, container *T) error
+```
+
+
+
+
+## func [MM2PX]()
+
+```go
+func MM2PX[T Number](pixels, mm, targetMM T) T
+```
+
+
+
+
+## func [MapJoin]()
+
+```go
+func MapJoin[T comparable, U any](a, b map[T]U) map[T]U
+```
+
+
+
+
+## func [MapKeys]()
+
+```go
+func MapKeys[T comparable, U any](m map[T]U) []T
+```
+
+
+
+
+## func [MapKeysSorted]()
+
+```go
+func MapKeysSorted[T cmp.Ordered, U any](m map[T]U) []T
+```
+
+
+
+
+## func [MapValues]()
+
+```go
+func MapValues[T comparable, U any](m map[T]U) []U
+```
+
+
+
+
+## func [Memcpy]()
+
+```go
+func Memcpy(dst unsafe.Pointer, src unsafe.Pointer, size uint64)
+```
+
+
+
+
+## func [Must]()
+
+```go
+func Must(err error)
+```
+
+
+
+
+## func [MustReturn]()
+
+```go
+func MustReturn[T any](ret T, err error) T
+```
+
+
+
+
+## func [MustReturn2]()
+
+```go
+func MustReturn2[T, U any](ret1 T, ret2 U, err error) (T, U)
+```
+
+
+
+
+## func [NotYetImplemented]()
+
+```go
+func NotYetImplemented(issueId int)
+```
+
+
+
+
+## func [OpenWebsite]()
+
+```go
+func OpenWebsite(url string)
+```
+
+
+
+
+## func [PrintStack]()
+
+```go
+func PrintStack()
+```
+
+
+
+
+## func [ReadRootFile]()
+
+```go
+func ReadRootFile(fs *os.Root, filePath string) ([]byte, error)
+```
+
+
+
+