public bool OverrideTexture(string textureName, byte[] textureBytes) { if (CarNode == null) { return(true); } return(CarNode.OverrideTexture(DeviceContextHolder, textureName, textureBytes)); }
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)); }
protected override void DisposeOverride() { DisposeHelper.Dispose(ref _blendState); DisposeHelper.Dispose(ref _summBuffer); DisposeHelper.Dispose(ref _tempBuffer); DisposeHelper.Dispose(ref _shadowBuffer); CarNode.Dispose(); Scene.Dispose(); base.DisposeOverride(); }
public void FitAmbientShadowSize() { if (CarNode == null) { return; } CarNode.FitAmbientShadowSize(); OnPropertyChanged(nameof(AmbientShadowWidth)); OnPropertyChanged(nameof(AmbientShadowLength)); AmbientShadowSizeChanged = true; }
public void Shot(string outputDirectory, [CanBeNull] IProgress <double> progress, CancellationToken cancellation) { if (!Initialized) { Initialize(); } using (var replacement = FileUtils.RecycleOriginal(Path.Combine(outputDirectory, "body_shadow.png"))) { // body shadow PrepareBuffers(BodySize + BodyPadding * 2, 1024); SetBodyShadowCamera(); Draw(BodyMultipler, BodySize, BodyPadding, Fade ? 0.5f : 0f, progress.Subrange(0.01, 0.59), cancellation); if (cancellation.IsCancellationRequested) { return; } SaveResultAs(replacement.Filename, BodySize, BodyPadding); } // wheels shadows PrepareBuffers(WheelSize + WheelPadding * 2, 128); SetWheelShadowCamera(); _wheelMode = true; var nodes = new[] { "WHEEL_LF", "WHEEL_RF", "WHEEL_LR", "WHEEL_RR" }; foreach (var entry in nodes.Select(x => CarNode.GetDummyByName(x)).NonNull().Select((x, i) => new { Node = x, Matrix = Matrix.Translation(-(CarData?.GetWheelGraphicOffset(x.Name) ?? Vector3.Zero) + new Vector3(0f, x.Matrix.GetTranslationVector().Y - (x.BoundingBox?.Minimum.Y ?? 0f), 0f)), FileName = $"tyre_{i}_shadow.png", Progress = progress.Subrange(0.6 + i * 0.1, 0.099) })) { using (var replacement = FileUtils.RecycleOriginal(Path.Combine(outputDirectory, entry.FileName))) { Scene.Clear(); _flattenNodes = null; Scene.Add(entry.Node); entry.Node.LocalMatrix = entry.Matrix; Scene.UpdateBoundingBox(); Draw(WheelMultipler, WheelSize, WheelPadding, 1f, entry.Progress, cancellation); if (cancellation.IsCancellationRequested) { return; } SaveResultAs(replacement.Filename, WheelSize, WheelPadding); } } }
public void SelectSkin(string skinId) { if (CarNode == null) { _selectSkinLater = true; _selectSkin = skinId; } else { CarNode?.SelectSkin(DeviceContextHolder, skinId); } }
public void NextExtraCamera() { var cameras = CarNode?.GetCamerasCount(); if (!cameras.HasValue || cameras == 0) { CurrentExtraCamera = null; } else { CurrentExtraCamera = CurrentExtraCamera.HasValue ? (CurrentExtraCamera.Value + 1) % cameras : 0; } }
protected override void OnTick(float dt) { base.OnTick(dt); CarNode?.OnTick(dt * AnimationsMultipler); const float threshold = 0.001f; if (_resetState > threshold) { if (!AutoRotate) { _resetState = 0f; return; } _resetState += (-0f - _resetState) / 10f; if (_resetState <= threshold) { AutoRotate = false; } var cam = CameraOrbit; if (cam != null) { cam.Alpha += (_resetCamera.Alpha - cam.Alpha) / 10f; cam.Beta += (_resetCamera.Beta - cam.Beta) / 10f; cam.Radius += (_resetCamera.Radius - cam.Radius) / 10f; cam.FovY += (_resetCamera.FovY - cam.FovY) / 10f; cam.SetLens(cam.Aspect); } _elapsedCamera = 0f; IsDirty = true; } else if (AutoRotate && CameraOrbit != null) { CameraOrbit.Alpha -= dt * 0.29f; CameraOrbit.Beta += (MathF.Sin(_elapsedCamera * 0.39f) * 0.2f + 0.15f - CameraOrbit.Beta) / 10f; _elapsedCamera += dt; IsDirty = true; } if (AutoAdjustTarget && CameraOrbit != null) { var t = AutoAdjustedTarget; CameraOrbit.Target += (t - CameraOrbit.Target) / 3f; } }
protected override void DisposeOverride() { DisposeHelper.Dispose(ref _summBlendState); DisposeHelper.Dispose(ref _bakedBlendState); DisposeHelper.Dispose(ref _bufferFSumm); DisposeHelper.Dispose(ref _bufferF1); DisposeHelper.Dispose(ref _bufferF2); DisposeHelper.Dispose(ref _bufferA); DisposeHelper.Dispose(ref _shadowBuffer); DisposeHelper.Dispose(ref _rasterizerState); CarNode.Dispose(); Scene.Dispose(); base.DisposeOverride(); }
public bool OverrideTexture(string textureName, PaintShopSource source) { if (source?.Custom != true) { return(CarNode == null || CarNode.OverrideTexture(DeviceContextHolder, textureName, GetBytes(source))); } if (source.UseInput) { source = new PaintShopSource(textureName).SetFrom(source); } var original = GetOriginal(ref _override, source, OptionMaxMapSize); return(original != null && OverrideTexture(textureName, OverrideAction(original), OptionMaxMapSize)); }
private void SwitchCamera(int?cameraId) { var camera = cameraId == null ? null : CarNode?.GetCamera(cameraId.Value); if (camera == null) { UseFpsCamera = false; return; } UseFpsCamera = true; Camera = camera; Camera.SetLens(AspectRatio); PrepareCamera(Camera); }
private void reachedDestination() { if (currentNode.nextWaypoint == null) { currentNode = currentNode.previousWaypont; return; } if (currentNode.previousWaypont == null) { currentNode = currentNode.nextWaypoint; return; } if (currentNode.link != null && Random.Range(0, 100) <= 50) { currentNode = currentNode.link; } else { currentNode = currentNode.nextWaypoint; } }
private BaseCamera GetCamera(CarCameraMode mode) { switch (mode) { case CarCameraMode.None: return(null); case CarCameraMode.FirstPerson: return(CarNode?.GetDriverCamera()); case CarCameraMode.Dashboard: return(CarNode?.GetDashboardCamera()); case CarCameraMode.Bonnet: return(CarNode?.GetBonnetCamera()); case CarCameraMode.Bumper: return(CarNode?.GetBumperCamera()); default: throw new ArgumentOutOfRangeException(nameof(mode), mode, null); } }
public async Task SetCarAsync(CarDescription car, string skinId = Kn5RenderableCar.DefaultSkin, CancellationToken cancellationToken = default(CancellationToken)) { ClearBeforeChangingCar(); GC.Collect(); GC.WaitForPendingFinalizers(); try { _loadingCar = car; if (_carWrapper == null) { _car = car; return; } if (car == null) { ClearExisting(); CarNode = null; _carBoundingBox = null; _car = null; Scene.UpdateBoundingBox(); return; } Kn5RenderableCar loaded = null; var previous = _previousCars.FirstOrDefault(x => x.Id == car.MainKn5File); if (previous != null) { _previousCars.Remove(previous); ClearExisting(); _carWrapper.AddRange(previous.Objects); _car = car; loaded = previous.Objects.OfType <Kn5RenderableCar>().First(); CopyValues(loaded, CarNode); CarNode = loaded; _carBoundingBox = null; if (_selectSkinLater) { CarNode.SelectSkin(DeviceContextHolder, _selectSkin); _selectSkinLater = false; } else { CarNode.SelectSkin(DeviceContextHolder, skinId); } Scene.UpdateBoundingBox(); return; } await car.LoadAsync(); if (cancellationToken.IsCancellationRequested) { return; } await Task.Run(() => { loaded = new Kn5RenderableCar(car, Matrix.Identity, _selectSkinLater ? _selectSkin : skinId, asyncTexturesLoading: AsyncTexturesLoading, asyncOverrideTexturesLoading: AsyncOverridesLoading, allowSkinnedObjects: AllowSkinnedObjects); _selectSkinLater = false; if (cancellationToken.IsCancellationRequested) { return; } CopyValues(loaded, CarNode); if (cancellationToken.IsCancellationRequested) { return; } loaded.Draw(DeviceContextHolder, null, SpecialRenderMode.InitializeOnly); }); if (cancellationToken.IsCancellationRequested || _loadingCar != car) { loaded?.Dispose(); return; } ClearExisting(); _carWrapper.Add(loaded); ExtendCar(loaded, _carWrapper); _car = car; _selectSkin = null; CarNode = loaded; _carBoundingBox = null; IsDirty = true; Scene.UpdateBoundingBox(); } catch (Exception e) { MessageBox.Show(e.ToString()); throw; } finally { if (ReferenceEquals(_loadingCar, car)) { _loadingCar = null; } } }
public void SetCar(CarDescription car, string skinId = Kn5RenderableCar.DefaultSkin) { ClearBeforeChangingCar(); try { _loadingCar = car; if (_carWrapper == null) { _car = car; return; } if (car == null) { ClearExisting(); CarNode = null; _carBoundingBox = null; _car = null; Scene.UpdateBoundingBox(); return; } Kn5RenderableCar loaded; var previous = _previousCars.FirstOrDefault(x => x.Id == car.MainKn5File); if (previous != null) { _previousCars.Remove(previous); ClearExisting(); _carWrapper.AddRange(previous.Objects); _car = car; loaded = previous.Objects.OfType <Kn5RenderableCar>().First(); CopyValues(loaded, CarNode); CarNode = loaded; _carBoundingBox = null; if (_selectSkinLater) { CarNode.SelectSkin(DeviceContextHolder, _selectSkin); _selectSkinLater = false; } else { CarNode.SelectSkin(DeviceContextHolder, skinId); } Scene.UpdateBoundingBox(); return; } loaded = new Kn5RenderableCar(car, Matrix.Identity, _selectSkinLater ? _selectSkin : skinId, asyncTexturesLoading: AsyncTexturesLoading, asyncOverrideTexturesLoading: AsyncOverridesLoading, allowSkinnedObjects: AllowSkinnedObjects); _selectSkinLater = false; CopyValues(loaded, CarNode); ClearExisting(); _carWrapper.Add(loaded); ExtendCar(loaded, _carWrapper); _car = car; _selectSkin = null; CarNode = loaded; _carBoundingBox = null; IsDirty = true; Scene.UpdateBoundingBox(); } catch (Exception e) { MessageBox.Show(e.ToString()); throw; } finally { if (ReferenceEquals(_loadingCar, car)) { _loadingCar = null; } } }
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(); } }
public void SelectNextSkin() { CarNode?.SelectNextSkin(DeviceContextHolder); }
public void SelectPreviousSkin() { CarNode?.SelectPreviousSkin(DeviceContextHolder); }
public override void DrawSceneForShadows(DeviceContextHolder holder, ICamera camera) { ShowroomNode?.Draw(holder, camera, SpecialRenderMode.Shadow); CarNode?.Draw(holder, camera, SpecialRenderMode.Shadow); }
protected override void DrawSpritesInner() { CarNode?.DrawSprites(Sprite, Camera, new Vector2(ActualWidth, ActualHeight)); base.DrawSpritesInner(); }
private bool OverrideTexture(string textureName, Action <EffectSpecialPaintShop> update, Size size) { return(CarNode == null || CarNode.OverrideTexture(DeviceContextHolder, textureName, GetTexture(textureName, update, size).View, false)); }
public void Shot(string outputDirectory, [CanBeNull] IProgress <double> progress, CancellationToken cancellation) { if (!Initialized) { Initialize(); } using (var replacement = FileUtils.RecycleOriginal(Path.Combine(outputDirectory, "body_shadow.png"))) { // body shadow PrepareBuffers(BodySize + BodyPadding * 2, 1024); SetBodyShadowCamera(); Draw(BodyMultiplier, BodySize, BodyPadding, Fade ? 0.5f : 0f, progress.SubrangeDouble(0.01, 0.59), cancellation); if (cancellation.IsCancellationRequested) { return; } SaveResultAs(replacement.Filename, BodySize, BodyPadding); } // wheels shadows if (_flattenNodesFix != null) { foreach (var tuple in _flattenNodesFix) { tuple.Item1.ParentMatrix = tuple.Item2; } } PrepareBuffers(WheelSize + WheelPadding * 2, 128); SetWheelShadowCamera(); _wheelMode = true; var nodes = new[] { "WHEEL_LF", "WHEEL_RF", "WHEEL_LR", "WHEEL_RR" }; var list = nodes.Select(x => CarNode.GetDummyByName(x)).NonNull().Select((x, i) => new { Node = x, GlobalMatrix = x.Matrix, Matrix = Matrix.Translation(-(CarData?.GetWheelGraphicOffset(x.Name) ?? Vector3.Zero) + new Vector3(0f, x.Matrix.GetTranslationVector().Y - (x.BoundingBox?.Minimum.Y ?? 0f), 0f)), FileName = $"tyre_{i}_shadow.png", Progress = progress.SubrangeDouble(0.6 + i * 0.1, 0.099) }).ToList(); foreach (var entry in list) { using (var replacement = FileUtils.RecycleOriginal(Path.Combine(outputDirectory, entry.FileName))) { var m = Matrix.Invert(entry.GlobalMatrix); _flattenNodes = list.SelectMany(x => { x.Node.ParentMatrix = Matrix.Identity; x.Node.LocalMatrix = entry.Matrix * x.GlobalMatrix * m; return(Flatten(x.Node).OfType <Kn5RenderableDepthOnlyObject>()); }).ToArray(); Draw(WheelMultiplier, WheelSize, WheelPadding, 1f, entry.Progress, cancellation); if (cancellation.IsCancellationRequested) { return; } SaveResultAs(replacement.Filename, WheelSize, WheelPadding); } } }