Beispiel #1
0
		/// <summary>
		/// Draws the layer
		/// </summary>
		public override void Render(DrawArgs drawArgs)
		{
			if(this.downloadThread != null && this.downloadThread.IsAlive) this.RenderProgress(drawArgs);

			if(!this.isInitialized)
				return;

			try
			{
				
				if(this.texture == null || this.m_SurfaceImage != null)
					return;

				drawArgs.device.SetTexture(0, this.texture);

				if(this._disableZbuffer)
				{
					if(drawArgs.device.GetRenderState<bool>(RenderState.ZEnable))
						drawArgs.device.SetRenderState(RenderState.ZEnable , false);
				}
				else
				{
					if(!drawArgs.device.GetRenderState<bool>(RenderState.ZEnable))
						drawArgs.device.SetRenderState(RenderState.ZEnable , true);
				}

				drawArgs.device.SetRenderState(RenderState.ZEnable , true);
				drawArgs.device.Clear(ClearFlags.ZBuffer, System.Drawing.Color.Black.ToRawColorBGRA(), 1.0f, 0);

                drawArgs.device.SetTransform(TransformState.World, Matrix.Translation(
                        (float)-drawArgs.WorldCamera.ReferenceCenter.X,
                        (float)-drawArgs.WorldCamera.ReferenceCenter.Y,
                        (float)-drawArgs.WorldCamera.ReferenceCenter.Z
                        ));
                this.device.VertexFormat = CustomVertex.PositionNormalTextured.Format;

                if (!this.RenderGrayscale || (this.device.Capabilities.PixelShaderVersion.Major < 1))
                {
                    if (World.Settings.EnableSunShading)
                    {
                        Point3d sunPosition = SunCalculator.GetGeocentricPosition(TimeKeeper.CurrentTimeUtc);
                        Vector3 sunVector = new Vector3(
                            (float)sunPosition.X,
                            (float)sunPosition.Y,
                            (float)sunPosition.Z);

                        this.device.SetRenderState(RenderState.Lighting , true);
                        Material material = new Material();
                        material.Diffuse = System.Drawing.Color.White.ToRawColor4();
                        material.Ambient = System.Drawing.Color.White.ToRawColor4();

                        this.device.Material = material;
                        this.device.SetRenderState(RenderState.Ambient , World.Settings.ShadingAmbientColor.ToArgb());
                        this.device.SetRenderState(RenderState.NormalizeNormals , true);
                        this.device.SetRenderState(RenderState.AlphaBlendEnable , true);

                        Light lLight = new Light
                        {
                            Diffuse = System.Drawing.Color.White.ToRawColor4(),
                            Type = LightType.Directional,
                            Range = 100000,
                            Direction = sunVector,
                        };
                        drawArgs.device.SetLight(0, ref lLight);

                        this.device.SetTextureStageState(0, TextureStage.ColorOperation , TextureOperation.Modulate);
                        this.device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Diffuse);
                        this.device.SetTextureStageState(0, TextureStage.ColorArg2,TextureArgument.Texture);
                    }
                    else
                    {
                        this.device.SetRenderState(RenderState.Lighting , false);
                        this.device.SetRenderState(RenderState.Ambient , World.Settings.StandardAmbientColor.ToArgb());

                        drawArgs.device.SetTextureStageState(0, TextureStage.ColorOperation , TextureOperation.SelectArg1);
                        drawArgs.device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);
                    }

                    this.device.SetRenderState(RenderState.TextureFactor , System.Drawing.Color.FromArgb(this.m_opacity, 255, 255, 255).ToArgb());
                    this.device.SetTextureStageState(0, TextureStage.AlphaOperation,  TextureOperation.Modulate);
                    this.device.SetTextureStageState(0, TextureStage.AlphaArg1,TextureArgument.Texture);
                    this.device.SetTextureStageState(0, TextureStage.AlphaArg2,TextureArgument.TFactor);

                    drawArgs.device.VertexFormat = CustomVertex.PositionNormalTextured.Format;

                    drawArgs.device.DrawIndexedUserPrimitives(PrimitiveType.TriangleList, 0, this.vertices.Length, this.indices.Length / 3, this.indices, Format.Index16, this.vertices);

                    
                }
                else
                {
                    if (grayscaleEffect == null)
                    {
                        this.device.DeviceReset += new EventHandler(this.device_DeviceReset);
                        this.device_DeviceReset(this.device, null);
                    }

                    grayscaleEffect.Technique = "RenderGrayscaleBrightness";
                    grayscaleEffect.SetValue("WorldViewProj", Matrix.Multiply(this.device.SetTransform(TransformState.World, Matrix.Multiply(this.device.SetTransform(TransformState.View, this.device.SetTransform(TransformState.Projection)));
                    grayscaleEffect.SetValue("Tex0", this.texture.NativePointer);
                    grayscaleEffect.SetValue("Brightness", this.GrayscaleBrightness);
                    float opacity = (float) this.m_opacity / 255.0f;
                    grayscaleEffect.SetValue("Opacity", opacity);

                    int numPasses = grayscaleEffect.Begin(0);
                    for (int i = 0; i < numPasses; i++)
                    {
                        grayscaleEffect.BeginPass(i);

                        drawArgs.device.DrawIndexedUserPrimitives(PrimitiveType.TriangleList, 0, this.vertices.Length, this.indices.Length / 3, this.indices, Format.Index16, this.vertices);

                        grayscaleEffect.EndPass();
                    }

                    grayscaleEffect.End();
                }

                drawArgs.device.SetTransform(TransformState.World, drawArgs.WorldCamera.WorldMatrix);
				
			}
			finally
			{
				if (this.m_opacity < 255)
				{
					// Restore alpha blend state
                    this.device.SetRenderState(RenderState.SourceBlend , Blend.SourceAlpha);
                    this.device.SetRenderState(RenderState.DestinationBlend , Blend.InverseSourceAlpha);
				}

				if(this._disableZbuffer)
					drawArgs.device.SetRenderState(RenderState.ZEnable , true);
			}
		}
Beispiel #2
0
        public override void Render(DrawArgs drawArgs)
        {
            using (new DirectXProfilerEvent("PolygonFeature::Render"))
            {
                if (!isInitialized /*|| m_vertices == null*/ || drawArgs.WorldCamera.Altitude < m_minimumDisplayAltitude || drawArgs.WorldCamera.Altitude > m_maximumDisplayAltitude)
                {
                    return;
                }

                if (!drawArgs.WorldCamera.ViewFrustum.Intersects(BoundingBox))
                {
                    return;
                }

                // save state
                Cull currentCull          = drawArgs.device.RenderState.CullMode;
                bool currentZBufferEnable = drawArgs.device.RenderState.ZBufferEnable;

                try
                {
                    drawArgs.device.RenderState.CullMode      = Cull.None;
                    drawArgs.device.RenderState.ZBufferEnable = m_ZBufferEnable;

                    drawArgs.device.Transform.World = Matrix.Translation(
                        (float)-drawArgs.WorldCamera.ReferenceCenter.X + m_localOrigin.X,
                        (float)-drawArgs.WorldCamera.ReferenceCenter.Y + m_localOrigin.Y,
                        (float)-drawArgs.WorldCamera.ReferenceCenter.Z + m_localOrigin.Z
                        );

                    if (World.Settings.EnableSunShading)
                    {
                        Point3d sunPosition = SunCalculator.GetGeocentricPosition(TimeKeeper.CurrentTimeUtc);
                        Vector3 sunVector   = new Vector3(
                            (float)sunPosition.X,
                            (float)sunPosition.Y,
                            (float)sunPosition.Z);

                        drawArgs.device.RenderState.Lighting = true;
                        Material material = new Material();
                        material.Diffuse = Color.White;
                        material.Ambient = Color.White;

                        drawArgs.device.Material = material;
                        drawArgs.device.RenderState.AmbientColor     = World.Settings.ShadingAmbientColor.ToArgb();
                        drawArgs.device.RenderState.NormalizeNormals = true;
                        drawArgs.device.RenderState.AlphaBlendEnable = true;

                        drawArgs.device.Lights[0].Enabled   = true;
                        drawArgs.device.Lights[0].Type      = LightType.Directional;
                        drawArgs.device.Lights[0].Diffuse   = Color.White;
                        drawArgs.device.Lights[0].Direction = sunVector;

                        drawArgs.device.TextureState[0].ColorOperation = TextureOperation.Modulate;
                        drawArgs.device.TextureState[0].ColorArgument1 = TextureArgument.Diffuse;
                        drawArgs.device.TextureState[0].ColorArgument2 = TextureArgument.TextureColor;
                    }
                    else
                    {
                        drawArgs.device.RenderState.Lighting = false;
                        drawArgs.device.RenderState.Ambient  = World.Settings.StandardAmbientColor;
                    }

                    //if(m_vertices != null)
                    if (this.Fill)
                    {
                        if (primList.Count > 0)
                        {
                            drawArgs.device.VertexFormat = CustomVertex.PositionNormalColored.Format;
                            drawArgs.device.TextureState[0].ColorOperation = TextureOperation.Disable;
                            for (int i = 0; i < primList.Count; i++)
                            {
                                int           vertexCount = 0;
                                PrimitiveType primType    = (PrimitiveType)primTypes[i];
                                CustomVertex.PositionNormalColored[] vertices = (CustomVertex.PositionNormalColored[])primList[i];

                                if (primType == PrimitiveType.TriangleList)
                                {
                                    vertexCount = vertices.Length / 3;
                                }
                                else
                                {
                                    vertexCount = vertices.Length - 2;
                                }

                                drawArgs.device.DrawUserPrimitives(
                                    primType,//PrimitiveType.TriangleList,
                                    vertexCount,
                                    vertices);
                            }
                        }
                    }

                    if (m_lineFeature != null)
                    {
                        for (int i = 0; i < m_lineFeature.Length; i++)
                        {
                            if (m_lineFeature[i] != null)
                            {
                                m_lineFeature[i].Render(drawArgs);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.Write(ex);
                }
                finally
                {
                    // restore device state
                    drawArgs.device.Transform.World           = drawArgs.WorldCamera.WorldMatrix;
                    drawArgs.device.RenderState.CullMode      = currentCull;
                    drawArgs.device.RenderState.ZBufferEnable = currentZBufferEnable;
                }
            }
        }
Beispiel #3
0
        public override void Render(DrawArgs drawArgs)
        {
            using (new DirectXProfilerEvent("PolygonFeature::Render"))
            {
                if (!this.isInitialized /*|| m_vertices == null*/ || drawArgs.WorldCamera.Altitude < this.m_minimumDisplayAltitude || drawArgs.WorldCamera.Altitude > this.m_maximumDisplayAltitude)
                {
                    return;
                }

                if (!drawArgs.WorldCamera.ViewFrustum.Intersects(this.BoundingBox))
                {
                    return;
                }

                // save state
                Cull currentCull          = drawArgs.device.GetRenderState <Cull>(RenderState.CullMode);
                bool currentZBufferEnable = drawArgs.device.GetRenderState <bool>(RenderState.ZEnable);

                try
                {
                    drawArgs.device.SetRenderState(RenderState.CullMode, Cull.None);
                    drawArgs.device.SetRenderState(RenderState.ZEnable, this.m_ZBufferEnable);

                    drawArgs.device.SetTransform(TransformState.World, Matrix.Translation(
                                                     (float)-drawArgs.WorldCamera.ReferenceCenter.X + this.m_localOrigin.X,
                                                     (float)-drawArgs.WorldCamera.ReferenceCenter.Y + this.m_localOrigin.Y,
                                                     (float)-drawArgs.WorldCamera.ReferenceCenter.Z + this.m_localOrigin.Z
                                                     ));

                    if (World.Settings.EnableSunShading)
                    {
                        Point3d sunPosition = SunCalculator.GetGeocentricPosition(TimeKeeper.CurrentTimeUtc);
                        Vector3 sunVector   = new Vector3(
                            (float)sunPosition.X,
                            (float)sunPosition.Y,
                            (float)sunPosition.Z);

                        drawArgs.device.SetRenderState(RenderState.Lighting, true);
                        Material material = new Material();
                        material.Diffuse = Color.White.ToRawColor4();;
                        material.Ambient = Color.White.ToRawColor4();;

                        drawArgs.device.Material = material;
                        drawArgs.device.SetRenderState(RenderState.Ambient, World.Settings.ShadingAmbientColor.ToArgb());
                        drawArgs.device.SetRenderState(RenderState.NormalizeNormals, true);
                        drawArgs.device.SetRenderState(RenderState.AlphaBlendEnable, true);

                        Light lLight = new Light
                        {
                            Diffuse   = System.Drawing.Color.White.ToRawColor4(),
                            Type      = LightType.Directional,
                            Range     = 100000,
                            Direction = sunVector,
                        };
                        drawArgs.device.SetLight(0, ref lLight);

                        drawArgs.device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Modulate);
                        drawArgs.device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Diffuse);
                        drawArgs.device.SetTextureStageState(0, TextureStage.ColorArg2, TextureArgument.Texture);
                    }
                    else
                    {
                        drawArgs.device.SetRenderState(RenderState.Lighting, false);
                        drawArgs.device.SetRenderState(RenderState.Ambient, World.Settings.StandardAmbientColor.ToArgb());
                    }

                    //if(m_vertices != null)
                    if (this.Fill)
                    {
                        if (this.primList.Count > 0)
                        {
                            drawArgs.device.VertexFormat = CustomVertex.PositionNormalColored.Format;
                            drawArgs.device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Disable);
                            for (int i = 0; i < this.primList.Count; i++)
                            {
                                int           vertexCount = 0;
                                PrimitiveType primType    = (PrimitiveType)this.primTypes[i];
                                CustomVertex.PositionNormalColored[] vertices = (CustomVertex.PositionNormalColored[]) this.primList[i];

                                if (primType == PrimitiveType.TriangleList)
                                {
                                    vertexCount = vertices.Length / 3;
                                }
                                else
                                {
                                    vertexCount = vertices.Length - 2;
                                }

                                drawArgs.device.DrawUserPrimitives(
                                    primType,//PrimitiveType.TriangleList,
                                    vertexCount,
                                    vertices);
                            }
                        }
                    }

                    if (this.m_lineFeature != null)
                    {
                        for (int i = 0; i < this.m_lineFeature.Length; i++)
                        {
                            if (this.m_lineFeature[i] != null)
                            {
                                this.m_lineFeature[i].Render(drawArgs);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.Write(ex);
                }
                finally
                {
                    // restore device state
                    drawArgs.device.SetTransform(TransformState.World, drawArgs.WorldCamera.WorldMatrix);
                    drawArgs.device.SetRenderState(RenderState.CullMode, currentCull);
                    drawArgs.device.SetRenderState(RenderState.ZEnable, currentZBufferEnable);
                }
            }
        }