Mikle
А. Понял, принял.
Ну ладно, если что через битмап отскейлю тогда. Я просто боялся, что может где-то у меня косяк, но если переполнение, тогда понятно.
Ты кстати как-то упоминал, что хотел новую версию ср2д делать? Не ждать?)
SilentPrayerCG
> Ты кстати как-то упоминал, что хотел новую версию ср2д делать? Не ждать?
С одной стороны - не хочется обнадёживать. С другой - я когда-то давно Alprogу писал, что скейл и поворот - это слишком круто для простого спрайтового софт движка, а потом всё-таки сделал это.
Mikle
привет
кажется нашел проблему, что если у drawline одна из точек, запределами битмапы, (причем нормально только если X > ширины спрайта) то линия улетает ровно вниз или ровно вверх. т.е если рисовать от центра спрайта линиями круг во все стороны, то только те линии у которых 2ая точка уходит за предел ширины нормально рисуются. остальные либо прямая линия вверх либо прямая линия вниз или влево.
Сейчас еще код чекну самой отрисовки линии, а то может при портировании что-то сломал.
посмотрел. трудно сказать. если только сравнивать с вб версией которую ты сам делал
может это так и должно быть? с друго стороны права же нормально когда за пределами
хотя я вот вижу тут какие-то выходы из процедуры есть
if (p1.y > B || p2.y < T) { return; }
SilentPrayerCG
Сейчас под рукой нет NET языков. Проверил на VB6 - всё работает нормально.
Вот проверочный проект: https://disk.yandex.ru/d/hjFgcM2jHINxEQ
Я так понял, ты сам сделал 64-битную версию для шарпа из моей vb-версии порта?
Попробуй глянуть шарп код в 32-битной версии: https://disk.yandex.ru/d/JhOoqcSThmP7c
Там же код разной битности практически не отличается, разница в основном в инициализациях и декларациях.
Да я вроде так и делал) Но ок я чекну, значит я наверное что-то упустил.
ps
короче починил, спасибо, что подсказал что это с моей стороны
там где k каст во флоат был пролюблен, по этому в прямые линии уходило
Mikle
Привет. А такой операции как Blit в SR2D нет? Я так понимаю это как Draw только фрагмента src спрайта. Или только заранее создать спрайт, и туда нарисовать, и потом уже рисовать этот спрайт куда нужно?
SilentPrayerCG
> Я так понимаю это как Draw только фрагмента src спрайта. Или только заранее создать спрайт, и туда нарисовать, и потом уже рисовать этот спрайт куда нужно?
Можно настроить Lock Rect, чтобы не готовить промежуточный спрайт.
Mikle
А подскажи как будет работать это?
Если спрайту сделать SetLockRect, то что будет?
У system.graphics такое есть вроде, но это позволяет рисовать только на указанной области вроде.
SilentPrayerCG
> это позволяет рисовать только на указанной области вроде
Да, тут так же. Делаешь спрайту-приёмнику LockRect на область, куда должна попасть нужная часть источника.
Mikle
Да, кажется понял. Что-то голова плохо соображает вообще последнее время.
Еще нашел странность, но не уверен туплю может я опять.
Создем спрайт 1. закрашиваем цветом 0 (т.е альфа 0)
берем спрайт 2 загружаем в него пнг
рисуем спрайт 2 на спрайте 1 с альфаблендром.. в результате просто прозрачность.
а вот если альфатест сделать то нормально получается.
я помню был какой-то баг что альфа портилась, при похожем наложении. но ты вроде его фиксил.
SilentPrayerCG
> в результате просто прозрачность.
А ты какого результата ожидаешь?
Я сейчас проверил x32 версию - альфа тоже накладывается с альфа-наложением.
В x64 не так? Могу поправить, просто нет стандарта, как должно быть. Если x64 код альфу вообще не трогает, то, по идее, это более правильно.
ну, я рисую на спрайт который пустой (весь залит цветом 0), картинку, у которой альфа вся 255, и получается что результат просто пустая картинка.
либо я что-то не понимаю
альфа тест нормально тоже самое рисует.
SilentPrayerCG
Так всё-таки, какого результата ожидаешь?
Результат то не пустой получается, просто в нём по-прежнему нулевая альфа. Или я тебя не понял, результат действительно пустой?
Mikle
Смотри
вот такой код для примера, без внешних файлов
Sprite s0 = new Sprite(1024, 1024); Sprite s1 = new Sprite(768, 768); s0.ClearBuffer(0); s1.ClearBuffer(SR2D.ARGB(255, 64, 64, 255)); s0.Draw(s1, 0, 0, SR2D.Op.AlphaBlend); int c0 = s0.GetPixel(1, 1); Color cl0 = Color.FromArgb(c0);
и cl0 показывает такие цифры
a = 0 (почему?, если я рисую не прозрачной картинкой на прозрачный задник? но я тут логику фотошопа применяю, с пустым слоем)
r = 63
g = 63
b =254
почему на 1 меньше, чем спрайте которым я рисую
а если поменять оператор на альфа тест, то нормально
255, 64, 64, 255
SilentPrayerCG
> почему на 1 меньше, чем спрайте которым я рисую
Это есть. Сделано для повышения быстродействия - сдвиг на 8 бит (то есть деление на 256) вместо деления на 255. Кроме того, при таком расчёте получается, что 128, а не 127.5 - это полупрозрачность, удобно.
Да, небольшая погрешность, можно исправить ценой небольшой потери производительности.
Второй вопрос - это альфаканал. Сейчас сделано, что операция вообще не затрагивает альфаканал приёмника, в старых версиях он портился.
А какого действия ждёшь ты? Переноса альфаканала источника в приёмник? Даже в тех местах, где альфа = 0, то есть цвет не переносится вообще? Довольно странно.
Может такого же альфаналожения альфаканал на альфаканал, как и происходит с другими цветовыми каналами? А какой практический смысл у этого?
Хочется идей, что вообще должно происходить с альфаканалом.