Add culling for offscreen decals

pull/13/head
Andrew Cassidy 4 years ago
parent b247e9af4e
commit f195fc4c19
No known key found for this signature in database
GPG Key ID: 963017B38FD477A1

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8af8a41d215556458e4f1a77bfd22aaf749c44eb427c1867e5cf8e84fbdaeb37
size 5164
oid sha256:2f6b1f01873a50d91f3af3f0452e49f1819bbd3438383c88e2d23d74fae3e3ee
size 5172

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:347ae98aa8eb27d0d16974c06ea444d2d6fb72893797ab9201a0fa1ca822f6fb
size 37888
oid sha256:f7fcc42c1ba59a7694df18c60f827f5fd98113ce3471dc01dab37bb67b2d63e5
size 38400

@ -51,6 +51,7 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="DecalBoundsBehaviour.cs" />
<Compile Include="DecalConfig.cs" />
<Compile Include="DecalIconFixer.cs" />
<Compile Include="DecalPropertyIDs.cs" />

@ -0,0 +1,12 @@
using System;
using UnityEngine;
namespace ConformalDecals {
public class DecalBoundsBehaviour : MonoBehaviour {
public ModuleConformalDecal decalRenderer;
private void OnWillRenderObject() {
decalRenderer._shouldRender = true;
}
}
}

@ -48,6 +48,8 @@ namespace ConformalDecals {
/// </remarks>
[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<DecalBoundsBehaviour>();
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);

Loading…
Cancel
Save