From 4ed65bdf4adbc7fe918e8cb8390840963d465c9d Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Thu, 11 Jun 2020 21:01:01 -0700 Subject: [PATCH] Use bounds to choose projection targets --- .../Plugins/ConformalDecals.dll | 2 +- .../ConformalDecals/ModuleConformalDecal.cs | 5 ++- Source/ConformalDecals/ProjectionTarget.cs | 37 +++++++++++-------- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll index cefb3bf..4b9de3d 100644 --- a/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll +++ b/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f7fcc42c1ba59a7694df18c60f827f5fd98113ce3471dc01dab37bb67b2d63e5 +oid sha256:81553ade6fce5028845f7a6753471e5106dc4768f79a2d482fa03dd0cc8f5d42 size 38400 diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index 3d4f3ae..04097b7 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -142,6 +142,7 @@ namespace ConformalDecals { private Material _decalMaterial; private Material _previewMaterial; + private BoxCollider _boundsCollider; internal bool _shouldRender; @@ -320,6 +321,8 @@ namespace ConformalDecals { var boundsBehaviour = decalBoundsTransform.gameObject.AddComponent(); boundsBehaviour.decalRenderer = this; + _boundsCollider = decalBoundsTransform.GetComponent(); + UpdateMaterials(); if (HighLogic.LoadedSceneIsGame) { @@ -481,7 +484,7 @@ namespace ConformalDecals { // update projection foreach (var target in _targets) { - target.Project(_orthoMatrix, decalProjectorTransform, useBaseNormal); + target.Project(_orthoMatrix, decalProjectorTransform, _boundsCollider.bounds, useBaseNormal); } } else { diff --git a/Source/ConformalDecals/ProjectionTarget.cs b/Source/ConformalDecals/ProjectionTarget.cs index 5b8adae..621c56b 100644 --- a/Source/ConformalDecals/ProjectionTarget.cs +++ b/Source/ConformalDecals/ProjectionTarget.cs @@ -20,30 +20,35 @@ namespace ConformalDecals { _decalMPB = new MaterialPropertyBlock(); } - public void Project(Matrix4x4 orthoMatrix, Transform projector, bool useBaseNormal) { - _projectionEnabled = true; + public void Project(Matrix4x4 orthoMatrix, Transform projector, Bounds projectorBounds, bool useBaseNormal) { - var targetMaterial = _targetRenderer.sharedMaterial; - var projectorToTargetMatrix = target.worldToLocalMatrix * projector.localToWorldMatrix; + if (projectorBounds.Intersects(_targetRenderer.bounds)) { + _projectionEnabled = true; + var targetMaterial = _targetRenderer.sharedMaterial; + 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; + var projectionMatrix = orthoMatrix * projectorToTargetMatrix.inverse; + var decalNormal = projectorToTargetMatrix.MultiplyVector(Vector3.back).normalized; + var decalTangent = projectorToTargetMatrix.MultiplyVector(Vector3.right).normalized; - _decalMPB.SetMatrix(DecalPropertyIDs._ProjectionMatrix, projectionMatrix); - _decalMPB.SetVector(DecalPropertyIDs._DecalNormal, decalNormal); - _decalMPB.SetVector(DecalPropertyIDs._DecalTangent, decalTangent); + _decalMPB.SetMatrix(DecalPropertyIDs._ProjectionMatrix, projectionMatrix); + _decalMPB.SetVector(DecalPropertyIDs._DecalNormal, decalNormal); + _decalMPB.SetVector(DecalPropertyIDs._DecalTangent, decalTangent); - if (useBaseNormal && targetMaterial.HasProperty(DecalPropertyIDs._BumpMap)) { - _decalMPB.SetTexture(DecalPropertyIDs._BumpMap, targetMaterial.GetTexture(DecalPropertyIDs._BumpMap)); + if (useBaseNormal && targetMaterial.HasProperty(DecalPropertyIDs._BumpMap)) { + _decalMPB.SetTexture(DecalPropertyIDs._BumpMap, targetMaterial.GetTexture(DecalPropertyIDs._BumpMap)); - var normalScale = targetMaterial.GetTextureScale(DecalPropertyIDs._BumpMap); - var normalOffset = targetMaterial.GetTextureOffset(DecalPropertyIDs._BumpMap); + var normalScale = targetMaterial.GetTextureScale(DecalPropertyIDs._BumpMap); + var normalOffset = targetMaterial.GetTextureOffset(DecalPropertyIDs._BumpMap); - _decalMPB.SetVector(DecalPropertyIDs._BumpMap_ST, new Vector4(normalScale.x, normalScale.y, normalOffset.x, normalOffset.y)); + _decalMPB.SetVector(DecalPropertyIDs._BumpMap_ST, new Vector4(normalScale.x, normalScale.y, normalOffset.x, normalOffset.y)); + } + else { + _decalMPB.SetTexture(DecalPropertyIDs._BumpMap, DecalConfig.BlankNormal); + } } else { - _decalMPB.SetTexture(DecalPropertyIDs._BumpMap, DecalConfig.BlankNormal); + _projectionEnabled = false; } }