/// <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); } }
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; } } }
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); } } }