diff --git a/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll b/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll index 74a4d823..8f43cb39 100644 Binary files a/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll and b/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll differ diff --git a/Source/Restock/ModuleRestockLaunchClamp.cs b/Source/Restock/ModuleRestockLaunchClamp.cs index cc0b0cef..38d9cc53 100644 --- a/Source/Restock/ModuleRestockLaunchClamp.cs +++ b/Source/Restock/ModuleRestockLaunchClamp.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Reflection; using UnityEngine; namespace Restock @@ -9,156 +7,88 @@ namespace Restock { [KSPField] public string trf_towerGirder_name = ""; [KSPField] public string trf_towerYoke_name = ""; - + [KSPField] public Transform towerPivot; [KSPField] public Transform towerYoke; [KSPField] public Transform towerAnchor; [KSPField] public Transform towerGirder; [KSPField] public Transform towerStretch; + [KSPField] public int maxSegments = 100; - [KSPField] public Mesh girderSegmentMesh; - [KSPField] public Mesh girderMesh; - - private List _girderVerts; - private List _girderUVs; - private List _girderNormals; - private List _girderTangents; - private List _girderColors; - private List _girderTris; - private int _girderSegments; - - private bool _girderHasTangents = false; - private bool _girderHasColors = false; - private int _girderVertCount; - private int _girderTriCount; - private bool _flightUpdate = false; + private Material _girderMaterial; + private Mesh _girderMesh; + + private int _girderSegments; + private Matrix4x4[] _girderMatrices; public override void OnLoad(ConfigNode node) { - Debug.Log("OnLoad Called"); - towerPivot = base.part.FindModelTransform(trf_towerPivot_name); towerYoke = base.part.FindModelTransform(trf_towerYoke_name); towerAnchor = base.part.FindModelTransform(trf_anchor_name); towerGirder = base.part.FindModelTransform(trf_towerGirder_name); towerStretch = base.part.FindModelTransform(trf_towerStretch_name); - - girderMesh = towerGirder.GetComponent().mesh; - girderSegmentMesh = Instantiate(girderMesh); - + base.OnLoad(node); } public override void OnStart(StartState state) { + base.OnStart(state); - Debug.Log("OnStart Called"); - Debug.Log(girderSegmentMesh == null); - girderMesh = towerGirder.GetComponent().mesh; - - _girderVertCount = girderSegmentMesh.vertexCount; - _girderTriCount = girderSegmentMesh.triangles.Length; + var girderRenderer = towerGirder.GetComponent(); + _girderMaterial = girderRenderer.material; + _girderMesh = towerGirder.GetComponent().mesh; + + girderRenderer.enabled = false; // we'll render manually from now on - _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) + _girderSegments = 0; + _girderMatrices = new Matrix4x4[maxSegments]; + + _girderMaterial.enableInstancing = true; + if (!_girderMaterial.enableInstancing) { - _girderHasColors = true; - _girderColors = new List(girderSegmentMesh.colors32); + this.LogError("Could not enable instancing! Aborting"); + _girderSegments = -1; + return; } - _girderTris = new List(girderSegmentMesh.triangles); - _girderSegments = 1; - - base.OnStart(state); - - UpdateClamp(); } - + public void LateUpdate() { + + if (_girderSegments < 0) return; + if (!HighLogic.LoadedSceneIsEditor) { if (_flightUpdate) return; else _flightUpdate = true; } - - UpdateClamp(); - } - - public void UpdateClamp() - { - var height = base.height; - var initialHeight = base.initialHeight; - - towerAnchor.position = towerStretch.position - (towerStretch.up * height); - - var vec1 = Vector3.down; - var vec2 = towerAnchor.localPosition - towerYoke.localPosition ; - towerYoke.localRotation = Quaternion.FromToRotation(vec1, vec2); - var segments = Mathf.CeilToInt(height / initialHeight); - if (segments != _girderSegments) - { - UpdateGirder(segments); - } - } + var height1 = HighLogic.LoadedSceneIsEditor ? towerStretch.position.y : base.height; + var initialHeight1 = base.initialHeight; - private void UpdateGirder(int length) - { - if (length > _girderSegments) - { - for (int i = _girderSegments; i < length; 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); - } - } + towerAnchor.position = towerStretch.position - (towerStretch.up * height1); - } - else - { - 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); - } + var vec1 = Vector3.down; + var vec2 = towerAnchor.localPosition - towerYoke.localPosition; + towerYoke.localRotation = Quaternion.FromToRotation(vec1, vec2); - girderMesh.Clear(); + _girderSegments = Mathf.CeilToInt(height1 / base.initialHeight); + _girderSegments = Math.Min(_girderSegments, maxSegments); + _girderSegments = Math.Max(_girderSegments, 0); - girderMesh.SetVertices(_girderVerts); - girderMesh.SetNormals(_girderNormals); - girderMesh.SetUVs(0, _girderUVs); - if (_girderHasTangents) girderMesh.SetTangents(_girderTangents); - if (_girderHasColors) girderMesh.SetColors(_girderColors); - girderMesh.SetTriangles(_girderTris, 0); + var matrix = towerGirder.localToWorldMatrix; + var offset = Matrix4x4.Translate(matrix.MultiplyVector(Vector3.down * base.initialHeight)); - girderMesh.RecalculateBounds(); - _girderSegments = length; + for (int i = 0; i < _girderSegments; i++) + { + _girderMatrices[i] = matrix; + matrix *= offset; + } + + Graphics.DrawMeshInstanced(_girderMesh, 0, _girderMaterial, _girderMatrices, _girderSegments, part.mpb); } } } \ No newline at end of file