Files
davinci2/test/rasterization/dvr_canvas.cpp
T
2025-08-23 12:19:28 +08:00

84 lines
1.9 KiB
C++

#include "dvr_canvas.h"
#include <array>
#define SDL_MAIN_USE_CALLBACKS 1 /* use the callbacks instead of main() */
#include <SDL3/SDL.h>
void Canvas::reset(int32_t width, int32_t height)
{
m_width = width;
m_height = height;
m_pixels.resize(m_width * m_height);
for (int32_t i = 0; i < m_width * m_height; i++)
{
m_pixels[i].fragementID = -1;
m_pixels[i].mask = 0;
m_pixels[i].color = 0;
}
m_fragementArray.clear();
}
void Canvas::_insertTriangle(const Triangle& triangle)
{
for (size_t i = 0; i < triangle.m_pixels.size(); i++)
{
const Triangle::Pixel trianglePixel = triangle.m_pixels[i];
Pixel& pixel = m_pixels[trianglePixel.y * m_width + trianglePixel.x];
Fragement newFragement;
newFragement.id = (int32_t)m_fragementArray.size();
newFragement.color = triangle.m_pixelColor;
newFragement.mask = trianglePixel.mask;
newFragement.next = pixel.fragementID;
pixel.fragementID = newFragement.id;
m_fragementArray.push_back(newFragement);
}
}
void Canvas::_update_without_AA()
{
for (size_t i = 0; i < m_pixels.size(); i++)
{
Pixel& pixel = m_pixels[i];
if (pixel.fragementID < 0) continue;
const Fragement& fragement = m_fragementArray[pixel.fragementID];
pixel.mask = fragement.mask;
pixel.color = fragement.color;
pixel.alpha = 1.f;
}
}
void Canvas::update(davinci::AntiAliasingTech aaTech, const TriangleArray& triangleArray, const Triangle* pActionTriangle)
{
reset(m_width, m_height);
for (size_t i = 0; i < triangleArray.size(); i++)
{
const Triangle& triangle = triangleArray[i];
_insertTriangle(triangle);
}
if (pActionTriangle != nullptr)
{
_insertTriangle(*pActionTriangle);
}
if (aaTech == davinci::AntiAliasingTech::AA_None)
{
_update_without_AA();
}
else if (aaTech == davinci::AntiAliasingTech::AA_MSAA_2X2)
{
_update_with_AA<4>();
}
else if ( aaTech == davinci::AntiAliasingTech::AA_MSAA_4X4)
{
_update_with_AA<16>();
}
}