private void PreparePcss(ShadowsDirectional shadows) { if (_pcssParamsSet) { return; } _pcssParamsSet = true; var splits = new Vector4[shadows.Splits.Length]; var sceneScale = (ShowroomNode == null ? 1f : 2f) * PcssSceneScale; var lightScale = PcssLightScale; for (var i = 0; i < shadows.Splits.Length; i++) { splits[i] = new Vector4(sceneScale / shadows.Splits[i].Size, lightScale / shadows.Splits[i].Size, 0, 0); } var effect = Effect; effect.FxPcssScale.Set(splits); if (!_pcssNoiseMapSet) { _pcssNoiseMapSet = true; effect.FxNoiseMap.SetResource(DeviceContextHolder.GetRandomTexture(16, 16)); } }
protected override void UpdateShadows(ShadowsDirectional shadows, Vector3 center) { _pcssParamsSet = false; var splits = GetShadowsNumSplits(); if (splits == null) { // everything is shadowed _numSplits = -1; } else { shadows.SetSplits(DeviceContextHolder, GetSplits(splits.Value, CarNode?.BoundingBox?.GetSize().Length() ?? 4f)); shadows.SetMapSize(DeviceContextHolder, ShadowMapSize); base.UpdateShadows(shadows, center); _numSplits = splits.Value; var effect = Effect; effect.FxShadowMapSize.Set(new Vector2(ShadowMapSize, 1f / ShadowMapSize)); effect.FxShadowMaps.SetResourceArray(shadows.Splits.Take(splits.Value).Select(x => x.View).ToArray()); effect.FxShadowViewProj.SetMatrixArray( shadows.Splits.Take(splits.Value).Select(x => x.ShadowTransform).ToArray()); } }
protected override ShadowsDirectional CreateShadows() { var splits = GetShadowsNumSplits(); _shadows = new ShadowsDirectional(ShadowMapSize, GetSplits(splits ?? 1, splits.HasValue ? CarNode?.BoundingBox?.GetSize().Length() ?? 4f : 1000f)); return(_shadows); }
protected override void InitializeInner() { base.InitializeInner(); DeviceContextHolder.Set(GetMaterialsFactory()); if (_showroomKn5Filename != null) { ShowroomNode = LoadShowroom(_showroomKn5Filename); Scene.Insert(0, ShowroomNode); } _carWrapper = new RenderableList(); Scene.Add(_carWrapper); if (_car != null) { var carNode = new Kn5RenderableCar(_car, Matrix.Identity, _selectSkinLater ? _selectSkin : Kn5RenderableCar.DefaultSkin, asyncTexturesLoading: AsyncTexturesLoading, asyncOverrideTexturesLoading: AsyncOverridesLoading, allowSkinnedObjects: AllowSkinnedObjects); CarNode = carNode; CopyValues(carNode, null); _selectSkinLater = false; _carWrapper.Add(carNode); _carBoundingBox = null; ExtendCar(CarNode, _carWrapper); } // Scene.Add(new Kn5RenderableFile(Kn5.FromFile(_carKn5), Matrix.Identity)); Scene.UpdateBoundingBox(); _reflectionCubemap?.Initialize(DeviceContextHolder); if (EnableShadows) { _shadows = CreateShadows(); _shadows?.Initialize(DeviceContextHolder); } if (Camera == null) { Camera = CreateCamera(CarNode); _resetCamera = (CameraOrbit)Camera.Clone(); PrepareCamera(Camera); } DeviceContextHolder.SceneUpdated += OnSceneUpdated; DeviceContextHolder.TexturesUpdated += OnTexturesUpdated; }
protected virtual void UpdateShadows(ShadowsDirectional shadows, Vector3 center) { _previousShadowsTarget = center; if (!EnableShadows) { shadows.Clear(DeviceContextHolder); } else { shadows.Update(-Light, center); shadows.DrawScene(DeviceContextHolder, this); } }
protected override void InitializeInner() { base.InitializeInner(); DeviceContextHolder.Set <IMaterialsFactory>(new MaterialsProviderSimple()); if (_showroom != null) { var kn5 = Kn5.FromFile(_showroom.Kn5Filename); Scene.Insert(0, new Kn5RenderableFile(kn5, Matrix.Identity)); } _carWrapper = new RenderableList(); Scene.Add(_carWrapper); if (_car != null) { var kn5 = Kn5.FromFile(FileUtils.GetMainCarFilename(_car.Location)); CarNode = new Kn5RenderableCar(kn5, _car.Location, Matrix.Identity, _selectSkinLater ? _selectSkin : Kn5RenderableCar.DefaultSkin); _selectSkinLater = false; _carWrapper.Add(CarNode); var reflection = new FlatMirror(CarNode, new Plane(Vector3.Zero, Vector3.UnitY)); _carWrapper.Add(reflection); } Scene.UpdateBoundingBox(); if (CubemapReflection) { _reflectionCubemap = new ReflectionCubemap(1024); _reflectionCubemap.Initialize(DeviceContextHolder); } if (EffectDarkMaterial.EnableShadows) { _shadows = new ShadowsDirectional(2048, new[] { 5f }); _shadows.Initialize(DeviceContextHolder); } if (Camera == null) { Camera = CreateCamera(CarNode); _resetCamera = (CameraOrbit)Camera.Clone(); } }
protected override void InitializeInner() { _deferredLighting = DeviceContextHolder.GetEffect <EffectDeferredLight>(); _deferredResult = DeviceContextHolder.GetEffect <EffectDeferredResult>(); _ppBasic = DeviceContextHolder.GetEffect <EffectPpBasic>(); _gDepthBuffer = TargetResourceDepthTexture.Create(); _gBufferBase = TargetResourceTexture.Create(Format.R16G16B16A16_Float); _gBufferNormal = TargetResourceTexture.Create(Format.R32G32B32A32_Float); _gBufferMaps = TargetResourceTexture.Create(Format.R8G8B8A8_UNorm); _temporaryDepthBuffer = TargetResourceDepthTexture.Create(); _temporaryBuffer0 = TargetResourceTexture.Create(Format.R16G16B16A16_Float); _temporaryBuffer1 = TargetResourceTexture.Create(Format.R16G16B16A16_Float); _temporaryBuffer2 = TargetResourceTexture.Create(Format.R16G16B16A16_Float); _temporaryBuffer3 = TargetResourceTexture.Create(Format.R16G16B16A16_Float); _outputBuffer = TargetResourceTexture.Create(Format.R8G8B8A8_UNorm); _reflectionCubemap = new ReflectionCubemap(1024); _reflectionCubemap.Initialize(DeviceContextHolder); _sunShadows = new ShadowsDirectional(2048); _sunShadows.Initialize(DeviceContextHolder); }
protected virtual void DrawPrepareEffect(Vector3 eyesPosition, Vector3 light, [CanBeNull] ShadowsDirectional shadows, [CanBeNull] ReflectionCubemap reflection) { DeviceContextHolder.GetEffect <EffectSimpleMaterial>().FxEyePosW.Set(ActualCamera.Position); }
protected override void DrawPrepareEffect(Vector3 eyesPosition, Vector3 light, ShadowsDirectional shadows, ReflectionCubemap reflection) { var effect = Effect; effect.FxEyePosW.Set(eyesPosition); _light = light; effect.FxLightDir.Set(light); effect.FxLightColor.Set(LightColor.ToVector3() * LightBrightness); effect.FxReflectionPower.Set(MaterialsReflectiveness); effect.FxCubemapReflections.Set(reflection != null); effect.FxCubemapAmbient.Set(reflection == null ? 0f : FxCubemapAmbientValue); // shadows var useShadows = EnableShadows && shadows != null; effect.FxNumSplits.Set(useShadows ? _numSplits : 0); if (useShadows) { effect.FxPcssEnabled.Set(UsePcss); if (UsePcss) { PreparePcss(shadows); } } // colors effect.FxAmbientDown.Set(AmbientDown.ToVector3() * AmbientBrightness); effect.FxAmbientRange.Set((AmbientUp.ToVector3() - AmbientDown.ToVector3()) * AmbientBrightness); effect.FxBackgroundColor.Set(BackgroundColor.ToVector3() * BackgroundBrightness); // flat mirror if (FlatMirror && ShowroomNode == null) { effect.FxFlatMirrorPower.Set(FlatMirrorReflectiveness); } if (reflection != null) { effect.FxReflectionCubemap.SetResource(reflection.View); } }