Пример #1
0
TEST_F(GraphicsLightTest, TestLightGet) {
  Vector param;

  glClearColor(0.f, 0.f, 0.f, 0.f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  const float pos[] = {1.f, 2.f, 3.f, 1.f};
  const float dir[] = {0.f, 0.f, -1.f, 0.f};
  const float att[] = {0.01f, 0.02f, 0.03f};
  const float spot[] = {60.f, 128.f};

  glLightfv(GL_LIGHT0, GL_POSITION, pos);
  glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
  glLightfv(GL_LIGHT0, GL_DIFFUSE, kRed);
  glLightfv(GL_LIGHT0, GL_AMBIENT, kBlue);
  glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, spot[0]);
  glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, spot[1]);
  glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, att[0]);
  glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, att[1]);
  glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, att[2]);

  Vector position = GetLightParameter(GL_LIGHT0, GL_POSITION);
  Vector direction = GetLightParameter(GL_LIGHT0, GL_SPOT_DIRECTION);
  Vector diffuse = GetLightParameter(GL_LIGHT0, GL_DIFFUSE);
  Vector ambient = GetLightParameter(GL_LIGHT0, GL_AMBIENT);
  Vector cutoff = GetLightParameter(GL_LIGHT0, GL_SPOT_CUTOFF);
  Vector exponent = GetLightParameter(GL_LIGHT0, GL_SPOT_EXPONENT);
  Vector constant = GetLightParameter(GL_LIGHT0, GL_CONSTANT_ATTENUATION);
  Vector linear = GetLightParameter(GL_LIGHT0, GL_LINEAR_ATTENUATION);
  Vector quadratic = GetLightParameter(GL_LIGHT0, GL_QUADRATIC_ATTENUATION);

  for (size_t i = 0; i < Vector::kEntries; ++i) {
    EXPECT_EQ(position.Get(i), pos[i]);
    EXPECT_EQ(direction.Get(i), dir[i]);
    EXPECT_EQ(diffuse.Get(i), kRed[i]);
    EXPECT_EQ(ambient.Get(i), kBlue[i]);
  }
  EXPECT_EQ(cutoff.Get(0), spot[0]);
  EXPECT_EQ(exponent.Get(0), spot[1]);
  EXPECT_EQ(constant.Get(0), att[0]);
  EXPECT_EQ(linear.Get(0), att[1]);
  EXPECT_EQ(quadratic.Get(0), att[2]);

  // Change to directional light.
  float pos2[] = {1.f, 2.f, 3.f, 0.f};
  glLightfv(GL_LIGHT0, GL_POSITION, pos2);
  position = GetLightParameter(GL_LIGHT0, GL_POSITION);
  for (size_t i = 0; i < Vector::kEntries; ++i) {
    EXPECT_EQ(position.Get(i), pos2[i]);
  }

  // Change back to spot light, but at a position/direction
  // specified by the model-view matrix.
  Matrix mx;
  const Vector trans(5.f, 6.f, 7.f, 1.f);
  const Vector axis(1.f, 0.f, 0.f, 0.f);
  mx.AssignMatrixMultiply(mx, Matrix::GenerateTranslation(trans));
  mx.AssignMatrixMultiply(mx, Matrix::GenerateRotationByDegrees(45.f, axis));

  float glmx[Matrix::kEntries];
  glMatrixMode(GL_MODELVIEW);
  glLoadMatrixf(mx.GetColumnMajorArray(glmx));

  glLightfv(GL_LIGHT0, GL_POSITION, pos);
  glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
  position = GetLightParameter(GL_LIGHT0, GL_POSITION);
  direction = GetLightParameter(GL_LIGHT0, GL_SPOT_DIRECTION);

  mx.Inverse();
  position.AssignMatrixMultiply(mx, position);
  direction.AssignMatrixMultiply(mx, direction);

  const float tolerance = 1.0e-6f;
  for (size_t i = 0; i < Vector::kEntries; ++i) {
    EXPECT_NEAR(position.Get(i), pos[i], tolerance);
  }
  for (int i = 0; i < 3; ++i) {
    EXPECT_NEAR(direction.Get(i), dir[i], tolerance);
  }
  EXPECT_IMAGE();
}