From fd68fe9b10c75cf2d421eba37472e02361f85ba9 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Tue, 28 Apr 2020 17:21:52 -0700 Subject: [PATCH] Cache generated girder meshes for later use Should help with vessels that have large numbers of launch clamps --- .../GameData/ReStock/Plugins/Restock.dll | Bin 41472 -> 42496 bytes Source/Restock/LaunchClampGirderFactory.cs | 133 +++++++++++++++ Source/Restock/ModuleRestockLaunchClamp.cs | 153 ++++++------------ Source/Restock/Restock.csproj | 1 + 4 files changed, 180 insertions(+), 107 deletions(-) create mode 100644 Source/Restock/LaunchClampGirderFactory.cs diff --git a/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll b/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll index 63670a468bd97bcaf41ab78dae424e2322dcc436..12e00d2c48c3f01ebb30d1f890fd3add06d5b351 100644 GIT binary patch literal 42496 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 literal 41472 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 _girderVerts; + private List _girderUVs; + private List _girderNormals; + private List _girderTangents; + private List _girderColors; + private List _girderTris; + + public void Initialize(Mesh girderSegmentMesh, float girderSegmentHeight, int maxLength = 100) + { + this.girderSegmentMesh = girderSegmentMesh; + + _girderSegmentHeight = girderSegmentHeight; + _maxLength = maxLength; + _girderMeshCache = new Mesh[maxLength]; + + _girderMeshCache[0] = new Mesh(); + _girderMeshCache[1] = girderSegmentMesh; + + _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 Mesh makeGirder(int length) + { + if (length < 0) length = 0; + if (length > _maxLength) length = _maxLength; + + if (_girderMeshCache[length] == null) + { + Debug.Log("Girder mesh not generated, making it now..."); + var girderMesh = makeGirderMesh(length); + _girderMeshCache[length] = girderMesh; + } + + return _girderMeshCache[length]; + } + + private Mesh makeGirderMesh(int length) + { + if (length < 1) + { + return new Mesh(); + } + var girderMesh = new Mesh(); + if (length > _girderSegments) + { + for (int i = _girderSegments; i < length ; i++) + { + var offset = Vector3.down * _girderSegmentHeight * 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 (length < _girderSegments) + { + var startIndex = length * _girderVertCount; + var count = (_girderSegments - length) * _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(length * _girderTriCount, + (_girderSegments - length) * _girderTriCount); + } + + 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 = length; + + return girderMesh; + } + } +} \ No newline at end of file diff --git a/Source/Restock/ModuleRestockLaunchClamp.cs b/Source/Restock/ModuleRestockLaunchClamp.cs index 130a91a8..cb07678b 100644 --- a/Source/Restock/ModuleRestockLaunchClamp.cs +++ b/Source/Restock/ModuleRestockLaunchClamp.cs @@ -17,46 +17,54 @@ namespace Restock [KSPField] public string trf_towerYoke_name = ""; [KSPField] public Mesh girderMesh; + [KSPField] public MeshFilter girderMeshFilter; + [KSPField] public float girderSegmentHeight; + public LaunchClampGirderFactory girderFactory; + + private int _girderSegments; 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 _girderFlightUpdated = false; - private bool _girderHasTangents = false; - private bool _girderHasColors = false; - private int _girderVertCount; - private int _girderTriCount; - private int _girderSegments; + [KSPField] public bool instancingEnabled = true; public override void OnLoad(ConfigNode node) { - towerPivot = part.FindModelTransform(trf_towerPivot_name); - towerYoke = part.FindModelTransform(trf_towerYoke_name); - towerAnchor = part.FindModelTransform(trf_anchor_name); - towerGirder = part.FindModelTransform(trf_towerGirder_name); - towerStretch = part.FindModelTransform(trf_towerStretch_name); - if (!SystemInfo.supportsInstancing) + if (!HighLogic.LoadedSceneIsGame) { - this.LogWarning("You are using a computer which does not support instancing, " + - "falling back to a slower launch clamp implementation"); - instancingEnabled = false; + towerPivot = part.FindModelTransform(trf_towerPivot_name); + towerYoke = part.FindModelTransform(trf_towerYoke_name); + towerAnchor = part.FindModelTransform(trf_anchor_name); + towerGirder = part.FindModelTransform(trf_towerGirder_name); + towerStretch = part.FindModelTransform(trf_towerStretch_name); + + girderMeshFilter = towerGirder.GetComponent(); + girderMesh = girderMeshFilter.mesh; + + if (!SystemInfo.supportsInstancing) + { + this.LogWarning("You are using a computer which does not support instancing, " + + "falling back to a slower launch clamp implementation in the editor"); + instancingEnabled = false; + } + + if (girderFactory == null) + { + //Debug.Log("Making new girder factory..."); + girderSegmentHeight = Vector3.Distance(towerAnchor.position, towerStretch.position); + if (float.IsInfinity(girderSegmentHeight)) + { + girderSegmentHeight = -1f; + } + + girderFactory = ScriptableObject.CreateInstance(); + girderFactory.Initialize(girderMesh, girderSegmentHeight, maxSegments); + } } - girderMesh = towerGirder.GetComponent().mesh; - girderSegmentMesh = Instantiate(girderMesh); + _girderSegments = 1; base.OnLoad(node); } @@ -77,29 +85,6 @@ namespace Restock _girderMaterial = girderRenderer.material; _girderMaterial.enableInstancing = true; } - else - { - _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() @@ -117,26 +102,27 @@ namespace Restock girderSegments = Math.Min(girderSegments, maxSegments); girderSegments = Math.Max(girderSegments, 0); - if (HighLogic.LoadedSceneIsEditor){ + if (HighLogic.LoadedSceneIsEditor) + { if (instancingEnabled) { - UpdateGirder(girderSegments); + UpdateGirderInstanced(girderSegments); } else { - UpdateGirderFallback(girderSegments); + UpdateGirderMesh(girderSegments); } } else { if (_girderFlightUpdated) return; - - UpdateGirderFallback(girderSegments); + + UpdateGirderMesh(girderSegments); _girderFlightUpdated = true; } } - private void UpdateGirder(int girderSegments) + private void UpdateGirderInstanced(int girderSegments) { var matrix = towerGirder.localToWorldMatrix; var offset = Matrix4x4.Translate(towerGirder.TransformVector(Vector3.down * initialHeight)); @@ -151,58 +137,11 @@ namespace Restock UnityEngine.Rendering.ShadowCastingMode.On, true, towerGirder.gameObject.layer); } - private void UpdateGirderFallback(int newGirderSegments) + private void UpdateGirderMesh(int girderSegments) { - 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); + if (girderSegments == _girderSegments) return; - girderMesh.RecalculateBounds(); - _girderSegments = newGirderSegments; + girderMeshFilter.mesh = girderFactory.makeGirder(girderSegments); } } } \ No newline at end of file diff --git a/Source/Restock/Restock.csproj b/Source/Restock/Restock.csproj index 8c469675..0af3b1f7 100644 --- a/Source/Restock/Restock.csproj +++ b/Source/Restock/Restock.csproj @@ -49,6 +49,7 @@ +