Как проверить, щелкала ли мышь над полигоном в OpenGL? - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь сделать инструмент выбора цвета в OpenGL.Это работает, вы можете использовать код ниже.Однако есть одна явная проблема: если вы протестируете программу, вы обнаружите, что если вы нажмете черный фон, выбранный цвет станет черным.Поэтому мой вопрос заключается в том, как изменить код так, чтобы он распознавал, на каком полигоне я нажал, или на том, что я щелкнул по чему-то или многоугольнику.

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <cmath>
#include <iterator>

//static void mouseButtonCallback(GLFWwindow* window, int button, int action, int mod);
static void mouse_cursor_callback(GLFWwindow* window, double xpos, double ypos);
float randfloat(){
  float r = ((float)(rand() % 10))/10;
  return r;
}
class RGB{
  public:
    float r;
    float g;
    float b;
    void setColor(float _r, float _g, float _b){
      r = _r;
      g = _g;
      b = _b;
    }
};
RGB selected_col;
RGB mixColor(RGB color1, RGB color2){
  float r = 0;
  float g = 0;
  float b = 0;
  r = sqrt((pow(color1.r,2)+pow(color2.r,2))/2);
  g = sqrt((pow(color1.g,2)+pow(color2.g,2))/2);
  b = sqrt((pow(color1.b,2)+pow(color2.b,2))/2);
  RGB a;
  a.setColor(r,g,b);
  return a;
}


int main() {
  int side_count;
  std::cout<<"Type the no. of sides: "<<std::endl;
  std::cin>>side_count;
  if(side_count < 3){
    return 1;
  }
  srand((unsigned)time(0));
  float rs[side_count];
  float gs[side_count];
  float bs[side_count];
  RGB colors[side_count];
  for (int i=0;i<side_count;i++)
  {
    rs[i] = randfloat();
    gs[i] = randfloat();
    bs[i] = randfloat();
    colors[i].setColor(rs[i],gs[i],bs[i]);
  }

  GLFWwindow* window;
  if (!glfwInit())
    return 1;
  window = glfwCreateWindow(400, 400, "Window", NULL, NULL);

  //glfwSetMouseButtonCallback(window, mouseButtonCallback);
  glfwSetCursorPosCallback(window, mouse_cursor_callback);

  if (!window) {
    glfwTerminate();
    return 1;
  }
  glfwMakeContextCurrent(window);
  if(glewInit()!=GLEW_OK)
    std::cout<<"Error"<<std::endl;
  RGB mcol = colors[1];
  for(int i=0;i<side_count-1;i++)
  {
    mcol = mixColor(mcol, colors[i+1]);
  }
  while(!glfwWindowShouldClose(window)) {
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POLYGON);
      glColor3f(mcol.r,mcol.g,mcol.b);glVertex2f(0,0);
      //glColor3f(1.0f,0.0f,0.0f);glVertex3f(-0.5f,0.0f,0.0f);
      for(int i=0; i<=side_count;i++)
      {
        float r = rs[i%side_count];
        float g = gs[i%side_count];
        float b = bs[i%side_count];
        float x = 0.5f * sin(2.0*M_PI*i/side_count);
        float y = 0.5f * cos(2.0*M_PI*i/side_count);
        glColor3f(r,g,b);glVertex2f(x,y);
      }
    glEnd();
    glBegin(GL_QUADS);
    glColor3f(selected_col.r, selected_col.g, selected_col.b);glVertex2f(-1.0f,0.5f);
    glColor3f(selected_col.r, selected_col.g, selected_col.b);glVertex2f(-.5f,0.5f);
    glColor3f(selected_col.r, selected_col.g, selected_col.b);glVertex2f(-.5f,1.5f);
    glColor3f(selected_col.r, selected_col.g, selected_col.b);glVertex2f(-1.0f,1.5f);
    glEnd();
    glfwSwapBuffers(window);
    glfwPollEvents();
  }
  glfwTerminate();
  return 0;
}

/*static void mouseButtonCallback(GLFWwindow* window, int button, int action, int mods){
  if(button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS){
    double xPos, yPos;
    glfwGetCursorPos(window, &xPos, &yPos);
    //std::cout<<"X: "<<xPos<<" Y: "<<yPos<<std::endl;
    double x=xPos;
    int height,width;
    glfwGetWindowSize(window, &width, &height);
    double y = height - yPos;
    unsigned char pixel[4];
    glReadPixels(x, y, 1, 1, GL_RGB,GL_UNSIGNED_BYTE, &pixel);
    selected_col.setColor((float)pixel[0]/255,(float)pixel[1]/255,(float)pixel[2]/255);
    //std::cout<<"R: "<<selected_col.r<<" G: "<<selected_col.g<<" B: "<<selected_col.b<<std::endl;
  }
}*/
void mouse_cursor_callback( GLFWwindow * window, double xpos, double ypos)  
{

  if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_RELEASE) 
  {
     return;
  }

  double xPos, yPos;
  glfwGetCursorPos(window, &xPos, &yPos);
  //std::cout<<"X: "<<xPos<<" Y: "<<yPos<<std::endl;
  double x=xPos;
  int height,width;
  glfwGetWindowSize(window, &width, &height);
  double y = height - yPos;
  unsigned char pixel[4];
  glReadPixels(x, y, 1, 1, GL_RGB,GL_UNSIGNED_BYTE, &pixel);
  selected_col.setColor((float)pixel[0]/255,(float)pixel[1]/255,(float)pixel[2]/255);
  //std::cout<<"R: "<<selected_col.r<<" G: "<<selected_col.g<<" B: "<<selected_col.b<<std::endl;
}
...