AIMP Forum

AIMP for PC => Плагины / Plugins => Дополнения / Addons => Визуализации / Visualizations => Topic started by: Black_AVP_Bim on October 31, 2024, 16:06:06

Title: PolarWaves [AIMP5.30]
Post by: Black_AVP_Bim on October 31, 2024, 16:06:06
[catalog_card=1320]
Тот же Wave, только вид в полярных координатах.
Проверено VirusTotal (https://www.virustotal.com/gui/file/b048ba7a0a11c29c5a3a8e81f901c4e949d5ee91ede684a40ad68a17e2b8cefd?nocache=1)
Title: Re: PolarWaves [AIMP5.30]
Post by: Artem on October 31, 2024, 22:51:32
Круто!
Title: Re: PolarWaves [AIMP5.30]
Post by: Artem on October 31, 2024, 22:54:57
От себя бы предложил рисовать новый кадр поверх предыдущего с небольшой полупрозрачностью.
Title: Re: PolarWaves [AIMP5.30]
Post by: Black_AVP_Bim on November 01, 2024, 11:48:59
Приходила мне такая мысль в голову - частое мелькание несколько напрягает. Но тогда придётся переходить на битмапы, боюсь тормоза будут.
Сейчас всё рисуется прямо на FCanvas обычным PolyLine, даже на 4К мониторе во весь экран нагрузка на проц не превышает 10..12%.
Title: Re: PolarWaves [AIMP5.30]
Post by: Artem on November 01, 2024, 14:56:18
Можно опционально сделать. Да, BitBlt расходует время, но некритичное.
Title: Re: PolarWaves [AIMP5.30]
Post by: Artem on November 03, 2024, 08:40:53
Можно еще проще: Предыдущий кадр уже присутствует на DC, при вызове функции отрисовки заливать DC не черным, а полупрозрачным черным (см. acFillRect). 
Title: Re: PolarWaves [AIMP5.30]
Post by: Black_AVP_Bim on November 03, 2024, 11:08:27
Можно еще проще: Предыдущий кадр уже присутствует на DC, при вызове функции отрисовки заливать DC не черным, а полупрозрачным черным (см. acFillRect).
Вот, я так и пытался сделать, но как бы не менял байт прозрачности в $FF000000, та канва, что FCanvas, затирается полностью.
Возможно, надо делать опять через промежуточный буфер, попробую ещё.
Title: Re: PolarWaves [AIMP5.30]
Post by: Black_AVP_Bim on November 04, 2024, 13:37:45
Попробовал рисовать на канве ACLBitmapLayer, затем затирать acFillRect полупрозрачным чёрным, результат тот же. Похоже, любое рисование линий убивает прозрачность, как и CopyRect.
Попутно вопрос: надо ли освобождать дескриптор контекста у ACLBitmapLayer.Canvas при выходе из процедуры?
Title: Re: PolarWaves [AIMP5.30]
Post by: Artem on November 05, 2024, 08:08:17
ACLBitmapLayer.Canvas при выходе из процедуры

Нет, он сам грохнется вместе с Layer-ом.

Похоже, любое рисование линий убивает прозрачность, как и CopyRect

Странно, не должно быть такого. Как именно ты делаешь?
Title: Re: PolarWaves [AIMP5.30]
Post by: Black_AVP_Bim on November 05, 2024, 10:10:03
Странно, не должно быть такого. Как именно ты делаешь?
Фрагмент из Draw:
Code: [Select]
  BGDib.Canvas.Handle := DC;
  try
    acFillRect(BGDib.Canvas, Rect(0, 0, FWidth, FHeight), $40000000);
//...............................................................................................
    BGDib.Canvas.Pen.Width := 1;
    BGDib.Canvas.Pen.Color := clRed;
    BGDib.Canvas.PolyLine(Points);
   
// ..........................................................

  finally
//    BGDib.Canvas.Handle := 0;
  end;
Title: Re: PolarWaves [AIMP5.30]
Post by: Artem on November 05, 2024, 12:10:27
Вот тут ошибка:
Code: [Select]
BGDib.Canvas.Handle := DC;

Таким образом ты рисуешь не на BGDib, а на DC.
Вместо этого нужно делать так:
Code: [Select]
acBitBlt(BGDib.Canvas.Handle, DC, BGDib.ClientRect, TPoint.Zero);

ну и перед выходом из процедуры - обратное действо на DC
Title: Re: PolarWaves [AIMP5.30]
Post by: Artem on November 05, 2024, 12:13:09
Конечно, можно рисовать и напрямую на DC (минуя вообще всякие Canvas-ы и Bitmap-ы, будет заметно быстрее).
Если возьмешь последнюю версию ACL, там в ACL.Graphic.Ex есть ExPainter, который позволяет рисовать с альфа-каналом на любом контексте.
Использовать его как-то так:

Code: [Select]
ExPainter.BeginPaint(DC)
.. тут что-то рисуем.
ExPainter.EndPaint
Title: Re: PolarWaves [AIMP5.30]
Post by: Black_AVP_Bim on November 05, 2024, 14:20:39
Таким образом ты рисуешь не на BGDib, а на DC.

Точно, ведь! Ну, мозги уже стариковские, на элементарный вещах уже спотыкаюсь.
Но один момент: как копилятор выбирает нужную функцию из:
procedure acFillRect(ACanvas: TCanvas; const ARect: TRect; AColor: TAlphaColor); overload;
procedure acFillRect(ACanvas: TCanvas; const ARect: TRect; AColor: TAlphaColor; ARadius: Integer); overload;
procedure acFillRect(ACanvas: TCanvas; const ARect: TRect; AColor: TColor); overload;
точнее, как отличает TAlphaColor от TColor.

У меня заработало только с вызовом функции, что с радиусом заливает, видимо потому, что число параметров другое.
Title: Re: PolarWaves [AIMP5.30]
Post by: Artem on November 05, 2024, 14:32:41
Если явно тип у переменной / константы не указан - может подобрать только по знаковому/беззнаковому значению.
Чтобы точно быть уверенным, можешь сделать так:

acFillRect(BGDib.Canvas, Rect(0, 0, FWidth, FHeight), TAlphaColor($40000000));
Title: Re: PolarWaves [AIMP5.30]
Post by: Black_AVP_Bim on November 05, 2024, 14:38:18
Чтобы точно быть уверенным, можешь сделать так:
acFillRect(BGDib.Canvas, Rect(0, 0, FWidth, FHeight), TAlphaColor($40000000));
Да, так работает, а без приведения типа, видимо, вызывается та процедура с TColor.
Title: Re: PolarWaves [AIMP5.30]
Post by: Black_AVP_Bim on November 05, 2024, 15:13:04
Вариант с затуханием - https://disk.yandex.ru/d/c8YwNLsbVM5z8w
VirusTotal не ругается.
Вроде, получше смотрится.
Title: Re: PolarWaves [AIMP5.30]
Post by: Black_AVP_Bim on November 05, 2024, 16:06:27
Кстати, работает и на том DC, что передаётся в Draw, без TACLBitmapLayer
acFillRect(FCanvas, Rect(0, 0, FWidth, FHeight), TAlphaColor($50000000));
всё дело именно в TAlphaColor.
Title: Re: PolarWaves [AIMP5.30]
Post by: Black_AVP_Bim on November 06, 2024, 14:37:07
Поизвращался немного над последней версией. Ссылка прежняя на ЯД.
(https://www.aimp.ru/forum/index.php?action=dlattach;topic=73604.0;attach=72716)
Title: Re: PolarWaves [AIMP5.30]
Post by: Black_AVP_Bim on November 12, 2024, 15:56:28
PolarWaves v1.2 (ссылка в первом посте).
Добавил диалог настроек, скорее из спортивного интереса, дабы поглубже познакомиться с AIMP SDK, чем из соображения практической целесообразности.