支持抗锯齿
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
#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>();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user