gl.nim 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import
  2. opengl,
  3. tri_engine/math/vec
  4. export
  5. opengl
  6. type
  7. EGL* = object of Exception
  8. EGL_code* = object of EGL
  9. code*: EGL_err
  10. EGL_err {.pure.} = enum
  11. none = GL_NO_ERROR
  12. invalidEnum = GL_INVALID_ENUM
  13. invalidVal = GL_INVALID_VALUE
  14. invalidOp = GL_INVALID_OPERATION
  15. stackOverflow = GL_STACK_OVERFLOW
  16. stackUnderflow = GL_STACK_UNDERFLOW
  17. outOfMem = GL_OUT_OF_MEMORY
  18. invalidFramebufferOp = GL_INVALID_FRAMEBUFFER_OPERATION
  19. unknown
  20. proc newGL_codeException*(msg: string, code: EGL_err): ref EGL_code =
  21. result = newException(EGL_code, $code)
  22. result.code = code
  23. proc getErr*(): EGL_err =
  24. result = glGetError().EGL_err
  25. if result notin {EGL_err.none,
  26. EGL_err.invalidEnum,
  27. EGL_err.invalidVal,
  28. EGL_err.invalidOp,
  29. EGL_err.invalidFramebufferOp,
  30. EGL_err.outOfMem,
  31. EGL_err.stackUnderflow,
  32. EGL_err.stackOverflow}:
  33. return EGL_err.unknown
  34. proc errCheck*() =
  35. let err = getErr()
  36. if err != EGL_err.none:
  37. raise newGL_codeException($err, err)
  38. macro `?`*(call: expr{nkCall}): expr =
  39. result = call
  40. # Can't yet reference foreign symbols in macros.
  41. #errCheck()
  42. when defined(doublePrecision):
  43. const
  44. glRealType* = cGLdouble
  45. else:
  46. const
  47. glRealType* = cGLfloat
  48. proc setUniformV4*[T](loc: GLint, vecs: var openarray[TV4[T]]) =
  49. glUniform4fv(loc, vecs.len.GLsizei, cast[ptr GLfloat](vecs[0].addr))
  50. proc setUniformV4*[T](loc: GLint, vec: TV4[T]) =
  51. var vecs = [vec]
  52. setUniformV4(loc, vecs)