84 lines
1.9 KiB
C++
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 = davinci::fVector3::BLACK;
|
|
}
|
|
|
|
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>();
|
|
}
|
|
}
|