Exemple #1
0
        public void Render(Matrix4 view)
        {
            if (b == null) return;

            Matrix4 mat = b.transform;
            Vector3 center = Vector3.Transform(Vector3.Zero, mat);
            Vector3 point;

            hit = false;
            bool _hiX = false;
            bool _hiY = false;
            bool _hiZ = false;
            if (RenderTools.CheckSphereHit(center, 2, VBNViewport.p1, VBNViewport.p2, out point))
            {
                hit = true;

                VBNViewport.LineSphereIntersect(VBNViewport.p1, VBNViewport.p2, center, 2, out point);

                Vector3 angle = Angles(Vector3.Transform(point, b.invert)) * new Vector3(180f / (float)Math.PI);
                angle.X = Math.Abs(angle.X);
                angle.Y = Math.Abs(angle.Y);
                angle.Z = Math.Abs(angle.Z);
                //Console.WriteLine(angle.ToString());

                float _axisSnapRange = 7f;
                if (Math.Abs(angle.Y - 90.0f) <= _axisSnapRange)
                    _hiX = true;
                else if (angle.X >= (180.0f - _axisSnapRange) || angle.X <= _axisSnapRange)
                    _hiY = true;
                else if (angle.Y >= (180.0f - _axisSnapRange) || angle.Y <= _axisSnapRange)
                    _hiZ = true;
            }
        
            GL.PushMatrix();
            GL.MultMatrix(ref mat);
            
            GL.Color3(_hiX ? Color.Yellow : Color.Green);
            GL.LineWidth(2);
            RenderTools.drawCircleOutline(Vector3.Zero, 2, 25);

            GL.Rotate(90.0f, 0.0f, 1.0f, 0.0f);

            GL.Color3(_hiY ? Color.Yellow : Color.Red);
            RenderTools.drawCircleOutline(Vector3.Zero, 2, 25);

            GL.Rotate(90.0f, 1.0f, 0.0f, 0.0f);

            GL.Color3(_hiZ ? Color.Yellow : Color.Blue);
            RenderTools.drawCircleOutline(Vector3.Zero, 2, 25);
            
            GL.PopMatrix();
        }
        private void RenderRotationTool(Camera Camera, Ray Ray)
        {
            Matrix4 mat          = b.transform.ClearScale();
            Vector3 center       = Vector3.TransformPosition(Vector3.Zero, mat);
            Matrix4 invTrasnform = b.transform.ClearScale().Inverted();
            Vector3 point;

            if (state == 0)
            {
                hit = Ray.LineSphereIntersect(center, Size, out point);
                if (hit)
                {
                    Vector3 angle = Angles(Vector3.TransformPosition(point, invTrasnform)) * new Vector3(180f / (float)Math.PI);
                    angle.X = Math.Abs(angle.X);
                    angle.Y = Math.Abs(angle.Y);
                    angle.Z = Math.Abs(angle.Z);

                    _hiX = false;
                    _hiY = false;
                    _hiZ = false;
                    float _axisSnapRange = 14f;
                    if (Math.Abs(angle.Y - 90.0f) <= _axisSnapRange)
                    {
                        _hiX = true;
                    }
                    else if (angle.X >= (180.0f - _axisSnapRange) || angle.X <= _axisSnapRange)
                    {
                        _hiY = true;
                    }
                    else if (angle.Y >= (180.0f - _axisSnapRange) || angle.Y <= _axisSnapRange)
                    {
                        _hiZ = true;
                    }
                }
                if (!_hiX && !_hiZ && !_hiY)
                {
                    hit = false;
                }
            }

            if (state == 1)
            {
                float sx = (Ray.mouse_x - PrevPoint.X) / 100;
                float sy = (Ray.mouse_y - PrevPoint.Y) / 100;
                float s  = sx + sy;
                if (_hiX)
                {
                    b.rot = b.rot * Quaternion.FromAxisAngle(Vector3.UnitX, s);
                }
                if (_hiY)
                {
                    b.rot = b.rot * Quaternion.FromAxisAngle(Vector3.UnitY, s);
                }
                if (_hiZ)
                {
                    b.rot = b.rot * Quaternion.FromAxisAngle(Vector3.UnitZ, s);
                }
                b.vbnParent.update();
            }

            GL.PushMatrix();
            GL.MultMatrix(ref mat);

            GL.Color4(0.25f, 0.25f, 0.25f, 0.2f);
            RenderTools.drawSphere(Vector3.Zero, Size, 25);

            GL.Color3(_hiZ ? Color.Yellow : Color.Green);
            GL.LineWidth(3);
            RenderTools.drawCircleOutline(Vector3.Zero, Size, 25);

            GL.Rotate(90.0f, 0.0f, 1.0f, 0.0f);

            GL.Color3(_hiX ? Color.Yellow : Color.Red);
            RenderTools.drawCircleOutline(Vector3.Zero, Size, 25);

            GL.Rotate(90.0f, 1.0f, 0.0f, 0.0f);

            GL.Color3(_hiY ? Color.Yellow : Color.Blue);
            RenderTools.drawCircleOutline(Vector3.Zero, Size, 25);

            GL.PopMatrix();
        }
        public void Render(Matrix4 view)
        {
            if (b == null)
            {
                return;
            }

            Matrix4 mat      = b.transform;
            Vector3 center   = Vector3.Transform(Vector3.Zero, mat);
            Vector3 camPoint = Vector3.Transform(Vector3.Zero, view);

            Matrix4 rot    = mat;
            float   Radius = CamDistance(center, camPoint);// / 1 * (Runtime.fov / 45.0f) * 1.0f;



            Vector3 lineStart    = VBNViewport.p1;
            Vector3 lineEnd      = VBNViewport.p2;
            Vector3 normal       = new Vector3(0);
            Matrix4 invTrasnform = mat.Inverted();

            Vector3 point;

            Console.WriteLine(LineSphereIntersect(VBNViewport.p1, VBNViewport.p2, center, Radius, out point));
            float Distance = CamDistance(point, center);

            hit = false;
            bool _hiX = false;
            bool _hiY = false;
            bool _hiZ = false;

            Console.WriteLine(Distance + " " + Radius);
            if (Math.Abs(Distance - Radius) < (Radius * 3))
            {
                hit = true;


                Vector3 angle = Angles(Vector3.Transform(point, invTrasnform)) * new Vector3(180f / (float)Math.PI);
                angle.X = Math.Abs(angle.X);
                angle.Y = Math.Abs(angle.Y);
                angle.Z = Math.Abs(angle.Z);
                //Console.WriteLine(angle.ToString());

                float _axisSnapRange = 7f;
                if (Math.Abs(angle.Y - 90.0f) <= _axisSnapRange)
                {
                    _hiX = true;
                }
                else if (angle.X >= (180.0f - _axisSnapRange) || angle.X <= _axisSnapRange)
                {
                    _hiY = true;
                }
                else if (angle.Y >= (180.0f - _axisSnapRange) || angle.Y <= _axisSnapRange)
                {
                    _hiZ = true;
                }
            }

            GL.PushMatrix();
            GL.MultMatrix(ref mat);

            GL.Color3(_hiX ? Color.Yellow : Color.Green);
            GL.LineWidth(2);
            RenderTools.drawCircleOutline(Vector3.Zero, 2, 25);

            GL.Rotate(90.0f, 0.0f, 1.0f, 0.0f);

            GL.Color3(_hiY ? Color.Yellow : Color.Red);
            RenderTools.drawCircleOutline(Vector3.Zero, 2, 25);

            GL.Rotate(90.0f, 1.0f, 0.0f, 0.0f);

            GL.Color3(_hiZ ? Color.Yellow : Color.Blue);
            RenderTools.drawCircleOutline(Vector3.Zero, 2, 25);

            GL.PopMatrix();
        }