Exemple #1
0
            public override void OnRender()
            {
                base.OnRender();

                if (!Owner.IsAllowRotate())
                {
                    return;
                }

                ColorValue yellow      = new ColorValue(1, 1, 0);
                ColorValue red         = new ColorValue(1, 0, 0);
                ColorValue green       = new ColorValue(0, 1, 0);
                ColorValue blue        = new ColorValue(0, 0, 1);
                ColorValue gray        = new ColorValue(.66f, .66f, .66f);
                ColorValue darkGray    = new ColorValue(.33f, .33f, .33f);
                ColorValue shadowColor = new ColorValue(0, 0, 0, ProjectSettings.Get.TransformToolShadowIntensity);

                Axis axis = Axis.None;

                if (!Viewport.MouseRelativeMode)
                {
                    if (!modify_Activated)
                    {
                        Vector2 dummy1;
                        Radian  dummy2;
                        axis = GetAxisByMousePosition(out dummy1, out dummy2);
                    }
                    else
                    {
                        axis = selectedAxis;
                    }
                }

                Vector3 position;

                if (!modify_Activated)
                {
                    position = Owner.GetPosition();
                }
                else
                {
                    position = modifyPosition;
                }
                double lineThickness = GetLineWorldThickness(position);
                double radius        = GetSize();

                if (radius == 0)
                {
                    return;
                }

                //DebugGeometry.SetSpecialDepthSettings( false, true );

                const double step = MathEx.PI / 64;

                double     innerRadius    = radius * .75f;
                double     cameraDistance = GetCameraDistance(position);
                Vector3    cameraRight    = Vector3.Cross(CameraSettings.Direction, CameraSettings.Up);
                Vector3    oldPos         = Vector3.Zero;
                Quaternion startRotation  = GetStartObjectsRotation();

                for (int nDrawStep = 0; nDrawStep < 5; nDrawStep++)
                {
                    bool drawShadows = nDrawStep <= 3;
                    if (drawShadows && ProjectSettings.Get.TransformToolShadowIntensity == 0)
                    {
                        continue;
                    }

                    var drawShadowsFactor = 0.0;
                    if (drawShadows)
                    {
                        drawShadowsFactor = ((double)nDrawStep + 1.0) / 4.0;
                    }

                    if (drawShadows)
                    {
                        DebugGeometry.SetColor(shadowColor * new ColorValue(1, 1, 1, 0.25), false);                            //, true );
                    }
                    //Fill inner circle
                    if (axis == Axis.InnerCircle && !drawShadows)
                    {
                        if (!drawShadows)
                        {
                            DebugGeometry.SetColor(new ColorValue(1, 1, 0, .4f), false);                                //, true );
                        }
                        //DebugGeometry.Color = new ColorValue( .2f, .2f, .2f, .33f );

                        List <Vector3> vertices = new List <Vector3>();

                        for (double angle = 0; angle <= MathEx.PI * 2 + step * .5f; angle += step)
                        {
                            Vector3 pos = position;
                            pos += cameraRight * Math.Cos(angle) * innerRadius;
                            pos += CameraSettings.Up * Math.Sin(angle) * innerRadius;

                            if (angle != 0)
                            {
                                int verticesCount = vertices.Count;

                                vertices.Add(position);
                                vertices.Add(oldPos);
                                vertices.Add(pos);
                            }
                            oldPos = pos;
                        }

                        DebugGeometry.AddTriangles(vertices, Matrix4.Identity, false, false);
                    }

                    //!!!!тут?
                    //render axes of objects
                    if (!drawShadows && Owner.Objects.Count <= 30)
                    {
                        foreach (TransformToolObject gizmoObject in Owner.Objects)
                        {
                            var    size      = radius / 3;
                            double alpha     = 1;                        // 0.333;
                            double thickness = GetLineWorldThickness(gizmoObject.Position);

                            Matrix4 transform = new Matrix4(gizmoObject.Rotation.ToMatrix3() * Matrix3.FromScale(new Vector3(size, size, size)), gizmoObject.Position);

                            var headHeight = size / 4;
                            DebugGeometry.SetColor(new ColorValue(1, 0, 0, alpha), false);                                //, true );
                            DebugGeometry.AddArrow(transform * Vector3.Zero, transform * Vector3.XAxis, headHeight, 0, true, thickness);
                            DebugGeometry.SetColor(new ColorValue(0, 1, 0, alpha), false);                                //, true );
                            DebugGeometry.AddArrow(transform * Vector3.Zero, transform * Vector3.YAxis, headHeight, 0, true, thickness);
                            DebugGeometry.SetColor(new ColorValue(0, 0, 1, alpha), false);                                //, true );
                            DebugGeometry.AddArrow(transform * Vector3.Zero, transform * Vector3.ZAxis, headHeight, 0, true, thickness);
                        }
                    }

                    //Inner circle
                    {
                        List <Vector3> points = new List <Vector3>(64);
                        for (double angle = 0; angle <= MathEx.PI * 2 + step * .5f; angle += step)
                        {
                            Vector3 pos = position;
                            pos += cameraRight * Math.Cos(angle) * innerRadius;
                            pos += CameraSettings.Up * Math.Sin(angle) * innerRadius;
                            points.Add(pos);
                        }
                        if (!drawShadows)
                        {
                            DebugGeometry.SetColor(darkGray, false);                              //, true );
                        }
                        AddPolygonalChain(points.ToArray(), lineThickness, drawShadowsFactor);
                    }
                    //if( !drawShadows )
                    //   DebugGeometry.Color = darkGray;
                    //for( double angle = 0; angle <= MathEx.PI * 2 + step * .5f; angle += step )
                    //{
                    //   Vec3 pos = position;
                    //   pos += cameraRight * Math.Cos( angle ) * innerRadius;
                    //   pos += camera.Up * Math.Sin( angle ) * innerRadius;
                    //   if( angle != 0 )
                    //      AddLine( oldPos, pos, lineThickness, drawShadows );
                    //   oldPos = pos;
                    //}

                    //Radius
                    if (!Owner.SceneMode2D)
                    {
                        List <Vector3> points = new List <Vector3>(64);
                        for (double angle = 0; angle <= MathEx.PI * 2 + step * .5f; angle += step)
                        {
                            Vector3 pos = position;
                            pos += cameraRight * Math.Cos(angle) * radius;
                            pos += CameraSettings.Up * Math.Sin(angle) * radius;
                            points.Add(pos);
                        }
                        if (!drawShadows)
                        {
                            DebugGeometry.SetColor((axis == Axis.Radius) ? yellow : gray, false);                                //, true );
                        }
                        AddPolygonalChain(points.ToArray(), lineThickness, drawShadowsFactor);
                    }
                    //if( !drawShadows )
                    //   DebugGeometry.Color = ( axis == Axis.Radius ) ? yellow : gray;
                    //for( double angle = 0; angle <= MathEx.PI * 2 + step * .5f; angle += step )
                    //{
                    //   Vec3 pos = position;
                    //   pos += cameraRight * Math.Cos( angle ) * radius;
                    //   pos += camera.Up * Math.Sin( angle ) * radius;
                    //   if( angle != 0 )
                    //      AddLine( oldPos, pos, lineThickness, drawShadows );
                    //   oldPos = pos;
                    //}

                    //X
                    {
                        List <Vector3> points    = new List <Vector3>(64);
                        List <bool>    skipLines = new List <bool>(64);
                        for (double angle = 0; angle <= MathEx.PI * 2 + step * .5f; angle += step)
                        {
                            Vector3 pos = position + startRotation * (new Vector3(0, Math.Sin(angle),
                                                                                  Math.Cos(angle)) * innerRadius);
                            points.Add(pos);
                            bool skip = GetCameraDistance(pos) > cameraDistance;
                            skipLines.Add(skip);
                            //if( angle != 0 && GetCameraDistance( pos ) <= cameraDistance )
                            //   points.Add( pos );
                        }
                        if (!drawShadows)
                        {
                            DebugGeometry.SetColor((axis == Axis.X) ? yellow : red, false);                                //, true );
                        }
                        List <Vector3> newPoints = new List <Vector3>(64);
                        for (int n = 0; n < points.Count; n++)
                        {
                            if (!skipLines[n])
                            {
                                newPoints.Add(points[n]);
                            }
                            else
                            {
                                if (newPoints.Count != 0)
                                {
                                    AddPolygonalChain(newPoints.ToArray(), lineThickness, drawShadowsFactor);
                                    newPoints.Clear();
                                }
                            }
                        }
                        if (newPoints.Count != 0)
                        {
                            AddPolygonalChain(newPoints.ToArray(), lineThickness, drawShadowsFactor);
                            newPoints.Clear();
                        }
                    }
                    //for( double angle = 0; angle <= MathEx.PI * 2 + step * .5f; angle += step )
                    //{
                    //   Vec3 pos = position + startRotation * ( new Vec3( 0, Math.Sin( angle ),
                    //      Math.Cos( angle ) ) * innerRadius );
                    //   if( angle != 0 && GetCameraDistance( pos ) <= cameraDistance )
                    //      AddLine( oldPos, pos, lineThickness, drawShadows );
                    //   oldPos = pos;
                    //}

                    //Y
                    {
                        List <Vector3> points    = new List <Vector3>(64);
                        List <bool>    skipLines = new List <bool>(64);
                        for (double angle = 0; angle <= MathEx.PI * 2 + step * .5f; angle += step)
                        {
                            Vector3 pos = position + startRotation * (new Vector3(Math.Sin(angle), 0,
                                                                                  Math.Cos(angle)) * innerRadius);
                            points.Add(pos);
                            bool skip = GetCameraDistance(pos) > cameraDistance;
                            skipLines.Add(skip);
                            //if( angle != 0 && GetCameraDistance( pos ) <= cameraDistance )
                            //   points.Add( pos );
                        }
                        if (!drawShadows)
                        {
                            DebugGeometry.SetColor((axis == Axis.Y) ? yellow : green, false);                                //, true );
                        }
                        List <Vector3> newPoints = new List <Vector3>(64);
                        for (int n = 0; n < points.Count; n++)
                        {
                            if (!skipLines[n])
                            {
                                newPoints.Add(points[n]);
                            }
                            else
                            {
                                if (newPoints.Count != 0)
                                {
                                    AddPolygonalChain(newPoints.ToArray(), lineThickness, drawShadowsFactor);
                                    newPoints.Clear();
                                }
                            }
                        }
                        if (newPoints.Count != 0)
                        {
                            AddPolygonalChain(newPoints.ToArray(), lineThickness, drawShadowsFactor);
                            newPoints.Clear();
                        }
                    }
                    //if( !drawShadows )
                    //   DebugGeometry.Color = ( axis == Axis.Y ) ? yellow : green;
                    //for( double angle = 0; angle <= MathEx.PI * 2 + step * .5f; angle += step )
                    //{
                    //   Vec3 pos = position + startRotation * ( new Vec3( Math.Sin( angle ), 0,
                    //      Math.Cos( angle ) ) * innerRadius );
                    //   if( angle != 0 && GetCameraDistance( pos ) <= cameraDistance )
                    //      AddLine( oldPos, pos, lineThickness, drawShadows );
                    //   oldPos = pos;
                    //}

                    //Z
                    {
                        List <Vector3> points    = new List <Vector3>(64);
                        List <bool>    skipLines = new List <bool>(64);
                        for (double angle = 0; angle <= MathEx.PI * 2 + step * .5f; angle += step)
                        {
                            Vector3 pos = position + startRotation * (new Vector3(Math.Sin(angle),
                                                                                  Math.Cos(angle), 0) * innerRadius);
                            points.Add(pos);
                            bool skip = GetCameraDistance(pos) > cameraDistance;
                            if (Owner.SceneMode2D)
                            {
                                skip = false;
                            }
                            skipLines.Add(skip);
                            //if( angle != 0 && GetCameraDistance( pos ) <= cameraDistance )
                            //   points.Add( pos );
                        }
                        if (!drawShadows)
                        {
                            DebugGeometry.SetColor((axis == Axis.Z) ? yellow : blue, false);                                //, true );
                        }
                        List <Vector3> newPoints = new List <Vector3>(64);
                        for (int n = 0; n < points.Count; n++)
                        {
                            if (!skipLines[n])
                            {
                                newPoints.Add(points[n]);
                            }
                            else
                            {
                                if (newPoints.Count != 0)
                                {
                                    AddPolygonalChain(newPoints.ToArray(), lineThickness, drawShadowsFactor);
                                    newPoints.Clear();
                                }
                            }
                        }
                        if (newPoints.Count != 0)
                        {
                            AddPolygonalChain(newPoints.ToArray(), lineThickness, drawShadowsFactor);
                            newPoints.Clear();
                        }
                    }
                    //if( !drawShadows )
                    //   DebugGeometry.Color = ( axis == Axis.Z ) ? yellow : blue;
                    //for( double angle = 0; angle <= MathEx.PI * 2 + step * .5f; angle += step )
                    //{
                    //   Vec3 pos = position + startRotation * ( new Vec3( Math.Sin( angle ),
                    //      Math.Cos( angle ), 0 ) * innerRadius );
                    //   if( angle != 0 && GetCameraDistance( pos ) <= cameraDistance )
                    //      AddLine( oldPos, pos, lineThickness, drawShadows );
                    //   oldPos = pos;
                    //}

                    //Arrows
                    if (axis != Axis.None && axis != Axis.InnerCircle)
                    {
                        Plane plane = new Plane();
                        switch (axis)
                        {
                        case Axis.X: plane = Plane.FromPointAndNormal(position, GetStartObjectsRotation() * Vector3.XAxis); break;

                        case Axis.Y: plane = Plane.FromPointAndNormal(position, GetStartObjectsRotation() * Vector3.YAxis); break;

                        case Axis.Z: plane = Plane.FromPointAndNormal(position, GetStartObjectsRotation() * Vector3.ZAxis); break;

                        case Axis.Radius: plane = Plane.FromPointAndNormal(position, CameraSettings.Direction); break;
                        }

                        Vector2 mouse;
                        if (modify_Activated || initialObjectsTransform != null)
                        {
                            mouse = mouseStartPosition;
                        }
                        else
                        {
                            mouse = Viewport.MousePosition;
                        }
                        Ray ray = CameraSettings.GetRayByScreenCoordinates(mouse);

                        Vector3 planeIntersection;
                        if (plane.Intersects(ray, out planeIntersection))
                        {
                            Vector3 direction = (planeIntersection - position).GetNormalize();
                            Vector3 arrowCenter;
                            if (axis == Axis.Radius)
                            {
                                arrowCenter = position + direction * radius;
                            }
                            else
                            {
                                arrowCenter = position + direction * innerRadius;
                            }

                            double arrowLength = radius * .3f;

                            Vector3 tangent        = Vector3.Cross(direction, plane.Normal);
                            Vector3 arrowPosition1 = arrowCenter + tangent * arrowLength;
                            Vector3 arrowPosition2 = arrowCenter - tangent * arrowLength;

                            if (!drawShadows)
                            {
                                DebugGeometry.SetColor(yellow, false);                                  //, true );
                            }
                            {
                                Vector3 direction1 = (arrowPosition1 - arrowCenter).GetNormalize();
                                AddCone(
                                    arrowCenter + direction1 * arrowLength / 2,
                                    arrowPosition1,
                                    arrowLength / 8, lineThickness, drawShadowsFactor);
                            }
                            {
                                Vector3 direction2 = (arrowPosition2 - arrowCenter).GetNormalize();
                                AddCone(
                                    arrowCenter + direction2 * arrowLength / 2,
                                    arrowPosition2,
                                    arrowLength / 8, lineThickness, drawShadowsFactor);
                            }
                        }
                    }
                }

                //DebugGeometry.RestoreDefaultDepthSettings();
            }
Exemple #2
0
            public override void OnRender()
            {
                base.OnRender();

                if (!Owner.IsAllowScale())
                {
                    return;
                }

                ColorValue yellow      = new ColorValue(1, 1, 0);
                ColorValue red         = new ColorValue(1, 0, 0);
                ColorValue green       = new ColorValue(0, 1, 0);
                ColorValue blue        = new ColorValue(0, 0, 1);
                ColorValue shadowColor = new ColorValue(0, 0, 0, ProjectSettings.Get.TransformToolShadowIntensity);

                Axes axes = new Axes(false, false, false);

                if (!Viewport.MouseRelativeMode)
                {
                    if (!modify_Activated)
                    {
                        axes = GetAxesByMousePosition();
                    }
                    else
                    {
                        axes = selectedAxes;
                    }
                }

                Vector3 position      = Owner.GetPosition();
                double  lineThickness = GetLineWorldThickness(position);
                double  size          = GetSize();

                if (size == 0)
                {
                    return;
                }

                //!!!!review. גוחהו ג ‎עמל פאיכו
                //DebugGeometry.SetSpecialDepthSettings( false, true );

                Vector3 xOffset, yOffset, zOffset;

                GetAxisOffsets(out xOffset, out yOffset, out zOffset);

                //Arrows
                for (int nDrawStep = 0; nDrawStep < 5; nDrawStep++)
                {
                    bool drawShadows = nDrawStep <= 3;
                    if (drawShadows && ProjectSettings.Get.TransformToolShadowIntensity == 0)
                    {
                        continue;
                    }

                    var drawShadowsFactor = 0.0;
                    if (drawShadows)
                    {
                        drawShadowsFactor = ((double)nDrawStep + 1.0) / 4.0;
                    }

                    if (drawShadows)
                    {
                        DebugGeometry.SetColor(shadowColor * new ColorValue(1, 1, 1, 0.25), false);                            //, true );
                    }
                    //X
                    if (!drawShadows)
                    {
                        DebugGeometry.SetColor((axes.x && axes.TrueCount != 3) ? yellow : red, false);                            //, true );
                    }
                    AddLine(position, position + xOffset, lineThickness, drawShadowsFactor);
                    AddSphere(new Sphere(position + xOffset, size / 80), lineThickness, drawShadowsFactor);
                    AddSphere(new Sphere(position + xOffset, size / 40), lineThickness, drawShadowsFactor);

                    if (!drawShadows)
                    {
                        DebugGeometry.SetColor(axes.x && axes.y ? yellow : red, false);                          //, true );
                    }
                    AddLine(position + xOffset * .7f, position + (xOffset * .7f + yOffset * .7f) / 2,
                            lineThickness, drawShadowsFactor);
                    AddLine(position + xOffset * .5f, position + (xOffset * .5f + yOffset * .5f) / 2,
                            lineThickness, drawShadowsFactor);
                    if (!drawShadows)
                    {
                        DebugGeometry.SetColor(axes.x && axes.z ? yellow : red, false);                          //, true );
                    }
                    AddLine(position + xOffset * .7f, position + (xOffset * .7f + zOffset * .7f) / 2,
                            lineThickness, drawShadowsFactor);
                    AddLine(position + xOffset * .5f, position + (xOffset * .5f + zOffset * .5f) / 2,
                            lineThickness, drawShadowsFactor);

                    //Y
                    if (!drawShadows)
                    {
                        DebugGeometry.SetColor((axes.y && axes.TrueCount != 3) ? yellow : green, false);                            //, true );
                    }
                    AddLine(position, position + yOffset,
                            lineThickness, drawShadowsFactor);
                    AddSphere(new Sphere(position + yOffset, size / 80), lineThickness, drawShadowsFactor);
                    AddSphere(new Sphere(position + yOffset, size / 40), lineThickness, drawShadowsFactor);

                    if (!drawShadows)
                    {
                        DebugGeometry.SetColor(axes.y && axes.x ? yellow : green, false);                          //, true );
                    }
                    AddLine(position + yOffset * .7f, position + (yOffset * .7f + xOffset * .7f) / 2,
                            lineThickness, drawShadowsFactor);
                    AddLine(position + yOffset * .5f, position + (yOffset * .5f + xOffset * .5f) / 2,
                            lineThickness, drawShadowsFactor);
                    if (!drawShadows)
                    {
                        DebugGeometry.SetColor(axes.y && axes.z ? yellow : green, false);                          //, true );
                    }
                    AddLine(position + yOffset * .7f, position + (yOffset * .7f + zOffset * .7f) / 2,
                            lineThickness, drawShadowsFactor);
                    AddLine(position + yOffset * .5f, position + (yOffset * .5f + zOffset * .5f) / 2,
                            lineThickness, drawShadowsFactor);

                    //Z
                    if (!drawShadows)
                    {
                        DebugGeometry.SetColor((axes.z && axes.TrueCount != 3) ? yellow : blue, false);                            //, true );
                    }
                    AddLine(position, position + zOffset,
                            lineThickness, drawShadowsFactor);
                    AddSphere(new Sphere(position + zOffset, size / 80), lineThickness, drawShadowsFactor);
                    AddSphere(new Sphere(position + zOffset, size / 40), lineThickness, drawShadowsFactor);

                    if (!drawShadows)
                    {
                        DebugGeometry.SetColor(axes.z && axes.x ? yellow : blue, false);                          //, true );
                    }
                    AddLine(position + zOffset * .7f, position + (zOffset * .7f + xOffset * .7f) / 2,
                            lineThickness, drawShadowsFactor);
                    AddLine(position + zOffset * .5f, position + (zOffset * .5f + xOffset * .5f) / 2,
                            lineThickness, drawShadowsFactor);
                    if (!drawShadows)
                    {
                        DebugGeometry.SetColor(axes.z && axes.y ? yellow : blue, false);                          //, true );
                    }
                    AddLine(position + zOffset * .7f, position + (zOffset * .7f + yOffset * .7f) / 2,
                            lineThickness, drawShadowsFactor);
                    AddLine(position + zOffset * .5f, position + (zOffset * .5f + yOffset * .5f) / 2,
                            lineThickness, drawShadowsFactor);
                }

                //Selected area
                if (axes.TrueCount >= 2)
                {
                    DebugGeometry.SetColor(new ColorValue(1, 1, 0, .4f), false);                        //, true );

                    List <Vector3> vertices = new List <Vector3>();
                    List <int>     indices  = new List <int>();

                    if (axes.TrueCount == 3)
                    {
                        vertices.Add(position + xOffset * .5f);
                        vertices.Add(position + yOffset * .5f);
                        vertices.Add(position + zOffset * .5f);

                        indices.Add(0); indices.Add(1); indices.Add(2);
                    }
                    else
                    {
                        Vector3 offset1;
                        Vector3 offset2;

                        if (axes.x)
                        {
                            offset1 = xOffset;
                            offset2 = axes.y ? yOffset : zOffset;
                        }
                        else
                        {
                            offset1 = yOffset;
                            offset2 = zOffset;
                        }

                        vertices.Add(position + offset1 * .5f);
                        vertices.Add(position + offset1 * .7f);
                        vertices.Add(position + offset2 * .7f);
                        vertices.Add(position + offset2 * .5f);

                        indices.Add(0); indices.Add(1); indices.Add(2);
                        indices.Add(2); indices.Add(3); indices.Add(0);
                    }

                    DebugGeometry.AddTriangles(vertices, indices, Matrix4.Identity, false, false);
                }

                //DebugGeometry.RestoreDefaultDepthSettings();
            }