2012-01-08 29 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存儲在你喜歡的任何容器中。你可以通過使用glCallList()函數來告訴OpenGL顯示它們。要刪除列表呼叫glDeleteList()

相關問題