added stars rendering in background

pull/3471/head
kallaballa 2 years ago
parent c09689cced
commit 7745424f15
  1. 63
      src/font/font-demo.cpp

@ -8,14 +8,26 @@
#include <sstream> #include <sstream>
#include <limits> #include <limits>
/** Application parameters **/
constexpr unsigned int WIDTH = 1920; constexpr unsigned int WIDTH = 1920;
constexpr unsigned int HEIGHT = 1080; constexpr unsigned int HEIGHT = 1080;
constexpr unsigned long DIAG = hypot(double(WIDTH), double(HEIGHT));
constexpr bool OFFSCREEN = false; constexpr bool OFFSCREEN = false;
constexpr const char* OUTPUT_FILENAME = "font-demo.mkv"; constexpr const char* OUTPUT_FILENAME = "font-demo.mkv";
constexpr const int VA_HW_DEVICE_INDEX = 0; constexpr const int VA_HW_DEVICE_INDEX = 0;
constexpr double FPS = 60; constexpr double FPS = 60;
/** Visualization parameters **/
constexpr float FONT_SIZE = 40.0f; constexpr float FONT_SIZE = 40.0f;
constexpr float MAX_STAR_SIZE = 1.0f;
constexpr int MIN_STAR_COUNT = 1000;
constexpr int MAX_STAR_COUNT = 3000;
constexpr float MIN_STAR_LIGHTNESS = 1.0f;
constexpr int MIN_STAR_ALPHA = 5;
// Intensity of glow defined by kernel size. The default scales with the image diagonal.
constexpr int GLOW_KERNEL_SIZE = std::max(int(DIAG / 138 % 2 == 0 ? DIAG / 138 + 1 : DIAG / 138), 1);
using std::cerr; using std::cerr;
using std::endl; using std::endl;
@ -52,14 +64,14 @@ int main(int argc, char **argv) {
cerr << "OpenGL Version: " << gl::get_info() << endl; cerr << "OpenGL Version: " << gl::get_info() << endl;
cerr << "OpenCL Platforms: " << endl << cl::get_info() << endl; cerr << "OpenCL Platforms: " << endl << cl::get_info() << endl;
//BGRA frame buffer and warped image //BGRA
cv::UMat frameBuffer, warped; cv::UMat frameBuffer, stars, warped;
//BGR video frame. //BGR
cv::UMat videoFrame; cv::UMat videoFrame;
//The text to display //The text to display
string text = cv::getBuildInformation(); string text = cv::getBuildInformation();
//Create a istringstream that we will read and the rewind. over again. //Create a istringstream that we will read and then rewind. over again.
std::istringstream iss(text); std::istringstream iss(text);
//Count the number of lines. //Count the number of lines.
off_t numLines = std::count(text.begin(), text.end(), '\n'); off_t numLines = std::count(text.begin(), text.end(), '\n');
@ -68,6 +80,34 @@ int main(int argc, char **argv) {
vector<cv::Point2f> src = {{0,0},{WIDTH,0},{WIDTH,HEIGHT},{0,HEIGHT}}; vector<cv::Point2f> src = {{0,0},{WIDTH,0},{WIDTH,HEIGHT},{0,HEIGHT}};
vector<cv::Point2f> dst = {{WIDTH/3,0},{WIDTH/1.5,0},{WIDTH,HEIGHT},{0,HEIGHT}}; vector<cv::Point2f> dst = {{WIDTH/3,0},{WIDTH/1.5,0},{WIDTH,HEIGHT},{0,HEIGHT}};
cv::Mat M = cv::getPerspectiveTransform(src, dst); cv::Mat M = cv::getPerspectiveTransform(src, dst);
cv::RNG rng(cv::getTickCount());
//Activate the OpenCL context for OpenGL.
gl::bind();
//Begin a nanovg frame.
nvg::begin();
nvg::clear(0,0,0,1);
{
//draw stars
using kb::nvg::vg;
int numStars = rng.uniform(MIN_STAR_COUNT, MAX_STAR_COUNT);
for(int i = 0; i < numStars; ++i) {
nvgBeginPath(vg);
nvgStrokeWidth(vg, rng.uniform(0.5f, MAX_STAR_SIZE));
nvgStrokeColor(vg, nvgHSLA(0, 1, rng.uniform(MIN_STAR_LIGHTNESS, 1.0f), rng.uniform(MIN_STAR_ALPHA, 255)));
nvgCircle(vg, rng.uniform(0, WIDTH) , rng.uniform(0, HEIGHT), MAX_STAR_SIZE);
nvgStroke(vg);
}
}
//End a nanovg frame
nvg::end();
//Aquire frame buffer from OpenGL.
gl::acquire_from_gl(frameBuffer);
//Copy the star rendering.
frameBuffer.copyTo(stars);
//Release frame buffer to OpenGL.
gl::release_to_gl(frameBuffer);
//Frame count. //Frame count.
size_t cnt = 0; size_t cnt = 0;
@ -76,15 +116,14 @@ int main(int argc, char **argv) {
while (true) { while (true) {
y = 0; y = 0;
//Activate the OpenCL context for OpenGL.
gl::bind(); gl::bind();
//Begin a nanovg frame. //Begin a nanovg frame.
nvg::begin(); nvg::begin();
//Clear the screen with black. The clear color can be specified. //Clear the screen with black.
nvg::clear(); nvg::clear(0,0,0,0);
{ {
using kb::nvg::vg; using kb::nvg::vg;
nvgBeginPath(vg);
nvgFontSize(vg, FONT_SIZE); nvgFontSize(vg, FONT_SIZE);
nvgFontFace(vg, "serif"); nvgFontFace(vg, "serif");
nvgFillColor(vg, nvgHSLA(0.15, 1, 0.5, 255)); nvgFillColor(vg, nvgHSLA(0.15, 1, 0.5, 255));
@ -106,7 +145,7 @@ int main(int argc, char **argv) {
for (std::string line; std::getline(iss, line); ) { for (std::string line; std::getline(iss, line); ) {
//Check if all yet-to-crawl lines have been skipped. //Check if all yet-to-crawl lines have been skipped.
if(skipLines == 0) { if(skipLines == 0) {
//Check if the current lines fits in the page. //Check if the current line fits in the page.
if(((translateY + y) / FONT_SIZE) < pageLines) { if(((translateY + y) / FONT_SIZE) < pageLines) {
nvgText(vg, WIDTH/2.0, y, line.c_str(), line.c_str() + line.size()); nvgText(vg, WIDTH/2.0, y, line.c_str(), line.c_str() + line.size());
y += FONT_SIZE; y += FONT_SIZE;
@ -135,10 +174,10 @@ int main(int argc, char **argv) {
gl::acquire_from_gl(frameBuffer); gl::acquire_from_gl(frameBuffer);
//Pseudo 3D text effect. //Pseudo 3D text effect.
cv::warpPerspective(frameBuffer, warped, M, videoFrame.size(), cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar()); cv::warpPerspective(frameBuffer, warped, M, videoFrame.size(), cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar());
//Copy back to frame buffer //Combine layers
warped.copyTo(frameBuffer); cv::add(stars, warped, frameBuffer);
//Color-conversion from BGRA to RGB. OpenCV/OpenCL. //Color-conversion from BGRA to RGB. OpenCV/OpenCL.
cv::cvtColor(warped, videoFrame, cv::COLOR_BGRA2RGB); cv::cvtColor(frameBuffer, videoFrame, cv::COLOR_BGRA2RGB);
//Transfer buffer ownership back to OpenGL. //Transfer buffer ownership back to OpenGL.
gl::release_to_gl(frameBuffer); gl::release_to_gl(frameBuffer);

Loading…
Cancel
Save