internal static unsafe void Render() { if (m_cloudLayers.Count == 0) { return; } var immediateContext = MyImmediateRC.RC; immediateContext.VertexShader.Set(m_proxyVs); immediateContext.PixelShader.Set(m_cloudPs); immediateContext.SetInputLayout(m_proxyIL); immediateContext.SetRasterizerState(MyRasterizerStateManager.NocullRasterizerState); immediateContext.SetBlendState(MyBlendStateManager.BlendTransparent); immediateContext.SetDepthStencilState(MyDepthStencilStateManager.DepthTestReadOnly); var cb = MyCommon.GetObjectCB(sizeof(CloudsConstants)); immediateContext.AllShaderStages.SetConstantBuffer(1, cb); immediateContext.PixelShader.SetSamplers(0, MySamplerStateManager.CloudSampler); immediateContext.SetRtv(MyGBuffer.Main.DepthStencil, MyDepthStencilAccess.ReadOnly, MyGBuffer.Main.LBuffer); m_cloudLayers.OrderByDescending(x => { MyCloudLayer cloudLayer = x.Value; Vector3D cameraToLayer = cloudLayer.CenterPoint - MyRender11.Environment.Matrices.CameraPosition; Vector3D layerToCameraDirection = -Vector3D.Normalize(cameraToLayer); return((cameraToLayer + layerToCameraDirection * cloudLayer.Altitude).Length()); }); foreach (var cloudLayer in m_cloudLayers) { var modifiableData = m_modifiableCloudLayerData[cloudLayer.Key]; int currentGameplayFrame = MyRender11.GameplayFrameCounter; var increment = cloudLayer.Value.AngularVelocity * (float)(currentGameplayFrame - modifiableData.LastGameplayFrameUpdate) / 10.0f; modifiableData.RadiansAroundAxis += increment; // Constant for backward compatibility if (modifiableData.RadiansAroundAxis >= 2 * Math.PI) { modifiableData.RadiansAroundAxis -= 2 * Math.PI; } modifiableData.LastGameplayFrameUpdate = currentGameplayFrame; double scaledAltitude = cloudLayer.Value.Altitude; Vector3D centerPoint = cloudLayer.Value.CenterPoint; Vector3D cameraPosition = MyRender11.Environment.Matrices.CameraPosition; double cameraDistanceFromCenter = (centerPoint - cameraPosition).Length(); if (cloudLayer.Value.ScalingEnabled) { double threshold = cloudLayer.Value.Altitude * 0.95; if (cameraDistanceFromCenter > threshold) { scaledAltitude = MathHelper.Clamp(scaledAltitude * (1 - MathHelper.Clamp((cameraDistanceFromCenter - threshold) / (threshold * 1.5), 0.0, 1.0)), cloudLayer.Value.MinScaledAltitude, cloudLayer.Value.Altitude); } } MatrixD worldMatrix = MatrixD.CreateScale(scaledAltitude) * MatrixD.CreateFromAxisAngle(cloudLayer.Value.RotationAxis, (float)modifiableData.RadiansAroundAxis); worldMatrix.Translation = cloudLayer.Value.CenterPoint; worldMatrix.Translation -= MyRender11.Environment.Matrices.CameraPosition; float layerAlpha = 1.0f; double currentRelativeAltitude = (cameraDistanceFromCenter - cloudLayer.Value.MinScaledAltitude) / (cloudLayer.Value.MaxPlanetHillRadius - cloudLayer.Value.MinScaledAltitude); if (cloudLayer.Value.FadeOutRelativeAltitudeStart > cloudLayer.Value.FadeOutRelativeAltitudeEnd) { layerAlpha = (float)MathHelper.Clamp(1.0 - (cloudLayer.Value.FadeOutRelativeAltitudeStart - currentRelativeAltitude) / (cloudLayer.Value.FadeOutRelativeAltitudeStart - cloudLayer.Value.FadeOutRelativeAltitudeEnd), 0.0, 1.0); } else if (cloudLayer.Value.FadeOutRelativeAltitudeStart < cloudLayer.Value.FadeOutRelativeAltitudeEnd) { layerAlpha = (float)MathHelper.Clamp(1.0 - (currentRelativeAltitude - cloudLayer.Value.FadeOutRelativeAltitudeStart) / (cloudLayer.Value.FadeOutRelativeAltitudeEnd - cloudLayer.Value.FadeOutRelativeAltitudeStart), 0.0, 1.0); } Vector4 layerColor = new Vector4(1, 1, 1, layerAlpha); var constants = new CloudsConstants(); constants.World = MatrixD.Transpose(worldMatrix); constants.ViewProj = MatrixD.Transpose(MyRender11.Environment.Matrices.ViewProjectionAt0); constants.Color = layerColor; var mapping = MyMapping.MapDiscard(cb); mapping.WriteAndPosition(ref constants); mapping.Unmap(); MeshId sphereMesh = cloudLayer.Value.Mesh; LodMeshId lodMesh = MyMeshes.GetLodMesh(sphereMesh, 0); MyMeshBuffers buffers = lodMesh.Buffers; immediateContext.SetVertexBuffer(0, buffers.VB0.Buffer, buffers.VB0.Stride); immediateContext.SetVertexBuffer(1, buffers.VB1.Buffer, buffers.VB1.Stride); immediateContext.SetIndexBuffer(buffers.IB.Buffer, buffers.IB.Format); immediateContext.PixelShader.SetSrv(0, cloudLayer.Value.TextureInfo.ColorMetalTexture); immediateContext.PixelShader.SetSrv(1, cloudLayer.Value.TextureInfo.AlphaTexture); immediateContext.PixelShader.SetSrv(2, cloudLayer.Value.TextureInfo.NormalGlossTexture); immediateContext.DrawIndexed(lodMesh.Info.IndicesNum, 0, 0); } immediateContext.PixelShader.SetSrv(0, null); immediateContext.PixelShader.SetSrv(1, null); immediateContext.PixelShader.SetSrv(2, null); immediateContext.SetDepthStencilState(null); immediateContext.SetBlendState(null); immediateContext.SetRasterizerState(null); immediateContext.SetRtv(null); }
internal static unsafe void Render() { if (m_cloudLayers.Count == 0) return; var immediateContext = MyImmediateRC.RC; immediateContext.SetVS(m_proxyVs); immediateContext.SetPS(m_cloudPs); immediateContext.SetIL(m_proxyIL); immediateContext.SetRS(MyRender11.m_nocullRasterizerState); immediateContext.SetBS(MyRender11.BlendTransparent); immediateContext.SetDS(MyDepthStencilState.DepthTest); var cb = MyCommon.GetObjectCB(sizeof(CloudsConstants)); immediateContext.SetCB(1, cb); immediateContext.DeviceContext.PixelShader.SetSamplers(0, m_textureSampler); immediateContext.BindDepthRT(MyGBuffer.Main.Get(MyGbufferSlot.DepthStencil), DepthStencilAccess.ReadOnly, MyGBuffer.Main.Get(MyGbufferSlot.LBuffer)); m_cloudLayers.OrderByDescending(x => { MyCloudLayer cloudLayer = x.Value; Vector3D cameraToLayer = cloudLayer.CenterPoint - MyRender11.Environment.CameraPosition; Vector3D layerToCameraDirection = -Vector3D.Normalize(cameraToLayer); return (cameraToLayer + layerToCameraDirection * cloudLayer.Altitude).Length(); }); foreach (var cloudLayer in m_cloudLayers) { var modifiableData = m_modifiableCloudLayerData[cloudLayer.Key]; int currentGameplayFrame = MyRender11.Settings.GameplayFrame; var increment = cloudLayer.Value.AngularVelocity * (float)(currentGameplayFrame - modifiableData.LastGameplayFrameUpdate) / 10.0f; modifiableData.RadiansAroundAxis += increment; // Constant for backward compatibility if (modifiableData.RadiansAroundAxis >= 2 * Math.PI) modifiableData.RadiansAroundAxis -= 2 * Math.PI; modifiableData.LastGameplayFrameUpdate = currentGameplayFrame; double scaledAltitude = cloudLayer.Value.Altitude; Vector3D centerPoint = cloudLayer.Value.CenterPoint; Vector3D cameraPosition = MyRender11.Environment.CameraPosition; double cameraDistanceFromCenter = (centerPoint - cameraPosition).Length(); if (cloudLayer.Value.ScalingEnabled) { double threshold = cloudLayer.Value.Altitude * 0.95; if (cameraDistanceFromCenter > threshold) { scaledAltitude = MathHelper.Clamp(scaledAltitude * (1 - MathHelper.Clamp((cameraDistanceFromCenter - threshold) / (threshold * 1.5), 0.0, 1.0)), cloudLayer.Value.MinScaledAltitude, cloudLayer.Value.Altitude); } } MatrixD worldMatrix = MatrixD.CreateScale(scaledAltitude) * MatrixD.CreateFromAxisAngle(cloudLayer.Value.RotationAxis, (float)modifiableData.RadiansAroundAxis); worldMatrix.Translation = cloudLayer.Value.CenterPoint; worldMatrix.Translation -= MyRender11.Environment.CameraPosition; float layerAlpha = 1.0f; double currentRelativeAltitude = (cameraDistanceFromCenter - cloudLayer.Value.MinScaledAltitude) / (cloudLayer.Value.MaxPlanetHillRadius - cloudLayer.Value.MinScaledAltitude); if (cloudLayer.Value.FadeOutRelativeAltitudeStart > cloudLayer.Value.FadeOutRelativeAltitudeEnd) { layerAlpha = (float)MathHelper.Clamp(1.0 - (cloudLayer.Value.FadeOutRelativeAltitudeStart - currentRelativeAltitude) / (cloudLayer.Value.FadeOutRelativeAltitudeStart - cloudLayer.Value.FadeOutRelativeAltitudeEnd), 0.0, 1.0); } else if (cloudLayer.Value.FadeOutRelativeAltitudeStart < cloudLayer.Value.FadeOutRelativeAltitudeEnd) { layerAlpha = (float)MathHelper.Clamp(1.0 - (currentRelativeAltitude - cloudLayer.Value.FadeOutRelativeAltitudeStart) / (cloudLayer.Value.FadeOutRelativeAltitudeEnd - cloudLayer.Value.FadeOutRelativeAltitudeStart), 0.0, 1.0); } Vector4 layerColor = new Vector4(1, 1, 1, layerAlpha); var constants = new CloudsConstants(); constants.World = MatrixD.Transpose(worldMatrix); constants.ViewProj = MatrixD.Transpose(MyRender11.Environment.ViewProjectionAt0); constants.Color = layerColor; var mapping = MyMapping.MapDiscard(cb); mapping.WriteAndPosition(ref constants); mapping.Unmap(); MeshId sphereMesh = cloudLayer.Value.Mesh; LodMeshId lodMesh = MyMeshes.GetLodMesh(sphereMesh, 0); MyMeshBuffers buffers = lodMesh.Buffers; immediateContext.DeviceContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(buffers.VB0.Buffer, buffers.VB0.Stride, 0)); immediateContext.DeviceContext.InputAssembler.SetVertexBuffers(1, new VertexBufferBinding(buffers.VB1.Buffer, buffers.VB1.Stride, 0)); immediateContext.SetIB(buffers.IB.Buffer, buffers.IB.Format); immediateContext.DeviceContext.PixelShader.SetShaderResource(0, MyTextures.GetView(cloudLayer.Value.TextureInfo.ColorMetalTexture)); immediateContext.DeviceContext.PixelShader.SetShaderResource(1, MyTextures.GetView(cloudLayer.Value.TextureInfo.AlphaTexture)); immediateContext.DeviceContext.PixelShader.SetShaderResource(2, MyTextures.GetView(cloudLayer.Value.TextureInfo.NormalGlossTexture)); immediateContext.DeviceContext.DrawIndexed(lodMesh.Info.IndicesNum, 0, 0); } immediateContext.DeviceContext.PixelShader.SetShaderResource(0, null); immediateContext.DeviceContext.PixelShader.SetShaderResource(1, null); immediateContext.DeviceContext.PixelShader.SetShaderResource(2, null); immediateContext.SetDS(null); immediateContext.SetBS(null); immediateContext.SetRS(null); }