Как я могу сложить формы opengl в std :: vector - PullRequest
1 голос
/ 09 января 2012

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

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 ( );
     }

Ответы [ 3 ]

2 голосов
/ 09 января 2012

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

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

ShapeArray_t shapes;
shapes.push_back(myTriangle);
shapes.push_back(myQuad);
1 голос
/ 09 января 2012

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

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().

1 голос
/ 09 января 2012

Вы можете определить базовый класс 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();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...