コード例 #1
0
ファイル: DynamicCloudLayer.cs プロジェクト: Fav/testww
        /// <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;
            }
        }
コード例 #2
0
ファイル: DynamicCloudLayer.cs プロジェクト: Fav/testww
        /// <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);
            }
        }
コード例 #3
0
ファイル: DynamicCloudLayer.cs プロジェクト: Fav/testww
        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;
        }
コード例 #4
0
ファイル: DynamicCloudLayer.cs プロジェクト: Fav/testww
        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();
        }
コード例 #5
0
ファイル: DynamicCloudLayer.cs プロジェクト: Fav/testww
        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);
            }
        }