internal static bool PerformCameraRestrictionTest() { if (World.CameraRestriction == Camera.RestrictionMode.On) { Vector3[] p = new Vector3[] { CameraRestrictionBottomLeft, CameraRestrictionTopRight }; Vector2[] r = new Vector2[2]; for (int j = 0; j < 2; j++) { // determine relative world coordinates p[j].Rotate(World.AbsoluteCameraDirection, World.AbsoluteCameraUp, World.AbsoluteCameraSide); double rx = -Math.Tan(World.CameraCurrentAlignment.Yaw) - World.CameraCurrentAlignment.Position.X; double ry = -Math.Tan(World.CameraCurrentAlignment.Pitch) - World.CameraCurrentAlignment.Position.Y; double rz = -World.CameraCurrentAlignment.Position.Z; p[j] += rx * World.AbsoluteCameraSide + ry * World.AbsoluteCameraUp + rz * World.AbsoluteCameraDirection; // determine screen coordinates double ez = AbsoluteCameraDirection.X * p[j].X + AbsoluteCameraDirection.Y * p[j].Y + AbsoluteCameraDirection.Z * p[j].Z; if (ez == 0.0) { return(false); } double ex = AbsoluteCameraSide.X * p[j].X + AbsoluteCameraSide.Y * p[j].Y + AbsoluteCameraSide.Z * p[j].Z; double ey = AbsoluteCameraUp.X * p[j].X + AbsoluteCameraUp.Y * p[j].Y + AbsoluteCameraUp.Z * p[j].Z; r[j].X = ex / (ez * Math.Tan(0.5 * HorizontalViewingAngle)); r[j].Y = ey / (ez * Math.Tan(0.5 * VerticalViewingAngle)); } return(r[0].X <= -1.0025 & r[1].X >= 1.0025 & r[0].Y <= -1.0025 & r[1].Y >= 1.0025); } return(true); }
internal static void UpdateMouseGrab(double TimeElapsed) { if (MouseGrabEnabled) { double factor; if (CameraMode == CameraViewMode.Interior | CameraMode == CameraViewMode.InteriorLookAhead) { factor = 1.0; } else { factor = 3.0; } CameraAlignmentDirection.Yaw += factor * MouseGrabTarget.X; CameraAlignmentDirection.Pitch -= factor * MouseGrabTarget.Y; MouseGrabTarget = new Vector2(0.0, 0.0); } }
public void SetCoordinates(Vector2 coordinates) { GL.ProgramUniform2(handle, UniformLayout.Coordinates, (float)coordinates.X, (float)coordinates.Y); }
public void SetSize(Vector2 size) { GL.ProgramUniform2(handle, UniformLayout.Size, (float)size.X, (float)size.Y); }
public void SetPoint(Vector2 point) { GL.ProgramUniform2(handle, UniformLayout.Point, (float)point.X, (float)point.Y); }
/// <summary>Draws a 3D cube in immediate mode</summary> /// <param name="Position">The position in world-space</param> /// <param name="Direction">The direction vector</param> /// <param name="Up">The up vector</param> /// <param name="Side">The side vector</param> /// <param name="Size">A 3D vector describing the size of the cube</param> /// <param name="Camera">The camera position</param> /// <param name="TextureIndex">The texture to apply</param> private void DrawImmediate(Vector3 Position, Vector3 Direction, Vector3 Up, Vector3 Side, Vector3 Size, Vector3 Camera, Texture TextureIndex) { renderer.LastBoundTexture = null; GL.MatrixMode(MatrixMode.Projection); GL.PushMatrix(); GL.LoadIdentity(); OpenTK.Matrix4d perspective = OpenTK.Matrix4d.Perspective(renderer.Camera.VerticalViewingAngle, -renderer.Screen.AspectRatio, 0.2, 1000.0); GL.MultMatrix(ref perspective); double dx = renderer.Camera.AbsoluteDirection.X; double dy = renderer.Camera.AbsoluteDirection.Y; double dz = renderer.Camera.AbsoluteDirection.Z; double ux = renderer.Camera.AbsoluteUp.X; double uy = renderer.Camera.AbsoluteUp.Y; double uz = renderer.Camera.AbsoluteUp.Z; OpenTK.Matrix4d lookat = OpenTK.Matrix4d.LookAt(0.0, 0.0, 0.0, dx, dy, dz, ux, uy, uz); GL.MatrixMode(MatrixMode.Modelview); GL.PushMatrix(); GL.LoadMatrix(ref lookat); Vector3[] v = new Vector3[8]; v[0] = new Vector3(Size.X, Size.Y, -Size.Z); v[1] = new Vector3(Size.X, -Size.Y, -Size.Z); v[2] = new Vector3(-Size.X, -Size.Y, -Size.Z); v[3] = new Vector3(-Size.X, Size.Y, -Size.Z); v[4] = new Vector3(Size.X, Size.Y, Size.Z); v[5] = new Vector3(Size.X, -Size.Y, Size.Z); v[6] = new Vector3(-Size.X, -Size.Y, Size.Z); v[7] = new Vector3(-Size.X, Size.Y, Size.Z); for (int i = 0; i < 8; i++) { v[i].Rotate(Direction, Up, Side); v[i] += Position - Camera; } int[][] Faces = new int[6][]; Faces[0] = new[] { 0, 1, 2, 3 }; Faces[1] = new[] { 0, 4, 5, 1 }; Faces[2] = new[] { 0, 3, 7, 4 }; Faces[3] = new[] { 6, 5, 4, 7 }; Faces[4] = new[] { 6, 7, 3, 2 }; Faces[5] = new[] { 6, 2, 1, 5 }; if (TextureIndex == null || !renderer.currentHost.LoadTexture(ref TextureIndex, OpenGlTextureWrapMode.ClampClamp)) { GL.Disable(EnableCap.Texture2D); for (int i = 0; i < 6; i++) { GL.Begin(PrimitiveType.Quads); for (int j = 0; j < 4; j++) { GL.Vertex3(v[Faces[i][j]].X, v[Faces[i][j]].Y, v[Faces[i][j]].Z); } GL.End(); } GL.PopMatrix(); GL.MatrixMode(MatrixMode.Projection); GL.PopMatrix(); return; } GL.Enable(EnableCap.Texture2D); GL.BindTexture(TextureTarget.Texture2D, TextureIndex.OpenGlTextures[(int)OpenGlTextureWrapMode.ClampClamp].Name); Vector2[][] t = new Vector2[6][]; t[0] = new[] { new Vector2(1.0, 0.0), new Vector2(1.0, 1.0), new Vector2(0.0, 1.0), new Vector2(0.0, 0.0) }; t[1] = new[] { new Vector2(0.0, 0.0), new Vector2(1.0, 0.0), new Vector2(1.0, 1.0), new Vector2(0.0, 1.0) }; t[2] = new[] { new Vector2(1.0, 1.0), new Vector2(0.0, 1.0), new Vector2(0.0, 0.0), new Vector2(1.0, 0.0) }; t[3] = new[] { new Vector2(1.0, 1.0), new Vector2(0.0, 1.0), new Vector2(0.0, 0.0), new Vector2(1.0, 0.0) }; t[4] = new[] { new Vector2(0.0, 1.0), new Vector2(0.0, 0.0), new Vector2(1.0, 0.0), new Vector2(1.0, 1.0) }; t[5] = new[] { new Vector2(0.0, 1.0), new Vector2(0.0, 0.0), new Vector2(1.0, 0.0), new Vector2(1.0, 1.0) }; for (int i = 0; i < 6; i++) { GL.Begin(PrimitiveType.Quads); GL.Color3(1.0, 1.0, 1.0); for (int j = 0; j < 4; j++) { GL.TexCoord2(t[i][j].X, t[i][j].Y); GL.Vertex3(v[Faces[i][j]].X, v[Faces[i][j]].Y, v[Faces[i][j]].Z); } GL.End(); } GL.PopMatrix(); GL.MatrixMode(MatrixMode.Projection); GL.PopMatrix(); }
// constructors /// <summary>Creates a new instance of this structure.</summary> /// <param name="spatialCoordinates">The spatial coordinates.</param> /// <param name="normal">The surface normal.</param> /// <param name="textureCoordinates">The texture coordinates.</param> /// <param name="reflectiveColor">The reflective color.</param> /// <param name="tag">A field to convey intermediate information.</param> public Vertex(Math.Vector3 spatialCoordinates, Math.Vector2 textureCoordinates, Math.Vector3 normal, Color.ColorRGBA reflectiveColor, int tag) { this.SpatialCoordinates = spatialCoordinates; this.TextureCoordinates = textureCoordinates; this.Normal = normal; this.ReflectiveColor = reflectiveColor; this.Tag = tag; }
internal static bool PerformCameraRestrictionTest() { if (World.CameraRestriction == CameraRestrictionMode.On) { Vector3[] p = new Vector3[] { CameraRestrictionBottomLeft, CameraRestrictionTopRight }; Vector2[] r = new Vector2[2]; for (int j = 0; j < 2; j++) { // determine relative world coordinates World.Rotate(ref p[j].X, ref p[j].Y, ref p[j].Z, World.AbsoluteCameraDirection.X, World.AbsoluteCameraDirection.Y, World.AbsoluteCameraDirection.Z, World.AbsoluteCameraUp.X, World.AbsoluteCameraUp.Y, World.AbsoluteCameraUp.Z, World.AbsoluteCameraSide.X, World.AbsoluteCameraSide.Y, World.AbsoluteCameraSide.Z); double rx = -Math.Tan(World.CameraCurrentAlignment.Yaw) - World.CameraCurrentAlignment.Position.X; double ry = -Math.Tan(World.CameraCurrentAlignment.Pitch) - World.CameraCurrentAlignment.Position.Y; double rz = -World.CameraCurrentAlignment.Position.Z; p[j].X += rx * World.AbsoluteCameraSide.X + ry * World.AbsoluteCameraUp.X + rz * World.AbsoluteCameraDirection.X; p[j].Y += rx * World.AbsoluteCameraSide.Y + ry * World.AbsoluteCameraUp.Y + rz * World.AbsoluteCameraDirection.Y; p[j].Z += rx * World.AbsoluteCameraSide.Z + ry * World.AbsoluteCameraUp.Z + rz * World.AbsoluteCameraDirection.Z; // determine screen coordinates double ez = AbsoluteCameraDirection.X * p[j].X + AbsoluteCameraDirection.Y * p[j].Y + AbsoluteCameraDirection.Z * p[j].Z; if (ez == 0.0) return false; double ex = AbsoluteCameraSide.X * p[j].X + AbsoluteCameraSide.Y * p[j].Y + AbsoluteCameraSide.Z * p[j].Z; double ey = AbsoluteCameraUp.X * p[j].X + AbsoluteCameraUp.Y * p[j].Y + AbsoluteCameraUp.Z * p[j].Z; r[j].X = ex / (ez * Math.Tan(0.5 * HorizontalViewingAngle)); r[j].Y = ey / (ez * Math.Tan(0.5 * VerticalViewingAngle)); } return r[0].X <= -1.0025 & r[1].X >= 1.0025 & r[0].Y <= -1.0025 & r[1].Y >= 1.0025; } return true; }
internal Vertex(Vector3 Coordinates, Vector2 TextureCoordinates) { this.Coordinates = Coordinates; this.TextureCoordinates = TextureCoordinates; }
internal Vertex(double X, double Y, double Z) { this.Coordinates = new Vector3(X, Y, Z); this.TextureCoordinates = new Vector2(0.0f, 0.0f); }