Beispiel #1
0
        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();
            }
        }
Beispiel #2
0
        public async Task SetCarAsync(CarObject car, string skinId        = Kn5RenderableCar.DefaultSkin,
                                      CancellationToken cancellationToken = default(CancellationToken))
        {
            LicensePlateSelected = false;

            try {
                _loadingCar = car;

                if (_carWrapper == null)
                {
                    _car = car;
                    return;
                }

                if (car == null)
                {
                    ClearExisting();
                    _car    = null;
                    CarNode = null;
                    Scene.UpdateBoundingBox();
                    return;
                }

                Kn5RenderableCar loaded     = null;
                FlatMirror       reflection = null;

                var previous = _previousCars.FirstOrDefault(x => x.Id == car.Id);
                if (previous != null)
                {
                    _previousCars.Remove(previous);

                    ClearExisting();
                    _carWrapper.AddRange(previous.Objects);
                    _car   = car;
                    loaded = previous.Objects.OfType <Kn5RenderableCar>().First();
                    loaded.LightsEnabled = CarNode?.LightsEnabled == true;
                    CarNode = loaded;
                    if (_selectSkinLater)
                    {
                        CarNode.SelectSkin(DeviceContextHolder, _selectSkin);
                        _selectSkinLater = false;
                    }
                    else
                    {
                        CarNode.SelectSkin(DeviceContextHolder, skinId);
                    }
                    Scene.UpdateBoundingBox();
                    return;
                }

                await Task.Run(() => {
                    var carKn5 = Kn5.FromFile(FileUtils.GetMainCarFilename(car.Location));
                    if (cancellationToken.IsCancellationRequested)
                    {
                        return;
                    }

                    loaded           = new Kn5RenderableCar(carKn5, car.Location, Matrix.Identity, _selectSkinLater ? _selectSkin : skinId);
                    _selectSkinLater = false;
                    if (cancellationToken.IsCancellationRequested)
                    {
                        return;
                    }

                    loaded.LightsEnabled = CarNode?.LightsEnabled == true;
                    if (cancellationToken.IsCancellationRequested)
                    {
                        return;
                    }

                    loaded.Draw(DeviceContextHolder, null, SpecialRenderMode.InitializeOnly);
                    if (cancellationToken.IsCancellationRequested)
                    {
                        return;
                    }

                    reflection = new FlatMirror(loaded, new Plane(Vector3.Zero, Vector3.UnitY));
                    reflection.Draw(DeviceContextHolder, null, SpecialRenderMode.InitializeOnly);
                });

                if (cancellationToken.IsCancellationRequested || _loadingCar != car)
                {
                    loaded?.Dispose();
                    return;
                }

                ClearExisting();

                _carWrapper.Add(loaded);
                _carWrapper.Add(reflection);
                _car        = car;
                CarNode     = loaded;
                _selectSkin = null;
                Scene.UpdateBoundingBox();
            } catch (Exception e) {
                MessageBox.Show(e.ToString());
                throw;
            } finally {
                if (ReferenceEquals(_loadingCar, car))
                {
                    _loadingCar = null;
                }
            }
        }