public override void Render(RenderContext context, DeviceContextProxy deviceContext) { if (!enableReflector) { return; } if (CreateCubeMapResources()) { RaiseInvalidateRender(); return; // Skip this frame if texture resized to reduce latency. } else if(!(IsDynamicScene || context.UpdateSceneGraphRequested || context.UpdatePerFrameRenderableRequested)) { return; } context.IsInvertCullMode = true; var camLook = Vector3.Normalize(context.Camera.LookDirection); Exception exception = null; #if TEST for (int index = 0; index < 6; ++index) #else Parallel.For(0, 6, (index) => #endif { try { var ctx = contextPool.Get(); ctx.ClearRenderTargetView(cubeRTVs[index], context.RenderHost.ClearColor); ctx.ClearDepthStencilView(cubeDSVs[index], DepthStencilClearFlags.Depth, 1, 0); ctx.SetRenderTarget(cubeDSVs[index], cubeRTVs[index]); ctx.SetViewport(ref viewport); ctx.SetScissorRectangle(0, 0, FaceSize, FaceSize); var transforms = new GlobalTransformStruct(); transforms.Projection = cubeFaceCameras.Cameras[index].Projection; transforms.View = cubeFaceCameras.Cameras[index].View; transforms.Viewport = new Vector4(FaceSize, FaceSize, 1/FaceSize, 1/FaceSize); transforms.ViewProjection = transforms.View * transforms.Projection; modelCB.Upload(ctx, ref transforms); var frustum = new BoundingFrustum(transforms.ViewProjection); //Render opaque for (int i = 0; i < context.RenderHost.PerFrameOpaqueNodes.Count; ++i) { var node = context.RenderHost.PerFrameOpaqueNodes[i]; if (node.GUID != this.GUID && !IgnoredGuid.Contains(node.GUID) && node.TestViewFrustum(ref frustum)) { node.Render(context, ctx); } } //Render particle for (int i = 0; i < context.RenderHost.PerFrameParticleNodes.Count; ++i) { var node = context.RenderHost.PerFrameParticleNodes[i]; if (node.GUID != this.GUID && !IgnoredGuid.Contains(node.GUID) && node.TestViewFrustum(ref frustum)) { node.Render(context, ctx); } } commands[index] = ctx.FinishCommandList(true); contextPool.Put(ctx); } catch(Exception ex) { exception = ex; } } #if !TEST ); #endif context.IsInvertCullMode = false; if (exception != null) { throw exception; } for (int i = 0; i < commands.Length; ++i) { if (commands[i] != null) { Device.ImmediateContext.ExecuteCommandList(commands[i], true); Disposer.RemoveAndDispose(ref commands[i]); } } deviceContext.GenerateMips(CubeMap); context.UpdatePerFrameData(true, false, deviceContext); }
protected override void OnRender(RenderContext context, DeviceContextProxy deviceContext) { if (CreateCubeMapResources()) { InvalidateRenderer(); return; // Skip this frame if texture resized to reduce latency. } context.IsInvertCullMode = true; #if TEST for (int index = 0; index < 6; ++index) #else Parallel.For(0, 6, (index) => #endif { var ctx = contextPool.Get(); ctx.ClearRenderTargetView(cubeRTVs[index], context.RenderHost.ClearColor); ctx.ClearDepthStencilView(cubeDSVs[index], DepthStencilClearFlags.Depth, 1, 0); ctx.SetRenderTarget(cubeDSVs[index], cubeRTVs[index]); ctx.SetViewport(ref viewport); ctx.SetScissorRectangle(0, 0, FaceSize, FaceSize); var transforms = new GlobalTransformStruct(); transforms.Projection = cubeFaceCameras.Cameras[index].Projection; transforms.View = cubeFaceCameras.Cameras[index].View; transforms.Viewport = new Vector4(FaceSize, FaceSize, 1/FaceSize, 1/FaceSize); transforms.ViewProjection = transforms.View * transforms.Projection; ModelConstBuffer.UploadDataToBuffer(ctx, ref transforms); var frustum = new BoundingFrustum(transforms.ViewProjection); //Render opaque for (int i = 0; i < context.RenderHost.PerFrameOpaqueNodes.Count; ++i) { var node = context.RenderHost.PerFrameOpaqueNodes[i]; if (node.GUID != this.GUID && !IgnoredGuid.Contains(node.GUID) && node.TestViewFrustum(ref frustum)) { node.Render(context, ctx); } } //Render particle for (int i = 0; i < context.RenderHost.PerFrameParticleNodes.Count; ++i) { var node = context.RenderHost.PerFrameParticleNodes[i]; if (node.GUID != this.GUID && !IgnoredGuid.Contains(node.GUID) && node.TestViewFrustum(ref frustum)) { node.Render(context, ctx); } } commands[index] = ctx.FinishCommandList(false); contextPool.Put(ctx); } #if !TEST ); #endif context.IsInvertCullMode = false; for (int i = 0; i < commands.Length; ++i) { Device.ImmediateContext.ExecuteCommandList(commands[i], true); commands[i].Dispose(); } deviceContext.GenerateMips(CubeMap); context.UpdatePerFrameData(true, false, deviceContext); }