예제 #1
0
            public void Build(Cone cone)
            {
                topCap    = cone.height * Vector3.up;
                bottomCap = Vector3.zero;

                if (extremities == null)
                {
                    extremities = new List <Vector3>(8);
                }
                extremities.Clear();

                extremities.Add(topCap + Vector3.forward * cone.radius1);
                extremities.Add(topCap - Vector3.forward * cone.radius1);

                extremities.Add(topCap + Vector3.left * cone.radius1);
                extremities.Add(topCap - Vector3.left * cone.radius1);

                extremities.Add(bottomCap + Vector3.forward * cone.radius0);
                extremities.Add(bottomCap - Vector3.forward * cone.radius0);

                extremities.Add(bottomCap + Vector3.left * cone.radius0);
                extremities.Add(bottomCap - Vector3.left * cone.radius0);

                visibleCount = 4;
            }
예제 #2
0
            public void Build(Cone cone, float degArc)
            {
                topCap    = cone.height * Vector3.up;
                bottomCap = Vector3.zero;
                int count = 4;

                visibleCount = Mathf.CeilToInt(degArc / 90);
                if (visibleCount <= 0)
                {
                    visibleCount = 1;
                }

                if (extremities == null)
                {
                    extremities = new List <Vector3>(8);
                }
                extremities.Clear();

                extremities.Add(topCap + Vector3.forward * cone.radius1);
                if (count > 1)
                {
                    extremities.Add(topCap - Vector3.left * cone.radius1);
                    if (count > 2)
                    {
                        extremities.Add(topCap - Vector3.forward * cone.radius1);
                        if (count > 3)
                        {
                            extremities.Add(topCap + Vector3.left * cone.radius1);
                        }
                    }
                }
                extremities.Add(bottomCap + Vector3.forward * cone.radius0);
                if (count > 1)
                {
                    extremities.Add(bottomCap - Vector3.left * cone.radius0);
                    if (count > 2)
                    {
                        extremities.Add(bottomCap - Vector3.forward * cone.radius0);
                        if (count > 3)
                        {
                            extremities.Add(bottomCap + Vector3.left * cone.radius0);
                        }
                    }
                }
            }
예제 #3
0
        public override void OnDrawSpacedGizmo(ArcCone arcCone)
        {
            float arc  = arcCone.arc * Mathf.Rad2Deg;
            Cone  cone = new Cone {
                center = arcCone.center, radius0 = arcCone.radius0, radius1 = arcCone.radius1, height = arcCone.height
            };

            extremities.Build(cone, arc);
            Vector3 arcDirection = Quaternion.AngleAxis(arc, Vector3.up) * Vector3.forward;

            if (Event.current != null && Event.current.type == EventType.MouseDown)
            {
                m_Dragging = true;
            }
            if (Event.current != null && Event.current.type == EventType.MouseUp)
            {
                m_Dragging = false;
            }

            if (!m_Dragging)
            {
                radius1Screen = (HandleUtility.WorldToGUIPoint(extremities.topCap) - HandleUtility.WorldToGUIPoint(extremities.topCap + Vector3.forward * cone.radius1)).magnitude;
                radius0Screen = (HandleUtility.WorldToGUIPoint(extremities.bottomCap) - HandleUtility.WorldToGUIPoint(extremities.bottomCap + Vector3.forward * cone.radius0)).magnitude;
            }

            using (new Handles.DrawingScope(Handles.matrix * Matrix4x4.Translate(arcCone.center)))
            {
                if (radius1Screen > 2)
                {
                    Handles.DrawWireArc(extremities.topCap, Vector3.up, Vector3.forward, arc, arcCone.radius1);
                }

                if (radius0Screen > 2)
                {
                    Handles.DrawWireArc(extremities.bottomCap, Vector3.up, Vector3.forward, arc, arcCone.radius0);
                }

                for (int i = 0; i < extremities.extremities.Count / 2 && i < extremities.visibleCount; ++i)
                {
                    Handles.DrawLine(extremities.extremities[i], extremities.extremities[i + extremities.extremities.Count / 2]);
                }

                Handles.DrawLine(extremities.topCap, extremities.extremities[0]);
                Handles.DrawLine(extremities.bottomCap, extremities.extremities[extremities.extremities.Count / 2]);


                Handles.DrawLine(extremities.topCap, extremities.topCap + arcDirection * arcCone.radius1);
                Handles.DrawLine(extremities.bottomCap, arcDirection * arcCone.radius0);

                Handles.DrawLine(arcDirection * arcCone.radius0, extremities.topCap + arcDirection * arcCone.radius1);
                float   radius = arcCone.radius0 > arcCone.radius1 ? arcCone.radius0 : arcCone.radius1;
                Vector3 center = arcCone.radius0 > arcCone.radius1 ? Vector3.zero : extremities.topCap;

                if (radius != 0)
                {
                    ArcGizmo(center, radius, arc, m_ArcProperty, Quaternion.identity, true);
                }
            }

            VFXConeGizmo.DrawCone(cone, this, ref extremities, m_CenterProperty, m_Radius0Property, m_Radius1Property, m_HeightProperty, radius0Screen, radius1Screen);
        }