2012-01-08 3 views
1

Как я могу складывать эти две формы opengl в класс контейнера? Может кто-нибудь, пожалуйста, покажи мне Я не согласен с шаблоном.Как я могу складывать фигуры opengl в std :: vector

void myTriangle() 
{ 
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);      
    glVertex3f(0.0f, 1.0f, 0.0f);     
    glColor3f(0.0f,1.0f,0.0f);      
    glVertex3f(-1.0f,-1.0f, 0.0f);     
    glColor3f(0.0f,0.0f,1.0f);      
    glVertex3f(1.0f,-1.0f, 0.0f);     
glEnd(); 
glutSwapBuffers (); 
    } 

void myQuad() 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
glColor3f(0.5f,0.5f,1.0f);      
    glBegin(GL_QUADS);        
     glVertex3f(-1.0f, 1.0f, 0.0f);      
     glVertex3f(1.0f, 1.0f, 0.0f);      
     glVertex3f(1.0f,-1.0f, 0.0f);      
     glVertex3f(-1.0f,-1.0f, 0.0f);      
    glEnd(); 
glutSwapBuffers (); 
    } 

ответ

2

не совсем уверены, что вы хотите сделать, но вы можете сделать:

typedef void (*ShapeFct_t)(); 
typedef std::vector<ShapeFct_t> ShapeArray_t; 

ShapeArray_t shapes; 
shapes.push_back(myTriangle); 
shapes.push_back(myQuad); 
1

Вы можете определить 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(); 
} 

Примечание: Как я уже говорил, например, является неполным. Это также непроверено и немного беспорядочно (утечки памяти и т. Д.), Но эти проблемы выходят за рамки этого вопроса. Главное, что я пытаюсь продемонстрировать здесь, это то, что вы можете преобразовать свои функции в классы, которые могут использовать наследование и полиморфизм для упрощения вашего кода.

1

Не уверен, если вы заботитесь, чтобы изменить то, что выглядит форма, как после его создания, но вы можете поместить его в список отображения, а затем хранить каждый список отображения в любой контейнер вы хотите:

GLuint triangleList = glGenLists(1); 
glNewList(triangleList, GL_COMPILE); 
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);      
    glVertex3f(0.0f, 1.0f, 0.0f);     
    glColor3f(0.0f,1.0f,0.0f);      
    glVertex3f(-1.0f,-1.0f, 0.0f);     
    glColor3f(0.0f,0.0f,1.0f);      
    glVertex3f(1.0f,-1.0f, 0.0f);     
glEnd(); 
glEndList(); 

GLuint quadList = glGenList(1); 
glNewList(quadList, GL_COMPILE); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
glColor3f(0.5f,0.5f,1.0f);      
    glBegin(GL_QUADS);        
     glVertex3f(-1.0f, 1.0f, 0.0f);      
     glVertex3f(1.0f, 1.0f, 0.0f);      
     glVertex3f(1.0f,-1.0f, 0.0f);      
     glVertex3f(-1.0f,-1.0f, 0.0f);      
    glEnd(); 
glEndList(); 

В этом вы можете хранить quadList и triangleList в любом контейнере, который вам нравится. Вы можете показать OpenGL, чтобы отобразить их, используя функцию glCallList(). Чтобы удалить вызов списка glDeleteList().

Смежные вопросы