Advertisement
SolidDesu

Untitled

Jan 7th, 2025
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.66 KB | None | 0 0
  1. void drawTriangles(
  2.     float* vertices, float* colors_, float* uv_, uint32_t* indices, int triangle_count,
  3.     const gfxm::mat4& proj, const gfxm::mat4& view, const gfxm::mat4& model
  4. ) {
  5.     int dither_table[64] = {
  6.         0, 1, 0, 1, 0, 1, 0, 1,
  7.         1, 0, 1, 0, 1, 0, 1, 0,
  8.         0, 1, 0, 1, 0, 1, 0, 1,
  9.         1, 0, 1, 0, 1, 0, 1, 0,
  10.         0, 1, 0, 1, 0, 1, 0, 1,
  11.         1, 0, 1, 0, 1, 0, 1, 0,
  12.         0, 1, 0, 1, 0, 1, 0, 1,
  13.         1, 0, 1, 0, 1, 0, 1, 0,
  14.     };
  15.     uint32_t dither_table2[64] = {
  16.         0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010,
  17.         0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000,
  18.         0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010,
  19.         0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000,
  20.         0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010,
  21.         0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000,
  22.         0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010,
  23.         0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000, 0x00101010, 0x00000000
  24.     };
  25.     const gfxm::mat4 transform = proj * view * model;
  26.    
  27.     for (int ti = 0; ti < triangle_count; ++ti) {
  28.         //float* triangle = vertices + ti * 3 * 3;
  29.         //float* colors = colors_ + ti * 3 * 3;
  30.         float triangle[12] = {
  31.             vertices[indices[ti * 3] * 3], vertices[indices[ti * 3] * 3 + 1], vertices[indices[ti * 3] * 3 + 2], 1.f,
  32.             vertices[indices[ti * 3 + 1] * 3], vertices[indices[ti * 3 + 1] * 3 + 1], vertices[indices[ti * 3 + 1] * 3 + 2], 1.f,
  33.             vertices[indices[ti * 3 + 2] * 3], vertices[indices[ti * 3 + 2] * 3 + 1], vertices[indices[ti * 3 + 2] * 3 + 2], 1.f
  34.         };
  35.         float colors[9] = {
  36.             colors_[indices[ti * 3] * 3], colors_[indices[ti * 3] * 3 + 1], colors_[indices[ti * 3] * 3 + 2],
  37.             colors_[indices[ti * 3 + 1] * 3], colors_[indices[ti * 3 + 1] * 3 + 1], colors_[indices[ti * 3 + 1] * 3 + 2],
  38.             colors_[indices[ti * 3 + 2] * 3], colors_[indices[ti * 3 + 2] * 3 + 1], colors_[indices[ti * 3 + 2] * 3 + 2]
  39.         };
  40.         float uv[6] = {
  41.             uv_[indices[ti * 3] * 2], uv_[indices[ti * 3] * 2 + 1],
  42.             uv_[indices[ti * 3 + 1] * 2], uv_[indices[ti * 3 + 1] * 2 + 1],
  43.             uv_[indices[ti * 3 + 2] * 2], uv_[indices[ti * 3 + 2] * 2 + 1]
  44.         };
  45.  
  46.         for (int i = 0; i < 3; ++i) {
  47.             gfxm::vec4 p = transform * gfxm::vec4(triangle[i * 4], triangle[i * 4 + 1], triangle[i * 4 + 2], 1.f);
  48.             triangle[i * 4] = p.x;
  49.             triangle[i * 4 + 1] = p.y;
  50.             triangle[i * 4 + 2] = p.z;
  51.             triangle[i * 4 + 3] = 1.f / p.w;
  52.         }
  53.  
  54.         float tri[9] = {
  55.             .0f, .0f, .0f,
  56.             .0f, .0f, .0f,
  57.             .0f, .0f, .0f
  58.         };
  59.         for (int i = 0; i < 3; ++i) {
  60.             int bi = i * 3;
  61.             int sbi = i * 4;
  62.             tri[bi] = (triangle[sbi] + 1) * (sdGetCanvasWidth() * .5f) + 0;
  63.             tri[bi + 1] = (triangle[sbi + 1] + 1) * (sdGetCanvasHeight() * .5f) + 0;
  64.             tri[bi + 2] = (triangle[sbi + 2] + 1) * triangle[sbi + 3] - 1.f;
  65.             //tri[bi + 2] = (triangle[bi + 2] + 1) * (zfar - znear) * .5f + znear;
  66.         }
  67.  
  68.         // TODO: Check if triangle is facing the camera
  69.         // discard early if not
  70.         // use cross product for this
  71.  
  72.         int minx = int(tri[0]);
  73.         int miny = int(tri[1]);
  74.         int maxx = minx;
  75.         int maxy = miny;
  76.         for (int i = 1; i < 3; ++i) {
  77.             minx = (int)std::fmin(minx, tri[i * 3]);
  78.             maxx = (int)std::fmax(maxx, tri[i * 3]);
  79.             miny = (int)std::fmin(miny, tri[i * 3 + 1]);
  80.             maxy = (int)std::fmax(maxy, tri[i * 3 + 1]);
  81.         }
  82.         minx = std::max(0, minx);
  83.         maxx = std::min(sdGetCanvasWidth() - 1, maxx);
  84.         miny = std::max(0, miny);
  85.         maxy = std::min(sdGetCanvasHeight() - 1, maxy);
  86.         const float ABx = tri[3] - tri[0];
  87.         const float ABy = tri[4] - tri[1];
  88.         const float BCx = tri[6] - tri[3];
  89.         const float BCy = tri[7] - tri[4];
  90.         const float CAx = tri[0] - tri[6];
  91.         const float CAy = tri[1] - tri[7];
  92.         const float tri_area = 2.f * triangle_area(
  93.             tri[0], tri[1],
  94.             tri[3], tri[4],
  95.             tri[6], tri[7]
  96.         );
  97.         float sign = 1.f;
  98.         float tcross = (ABx * BCy) - (ABy * BCx);
  99.         if (tcross <= .0f) {
  100.             continue;
  101.         }
  102.         if (tcross < .0f) {
  103.             sign = -sign;
  104.         }
  105.         for (int y = miny; y <= maxy; ++y) {
  106.             for (int x = minx; x <= maxx; ++x) {
  107.                 const float APx = x - tri[0];
  108.                 const float APy = y - tri[1];
  109.                 const float BPx = x - tri[3];
  110.                 const float BPy = y - tri[4];
  111.                 const float CPx = x - tri[6];
  112.                 const float CPy = y - tri[7];
  113.                 const float crossA = ((ABx * APy) - (ABy * APx)) * sign;
  114.                 const float crossB = ((BCx * BPy) - (BCy * BPx)) * sign;
  115.                 const float crossC = ((CAx * CPy) - (CAy * CPx)) * sign;
  116.                    
  117.                 if (crossA >= 0 && crossB >= 0 && crossC >= 0) {
  118.                     uint32_t dith = dither_table[((x & 0b111) + (y & 0b111) * 8)];
  119.                     uint32_t dith2 = dither_table2[((x & 0b111) + (y & 0b111) * 8)];
  120.                     const float wA = (crossB) / tri_area;
  121.                     const float wB = (crossC) / tri_area;
  122.                     const float wC = (crossA) / tri_area;
  123.                     float src_depth = (
  124.                         tri[2] * wA + tri[5] * wB + tri[8] * wC
  125.                     );
  126.                     uint32_t isrc_depth = (uint32_t)((src_depth + 1.f) * .5f * 255.f);
  127.                     {
  128.                         // Check depth
  129.                         uint32_t bb = sdGetBackBuffer()[x + y * sdGetCanvasWidth()];
  130.                         uint32_t idst_depth = (bb & 0xFF000000) >> 24;
  131.                         if (isrc_depth > idst_depth) {
  132.                             continue;
  133.                         }
  134.                     }
  135.                     float tuv[2] = {
  136.                         uv[0] * wA + uv[2] * wB + uv[4] * wC,
  137.                         uv[1] * wA + uv[3] * wB + uv[5] * wC
  138.                     };
  139.                     uint32_t texel = sampleTextureNearest(current_texture, tuv[0], tuv[1]);
  140.                     // Flip RGB to BGR and replace alpha with depth
  141.                     texel = (isrc_depth << 24)
  142.                         | ((texel & 0x00FF0000) >> 16)
  143.                         | (texel & 0x0000FF00)
  144.                         | ((texel & 0x000000FF) << 16);
  145.                     /*
  146.                     texel =
  147.                         (isrc_depth << 24)
  148.                         | (((((texel & 0x00FF0000) >> 16) / 32 + dith) * 32))
  149.                         | (((((texel & 0x0000FF00) >> 8) / 32 + dith) * 32) << 8)
  150.                         | ((((texel & 0x000000FF) / 32 + dith) * 32) << 16);*/
  151.  
  152.                     float fcolor[3] = {
  153.                         colors[0] * wA + colors[3] * wB + colors[6] * wC,
  154.                         colors[1] * wA + colors[4] * wB + colors[7] * wC,
  155.                         colors[2] * wA + colors[5] * wB + colors[8] * wC
  156.                     };
  157.                     uint32_t c =
  158.                         (isrc_depth << 24)
  159.                         | (int((fcolor[0] + dith * .07f) * 7.f) * 32 << 16)
  160.                         | (int((fcolor[1] + dith * .07f) * 7.f) * 32 << 8)
  161.                         | int((fcolor[2] + dith * .07f) * 7.f) * 32;
  162.                     /*
  163.                     uint32_t c =
  164.                         0xFF000000
  165.                         | (int(fcolor[0] * 255.f) << 16)
  166.                         | (int(fcolor[1] * 255.f) << 8)
  167.                         | int(fcolor[2] * 255.f);*/
  168.                    
  169.                     //texel = (texel & 0xFF808080);
  170.                     //texel = texel & 0xFFC0C0C0;
  171.                     //texel = texel & 0xFFE0E0E0;
  172.                     //texel = texel & 0xFFF0F0F0;
  173.                     //texel += dith2;
  174.  
  175.                     // Outline BEGIN
  176.                     const uint32_t outline_color_a = 0xFFAA3366;
  177.                     const uint32_t outline_color_b = 0xFF000000;
  178.                     const uint32_t outline_color_c = 0xFF3366AA;
  179.                     uint32_t& l = sdGetBackBuffer()[x - 1 + y * sdGetCanvasWidth()];
  180.                     uint32_t& r = sdGetBackBuffer()[x + 1 + y * sdGetCanvasWidth()];
  181.                     uint32_t& u = sdGetBackBuffer()[x + (y + 1) * sdGetCanvasWidth()];
  182.                     uint32_t& d = sdGetBackBuffer()[x + (y - 1) * sdGetCanvasWidth()];
  183.                     if ((x - 1) >= 0 && (l & 0xFF000000) == 0xFF000000) {
  184.                         l = outline_color_b;
  185.                     }
  186.                     if ((x + 1) < sdGetCanvasWidth() && (r & 0xFF000000) == 0xFF000000) {
  187.                         r = outline_color_b;
  188.                     }
  189.                     if ((y + 1) < sdGetCanvasHeight() && (u & 0xFF000000) == 0xFF000000) {
  190.                         u = outline_color_b;
  191.                     }
  192.                     if ((y - 1) >= 0 && (d & 0xFF000000) == 0xFF000000) {
  193.                         d = outline_color_b;
  194.                     }
  195.                     // Outline END
  196.  
  197.                     sdGetBackBuffer()[x + y * sdGetCanvasWidth()] = texel;
  198.                 }
  199.             }
  200.         }
  201.     }
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement