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>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); } }
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) ; } }
/// <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]); }
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); }
/* // 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); }