浏览代码

LibGL: Only normalize in `glRotate*` if possible

Vectors of length 0 cannot be normalized, so prevent dividing by zero
in the `glRotate*` API. This fixes the skybox rendering of Quake2.
Jelle Raaijmakers 3 年之前
父节点
当前提交
5d0a64bfde
共有 2 个文件被更改,包括 6 次插入5 次删除
  1. 5 4
      Userland/Libraries/LibGL/GLContext.cpp
  2. 1 1
      Userland/Libraries/LibGL/GLContext.h

+ 5 - 4
Userland/Libraries/LibGL/GLContext.cpp

@@ -594,15 +594,16 @@ void GLContext::gl_mult_matrix(FloatMatrix4x4 const& matrix)
         VERIFY_NOT_REACHED();
         VERIFY_NOT_REACHED();
 }
 }
 
 
-void GLContext::gl_rotate(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
+void GLContext::gl_rotate(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
 {
 {
     APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_rotate, angle, x, y, z);
     APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_rotate, angle, x, y, z);
 
 
     RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
     RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
 
 
-    FloatVector3 axis = { (float)x, (float)y, (float)z };
-    axis.normalize();
-    auto rotation_mat = Gfx::rotation_matrix(axis, static_cast<float>(angle * M_PI * 2 / 360));
+    FloatVector3 axis = { x, y, z };
+    if (axis.length() > 0.f)
+        axis.normalize();
+    auto rotation_mat = Gfx::rotation_matrix(axis, angle * static_cast<float>(M_PI * 2 / 360));
 
 
     if (m_current_matrix_mode == GL_MODELVIEW)
     if (m_current_matrix_mode == GL_MODELVIEW)
         m_model_view_matrix = m_model_view_matrix * rotation_mat;
         m_model_view_matrix = m_model_view_matrix * rotation_mat;

+ 1 - 1
Userland/Libraries/LibGL/GLContext.h

@@ -70,7 +70,7 @@ public:
     void gl_push_matrix();
     void gl_push_matrix();
     void gl_pop_matrix();
     void gl_pop_matrix();
     void gl_mult_matrix(FloatMatrix4x4 const& matrix);
     void gl_mult_matrix(FloatMatrix4x4 const& matrix);
-    void gl_rotate(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+    void gl_rotate(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
     void gl_scale(GLdouble x, GLdouble y, GLdouble z);
     void gl_scale(GLdouble x, GLdouble y, GLdouble z);
     void gl_translate(GLdouble x, GLdouble y, GLdouble z);
     void gl_translate(GLdouble x, GLdouble y, GLdouble z);
     void gl_vertex(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
     void gl_vertex(GLdouble x, GLdouble y, GLdouble z, GLdouble w);