diff --git a/game/addons/tools/Code/Scene/SceneView/DropObjects/ModelDropObject.cs b/game/addons/tools/Code/Scene/SceneView/DropObjects/ModelDropObject.cs index 90ca203eb..c73c4aab5 100644 --- a/game/addons/tools/Code/Scene/SceneView/DropObjects/ModelDropObject.cs +++ b/game/addons/tools/Code/Scene/SceneView/DropObjects/ModelDropObject.cs @@ -1,4 +1,5 @@ -using System.Threading; +using Sandbox.ModelEditor.Nodes; +using System.Threading; namespace Editor; @@ -6,7 +7,8 @@ namespace Editor; partial class ModelDropObject : BaseDropObject { Model model; - string archetype; + bool physicsArchetype; + bool physics; protected override async Task Initialize( string dragData, CancellationToken token ) { @@ -18,7 +20,7 @@ protected override async Task Initialize( string dragData, CancellationToken tok if ( token.IsCancellationRequested ) return; - archetype = asset.FindStringEditInfo( "model_archetype_id" ); + var archetype = asset.FindStringEditInfo( "model_archetype_id" ); PackageStatus = "Loading Model"; model = await Model.LoadAsync( asset.Path ); @@ -26,19 +28,25 @@ protected override async Task Initialize( string dragData, CancellationToken tok Bounds = model.Bounds; PivotPosition = Bounds.ClosestPoint( Vector3.Down * 10000 ); + physics = (model.Physics?.Parts.Count ?? 0) > 0; + if ( physics && model.Physics.Parts.Any( p => p.Meshes.Any() ) ) // can't do rigid body with meshes + physics = false; + physicsArchetype = archetype == "physics_prop_model" || archetype == "jointed_physics_model" || archetype == "breakable_prop_model"; } public override void OnUpdate() { using var scope = Gizmo.Scope( "DropObject", traceTransform ); - Gizmo.Draw.Color = Color.White.WithAlpha( 0.3f ); - Gizmo.Draw.LineBBox( Bounds ); - - Gizmo.Draw.Color = Color.White; - if ( model is not null ) { + if ( physics && physicsArchetype != Gizmo.IsShiftPressed ) + Gizmo.Draw.Color = Theme.Blue.WithAlpha( 0.6f ); + else + Gizmo.Draw.Color = Color.White.WithAlpha( 0.3f ); + Gizmo.Draw.LineBBox( Bounds ); + + Gizmo.Draw.Color = Color.White; var so = Gizmo.Draw.Model( model ); if ( so.IsValid() ) { @@ -55,6 +63,19 @@ public override void OnUpdate() } } + private bool HasPropData() + { + if ( model.Data.Explosive ) + return true; + if ( model.Data.Flammable ) + return true; + if ( model.Data.Health > 0 ) + return true; + if ( model.HasData() ) + return true; + return false; + } + public override async Task OnDrop() { await WaitForLoad(); @@ -70,12 +91,12 @@ public override async Task OnDrop() GameObject.Name = model.ResourceName; GameObject.WorldTransform = traceTransform; - bool isProp = (model.Physics?.Parts.Count ?? 0) > 0; - if ( isProp ) + var rigidbody = physics && physicsArchetype != Gizmo.IsShiftPressed; + if ( rigidbody || HasPropData() ) { var prop = GameObject.Components.Create(); prop.Model = model; - prop.IsStatic = archetype == "static_prop_model"; + prop.IsStatic = !rigidbody; } else if ( model.BoneCount > 0 ) { @@ -86,6 +107,12 @@ public override async Task OnDrop() { var renderer = GameObject.Components.Create(); renderer.Model = model; + if ( (model.Physics?.Parts.Count ?? 0) > 0 ) + { + var collider = GameObject.Components.Create(); + collider.Static = true; + collider.Model = model; + } } GameObject.Enabled = true;