12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- # author: Ethosa
- import
- node,
- ../thirdparty/opengl,
- ../core/enums,
- ../core/input
- type
- SceneObj* {.final.} = object of NodeObj
- ScenePtr* = ptr SceneObj
- proc Scene*(name: string, variable: var SceneObj): ScenePtr =
- ## Creates a new Scene pointer.
- nodepattern(SceneObj)
- variable.pausemode = PAUSE
- proc Scene*(variable: var SceneObj): ScenePtr {.inline.} =
- Scene("Scene", variable)
- method drawScene*(scene: ScenePtr, w, h: GLfloat, paused: bool) {.base.} =
- ## Draws scene
- ## This used in the window.nim.
- for child in scene.getChildIter():
- if paused and child.getPauseMode() != PROCESS:
- continue
- if child.visible:
- if not child.is_ready:
- child.ready()
- child.is_ready = true
- child.process()
- child.draw(w, h)
- for child in scene.getChildIter():
- if paused and child.getPauseMode() != PROCESS:
- continue
- if child.visible:
- child.draw2stage(w, h)
- method dublicate*(self: ScenePtr, obj: var SceneObj): ScenePtr {.base.} =
- obj = self[]
- obj.addr
- method enter*(scene: ScenePtr) {.base.} =
- for child in scene.getChildIter():
- child.enter()
- child.is_ready = false
- method exit*(scene: ScenePtr) {.base.} =
- for child in scene.getChildIter():
- child.enter()
- child.is_ready = false
- method handleScene*(scene: ScenePtr, event: InputEvent, mouse_on: var NodePtr, paused: bool) {.base.} =
- var childs = scene.getChildIter()
- for i in countdown(childs.len()-1, 0):
- if paused and childs[i].getPauseMode() != PROCESS:
- continue
- if childs[i].visible:
- childs[i].handle(event, mouse_on)
- childs[i].input(event)
- method reAnchorScene*(scene: ScenePtr, w, h: GLfloat, paused: bool) {.base.} =
- scene.rect_size.x = w
- scene.rect_size.y = h
- for child in scene.getChildIter():
- if paused and child.getPauseMode() != PROCESS:
- continue
- child.calcPositionAnchor()
|