package me.eater.threedom.dom import me.eater.threedom.dom.render.IRenderNode import me.eater.threedom.dom.render.IRenderTarget import me.eater.threedom.event.Event import me.eater.threedom.event.EventDispatcher import me.eater.threedom.utils.joml.Vector3d import org.joml.Vector3dc import kotlin.reflect.KClass interface IDocument : EventDispatcher, INodeContainer { fun > createNode(nodeType: KClass): T fun deleteNode(refNode: INode<*>) fun addEventListener(eventName: String, refNode: INode<*>, block: (Event) -> Unit) fun getNodeByNodeId(nodeId: Long): INode<*>? fun findAt(x: Number, y: Number, z: Number) = findAt(Vector3d(x, y, z)) fun findAt(vec: Vector3dc): Collection> fun rebalance() fun , N : IRenderNode<*, T, C>> render(target: T, renderer: C) { for (node in getNodesByRenderTarget(target.type)) { node.render(renderer) } } } inline fun > IDocument.createNode() = createNode(T::class)