63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
package pipeline
|
|
|
|
import (
|
|
"aego/app/assembly"
|
|
"aego/app/assembly/builtin"
|
|
"aego/engine"
|
|
"aego/engine/module"
|
|
"aego/render"
|
|
"aego/scene"
|
|
"aego/scene/frame"
|
|
)
|
|
|
|
func Types() (*scene.Types, *module.Manifest, error) {
|
|
t, err := assembly.NewTypes()
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
man, err := builtin.Default().Load(t, nil, assembly.Options{})
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
if err := t.Schema().Freeze(); err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return t, man, nil
|
|
}
|
|
|
|
type Pipeline struct {
|
|
Runner *frame.Runner
|
|
ctx engine.Context
|
|
prep []engine.System
|
|
draw []engine.System
|
|
}
|
|
|
|
func New(man *module.Manifest) *Pipeline {
|
|
p := &Pipeline{Runner: frame.New()}
|
|
w := engine.NewWorld("demo")
|
|
w.SetService(frame.ServiceID, p.Runner)
|
|
p.ctx.World = w
|
|
for _, d := range man.Systems {
|
|
switch d.Phase {
|
|
case engine.PhaseRenderPrepare:
|
|
p.prep = append(p.prep, d.System)
|
|
case engine.PhaseRender:
|
|
p.draw = append(p.draw, d.System)
|
|
}
|
|
}
|
|
return p
|
|
}
|
|
|
|
func (p *Pipeline) Render(e *engine.Engine, r *render.Renderer) {
|
|
m := e.Metrics()
|
|
p.Runner.Prepare(m.PixelW, m.PixelH, m.Density())
|
|
p.ctx.Engine = e
|
|
for _, s := range p.prep {
|
|
s.Run(&p.ctx)
|
|
}
|
|
for _, s := range p.draw {
|
|
s.Run(&p.ctx)
|
|
}
|
|
p.Runner.Submit(r)
|
|
}
|