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));
        }
Beispiel #4
0
 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();
 }
Beispiel #5
0
 public void FitAmbientShadowSize()
 {
     if (CarNode == null)
     {
         return;
     }
     CarNode.FitAmbientShadowSize();
     OnPropertyChanged(nameof(AmbientShadowWidth));
     OnPropertyChanged(nameof(AmbientShadowLength));
     AmbientShadowSizeChanged = true;
 }
Beispiel #6
0
        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);
                }
            }
        }
Beispiel #7
0
 public void SelectSkin(string skinId)
 {
     if (CarNode == null)
     {
         _selectSkinLater = true;
         _selectSkin      = skinId;
     }
     else
     {
         CarNode?.SelectSkin(DeviceContextHolder, skinId);
     }
 }
Beispiel #8
0
        public void NextExtraCamera()
        {
            var cameras = CarNode?.GetCamerasCount();

            if (!cameras.HasValue || cameras == 0)
            {
                CurrentExtraCamera = null;
            }
            else
            {
                CurrentExtraCamera = CurrentExtraCamera.HasValue ? (CurrentExtraCamera.Value + 1) % cameras : 0;
            }
        }
Beispiel #9
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));
        }
Beispiel #12
0
        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);
        }
Beispiel #13
0
    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;
        }
    }
Beispiel #14
0
        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);
            }
        }
Beispiel #15
0
        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;
                }
            }
        }
Beispiel #16
0
        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();
            }
        }
Beispiel #18
0
 public void SelectNextSkin()
 {
     CarNode?.SelectNextSkin(DeviceContextHolder);
 }
Beispiel #19
0
 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);
 }
Beispiel #21
0
 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));
 }
Beispiel #23
0
        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);
                }
            }
        }