Add texture lazy loading to fix texture copying, update weather to use new lazy loading
This commit is contained in:
parent
f1dcda2316
commit
0758fbdbee
@ -159,7 +159,8 @@ bool SDL_Texture_Wrapper::load(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
tmpSurface = TTF_RenderText_Solid(fs_font, _text.c_str(),
|
tmpSurface = TTF_RenderText_Solid(fs_font, _text.c_str(),
|
||||||
{ BOARD_RED, BOARD_GREEN, BOARD_BLUE });
|
//{ BOARD_RED, BOARD_GREEN, BOARD_BLUE });
|
||||||
|
{ 0xCC, 0xCC, 0xCC });
|
||||||
|
|
||||||
if(tmpSurface == NULL){
|
if(tmpSurface == NULL){
|
||||||
SDL_Log("SDL_Texture_Wrapper: Failed to create surface from string (%s): %s\n",
|
SDL_Log("SDL_Texture_Wrapper: Failed to create surface from string (%s): %s\n",
|
||||||
@ -358,6 +359,7 @@ void board::start(){
|
|||||||
SDL_RenderClear(_renderer);
|
SDL_RenderClear(_renderer);
|
||||||
|
|
||||||
//PLACEHOLDER, cycle color
|
//PLACEHOLDER, cycle color
|
||||||
|
/*
|
||||||
{
|
{
|
||||||
static uint8_t red = 0;
|
static uint8_t red = 0;
|
||||||
static bool up = true;
|
static bool up = true;
|
||||||
@ -377,11 +379,12 @@ void board::start(){
|
|||||||
red --;
|
red --;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
//END PLACEHOLDER
|
//END PLACEHOLDER
|
||||||
|
|
||||||
|
|
||||||
//call draw on the current panel
|
//call draw on the current panel
|
||||||
//PANELS[i]->draw();
|
PANELS[i]->draw();
|
||||||
|
|
||||||
if(fcount % 10 == 0)
|
if(fcount % 10 == 0)
|
||||||
std::cerr << "Frame : " << fcount << "\n";
|
std::cerr << "Frame : " << fcount << "\n";
|
||||||
|
@ -173,7 +173,7 @@ SDL_Window* dashboard::board::getWindow(){
|
|||||||
SDL_Renderer* dashboard::board::getRenderer(){
|
SDL_Renderer* dashboard::board::getRenderer(){
|
||||||
if(_renderer == nullptr){
|
if(_renderer == nullptr){
|
||||||
_renderer = SDL_CreateRenderer(board::getWindow(), -1,
|
_renderer = SDL_CreateRenderer(board::getWindow(), -1,
|
||||||
SDL_RENDERER_ACCELERATED);
|
SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);
|
||||||
|
|
||||||
if(_renderer == NULL)
|
if(_renderer == NULL)
|
||||||
SDL_Log("Renderer could not be created, %s\n", SDL_GetError());
|
SDL_Log("Renderer could not be created, %s\n", SDL_GetError());
|
||||||
|
@ -29,5 +29,6 @@ namespace dashboard::panel {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
SDL_Texture* _texture;
|
SDL_Texture* _texture;
|
||||||
|
virtual void initTexture() = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -15,21 +15,19 @@ using namespace dashboard::panel;
|
|||||||
|
|
||||||
weather::weather(){
|
weather::weather(){
|
||||||
std::cerr << "WEATHER CONSTRUCTOR\n";
|
std::cerr << "WEATHER CONSTRUCTOR\n";
|
||||||
|
//std::cerr << "Current Renderer : " << board::getRenderer() << "\n";
|
||||||
_time_on_screen = WEATHER_DEFAULT_ON_SCREEN_TIME;
|
_time_on_screen = WEATHER_DEFAULT_ON_SCREEN_TIME;
|
||||||
_update_interval = std::chrono::milliseconds{UPDATE_INTERVAL};
|
_update_interval = std::chrono::milliseconds{UPDATE_INTERVAL};
|
||||||
_last_update = std::chrono::high_resolution_clock::now();
|
//let set to default, will make it so it updates the texture ASAP
|
||||||
|
//_last_update;
|
||||||
_rss = rss_utils::rss(WEATHER_URL_SOURCE);
|
_rss = rss_utils::rss(WEATHER_URL_SOURCE);
|
||||||
|
|
||||||
_texture = SDL_CreateTexture(board::getRenderer(),
|
|
||||||
SDL_PIXELFORMAT_RGBA8888,
|
|
||||||
SDL_TEXTUREACCESS_TARGET,
|
|
||||||
SCREEN_WIDTH, SCREEN_HEIGHT);
|
|
||||||
|
|
||||||
update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
weather::~weather(){
|
weather::~weather(){
|
||||||
std::cerr << "WEATHER DECONSTRUCTOR\n";
|
std::cerr << "WEATHER DECONSTRUCTOR\n";
|
||||||
|
if(_texture != nullptr){
|
||||||
|
SDL_DestroyTexture(_texture);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@ -37,19 +35,24 @@ weather::~weather(){
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void weather::draw(){
|
void weather::draw(){
|
||||||
|
std::cerr << "WEATHER::DRAW\n";
|
||||||
|
|
||||||
|
//create the texture if this is the first time running draw
|
||||||
|
if(_texture == nullptr)
|
||||||
|
initTexture();
|
||||||
|
|
||||||
//check if its time to update
|
//check if its time to update
|
||||||
if((std::chrono::high_resolution_clock::now() - _last_update)
|
if((std::chrono::high_resolution_clock::now() - _last_update)
|
||||||
> _update_interval){
|
> _update_interval){
|
||||||
|
std::cerr << "UPDATING WEATHER IF STATEMENT\n";
|
||||||
//TODO multithread this
|
//TODO multithread this
|
||||||
update();
|
update();
|
||||||
|
|
||||||
update_texture();
|
update_texture();
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDL_Rect tgt = { 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT };
|
SDL_RenderCopy(board::getRenderer(), _texture, NULL, NULL);
|
||||||
|
|
||||||
//SDL_RenderCopy(board::getRenderer(), _texture, NULL,
|
|
||||||
//&tgt);
|
|
||||||
|
|
||||||
//TODO add this all to one texture
|
//TODO add this all to one texture
|
||||||
|
|
||||||
@ -68,7 +71,6 @@ void weather::update() {
|
|||||||
|
|
||||||
//fetch updates
|
//fetch updates
|
||||||
_rss.update();
|
_rss.update();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////
|
///////////////////////////////////////
|
||||||
@ -76,18 +78,49 @@ void weather::update() {
|
|||||||
// displayed, based on data in
|
// displayed, based on data in
|
||||||
// _rss
|
// _rss
|
||||||
void weather::update_texture(){
|
void weather::update_texture(){
|
||||||
//SDL_SetRenderTarget(board::getRenderer(), _texture);
|
std::cerr << "WEATHER::UPDATE_TEXTURE\n";
|
||||||
|
|
||||||
|
int ret = SDL_SetRenderTarget(board::getRenderer(), _texture);
|
||||||
|
std::cerr << "ret : " << ret << "\n";
|
||||||
|
std::cerr << "Renderer : " << board::getRenderer() << "\n";
|
||||||
|
if(ret != 0)
|
||||||
|
SDL_Log("ERROR : %s\n", SDL_GetError());
|
||||||
|
|
||||||
|
|
||||||
SDL_Rect tgt;
|
SDL_Rect tgt;
|
||||||
|
|
||||||
|
//title
|
||||||
tgt.x = 50;
|
tgt.x = 50;
|
||||||
tgt.y = 50;
|
tgt.y = 50;
|
||||||
TTF_SizeText(board::getFont({ "Roboto_Mono/RobotoMono-Medium.ttf", 24 }),
|
TTF_SizeText(board::getFont({ "Roboto_Mono/RobotoMono-Medium.ttf", 24 }),
|
||||||
_rss.getTitle().c_str(),
|
_rss.getTitle().c_str(),
|
||||||
&tgt.w, &tgt.h);
|
&tgt.w, &tgt.h);
|
||||||
|
|
||||||
SDL_RenderCopy(board::getRenderer(),
|
|
||||||
board::getString(_rss.getTitle(),
|
|
||||||
{ "Roboto_Mono/RobotoMono-Medium.ttf", 24 }), NULL, &tgt );
|
|
||||||
|
|
||||||
//SDL_SetRenderTarget(board::getRenderer(), NULL);
|
std::cerr << "tgt.w : " << tgt.w << "\n";
|
||||||
|
std::cerr << "tgt.h : " << tgt.h << "\n";
|
||||||
|
std::cerr << "board::getString : " << board::getString(_rss.getTitle(),{ "Roboto_Mono/RobotoMono-Medium.ttf", 24 }) << "\n";
|
||||||
|
|
||||||
|
ret = SDL_RenderCopy(board::getRenderer(),
|
||||||
|
//board::getString(_rss.getTitle(),
|
||||||
|
board::getString(_rss.getTitle(),
|
||||||
|
{ "Roboto_Mono/RobotoMono-Medium.ttf", 24 }), NULL, &tgt);
|
||||||
|
|
||||||
|
std::cerr << "ret : " << ret << "\n";
|
||||||
|
|
||||||
|
SDL_SetRenderTarget(board::getRenderer(), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////
|
||||||
|
// Lazy load the texture object
|
||||||
|
// This is to make sure that all of SDL
|
||||||
|
// is init before we attempt to draw anything
|
||||||
|
void weather::initTexture(){
|
||||||
|
if(_texture == nullptr){
|
||||||
|
_texture = SDL_CreateTexture(board::getRenderer(),
|
||||||
|
SDL_PIXELFORMAT_RGBA8888,
|
||||||
|
SDL_TEXTUREACCESS_TARGET,
|
||||||
|
SCREEN_WIDTH, SCREEN_HEIGHT);
|
||||||
|
|
||||||
|
SDL_SetTextureBlendMode(_texture, SDL_BLENDMODE_NONE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ namespace dashboard::panel {
|
|||||||
private:
|
private:
|
||||||
void update();
|
void update();
|
||||||
void update_texture();
|
void update_texture();
|
||||||
|
void initTexture();
|
||||||
|
|
||||||
rss_utils::rss _rss;
|
rss_utils::rss _rss;
|
||||||
std::chrono::time_point<std::chrono::high_resolution_clock> _last_update;
|
std::chrono::time_point<std::chrono::high_resolution_clock> _last_update;
|
||||||
|
@ -16,5 +16,6 @@ namespace dashboard::panel {
|
|||||||
|
|
||||||
//How long should we wait between updates? in ms
|
//How long should we wait between updates? in ms
|
||||||
//Default 1 hour
|
//Default 1 hour
|
||||||
constexpr size_t UPDATE_INTERVAL = 3600000;
|
//constexpr size_t UPDATE_INTERVAL = 3600000;
|
||||||
|
constexpr size_t UPDATE_INTERVAL = 5000;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user