1,495 Commits over 1,157 Days - 0.05cph!
Prebuilding menu project halves startup time
Load fonts in parallel
Open the game window in SourceEnginePreInit instead so there's not that awkward 1-2 second of nothing
Prebuilding menu project halves startup time
EventRecord uses correct Version sha
Json warmup can be a background task. (-500ms) Make logging initialization more predictable to avoid double configuration waste
Menu doesn't need access control (-100ms)
Only initialize ILHotload in editor as that's the only context it's useful in (-100ms)
We can await on account information until after menu is loaded, otherwise we're usually hanging here for a second or more doing fuck all
ResourceLoader.LoadAllGameResource: FindFile `*` more optimized than `*.*` (150ms -> 75ms)
Update Superluminal PerformanceAPI (Stop nagging)
Update AMSI patch for .net9 so we're not wasting 100ms+ every full hotload / package load
Some additional troublesome Vulkan layer disables
Hotload ignore Refit Fixes Facepunch/sbox-issues#6843
Categorize Create Asset menu, can create code files, add templates for compute, material, unlit shaders
Use GameResource.Category in New Asset menu
Give built in resources categories too, merge with gameresources
Create templates for c# empty, component, razor code files and compute, material, unlit shaders
Create assets/folders from sidebar folder nodes
EntityTreeModel::mimeData calls base again so native interactions still work
Hammer GameObjects can have children
https://files.facepunch.com/matt/1b0611b1/sbox-dev_icF9jl1PDP.png
Suppress native transform change callbacks too which were causing angles & scale changes to not execute
Transform changes on managed execute EventPropertyEditorCoreAttributeChange_t so gizmos follow properly
Ensure GUID is saved all the time. And some validation: delete CMapGameObjects that have no GUIDs on load & create CMapGameObjects for scene gameobjects that don't have a match
Hammer: Can hover and select managed scene render meshes (ModelRenderer) as well as gizmo render bounds, whilst working alongside native traces
Hammer can paste gameobjects copied from scene editor
Resolves Facepunch/sbox-issues#6762
Copying, shift transforms & undoing all work on hammer game objects. Only had to change all the callbacks to a new system again
If no [Inspector] found keep falling back on [CanEdit]
Fixes Facepunch/sbox-issues#6784
Can drag scene prefabs into Hammer map view
mapbuilder: don't try to parse empty scene json
fixes Facepunch/sbox-issues#6777
Hammer GameObjects (#1675)
* Hammer Scene is serialized in MapWorld and gets written into VPK as world.scene_c
* MapInstance additive loads the SceneFile from inside the VPK
Tie Meshes to GameObject:
* Replaces Entity
* GameObjects with meshes tied have a HammerMesh component which procedurally creates a ModelRenderer and ModelCollider
* HammerMesh is setup at map compile time with generated models.
Editor:
* Add HammerManagedInspector which can take over native inspector if it likes the MapNode type
* Add HammerSceneEditorSession for handling saving properly
* Gizmo interactions work in MapView, Hammer gizmo selectionset syncs with native selection set (native has authority)
* Clean up MapView loop: run Scene.EditorDraw() for gizmos, remove old Entity.DrawGizmos
Hammer Outliner:
* Managed sets DragData of map nodes in Hammer outliner
* Defer selection until mouse release so it acts like our managed treeview, allows dragging without selecting instantly
* Removed duplicate entity list
* Add "Create Game Object" button
ActionGraph:
* Add MapSourceLocation for editing action graphs in .vmap files
* Open source map when inspecting graph from .vmap
* Parent action graph editor to hammer window if editing map graph
---------
Co-authored-by: James King <james.king@facepunchstudios.com>
Cleanup
Set native modified flag using SerializedObject callback, also emit EventMapNodeDescriptionChanged_t for the outliner
Can rotate and scale map game objects
Hammer Game Objects
* Hammer Scene is serialized in MapWorld and gets written into VPK as world.scene_c
* MapInstance additively loads the SceneFile from inside the VPK
Tie Meshes to GameObject:
* Replaces Entity
* GameObjects with meshes tied have a HammerMesh component which procedurally creates a ModelRenderer and ModelCollider
* HammerMesh is setup at map compile time with generated models.
Editor:
* Add HammerManagedInspector which can take over native inspector if it likes the MapNode type
* Add HammerSceneEditorSession for handling saving properly
* Gizmo interactions work in MapView, Hammer gizmo selectionset syncs with native selection set (native has authority)
* Clean up MapView loop: run Scene.EditorDraw() for gizmos, remove old Entity.DrawGizmos
Hammer Outliner:
* Managed sets DragData of map nodes in Hammer outliner
* Defer selection until mouse release so it acts like our managed treeview, allows dragging without selecting instantly
* Removed duplicate entity list
* Add "Create Game Object" button
ActionGraph:
* Add MapSourceLocation for editing action graphs in .vmap files
* Open source map when inspecting graph from .vmap
* Parent action graph editor to hammer window if editing map graph
Co-authored-by: James King <james.king@facepunchstudios.com>
Properties with [Hide] don't contribute to features tabs
Don't need these Hammer prefab templates anymore
InspectorWidgets are explicitly marked with [Inspector( Type )] instead of [CanEdit( Type )], created with InspectorWidget.Create( SerializedObject )
Add jsoncpp so we can read/write json properly without fucking around with kv3
Add CMapGameObject map node with managed counter part that wraps a GameObject
* Hammer world's Scene uses HammerSceneEditorSession
* Add HammerManagedInspector that can take over if it likes the MapNode. We only like MapGameObject for now
* Run Scene.EditorDraw() on MapView for gizmos, remove old Entity.DrawGizmos
* More explicit HammerEvents. Managed map node callback interface, a little convoluted because of mapdoclib <-> hammer <-> managed. But this is easier to do callbacks and can return values
* MapGameObjects can be tied to MapMesh and generate model geometry
Add MapSourceLocation for editing action graphs in .vmap files
* Open source map when inspecting graph from .vmap
* Parent action graph editor to hammer window if editing map graph
Several assumptions of SceneEditorSession.Active.Scene should be GameObject.Scene
Gizmo interactions work in MapView, Hammer gizmo selectionset syncs with native selection set (native has authority), clean up MapView loop
Managed can set DragData of map nodes in Hammer outliner, MapGameObject sets its GameObject
DragData uses QObject.FindOrCreate so it persists when going native -> managed -> native for DragData.Object to work correctly
QOutliner: Remove hidden entity list
QOutliner: Defer selection until mouse release so it acts like our managed treeview, allowing dragging without switching the inspector away
[~] ModelRenderer don't default to box if Model is null
InspectorWidgets are explicitly marked with [Inspector( Type )] instead of [CanEdit( Type )], created with InspectorWidget.Create( SerializedObject )
Hammer Scene is serialized entirely in MapWorld & written into VPK as world.scene_c
MapInstance: Load from SceneFile from inside the VPK (A little more logic because we don't normally read managed from VPKs)
When tying a MapMesh to a MapGameObject add ModelRenderer and ModelCollider automatically
Don't need these Hammer prefab templates anymore
Add "Create Game Object" button to Hammer outliner
HammerMesh component, explicitly set on GameObjects that have a map mesh attached
Don't need these Hammer prefab templates anymore
Add "Create Game Object" button to Hammer outliner
When tying a MapMesh to a MapGameObject add ModelRenderer and ModelCollider automatically
Add jsoncpp so we can read/write json properly without fucking around with kv3
Add CMapGameObject map node with managed counter part that wraps a GameObject
* Hammer world's Scene uses HammerSceneEditorSession
* Add HammerManagedInspector that can take over if it likes the MapNode. We only like MapGameObject for now
* Run Scene.EditorDraw() on MapView for gizmos, remove old Entity.DrawGizmos
* More explicit HammerEvents. Managed map node callback interface, a little convoluted because of mapdoclib <-> hammer <-> managed. But this is easier to do callbacks and can return values
* MapGameObjects can be tied to MapMesh and generate model geometry
Add MapSourceLocation for editing action graphs in .vmap files
* Open source map when inspecting graph from .vmap
* Parent action graph editor to hammer window if editing map graph
Several assumptions of SceneEditorSession.Active.Scene should be GameObject.Scene
Gizmo interactions work in MapView, Hammer gizmo selectionset syncs with native selection set (native has authority), clean up MapView loop
Managed can set DragData of map nodes in Hammer outliner, MapGameObject sets its GameObject
DragData uses QObject.FindOrCreate so it persists when going native -> managed -> native for DragData.Object to work correctly
QOutliner: Remove hidden entity list
QOutliner: Defer selection until mouse release so it acts like our managed treeview, allowing dragging without switching the inspector away
[~] ModelRenderer don't default to box if Model is null
InspectorWidgets are explicitly marked with [Inspector( Type )] instead of [CanEdit( Type )], created with InspectorWidget.Create( SerializedObject )
Hammer Scene is serialized entirely in MapWorld & written into VPK as world.scene_c
MapInstance: Load from SceneFile from inside the VPK (A little more logic because we don't normally read managed from VPKs)
Remove baked cubemaps code from Hammer
Fix Hammer default layout. Also add Cloud Browser by default
Fixes Facepunch/sbox-issues#6708
Add jsoncpp so we can read/write json properly without fucking around with kv3
Add CMapGameObject map node with managed counter part that wraps a GameObject
Hammer world's Scene uses HammerSceneEditorSession
Add HammerManagedInspector that can take over if it likes the MapNode. We only like MapGameObject for now
Run Scene.EditorDraw() on MapView for gizmos, remove old Entity.DrawGizmos
More explicit HammerEvents
Managed map node callback interface, a little convoluted because of mapdoclib <-> hammer <-> managed. But this is easier to do callbacks and can return values
And the managed side
Serialize/deserialize CMapGameObject
CMapGameObject::GeneratesEntityModelGeometry()
Expose CMapGameObject JSON to MapBuilder via IHammerMapLoader
Collect CMapGameObjects, compile them into scene.json inside the vpk and let MapInstance load them (Very hacky code needs cleaning up)
Tie Meshes to GameObject button
Implement CMapGameObject::Copy
CMapGameObject overrides child selection
Sync native transforms to managed
Can tie map meshes to GameObjects, these get built into models and any components on the GameObject with a Model property get populated by it
CMapGameObject's that generate model geometry are ignored by physicsbuilder
TieToGameObject takes TieToEntity keybind (Ctrl+T), remove button for entity as there's no entities to tie them to anymore, if you really need it the command is still accessible through F1
Replace manual scene serialization with jsoncpp, can map guids to map meshes better and it's cleaner
Add MapSourceLocation, fix editing action graphs in .vmap files
Check for MapSourceLocation in ActionGraphView
Open source map when inspecting graph from .vmap
Parent action graph editor to hammer window if editing map graph
Fix action graphs from maps not caching correctly
Only OpenContainingResource if not already open
Several assumptions of SceneEditorSession.Active.Scene should be GameObject.Scene
Gizmo interactions work in MapView, Hammer gizmo selectionset syncs with native selection set (native has authority), clean up MapView loop
Managed can set DragData of map nodes in Hammer outliner, MapGameObject sets its GameObject
DragData uses QObject.FindOrCreate so it persists when going native -> managed -> native for DragData.Object to work correctly
QOutliner: Remove hidden entity list
QOutliner: Defer selection until mouse release so it acts like our managed treeview, allowing dragging without switching the inspector away
[~] ModelRenderer don't default to box if Model is null
InspectorWidgets are explicitly marked with [Inspector( Type )] instead of [CanEdit( Type )], created with InspectorWidget.Create( SerializedObject )
Hammer Scene is serialized entirely in MapWorld & written into VPK as world.scene_c
MapInstance: Load from SceneFile from inside the VPK (A little more logic because we don't normally read managed from VPKs)
Cleanup
Use GameObject name explicitly in description instead of setting DMX name
Revert "ModelRenderer don't default to box if Model is null"
This reverts commit 507bf43671ecc159012fc46ffe726dcf1128bdd9.
This works better, needs a cleanup that also removes [MakeDirty] crap
Batch map gameobjects, start disabled
Remove 2nd hidden entity list
QOutliner: Defer selection until mouse release so it acts like our managed treeview, allowing dragging without switching the inspector away
Managed can set DragData of map nodes in Hammer outliner, MapGameObject sets its GameObject
DragData uses QObject.FindOrCreate so it persists when going native -> managed -> native for DragData.Object to work correctly
Remove mock GameObject/Prefab code from managed MapEntity
Add CMapGameObject map node with managed counter part that wraps a GameObject
Hammer world's Scene uses HammerSceneEditorSession
Add HammerManagedInspector that can take over if it likes the MapNode. We only like MapGameObject for now
Run Scene.EditorDraw() on MapView for gizmos, remove old Entity.DrawGizmos
Hammer: Create GameObject Test option
More explicit HammerEvents
Managed map node callback interface, a little convoluted because of mapdoclib <-> hammer <-> managed. But this is easier to do callbacks and can return values
And the managed side
Serialize/deserialize CMapGameObject
CMapGameObject::GeneratesEntityModelGeometry()
Expose CMapGameObject JSON to MapBuilder via IHammerMapLoader
Collect CMapGameObjects, compile them into scene.json inside the vpk and let MapInstance load them (Very hacky code needs cleaning up)
MapWorld.Scene sets a Scene.Source in an attempt to make AG happy
Tie Meshes to GameObject button
Add def for CMapNode.GetRootDocument()
ActionGraph source location refactor
Add MapSourceLocation, fix editing action graphs in .vmap files
Check for MapSourceLocation in ActionGraphView
Open source map when inspecting graph from .vmap
Parent action graph editor to hammer window if editing map graph
Push AG serialization options when saving map game object
Makes sure we replace any cached versions of graphs
Implement setting HammerSceneEditorSession.HasUnsavedChanges
Fix action graphs from maps not caching correctly
Only OpenContainingResource if not already open
Fix action graphs in unsaved hammer maps
Associate graphs with a HammerSceneEditorSession if open in hammer,
which is resilient to renaming etc
Normalize map path name
Can tie map meshes to GameObjects, these get built into models and any components on the GameObject with a Model property get populated by it
Trim world builder
Implement CMapGameObject::Copy
Sync native transforms to managed
Scene changes (new component, prop edits, etc.) mark Hammer map as having unsaved changes (otherwise it refuses to save)
Several assumptions of SceneEditorSession.Active.Scene should be GameObject.Scene
Clean up Entity tool as you can no longer add/target games this way
Kill Hammer EntityIO buttons (unusable)
CMapGameObject overrides child selection
Hammer GizmoInstance.Input.IsHovered is controlled by native MapView IsActive()
Add jsoncpp so we can read/write json properly without fucking around with kv3
Replace manual scene serialization with jsoncpp, can map guids to map meshes better and it's cleaner
Clean up MapView tick and scene render list
Hammer sync managed gizmo selections with native selection set (authoritative)
Fix warning
CMapGameObject's that generate model geometry are ignored by physicsbuilder
ModelRenderer don't default to box if Model is null
remove nav markup volumes from fgd
TieToGameObject takes TieToEntity keybind (Ctrl+T), remove button for entity as there's no entities to tie them to anymore, if you really need it the command is still accessible through F1
bakky icon
CMapGameObject's that generate model geometry are ignored by physicsbuilder
Remove mock GameObject/Prefab code from managed MapEntity
Add CMapGameObject map node with managed counter part that wraps a GameObject
Hammer world's Scene uses HammerSceneEditorSession
Add HammerManagedInspector that can take over if it likes the MapNode. We only like MapGameObject for now
Run Scene.EditorDraw() on MapView for gizmos, remove old Entity.DrawGizmos
Hammer: Create GameObject Test option
More explicit HammerEvents
Managed map node callback interface, a little convoluted because of mapdoclib <-> hammer <-> managed. But this is easier to do callbacks and can return values
And the managed side
Serialize/deserialize CMapGameObject
CMapGameObject::GeneratesEntityModelGeometry()
Expose CMapGameObject JSON to MapBuilder via IHammerMapLoader
Collect CMapGameObjects, compile them into scene.json inside the vpk and let MapInstance load them (Very hacky code needs cleaning up)
MapWorld.Scene sets a Scene.Source in an attempt to make AG happy
Tie Meshes to GameObject button
Add def for CMapNode.GetRootDocument()
ActionGraph source location refactor
Add MapSourceLocation, fix editing action graphs in .vmap files
Check for MapSourceLocation in ActionGraphView
Open source map when inspecting graph from .vmap
Parent action graph editor to hammer window if editing map graph
Push AG serialization options when saving map game object
Makes sure we replace any cached versions of graphs
Implement setting HammerSceneEditorSession.HasUnsavedChanges
Fix action graphs from maps not caching correctly
Only OpenContainingResource if not already open
Fix action graphs in unsaved hammer maps
Associate graphs with a HammerSceneEditorSession if open in hammer,
which is resilient to renaming etc
Normalize map path name
Can tie map meshes to GameObjects, these get built into models and any components on the GameObject with a Model property get populated by it
Trim world builder
Implement CMapGameObject::Copy
Sync native transforms to managed
Scene changes (new component, prop edits, etc.) mark Hammer map as having unsaved changes (otherwise it refuses to save)
Several assumptions of SceneEditorSession.Active.Scene should be GameObject.Scene
Clean up Entity tool as you can no longer add/target games this way
Kill Hammer EntityIO buttons (unusable)
CMapGameObject overrides child selection
Hammer GizmoInstance.Input.IsHovered is controlled by native MapView IsActive()
Add jsoncpp so we can read/write json properly without fucking around with kv3
Replace manual scene serialization with jsoncpp, can map guids to map meshes better and it's cleaner
Clean up MapView tick and scene render list
Hammer sync managed gizmo selections with native selection set (authoritative)
Fix warning
Hammer GizmoInstance.Input.IsHovered is controlled by native MapView IsActive()
Add jsoncpp so we can read/write json properly without fucking around with kv3
Replace manual scene serialization with jsoncpp, can map guids to map meshes better and it's cleaner
Clean up MapView tick and scene render list
Hammer sync managed gizmo selections with native selection set (authoritative)
Clean up Entity tool as you can no longer add/target games this way
Kill Hammer EntityIO buttons (unusable)
CMapGameObject overrides child selection
Remove mock GameObject/Prefab code from managed MapEntity
Add CMapGameObject map node with managed counter part that wraps a GameObject
Hammer world's Scene uses HammerSceneEditorSession
Add HammerManagedInspector that can take over if it likes the MapNode. We only like MapGameObject for now
Run Scene.EditorDraw() on MapView for gizmos, remove old Entity.DrawGizmos
Hammer: Create GameObject Test option
More explicit HammerEvents
Managed map node callback interface, a little convoluted because of mapdoclib <-> hammer <-> managed. But this is easier to do callbacks and can return values
And the managed side
Serialize/deserialize CMapGameObject
CMapGameObject::GeneratesEntityModelGeometry()
Expose CMapGameObject JSON to MapBuilder via IHammerMapLoader
Collect CMapGameObjects, compile them into scene.json inside the vpk and let MapInstance load them (Very hacky code needs cleaning up)
MapWorld.Scene sets a Scene.Source in an attempt to make AG happy
Tie Meshes to GameObject button
Add def for CMapNode.GetRootDocument()
ActionGraph source location refactor
Add MapSourceLocation, fix editing action graphs in .vmap files
Check for MapSourceLocation in ActionGraphView
Open source map when inspecting graph from .vmap
Parent action graph editor to hammer window if editing map graph
Push AG serialization options when saving map game object
Makes sure we replace any cached versions of graphs
Implement setting HammerSceneEditorSession.HasUnsavedChanges
Fix action graphs from maps not caching correctly
Only OpenContainingResource if not already open
Fix action graphs in unsaved hammer maps
Associate graphs with a HammerSceneEditorSession if open in hammer,
which is resilient to renaming etc
Normalize map path name
Can tie map meshes to GameObjects, these get built into models and any components on the GameObject with a Model property get populated by it
Trim world builder
Implement CMapGameObject::Copy
Sync native transforms to managed
Scene changes (new component, prop edits, etc.) mark Hammer map as having unsaved changes (otherwise it refuses to save)
Several assumptions of SceneEditorSession.Active.Scene should be GameObject.Scene
Remove mock GameObject/Prefab code from managed MapEntity
Add CMapGameObject map node with managed counter part that wraps a GameObject
Hammer world's Scene uses HammerSceneEditorSession
Add HammerManagedInspector that can take over if it likes the MapNode. We only like MapGameObject for now
Run Scene.EditorDraw() on MapView for gizmos, remove old Entity.DrawGizmos
Hammer: Create GameObject Test option
More explicit HammerEvents
Managed map node callback interface, a little convoluted because of mapdoclib <-> hammer <-> managed. But this is easier to do callbacks and can return values
And the managed side
Serialize/deserialize CMapGameObject
CMapGameObject::GeneratesEntityModelGeometry()
Expose CMapGameObject JSON to MapBuilder via IHammerMapLoader
Collect CMapGameObjects, compile them into scene.json inside the vpk and let MapInstance load them (Very hacky code needs cleaning up)
MapWorld.Scene sets a Scene.Source in an attempt to make AG happy
Tie Meshes to GameObject button
Fix crash in CDMXLoader::LoadMesh when there's no position attribute.. unsure why, the offending models need to be looked at
And the managed side
Serialize/deserialize CMapGameObject
More explicit HammerEvents
Managed map node callback interface, a little convoluted because of mapdoclib <-> hammer <-> managed. But this is easier to do callbacks and can return values
Remove mock GameObject/Prefab code from managed MapEntity
Add CMapGameObject map node with managed counter part that wraps a GameObject
Hammer world's Scene uses HammerSceneEditorSession
Add HammerManagedInspector that can take over if it likes the MapNode. We only like MapGameObject for now
Run Scene.EditorDraw() on MapView for gizmos, remove old Entity.DrawGizmos
Hammer: Create GameObject Test option
▅▇▇▋▅▅ ▊▍▄█▍▊ ▆▉▉ ▉▌▌▅▇▋█▅▊ ▉▇▌█▊█▅▊▍██ ▊▅██