Im creating an viewport on the superior right corner, where i render an image. but i end up rendering all objects that i draw on that viewport instead of the rest of the screen. in this case i have drawn a triangle.
this is the code: window
Window::Window (const std::string &title, int width, int height): title(title),width(width),height(height){closed=!init();}
bool Window::init(){
window=SDL_CreateWindow(title.c_str(),SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,width,height,0);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
}
void Window::clear() const{
SDL_RenderPresent(renderer);
SDL_SetRenderDrawColor(renderer,0,0,200,255);
SDL_RenderClear(renderer);
}
the draw code:
Draw::Draw(int w,int h,int x,int y,int r,int g,int b,int a):w(w),h(h),x(x),y(y),r(r),g(g),b(b),a(a){}
Draw::Draw(int w,int h,int x,int y,const std::string &image):w(w),h(h),x(x),y(y){
auto surface = IMG_Load(image.c_str());
texture=SDL_CreateTextureFromSurface(Window::renderer,surface);
SDL_FreeSurface(surface);
}
void Draw::drawline() const{
SDL_SetRenderDrawColor(Window::renderer,r,g,b,a);
SDL_RenderDrawLine(Window::renderer,x,y,w,h);
}
void Draw::drawviewport() {
SDL_Rect viewport ={x,y,w,h};
SDL_RenderSetViewport(Window::renderer, &viewport );
SDL_RenderCopy( Window::renderer, texture, NULL, NULL );
SDL_RenderSetViewport(Window::renderer, NULL );
}
main code:
Window window("test SDL 1", 1920, 1080);
Draw rs(960,550,960,0,"deposit/sdl.jpg");
Draw linha1(0,400,200,200,255,255,0,0);
Draw linha2(400,400,200,200,255,255,0,0);
Draw linha3(400,400,0,400,255,255,0,0);
while(!window.isClosed()){
rs.drawviewport();
linha1.drawline();
linha2.drawline();
linha3.drawline();
window.clear();
}
Solution by keltar:
You never reset viewport back to fullscreen (SDL_RenderSetViewport(renderer, NULL)). However at this point it is unclear why you need separate viewports at all - what's written in question better be done with single RenderCopy with your "viewport" structure as destination rectangle.