sprite.nim 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. # author: Ethosa
  2. ## It provides display sprites.
  3. import
  4. ../thirdparty/opengl,
  5. ../core/vector2,
  6. ../core/rect2,
  7. ../core/anchor,
  8. ../core/input,
  9. ../core/enums,
  10. ../core/image,
  11. ../core/color,
  12. ../nodes/node,
  13. ../nodes/canvas,
  14. node2d
  15. type
  16. SpriteObj* = object of Node2DObj
  17. filter*: ColorRef
  18. texture*: GlTextureObj
  19. SpriteRef* = ref SpriteObj
  20. proc Sprite*(name: string = "Sprite"): SpriteRef =
  21. ## Creates a new Sprite.
  22. ##
  23. ## Arguments:
  24. ## - `name` is a node name.
  25. runnableExamples:
  26. var node = Sprite("Sprite")
  27. nodepattern(SpriteRef)
  28. node2dpattern()
  29. result.texture = GlTextureObj()
  30. result.filter = Color(1f, 1f, 1f)
  31. result.kind = SPRITE_NODE
  32. result.centered = true
  33. method draw*(self: SpriteRef, w, h: GLfloat) =
  34. ## this method uses in the `window.nim`.
  35. {.warning[LockLevel]: off.}
  36. if self.texture.texture > 0'u32:
  37. self.rect_size = self.texture.size
  38. # Recalculate position.
  39. procCall self.Node2DRef.draw(w, h)
  40. self.CanvasRef.calcGlobalPosition()
  41. let
  42. x = -w/2 + self.global_position.x
  43. y = h/2 - self.global_position.y
  44. # Draw
  45. if self.texture.texture > 0'u32:
  46. glPushMatrix()
  47. if self.centered:
  48. glTranslatef(x + (self.rect_size.x / 2), y - (self.rect_size.y / 2), self.z_index_global)
  49. self.position = self.rect_size / 2
  50. else:
  51. glTranslatef(x, y, self.z_index_global)
  52. self.position = Vector2()
  53. glRotatef(self.rotation, 0, 0, 1)
  54. glColor4f(self.filter.r, self.filter.g, self.filter.b, self.filter.a)
  55. glEnable(GL_TEXTURE_2D)
  56. glEnable(GL_DEPTH_TEST)
  57. glBindTexture(GL_TEXTURE_2D, self.texture.texture)
  58. glBegin(GL_QUADS)
  59. glTexCoord2f(0, 0)
  60. glVertex3f(-self.position.x, self.position.y, self.z_index_global)
  61. glTexCoord2f(0, 1)
  62. glVertex3f(-self.position.x, self.position.y - self.rect_size.y, self.z_index_global)
  63. glTexCoord2f(1, 1)
  64. glVertex3f(-self.position.x + self.rect_size.x, self.position.y - self.rect_size.y, self.z_index_global)
  65. glTexCoord2f(1, 0)
  66. glVertex3f(-self.position.x + self.rect_size.x, self.position.y, self.z_index_global)
  67. glEnd()
  68. glDisable(GL_DEPTH_TEST)
  69. glDisable(GL_TEXTURE_2D)
  70. glPopMatrix()
  71. else:
  72. self.rect_size = Vector2()
  73. method duplicate*(self: SpriteRef): SpriteRef {.base.} =
  74. ## Duplicates Sprite object and create a new Sprite.
  75. self.deepCopy()
  76. method getGlobalMousePosition*(self: SpriteRef): Vector2Obj {.inline.} =
  77. ## Returns mouse position.
  78. Vector2Obj(x: last_event.x, y: last_event.y)
  79. method loadTexture*(self: SpriteRef, file: string, mode = GL_RGB) {.base.} =
  80. ## Loads a new texture from file.
  81. ##
  82. ## Arguments:
  83. ## - `file` is a texture path.
  84. ## - `mode` is a GLenum. can be GL_RGB or GL_RGBA.
  85. self.texture = load(file, mode)
  86. self.rect_size = self.texture.size
  87. method setTexture*(self: SpriteRef, texture: GlTextureObj) {.base.} =
  88. ## Loads a new texture from file.
  89. ##
  90. ## Arguments:
  91. ## - `texture` is a GlTexture object.
  92. self.texture = texture
  93. self.rect_size = self.texture.size