summaryrefslogtreecommitdiff
path: root/engine/Components/Layering.go
diff options
context:
space:
mode:
Diffstat (limited to 'engine/Components/Layering.go')
-rw-r--r--engine/Components/Layering.go67
1 files changed, 67 insertions, 0 deletions
diff --git a/engine/Components/Layering.go b/engine/Components/Layering.go
new file mode 100644
index 0000000..3e42b44
--- /dev/null
+++ b/engine/Components/Layering.go
@@ -0,0 +1,67 @@
+package components
+
+type LayeringElement interface {
+ Draw()
+ // returnt Y-index of the element
+ GetYIndex() float32
+}
+
+// Stores elements by their Y-layer ordered in decreasing order.
+// Used to draw objects in the correct order on screen
+type layering struct {
+ ObjectCount int
+ firstLayer *layer
+}
+
+func (base *layering) Insert(new LayeringElement) {
+ base.ObjectCount += 1
+ var y = new.GetYIndex()
+ var newLayer = layer {
+ Index: y,
+ Objects: []LayeringElement { new },
+ }
+ if base.firstLayer == nil {
+ base.firstLayer = &newLayer
+ return
+ }
+
+ // The first layer is greater than the current first layer
+ if base.firstLayer.Index > y {
+ newLayer.next = base.firstLayer
+ base.firstLayer = &newLayer
+ return
+ }
+
+ var current = base.firstLayer
+ var next *layer
+ for {
+ if current == nil {
+ break
+ }
+ next = current.Next()
+ if current.Index == y {
+ current.Objects = append(current.Objects, new)
+ return
+ }
+ if y < current.Index && y > next.Index {
+ newLayer.next = next
+ current.next = &newLayer
+ return
+ }
+ if current.Next() == nil {
+ current.next = &newLayer
+ return
+ }
+ next = current
+ }
+}
+
+type layer struct {
+ Index float32
+ Objects []LayeringElement
+ next *layer
+}
+
+func (base *layer) Next() *layer {
+ return base.next
+}