internal static void BindProxyGeometry(MyRenderableProxy proxy, MyRenderContext rc) { MyMeshBuffers buffers = proxy.Mesh.Buffers; rc.SetVertexBuffer(0, buffers.VB0); rc.SetVertexBuffer(1, buffers.VB1); if (proxy.InstancingEnabled && proxy.Instancing.VB != null) { rc.SetVertexBuffer(2, proxy.Instancing.VB); } rc.SetIndexBuffer(buffers.IB); }
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); }