From 2c16fab42e1d8130182df91cda9c4cef81ac5e7e Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Sat, 1 Feb 2020 17:18:20 -0800 Subject: [PATCH] Add launch clamp fallback for older versions of OpenGL Add a fallback method for the launch clamp module that does not require GPU instancing, for users with older computers. This method is currently very slow when calculating several launch clamps in a single frame in the editor, but fine in the flight scene --- .../GameData/ReStock/Plugins/Restock.dll | Bin 39424 -> 41472 bytes Source/Restock/ModuleRestockLaunchClamp.cs | 158 +++++++++++++++--- 2 files changed, 135 insertions(+), 23 deletions(-) diff --git a/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll b/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll index ae666dac2ca0894853a09dc4c707d4383621c4e3..f92c4c0a2b15dcb984530aeaea69045f22c7f43e 100644 GIT binary patch literal 41472 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М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 Ru3P$#6Z!un{oiAO{{vEng?<14 literal 39424 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 diff --git a/Source/Restock/ModuleRestockLaunchClamp.cs b/Source/Restock/ModuleRestockLaunchClamp.cs index 22556fc3..8c21b99e 100644 --- a/Source/Restock/ModuleRestockLaunchClamp.cs +++ b/Source/Restock/ModuleRestockLaunchClamp.cs @@ -1,15 +1,11 @@ using System; +using System.Collections.Generic; using UnityEngine; namespace Restock { public class ModuleRestockLaunchClamp : LaunchClamp { - private Material _girderMaterial; - private Matrix4x4[] _girderMatrices; - private Mesh _girderMesh; - - private int _girderSegments; [KSPField] public int maxSegments = 100; [KSPField] public Transform towerAnchor; [KSPField] public Transform towerGirder; @@ -20,6 +16,28 @@ namespace Restock [KSPField] public string trf_towerGirder_name = ""; [KSPField] public string trf_towerYoke_name = ""; + [KSPField] public Mesh girderMesh; + + private Material _girderMaterial; + private Matrix4x4[] _girderMatrices; + + //used by non-instanced fallback girder implementation + [KSPField] public bool instancingEnabled = true; + [KSPField] public Mesh girderSegmentMesh; + + private List _girderVerts; + private List _girderUVs; + private List _girderNormals; + private List _girderTangents; + private List _girderColors; + private List _girderTris; + + private bool _girderHasTangents = false; + private bool _girderHasColors = false; + private int _girderVertCount; + private int _girderTriCount; + private int _girderSegments; + public override void OnLoad(ConfigNode node) { towerPivot = part.FindModelTransform(trf_towerPivot_name); @@ -28,6 +46,15 @@ namespace Restock towerGirder = part.FindModelTransform(trf_towerGirder_name); towerStretch = part.FindModelTransform(trf_towerStretch_name); + if (!SystemInfo.supportsInstancing) + { + this.LogWarning("You are using a computer which does not support instancing, " + + "falling back to a slower launch clamp implementation"); + instancingEnabled = false; + girderMesh = towerGirder.GetComponent().mesh; + girderSegmentMesh = Instantiate(girderMesh); + } + base.OnLoad(node); } @@ -35,50 +62,135 @@ namespace Restock { base.OnStart(state); - var girderRenderer = towerGirder.GetComponent(); - _girderMaterial = girderRenderer.material; - _girderMesh = towerGirder.GetComponent().mesh; + girderMesh = towerGirder.GetComponent().mesh; - girderRenderer.enabled = false; // we'll render manually from now on + if (instancingEnabled) + { + var girderRenderer = towerGirder.GetComponent(); + girderRenderer.enabled = false; // we'll render manually from now on - _girderSegments = 0; - _girderMatrices = new Matrix4x4[maxSegments]; + _girderMatrices = new Matrix4x4[maxSegments]; - _girderMaterial.enableInstancing = true; - if (!_girderMaterial.enableInstancing) + _girderMaterial = girderRenderer.material; + _girderMaterial.enableInstancing = true; + } + else { - this.LogError("Could not enable instancing! Aborting"); - _girderSegments = -1; + this.Log("Instancing is disabled, setting up fallback"); + _girderVertCount = girderSegmentMesh.vertexCount; + _girderTriCount = girderSegmentMesh.triangles.Length; + + _girderVerts = new List(girderSegmentMesh.vertices); + _girderUVs = new List(girderSegmentMesh.uv); + _girderNormals = new List(girderSegmentMesh.normals); + if (girderSegmentMesh.tangents.Length > 0) + { + _girderHasTangents = true; + _girderTangents = new List(girderSegmentMesh.tangents); + } + + if (girderSegmentMesh.colors32.Length > 0) + { + _girderHasColors = true; + _girderColors = new List(girderSegmentMesh.colors32); + } + + _girderTris = new List(girderSegmentMesh.triangles); + _girderSegments = 1; } } public void LateUpdate() { - if (_girderSegments < 0) return; - var height = HighLogic.LoadedSceneIsEditor ? towerStretch.position.y : this.height; var initialHeight = this.initialHeight; towerAnchor.position = towerStretch.position - towerStretch.up * height; - + var vec1 = Vector3.down; var vec2 = towerAnchor.localPosition - towerYoke.localPosition; towerYoke.localRotation = Quaternion.FromToRotation(vec1, vec2); - _girderSegments = Mathf.CeilToInt(height / this.initialHeight); - _girderSegments = Math.Min(_girderSegments, maxSegments); - _girderSegments = Math.Max(_girderSegments, 0); + var girderSegments = Mathf.CeilToInt(height / initialHeight); + girderSegments = Math.Min(girderSegments, maxSegments); + girderSegments = Math.Max(girderSegments, 0); + + if (instancingEnabled) + { + UpdateGirder(girderSegments); + } + else + { + UpdateGirderFallback(girderSegments); + } + } + private void UpdateGirder(int girderSegments) + { var matrix = towerGirder.localToWorldMatrix; var offset = Matrix4x4.Translate(towerGirder.TransformVector(Vector3.down * initialHeight)); - for (var i = 0; i < _girderSegments; i++) + for (var i = 0; i < girderSegments; i++) { _girderMatrices[i] = matrix; matrix = offset * matrix; } - Graphics.DrawMeshInstanced(_girderMesh, 0, _girderMaterial, _girderMatrices, _girderSegments, part.mpb); + Graphics.DrawMeshInstanced(girderMesh, 0, _girderMaterial, _girderMatrices, girderSegments, part.mpb); + } + + private void UpdateGirderFallback(int newGirderSegments) + { + + if (newGirderSegments == _girderSegments) return; + + if (newGirderSegments > _girderSegments) + { + for (int i = _girderSegments; i < newGirderSegments; i++) + { + var offset = Vector3.down * base.initialHeight * i; + var indexOffset = _girderVertCount * i; + for (int v = 0; v < _girderVertCount; v++) + { + _girderVerts.Add(girderSegmentMesh.vertices[v] + offset); + } + + _girderNormals.AddRange(girderSegmentMesh.normals); + _girderUVs.AddRange(girderSegmentMesh.uv); + + if (_girderHasTangents) _girderTangents.AddRange(girderSegmentMesh.tangents); + if (_girderHasColors) _girderColors.AddRange(girderSegmentMesh.colors32); + + for (int t = 0; t < _girderTriCount; t++) + { + _girderTris.Add(girderSegmentMesh.triangles[t] + indexOffset); + } + } + } + else if (newGirderSegments < _girderSegments) + { + var startIndex = newGirderSegments * _girderVertCount; + var count = (_girderSegments - newGirderSegments) * _girderVertCount; + _girderVerts.RemoveRange(startIndex, count); + _girderNormals.RemoveRange(startIndex, count); + _girderUVs.RemoveRange(startIndex, count); + if (_girderHasTangents) _girderTangents.RemoveRange(startIndex, count); + if (_girderHasColors) _girderColors.RemoveRange(startIndex, count); + + _girderTris.RemoveRange(newGirderSegments * _girderTriCount, (_girderSegments - newGirderSegments) * _girderTriCount); + } + + girderMesh.Clear(); + + girderMesh.SetVertices(_girderVerts); + girderMesh.SetNormals(_girderNormals); + girderMesh.SetUVs(0, _girderUVs); + if (_girderHasTangents) girderMesh.SetTangents(_girderTangents); + if (_girderHasColors) girderMesh.SetColors(_girderColors); + girderMesh.SetTriangles(_girderTris, 0); + + girderMesh.RecalculateBounds(); + _girderSegments = newGirderSegments; } } } \ No newline at end of file