Advertisement
ForrestFox

LightRoom

Mar 30th, 2021
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.89 KB | None | 0 0
  1. #include <qblib.c>
  2.  
  3. int     objbuf[320][200];
  4. float   qray[320][200];
  5. float   sqrtval[175000]; // sqrt[0..n]
  6.  
  7. // Возвращается количество сумму пересечений с объектами
  8. int bzline(int x1, int y1, int x2, int y2) {
  9.  
  10.     // Инициализация смещений
  11.     int signx  = x1 < x2 ? 1 : -1;
  12.     int signy  = y1 < y2 ? 1 : -1;
  13.     int deltax = x2 > x1 ? x2 - x1 : x1 - x2;
  14.     int deltay = y2 > y1 ? y2 - y1 : y1 - y2;
  15.     int error  = deltax - deltay;
  16.     int error2;
  17.     int match = 0;
  18.  
  19.     // Перебирать до конца
  20.     while ((x1 != x2) || (y1 != y2)) {
  21.  
  22.         // Количество пересечений
  23.         match += objbuf[x1][y1];
  24.         error2 = 2 * error;
  25.  
  26.         // Коррекция по X
  27.         if (error2 > -deltay) {
  28.             error -= deltay;
  29.             x1 += signx;
  30.         }
  31.  
  32.         // Коррекция по Y
  33.         if (error2 < deltax) {
  34.             error += deltax;
  35.             y1 += signy;
  36.         }
  37.     }
  38.  
  39.     return match;
  40. }
  41.  
  42. // Нарисовать сцену и перенести в буфер
  43. void draw_scene() {
  44.  
  45.     for (int i = 0; i < 255; i++)
  46.         palette(i, i, i, i);
  47.  
  48.     palette(255, 255, 0, 0);
  49.  
  50.     linebf(50, 50, 100, 150, -64);
  51.     linebf(60, 40, 90, 120, 0);
  52.  
  53.     linebf(150, 25, 200, 30, -64);
  54.  
  55.     circlef(270, 125, 15, -64);
  56.     pset(250, 100, -64);
  57.  
  58.     circlef(180, 160, 32, -128);
  59.     circlef(180, 160, 28, 0);
  60.     circlef(180, 160, 10, -64);
  61.  
  62.     // Перенести нарисованные объекты в буфер
  63.     for (int y = 0; y < 200; y++)
  64.     for (int x = 0; x < 320; x++)
  65.         objbuf[x][y] = qb_screen[x][y];
  66. }
  67.  
  68. int maxval = -1;
  69.  
  70. // Вычисление света
  71. void calclight(int lx, int ly) {
  72.  
  73.     for (int i = 0; i < 200; i++)
  74.     for (int j = 0; j < 320; j++) {
  75.  
  76.         qray[j][i] = 0;
  77.  
  78.         // Количество
  79.         int density = bzline(j, i, lx, ly);
  80.             density = density ? (density>>4) : 1;
  81.  
  82.         // Сколько раз пересеклось с объектами
  83.         int length = (lx-j)*(lx-j) + (ly-i)*(ly-i);
  84.         qray[j][i] = sqrtval[length] * sqrtval[density];
  85.  
  86.         if (density > maxval) maxval = density;
  87.     }
  88.  
  89.     // Перерисовка экрана
  90.     for (int i = 0; i < 200; i++)
  91.     for (int j = 0; j < 320; j++) {
  92.  
  93.         // Уровень освещенности
  94.         int lv = 255 - (int) qray[j][i];
  95.  
  96.         // Освещенность объекта
  97.         int cl = objbuf[j][i] + (lv < 0 ? 0 : lv);
  98.  
  99.         // Поставить точку
  100.         pset(j, i, (cl < 0 ? 0 : (cl > 254 ? 254 : cl)));
  101.     }
  102.  
  103.     // Курсор
  104.     pset(lx, ly, 255);
  105. }
  106.  
  107. // Рисовать квадрат в буфере
  108. void drawbox(int x, int y, int radius, int cl) {
  109.  
  110.     for (int i = -radius; i <= radius; i++)
  111.     for (int j = -radius; j <= radius; j++) {
  112.  
  113.         int xo = x + j, yo = y + i;
  114.         if (xo >= 0 && xo < 320 && yo >= 0 && yo < 200) {
  115.             objbuf[xo][yo] = cl;
  116.         }
  117.     }
  118. }
  119.  
  120. int main(int argc, char* argv[]) {
  121.  
  122.     screen(13);
  123.     draw_scene();
  124.  
  125.     int px = -1, py = -1, pst = 0;
  126.  
  127.     // Предвычисление
  128.     for (int i = 0; i < 175000; i++) sqrtval[i] = sqrt(i);
  129.  
  130.     // Бесконечный цикл проверки событий
  131.     while (sdlevent(EVT_REDRAW)) {
  132.  
  133.         // Срабатывает только изменились координаты мыши
  134.         if (mouse.x == px && mouse.y == py && mouse.st == pst) continue;
  135.  
  136.         // Нарисовать новый объект
  137.         if (mouse.st & LF_CLICK) drawbox(mouse.x, mouse.y, 1, 128);
  138.         if (mouse.st & RT_CLICK) drawbox(mouse.x, mouse.y, 1, 0);
  139.  
  140.         pst = mouse.st;
  141.         calclight(px = mouse.x, py = mouse.y);
  142.  
  143.         pset(mouse.x, mouse.y, 255);
  144.     }
  145.  
  146.     return 0;
  147. }
  148.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement