From 23c309fa9a12f915f31fb769a09a48e04ef53154 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Thu, 11 Jun 2020 20:49:13 -0700 Subject: [PATCH] Add culling for offscreen decals --- .../ConformalDecals/Assets/decal-blank.mu | Bin 5164 -> 5172 bytes .../Plugins/ConformalDecals.dll | Bin 37888 -> 38400 bytes Source/ConformalDecals/ConformalDecals.csproj | 1 + .../ConformalDecals/DecalBoundsBehaviour.cs | 12 ++++++++ .../ConformalDecals/ModuleConformalDecal.cs | 27 ++++++++++++++++-- 5 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 Source/ConformalDecals/DecalBoundsBehaviour.cs diff --git a/Distribution/GameData/ConformalDecals/Assets/decal-blank.mu b/Distribution/GameData/ConformalDecals/Assets/decal-blank.mu index 9db198ca69d118d8fd1003a0168fdd3cdec59663..30116debe1a72ac2fb0286a61d3596f194526c3d 100644 GIT binary patch delta 26 hcmZ3Zu|;FUIxb!wm(=9M99^gU(!7-7&6~L@IRS$K36%f< delta 18 Zcmdm@u|{LVIxbcg=hCFq&AYiOIRQdi2Aco? diff --git a/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 7f86499af1d2fdbbd8be176b55ad599f861eee7f..c3aa17a51ad467b7cf025b5e6e255a2caf735ee8 100644 GIT binary patch literal 38400 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 diff --git a/Source/ConformalDecals/ConformalDecals.csproj b/Source/ConformalDecals/ConformalDecals.csproj index 912b4f8..01f2a01 100644 --- a/Source/ConformalDecals/ConformalDecals.csproj +++ b/Source/ConformalDecals/ConformalDecals.csproj @@ -51,6 +51,7 @@ + diff --git a/Source/ConformalDecals/DecalBoundsBehaviour.cs b/Source/ConformalDecals/DecalBoundsBehaviour.cs new file mode 100644 index 0000000..4b6cc0b --- /dev/null +++ b/Source/ConformalDecals/DecalBoundsBehaviour.cs @@ -0,0 +1,12 @@ +using System; +using UnityEngine; + +namespace ConformalDecals { + public class DecalBoundsBehaviour : MonoBehaviour { + public ModuleConformalDecal decalRenderer; + + private void OnWillRenderObject() { + decalRenderer._shouldRender = true; + } + } +} \ No newline at end of file diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index 47d5d1e..3d4f3ae 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -48,6 +48,8 @@ namespace ConformalDecals { /// [KSPField] public string decalProjector = "Decal-Projector"; + [KSPField] public string decalBounds = "Decal-Bounds"; + // Parameters [KSPField] public bool scaleAdjustable = true; @@ -124,7 +126,8 @@ namespace ConformalDecals { [KSPField] public Transform decalBackTransform; [KSPField] public Transform decalModelTransform; [KSPField] public Transform decalProjectorTransform; - + [KSPField] public Transform decalBoundsTransform; + [KSPField] public Material backMaterial; [KSPField] public Vector2 backTextureBaseScale; @@ -139,6 +142,8 @@ namespace ConformalDecals { private Material _decalMaterial; private Material _previewMaterial; + + internal bool _shouldRender; private int DecalQueue { get { @@ -203,6 +208,15 @@ namespace ConformalDecals { decalProjectorTransform = part.FindModelTransform(decalProjector); if (decalProjectorTransform == null) throw new FormatException($"Could not find decalProjector transform: '{decalProjector}'."); } + + // find bounds transform + if (string.IsNullOrEmpty(decalBounds)) { + decalBoundsTransform = part.transform; + } + else { + decalBoundsTransform = part.FindModelTransform(decalBounds); + if (decalBoundsTransform == null) throw new FormatException($"Could not find decalBounds transform: '{decalBounds}'."); + } // get back material if necessary if (updateBackScale) { @@ -303,6 +317,9 @@ namespace ConformalDecals { materialProperties.RenderQueue = DecalQueue; + var boundsBehaviour = decalBoundsTransform.gameObject.AddComponent(); + boundsBehaviour.decalRenderer = this; + UpdateMaterials(); if (HighLogic.LoadedSceneIsGame) { @@ -419,6 +436,10 @@ namespace ConformalDecals { UpdateScale(); } + protected void Update() { + _shouldRender = false; + } + protected void UpdateScale() { var aspectRatio = materialProperties.AspectRatio; Vector2 size; @@ -592,9 +613,9 @@ namespace ConformalDecals { } } - protected void Render(Camera camera) { + public void Render(Camera camera) { if (!_isAttached) return; - + // render on each target object foreach (var target in _targets) { target.Render(_decalMaterial, part.mpb, camera);