public override void Render(RenderContext context, DeviceContextProxy deviceContext) { if (!NeedRender) { modelStruct.HasShadowMap = 0; modelCB.Upload(deviceContext, ref modelStruct); return; } OnUpdateLightSource?.Invoke(this, new UpdateLightSourceEventArgs(context)); ++currentFrame; currentFrame %= Math.Max(1, UpdateFrequency); if (!FoundLightSource || currentFrame != 0) { return; } if (resolutionChanged) { RemoveAndDispose(ref viewResource); viewResource = new ShaderResourceViewProxy(Device, ShadowMapTextureDesc); viewResource.CreateView(DepthStencilViewDesc); viewResource.CreateView(ShaderResourceViewDesc); resolutionChanged = false; } deviceContext.ClearDepthStencilView(viewResource, DepthStencilClearFlags.Depth, 1.0f, 0); var orgFrustum = context.BoundingFrustum; var frustum = new BoundingFrustum(LightView * LightProjection); context.BoundingFrustum = frustum; #if !TEST deviceContext.SetViewport(0, 0, Width, Height); deviceContext.SetDepthStencil(viewResource.DepthStencilView); modelStruct.HasShadowMap = context.RenderHost.IsShadowMapEnabled ? 1 : 0; modelCB.Upload(deviceContext, ref modelStruct); for (var i = 0; i < context.RenderHost.PerFrameOpaqueNodes.Count; ++i) { //Only support opaque object for throwing shadows. var core = context.RenderHost.PerFrameOpaqueNodes[i]; if (core.RenderCore.IsThrowingShadow && core.TestViewFrustum(ref frustum)) { core.RenderShadow(context, deviceContext); } } context.BoundingFrustum = orgFrustum; context.RenderHost.SetDefaultRenderTargets(false); context.SharedResource.ShadowView = viewResource; #endif }
protected override void OnRender(RenderContext renderContext, DeviceContextProxy deviceContext) { if (needsAssignVariables) { lock (clipParamCB) { if (needsAssignVariables) { clipParamCB.WriteValueByName(ClipPlaneStruct.CuttingOperationStr, (int)cuttingOperation); clipParamCB.WriteValueByName(ClipPlaneStruct.CrossSectionColorStr, sectionColor); clipParamCB.WriteValueByName(ClipPlaneStruct.EnableCrossPlaneStr, planeEnabled); clipParamCB.WriteValueByName(ClipPlaneStruct.EnableCrossPlane5To8Str, plane5To8Enabled); clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane1ParamsStr, plane1Params); clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane2ParamsStr, plane2Params); clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane3ParamsStr, plane3Params); clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane4ParamsStr, plane4Params); clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane5ParamsStr, plane5Params); clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane6ParamsStr, plane6Params); clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane7ParamsStr, plane7Params); clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane8ParamsStr, plane8Params); needsAssignVariables = false; } } } clipParamCB.Upload(deviceContext); base.OnRender(renderContext, deviceContext); // Draw backface into stencil buffer var dsView = renderContext.RenderHost.DepthStencilBufferView; deviceContext.ClearDepthStencilView(dsView, DepthStencilClearFlags.Stencil, 0, 0); deviceContext.SetDepthStencil(dsView);//Remove render target deviceContext.SetRasterState(backfaceRasterState); drawBackfacePass.BindShader(deviceContext); drawBackfacePass.BindStates(deviceContext, StateType.BlendState | StateType.DepthStencilState); DrawIndexed(deviceContext, GeometryBuffer.IndexBuffer, InstanceBuffer); //Draw full screen quad to fill cross section deviceContext.SetRasterState(RasterState); drawScreenQuadPass.BindShader(deviceContext); drawScreenQuadPass.BindStates(deviceContext, StateType.BlendState | StateType.DepthStencilState); renderContext.RenderHost.SetDefaultRenderTargets(false);//Rebind render target deviceContext.Draw(4, 0); }