summaryrefslogtreecommitdiff
path: root/engine/Components/Layering.go
blob: 3e42b44de27ac85ebf01ea8ef64a64370b0ebfd8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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
}