private void updatePanelPower(SuncatcherData sc) { if (!isOccludedByPart(sc.suncatcherTransform)) { Vector3 normalized = (sunTransform.position - sc.suncatcherTransform.position).normalized; Vector3 suncatcherVector = Vector3.zero; float invertValue = 0f; switch (suncatcherAngleAxis) { case Axis.XPlus: suncatcherVector = sc.suncatcherTransform.right; invertValue = sc.suncatcherTransform.lossyScale.x; break; case Axis.XNeg: suncatcherVector = -sc.suncatcherTransform.right; invertValue = sc.suncatcherTransform.lossyScale.x; break; case Axis.YPlus: suncatcherVector = sc.suncatcherTransform.up; invertValue = sc.suncatcherTransform.lossyScale.y; break; case Axis.YNeg: suncatcherVector = -sc.suncatcherTransform.up; invertValue = sc.suncatcherTransform.lossyScale.y; break; case Axis.ZPlus: suncatcherVector = sc.suncatcherTransform.forward; invertValue = sc.suncatcherTransform.lossyScale.z; break; case Axis.ZNeg: suncatcherVector = -sc.suncatcherTransform.forward; invertValue = sc.suncatcherTransform.lossyScale.z; break; default: break; } if (invertValue < 0) { suncatcherVector = -suncatcherVector; } float sunAOA = Mathf.Clamp(Vector3.Dot(suncatcherVector, normalized), 0f, 1f); float distMult = (float)(vessel.solarFlux / PhysicsGlobals.SolarLuminosityAtHome); if (distMult == 0 && FlightGlobals.currentMainBody != null)//vessel.solarFlux == 0, so occluded by a planetary body { occluderName = FlightGlobals.currentMainBody.name;//just guessing..but might be occluded by the body we are orbiting? } float efficMult = temperatureEfficCurve.Evaluate((float)part.temperature); float panelEnergy = resourceAmount * TimeWarp.fixedDeltaTime * sunAOA * distMult * efficMult; energyFlow += panelEnergy; } }
private void findTransforms() { String[] suncatcherNames = SSTUUtils.parseCSV(rayTransforms); String[] pivotNames = SSTUUtils.parseCSV(pivotTransforms); String[] secPivotNames = SSTUUtils.parseCSV(secondaryPivotTransforms); PivotData pd; SuncatcherData sd; int len2; Transform[] trs; String name; List<PivotData> tempPivotData = new List<PivotData>(); int len = pivotNames.Length; for (int i = 0; i < len; i++) { name = pivotNames[i]; if (String.IsNullOrEmpty(name)) { MonoBehaviour.print("ERROR: Empty name for solar pivot for part: " + part); } trs = part.transform.FindChildren(name); len2 = trs.Length; if (len2 == 0) { MonoBehaviour.print("ERROR: Could not locate solar pivot transforms for name: "+name + " for part: " + part); } for (int k = 0; k < len2; k++) { pd = new PivotData(); pd.pivotTransform = trs[k]; pd.defaultOrientation = pd.pivotTransform.localRotation; tempPivotData.Add(pd); } } pivotData = tempPivotData.ToArray(); tempPivotData.Clear(); len = secPivotNames.Length; for (int i = 0; i < len; i++) { name = secPivotNames[i]; if (String.IsNullOrEmpty(name)) { continue; } trs = part.transform.FindChildren(name); len2 = trs.Length; if (len2 == 0) { MonoBehaviour.print("ERROR: Could not locate secondary pivot transforms for name: " + name + " for part: " + part); } for (int k = 0; k < len2; k++) { pd = new PivotData(); pd.pivotTransform = trs[k]; pd.defaultOrientation = pd.pivotTransform.localRotation; tempPivotData.Add(pd); } } secondaryPivotData = tempPivotData.ToArray(); tempPivotData.Clear(); List<SuncatcherData> tempSunData = new List<SuncatcherData>(); len = suncatcherNames.Length; for (int i = 0; i < len; i++) { name = suncatcherNames[i]; if (String.IsNullOrEmpty(name)) { MonoBehaviour.print("ERROR: Empty name for suncatcher for part: "+ part); } trs = part.transform.FindChildren(name); len2 = trs.Length; if (len2 == 0) { MonoBehaviour.print("ERROR: Could not locate suncatcher transforms for name: " + name+" for part: "+part); } for (int k = 0; k < len2; k++) { sd = new SuncatcherData(); sd.suncatcherTransform = trs[k]; tempSunData.Add(sd); } } suncatcherData = tempSunData.ToArray(); Transform t1; if (windBreakTransformName != null && windBreakTransformName.Length > 0) { t1 = part.FindModelTransform(windBreakTransformName); if (t1 != null) { windBreakTransform = t1; } } if (windBreakTransform == null && pivotData.Length > 0) { windBreakTransform = pivotData[0].pivotTransform; }//else it will use default vessel transform }