scene.nim 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. # author: Ethosa
  2. import
  3. node,
  4. ../thirdparty/opengl,
  5. ../core/enums,
  6. ../core/input
  7. type
  8. SceneObj* {.final.} = object of NodeObj
  9. ScenePtr* = ptr SceneObj
  10. proc Scene*(name: string, variable: var SceneObj): ScenePtr =
  11. ## Creates a new Scene pointer.
  12. nodepattern(SceneObj)
  13. variable.pausemode = PAUSE
  14. proc Scene*(variable: var SceneObj): ScenePtr {.inline.} =
  15. Scene("Scene", variable)
  16. method drawScene*(scene: ScenePtr, w, h: GLfloat, paused: bool) {.base.} =
  17. ## Draws scene
  18. ## This used in the window.nim.
  19. for child in scene.getChildIter():
  20. if paused and child.getPauseMode() != PROCESS:
  21. continue
  22. if child.visible:
  23. if not child.is_ready:
  24. child.ready()
  25. child.is_ready = true
  26. child.process()
  27. child.draw(w, h)
  28. for child in scene.getChildIter():
  29. if paused and child.getPauseMode() != PROCESS:
  30. continue
  31. if child.visible:
  32. child.draw2stage(w, h)
  33. method dublicate*(self: ScenePtr, obj: var SceneObj): ScenePtr {.base.} =
  34. obj = self[]
  35. obj.addr
  36. method enter*(scene: ScenePtr) {.base.} =
  37. for child in scene.getChildIter():
  38. child.enter()
  39. child.is_ready = false
  40. method exit*(scene: ScenePtr) {.base.} =
  41. for child in scene.getChildIter():
  42. child.enter()
  43. child.is_ready = false
  44. method handleScene*(scene: ScenePtr, event: InputEvent, mouse_on: var NodePtr, paused: bool) {.base.} =
  45. var childs = scene.getChildIter()
  46. for i in countdown(childs.len()-1, 0):
  47. if paused and childs[i].getPauseMode() != PROCESS:
  48. continue
  49. if childs[i].visible:
  50. childs[i].handle(event, mouse_on)
  51. childs[i].input(event)
  52. method reAnchorScene*(scene: ScenePtr, w, h: GLfloat, paused: bool) {.base.} =
  53. scene.rect_size.x = w
  54. scene.rect_size.y = h
  55. for child in scene.getChildIter():
  56. if paused and child.getPauseMode() != PROCESS:
  57. continue
  58. child.calcPositionAnchor()