#include "dvr_canvas.h" #include #define SDL_MAIN_USE_CALLBACKS 1 /* use the callbacks instead of main() */ #include 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>(); } }