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
}
|