diff --git a/ChromaSDK/ChromaSDK.csproj b/ChromaSDK/ChromaSDK.csproj index 99c21c0..1a1da3a 100644 --- a/ChromaSDK/ChromaSDK.csproj +++ b/ChromaSDK/ChromaSDK.csproj @@ -3,8 +3,6 @@ net7.0 x64;ARM64 - enable - embedded diff --git a/FMODCoreAPI/FMODCoreAPI.csproj b/FMODCoreAPI/FMODCoreAPI.csproj index b9ebb9c..2ff45cf 100644 --- a/FMODCoreAPI/FMODCoreAPI.csproj +++ b/FMODCoreAPI/FMODCoreAPI.csproj @@ -3,8 +3,6 @@ net7.0 x64;ARM64 - enable - embedded diff --git a/Igniter/Igniter.csproj b/Igniter/Igniter.csproj index 9fe26ca..ad0fc72 100644 --- a/Igniter/Igniter.csproj +++ b/Igniter/Igniter.csproj @@ -162,7 +162,7 @@ 1.16.0 - 7.0.3 + 8.0.0 diff --git a/LedCSharp/LedCSharp.csproj b/LedCSharp/LedCSharp.csproj index 9f5f7c5..668d5d4 100644 --- a/LedCSharp/LedCSharp.csproj +++ b/LedCSharp/LedCSharp.csproj @@ -3,8 +3,6 @@ net7.0 x64;ARM64 - enable - embedded diff --git a/Protobuf/Protobuf.csproj b/Protobuf/Protobuf.csproj index e21e4ed..c576f78 100644 --- a/Protobuf/Protobuf.csproj +++ b/Protobuf/Protobuf.csproj @@ -2,11 +2,9 @@ net7.0 x64;ARM64 - enable - embedded - + diff --git a/Protobuf/protoc.exe b/Protobuf/protoc.exe index 7ebb219..36ff0b8 100644 --- a/Protobuf/protoc.exe +++ b/Protobuf/protoc.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:940790b62b3c5c1fa783926e0eb2323b7ca20ed4910abe2a0ee136e0a9619606 -size 11554537 +oid sha256:c3739364aba9b9a89bbbc6133d4d6f27b9e1f9ce0082c76d76433c0d339cc1ee +size 11554025 diff --git a/Qwilight/Assets/UI/@Default/@Default.zip b/Qwilight/Assets/UI/@Default/@Default.zip index e45c149..9260209 100644 --- a/Qwilight/Assets/UI/@Default/@Default.zip +++ b/Qwilight/Assets/UI/@Default/@Default.zip @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:149fdba0507308f257b4df1dff43c3e0f521cc238ea87b1e91e2eabfef6edcbb -size 68724102 +oid sha256:c111de2bff6a429bb1d0fb4e120d1f1956f5af5cd7e79a10f4e4e13b57659e28 +size 54871318 diff --git a/Qwilight/Compiler/BMSCompiler.cs b/Qwilight/Compiler/BMSCompiler.cs index f958b7b..7e45e94 100644 --- a/Qwilight/Compiler/BMSCompiler.cs +++ b/Qwilight/Compiler/BMSCompiler.cs @@ -789,7 +789,7 @@ }, Utility.AvailableFlag.Media => MediaSystem.Instance.Load(Utility.GetFiles(Path.GetDirectoryName(mediaFilePath), $"{Path.GetFileNameWithoutExtension(mediaFilePath)}.*") .Where(targetFile => targetFile.IsTailCaselsss(".mp4")) - .FirstOrDefault() ?? mediaFilePath, defaultComputer), + .FirstOrDefault() ?? mediaFilePath, defaultComputer, false), _ => null as IHandledItem, }; } diff --git a/Qwilight/Compiler/BMSONCompiler.cs b/Qwilight/Compiler/BMSONCompiler.cs index b03638e..f09de3e 100644 --- a/Qwilight/Compiler/BMSONCompiler.cs +++ b/Qwilight/Compiler/BMSONCompiler.cs @@ -560,7 +560,7 @@ Drawing = DrawingSystem.Instance.Load(mediaFilePath, defaultComputer), DefaultDrawing = DrawingSystem.Instance.LoadDefault(mediaFilePath, defaultComputer) }, - Utility.AvailableFlag.Media => MediaSystem.Instance.Load(mediaFilePath, defaultComputer), + Utility.AvailableFlag.Media => MediaSystem.Instance.Load(mediaFilePath, defaultComputer, false), _ => null, }; } diff --git a/Qwilight/Compiler/BaseCompiler.cs b/Qwilight/Compiler/BaseCompiler.cs index ac84f2e..b267f3c 100644 --- a/Qwilight/Compiler/BaseCompiler.cs +++ b/Qwilight/Compiler/BaseCompiler.cs @@ -239,7 +239,6 @@ defaultComputer.WaitMediaNoteMap.Into(0.0, new() { MediaMode = MediaNote.Mode.Default, - IsLooping = true, MediaItem = defaultComputer.LoopingBanalMedia, HasContents = true }); @@ -249,7 +248,6 @@ defaultComputer.WaitMediaNoteMap.Into(0.0, new() { MediaMode = MediaNote.Mode.Failed, - IsLooping = true, MediaItem = defaultComputer.LoopingBanalFailedMedia, HasContents = true }); @@ -737,7 +735,6 @@ var mediaNoteModified = new MediaNote { MediaMode = mediaNote.MediaMode, - IsLooping = mediaNote.IsLooping, MediaItem = mediaItem, HasContents = mediaNote.HasContents, MediaLevyingPosition = mediaNote.MediaLevyingPosition, diff --git a/Qwilight/Compute/DefaultCompute.cs b/Qwilight/Compute/DefaultCompute.cs index cc6c242..c0fbb84 100644 --- a/Qwilight/Compute/DefaultCompute.cs +++ b/Qwilight/Compute/DefaultCompute.cs @@ -607,7 +607,7 @@ switch (handler) { case DrawingHandlerItem drawingHandlerItem: - HandleDrawing(ref r, drawingHandlerItem.DrawingComputingValue); + HandleDrawing(ref r, drawingHandlerItem.HandledDrawingItem); break; case MediaHandlerItem mediaHandlerItem: var defaultMedia = mediaHandlerItem.HandledMediaItem.DefaultMedia; @@ -673,7 +673,7 @@ switch (handler) { case DrawingHandlerItem drawingHandlerItem: - HandleDrawing(ref r, drawingHandlerItem.DrawingComputingValue); + HandleDrawing(ref r, drawingHandlerItem.HandledDrawingItem); break; case MediaHandlerItem mediaHandlerItem: var mediaFrame = mediaHandlerItem.MediaFrame; @@ -934,7 +934,7 @@ } } - public void HandleComputer() => Task.Run(() => + public void HandleComputer() { lock (_targetHandlerCSX) { @@ -947,7 +947,7 @@ _targetHandler = Utility.HandleParallelly(HandleNotes); } SendSituation(); - }); + } public object LoadedCSX { get; } = new(); @@ -959,42 +959,39 @@ SetStop = true; SendNotCompiled(); TrailerAudioHandler.Stop(); - Task.Run(() => + if (_targetCompiler != null) { - if (_targetCompiler != null) + lock (_targetCompiler) { - lock (_targetCompiler) + if (_targetCompilerStatus == CompilerStatus.Compiling) { - if (_targetCompilerStatus == CompilerStatus.Compiling) - { - _setCancelCompiler.Cancel(); - _setCancelCompiler.Dispose(); - MediaModifierValue.StopModifyMedia(); - _targetCompilerHandler.Join(); - _targetCompilerStatus = CompilerStatus.Close; - } + _setCancelCompiler.Cancel(); + _setCancelCompiler.Dispose(); + MediaModifierValue.StopModifyMedia(); + _targetCompilerHandler.Join(); + _targetCompilerStatus = CompilerStatus.Close; } } - lock (_targetHandlerCSX) + } + lock (_targetHandlerCSX) + { + if (IsHandling) { - if (IsHandling) - { - _targetHandler.Join(); - } + _targetHandler.Join(); } - lock (LoadedCSX) + } + lock (LoadedCSX) + { + if (HasContents) { - if (HasContents) - { - AudioSystem.Instance.Stop(this); - AudioSystem.Instance.Close(this, this); - MediaSystem.Instance.Stop(this); - MediaSystem.Instance.Close(this, this); - DrawingSystem.Instance.Close(this); - HasContents = false; - } + AudioSystem.Instance.Stop(this); + AudioSystem.Instance.Close(this, this); + MediaSystem.Instance.Stop(this); + MediaSystem.Instance.Close(this, this); + DrawingSystem.Instance.Close(this); + HasContents = false; } - }); + } } public void LowerMultiplier() @@ -1578,7 +1575,7 @@ }; break; case Utility.AvailableFlag.Media: - LoopingBanalMedia = MediaSystem.Instance.Load(BanalMediaFilePath, this); + LoopingBanalMedia = MediaSystem.Instance.Load(BanalMediaFilePath, this, true); break; } } @@ -1603,7 +1600,7 @@ }; break; case Utility.AvailableFlag.Media: - LoopingBanalFailedMedia = MediaSystem.Instance.Load(BanalFailedMediaFilePath, this); + LoopingBanalFailedMedia = MediaSystem.Instance.Load(BanalFailedMediaFilePath, this, true); break; } } @@ -1689,16 +1686,16 @@ { if (mediaNote.HasContents) { - var mediaItem = mediaNote.MediaItem; - var isLooping = mediaNote.IsLooping; - if (isLooping || mediaItem == null || LoopingCounter < waitModified + mediaItem.Length) + var handledItem = mediaNote.MediaItem; + var isLooping = handledItem.IsLooping; + if (isLooping || handledItem == null || LoopingCounter < waitModified + handledItem.Length) { lock (LoadedCSX) { if (HasContents) { var mediaMode = mediaNote.MediaMode; - DrawingCollection[mediaMode] = mediaItem?.Handle(this, isLooping ? TimeSpan.Zero : TimeSpan.FromMilliseconds(waitModified) - mediaNote.MediaLevyingPosition, mediaMode, isLooping); + DrawingCollection[mediaMode] = handledItem?.Handle(this, isLooping ? TimeSpan.Zero : TimeSpan.FromMilliseconds(waitModified) - mediaNote.MediaLevyingPosition, mediaMode); IsHandlingDrawing = true; } } @@ -3599,7 +3596,7 @@ _pendingIOAvatarIDs.AddRange(_sentIOAvatarIDs); _sentIOAvatarIDs.Clear(); } - HandleComputer(); + _targetHandler = Utility.HandleParallelly(HandleNotes); } else { @@ -3612,8 +3609,8 @@ isBanned = false }); } + IsHandling = false; } - IsHandling = false; } void SetNoteJudged(BaseNote note, Component.Judged judged) @@ -4075,7 +4072,7 @@ { for (var i = _comments.Count - 1; i >= 0; --i) { - using var rms = PoolSystem.Instance.GetDataFlow(); + using var rms = PoolSystem.Instance.GetDataFlow(_comments[i].CalculateSize()); _comments[i].WriteTo(rms); rms.Position = 0; zipFile.AddEntry(i.ToString(), rms); @@ -4680,13 +4677,10 @@ { if (!IsInEvents) { - Task.Run(() => + if (!UI.Instance.HandleAudio(audioFileName, null, null, 0.0)) { - if (!UI.Instance.HandleAudio(audioFileName, null, null, 0.0)) - { - BaseUI.Instance.HandleAudio(audioFileName, null, null, 0.0); - } - }); + BaseUI.Instance.HandleAudio(audioFileName, null, null, 0.0); + } } } diff --git a/Qwilight/Model.cs b/Qwilight/Model.cs index a789c2a..05ed2dc 100644 --- a/Qwilight/Model.cs +++ b/Qwilight/Model.cs @@ -1,12 +1,9 @@ using CommunityToolkit.Mvvm.ComponentModel; -using System.ComponentModel; namespace Qwilight { public class Model : ObservableObject { - protected override void OnPropertyChanged(PropertyChangedEventArgs e) => HandlingUISystem.Instance.HandleParallel(() => base.OnPropertyChanged(e)); - public virtual void NotifyModel() => OnPropertyChanged(string.Empty); } } diff --git a/Qwilight/Qwilight.csproj b/Qwilight/Qwilight.csproj index d9b2159..1b005f7 100644 --- a/Qwilight/Qwilight.csproj +++ b/Qwilight/Qwilight.csproj @@ -36,6 +36,10 @@ + + + + @@ -56,9 +60,9 @@ - + - + diff --git a/Qwilight/System/BaseUI/BasePaintProperty.cs b/Qwilight/System/BaseUI/BasePaintProperty.cs index 44f4d14..077f8a2 100644 --- a/Qwilight/System/BaseUI/BasePaintProperty.cs +++ b/Qwilight/System/BaseUI/BasePaintProperty.cs @@ -31,6 +31,8 @@ public HandledDrawingItem?[] HandledDrawingItems { get; set; } + public HandledMediaItem HandledMediaItemValue { get; set; } + public MediaHandlerItem MediaHandlerItemValue { get; set; } public int DrawingVariety { get; set; } diff --git a/Qwilight/System/BaseUI/BaseUI.cs b/Qwilight/System/BaseUI/BaseUI.cs index 61df69b..6b24af8 100644 --- a/Qwilight/System/BaseUI/BaseUI.cs +++ b/Qwilight/System/BaseUI/BaseUI.cs @@ -1365,7 +1365,7 @@ using var fs = File.OpenWrite(hashMediaFilePath); rms.WriteTo(fs); } - handledMediaValues[Path.GetFileName(fileName)] = MediaSystem.Instance.Load(hashMediaFilePath, this); + handledMediaValues[Path.GetFileName(fileName)] = MediaSystem.Instance.Load(hashMediaFilePath, this, true); } } catch @@ -1553,13 +1553,13 @@ var isDefaultAvailable = mode == 0; if (handledMediaValues.TryGetValue(paintPropertyValue.Etc, out var handledMediaItem)) { - paintPropertyValue.MediaHandlerItemValue = MediaSystem.Instance.Handle(handledMediaItem, this, isAvailable, isDefaultAvailable); + paintPropertyValue.HandledMediaItemValue = handledMediaItem; } else { try { - paintPropertyValue.MediaHandlerItemValue = MediaSystem.Instance.Handle(MediaSystem.Instance.Load(Path.Combine(QwilightComponent.UIEntryPath, target.UIEntry, paintPropertyValue.Etc), this), this, isAvailable, isDefaultAvailable); + paintPropertyValue.HandledMediaItemValue = MediaSystem.Instance.Load(Path.Combine(QwilightComponent.UIEntryPath, target.UIEntry, paintPropertyValue.Etc), this, true); } catch { @@ -1999,6 +1999,14 @@ ViewModels.Instance.NotifyWindowViewModels(); mainViewModel.NotifyModel(); mainViewModel.IsUILoading = false; + Task.Run(() => + { + foreach (var paintPropertyValue in PaintPropertyValues.Where(paintVarietyValue => paintVarietyValue?.DrawingVariety == 11)) + { + var mode = paintPropertyValue.Mode; + paintPropertyValue.MediaHandlerItemValue = MediaSystem.Instance.Handle(paintPropertyValue.HandledMediaItemValue, this, mode == 1, mode == 0); + } + }); } } diff --git a/Qwilight/System/Configure/Configure.cs b/Qwilight/System/Configure/Configure.cs index 83737ff..60c299a 100644 --- a/Qwilight/System/Configure/Configure.cs +++ b/Qwilight/System/Configure/Configure.cs @@ -1026,7 +1026,7 @@ public void SetFontFamily() { - FontFamilyValue = new(string.Join(',', FontFamilyValues.Select(fontFamily => fontFamily?.ToString() ?? string.Empty))); + FontFamilyValue = new(string.Join(',', FontFamilyValues.SkipLast(1).Select(fontFamily => fontFamily?.ToString() ?? string.Empty))); OnPropertyChanged(nameof(FontFamilyValue)); OnPropertyChanged(nameof(FontFamilyValues)); FontFace = new(FontFamilyValue, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal); @@ -1035,8 +1035,6 @@ UI.Instance.SetFontFamily(); } - public string GetFontFamily() => (FontFamilyValues.FirstOrDefault() ?? QwilightComponent.GetBuiltInData("DefaultFontFamily")).ToString(); - public int CommentViewTabPosition { get => _commentViewTabPosition; @@ -2379,11 +2377,6 @@ LowestWantLevelTextValue = 1; HighestWantLevelTextValue = 12; } - if (isInit || Utility.IsLowerDate(Date, 1, 11, 10)) - { - FontFamilyValues = new FontFamily[3]; - Array.Fill(FontFamilyValues, QwilightComponent.GetBuiltInData("DefaultFontFamily")); - } if (isInit || Utility.IsLowerDate(Date, 1, 11, 36)) { GroupEntry = true; @@ -3288,6 +3281,11 @@ InputWantInputMode = new bool[17]; Array.Fill(InputWantInputMode, true); } + if (isInit || Utility.IsLowerDate(Date, 1, 16, 9)) + { + FontFamilyValues = new FontFamily[4]; + Array.Fill(FontFamilyValues, QwilightComponent.GetBuiltInData("DefaultFontFamily")); + } if (!UIConfigureValuesV2.ContainsKey(UIItemValue.Title)) { UIConfigureValuesV2[UIItemValue.Title] = new(); diff --git a/Qwilight/System/DrawingSystem/DrawingHandlerItem.cs b/Qwilight/System/DrawingSystem/DrawingHandlerItem.cs index 8264393..a097927 100644 --- a/Qwilight/System/DrawingSystem/DrawingHandlerItem.cs +++ b/Qwilight/System/DrawingSystem/DrawingHandlerItem.cs @@ -2,10 +2,6 @@ { public struct DrawingHandlerItem : IHandlerItem { - public HandledDrawingItem DrawingComputingValue { get; set; } - - public bool WasDefaultMediaHandled { get; set; } - - public IHandledItem Value => DrawingComputingValue; + public HandledDrawingItem HandledDrawingItem { get; set; } } } \ No newline at end of file diff --git a/Qwilight/System/DrawingSystem/DrawingSystem.cs b/Qwilight/System/DrawingSystem/DrawingSystem.cs index cd6447d..9ecc8e0 100644 --- a/Qwilight/System/DrawingSystem/DrawingSystem.cs +++ b/Qwilight/System/DrawingSystem/DrawingSystem.cs @@ -73,6 +73,10 @@ static readonly string FaultEntryPath = Path.Combine(QwilightComponent.FaultEntryPath, nameof(DrawingSystem)); + /// + /// Direct2D™ 싱글 스레드 제어용 락 + /// + readonly object d2D1CSX = new(); readonly ConcurrentDictionary> _drawingMap = new(); readonly ConcurrentDictionary> _defaultDrawingMap = new(); readonly ConcurrentDictionary> _toCloseValues = new(); @@ -100,15 +104,10 @@ public bool CanNVLL { get; set; } - public WriteableBitmap D3D9Drawing { get; set; } + public ImageSource D3D9Drawing { get; set; } public HandledDrawingItem ClearedDrawing { get; set; } - /// - /// 다이렉트 2D 싱글 스레드 제어용 락 - /// - public object D2D1CSX { get; } = new(); - public ICanvasBrush[] FaintFilledPaints { get; } = new ICanvasBrush[101]; public ICanvasBrush[] FaintClearedPaints { get; } = new ICanvasBrush[101]; @@ -406,7 +405,6 @@ var wasLastMoved = LastMovedQueue.TryDequeue(out var lastMoved); var wasLastNotPointed = LastNotPointedQueue.TryDequeue(out var lastNotPointed); - var isWPFViewVisible = mainViewModel.IsWPFViewVisible; var isNVLL = Configure.Instance.IsNVLL; var allowFramerate = TelnetSystem.Instance.IsAvailable; var mode = mainViewModel.ModeValue; @@ -424,7 +422,7 @@ switch (mode) { case MainViewModel.Mode.NoteFile: - lock (D2D1CSX) + lock (d2D1CSX) { using (targetSession = _rawTargetSystem.CreateDrawingSession(Colors.Black)) { @@ -442,7 +440,7 @@ case MainViewModel.Mode.Computing: defaultComputer = mainViewModel.Computer; modeComponentValue = defaultComputer.ModeComponentValue; - lock (D2D1CSX) + lock (d2D1CSX) { using (targetSession = _targetSystem.CreateDrawingSession()) { @@ -2343,7 +2341,7 @@ defaultComputer = mainViewModel.Computer; modeComponentValue = defaultComputer.ModeComponentValue; var handlingComputer = mainViewModel.GetHandlingComputer(); - lock (D2D1CSX) + lock (d2D1CSX) { using (targetSession = _targetSystem.CreateDrawingSession()) { @@ -2888,13 +2886,13 @@ void CopyD3D9Drawing() { - if (isWPFViewVisible) + if (mainViewModel.IsWPFViewVisible) { _targetSystem.GetPixelBytes(_targetSystemData); - var w = new WriteableBitmap((int)_targetSystem.SizeInPixels.Width, (int)_targetSystem.SizeInPixels.Height, _targetSystem.Dpi, _targetSystem.Dpi, PixelFormats.Bgra32, null); - w.WritePixels(new(0, 0, w.PixelWidth, w.PixelHeight), _rawTargetSystemData, w.Format.BitsPerPixel / 8 * w.PixelWidth, 0); - w.Freeze(); - D3D9Drawing = w; + var d3D9Drawing = new WriteableBitmap((int)_targetSystem.SizeInPixels.Width, (int)_targetSystem.SizeInPixels.Height, _targetSystem.Dpi, _targetSystem.Dpi, PixelFormats.Bgra32, null); + d3D9Drawing.WritePixels(new(0, 0, d3D9Drawing.PixelWidth, d3D9Drawing.PixelHeight), _rawTargetSystemData, d3D9Drawing.Format.BitsPerPixel / 8 * d3D9Drawing.PixelWidth, 0); + d3D9Drawing.Freeze(); + D3D9Drawing = d3D9Drawing; } } @@ -3076,38 +3074,32 @@ var dataCount = Configure.Instance.DataCount; if (_rawTargetSystem == null) { - Task.Run(() => + lock (d2D1CSX) { - lock (D2D1CSX) - { - _targetSystem?.Dispose(); - _targetSystem = new(CanvasDevice.GetSharedDevice(), defaultLength, defaultHeight, targetWindowDPI, DirectXPixelFormat.B8G8R8A8UIntNormalized, CanvasAlphaMode.Ignore); - _rawTargetSystemData = new byte[_targetSystem.SizeInPixels.Width * _targetSystem.SizeInPixels.Height * 4]; - _targetSystemData = _rawTargetSystemData.AsBuffer(); - _rawTargetSystem?.Dispose(); - _rawTargetSystem = new(CanvasDevice.GetSharedDevice(), defaultLength, defaultHeight, targetWindowDPI, DirectXPixelFormat.B8G8R8A8UIntNormalized, dataCount, CanvasAlphaMode.Ignore); - } - StrongReferenceMessenger.Default.Send(new SetD2DView - { - D2DView = _rawTargetSystem - }); - StrongReferenceMessenger.Default.Send(); + _targetSystem?.Dispose(); + _targetSystem = new(CanvasDevice.GetSharedDevice(), defaultLength, defaultHeight, targetWindowDPI, DirectXPixelFormat.B8G8R8A8UIntNormalized, CanvasAlphaMode.Ignore); + _rawTargetSystemData = new byte[_targetSystem.SizeInPixels.Width * _targetSystem.SizeInPixels.Height * 4]; + _targetSystemData = _rawTargetSystemData.AsBuffer(); + _rawTargetSystem?.Dispose(); + _rawTargetSystem = new(CanvasDevice.GetSharedDevice(), defaultLength, defaultHeight, targetWindowDPI, DirectXPixelFormat.B8G8R8A8UIntNormalized, dataCount, CanvasAlphaMode.Ignore); + } + StrongReferenceMessenger.Default.Send(new SetD2DView + { + D2DView = _rawTargetSystem }); + StrongReferenceMessenger.Default.Send(); } else if (_rawTargetSystem.Size.Width != defaultLength || _rawTargetSystem.Size.Height != defaultHeight || _drawingQuality != drawingQuality || _rawTargetSystem.BufferCount != dataCount) { - Task.Run(() => + lock (d2D1CSX) { - lock (D2D1CSX) - { - _targetSystem?.Dispose(); - _targetSystem = new(CanvasDevice.GetSharedDevice(), defaultLength, defaultHeight, targetWindowDPI, DirectXPixelFormat.B8G8R8A8UIntNormalized, CanvasAlphaMode.Ignore); - _rawTargetSystemData = new byte[_targetSystem.SizeInPixels.Width * _targetSystem.SizeInPixels.Height * 4]; - _targetSystemData = _rawTargetSystemData.AsBuffer(); - _rawTargetSystem.ResizeBuffers(defaultLength, defaultHeight, targetWindowDPI, DirectXPixelFormat.B8G8R8A8UIntNormalized, dataCount); - } - StrongReferenceMessenger.Default.Send(); - }); + _targetSystem?.Dispose(); + _targetSystem = new(CanvasDevice.GetSharedDevice(), defaultLength, defaultHeight, targetWindowDPI, DirectXPixelFormat.B8G8R8A8UIntNormalized, CanvasAlphaMode.Ignore); + _rawTargetSystemData = new byte[_targetSystem.SizeInPixels.Width * _targetSystem.SizeInPixels.Height * 4]; + _targetSystemData = _rawTargetSystemData.AsBuffer(); + _rawTargetSystem.ResizeBuffers(defaultLength, defaultHeight, targetWindowDPI, DirectXPixelFormat.B8G8R8A8UIntNormalized, dataCount); + } + StrongReferenceMessenger.Default.Send(); } _drawingQuality = drawingQuality; } @@ -3555,6 +3547,6 @@ }; } - public virtual void SetFontFamily(CanvasTextFormat font) => font.FontFamily = Configure.Instance.GetFontFamily(); + public virtual void SetFontFamily(CanvasTextFormat font) => font.FontFamily = Configure.Instance.FontFamilyValues[3].ToString(); } } \ No newline at end of file diff --git a/Qwilight/System/DrawingSystem/HandledDrawingItem.cs b/Qwilight/System/DrawingSystem/HandledDrawingItem.cs index 384fb1f..f6fe4f4 100644 --- a/Qwilight/System/DrawingSystem/HandledDrawingItem.cs +++ b/Qwilight/System/DrawingSystem/HandledDrawingItem.cs @@ -6,13 +6,15 @@ { public double Length => double.PositiveInfinity; + public bool IsLooping => true; + public DrawingItem? Drawing { get; init; } public ImageSource DefaultDrawing { get; init; } - public IHandlerItem Handle(IMediaHandler mediaHandler, TimeSpan levyingWait, MediaNote.Mode mode, bool isLooping) => new DrawingHandlerItem + public IHandlerItem Handle(IMediaHandler mediaHandler, TimeSpan levyingWait, MediaNote.Mode mode) => new DrawingHandlerItem { - DrawingComputingValue = this + HandledDrawingItem = this }; public void Dispose() diff --git a/Qwilight/System/HandlingUISystem.cs b/Qwilight/System/HandlingUISystem.cs index 82cf37b..f11cdf5 100644 --- a/Qwilight/System/HandlingUISystem.cs +++ b/Qwilight/System/HandlingUISystem.cs @@ -29,17 +29,5 @@ UIHandler.InvokeAsync(onHandle); } } - - public T Handle(Func onHandle) - { - if (UIHandler.CheckAccess()) - { - return onHandle(); - } - else - { - return UIHandler.Invoke(onHandle); - } - } } } diff --git a/Qwilight/System/IHandledItem.cs b/Qwilight/System/IHandledItem.cs index c0db13a..4315668 100644 --- a/Qwilight/System/IHandledItem.cs +++ b/Qwilight/System/IHandledItem.cs @@ -4,6 +4,8 @@ { double Length { get; } - IHandlerItem Handle(IMediaHandler mediaHandler, TimeSpan levyingWait, MediaNote.Mode mode, bool isLooping = false); + bool IsLooping { get; } + + IHandlerItem Handle(IMediaHandler mediaHandler, TimeSpan levyingWait, MediaNote.Mode mode); } } \ No newline at end of file diff --git a/Qwilight/System/IHandlerItem.cs b/Qwilight/System/IHandlerItem.cs index 5d9bedc..ee1eda8 100644 --- a/Qwilight/System/IHandlerItem.cs +++ b/Qwilight/System/IHandlerItem.cs @@ -2,6 +2,5 @@ { public interface IHandlerItem { - public IHandledItem Value { get; } } } \ No newline at end of file diff --git a/Qwilight/System/MediaSystem/HandledMediaItem.cs b/Qwilight/System/MediaSystem/HandledMediaItem.cs index a262067..ceffd21 100644 --- a/Qwilight/System/MediaSystem/HandledMediaItem.cs +++ b/Qwilight/System/MediaSystem/HandledMediaItem.cs @@ -3,22 +3,26 @@ namespace Qwilight { - public struct HandledMediaItem : IHandledItem, IDisposable + public sealed class HandledMediaItem : IHandledItem, IDisposable { public FFmpegMediaSource MediaSrc { get; init; } public MediaPlayer Media { get; init; } - public System.Windows.Media.MediaPlayer DefaultMedia { get; init; } + public System.Windows.Media.MediaPlayer DefaultMedia { get; set; } + + public string MediaFilePath { get; init; } public double Length { get; init; } - public IHandlerItem Handle(IMediaHandler mediaHandler, TimeSpan levyingWait, MediaNote.Mode mode, bool isLooping) => MediaSystem.Instance.Handle(this, mediaHandler, levyingWait, mode, isLooping); + public bool IsLooping { get; init; } + + public IHandlerItem Handle(IMediaHandler mediaHandler, TimeSpan levyingWait, MediaNote.Mode mode) => MediaSystem.Instance.Handle(this, mediaHandler, levyingWait, mode); public void Dispose() { Media.Dispose(); - HandlingUISystem.Instance.HandleParallel(DefaultMedia.Close); + HandlingUISystem.Instance.HandleParallel(() => DefaultMedia?.Close()); } } } \ No newline at end of file diff --git a/Qwilight/System/MediaSystem/MediaHandlerItem.cs b/Qwilight/System/MediaSystem/MediaHandlerItem.cs index 2cd12d4..fc32455 100644 --- a/Qwilight/System/MediaSystem/MediaHandlerItem.cs +++ b/Qwilight/System/MediaSystem/MediaHandlerItem.cs @@ -18,8 +18,6 @@ public bool IsDefaultAvailable { get; set; } - public bool IsLooping { get; set; } - public bool IsHandling { get; set; } public bool IsDefaultHandling { get; set; } @@ -28,9 +26,7 @@ public CanvasBitmap MediaFrame { get; set; } - public IHandledItem Value => HandledMediaItem; - - public double GetMediaPosition(IMediaHandler mediaHandler) => (mediaHandler.LoopingCounter - LevyingPosition.TotalMilliseconds) % (IsLooping ? HandledMediaItem.Length : double.PositiveInfinity); + public double GetMediaPosition(IMediaHandler mediaHandler) => (mediaHandler.LoopingCounter - LevyingPosition.TotalMilliseconds) % (HandledMediaItem.IsLooping ? HandledMediaItem.Length : double.PositiveInfinity); public void Handle(IMediaHandler mediaHandler, double mediaPosition) { @@ -97,9 +93,23 @@ { HandlingUISystem.Instance.HandleParallel(() => { - HandledMediaItem.DefaultMedia.Position = TimeSpan.FromMilliseconds(mediaPosition); - HandledMediaItem.DefaultMedia.SpeedRatio = mediaHandler.AudioMultiplier; - HandledMediaItem.DefaultMedia.Play(); + var defaultMedia = new System.Windows.Media.MediaPlayer + { + IsMuted = true + }; + if (HandledMediaItem.IsLooping) + { + defaultMedia.MediaEnded += (sender, e) => + { + defaultMedia.Position = TimeSpan.Zero; + defaultMedia.Play(); + }; + } + defaultMedia.Open(new(HandledMediaItem.MediaFilePath)); + defaultMedia.Position = TimeSpan.FromMilliseconds(mediaPosition); + defaultMedia.SpeedRatio = mediaHandler.AudioMultiplier; + defaultMedia.Play(); + HandledMediaItem.DefaultMedia = defaultMedia; }); IsDefaultHandling = true; } @@ -107,7 +117,7 @@ public void StopDefault() { - HandlingUISystem.Instance.HandleParallel(HandledMediaItem.DefaultMedia.Stop); + HandlingUISystem.Instance.HandleParallel(() => HandledMediaItem.DefaultMedia?.Stop()); IsDefaultHandling = false; } @@ -115,23 +125,27 @@ { if (isPaused) { - HandlingUISystem.Instance.HandleParallel(HandledMediaItem.DefaultMedia.Pause); + HandlingUISystem.Instance.HandleParallel(() => HandledMediaItem.DefaultMedia?.Pause()); } else { - HandlingUISystem.Instance.HandleParallel(HandledMediaItem.DefaultMedia.Play); + HandlingUISystem.Instance.HandleParallel(() => HandledMediaItem.DefaultMedia?.Play()); } } public void SetDefaultMediaPosition(double mediaPosition) { - HandlingUISystem.Instance.HandleParallel(() => + var defaultMedia = HandledMediaItem.DefaultMedia; + if (defaultMedia != null) { - if (Math.Abs(HandledMediaItem.DefaultMedia.Position.TotalMilliseconds - mediaPosition) >= 500.0) + HandlingUISystem.Instance.HandleParallel(() => { - HandledMediaItem.DefaultMedia.Position = TimeSpan.FromMilliseconds(mediaPosition); - } - }); + if (Math.Abs(defaultMedia.Position.TotalMilliseconds - mediaPosition) >= 500.0) + { + defaultMedia.Position = TimeSpan.FromMilliseconds(mediaPosition); + } + }); + } } public void Dispose() diff --git a/Qwilight/System/MediaSystem/MediaNote.cs b/Qwilight/System/MediaSystem/MediaNote.cs index 0900644..5cd862c 100644 --- a/Qwilight/System/MediaSystem/MediaNote.cs +++ b/Qwilight/System/MediaSystem/MediaNote.cs @@ -11,8 +11,6 @@ public Mode MediaMode { get; set; } - public bool IsLooping { get; set; } - public IHandledItem MediaItem { get; set; } public bool HasContents { get; set; } diff --git a/Qwilight/System/MediaSystem/MediaSystem.cs b/Qwilight/System/MediaSystem/MediaSystem.cs index f80d58c..cf5ff39 100644 --- a/Qwilight/System/MediaSystem/MediaSystem.cs +++ b/Qwilight/System/MediaSystem/MediaSystem.cs @@ -3,7 +3,6 @@ using Qwilight.ViewModel; using System.Collections.Concurrent; using System.IO; -using MediaPlayer = System.Windows.Media.MediaPlayer; namespace Qwilight { @@ -28,10 +27,9 @@ { if (Configure.Instance.Media && _mediaHandlerMap.TryGetValue(mediaHandler, out var mediaHandlerItems)) { - var isNoteFileMode = ViewModels.Instance.MainValue.IsNoteFileMode; foreach (var mediaHandlerItem in mediaHandlerItems) { - if (isNoteFileMode) + if (ViewModels.Instance.MainValue.IsWPFViewVisible) { mediaHandlerItem.PauseDefault(isPaused); } @@ -67,7 +65,7 @@ { foreach (var mediaHandlerItem in mediaHandlerItems) { - if (mediaHandlerItem.IsVisible && !mediaHandlerItem.IsLooping) + if (mediaHandlerItem.IsVisible && !mediaHandlerItem.HandledMediaItem.IsLooping) { if (ViewModels.Instance.MainValue.IsWPFViewVisible) { @@ -88,7 +86,7 @@ } } - public HandledMediaItem Load(string mediaFilePath, IMediaContainer mediaContainer) + public HandledMediaItem Load(string mediaFilePath, IMediaContainer mediaContainer, bool isLooping) { var isCounterWave = mediaContainer.IsCounterWave; var hash = $"{(isCounterWave ? '@' : string.Empty)}{Utility.GetID128s(File.ReadAllBytes(mediaFilePath))}"; @@ -133,19 +131,12 @@ { Source = mediaSrc.CreateMediaPlaybackItem(), IsMuted = true, - IsVideoFrameServerEnabled = true + IsVideoFrameServerEnabled = true, + IsLoopingEnabled = isLooping }, - DefaultMedia = HandlingUISystem.Instance.Handle(() => - { - var defaultMedia = new MediaPlayer - { - IsMuted = true - }; - defaultMedia.Open(new(mediaFilePath)); - defaultMedia.Stop(); - return defaultMedia; - }), - Length = mediaLength.TotalMilliseconds + MediaFilePath = mediaFilePath, + Length = mediaLength.TotalMilliseconds, + IsLooping = isLooping }; handledMediaItem.Media.CommandManager.IsEnabled = false; handledMediaItem.Media.SystemMediaTransportControls.IsEnabled = false; @@ -169,30 +160,17 @@ } } - public MediaHandlerItem Handle(HandledMediaItem handledMediaItem, IMediaHandler mediaHandler, TimeSpan levyingWait, MediaNote.Mode mode, bool isLooping) + public MediaHandlerItem Handle(HandledMediaItem handledMediaItem, IMediaHandler mediaHandler, TimeSpan levyingWait, MediaNote.Mode mode) { - handledMediaItem.Media.IsLoopingEnabled = isLooping; var mediaHandlerItem = new MediaHandlerItem { HandledMediaItem = handledMediaItem, LevyingPosition = levyingWait, Mode = mode, - IsLooping = isLooping, IsHandling = false, IsDefaultHandling = false, IsVisible = false }; - if (isLooping) - { - HandlingUISystem.Instance.HandleParallel(() => - { - handledMediaItem.DefaultMedia.MediaEnded += (sender, e) => - { - handledMediaItem.DefaultMedia.Stop(); - handledMediaItem.DefaultMedia.Play(); - }; - }); - } _mediaHandlerMap.AddOrUpdate(mediaHandler, (mediaHandler, t) => new() { t.mediaHandlerItem @@ -240,24 +218,14 @@ public MediaHandlerItem Handle(HandledMediaItem handledMediaItem, IMediaHandler mediaHandler, bool isAvailable, bool isDefaultAvailable) { - handledMediaItem.Media.IsLoopingEnabled = true; var mediaHandlerItem = new MediaHandlerItem { HandledMediaItem = handledMediaItem, LevyingPosition = TimeSpan.Zero, Mode = MediaNote.Mode.Default, - IsLooping = true, IsAvailable = isAvailable, IsDefaultAvailable = isDefaultAvailable }; - HandlingUISystem.Instance.HandleParallel(() => - { - handledMediaItem.DefaultMedia.MediaEnded += (sender, e) => - { - handledMediaItem.DefaultMedia.Stop(); - handledMediaItem.DefaultMedia.Play(); - }; - }); _mediaHandlerMap.AddOrUpdate(mediaHandler, (mediaHandler, mediaHandlerItem) => new() { mediaHandlerItem @@ -292,7 +260,7 @@ { if (mediaHandlerItem.IsVisible) { - if (mediaHandler == BaseUI.Instance ? isQuitMode && mediaHandlerItem.IsAvailable : !isNoteFileMode && Configure.Instance.Media) + if (!isNoteFileMode && (mediaHandler == BaseUI.Instance ? isQuitMode && mediaHandlerItem.IsAvailable : Configure.Instance.Media)) { if (!mediaHandlerItem.IsHandling) { diff --git a/Qwilight/System/PoolSystem/PoolSystem.cs b/Qwilight/System/PoolSystem/PoolSystem.cs index c7d39a0..60135e7 100644 --- a/Qwilight/System/PoolSystem/PoolSystem.cs +++ b/Qwilight/System/PoolSystem/PoolSystem.cs @@ -36,6 +36,13 @@ { if (isWPFViewVisible) { + foreach (var (defaultTextID, defaultTextItem) in _defaultTextItems) + { + _defaultTextItems.TryRemove(defaultTextID, out _); + } + } + else + { foreach (var (textID, textItem) in _textItems) { using (textItem) @@ -51,13 +58,6 @@ } } } - else - { - foreach (var (defaultTextID, defaultTextItem) in _defaultTextItems) - { - _defaultTextItems.TryRemove(defaultTextID, out _); - } - } foreach (var (valueTextID, text) in _valueIntTexts) { _valueIntTexts.TryRemove(valueTextID, out _); diff --git a/Qwilight/System/TwilightSystem.cs b/Qwilight/System/TwilightSystem.cs index a9e7002..d09a74d 100644 --- a/Qwilight/System/TwilightSystem.cs +++ b/Qwilight/System/TwilightSystem.cs @@ -417,13 +417,16 @@ toEnterSiteViewModel.SetAllowedPostableItems(twilightEnterSite); toEnterSiteViewModel.ModeComponentValue.CopyAsJSON(twilightEnterSite.modeComponentData); } - var toEnterSite = HandlingUISystem.Instance.Handle(() => new Site + HandlingUISystem.Instance.HandleParallel(() => { - DataContext = toEnterSiteViewModel + var toEnterSite = new Site + { + DataContext = toEnterSiteViewModel + }; + toEnterSiteViewModel.View = toEnterSite; + siteContainerViewModel.SiteCollection.Add(toEnterSite); + siteContainerViewModel.SiteView = toEnterSite; }); - toEnterSiteViewModel.View = toEnterSite; - HandlingUISystem.Instance.HandleParallel(() => siteContainerViewModel.SiteCollection.Add(toEnterSite)); - siteContainerViewModel.SiteView = toEnterSite; break; case Event.Types.EventID.CallBundle: var twilightCallBundle = Utility.GetJSON(eventItemText); diff --git a/Qwilight/Utilities/IOUtility.cs b/Qwilight/Utilities/IOUtility.cs index 6e66b1b..0fb11da 100644 --- a/Qwilight/Utilities/IOUtility.cs +++ b/Qwilight/Utilities/IOUtility.cs @@ -75,6 +75,7 @@ var faultFilePath = Path.Combine(faultEntryPath, Path.GetInvalidFileNameChars().Aggregate($"{DateTime.Now:F}.log", (faultFileName, target) => faultFileName.Replace(target, ' '))); var faultText = Utility.GetFault(e); Console.WriteLine(faultText); + Directory.CreateDirectory(Path.GetDirectoryName(faultFilePath)); File.WriteAllText(faultFilePath, faultText, Encoding.UTF8); return (faultFilePath, faultText); } diff --git a/Qwilight/View/ConfigureWindow/ComputingGUIConfigureWindow.xaml b/Qwilight/View/ConfigureWindow/ComputingGUIConfigureWindow.xaml index f689770..47747ea 100644 --- a/Qwilight/View/ConfigureWindow/ComputingGUIConfigureWindow.xaml +++ b/Qwilight/View/ConfigureWindow/ComputingGUIConfigureWindow.xaml @@ -68,21 +68,21 @@ - - - + + + - - - + + + - - - + + + - - - + + + @@ -98,9 +98,9 @@ - - - + + + @@ -109,17 +109,17 @@ - - - + + + - - - + + + - + diff --git a/Qwilight/View/ConfigureWindow/GUIConfigureWindow.xaml b/Qwilight/View/ConfigureWindow/GUIConfigureWindow.xaml index b3bb89a..227e55d 100644 --- a/Qwilight/View/ConfigureWindow/GUIConfigureWindow.xaml +++ b/Qwilight/View/ConfigureWindow/GUIConfigureWindow.xaml @@ -14,7 +14,7 @@ - + @@ -36,6 +36,11 @@ + diff --git a/Qwilight/View/MainWindow/MainWindow.xaml.cs b/Qwilight/View/MainWindow/MainWindow.xaml.cs index 70fe062..66d3168 100644 --- a/Qwilight/View/MainWindow/MainWindow.xaml.cs +++ b/Qwilight/View/MainWindow/MainWindow.xaml.cs @@ -239,15 +239,21 @@ { if (isVisible) { - _siteView.Enable(); - _siteView.Show(); - _windowXamlView.NavigateFocus(new(XamlSourceFocusNavigationReason.Programmatic)); - _d2DView.Focus(FocusState.Programmatic); + HandlingUISystem.Instance.HandleParallel(() => + { + _siteView.Enable(); + _siteView.Show(); + _windowXamlView.NavigateFocus(new(XamlSourceFocusNavigationReason.Programmatic)); + _d2DView.Focus(FocusState.Programmatic); + }); } else { - _siteView.Hide(); - _siteView.Disable(); + HandlingUISystem.Instance.HandleParallel(() => + { + _siteView.Hide(); + _siteView.Disable(); + }); } } diff --git a/Qwilight/View/QwilightClass.xaml.cs b/Qwilight/View/QwilightClass.xaml.cs index c9c6e8f..c2e494c 100644 --- a/Qwilight/View/QwilightClass.xaml.cs +++ b/Qwilight/View/QwilightClass.xaml.cs @@ -129,7 +129,6 @@ Directory.CreateDirectory(QwilightComponent.BundleEntryPath); Directory.CreateDirectory(QwilightComponent.CommentEntryPath); Directory.CreateDirectory(QwilightComponent.EdgeEntryPath); - Directory.CreateDirectory(QwilightComponent.FaultEntryPath); Directory.CreateDirectory(QwilightComponent.MediaEntryPath); Directory.CreateDirectory(LevelSystem.EntryPath); } diff --git a/Qwilight/ViewModel/MainViewModel.cs b/Qwilight/ViewModel/MainViewModel.cs index 62a6862..b81f912 100644 --- a/Qwilight/ViewModel/MainViewModel.cs +++ b/Qwilight/ViewModel/MainViewModel.cs @@ -219,13 +219,17 @@ { if (SetProperty(ref _isWPFViewVisible, value, nameof(IsWPFViewVisible))) { + if (!value) + { + DrawingSystem.Instance.OnModified(); + } + PoolSystem.Instance.Wipe(value); StrongReferenceMessenger.Default.Send(new SetD2DViewVisibility { IsVisible = !value }); IsVital = IsComputingMode && !value; ViewModels.Instance.NotifyWindowViewModels(); - DrawingSystem.Instance.OnModified(); var handlingComputer = GetHandlingComputer(); if (handlingComputer != null) { @@ -235,7 +239,6 @@ MediaSystem.Instance.HandleDefaultIfAvailable(BaseUI.Instance); MediaSystem.Instance.HandleIfAvailable(BaseUI.Instance); TVSystem.Instance.HandleSystemIfAvailable(); - PoolSystem.Instance.Wipe(value); } } } @@ -777,7 +780,10 @@ Configure.Instance.WindowLengthV2 = (int)(windowAreaLength / WindowDPI); Configure.Instance.WindowHeightV2 = (int)(windowAreaHeight / WindowDPI); } - DrawingSystem.Instance.OnModified(); + if (!IsWPFViewVisible) + { + DrawingSystem.Instance.OnModified(); + } } public void OnMove()