ClipPlanes.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /*
  2. * Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com>
  3. * Copyright (c) 2021, Stephan Unverwerth <s.unverwerth@serenityos.org>
  4. * Copyright (c) 2022, Jelle Raaijmakers <jelle@gmta.nl>
  5. * Copyright (c) 2022, Ryan Bethke <ryanbethke11@gmail.com>
  6. *
  7. * SPDX-License-Identifier: BSD-2-Clause
  8. */
  9. #include <AK/Debug.h>
  10. #include <LibGL/GLContext.h>
  11. namespace GL {
  12. void GLContext::gl_clip_plane(GLenum plane, GLdouble const* equation)
  13. {
  14. APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_clip_plane, plane, equation);
  15. RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
  16. RETURN_WITH_ERROR_IF((plane < GL_CLIP_PLANE0) || (plane > GL_CLIP_PLANE5), GL_INVALID_ENUM);
  17. auto plane_idx = static_cast<size_t>(plane) - GL_CLIP_PLANE0;
  18. auto eqn = FloatVector4(equation[0], equation[1], equation[2], equation[3]);
  19. m_clip_plane_attributes.eye_clip_plane[plane_idx] = m_model_view_matrix * eqn;
  20. m_clip_planes_dirty = true;
  21. }
  22. void GLContext::gl_get_clip_plane(GLenum plane, GLdouble* equation)
  23. {
  24. RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
  25. RETURN_WITH_ERROR_IF((plane < GL_CLIP_PLANE0) || (plane > GL_CLIP_PLANE5), GL_INVALID_ENUM);
  26. auto plane_idx = static_cast<size_t>(plane) - GL_CLIP_PLANE0;
  27. equation[0] = static_cast<GLdouble>(m_clip_plane_attributes.eye_clip_plane[plane_idx][0]);
  28. equation[1] = static_cast<GLdouble>(m_clip_plane_attributes.eye_clip_plane[plane_idx][1]);
  29. equation[2] = static_cast<GLdouble>(m_clip_plane_attributes.eye_clip_plane[plane_idx][2]);
  30. equation[3] = static_cast<GLdouble>(m_clip_plane_attributes.eye_clip_plane[plane_idx][3]);
  31. }
  32. void GLContext::sync_clip_planes()
  33. {
  34. if (!m_clip_planes_dirty)
  35. return;
  36. m_clip_planes_dirty = false;
  37. // TODO: Replace magic number 6 with device-dependent constant
  38. Vector<FloatVector4, 6> user_clip_planes;
  39. for (size_t plane_idx = 0; plane_idx < 6; ++plane_idx) {
  40. if ((m_clip_plane_attributes.enabled & (1 << plane_idx)) != 0u) {
  41. user_clip_planes.append(m_clip_plane_attributes.eye_clip_plane[plane_idx]);
  42. }
  43. }
  44. m_rasterizer->set_clip_planes(user_clip_planes);
  45. }
  46. }