Кресты / Говнокод #20198 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
void CRenderer::renderToTexture(CTexture &dest, CTexture &src, TRANSFORM tr)
{
	int w = src.width();
	Concurrency::parallel_for(0, w, [&] (int i) 
	{
		int h = src.height();
		for(int j = 0; j < h; j++)
		{
			COLOR temp = src.pixel(i, j);
			if(temp == TRANSPARENT_COLOR) continue;

			//scale
			float dx = (i-(w/2) + 0.5f)*tr.scale[0];
			float dy = (j-(h/2) + 0.5f)*tr.scale[1];

			//rotate
			float dx2 = dx*tr.cosRot - dy*tr.sinRot;
			float dy2 = dx*tr.sinRot + dy*tr.cosRot;

			//translate
			dx2 += tr.trans[0];
			dy2 += tr.trans[1];

			//update pixels
			float xMin = dx2 - 0.5f*tr.scale[0] + w/2;   if(xMin < 0) xMin = 0;
			float yMin = dy2 - 0.5f*tr.scale[1] + w/2;   if(yMin < 0) yMin = 0;
			float xMax = xMin + tr.scale[0];  if(xMax-(int)xMax > 0) xMax++;   if(xMax >= dest.width()) xMax = dest.width()-1;
			float yMax = yMin + tr.scale[1];  if(yMax-(int)yMax > 0) yMax++;   if(yMax >= dest.height()) yMax = dest.height()-1;
			for(float ki = xMin; ki <= xMax; ki++) for(float kj = yMin; kj <= yMax; kj++) dest.pixel(ki, kj) = temp;	
		}
	});
}

Писал ручками трансформацию картинок в 2д, вышло без искажений пропорций, но с дырками, уродливо, и просадило фпс в самую жопень!

Запостил: puksus puksus, (Updated )

Комментарии (3) RSS

  • Если вдруг кому-то придётся делать то же самое (в чём я сомневаюсь):
    1) Матрицу поворота и вектор сдвига готовим перед циклами, чтобы в цикле было примерно так:
    dx = i*cosRot - j*sinRot + deltaX;
    dy = i*sinRot + j*cosRot + deltaY;
    2) Чтобы не было "с дырками, уродливо", переходим от координат dest в координаты src.
    Т. е. преобразование, написанное чуть выше, должно быть преобразованием, обратным заданному.
    3) Гуглим тему. Возможно, есть ещё моменты, о которых я не знаю.
    Ответить
    • > переходим от координат dest в координаты src
      Будет без дырок, но один хер уродливо аля GL_NEAREST. Пикселищи при большом зуме, шум при маленьком...
      Ответить
      • Тут надо нормальную фильтрацию текстуры юзать и не ебать мозг.

        Ну или как в древних софтрендерных игрушках - выбирать пиксели с разбросом, чтобы получилось что-то типа dithering'а. Там формулка совсем простая была, а результат вполне няшный.
        Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8