protected override void DrawScene() { DeviceContext.OutputMerger.DepthStencilState = null; DeviceContext.OutputMerger.BlendState = null; DeviceContext.Rasterizer.State = GetRasterizerState(); var carNode = CarNode; // draw a scene, apart from car if (ShowroomNode != null) { DeviceContext.OutputMerger.DepthStencilState = DeviceContextHolder.States.LessEqualDepthState; ShowroomNode.Draw(DeviceContextHolder, ActualCamera, SpecialRenderMode.Simple); DeviceContext.OutputMerger.DepthStencilState = DeviceContextHolder.States.ReadOnlyDepthState; ShowroomNode.Draw(DeviceContextHolder, ActualCamera, SpecialRenderMode.SimpleTransparent); } // draw car if (carNode == null) { return; } // shadows carNode.DrawAmbientShadows(DeviceContextHolder, ActualCamera); // car itself DeviceContext.OutputMerger.DepthStencilState = DeviceContextHolder.States.LessEqualDepthState; carNode.Draw(DeviceContextHolder, ActualCamera, SpecialRenderMode.Simple); DeviceContext.OutputMerger.DepthStencilState = DeviceContextHolder.States.ReadOnlyDepthState; carNode.Draw(DeviceContextHolder, ActualCamera, SpecialRenderMode.SimpleTransparent); }
public Kn5 GetKn5(IKn5RenderableObject obj) { if (ShowroomNode != null && ShowroomNode.GetAllChildren().Contains(obj)) { return(ShowroomNode.OriginalFile); } return(CarNode?.GetKn5(obj)); }
private Kn5Material GetMaterial(IKn5RenderableObject obj) { if (ShowroomNode != null && ShowroomNode.GetAllChildren().Contains(obj)) { return(ShowroomNode.OriginalFile.GetMaterial(obj.OriginalNode.MaterialId)); } return(CarNode?.GetMaterial(obj)); }
public Kn5 GetKn5(IKn5RenderableObject obj) { if (ShowroomNode != null && ShowroomNode.GetAllChildren().Contains(obj)) { return(ShowroomNode.OriginalFile); } return((from carSlot in CarSlots where carSlot.CarNode?.ContainsNode(obj) == true select carSlot.CarNode?.GetKn5(obj)).FirstOrDefault()); }
private Kn5Material GetMaterial(IKn5RenderableObject obj) { if (ShowroomNode != null && ShowroomNode.GetAllChildren().Contains(obj)) { return(ShowroomNode.OriginalFile.GetMaterial(obj.OriginalNode.MaterialId)); } return((from carSlot in CarSlots where carSlot.CarNode?.ContainsNode(obj) == true select carSlot.CarNode?.GetMaterial(obj)).FirstOrDefault()); }
public override void DrawSceneForShadows(DeviceContextHolder holder, ICamera camera) { ShowroomNode?.Draw(holder, camera, SpecialRenderMode.Shadow); CarNode?.Draw(holder, camera, SpecialRenderMode.Shadow); }
protected override void DrawSceneToBuffer() { if (!UseSslr && !UseAo) { base.DrawSceneToBuffer(); return; } DrawPrepare(); if (_sslrHelper == null) { _sslrHelper = DeviceContextHolder.GetHelper <DarkSslrHelper>(); } if (_blurHelper == null) { _blurHelper = DeviceContextHolder.GetHelper <BlurHelper>(); } // Draw scene to G-buffer to get normals, depth and base reflection DeviceContext.Rasterizer.SetViewports(Viewport); DeviceContext.OutputMerger.SetTargets(DepthStencilView, _sslrBufferBaseReflection?.TargetView, _gBufferNormals.TargetView, _gBufferDepth.TargetView); DeviceContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); DeviceContext.ClearRenderTargetView(_gBufferNormals.TargetView, (Color4) new Vector4(0.5f)); if (_sslrBufferBaseReflection != null) { DeviceContext.ClearRenderTargetView(_sslrBufferBaseReflection.TargetView, (Color4) new Vector4(0)); } DeviceContext.ClearRenderTargetView(_gBufferDepth.TargetView, (Color4) new Vector4(1f)); DeviceContext.OutputMerger.DepthStencilState = null; DeviceContext.OutputMerger.BlendState = null; DeviceContext.Rasterizer.State = null; if (ShowroomNode != null) { ShowroomNode.Draw(DeviceContextHolder, ActualCamera, SpecialRenderMode.GBuffer); } else { if (_mirror != null) { if (FlatMirror && !FlatMirrorBlurred) { _mirror.DrawReflection(DeviceContextHolder, ActualCamera, SpecialRenderMode.GBuffer); } else { _mirror.Draw(DeviceContextHolder, ActualCamera, SpecialRenderMode.GBuffer); } } } CarNode?.Draw(DeviceContextHolder, ActualCamera, SpecialRenderMode.GBuffer); // AO? if (UseAo) { var aoHelper = _aoHelper; if (aoHelper == null) { aoHelper = _aoHelper = GetAoHelper(); } if (AoType == AoType.Hbao) { UseSslr = true; SetInnerBuffer(_sslrBufferScene); DrawPreparedSceneToBuffer(); (aoHelper as HbaoHelper)?.Prepare(DeviceContextHolder, _sslrBufferScene.View); SetInnerBuffer(null); } aoHelper.Draw(DeviceContextHolder, _gBufferDepth.View, _gBufferNormals.View, ActualCamera, _aoBuffer.TargetView); aoHelper.Blur(DeviceContextHolder, _aoBuffer, InnerBuffer, Camera); var effect = Effect; effect.FxAoMap.SetResource(_aoBuffer.View); Effect.FxAoPower.Set(AoOpacity); effect.FxScreenSize.Set(new Vector4(Width, Height, 1f / Width, 1f / Height)); if (AoDebug) { DeviceContextHolder.GetHelper <CopyHelper>().Draw(DeviceContextHolder, _aoBuffer.View, InnerBuffer.TargetView); return; } } if (UseSslr && _sslrBufferBaseReflection != null) { // Draw actual scene to _sslrBufferScene SetInnerBuffer(_sslrBufferScene); DrawPreparedSceneToBuffer(); SetInnerBuffer(null); // Prepare SSLR and combine buffers #if SSLR_PARAMETRIZED if (_sslrParamsChanged) { _sslrParamsChanged = false; var effect = DeviceContextHolder.GetEffect <EffectPpDarkSslr>(); effect.FxStartFrom.Set(_sslrStartFrom); effect.FxFixMultiplier.Set(_sslrFixMultiplier); effect.FxOffset.Set(_sslrOffset); effect.FxGlowFix.Set(_sslrGrowFix); effect.FxDistanceThreshold.Set(_sslrDistanceThreshold); } #endif _sslrHelper.Draw(DeviceContextHolder, _gBufferDepth.View, _sslrBufferBaseReflection.View, _gBufferNormals.View, ActualCamera, _sslrBufferResult.TargetView); _blurHelper.BlurDarkSslr(DeviceContextHolder, _sslrBufferResult, InnerBuffer, (float)(2f * ResolutionMultiplier)); _sslrHelper.FinalStep(DeviceContextHolder, _sslrBufferScene.View, _sslrBufferResult.View, _sslrBufferBaseReflection.View, _gBufferNormals.View, ActualCamera, InnerBuffer.TargetView); } else { DrawPreparedSceneToBuffer(); } }
protected override void DrawScene() { // TODO: support more than one car? var effect = Effect; DeviceContext.OutputMerger.DepthStencilState = null; DeviceContext.OutputMerger.BlendState = null; DeviceContext.Rasterizer.State = GetRasterizerState(); var carNode = CarNode; // draw reflection if needed if (ShowroomNode == null && FlatMirror && _mirror != null) { effect.FxLightDir.Set(new Vector3(_light.X, -_light.Y, _light.Z)); if (FlatMirrorBlurred) { DeviceContext.ClearDepthStencilView(_mirrorDepthBuffer.DepthView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); DeviceContext.ClearRenderTargetView(_mirrorBuffer.TargetView, (Color4)BackgroundColor * BackgroundBrightness); DeviceContext.OutputMerger.SetTargets(_mirrorDepthBuffer.DepthView, _mirrorBuffer.TargetView); DrawMirror(); DeviceContext.Rasterizer.SetViewports(OutputViewport); if (UseFxaa) { DeviceContextHolder.GetHelper <FxaaHelper>().Draw(DeviceContextHolder, _mirrorBuffer.View, _mirrorBlurBuffer.TargetView); DeviceContextHolder.GetHelper <BlurHelper>() .BlurFlatMirror(DeviceContextHolder, _mirrorBlurBuffer, _temporaryBuffer, ActualCamera.ViewProjInvert, _mirrorDepthBuffer.View, 60f); } else { DeviceContextHolder.GetHelper <BlurHelper>() .BlurFlatMirror(DeviceContextHolder, _mirrorBuffer, _temporaryBuffer, ActualCamera.ViewProjInvert, _mirrorDepthBuffer.View, 60f, target: _mirrorBlurBuffer); } DeviceContextHolder.GetHelper <BlurHelper>() .BlurFlatMirror(DeviceContextHolder, _mirrorBlurBuffer, _temporaryBuffer, ActualCamera.ViewProjInvert, _mirrorDepthBuffer.View, 12f); DeviceContext.Rasterizer.SetViewports(Viewport); DeviceContext.OutputMerger.SetTargets(DepthStencilView, InnerBuffer.TargetView); } else { DrawMirror(); } effect.FxLightDir.Set(_light); } // draw a scene, apart from car if (ShowroomNode != null) { if (CubemapAmbient != 0f) { effect.FxCubemapAmbient.Set(0f); } DeviceContext.OutputMerger.DepthStencilState = DeviceContextHolder.States.LessEqualDepthState; ShowroomNode.Draw(DeviceContextHolder, ActualCamera, SpecialRenderMode.Simple); DeviceContext.OutputMerger.DepthStencilState = DeviceContextHolder.States.ReadOnlyDepthState; ShowroomNode.Draw(DeviceContextHolder, ActualCamera, SpecialRenderMode.SimpleTransparent); if (CubemapAmbient != 0f) { effect.FxCubemapAmbient.Set(FxCubemapAmbientValue); } } else { // draw a mirror if (_mirror != null) { if (!FlatMirror) { _mirror.SetMode(DeviceContextHolder, FlatMirrorMode.BackgroundGround); _mirror.Draw(DeviceContextHolder, ActualCamera, SpecialRenderMode.Simple); } else if (FlatMirrorBlurred && _mirrorBuffer != null) { effect.FxScreenSize.Set(new Vector4(Width, Height, 1f / Width, 1f / Height)); // _effect.FxWorldViewProjInv.SetMatrix(ActualCamera.ViewProjInvert); _mirror.SetMode(DeviceContextHolder, FlatMirrorMode.TextureMirror); _mirror.Draw(DeviceContextHolder, ActualCamera, _mirrorBlurBuffer.View, null, null); } else { _mirror.SetMode(DeviceContextHolder, FlatMirrorMode.TransparentMirror); _mirror.Draw(DeviceContextHolder, ActualCamera, SpecialRenderMode.SimpleTransparent); } } } // draw car if (carNode == null) { return; } // shadows carNode.DrawAmbientShadows(DeviceContextHolder, ActualCamera); // car itself DeviceContext.OutputMerger.DepthStencilState = DeviceContextHolder.States.LessEqualDepthState; carNode.Draw(DeviceContextHolder, ActualCamera, SpecialRenderMode.Simple); DeviceContext.OutputMerger.DepthStencilState = DeviceContextHolder.States.ReadOnlyDepthState; carNode.Draw(DeviceContextHolder, ActualCamera, SpecialRenderMode.SimpleTransparent); // debug stuff if (SuspensionDebug) { carNode.DrawSuspensionDebugStuff(DeviceContextHolder, ActualCamera); } if (carNode.IsColliderVisible) { carNode.DrawCollidersDebugStuff(DeviceContextHolder, ActualCamera); } }