private void LoadAndAdjustKn5() { DeviceContextHolder.Set <IMaterialsFactory>(new DepthMaterialsFactory()); _carNode = (RenderableList)Kn5RenderableDepthOnlyObject.Convert(_kn5.RootNode); _scene.Add(_carNode); _carNode.UpdateBoundingBox(); _carNode.LocalMatrix = Matrix.Translation(0, UpDelta - (_carNode.BoundingBox?.Minimum.Y ?? 0f), 0) * _carNode.LocalMatrix; _scene.UpdateBoundingBox(); }
public static IRenderableObject Create(AiLane aiLane, float?fixedWidth) { // four vertices per sector const int verticesPerSector = 4; // actually, I think it’s 65535, but let’s not go there const int maxVertices = 30000; var aiPoints = aiLane.Points; var sectorsNumber = aiPoints.Length - 1; if (sectorsNumber < 1) { return(new InvisibleObject()); } if (sectorsNumber * verticesPerSector <= maxVertices) { return(Create(aiPoints, fixedWidth, 0, aiPoints.Length)); } var pointsPerObject = maxVertices / verticesPerSector + 1; var result = new RenderableList(); for (var i = 0; i < aiPoints.Length; i += pointsPerObject) { result.Add(Create(aiPoints, fixedWidth, i, Math.Min(i + pointsPerObject, aiPoints.Length))); } AcToolsLogging.Write("Objects: " + result.Count); return(result); }
/// <summary> /// Internal method for adding a solid renderable /// </summary> /// <param name="technique">Technique to use for this renderable.</param> /// <param name="renderable">Renderable to add to the queue.</param> /// <param name="noShadows">True to add to the no shadow group, false otherwise.</param> protected void AddSolidRenderable(Technique technique, IRenderable renderable, bool noShadows) { SortedList passMap = null; if (noShadows) { passMap = solidPassesNoShadow; } else { passMap = solidPasses; } for (int i = 0; i < technique.NumPasses; i++) { Pass pass = technique.GetPass(i); if (passMap[pass] == null) { // add a new list to hold renderables for this pass passMap.Add(pass, new RenderableList()); } // add to solid list for this pass RenderableList solidList = (RenderableList)passMap[pass]; solidList.Add(renderable); } }
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() { 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; }
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; } } }
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; } } }