Войти
Вело-изобретателиФорумSR2D - софтовый 2D движок

2D движок SR2D. Софтверный движок для работы с 2D графикой на VB6, vb.net, C#. (43 стр)

Страницы: 140 41 42 43 44 45 Следующая »
#630
9:16, 21 мая 2019

Mikle
Ну будет потом когда х64, вернемся к этому вопросу с линиями.
Я сейчас все равно в депрессии, что-бы что-то кодить.

#631
20:14, 21 мая 2019

StepEver
> нннада? о_о
Надо, если оно не задействует никаких зависимостей, от слова совсем никаких, даже стандартную библиотеку.

#632
9:34, 30 мая 2019

А есть возможность что-бы drawrotate учитывал альфу?
По-моему я делал давно, очень давно по этому точно уже не помню.

#633
9:50, 30 мая 2019

SilentPrayerCG
> А есть возможность что-бы drawrotate учитывал альфу?
Я предполагал использовать вращение в два прохода - сначала во временный спрайт вращаем, потом отображаем на приёмник уже с нужным эффектом, там ведь может быть не только альфа, а любой эффект.

#634
(Правка: 14:08) 14:01, 30 мая 2019

Mikle
Да точно, так сработало, спасибо.
Т.е при drawrotate альфа не херится, просто нет опции эффекта, так получается?

а как высчитать размер спрайта, если квадрат повернут на 45 градусов?
ну т.е габариты картинки как-бы изменятся, как посчитать на сколько, что-бы спрайт куда рисуется поворот сразу был того размер какого надо?

#635
(Правка: 14:37) 14:35, 30 мая 2019

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)
#636
16:58, 2 июня 2019

StepEver
> У меня есть поворот, с АА и прозрачностью.
> Нада?
Сравнить бы сначала с моим по качеству и быстродействию. Есть какие-то тесты?
StepEver
> я использую пререндеренные тригонометрические функции
Зачем? Там же на весь спрайт используется один синус и один косинус, не в цикле.

Сообщение 4985691 не найдено
#637
21:31, 2 июня 2019

StepEver
> сам поворот сделан классически: на каждую точку по матрице поворота считаются 4
> точки и по ним ищется среднее.
Тогда это вряд ли будет быстрее моего варианта.
StepEver
> чтобы не делать проверки на выход за границы памяти, я сначал делаю расширение
> спрайта в 2 раза, потом поворачиваю, а потом обратно уменьшаю в 2 раза.
А это вообще убьёт быстродействие.

#638
8:22, 3 июня 2019

StepEver
> Да, но у меня есть АА
Как будто у меня его нет.

#639
8:35, 3 июня 2019

StepEver
Глянь пример: https://yadi.sk/d/axkpVDeWr3_OrQ
Клик по форме - вкл/выкл АА.

#640
8:55, 3 июня 2019

Mikle
> Глянь пример: https://yadi.sk/d/axkpVDeWr3_OrQ
Тоже глянул из любопытства. Интересно, что при повороте к близким к углам 0, 90, 180, 270 градусов, ФПС начинает расти. От чего так?

#641
9:00, 3 июня 2019

Vitorio
> Интересно, что при повороте к близким к углам 0, 90, 180, 270 градусов, ФПС
> начинает расти. От чего так?
Источник регулярнее попадает в кэш.

#642
(Правка: 9:13) 9:12, 3 июня 2019

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 интринсиках.

#643
9:52, 3 июня 2019

StepEver
> адова точность получается, ты делаешь смещение на 0х10000, оно того стоит?
А какая разница, на 0х10000, или на 0х100? Скорость же не изменится, так пусть будет точнее.
StepEver
> тот большой код, где ты складываешь 4 точки, я делаю немного иначе, у меня
> массив из 4 DWORD и указатель на начало, я бегу по нему и складываю(add) в него
> эти 4 точки по очереди. Потом опять бегу по нему и делю на 4.
Не понял, у тебя простое среднее арифметическое? У меня то с весовыми коэффициентами.

#644
20:30, 6 июля 2019

Mikle
Привет, есть прогресс с х64?)

Страницы: 140 41 42 43 44 45 Следующая »
Вело-изобретателиФорумSR2D - софтовый 2D движок