1. C++ / Говнокод #20198

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 14 Июня 2016

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

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

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

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