Mikle
Ну будет потом когда х64, вернемся к этому вопросу с линиями.
Я сейчас все равно в депрессии, что-бы что-то кодить.
StepEver
> нннада? о_о
Надо, если оно не задействует никаких зависимостей, от слова совсем никаких, даже стандартную библиотеку.
А есть возможность что-бы drawrotate учитывал альфу?
По-моему я делал давно, очень давно по этому точно уже не помню.
SilentPrayerCG
> А есть возможность что-бы drawrotate учитывал альфу?
Я предполагал использовать вращение в два прохода - сначала во временный спрайт вращаем, потом отображаем на приёмник уже с нужным эффектом, там ведь может быть не только альфа, а любой эффект.
Mikle
Да точно, так сработало, спасибо.
Т.е при drawrotate альфа не херится, просто нет опции эффекта, так получается?
а как высчитать размер спрайта, если квадрат повернут на 45 градусов?
ну т.е габариты картинки как-бы изменятся, как посчитать на сколько, что-бы спрайт куда рисуется поворот сразу был того размер какого надо?
SilentPrayerCG
> Т.е при drawrotate альфа не херится, просто нет опции эффекта, так получается?
Да, альфа так же вращается, как и все слои.
SilentPrayerCG
> как высчитать размер спрайта
Нужно учитывать, что в drawrotate выбирается sx и sy - это центр вращения спрайта источника, и dx и dy - точка на приёмнике, куда попадает этот центр.
Теперь, если x и y - это координаты угла источника относительно выбранного центра, то они попадут на приёмника относительно dx и dy на:
xx = x*cos(a)-y*sin(a) yy = y*cos(a)+x*sin(a)
StepEver
> У меня есть поворот, с АА и прозрачностью.
> Нада?
Сравнить бы сначала с моим по качеству и быстродействию. Есть какие-то тесты?
StepEver
> я использую пререндеренные тригонометрические функции
Зачем? Там же на весь спрайт используется один синус и один косинус, не в цикле.
StepEver
> сам поворот сделан классически: на каждую точку по матрице поворота считаются 4
> точки и по ним ищется среднее.
Тогда это вряд ли будет быстрее моего варианта.
StepEver
> чтобы не делать проверки на выход за границы памяти, я сначал делаю расширение
> спрайта в 2 раза, потом поворачиваю, а потом обратно уменьшаю в 2 раза.
А это вообще убьёт быстродействие.
StepEver
> Да, но у меня есть АА
Как будто у меня его нет.
StepEver
Глянь пример: https://yadi.sk/d/axkpVDeWr3_OrQ
Клик по форме - вкл/выкл АА.
Mikle
> Глянь пример: https://yadi.sk/d/axkpVDeWr3_OrQ
Тоже глянул из любопытства. Интересно, что при повороте к близким к углам 0, 90, 180, 270 градусов, ФПС начинает расти. От чего так?
Vitorio
> Интересно, что при повороте к близким к углам 0, 90, 180, 270 градусов, ФПС
> начинает расти. От чего так?
Источник регулярнее попадает в кэш.
StepEver
> Даже внутрь SR2D залез, но всё равно непонятно, как ты АА делаешь
Так это же внутри sr2d.dll:
extern "C" __declspec(dllexport) void __stdcall DRAW_ROT_AA( int* src, int* dest, int L, int T, int R, int B, int sx, int sy, int dx, int dy, int sw, int sh, int dw, int SinA, int CosA) { int ssx = ( sx << 16) - ( dx - L) * CosA; int ssy = ( sy << 16) - ( dx - L) * SinA; int addy = T * dw; T -= dy; B -= dy; for ( int y = T; y < B; y++) { int xx = ssx - y * SinA; int yy = ssy + y * CosA; for ( int x = L; x < R; x++) { int ix = xx >> 16; int iy = yy >> 16; if ( ( ix >= -1) && ( ix < sw) && ( iy >= -1) && ( iy < sh)) { int tx = xx & 0xFFFF; int ty = yy & 0xFFFF; int c11, c21, c12, c22; if ( ( ix == -1) || ( iy == -1)) c11 = dest[addy + x]; else c11 = src[sw * iy + ix]; if ( ( ix == sw - 1) || ( iy == -1)) c21 = dest[addy + x]; else c21 = src[sw * iy + ix + 1]; if ( ( ix == -1) || ( iy == sh - 1)) c12 = dest[addy + x]; else c12 = src[sw * ( iy + 1) + ix]; if ( ( ix == sw - 1) || ( iy == sh - 1)) c22 = dest[addy + x]; else c22 = src[sw * ( iy + 1) + ix + 1]; *( ( byte*)&dest[addy + x] + 0) =( ( *( ( byte*)&c11 + 0) * ( 0x10000 - tx) >> 12) * ( 0x10000 - ty) + ( *( ( byte*)&c21 + 0) * tx >> 12) * ( 0x10000 - ty) + ( *( ( byte*)&c12 + 0) * ( 0x10000 - tx) >> 12) * ty + ( *( ( byte*)&c22 + 0) * tx >> 12) * ty) >> 20; *( ( byte*)&dest[addy + x] + 1) =( ( *( ( byte*)&c11 + 1) * ( 0x10000 - tx) >> 12) * ( 0x10000 - ty) + ( *( ( byte*)&c21 + 1) * tx >> 12) * ( 0x10000 - ty) + ( *( ( byte*)&c12 + 1) * ( 0x10000 - tx) >> 12) * ty + ( *( ( byte*)&c22 + 1) * tx >> 12) * ty) >> 20; *( ( byte*)&dest[addy + x] + 2) =( ( *( ( byte*)&c11 + 2) * ( 0x10000 - tx) >> 12) * ( 0x10000 - ty) + ( *( ( byte*)&c21 + 2) * tx >> 12) * ( 0x10000 - ty) + ( *( ( byte*)&c12 + 2) * ( 0x10000 - tx) >> 12) * ty + ( *( ( byte*)&c22 + 2) * tx >> 12) * ty) >> 20; *( ( byte*)&dest[addy + x] + 3) =( ( *( ( byte*)&c11 + 3) * ( 0x10000 - tx) >> 12) * ( 0x10000 - ty) + ( *( ( byte*)&c21 + 3) * tx >> 12) * ( 0x10000 - ty) + ( *( ( byte*)&c12 + 3) * ( 0x10000 - tx) >> 12) * ty + ( *( ( byte*)&c22 + 3) * tx >> 12) * ty) >> 20; } xx += CosA; yy += SinA; } addy += dw; } }
Заметь, всё на целочисленных операциях, такое обогнать можно только на MMX-SSE интринсиках.
StepEver
> адова точность получается, ты делаешь смещение на 0х10000, оно того стоит?
А какая разница, на 0х10000, или на 0х100? Скорость же не изменится, так пусть будет точнее.
StepEver
> тот большой код, где ты складываешь 4 точки, я делаю немного иначе, у меня
> массив из 4 DWORD и указатель на начало, я бегу по нему и складываю(add) в него
> эти 4 точки по очереди. Потом опять бегу по нему и делю на 4.
Не понял, у тебя простое среднее арифметическое? У меня то с весовыми коэффициентами.
Mikle
Привет, есть прогресс с х64?)