public static Vector3d MidPointByLength(Vector3d left, Vector3d right) { Vector3d result = Vector3d.Create((left.X + right.X) / 2, (left.Y + right.Y) / 2, (left.Z + right.Z) / 2); result.Normalize(); result.Multiply(left.Length()); return result; }
public static void DrawSaturnsRings(RenderContext renderContext, bool front, double distance) { if (RingsTriangleLists[0] == null) { ringImage = (ImageElement)Document.CreateElement("img"); CrossDomainImage xdomimg = (CrossDomainImage)(object)ringImage; //texture.AddEventListener("load", delegate(ElementEvent e) //{ // texReady = true; // Downloading = false; // errored = false; // ReadyToRender = texReady && (DemReady || !demTile); // RequestPending = false; // TileCache.RemoveFromQueue(this.Key, true); // MakeTexture(); //}, false); //texture.AddEventListener("error", delegate(ElementEvent e) //{ // Downloading = false; // ReadyToRender = false; // errored = true; // RequestPending = false; // TileCache.RemoveFromQueue(this.Key, true); //}, false); xdomimg.crossOrigin = "anonymous"; ringImage.Src = "/webclient/images/saturnringsshadow.png"; RingsTriangleLists[0] = new List<RenderTriangle>(); RingsTriangleLists[1] = new List<RenderTriangle>(); double ringSize = 2.25; Vector3d TopLeft = Vector3d.Create(-ringSize, 0, -ringSize); Vector3d TopRight = Vector3d.Create(ringSize, 0, -ringSize); Vector3d BottomLeft = Vector3d.Create(-ringSize, 0, ringSize); Vector3d BottomRight = Vector3d.Create(ringSize, 0, ringSize); Vector3d center = Vector3d.Create(0, 0, 0); Vector3d leftCenter = Vector3d.Create(-ringSize, 0, 0); Vector3d topCenter = Vector3d.Create(0, 0, -ringSize); Vector3d bottomCenter = Vector3d.Create(0, 0, ringSize); Vector3d rightCenter = Vector3d.Create(ringSize, 0, 0); int level = 6; //RingsTriangleLists[0].Add(RenderTriangle.Create(PositionTexture.CreatePosSize(TopLeft, 0, 0, 1024, 1024), PositionTexture.CreatePosSize(leftCenter, 0, .5, 1024, 1024), PositionTexture.CreatePosSize(topCenter, .5, 0, 1024, 1024), ringImage, level)); //RingsTriangleLists[0].Add(RenderTriangle.Create(PositionTexture.CreatePosSize(leftCenter, 0, 0.5, 1024, 1024), PositionTexture.CreatePosSize(center, .5, .5, 1024, 1024), PositionTexture.CreatePosSize(topCenter, .5, 0, 1024, 1024), ringImage, level)); //RingsTriangleLists[0].Add(RenderTriangle.Create(PositionTexture.CreatePosSize(topCenter, .5, 0, 1024, 1024), PositionTexture.CreatePosSize(rightCenter, 1, .5, 1024, 1024), PositionTexture.CreatePosSize(TopRight, 1, 0, 1024, 1024), ringImage, level)); //RingsTriangleLists[0].Add(RenderTriangle.Create(PositionTexture.CreatePosSize(topCenter, .5, 0, 1024, 1024), PositionTexture.CreatePosSize(center, .5, .5, 1024, 1024), PositionTexture.CreatePosSize(rightCenter, 1, .5, 1024, 1024), ringImage, level)); //RingsTriangleLists[1].Add(RenderTriangle.Create(PositionTexture.CreatePosSize(leftCenter, 0, .5, 1024, 1024), PositionTexture.CreatePosSize(bottomCenter, .5, 1, 1024, 1024), PositionTexture.CreatePosSize(center, .5, .5, 1024, 1024), ringImage, level)); //RingsTriangleLists[1].Add(RenderTriangle.Create(PositionTexture.CreatePosSize(leftCenter, 0, .5, 1024, 1024), PositionTexture.CreatePosSize(BottomLeft, 0, 1, 1024, 1024), PositionTexture.CreatePosSize(bottomCenter, .5, 1, 1024, 1024), ringImage, level)); //RingsTriangleLists[1].Add(RenderTriangle.Create(PositionTexture.CreatePosSize(center, .5, .5, 1024, 1024), PositionTexture.CreatePosSize(BottomRight, 1, 1, 1024, 1024), PositionTexture.CreatePosSize(rightCenter, 1, .5, 1024, 1024), ringImage, level)); //RingsTriangleLists[1].Add(RenderTriangle.Create(PositionTexture.CreatePosSize(center, .5, .5, 1024, 1024), PositionTexture.CreatePosSize(bottomCenter, .5, 1, 1024, 1024), PositionTexture.CreatePosSize(BottomRight, 1, 1, 1024, 1024), ringImage, level)); List<PositionTexture> vertexList; vertexList = new List<PositionTexture>(); int Width = 1024; int Height = 1024; vertexList.Add(PositionTexture.CreatePosSize(TopLeft, 0, 0, Width, Height)); vertexList.Add(PositionTexture.CreatePosSize(TopRight, 1, 0, Width, Height)); vertexList.Add(PositionTexture.CreatePosSize(BottomLeft, 0, 1, Width, Height)); vertexList.Add(PositionTexture.CreatePosSize(BottomRight, 1, 1, Width, Height)); List<Triangle> childTriangleList = new List<Triangle>(); //if (dataset.BottomsUp) //{ // childTriangleList.Add(Triangle.Create(0, 1, 2)); // childTriangleList.Add(Triangle.Create(2, 1, 3)); //} //else { childTriangleList.Add(Triangle.Create(0, 2, 1)); childTriangleList.Add(Triangle.Create(2, 3, 1)); } int count = 5; while (count-- > 1) { List<Triangle> newList = new List<Triangle>(); foreach (Triangle tri in childTriangleList) { tri.SubDivideNoNormalize(newList, vertexList); } childTriangleList = newList; } double miter = .6 / (Width / 256); foreach (Triangle tri in childTriangleList) { PositionTexture p1 = vertexList[tri.A]; PositionTexture p2 = vertexList[tri.B]; PositionTexture p3 = vertexList[tri.C]; RingsTriangleLists[0].Add(RenderTriangle.CreateWithMiter(p1, p2, p3, ringImage, level, miter)); } } if (renderContext.gl == null) { Vector3d cam = renderContext.CameraPosition; Vector3d test = new Vector3d(); //Matrix3d wv = renderContext.WV; Matrix3d worldLocal = Matrix3d.MultiplyMatrix(Matrix3d.RotationY(Math.Atan2(renderContext.SunPosition.X, renderContext.SunPosition.Z)), renderContext.WorldBaseNonRotating); Matrix3d wv = Matrix3d.MultiplyMatrix(worldLocal, renderContext.View); Matrix3d wvp = Matrix3d.MultiplyMatrix(wv, renderContext.Projection); double Width = renderContext.Width; double Height = renderContext.Height; wvp.Scale(Vector3d.Create(Width / 2, -Height / 2, 1)); wvp.Translate(Vector3d.Create(Width / 2, Height / 2, 0)); double td = 0; // RenderTriangle.CullInside = !RenderTriangle.CullInside; for (int i = 0; i < 2; i++) { foreach (RenderTriangle tri in RingsTriangleLists[0]) { //test = Vector3d.SubtractVectors(wv.Transform(tri.A.Position), cam); test = wv.Transform(tri.A.Position); td = test.Length(); bool draw = td > distance; if (front) { draw = !draw; } if (draw) { tri.Opacity = 1; tri.Draw(renderContext.Device, wvp); } } RenderTriangle.CullInside = !RenderTriangle.CullInside; } } else { //todo port rings to web gl //renderContext.gl.enableVertexAttribArray(renderContext.vertLoc); //renderContext.gl.enableVertexAttribArray(renderContext.textureLoc); //renderContext.gl.bindBuffer(GL.ARRAY_BUFFER, VertexBuffer); //renderContext.gl.vertexAttribPointer(renderContext.vertLoc, 3, GL.FLOAT, false, 20, 0); ////renderContext.gl.bindBuffer(GL.ARRAY_BUFFER, VertexBuffer); //renderContext.gl.vertexAttribPointer(renderContext.textureLoc, 2, GL.FLOAT, false, 20, 12); //renderContext.gl.activeTexture(GL.TEXTURE0); //renderContext.gl.bindTexture(GL.TEXTURE_2D, texture2d); ////if (tileX == TileTargetX && tileY == TileTargetY && Level == TileTargetLevel) ////{ //// renderContext.gl.bindTexture(GL.TEXTURE_2D, null); ////} //renderContext.gl.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, GetIndexBuffer(part, accomidation)); //renderContext.gl.drawElements(GL.TRIANGLES, TriangleCount * 3, GL.UNSIGNED_SHORT, 0); } }
internal void SetupMatricesLand3d() { Lighting = false; Space = false; RenderTriangle.CullInside = false; // For our world matrix, we will just rotate the Earth and Clouds about the y-axis. Matrix3d WorldMatrix = Matrix3d.RotationY(((ViewCamera.Lng - 90f) / 180f * Math.PI)); WorldMatrix.Multiply(Matrix3d.RotationX(((-ViewCamera.Lat) / 180f * Math.PI))); World = WorldMatrix; WorldBase = WorldMatrix.Clone(); viewPoint = Coordinates.GeoTo3d(ViewCamera.Lat, ViewCamera.Lng); double distance = 0; if (backgroundImageset.IsMandelbrot) { distance = (4.0 * (ViewCamera.Zoom / 180)) + 0.00000000000000000000000000000000000000001; } else { distance = (4.0 * (ViewCamera.Zoom / 180)) + 0.000001; } fovAngle = ((this.ViewCamera.Zoom) / FOVMULT) / Math.PI * 180; fovScale = (fovAngle / Height) * 3600; if (gl != null) { targetAltitude = GetScaledAltitudeForLatLong(ViewCamera.Lat, ViewCamera.Lng); double heightNow = 1 + targetAltitude; targetAltitude *= NominalRadius; //if ((double.IsNaN(heightNow))) //{ // heightNow = 0; //} if (targetHeight < heightNow) { targetHeight = (((targetHeight * 2) + heightNow) / 3); } else { targetHeight = (((targetHeight * 9) + heightNow) / 10); } //if (double.IsNaN(targetHeight)) //{ // targetHeight = 0; //} } else { targetAltitude = 0; targetHeight = 1; } double rotLocal = ViewCamera.Rotation; CameraPosition = Vector3d.Create( (Math.Sin(rotLocal) * Math.Sin(ViewCamera.Angle) * distance), (Math.Cos(rotLocal) * Math.Sin(ViewCamera.Angle) * distance), (-targetHeight - (Math.Cos(ViewCamera.Angle) * distance))); Vector3d cameraTarget = Vector3d.Create(0.0f, 0.0f, -targetHeight); double camHeight = CameraPosition.Length(); Vector3d lookUp = Vector3d.Create(Math.Sin(rotLocal) * Math.Cos(ViewCamera.Angle), Math.Cos(rotLocal) * Math.Cos(ViewCamera.Angle), Math.Sin(ViewCamera.Angle)); View = Matrix3d.LookAtLH( (CameraPosition), (cameraTarget), lookUp); // * Matrix3d.RotationX(((-config.DomeTilt) / 180 * Math.PI)); ViewBase = View; double back = Math.Sqrt((distance + 1f) * (distance + 1f) - 1); back = Math.Max(.5, back); // back = (float)camDist * 40f; double m_nearPlane = distance * .05f; m_nearPlane = distance * .05f; Projection = Matrix3d.PerspectiveFovLH((Math.PI / 4.0), (double)Width / (double)Height, m_nearPlane, back); SetMatrixes(); MakeFrustum(); }