Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        /// <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);
            }
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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;
                        }
                    }
                }
            }
        }