-
Notifications
You must be signed in to change notification settings - Fork 0
/
scene_builder.go
113 lines (91 loc) · 2.42 KB
/
scene_builder.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package opengl
import (
"errors"
"github.com/xmn-services/buckets-network/domain/memory/worlds/scenes"
)
type sceneBuilder struct {
hudBuilder HudBuilder
nodeBuilder NodeBuilder
worldCameraBuilder WorldCameraBuilder
scene scenes.Scene
}
func createSceneBuilder(
hudBuilder HudBuilder,
nodeBuilder NodeBuilder,
worldCameraBuilder WorldCameraBuilder,
) SceneBuilder {
out := sceneBuilder{
hudBuilder: hudBuilder,
nodeBuilder: nodeBuilder,
worldCameraBuilder: worldCameraBuilder,
}
return &out
}
// Create initializes the builder
func (app *sceneBuilder) Create() SceneBuilder {
return createSceneBuilder(app.hudBuilder, app.nodeBuilder, app.worldCameraBuilder)
}
// WithScene adds a scene to the builder
func (app *sceneBuilder) WithScene(scene scenes.Scene) SceneBuilder {
app.scene = scene
return app
}
// Now builds a new Scene instance
func (app *sceneBuilder) Now() (Scene, error) {
if app.scene == nil {
return nil, errors.New("the scene is mandatory in order to build a Scene instance")
}
domainHud := app.scene.Hud()
hud, err := app.hudBuilder.Create().WithHud(domainHud).Now()
if err != nil {
return nil, err
}
id := app.scene.ID()
index := app.scene.Index()
nodes := []Node{}
domainNodes := app.scene.Nodes()
for _, oneNode := range domainNodes {
node, err := app.nodeBuilder.Create().WithNode(oneNode).Now()
if err != nil {
return nil, err
}
nodes = append(nodes, node)
}
worldCameras, err := app.retrieveWorldCamerasFromNodes(nodes)
if err != nil {
return nil, err
}
return createScene(worldCameras, id, index, hud, nodes), nil
}
func (app *sceneBuilder) retrieveWorldCamerasFromNodes(nodes []Node) (map[string]WorldCamera, error) {
if nodes == nil {
return map[string]WorldCamera{}, nil
}
out := map[string]WorldCamera{}
for _, oneNode := range nodes {
if oneNode.HasChildren() {
children := oneNode.Children()
subWorldCameras, err := app.retrieveWorldCamerasFromNodes(children)
if err != nil {
return nil, err
}
for keyname, oneCam := range subWorldCameras {
out[keyname] = oneCam
}
}
if !oneNode.HasContent() {
continue
}
content := oneNode.Content()
if !content.IsCamera() {
continue
}
worldCamera, err := app.worldCameraBuilder.Create().WithNode(oneNode).Now()
if err != nil {
return nil, err
}
keyname := oneNode.ID().String()
out[keyname] = worldCamera
}
return out, nil
}