diff --git a/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll index c3aa17a..d26d9ad 100644 Binary files a/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll and b/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll differ 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; } }