forked from vova616/GarageEngine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Scene.go
88 lines (76 loc) · 1.68 KB
/
Scene.go
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package engine
//import "log"
type SceneData struct {
name string
gameObjects []*GameObject
Camera *Camera
}
type Scene interface {
New() Scene
Load()
SceneBase() *SceneData
}
func NewScene(name string) *SceneData {
return &SceneData{name: name, gameObjects: make([]*GameObject, 0)}
}
func (s *SceneData) SetCamera(Camera *Camera) {
s.Camera = Camera
}
func (s *SceneData) Name() string {
return s.name
}
func (s *SceneData) SceneBase() *SceneData {
return s
}
func (s *SceneData) addGameObject(gameObject ...*GameObject) {
for _, obj := range gameObject {
s.gameObjects = append(s.gameObjects, obj)
obj.transform.childOfScene = true
for _, t := range obj.transform.children {
s.addGameObject(t.gameObject)
}
}
}
func (s *SceneData) AddGameObject(gameObject ...*GameObject) {
if s == GetScene().SceneBase() {
for _, obj := range gameObject {
obj.AddToScene()
}
} else {
s.addGameObject(gameObject...)
}
}
func (s *SceneData) removeGameObject(g *GameObject) {
if g == nil {
return
}
for i, c := range s.gameObjects {
if g == c {
s.gameObjects[i].transform.childOfScene = false
for _, t := range g.transform.children {
s.removeGameObject(t.gameObject)
}
s.gameObjects[i] = nil
break
}
}
}
func (s *SceneData) cleanNil() {
for i := 0; i < len(s.gameObjects); i++ {
if s.gameObjects[i] == nil {
s.gameObjects[i], s.gameObjects = s.gameObjects[len(s.gameObjects)-1], s.gameObjects[:len(s.gameObjects)-1]
i--
}
}
}
func (s *SceneData) RemoveGameObject(g *GameObject) {
if g == nil {
return
}
if s == GetScene().SceneBase() {
g.RemoveFromScene()
} else {
g.transform.removeFromParent()
s.removeGameObject(g)
}
}