private void Render(CableRoute route, float radius) { if (m_segmentSpawner == null) { return; } // Let OnDrawGizmos handle rendering when in prefab edit mode. // It's not possible to use RuntimeObjects while there. if (PrefabUtils.IsPartOfEditingPrefab(gameObject)) { return; } if (!Cable.RoutePointCurveUpToDate) { Cable.SynchronizeRoutePointCurve(); } m_segmentSpawner.Begin(); try { var points = Cable.GetRoutePoints(); for (int i = 1; i < points.Length; ++i) { m_segmentSpawner.CreateSegment(points[i - 1], points[i], radius); } } catch (System.Exception e) { Debug.LogException(e, this); } m_segmentSpawner.End(); }
private void DrawGizmos(bool isSelected) { if (Application.isPlaying) { return; } if (Wire == null || Wire.Route == null || Wire.Route.NumNodes < 2) { return; } if (!PrefabUtils.IsPartOfEditingPrefab(gameObject)) { return; } var routePoints = Wire.Route.Select(routePoint => routePoint.Position).ToArray(); var defaultColor = Color.Lerp(Color.black, Color.white, 0.55f); var selectedColor = Color.Lerp(defaultColor, Color.green, 0.15f); m_segmentSpawner?.DrawGizmos(routePoints, Wire.Radius, isSelected ? selectedColor : defaultColor); }
private void DrawGizmos(bool isSelected) { if (Application.isPlaying) { return; } if (!PrefabUtils.IsPartOfEditingPrefab(gameObject)) { return; } // The conveyor belt has some rendering when selected. if (GetComponent <Model.ConveyorBelt>() != null) { return; } var defaultColor = Color.Lerp(Color.black, Color.red, 0.15f); var selectedColor = Color.Lerp(defaultColor, Color.white, 0.15f); foreach (var track in Tracks) { DrawGizmosUninitialized(track, isSelected ? selectedColor : defaultColor); } }
/// <summary> /// Catching LateUpdate calls since ExecuteInEditMode attribute. /// </summary> protected void LateUpdate() { // During play we're receiving callbacks from the wire // to OnPostStepForward. if (Application.isPlaying) { return; } // Let OnDrawGizmos handle rendering when in prefab edit mode. // It's not possible to use RuntimeObjects while there. if (PrefabUtils.IsPartOfEditingPrefab(gameObject)) { return; } if (Wire != null && Wire.Native == null) { RenderRoute(Wire.Route, Wire.Radius); } }
private void DrawGizmos(bool isSelected) { if (Application.isPlaying) { return; } if (Cable == null || Cable.Route == null || Cable.Route.NumNodes < 2) { return; } if (!PrefabUtils.IsPartOfEditingPrefab(gameObject)) { return; } var defaultColor = Color.Lerp(Color.black, Color.white, 0.15f); var selectedColor = Color.Lerp(defaultColor, Color.green, 0.15f); m_segmentSpawner?.DrawGizmos(Cable.GetRoutePoints(), Cable.Radius, isSelected ? selectedColor : defaultColor); }
private void Update() { OnTrackReset(); if (Tracks.Length == 0) { m_uninitializedTrackData.Clear(); return; } var containsNullEntries = m_uninitializedTrackData.FirstOrDefault(pair => pair.Key == null).Value != null; if (containsNullEntries) { m_uninitializedTrackData = m_uninitializedTrackData.Where(pair => pair.Key != null).ToDictionary(pair => pair.Key, pair => pair.Value); } var numNodes = 0; foreach (var track in Tracks) { track.RemoveInvalidWheels(); if (!track.isActiveAndEnabled) { continue; } if (track.Native != null) { numNodes += (int)track.Native.getNumNodes(); } else { if (!m_uninitializedTrackData.ContainsKey(track)) { m_uninitializedTrackData.Add(track, new UninitializedTrackData()); } var trackData = m_uninitializedTrackData[track]; trackData.Update(track); numNodes += trackData.TrackNodes.Length; } } // Avoid creating root in the prefab stage. We have to // do the rendering as gizmos. if (PrefabUtils.IsPartOfEditingPrefab(gameObject)) { return; } if (m_root == null) { m_root = RuntimeObjects.GetOrCreateRoot(this); } if (numNodes > m_root.transform.childCount) { var numToAdd = numNodes - m_root.transform.childCount; // If we're rendering several tracks it doesn't matter (I think) // which of them that receives the OnSelectionProxy. var refTrack = Tracks[0]; for (int i = 0; i < numToAdd; ++i) { var instance = Instantiate(Resource); Configure(refTrack, instance); m_root.AddChild(instance); } } else if (numNodes < m_root.transform.childCount) { var numToRemove = m_root.transform.childCount - numNodes; for (int i = 0; i < numToRemove; ++i) { DestroyImmediate(m_root.transform.GetChild(m_root.transform.childCount - 1).gameObject); } } var nodeCounter = 0; foreach (var track in Tracks) { if (!track.isActiveAndEnabled) { continue; } if (track.Native != null) { foreach (var node in track.Native.nodes()) { var renderInstance = m_root.transform.GetChild(nodeCounter++); renderInstance.rotation = node.getRigidBody().getRotation().ToHandedQuaternion(); renderInstance.position = node.getBeginPosition().ToHandedVector3() + renderInstance.TransformDirection(0.5f * (float)node.getLength() * Vector3.forward); if (AutomaticScaling) { renderInstance.localScale = 2.0f * node.getHalfExtents().ToVector3(); } else { renderInstance.localScale = new Vector3(1, 1, 1); } } } else { var nodes = m_uninitializedTrackData[track].TrackNodes; foreach (var node in nodes) { var renderInstance = m_root.transform.GetChild(nodeCounter++); renderInstance.rotation = node.Rotation; renderInstance.position = node.Position + renderInstance.TransformDirection(node.HalfExtents.z * Vector3.forward); if (AutomaticScaling) { renderInstance.localScale = 2.0f * node.HalfExtents; } else { renderInstance.localScale = Vector3.one; } } } } }