How can I expand one viewPort to "Full Screen"? - opengl

I'm working on a project using JOGL API.
Now I am stuck at a point that is the followed:
-I run the program and it shows a Canvas divided in 4 viewPorts. The objective of the project is basically in each of the viewPorts we need to "project" an object from 4 diferent points of view. But first, we need to when clicking [1,2,3,4] to "expand"/"full-screen" the matched ViewPort.
My idea is when clicking any number create a new viewPort like this:gl.glViewport(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT). But this only creates a new viewPort with the size of the canvas.
How can I expand the "content" of any of the 4 viewPort to "enter" that new viewPort?

I think you've got confused what glViewport does. I don't know what you think it does (not), but what it's specified to do is, to set the portion of the OpenGL window, to which to map the post-projection (NDC) space. Or in layman terms, you use it to determine where in the window things get drawn. If you want to render full screen: Make the window full screen and set the viewport to the window size.
If you want to "expand" an existing drawing, you have to set the proper viewport and redraw the parts in question.

Related

C++ GLUT Make object dissappear when outside viewport

I have got a small question while coding. I want to draw a cube, using GLUT in C++. Im using the window to viewport transformation to draw the cube in the middle of the screen.
Now the viewport window has a size, and if I move the cube in the viewport it moves fine, however it leaves or "hangs out" from the side of the viewport window.
How could I make that if some parts of a cube leave the viewport window then it would disappear?
Drawing in the rest of the window after i draw the cube in the viewport using GL_POLYGON is not a solution.
Is there a way to create separate "canvases", or something like that in GLUT?
Found my answer using glScissor.

Is it possible to draw on an SFML window regardless of views?

I have a game I'm currently working on, and it uses multiple views (for a minimap for example).
Thing is, I would like to have a fading effect added at some point, so I thought I'd create a black image that is the size of the screen and change its alpha value with a timer. That part is not a problem.
What happens right now is the main area (ie window default view) is fading (because the opacity of the image is increasing), but the minimap (minimap view) is unaffected. This is normal behaviour for views, but is there a way to draw an image to the whole window, regardless of the views ?
Thanks in advance
To clarify, you have the default view where you'll draw the main game, then you'll have the minimap view where you would draw the minimap. At some point in the game you want the whole screen to fade to black. It sounds like you've been trying to draw a black image on the default view (changing the alpha) to make this effect work.
So, you need a third view that you draw your black image on to get this fading effect.

Managing resolution in OpenGl

I use OpenGl. I would like to create a menu-control, but for this I need a constant resolution-control. I mean that I can set the position of a button by giving a coordinate, in 1024x768. But what if my window doesn't in it. And in full screen mode I hasn't found a method to change the resolution, nevertheless I can get it. So I got the screen width/height, the window width/height and 4 coordinates in 1024x768 for a rectangle. What should I do?

SFML Text appears gigantic in small View

I've encountered a problem drawing SFML Text. In my application, I use views as a sort of coordinate system for my application. Thus, a typical view would be 10 x 10 or 20 x 20. All my normal drawing functions work fine, when drawing primitives and lines, etc., and the relevant code doesn't have to know about the coordinate system.
However, when I tried to draw text to the screen, I found that it appeared gigantic. When I reduced the font size drastically, it appeared extremely blurry and pixellated, as if it were trying to render to GIANT pixels that are 1x1 in my view.
Is there a way to draw text with a standard font size, in a way that it won't be affected by the view? Ideally, my text would width/size-wise on any view? How can I accomplish this?
Thanks for any input!
(P.S., I'm using SFML 2.0, for reference)
You can set another view (i.e. apply OpenGL transformation) and render text after it. Here is an example from sfml tutorial:
sf::View View(sf::FloatRect(600, 700, 1400, 1300));
App.SetView(View);
// Draw the game...
App.SetView(App.GetDefaultView());
// Draw the interface...

Qt GUI Development - Displaying a 2D grid using QGraphicsView

I'm new to Qt development so I've being trying to research a solution to a user interface I need to design. My project is to simulate players in an online game moving around a global map. To represent the map I need to display a 2D grid, with each space in the grid representing a region of a map. I then need to display the location of each player in the game. The back-end is all fully working, with the map implemented as a 2D array. I'm just stuck on how to display the grid.
The research I have done has led me to believe a QGraphicsView is the best way to do this, but I can't seem to find a tutorial relevant to what I need. If anyone has any tips on how to implement this it would be much appreciated.
Thanks, Dan
A 2D Grid is nothing more than a set of horizontal and vertical lines. Suppose you have a 500x500 map and you want to draw a grid where the distance between the lines in both directions is 50. The sample code that follows shows you how you can achieve it.
// create a scene and add it your view
QGraphicsScene* scene = new QGraphicsScene;
ui->view->setScene(scene);
// Add the vertical lines first, paint them red
for (int x=0; x<=500; x+=50)
scene->addLine(x,0,x,500, QPen(Qt::red));
// Now add the horizontal lines, paint them green
for (int y=0; y<=500; y+=50)
scene->addLine(0,y,500,y, QPen(Qt::green));
// Fit the view in the scene's bounding rect
ui->view->fitInView(scene->itemsVBoundingRect());
You should check the QGraphicsView and the QGraphicsScene documentation as well as the corresponding examples. Also you can watch the graphics view training videos or some graphics view related videos from the Qt developer days.
Well if you have a constant grid size or even a limited number of grid sizes what i like to do is to draw a grid block in gimp or any other program and then set that as the background brush (draw only bottom and right side of the block) qt will repeat the image and will give you a full grid. I think this is good for performance too.
This is the grid image i used in one of my programs it's 10x10 pixels.
Then call QGraphicsScene setBackgroundBrush as the follwing:
scene->setBackgroundBrush(QBrush(QPixmap(":/grid/grid10.png")));
The more native way is this:
scene = self.getScene() # Your scene.
brush = QBrush()
brush.setColor(QColor('#999'))
brush.setStyle(Qt.CrossPattern) # Grid pattern.
scene.setBackgroundBrush(brush)
borderColor = Qt.black
fillColor = QColor('#DDD')
rect = QRectF(0.0, 0.0, 1280, 720) # Screen res or whatever.
scene.addRect(rect,borderColor,fillColor) # Rectangle for color.
scene.addRect(rect,borderColor,brush) # Rectangle for grid.
Sorry by PyQt...
Suppose a scene is set to the graphicsview then simply below one line will show the grid.
ui->graphicsView->scene()->setBackgroundBrush(Qt::CrossPattern);
There several other values can be passed for ex: Qt::Dense7Pattern
These are members of enum BrushStyle, just click on any used value in Qt creator and it will take you to the enum declaration where you can see all other possible values.
PS:
A scene can be set like this:
ui->graphicsView->setScene(new QGraphicsScene());