Finish OpenGL Example, Vectors and Operations




CS116a

Chris Pollett

Sep 4, 2013

Outline

Introduction

Handling interaction

Mouse

static void mouse(int button, int state, int x, int y) {
  if (button == GLUT_LEFT_BUTTON) {
    if (state == GLUT_DOWN) {
      // right mouse button has been clicked
      g_leftClicked = true;
      g_leftClickX = x;
      g_leftClickY = g_height - y - 1;
    }
    else {
      // right mouse button has been released
      g_leftClicked = false;
    }
  }
  if (button == GLUT_RIGHT_BUTTON) {
    if (state == GLUT_DOWN) {
      // right mouse button has been clicked
      g_rightClicked = true;
      g_rightClickX = x;
      g_rightClickY = g_height - y - 1;
    }
    else {
      // right mouse button has been released
      g_rightClicked = false;
    }
  }
}

Motion

static void motion(int x, int y) {
  const int newx = x;
  const int newy = g_height - y - 1;
  if (g_leftClicked) {
    g_leftClickX = newx;
    g_leftClickY = newy;
  }
  if (g_rightClicked) {
    float deltax = (newx - g_rightClickX) * 0.02;
    g_objScale += deltax;

    g_rightClickX = newx;
    g_rightClickY = newy;
  }
  glutPostRedisplay();
}

Keyboard

void keyboard(unsigned char key, int x, int y) {
  switch (key) {
  case 'h':
    cout << " ============== H E L P ==============\n\n"
    << "h\t\thelp menu\n"
    <<  "s\t\tsave screenshot\n"
    <<  "drag right mouse to change square size\n";
    break;
  case 'q':
    exit(0);
  case 's':
    glFinish();
    writePpmScreenshot(g_width, g_height, "out.ppm");
    break;
  }
}

Modifying the Original Program

struct SquareGeometry {
  GlBufferObject posVbo[2], texVbo, colVbo;

  SquareGeometry() {
      static GLfloat sqPos[2][12] = {
        {
            -.5, -.5,
            0.,  0.,
            0,  -.5,

            -.5, -.5,
            -.5, .0,
            0,  .0
        },
        {
            0.,  0.,
            .5,  .5,
            .5,  0,
            
            0., 0.,
            0., .5,
            .5,  .5
        }
      };

    static GLfloat sqTex[12] = {
      0, 0,
      1, 1,
      1, 0,

      0, 0,
      0, 1,
      1, 1
    };

    static GLfloat sqCol[18] =  {
      1, 0, 0,
      0, 1, 1,
      0, 0, 1,

      1, 0, 0,
      0, 1, 0,
      0, 1, 1
    };

    for (int i = 0; i < 2; i++) {
        glBindBuffer(GL_ARRAY_BUFFER, posVbo[i]);
        glBufferData(
          GL_ARRAY_BUFFER,
          12*sizeof(GLfloat),
          sqPos[i],
          GL_STATIC_DRAW);
        checkGlErrors();
    }

    glBindBuffer(GL_ARRAY_BUFFER, texVbo);
    glBufferData(
      GL_ARRAY_BUFFER,
      12*sizeof(GLfloat),
      sqTex,
      GL_STATIC_DRAW);
    checkGlErrors();

    glBindBuffer(GL_ARRAY_BUFFER, colVbo);
    glBufferData(
      GL_ARRAY_BUFFER,
      18*sizeof(GLfloat),
      sqCol,
      GL_STATIC_DRAW);
    checkGlErrors();
  }

  void draw(const ShaderState& curSS) {
      int numverts=6;
      safe_glEnableVertexAttribArray(curSS.h_aPosition);
      safe_glEnableVertexAttribArray(curSS.h_aTexCoord0);
      safe_glEnableVertexAttribArray(curSS.h_aTexCoord1);
      safe_glEnableVertexAttribArray(curSS.h_aColor);
      for (int i = 0; i < 2; i++) {

          
        glBindBuffer(GL_ARRAY_BUFFER, posVbo[i]);
        safe_glVertexAttribPointer(curSS.h_aPosition,
                                   2, GL_FLOAT, GL_FALSE, 0, 0);

        glBindBuffer(GL_ARRAY_BUFFER, texVbo);
        safe_glVertexAttribPointer(curSS.h_aTexCoord0,
                                   2, GL_FLOAT, GL_FALSE, 0, 0);

        glBindBuffer(GL_ARRAY_BUFFER, texVbo);
        safe_glVertexAttribPointer(curSS.h_aTexCoord1,
                                   2, GL_FLOAT, GL_FALSE, 0, 0);

        glBindBuffer(GL_ARRAY_BUFFER, colVbo);
        safe_glVertexAttribPointer(curSS.h_aColor,
                                   3, GL_FLOAT, GL_FALSE, 0, 0);

        glDrawArrays(GL_TRIANGLES, 0, numverts);


      }
      safe_glDisableVertexAttribArray(curSS.h_aPosition);
      safe_glDisableVertexAttribArray(curSS.h_aColor);
      safe_glDisableVertexAttribArray(curSS.h_aTexCoord0);
      safe_glDisableVertexAttribArray(curSS.h_aTexCoord1);
  }
};

Geometric Data Types

Definitions

Image representing vistually the concepts point, vector, coordinate system

Vectors, Coordinate Vectors, and Bases

Basis

More on Bases

Linear Transformations

Linear transformations (cont'd)