/// <summary> /// Disposes renderable /// </summary> public override void Dispose() { isInitialized = false; if (m_frames != null) { for (int i = 0; i < m_frames.Count; i++) { DynamicCloudFrame frame = (DynamicCloudFrame)m_frames[i]; if (frame.Texture != null) { frame.Texture.Dispose(); frame.Texture = null; } } m_frames.Clear(); } if (m_effect != null) { m_effect.Dispose(); m_effect = null; } if (m_surface1 != null) { m_surface1.Dispose(); m_surface1 = null; } if (m_surface2 != null) { m_surface2.Dispose(); m_surface2 = null; } if (m_surface3 != null) { m_surface3.Dispose(); m_surface3 = null; } if (s1 != null) { s1.Dispose(); s1 = null; } if (s2 != null) { s2.Dispose(); s2 = null; } if (s3 != null) { s3.Dispose(); s3 = null; } }
/// <summary> /// Renders object /// </summary> /// <param name="drawArgs"></param> public override void Render(DrawArgs drawArgs) { try { if (!isInitialized) { return; } if (!drawArgs.CurrentWorld.IsEarth) { return; } if (m_frames == null || m_frames.Count == 0) { return; } DynamicCloudFrame frame = (DynamicCloudFrame)m_frames[(m_currentFrame < m_frames.Count ? m_currentFrame : m_frames.Count - 1)]; drawArgs.device.Transform.World = Matrix.Translation( (float)-drawArgs.WorldCamera.ReferenceCenter.X, (float)-drawArgs.WorldCamera.ReferenceCenter.Y, (float)-drawArgs.WorldCamera.ReferenceCenter.Z ); if (m_enableHdrLighting) { RenderShaders(drawArgs, frame); } else { RenderFixedPipeline(drawArgs, frame); } } catch (Exception ex) { Log.Write(ex); } }
private void RenderFixedPipeline(DrawArgs drawArgs, DynamicCloudFrame frame) { drawArgs.device.SetTexture(0, frame.Texture); drawArgs.device.VertexFormat = CustomVertex.PositionTextured.Format; drawArgs.device.TextureState[0].ColorOperation = TextureOperation.SelectArg1; drawArgs.device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor; drawArgs.device.TextureState[0].AlphaOperation = TextureOperation.SelectArg1; drawArgs.device.TextureState[0].AlphaArgument1 = TextureArgument.TextureColor; drawArgs.device.DrawIndexedUserPrimitives( PrimitiveType.TriangleList, 0, frame.Vertices.Length, frame.Indices.Length / 3, frame.Indices, true, frame.Vertices); drawArgs.device.Transform.World = drawArgs.WorldCamera.WorldMatrix; }
private void RenderShaders(DrawArgs drawArgs, DynamicCloudFrame frame) { if (m_effect == null) { drawArgs.device.DeviceReset += new EventHandler(device_DeviceReset); device_DeviceReset(drawArgs.device, null); } Surface currentRenderTarget = drawArgs.device.GetRenderTarget(0); drawArgs.device.SetRenderTarget(0, s1); drawArgs.device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.FromArgb(0, 0, 0, 0).ToArgb(), 1.0f, 0); drawArgs.device.RenderState.CullMode = Cull.None; drawArgs.device.VertexFormat = CustomVertex.PositionTextured.Format; drawArgs.device.TextureState[0].AlphaOperation = TextureOperation.Modulate; drawArgs.device.TextureState[0].ColorOperation = TextureOperation.Add; drawArgs.device.TextureState[0].AlphaArgument1 = TextureArgument.TextureColor; m_effect.Technique = "VSClouds"; m_effect.SetValue("World", drawArgs.device.Transform.World); m_effect.SetValue("View", drawArgs.device.Transform.View); m_effect.SetValue("Projection", drawArgs.device.Transform.Projection); m_effect.SetValue("Tex0", frame.Texture); m_effect.SetValue("RenderMap", m_surface1); m_effect.SetValue("FullResMap", m_surface1); // drawArgs.device.Indices = m_indexBuffer; // drawArgs.device.SetStreamSource(0, m_vertexBuffer, 0); int numPasses = m_effect.Begin(0); for (int i = 0; i < numPasses; i++) { m_effect.BeginPass(i); drawArgs.device.DrawIndexedUserPrimitives(PrimitiveType.TriangleList, 0, frame.Vertices.Length, frame.Indices.Length / 3, frame.Indices, true, frame.Vertices); // drawArgs.device.DrawIndexedPrimitives( // PrimitiveType.TriangleList, // 0, // 0, // frame.Vertices.Length, // 0, // frame.Indices.Length / 3); m_effect.EndPass(); } m_effect.End(); float pixelSizeX = -1.0f / (drawArgs.screenWidth / 2.0f); float pixelSizeY = 1.0f / (drawArgs.screenHeight / 2.0f); m_effect.SetValue("pixelSize", new Vector4(pixelSizeX, pixelSizeY, 1.0f, 1.0f)); m_effect.SetValue("ExposureLevel", m_exposureLevel); drawArgs.device.Transform.World = drawArgs.WorldCamera.WorldMatrix; drawArgs.device.SetRenderTarget(0, s2); drawArgs.device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.FromArgb(0, 0, 0, 0).ToArgb(), 1.0f, 0); m_effect.Technique = "ScaleBuffer"; m_effect.SetValue("RenderMap", m_surface2); numPasses = m_effect.Begin(0); for (int i = 0; i < numPasses; i++) { m_effect.BeginPass(i); drawArgs.device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, m_transformedVertices); m_effect.EndPass(); } m_effect.End(); drawArgs.device.SetRenderTarget(0, s3); drawArgs.device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.FromArgb(0, 0, 0, 0).ToArgb(), 1.0f, 0); m_effect.Technique = "GaussY"; Vector4[] vSampleOffsets = new Vector4[16]; float[] fSampleOffsets = new float[16]; Vector4[] vSampleWeights = new Vector4[16]; CreateTexCoordNTexelWeights( drawArgs.screenWidth / 4, ref fSampleOffsets, ref vSampleWeights, 7.0f, 1.5f); for (int i = 0; i < 16; i++) { vSampleOffsets[i] = new Vector4(0.0f, fSampleOffsets[i], 0, 0); } m_effect.SetValue("TexelWeight", vSampleWeights); m_effect.SetValue("vertTapOffs", vSampleOffsets); numPasses = m_effect.Begin(0); for (int i = 0; i < numPasses; i++) { m_effect.BeginPass(i); drawArgs.device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, m_transformedVertices); m_effect.EndPass(); } m_effect.End(); drawArgs.device.SetRenderTarget(0, s2); drawArgs.device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.FromArgb(0, 0, 0, 0).ToArgb(), 1.0f, 0); m_effect.Technique = "GaussX"; m_effect.SetValue("RenderMap", m_surface3); for (int i = 0; i < 16; i++) { vSampleOffsets[i] = new Vector4(fSampleOffsets[i], 0, 0, 0); } m_effect.SetValue("horzTapOffs", vSampleOffsets); numPasses = m_effect.Begin(0); for (int i = 0; i < numPasses; i++) { m_effect.BeginPass(i); drawArgs.device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, m_transformedVertices); m_effect.EndPass(); } m_effect.End(); drawArgs.device.SetRenderTarget(0, currentRenderTarget); m_effect.Technique = "Screenblit"; m_effect.SetValue("RenderMap", m_surface1); numPasses = m_effect.Begin(0); for (int i = 0; i < numPasses; i++) { m_effect.BeginPass(i); drawArgs.device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, m_transformedVertices); m_effect.EndPass(); } m_effect.End(); }
private void UpdateImages() { try { System.Collections.ArrayList remoteImageList = new System.Collections.ArrayList(); try { // Offline check if (World.Settings.WorkOffline) { throw new Exception("Offline mode active."); } WebDownload download = new WebDownload(m_remoteUrl); FileInfo currentIndexFile = new FileInfo(m_imageDirectoryPath + "\\current.txt"); if (!currentIndexFile.Directory.Exists) { currentIndexFile.Directory.Create(); } download.DownloadFile(currentIndexFile.FullName, DownloadType.Unspecified); download.Dispose(); using (StreamReader reader = currentIndexFile.OpenText()) { string data = reader.ReadToEnd(); string[] parts = data.Split('"'); for (int i = 0; i < parts.Length; i++) { if (parts[i].StartsWith("/GlobalCloudsArchive/PastDay/")) { remoteImageList.Add(parts[i].Replace("/GlobalCloudsArchive/PastDay/", "")); } } } } catch (Exception ex) { Log.Write(ex); } System.Collections.ArrayList imageDisplayList = new System.Collections.ArrayList(); DirectoryInfo cloudImageDirectory = new DirectoryInfo(m_imageDirectoryPath); FileInfo[] archiveImageFiles = new FileInfo[0]; if (cloudImageDirectory.Exists) { archiveImageFiles = cloudImageDirectory.GetFiles("*.png"); } for (int i = remoteImageList.Count - 1; i >= 0; i--) { string currentRemoteFile = (string)remoteImageList[i]; bool found = false; for (int j = 0; j < archiveImageFiles.Length; j++) { if (archiveImageFiles[j].Name == currentRemoteFile.Replace(".jpg", ".png")) { found = true; } } if (!found) { // Offline check if (World.Settings.WorkOffline) { throw new Exception("Offline mode active."); } FileInfo jpgFile = new FileInfo(cloudImageDirectory.FullName + "\\" + currentRemoteFile); WebDownload download = new WebDownload( m_remoteUrl + "/" + currentRemoteFile); if (!jpgFile.Directory.Exists) { jpgFile.Directory.Create(); } download.DownloadFile(jpgFile.FullName, DownloadType.Unspecified); ImageHelper.CreateAlphaPngFromBrightness(jpgFile.FullName, jpgFile.FullName.Replace(".jpg", ".png")); } } //reload the list of downloaded images if (cloudImageDirectory.Exists) { archiveImageFiles = cloudImageDirectory.GetFiles("*.png"); } for (int i = archiveImageFiles.Length - 1; i >= 0; i--) { imageDisplayList.Insert(0, archiveImageFiles[i].FullName); } double north = 90, south = -90, west = -180, east = 180; for (int i = 0; i < imageDisplayList.Count; i++) { string currentImageFile = (string)imageDisplayList[i]; string ddsFilePath = currentImageFile.Replace(".png", ".dds"); if (!File.Exists(ddsFilePath)) { ImageHelper.ConvertToDxt3(currentImageFile, ddsFilePath, false); } DynamicCloudFrame frame = new DynamicCloudFrame(); frame.ImageFile = currentImageFile; frame.Texture = ImageHelper.LoadTexture(ddsFilePath); CreateMesh(north, south, west, east, m_samples, currentImageFile, ref frame.Vertices, ref frame.Indices); m_frames.Add(frame); } } catch (Exception ex) { Log.Write(ex); } }