void RenderResults(RenderMode renderMode, MatrixTransforms transforms, CameraEntity currentCamera)
        {
            _timeAttenuationHandle.SetValue(new xna.Vector4(100 * (float)Math.Cos(_appTime * (1.0f / SCAN_INTERVAL)), 0, 0, 1));

            // render impact points as a quad
            xna.Matrix inverseViewRotation = currentCamera.ViewMatrix;
            inverseViewRotation.M41 = inverseViewRotation.M42 = inverseViewRotation.M43 = 0;
            xna.Matrix.Invert(ref inverseViewRotation, out inverseViewRotation);
            xna.Matrix localTransform = xna.Matrix.CreateFromAxisAngle(new xna.Vector3(1, 0, 0), (float)-Math.PI / 2) * inverseViewRotation;

            SimulationEngine.GlobalInstance.Device.RenderState.DepthBufferWriteEnable = false;
            for (int i = 0; i < _lastResults.ImpactPoints.Count; i++)
            {
                xna.Vector3 pos = new xna.Vector3(_lastResults.ImpactPoints[i].Position.X,
                                                  _lastResults.ImpactPoints[i].Position.Y,
                                                  _lastResults.ImpactPoints[i].Position.Z);

                xna.Vector3 resultDir = pos - Position;
                resultDir.Normalize();

                localTransform.Translation = pos - .02f * resultDir;
                transforms.World           = localTransform;

                base.Render(renderMode, transforms, Meshes[0]);
            }
            SimulationEngine.GlobalInstance.Device.RenderState.DepthBufferWriteEnable = true;
        }
Exemplo n.º 2
0
        /// <summary>Rotates the camera around the specified <paramref name="axis"/> vector by <paramref name="angle"/> degrees.</summary>
        /// <param name="angle">The angle to rotate by.</param>
        /// <param name="axis">The axis to rotate around.</param>
        public void Rotate(double angle, Vec4D axis)
        {
            Mat4x4D rotMat = MatrixTransforms.Rotate(angle, axis);

            position = rotMat * position;
            look     = rotMat * look;
            up       = rotMat * up;
        }
        /// <summary>
        /// Renders 4x4 body and all of its four wheels
        /// </summary>
        /// <param name="renderMode"></param>
        /// <param name="transforms"></param>
        /// <param name="currentCamera"></param>
        public override void Render(RenderMode renderMode, MatrixTransforms transforms, CameraEntity currentCamera)
        {
            _leftFrontWheel.Render(renderMode, transforms, currentCamera);
            _rightFrontWheel.Render(renderMode, transforms, currentCamera);
            _leftRearWheel.Render(renderMode, transforms, currentCamera);
            _rightRearWheel.Render(renderMode, transforms, currentCamera);

            base.Render(renderMode, transforms, currentCamera);
        }
        /// <summary>
        /// The render method is called every frame and updates the propellers
        /// </summary>
        /// <param name="renderMode"></param>
        /// <param name="transforms"></param>
        /// <param name="currentCamera"></param>
        public override void Render(VisualEntity.RenderMode renderMode, MatrixTransforms transforms, CameraEntity currentCamera)
        {
            // Render the propeller updates
            foreach (PropellerEntity propellerEntity in propellerEntities)
            {
                propellerEntity.Render(renderMode, transforms, currentCamera);
            }

            // Render this entity
            base.Render(renderMode, transforms, currentCamera);
        }
        /// <summary>
        /// Frame render
        /// </summary>
        public override void Render(RenderMode renderMode, MatrixTransforms transforms, CameraEntity currentCamera)
        {
            if ((int)(Flags & VisualEntityProperties.DisableRendering) > 0)
            {
                return;
            }

            if (_lastResults != null)
            {
                RenderResults(renderMode, transforms, currentCamera);
            }
        }
Exemplo n.º 6
0
        public override void Update()
        {
            base.Update();

            sun.orbitCenter += new Vector2(1, 0);

            float scaleChange = 0.01f *
                                ((Input.Keyboard.IsDown(Keys.A) ? 1.0f : 0.0f) + (Input.Keyboard.IsDown(Keys.S) ? -1.0f : 0.0f));

            float rotationChange = 0.01f *
                                   ((Input.Keyboard.IsDown(Keys.Q) ? 1.0f : 0.0f) + (Input.Keyboard.IsDown(Keys.W) ? -1.0f : 0.0f));

            Vector2 changePosition = Vector2.Zero;

            changePosition.X += Input.Keyboard.IsDown(Keys.Right) ? 1 : 0;
            changePosition.X += Input.Keyboard.IsDown(Keys.Left) ? -1 : 0;
            changePosition.Y += Input.Keyboard.IsDown(Keys.Up) ? -1 : 0;
            changePosition.Y += Input.Keyboard.IsDown(Keys.Down) ? 1 : 0;

            changePosition *= 5;

            if (scaleChange != 0 || rotationChange != 0 || changePosition != Vector2.Zero)
            {
                scale      += scaleChange;
                rotation   += rotationChange;
                translate  += changePosition;
                Core.Camera = Matrix.Identity
                              * MatrixTransforms.TransformMatrix(-sun.GlobalPosition.X, -sun.GlobalPosition.Y)
                              * MatrixTransforms.ScaleMatrix(scale)
                              * MatrixTransforms.RotationMatrix(rotation)
                              * MatrixTransforms.TransformMatrix(sun.GlobalPosition.X, sun.GlobalPosition.Y)
                              //* MatrixTransforms.TransformMatrix(-Core.Width / 2, -Core.Height / 2)
                              //* MatrixTransforms.RotationMatrix(rotation)
                              //* MatrixTransforms.TransformMatrix(Core.Width / 2, Core.Height / 2)
                              * MatrixTransforms.TransformMatrix(-translate.X, -translate.Y)
                ;
            }
        }
        void RenderResults(RenderMode renderMode, MatrixTransforms transforms, CameraEntity currentCamera)
        {
            _timeAttenuationHandle.SetValue(new xna.Vector4(100 * (float)Math.Cos(_appTime * (1.0f / SCAN_INTERVAL)), 0, 0, 1));

            // render impact points as a quad
            xna.Matrix inverseViewRotation = currentCamera.ViewMatrix;
            inverseViewRotation.M41 = inverseViewRotation.M42 = inverseViewRotation.M43 = 0;
            xna.Matrix.Invert(ref inverseViewRotation, out inverseViewRotation);
            xna.Matrix localTransform = xna.Matrix.CreateFromAxisAngle(new xna.Vector3(1, 0, 0), (float)-Math.PI / 2) * inverseViewRotation;

            SimulationEngine.GlobalInstance.Device.RenderState.DepthBufferWriteEnable = false;
            for (int i = 0; i < _lastResults.ImpactPoints.Count; i++)
            {
                xna.Vector3 pos = new xna.Vector3(_lastResults.ImpactPoints[i].Position.X,
                    _lastResults.ImpactPoints[i].Position.Y,
                    _lastResults.ImpactPoints[i].Position.Z);

                xna.Vector3 resultDir = pos - Position;
                resultDir.Normalize();

                localTransform.Translation = pos - .02f * resultDir;
                transforms.World = localTransform;

                base.Render(renderMode, transforms, Meshes[0]);
            }
            SimulationEngine.GlobalInstance.Device.RenderState.DepthBufferWriteEnable = true;
        }
        /// <summary>
        /// Frame render
        /// </summary>
        public override void Render(RenderMode renderMode, MatrixTransforms transforms, CameraEntity currentCamera)
        {
            if ((int)(Flags & VisualEntityProperties.DisableRendering) > 0)
                return;

            if (_lastResults != null)
                RenderResults(renderMode, transforms, currentCamera);
        }
 /// <summary>
 /// The render method gets called every frame iteration to render the new frame
 /// </summary>
 /// <param name="renderMode">The current render mode</param>
 /// <param name="transforms">The matrix transformations to be applied</param>
 /// <param name="currentCamera">The curren camera</param>
 public override void Render(VisualEntity.RenderMode renderMode, MatrixTransforms transforms, CameraEntity currentCamera)
 {
     // Render the propeller shape
     RenderShape(renderMode, transforms, propellerShapeProperties, Meshes[0]);
 }
Exemplo n.º 10
0
        public static Scene FromFile(string filename)
        {
            StreamReader reader = null;

            try
            {
                reader = new StreamReader(filename);
                Scene outScene = new Scene();

                // Camera state
                Camera addCam      = null;
                double imagePlane  = 0;
                double dofAmount   = 0;
                double focalLength = 0;
                Vec4D  focalPoint  = Vec4D.Zero;

                // Primitive state
                IObject obj = null;

                List <Primitive> prims           = new List <Primitive>();
                bool             twoSided        = true;
                bool             invert          = false;
                DoubleColor      emission        = DoubleColor.Placeholder;
                DoubleColor      diffuse         = DoubleColor.Placeholder;
                DoubleColor      specular        = DoubleColor.Placeholder;
                double           shininess       = -1;
                DoubleColor      refraction      = DoubleColor.Placeholder;
                double           refractionIndex = -1;

                stack    = new MatrixStack();                   // Transform stack
                invStack = new MatrixStack();                   // Inverse transforms

                List <Vec4D>  vertices        = new List <Vec4D>();
                List <Vertex> verticesNormals = new List <Vertex>();

                int lineNum = 1;

                while (!reader.EndOfStream)
                {
                    string line        = reader.ReadLine();
                    var    lineMatched = lineRegex.Match(line);

                    if (!lineMatched.Success)
                    {
                        throw new Exception("Line did not match expected format.");
                    }

                    // Line is blank
                    if (lineMatched.Groups[1].Captures.Count > 0)
                    {
                        // Grab the command name from the first capture group.
                        string cmd = lineMatched.Groups[1].Value.ToLowerInvariant();

                        // Pull all the parameters from the matched groups after the command name.
                        paramEnum = lineMatched.Groups.Values.Skip(2).SelectMany((g) => g.Captures).Select((c) => c.Value).GetEnumerator();

#if !DEBUG
                        try
#endif
                        {
                            Vec4D pos;

                            switch (cmd)
                            {
                            case "size":
                                outScene.Width  = NextInt();
                                outScene.Height = NextInt();
                                break;

                            case "background":
                                outScene.BackgroundRGB   = NextRGB();
                                outScene.BackgroundAlpha = NextDbl();
                                break;

                            case "ambient":
                                outScene.AmbientRGB = Next() switch
                                {
                                    "miss" => DoubleColor.Placeholder,
                                    "color" => NextRGB(),
                                    _ => throw new Exception($"Unknown ambient type {paramEnum.Current}."),
                                };
                                break;

                            case "recursion":
                            case "bounce":
                                outScene.Recursion = NextInt();
                                break;

                            case "debug":
                                outScene.DebugGeom = Next() switch
                                {
                                    "geom" => true,
                                    "off" => false,
                                    _ => throw new Exception($"Unknown debug type {paramEnum.Current}."),
                                };
                                break;

                            // Cameras:
                            case "dof":
                                imagePlane = NextDbl();
                                dofAmount  = NextDbl();

                                switch (Next())
                                {
                                case "at":
                                    focalPoint  = NextVecTransf();
                                    focalLength = 0;
                                    break;

                                case "to":
                                    focalLength = NextDbl();
                                    focalPoint  = Vec4D.Zero;
                                    break;

                                case "camera":
                                    focalLength = 0;
                                    focalPoint  = Vec4D.Zero;
                                    break;

                                default:
                                    throw new Exception($"Unknown dof focal command {paramEnum.Current}.");
                                }

                                break;

                            case "camera":
                            case "frustum":
                            case "orthographic":
                                pos = NextVec(1);
                                Vec4D lookAt = NextVec(1);
                                Vec4D up     = Transf(NextVec(0) + pos);
                                pos = Transf(pos);
                                up -= pos;

                                if (cmd == "orthographic")
                                {
                                    addCam = new OrthoCamera(pos, lookAt, up, NextDbl());
                                }
                                else
                                {
                                    addCam = new FrustumCamera(pos, lookAt, up, NextDbl());
                                }
                                break;

                            // Materials:
                            case "twosided":
                                twoSided = NextBool();
                                break;

                            case "invert":
                                invert = NextBool();
                                break;

                            case "emission":
                                emission = NextRGB();
                                break;

                            case "diffuse":
                                diffuse = NextRGB();
                                break;

                            case "specular":
                                specular = NextRGB();
                                break;

                            case "shininess":
                                shininess = NextDbl();
                                if (paramEnum.MoveNext())
                                {
                                    shininess = Math.Pow(shininess, ParseDbl(paramEnum.Current));
                                }
                                break;

                            case "refraction":
                                if (Next() == "off")
                                {
                                    refraction      = DoubleColor.Placeholder;
                                    refractionIndex = -1;
                                }
                                else
                                {
                                    refraction      = new DoubleColor(ParseDbl(paramEnum.Current), NextDbl(), NextDbl());
                                    refractionIndex = NextDbl();
                                }
                                break;

                            // Transforms:
                            case "translate":
                                Vec4D tVec = NextVec(0);
                                stack.Transform(MatrixTransforms.Translate(tVec.X, tVec.Y, tVec.Z));
                                invStack.InvTransform(MatrixTransforms.Translate(-tVec.X, -tVec.Y, -tVec.Z));
                                break;

                            case "scale":
                                Vec4D sVec = NextVec(0);
                                stack.Transform(MatrixTransforms.Scale(sVec.X, sVec.Y, sVec.Z));
                                invStack.InvTransform(MatrixTransforms.Scale(1 / sVec.X, 1 / sVec.Y, 1 / sVec.Z));
                                break;

                            case "rotate":
                                Vec4D  axis  = NextVec(0);
                                double angle = NextDbl();
                                stack.Transform(MatrixTransforms.Rotate(Consts.toRadians(angle), axis));
                                invStack.InvTransform(MatrixTransforms.Rotate(-Consts.toRadians(angle), axis));
                                break;

                            case "pushtransform":
                                stack.Push();
                                invStack.Push();
                                break;

                            case "poptransform":
                                stack.Pop();
                                invStack.Pop();
                                break;

                            // Primitives:
                            case "sphere":
                                prims.Add(new Sphere(NextVec(1), NextDbl()));
                                break;

                            case "plane":
                                prims.Add(new Plane(NextDbl(), NextVec(0)));
                                break;

                            case "vertex":
                                vertices.Add(NextVec(1));
                                break;

                            case "tri":
                                Vec4D p0     = vertices[NextInt()];
                                Vec4D p1     = vertices[NextInt()];
                                Vec4D p2     = vertices[NextInt()];
                                bool  mirror = false;

                                if (paramEnum.MoveNext() && paramEnum.Current == "mirrored")
                                {
                                    mirror = true;
                                }

                                Triangle tri = new Triangle(p0, p1, p2, mirror);
                                prims.Add(tri);
                                break;

                            case "vertexnormal":
                                verticesNormals.Add(new Vertex(NextVec(1), NextVec(0)));
                                break;

                            case "trinormal":
                                Vertex   v0      = verticesNormals[NextInt()];
                                Vertex   v1      = verticesNormals[NextInt()];
                                Vertex   v2      = verticesNormals[NextInt()];
                                Triangle triNorm = new Triangle(v0, v1, v2);
                                prims.Add(triNorm);
                                break;

                            // Objects
                            case "cube":
                                pos = NextVec(1);
                                Vec4D size = NextVec(0);
                                Cube  cube = new Cube(pos, size);
                                obj = cube;

                                if (paramEnum.MoveNext())
                                {
                                    switch (paramEnum.Current)
                                    {
                                    case "all":
                                        prims.AddRange(cube.GetChildren(Cube.AllSides));
                                        break;

                                    case "only":
                                        prims.AddRange(cube.GetChildren(ReadAll().Aggregate(Cube.NoSides, (sides, name) => sides | Cube.GetSide(name))));
                                        break;

                                    case "not":
                                        prims.AddRange(cube.GetChildren(ReadAll().Aggregate(Cube.AllSides, (sides, name) => sides & ~Cube.GetSide(name))));
                                        break;

                                    default:
                                        throw new Exception("Unknown option provided for cube construction: " + paramEnum.Current);
                                    }
                                }

                                prims.AddRange(obj.GetChildren(ObjectConsts.ImplicitInstance));
                                break;

                            // Instancing:
                            case "instance":
                                // Add instances from the previously assigned object (primitive group).
                                prims.AddRange(ReadAll().SelectMany((s) => obj.GetChildren(s)));
                                break;

                            // Other:
                            case "maxverts":
                                break;

                            case "maxvertnorms":
                                break;

                            default:
                                Trace.WriteLine("Unknown command: " + cmd);
                                break;
                            }

                            if (addCam != null)
                            {
                                addCam.imagePlane = imagePlane;
                                addCam.dofAmount  = dofAmount;

                                if (focalPoint != Vec4D.Zero)
                                {
                                    addCam.focalLength = (focalPoint - addCam.position).Length;
                                }
                                else if (focalLength != 0)
                                {
                                    addCam.focalLength = focalLength;
                                }
                                else
                                {
                                    addCam.focalLength = (addCam.initLookAt - addCam.position).Length;
                                }

                                outScene.Cameras.Add(addCam);
                                addCam = null;
                            }

                            foreach (Primitive prim in prims)
                            {
                                prim.TwoSided = twoSided;
                                prim.Invert   = invert;

                                if (emission != DoubleColor.Placeholder)
                                {
                                    prim.Emission = emission;
                                }

                                if (diffuse != DoubleColor.Placeholder)
                                {
                                    prim.Diffuse = diffuse;
                                }

                                if (specular != DoubleColor.Placeholder)
                                {
                                    prim.Specular = specular;
                                }
                                if (shininess != -1)
                                {
                                    prim.Shininess = shininess;
                                }

                                if (refraction != DoubleColor.Placeholder)
                                {
                                    prim.Refraction      = refraction;
                                    prim.RefractiveIndex = refractionIndex;
                                }

                                prim.Transform(stack.Peek(), invStack.Peek());

                                outScene.AddPrimitive(prim);
                            }

                            prims.Clear();
                        }
#if !DEBUG
                        catch (Exception e) when(e is Exception || e is FormatException || e is OverflowException || e is IndexOutOfRangeException)
                        {
                            throw new LoaderException(cmd, lineNum, e);
                        }
#endif
                    }

                    lineNum++;
                }

                return(outScene);
            }
            catch (FileNotFoundException e)
            {
            }
            finally
            {
                reader?.Close();
            }

            return(null);
        }
Exemplo n.º 11
0
        /*
        // TT - Changed in V1.5 with different parameters
        /// <summary>
        /// Render entities stored as fields
        /// </summary>
        /// <param name="device"></param>
        /// <param name="transforms"></param>
        /// <param name="currentCamera"></param>
        public override void Render(xnagrfx.GraphicsDevice device, MatrixTransforms transforms,
            Microsoft.Robotics.Simulation.Engine.CameraEntity currentCamera)
        {
            _leftWheel.Render(device, transforms, currentCamera);
            _rightWheel.Render(device, transforms, currentCamera);
            base.Render(device, transforms, currentCamera);
        }
        */

        /// <summary>
        /// Render entities stored as fields
        /// </summary>
        public override void Render(RenderMode renderMode, MatrixTransforms transforms, CameraEntity currentCamera)
        {
            _leftWheel.Render(renderMode, transforms, currentCamera);
            _rightWheel.Render(renderMode, transforms, currentCamera);

            base.Render(renderMode, transforms, currentCamera);
        }