Advertisement
Guest User

Untitled

a guest
Jan 20th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. //R. RAFFIN, IUT Aix-Marseille, dépt. Informatique - Arles
  2. //TP simple, affichages de quelques points
  3. //compilation par : g++ -Wall TP1points.cpp -lGL -lGLU -lglut -lGLEW -o TP1points
  4.  
  5. #include <cstdio>
  6. #include <cstdlib>
  7. #include <cmath>
  8.  
  9. #include <vector>
  10.  
  11. #include <GL/glew.h>
  12. #include <GL/freeglut.h>
  13. #include <iostream>
  14.  
  15. using namespace std;
  16.  
  17. struct Vertex {
  18.         float x;
  19.         float y;
  20.         float z;
  21. };
  22.  
  23. class Primitive {
  24.     public:
  25.         Primitive() : m_init(false) { glGenBuffers(1, &m_vbo); }
  26.         virtual ~Primitive() {
  27.             glDeleteBuffers(1, &m_vbo);
  28.         }
  29.  
  30.         void render() {
  31.             if(!m_init) return;
  32.             //rendu de la primitive
  33.             glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
  34.                 glEnableClientState(GL_VERTEX_ARRAY);
  35.                     glVertexPointer(3, GL_FLOAT, 0, 0);
  36.                     glDrawArrays(GL_LINE_LOOP, 0, m_vertices_count);
  37.                 glDisableClientState(GL_VERTEX_ARRAY);
  38.             glBindBuffer(GL_ARRAY_BUFFER, 0);
  39.         }
  40.  
  41.         inline std::uint8_t vertices_count() const {
  42.             return m_vertices_count;
  43.         }
  44.  
  45.     protected:
  46.         virtual void genShape() = 0;
  47.         void upload() {
  48.             //envois des vertices sur la carte graphique
  49.             glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
  50.             std::cout << "error: " << glGetError() << std::endl;
  51.             glBufferData(GL_ARRAY_BUFFER, m_vertices.size() * sizeof(float), &(m_vertices.front()), GL_STATIC_DRAW);
  52.             glBindBuffer(GL_ARRAY_BUFFER, 0);
  53.  
  54.             m_init = true;
  55.         }
  56.  
  57.         std::vector<Vertex> m_vertices;
  58.         std::uint8_t        m_vertices_count;
  59.         GLuint              m_vbo;
  60.         bool                m_init;
  61. };
  62.  
  63. class CirclePrimitive : public Primitive {
  64.     public:
  65.         CirclePrimitive(float radius, std::uint8_t border_precision) : m_radius(radius) {
  66.             m_vertices_count = border_precision;
  67.             m_vertices.reserve(m_vertices_count);
  68.  
  69.             genShape();
  70.             upload();
  71.         }
  72.  
  73.         inline float radius() const {
  74.             return m_radius;
  75.         }
  76.  
  77.     private:
  78.         virtual void genShape() {
  79.             static const float deg2rad = M_PI / 180.f;
  80.  
  81.             //generation des points du cercle
  82.             for(unsigned int i = 0;i < 360; ++i) {
  83.                 Vertex vertex;
  84.  
  85.                 const float rad = float(i) * deg2rad;
  86.                 vertex.x = std::cos(rad) * m_radius;
  87.                 vertex.y = std::sin(rad) * m_radius;
  88.                 vertex.z = 0;
  89.  
  90.                 m_vertices.push_back(vertex);
  91.             }
  92.         }
  93.  
  94.         float m_radius;
  95. };
  96.  
  97. static void RenderScene();
  98. static void InitializeGlutCallbacks();
  99. CirclePrimitive *circle = NULL;
  100.  
  101. int main(int argc, char** argv)
  102. {
  103.     glutInit(&argc, argv);
  104.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
  105.     glutInitWindowSize(500, 500);
  106.     glutInitWindowPosition(100, 100);
  107.     glutCreateWindow("TP1 : quelques points");
  108.  
  109.     InitializeGlutCallbacks();
  110.  
  111.     //toujours après l'initialisation de glut
  112.     GLenum res = glewInit();
  113.  
  114.     if (res != GLEW_OK) {
  115.         cerr << "Error: " << glewGetErrorString(res) << endl;
  116.         return (EXIT_FAILURE);
  117.     }
  118.  
  119.     //cout << "Using GLEW Version: " << glewGetString(GLEW_VERSION);
  120.  
  121.     circle = new CirclePrimitive(0.5f, 100);
  122.     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  123.  
  124.     glutMainLoop();
  125.  
  126.     return (EXIT_SUCCESS);
  127. }
  128.  
  129.  
  130. static void RenderScene()
  131. {
  132.     glClear(GL_COLOR_BUFFER_BIT);
  133.  
  134.     if(circle)
  135.         circle->render();
  136.  
  137.     glutSwapBuffers();
  138. }
  139.  
  140.  
  141. static void InitializeGlutCallbacks()
  142. {
  143.     glutDisplayFunc(RenderScene);
  144. }
  145.  
  146. static void CreateVertexBuffer()
  147. {
  148.  
  149.  
  150.     //glGenBuffers(1, &leVBO); //génération d'une référence de buffer object
  151.     //glBindBuffer(GL_ARRAY_BUFFER, leVBO); //liaison du buffer avec un type tableau de données
  152.     //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*27, vertices, GL_STATIC_DRAW); //création et initialisation du container de données (3 sommets -> 9 float)
  153.  
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement