protected override void InitializeInner() { _effect = DeviceContextHolder.GetEffect <EffectSpecialTrackOutline>(); _maps = _mapFilenames.Select((x, i) => { var data = new MapViewData(DeviceContextHolder, x, UseAiLanes); if (i == 0) { Scale *= (data.MapSize.X / data.MapSize.Y).Clamp(1f, 2f); } return(data); }).ToArray(); if (LoadPreview) { if (File.Exists(_previewFilename)) { using (var preview = Texture2D.FromFile(Device, _previewFilename)) { _previewSize = new Vector2(preview.Description.Width, preview.Description.Height); _previewView = new ShaderResourceView(Device, preview); } } else { AcToolsLogging.Write("Not found: " + _previewFilename); } } _f0Buffer = TargetResourceTexture.Create(Format.R8G8B8A8_UNorm); _f1Buffer = TargetResourceTexture.Create(Format.R8G8B8A8_UNorm); _fBlendBuffer = TargetResourceTexture.Create(Format.R8G8B8A8_UNorm); _fSummBuffer = TargetResourceTexture.Create(Format.R8G8B8A8_UNorm); _a0Buffer = TargetResourceTexture.Create(Format.R8G8B8A8_UNorm); _a1Buffer = TargetResourceTexture.Create(Format.R8G8B8A8_UNorm); _aSummBuffer = TargetResourceTexture.Create(Format.R8G8B8A8_UNorm); _combineBlendState = Device.CreateBlendState(new RenderTargetBlendDescription { BlendEnable = true, SourceBlend = BlendOption.SourceAlpha, DestinationBlend = BlendOption.InverseSourceAlpha, BlendOperation = BlendOperation.Add, SourceBlendAlpha = BlendOption.One, DestinationBlendAlpha = BlendOption.One, BlendOperationAlpha = BlendOperation.Maximum, RenderTargetWriteMask = ColorWriteMaskFlags.All }); }
public void Draw(DeviceContextHolder holder, EffectSpecialTrackOutline effect, Matrix mapMatrix, MapViewData max) { if (_dirty) { Initialize(holder); } if (AiLaneMode) { Kn5MaterialTrackOutline.Matrix = mapMatrix; if (!_materialsSet) { _materialsSet = true; if (holder.TryToGet <IMaterialsFactory>() == null) { holder.Set <IMaterialsFactory>(new TrackOutlineMaterialsFactory()); } } _obj.Draw(holder, max?.GetCamera(holder) ?? GetCamera(holder), SpecialRenderMode.Simple); // revert quad holder.PrepareQuad(effect.LayoutPT); } else { // local transformation matrix: global×local offset (calculated from map.ini)×local scale var localScale = Matrix.Transformation2D(Vector2.Zero, 0f, new Vector2(max.DataSize.X / DataSize.X, max.DataSize.Y / DataSize.Y) / DataScale, Vector2.Zero, 0f, Vector2.Zero); var localOffset = Matrix.AffineTransformation2D(1f, Vector2.Zero, 0f, new Vector2( (DataOffset.X - max.DataOffset.X) / max.DataSize.X, (DataOffset.Y - max.DataOffset.Y) / max.DataSize.Y)); effect.FxMatrix.SetMatrix(mapMatrix * localOffset * localScale); effect.FxInputMap.SetResource(_view); effect.TechFirstStep.DrawAllPasses(holder.DeviceContext, 6); } }
public void Initialize(IDeviceContextHolder contextHolder) { _effect = contextHolder.GetEffect <EffectSpecialTrackOutline>(); }