From 8a056f5c72cd51de03912bb04ee11105cf9c2a5f Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Sat, 30 May 2020 22:44:44 -0700 Subject: [PATCH] Rework bounds culling and colliders --- .../Plugins/ConformalDecals.dll | Bin 23552 -> 25088 bytes Source/ConformalDecals/ConformalDecals.csproj | 3 + .../ConformalDecals/ModuleConformalDecal.cs | 93 ++++++++++++++---- Source/ConformalDecals/ProjectionTarget.cs | 32 +++--- 4 files changed, 95 insertions(+), 33 deletions(-) diff --git a/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 7ae103617464d198db6880309e33cf9b9f4a6eef..2142929fc863daf47ed8639de2e2ae8e6f98705f 100644 GIT binary patch literal 25088 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 diff --git a/Source/ConformalDecals/ConformalDecals.csproj b/Source/ConformalDecals/ConformalDecals.csproj index 3d846fd..2109274 100644 --- a/Source/ConformalDecals/ConformalDecals.csproj +++ b/Source/ConformalDecals/ConformalDecals.csproj @@ -44,6 +44,9 @@ dlls\UnityEngine.CoreModule.dll + + dlls\UnityEngine.PhysicsModule.dll + diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index 466e9eb..22865c0 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -6,8 +6,9 @@ using UnityEngine; namespace ConformalDecals { public class ModuleConformalDecal : PartModule { - [KSPField] public string decalPreviewTransform = ""; - [KSPField] public string decalModelTransform = ""; + [KSPField] public string decalPreviewTransform = ""; + [KSPField] public string decalModelTransform = ""; + [KSPField] public string decalProjectorTransform = ""; [KSPField(guiName = "Scale", guiActive = false, guiActiveEditor = true, isPersistant = true, guiFormat = "F2", guiUnits = "m"), UI_FloatRange(minValue = 0.05f, maxValue = 4f, stepIncrement = 0.05f)] @@ -22,8 +23,12 @@ namespace ConformalDecals { [KSPField] public MaterialPropertyCollection materialProperties; - [KSPField] public Transform decalPreviewTransformRef; - [KSPField] public Transform decalModelTransformRef; + [KSPField] public Transform decalPreviewTransformRef; + [KSPField] public Transform decalModelTransformRef; + [KSPField] public Transform decalProjectorTransformRef; + [KSPField] public Transform modelTransformRef; + [KSPField] public Transform colliderTransformRef; + [KSPField] public BoxCollider colliderRef; private List _targets; @@ -50,11 +55,34 @@ namespace ConformalDecals { } // find preview object references + modelTransformRef = part.transform.Find("model"); + decalPreviewTransformRef = part.FindModelTransform(decalPreviewTransform); if (decalPreviewTransformRef == null) throw new FormatException("Missing decal preview reference"); - decalModelTransformRef = part.FindModelTransform(decalModelTransform); - if (decalModelTransformRef == null) throw new FormatException("Missing decal mesh reference"); + if (String.IsNullOrEmpty(decalModelTransform)) { + decalModelTransformRef = decalPreviewTransformRef; + } + else { + decalModelTransformRef = part.FindModelTransform(decalModelTransform); + if (decalModelTransformRef == null) throw new FormatException("Missing decal mesh reference"); + } + + if (String.IsNullOrEmpty(decalProjectorTransform)) { + decalProjectorTransformRef = modelTransformRef; + } + else { + decalProjectorTransformRef = part.FindModelTransform(decalProjectorTransform); + if (decalProjectorTransform == null) throw new FormatException("Missing decal projector reference"); + } + + colliderTransformRef = new GameObject("Decal Collider").transform; + colliderTransformRef.parent = modelTransformRef; + colliderTransformRef.position = decalProjectorTransformRef.position; + colliderTransformRef.rotation = decalProjectorTransformRef.rotation; + colliderTransformRef.gameObject.SetActive(false); + + colliderRef = colliderTransformRef.gameObject.AddComponent(); } catch (Exception e) { this.LogException("Exception parsing partmodule", e); @@ -71,6 +99,7 @@ namespace ConformalDecals { if ((state & StartState.Editor) != 0) { // setup OnTweakEvent for scale and depth fields in editor GameEvents.onEditorPartEvent.Add(OnEditorEvent); + GameEvents.onVariantApplied.Add(OnVariantApplied); Fields[nameof(scale)].uiControlEditor.onFieldChanged = OnTweakEvent; Fields[nameof(depth)].uiControlEditor.onFieldChanged = OnTweakEvent; } @@ -80,16 +109,27 @@ namespace ConformalDecals { } } - public void OnDisable() { + private void OnDestroy() { + GameEvents.onEditorPartEvent.Remove(OnEditorEvent); + GameEvents.onVariantApplied.Remove(OnVariantApplied); + // remove from preCull delegate Camera.onPreCull -= Render; } + public void OnTweakEvent(BaseField field, object obj) { // scale or depth values have been changed, so update the projection matrix for each target Project(); } + public void OnVariantApplied(Part eventPart, PartVariant variant) { + if (IsAttached && eventPart == part.parent) { + Detach(); + Attach(); + } + } + public void OnEditorEvent(ConstructionEventType eventType, Part eventPart) { if (eventPart != this.part) return; switch (eventType) { @@ -100,7 +140,7 @@ namespace ConformalDecals { Detach(); break; case ConstructionEventType.PartOffsetting: - case ConstructionEventType.PartRotated: + case ConstructionEventType.PartRotating: case ConstructionEventType.PartDragging: Project(); break; @@ -127,6 +167,9 @@ namespace ConformalDecals { // find all valid renderers var renderers = part.parent.FindModelComponents(); foreach (var renderer in renderers) { + // skip disabled renderers + if (renderer.gameObject.activeInHierarchy == false) continue; + var meshFilter = renderer.GetComponent(); if (meshFilter == null) continue; // object has a meshRenderer with no filter, invalid var mesh = meshFilter.mesh; @@ -143,20 +186,23 @@ namespace ConformalDecals { } // hide preview model - //decalModelTransformRef.gameObject.SetActive(false); + decalModelTransformRef.gameObject.SetActive(false); + + // enable decal collider + colliderTransformRef.gameObject.SetActive(true); // add to preCull delegate Camera.onPreCull += Render; + + Project(); } public void Detach() { - if (IsAttached) { - this.LogError("Detach function called but part still has parent!"); - return; - } - // unhide preview model - //decalModelTransformRef.gameObject.SetActive(true); + decalModelTransformRef.gameObject.SetActive(true); + + // enable decal collider + colliderTransformRef.gameObject.SetActive(false); // remove from preCull delegate Camera.onPreCull -= Render; @@ -166,18 +212,27 @@ namespace ConformalDecals { public void Project() { if (!IsAttached) return; + float width = scale; + float height = scale * aspectRatio; // generate orthogonal matrix scale values - _orthoMatrix[0, 0] = 1 / scale; - _orthoMatrix[1, 1] = 1 / (aspectRatio * scale); + _orthoMatrix[0, 0] = 1 / width; + _orthoMatrix[1, 1] = 1 / height; _orthoMatrix[2, 2] = 1 / depth; // generate bounding box for decal for culling purposes _decalBounds.center = Vector3.forward * (depth / 2); - _decalBounds.extents = new Vector3(scale / 2, aspectRatio * scale / 2, depth / 2); + _decalBounds.extents = new Vector3(width / 2, height / 2, depth / 2); + + // rescale preview model + decalModelTransformRef.localScale = new Vector3(width, height, (width + height) / 2); + + // assign dimensions to collider + colliderRef.center = _decalBounds.center; + colliderRef.size = _decalBounds.size; // project to each target object foreach (var target in _targets) { - target.Project(_orthoMatrix, _decalBounds, this.transform); + target.Project(_orthoMatrix, colliderRef.bounds, decalProjectorTransformRef); } } diff --git a/Source/ConformalDecals/ProjectionTarget.cs b/Source/ConformalDecals/ProjectionTarget.cs index 826585b..61213cd 100644 --- a/Source/ConformalDecals/ProjectionTarget.cs +++ b/Source/ConformalDecals/ProjectionTarget.cs @@ -46,24 +46,28 @@ namespace ConformalDecals { } public void Project(Matrix4x4 orthoMatrix, Bounds projectorBounds, Transform projector) { - var projectorToTargetMatrix = target.worldToLocalMatrix * projector.localToWorldMatrix; - - var projectionMatrix = orthoMatrix * projectorToTargetMatrix.inverse; - var decalNormal = projectorToTargetMatrix.MultiplyVector(Vector3.back).normalized; - var decalTangent = projectorToTargetMatrix.MultiplyVector(Vector3.right).normalized; - - decalMPB.SetMatrix(_projectionMatrixID, projectionMatrix); - decalMPB.SetVector(_decalNormalID, decalNormal); - decalMPB.SetVector(_decalTangentID, decalTangent); - - var targetBounds = new OrientedBounds(target.localToWorldMatrix, _targetRenderer.bounds); - _projectionEnabled = targetBounds.Intersects(projectorBounds); + var targetBounds = _targetRenderer.bounds; + if (targetBounds.Intersects(projectorBounds)) { + _projectionEnabled = true; + var projectorToTargetMatrix = target.worldToLocalMatrix * projector.localToWorldMatrix; + + var projectionMatrix = orthoMatrix * projectorToTargetMatrix.inverse; + var decalNormal = projectorToTargetMatrix.MultiplyVector(Vector3.back).normalized; + var decalTangent = projectorToTargetMatrix.MultiplyVector(Vector3.right).normalized; + + decalMPB.SetMatrix(_projectionMatrixID, projectionMatrix); + decalMPB.SetVector(_decalNormalID, decalNormal); + decalMPB.SetVector(_decalTangentID, decalTangent); + } + else { + _projectionEnabled = false; + } } public bool Render(Material decalMaterial, MaterialPropertyBlock partMPB, Camera camera) { - if (true) { + if (_projectionEnabled) { decalMPB.SetFloat(PropertyIDs._RimFalloff, partMPB.GetFloat(PropertyIDs._RimFalloff)); - decalMPB.SetColor(PropertyIDs._RimFalloff, partMPB.GetColor(PropertyIDs._RimFalloff)); + decalMPB.SetColor(PropertyIDs._RimColor, partMPB.GetColor(PropertyIDs._RimFalloff)); Graphics.DrawMesh(_targetMesh, target.localToWorldMatrix, decalMaterial, 0, camera, 0, decalMPB, ShadowCastingMode.Off, true);