Browse Source

add Node2D and Sprite nodes.

SakiKawasaki 4 years ago
parent
commit
b2eaf0fbdc

+ 7 - 2
src/nodesnim.nim

@@ -38,7 +38,10 @@ import
   nodesnim/nodescontrol/vprogress_bar,
   nodesnim/nodescontrol/slider,
   nodesnim/nodescontrol/vslider,
-  nodesnim/nodescontrol/popup
+  nodesnim/nodescontrol/popup,
+
+  nodesnim/nodes2d/node2d,
+  nodesnim/nodes2d/sprite
 
 export
   # Third party
@@ -52,4 +55,6 @@ export
   node, scene, canvas, audio_stream_player,
   # Control nodes
   control, color_rect, texture_rect, label, button, box, hbox, vbox, grid_box, edittext,
-  rich_label, rich_edit_text, scroll, progress_bar, vprogress_bar, slider, vslider, popup
+  rich_label, rich_edit_text, scroll, progress_bar, vprogress_bar, slider, vslider, popup,
+  # 2D nodes
+  node2d, sprite

+ 3 - 3
src/nodesnim/core/image.nim

@@ -11,7 +11,7 @@ discard image.init()
 
 
 type
-  GlTexture* = object
+  GlTextureObj* = object
     texture*: Gluint
     size*: Vector2Ref
 
@@ -45,7 +45,7 @@ proc load*(file: cstring, size: var Vector2Ref, mode: Glenum = GL_RGB): Gluint =
   textureid
 
 
-proc load*(file: cstring, mode: Glenum = GL_RGB): GlTexture =
+proc load*(file: cstring, mode: Glenum = GL_RGB): GlTextureObj =
   ## Loads GL texture.
   ##
   ## Arguments:
@@ -54,4 +54,4 @@ proc load*(file: cstring, mode: Glenum = GL_RGB): GlTexture =
     size: Vector2Ref = Vector2Ref()
     textureid: Gluint
   textureid = load(file, size, mode)
-  GlTexture(texture: textureid, size: size)
+  GlTextureObj(texture: textureid, size: size)

+ 7 - 0
src/nodesnim/nodes/node.nim

@@ -223,6 +223,13 @@ method move*(self: NodePtr, vec2: Vector2Ref) {.base, inline.} =
   self.can_use_anchor = false
   self.can_use_size_anchor = false
 
+method move*(self: NodePtr, x, y: GLfloat) {.base, inline.} =
+  ## Adds `x` and `y` to the node position.
+  self.position.x += x
+  self.position.y += y
+  self.can_use_anchor = false
+  self.can_use_size_anchor = false
+
 method removeChild*(self: NodePtr, index: int) {.base.} =
   ## Removes node child at a specific position.
   ##

+ 80 - 0
src/nodesnim/nodes2d/node2d.nim

@@ -0,0 +1,80 @@
+# author: Ethosa
+import
+  ../thirdparty/opengl,
+
+  ../core/vector2,
+  ../core/rect2,
+  ../core/anchor,
+  ../core/input,
+  ../core/enums,
+
+  ../nodes/node,
+  ../nodes/canvas
+
+
+type
+  Node2DObj* = object of CanvasObj
+    centered*: bool
+    timed_position*: Vector2Ref
+  Node2DPtr* = ptr Node2DObj
+
+
+template node2dpattern*: untyped =
+  variable.centered = true
+  variable.timed_position = Vector2()
+
+proc Node2D*(name: string, variable: var Node2DObj): Node2DPtr =
+  ## Creates a new Node2D pointer.
+  ##
+  ## Arguments:
+  ## - `name` is a node name.
+  ## - `variable` is a Node2DObj variable.
+  runnableExamples:
+    var
+      node_obj: Node2DObj
+      node = Node2D("Node2D", node_obj)
+  nodepattern(Node2DObj)
+  node2dpattern()
+
+proc Node2D*(obj: var Node2DObj): Node2DPtr {.inline.} =
+  ## Creates a new Node2D pointer with deffault node name "Node2D".
+  ##
+  ## Arguments:
+  ## - `variable` is a Node2DObj variable.
+  runnableExamples:
+    var
+      node_obj: Node2DObj
+      node = Node2D(node_obj)
+  Node2D("Node2D", obj)
+
+method draw*(self: Node2DPtr, w, h: GLfloat) =
+  ## this method uses in the `window.nim`.
+  {.warning[LockLevel]: off.}
+  self.calcGlobalPosition()
+
+  self.position = self.timed_position
+
+  if self.centered:
+    self.position = self.timed_position - self.rect_size*2
+  else:
+    self.position = self.timed_position
+
+method move*(self: Node2DPtr, x, y: GLfloat) =
+  ## Moves Node2D object by `x` and `y`.
+  self.position.x += x
+  self.position.y += y
+  self.timed_position = self.position
+
+method move*(self: Node2DPtr, vec2: Vector2Ref) =
+  ## Moves Node2D object by `vec2`.
+  self.position += vec2
+  self.timed_position = self.position
+
+method duplicate*(self: Node2DPtr, obj: var Node2DObj): Node2DPtr {.base.} =
+  ## Duplicates Node2D object and create a new Node2D pointer.
+  obj = self[]
+  obj.addr
+
+method getGlobalMousePosition*(self: Node2DPtr): Vector2Ref {.base, inline.} =
+  ## Returns mouse position.
+  Vector2Ref(x: last_event.x, y: last_event.y)

+ 112 - 0
src/nodesnim/nodes2d/sprite.nim

@@ -0,0 +1,112 @@
+# author: Ethosa
+import
+  ../thirdparty/opengl,
+
+  ../core/vector2,
+  ../core/rect2,
+  ../core/anchor,
+  ../core/input,
+  ../core/enums,
+  ../core/image,
+  ../core/color,
+
+  ../nodes/node,
+  node2d
+
+
+type
+  SpriteObj* = object of Node2DObj
+    filter*: ColorRef
+    texture*: GlTextureObj
+  SpritePtr* = ptr SpriteObj
+
+
+
+proc Sprite*(name: string, variable: var SpriteObj): SpritePtr =
+  ## Creates a new Sprite pointer.
+  ##
+  ## Arguments:
+  ## - `name` is a node name.
+  ## - `variable` is a SpriteObj variable.
+  runnableExamples:
+    var
+      node_obj: SpriteObj
+      node = Sprite("Sprite", node_obj)
+  nodepattern(SpriteObj)
+  node2dpattern()
+  variable.texture = GlTextureObj()
+  variable.filter = Color(1f, 1f, 1f)
+
+proc Sprite*(obj: var SpriteObj): SpritePtr {.inline.} =
+  ## Creates a new Sprite pointer with deffault node name "Sprite".
+  ##
+  ## Arguments:
+  ## - `variable` is a SpriteObj variable.
+  runnableExamples:
+    var
+      node_obj: SpriteObj
+      node = Sprite(node_obj)
+  Sprite("Sprite", obj)
+
+method draw*(self: SpritePtr, w, h: GLfloat) =
+  ## this method uses in the `window.nim`.
+  {.warning[LockLevel]: off.}
+  if self.texture.texture > 0:
+    self.rect_size = self.texture.size
+
+  self.calcGlobalPosition()
+  let
+    x = -w/2 + self.global_position.x
+    y = h/2 - self.global_position.y
+
+  # Recalculate position.
+  self.position = self.timed_position
+  if self.centered:
+    self.position = self.timed_position - self.rect_size/2
+  else:
+    self.position = self.timed_position
+
+  # Draw
+  if self.texture.texture > 0:
+    glColor4f(self.filter.r, self.filter.g, self.filter.b, self.filter.a)
+
+    glEnable(GL_TEXTURE_2D)
+    glBindTexture(GL_TEXTURE_2D, self.texture.texture)
+
+    glBegin(GL_QUADS)
+    glTexCoord2f(0, 0)
+    glVertex2f(x, y)
+    glTexCoord2f(0, 1)
+    glVertex2f(x, y - self.rect_size.y)
+    glTexCoord2f(1, 1)
+    glVertex2f(x + self.rect_size.x, y - self.rect_size.y)
+    glTexCoord2f(1, 0)
+    glVertex2f(x + self.rect_size.x, y)
+    glEnd()
+    glDisable(GL_TEXTURE_2D)
+  else:
+    self.rect_size = Vector2()
+
+method duplicate*(self: SpritePtr, obj: var SpriteObj): SpritePtr {.base.} =
+  ## Duplicates Sprite object and create a new Sprite pointer.
+  obj = self[]
+  obj.addr
+
+method getGlobalMousePosition*(self: SpritePtr): Vector2Ref {.inline.} =
+  ## Returns mouse position.
+  Vector2Ref(x: last_event.x, y: last_event.y)
+
+method loadTexture*(self: SpritePtr, file: cstring, mode = GL_RGB) {.base.} =
+  ## Loads a new texture from file.
+  ##
+  ## Arguments:
+  ## - `file` is a texture path.
+  ## - `mode` is a GLenum. can be GL_RGB or GL_RGBA.
+  self.texture = load(file, mode)
+
+method setTexture*(self: SpritePtr, texture: GlTextureObj) {.base.} =
+  ## Loads a new texture from file.
+  ##
+  ## Arguments:
+  ## - `texture` is a GlTexture object.
+  self.texture = texture

+ 1 - 1
src/nodesnim/nodescontrol/texture_rect.nim

@@ -137,7 +137,7 @@ method loadTexture*(self: TextureRectPtr, file: cstring) {.base.} =
   self.texture = load(file, size)
   self.texture_size = size
 
-method setTexture*(self: TextureRectPtr, gltexture: GlTexture) {.base.} =
+method setTexture*(self: TextureRectPtr, gltexture: GlTextureObj) {.base.} =
   ## Changes texture.
   ##
   ## Arguments:

+ 2 - 0
tests/README.md

@@ -24,3 +24,5 @@
 22. [Use Slider node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test22.nim)
 23. [Use Popup node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test23.nim)
 24. [Use AudioStreamPlayer node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test24.nim)
+25. [Use Node2D node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test25.nim)
+26. [Use Sprite node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test26.nim)

BIN
tests/assets/smile.png


+ 20 - 0
tests/test25.nim

@@ -0,0 +1,20 @@
+# --- Test 25. Use Node2D node. --- #
+import nodesnim
+
+
+Window("hello world")
+
+var
+  mainobj: SceneObj
+  main = Scene("Main", mainobj)
+
+  nodeobj: Node2DObj
+  node = Node2D(nodeobj)
+
+
+main.addChild(node)
+
+
+addScene(main)
+setMainScene("Main")
+windowLaunch()

+ 26 - 0
tests/test26.nim

@@ -0,0 +1,26 @@
+# --- Test 26. Use Sprite node. --- #
+import nodesnim
+
+
+Window("hello world")
+
+var
+  mainobj: SceneObj
+  main = Scene("Main", mainobj)
+
+  spriteobj: SpriteObj
+  sprite = Sprite(spriteobj)
+
+  icon = load("assets/smile.png", GL_RGBA)
+
+
+main.addChild(sprite)
+
+sprite.move(128, 128)  # Move sprite.
+sprite.setTexture(icon)  # Change sprite image.
+
+sprite.centered = true  # The default value is true. Try to change it.
+
+addScene(main)
+setMainScene("Main")
+windowLaunch()