Вы можете определить базовый класс Shape
, и Quad
и Triangle
наследовать от этого класса с перегруженной функцией draw
. Вот упрощенный , неполный пример :
/* Define these; use tuples, your own class, 3rd party, whatever */
class Position;
class Color;
/* Shape class is abstract base class */
class Shape {
public:
Shape(const Position &pos) : position(pos) {}
virtual void draw() = 0;
protected:
Position position;
};
/* Triangle and Quad classes are Shapes */
class Triangle : public Shape {
public:
Triangle(const Position &pos,
const Position &p1, const Color &c1,
const Position &p2, const Color &c2,
const Position &p3, const Color &c3)
: Shape(pos),
pos1(p1), col1(c1),
pos2(p2), col2(c2),
pos3(p3), col3(c3)
{}
virtual void draw() {
glTranslatef(position.x, position.y, position.z);
glBegin(GL_TRIANGLES);
glColor3f(col1.r, col1.g, col1.b);
glVertex3f(pos1.x, pos1.y, pos1.z);
glColor3f(col2.r, col2.g, col2.b);
glVertex3f(pos2.x, pos2.y, pos2.z);
glColor3f(col3.r, col3.g, col3.b);
glVertex3f(pos3.x, pos3.y, pos3.z);
glEnd();
}
private:
Position pos1, pos2, pos3;
Color col1, col2, col3;
};
class Quad : public Shape {
/* Your implementation here */
};
void draw_all_shapes() {
std::vector<Shape*> shapes;
shapes.push_back(new Triangle(Position(-1.5f, 0f, -6f),
Position(0f, 1f, 0f), Color(1f, 0f, 0f),
Position(-1f, -1f, 0f), Color(0f, 1f, 0f),
Position(0f, 0f, 1f), Color(0f, 0f, 1f)));
shapes.push_back(new Quad(/* Arguments */));
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
for(auto it = shapes.begin(); it != shapes.end(); it++) {
(*it)->draw();
}
glutSwapBuffers();
}
Примечание: Как я уже сказал, пример неполон. Это также не проверено и немного грязно (утечки памяти и тому подобное), но эти проблемы выходят за рамки этого вопроса. Главное, что я пытаюсь продемонстрировать здесь, это то, что вы можете преобразовывать свои функции в классы, которые могут использовать наследование и полиморфизм для упрощения вашего кода.