I’m a newbie to programming and I want to write conditional statements for OpenGL models such that when I click a button it loads a Triangle model in a stl vector container. When I click the same button again, it loads another model say Quad in the container, and for further button clicks it loads more models such as Cube, Toroid and so on….
I’m also going to include an Undo button to remove the last loaded model.
Can someone please guide me through writing such conditional statement on how to load about 4 models into the STL vector container for each button click, and also Undo the loading
class Shapes {
public:
Shapes(){}
~Shapes(){}
virtual void draw()
{
std::cout << "Base function called" << std::endl;
}
};
class Models : public Shapes
{
public: Models()
{
}
~Models() {}
virtual void draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f, 0.0f, -6.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); // Red color
glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glColor3f(0.0f, 1.0f, 0.0f); // Green color
glVertex3f(-1.0f, -1.0f, 0.0f); // Bottom Left
glColor3f(0.0f, 0.0f, 1.0f); // Blue color
glVertex3f( 1.0f, -1.0f, 0.0f); // Bottom Right
glEnd(); // End drawing the triangle
}
};
Draw_All_models{
std::vector<Shapes*> myObjects;
myObjects.push_back(new Triangle());
myObjects.push_back(new Quad());
//more models...
void RenderScene()
{
std::vector<Shapes*>::iterator it;
for(it = myObjects.begin() ; it != myObjects.end; ++it) (*it)->draw();
}
}
First thing to understand is, that OpenGL doesn’t maintain a scene or models. All it does is drawing nice little points, lines or triangles to the screen upon your request. Once you got that mentally digested, things become obvious:
Store a list, where each element encodes what to draw where. Then you need some method that traverses the list (or array), and for each element dispatches into the right function (also written by you) to draw the geometry according to the data of the element.
For example in C++ you may have some base class
Modelfrom which you derive classesBox,Sphere,Torusand so on.Modeldefines a virtual methoddraw. Then you make astd::list<Model*> models, which you can iterate byfor(std::list<Model*> I = models.begin(); I != models.end(); I++){(*I)->draw();}The overridden virtual
drawmethods then take care of properly rendering each kind of model.