public void OnSceneGUI() { MegaWire mod = (MegaWire)target; if (mod.displayGizmo) { Handles.color = mod.gizmoColor; for (int i = 0; i < mod.spans.Count; i++) { MegaWireSpan span = mod.spans[i]; for (int c = 0; c < span.connections.Count; c++) { MegaWireConnection con = span.connections[c]; Vector3 p = con.masspos[1]; MegaWireHandles.DotCap(0, p, Quaternion.identity, con.radius); for (int m = 2; m < con.masspos.Length - 1; m++) { p = con.masspos[m]; MegaWireHandles.DotCap(0, con.masspos[m], Quaternion.identity, con.radius); } // Draw springs int scount = con.springs.Count; if (mod.stiffnessSprings) { scount = con.masses.Count - 1; } for (int s = 0; s < scount; s++) { Vector3 p1 = con.masses[con.springs[s].p1].pos; Vector3 p2 = con.masses[con.springs[s].p2].pos; float w = ((con.springs[s].len - con.springs[s].restlen) / con.springs[s].restlen) * con.springs[s].ks; //con.springs[s].restlen; if (w >= 0.0f) { Handles.color = Color.Lerp(Color.green, Color.red, w); } else { Handles.color = Color.Lerp(Color.green, Color.blue, -w); } Handles.DrawLine(p1, p2); } } } if (mod.disableOnDistance) { Handles.color = mod.gizmoColor; for (int s = 0; s < mod.spans.Count; s++) { Vector3 mp = (mod.spans[s].connections[0].masses[0].pos + mod.spans[s].connections[0].masses[mod.spans[s].connections[0].masses.Count - 1].pos) * 0.5f; MegaWireHandles.SphereCap(0, mp, Quaternion.identity, mod.disableDist * 2.0f); } } } }
public void OnSceneGUI() { MegaWireWind mod = (MegaWireWind)target; Matrix4x4 tm = mod.transform.localToWorldMatrix; if (mod.displayGizmo) { if (mod.divs < 1) { mod.divs = 1; } Handles.matrix = tm; Vector3 p = Vector3.zero; Vector3 frc = mod.Force(tm.MultiplyPoint(p)) * mod.gizscale; Handles.color = mod.gizmocol; Handles.DrawLine(p, p + frc); int xdivs = 0; int ydivs = 0; if (mod.gizmoSize.x > mod.gizmoSize.y) { xdivs = mod.divs; ydivs = (int)((float)mod.divs / (mod.gizmoSize.x / mod.gizmoSize.y)); } else { ydivs = mod.divs; xdivs = (int)((float)mod.divs / (mod.gizmoSize.y / mod.gizmoSize.x)); } for (int y = 0; y < 1; y++) { p.y = mod.gizmopos.y; for (int x = 0; x <= xdivs; x++) { p.x = (-mod.gizmoSize.x * 0.5f) + (((float)x / (float)xdivs) * mod.gizmoSize.x) + mod.gizmopos.x; for (int z = 0; z <= ydivs; z++) { p.z = (-mod.gizmoSize.y * 0.5f) + (((float)z / (float)ydivs) * mod.gizmoSize.y) + mod.gizmopos.z; frc = mod.Force(tm.MultiplyPoint(p)); frc *= mod.gizscale; MegaWireHandles.DotCap(0, p, Quaternion.identity, (mod.gizmoSize.x + mod.gizmoSize.y) * 0.5f * 0.002f); Handles.DrawLine(p, p + frc); } } } Vector3 gpos = mod.gizmopos; gpos.x += mod.gizmoSize.x * 0.5f; gpos.z += mod.gizmoSize.y * 0.5f; gpos = Handles.PositionHandle(gpos, Quaternion.identity); gpos.x -= mod.gizmoSize.x * 0.5f; gpos.z -= mod.gizmoSize.y * 0.5f; mod.gizmopos = gpos; //mod.gizmopos = Vector3.zero; } }
void OnSceneGUI() { MegaWirePlantPolesList mod = (MegaWirePlantPolesList)target; arrow.arrowlength = mod.arrowlength; arrow.arrowoff = mod.arrowoff; arrow.arrowwidth = mod.arrowwidth; arrow.vertStart = mod.vertStart; arrow.vertLength = mod.vertLength; arrow.lineCol = mod.lineCol; arrow.otherCol = mod.otherCol; arrow.arrowcol = mod.arrowCol; arrow.dashCol = mod.dashCol; arrow.units = MegaArrow.GetUnitsString(mod.units); arrow.unitsscale = MegaArrow.GetUnitsScale(mod.units, mod.unitsScale); arrow.dashdist = mod.dashdist; if (mod.showgizmo && (mod.gizmoType == MegaWireGizmoType.Waypoint || mod.gizmoType == MegaWireGizmoType.Both)) { switch (Event.current.type) { case EventType.KeyDown: if (Event.current.keyCode == KeyCode.A) { if (!addmode) { Debug.Log("Start Add Mode"); addmode = true; Event.current.Use(); } } break; case EventType.KeyUp: if (Event.current.keyCode == KeyCode.A) { if (addmode) { Debug.Log("End Add mode"); addmode = false; addingpoint = false; Event.current.Use(); } } break; } if (mod.showgizmo && (mod.gizmoType == MegaWireGizmoType.Waypoint || mod.gizmoType == MegaWireGizmoType.Both)) { Camera cam = UnityEditor.SceneView.currentDrawingSceneView.camera; if (cam) { Vector3 camwp = Event.current.mousePosition; camwp.z = 0.0f; float dist = 100000.0f; seg = -1; // Just do distance from mid point, and use closest for (int i = 0; i < mod.waypoints.Count - 1; i++) { Vector3 p = mod.waypoints[i]; Vector3 p1 = mod.waypoints[i + 1]; Vector3 wp = mod.transform.TransformPoint(p); Vector3 wp1 = mod.transform.TransformPoint(p1); Vector3 sp = cam.WorldToScreenPoint(wp); Vector3 sp1 = cam.WorldToScreenPoint(wp1); sp.z = 0.0f; sp1.z = 0.0f; Vector3 cp2 = (sp + sp1) * 0.5f; float d = Vector3.Distance(camwp, cp2); if (d < dist) { dist = d; seg = i; } } if (seg >= 0) { Vector3 pos = Vector3.Lerp(mod.waypoints[seg], mod.waypoints[seg + 1], 0.5f); Handles.color = Color.green; MegaWireHandles.DotCap(1066, mod.transform.TransformPoint(pos), Quaternion.identity, 0.2f); } } } if (addmode) { int controlID = GUIUtility.GetControlID(FocusType.Passive); Camera cam = UnityEditor.SceneView.currentDrawingSceneView.camera; if (cam) { switch (Event.current.GetTypeForControl(controlID)) { case EventType.MouseDown: GUIUtility.hotControl = controlID; Event.current.Use(); if (!addingpoint) { addingpoint = true; if (seg >= 0) { Vector3 cp = (mod.waypoints[seg] + mod.waypoints[seg + 1]) * 0.5f; mod.waypoints.Insert(seg + 1, cp); } } break; case EventType.MouseUp: addingpoint = false; GUIUtility.hotControl = 0; Event.current.Use(); break; } } } } // Draw the fancier lines // Show waypoints and or pole spacing // option to control units //string units = MegaArrow.GetUnitsString(mod.units); //float unitsscale = MegaArrow.GetUnitsScale(mod.units, mod.unitsScale); GUIStyle style = new GUIStyle(); style.normal.textColor = mod.lineCol; if (mod.waypoints.Count > 1 && mod.showgizmo) { float arrowoff = mod.vertStart + (mod.vertLength * mod.arrowoff); arrow.arrowoff = arrowoff; if (mod.gizmoType == MegaWireGizmoType.Waypoint || mod.gizmoType == MegaWireGizmoType.Both) { for (int i = 0; i < mod.waypoints.Count; i++) { Vector3 lp = mod.transform.TransformPoint(mod.waypoints[i]); lp = SceneView.currentDrawingSceneView.camera.WorldToScreenPoint(lp); Handles.color = mod.lineCol; if (lp.z > 0.0f) { Handles.Label(mod.transform.TransformPoint(mod.waypoints[i]), "" + i, style); } if (i > 0) { Vector3 p1 = mod.transform.TransformPoint(mod.waypoints[i - 1]); Vector3 p2 = mod.transform.TransformPoint(mod.waypoints[i]); arrow.DrawArrow(i, p1, p2, style); } Vector3 p = mod.transform.worldToLocalMatrix.MultiplyPoint(Handles.PositionHandle(mod.transform.localToWorldMatrix.MultiplyPoint(mod.waypoints[i]), Quaternion.identity)); if (p != mod.waypoints[i]) { mod.waypoints[i] = p; mod.Rebuild(); } } if (mod.closed) { Handles.DrawLine(mod.waypoints[mod.waypoints.Count - 1], mod.waypoints[0]); } } // Poles if (mod.gizmoType == MegaWireGizmoType.Pole || mod.gizmoType == MegaWireGizmoType.Both) { Handles.matrix = Matrix4x4.identity; for (int i = 0; i < mod.poles.Count; i++) { Vector3 lp = mod.transform.TransformPoint(mod.poles[i].transform.position); lp = SceneView.currentDrawingSceneView.camera.WorldToScreenPoint(lp); if (i > 0) { Vector3 p1 = mod.poles[i - 1].transform.position; Vector3 p2 = mod.poles[i].transform.position; arrow.DrawArrow(i, p1, p2, style); } } } } }