From 1d2651c4ef780076fb7b1e9692c8ed7740f4a06a Mon Sep 17 00:00:00 2001 From: Ivan Danyliuk Date: Tue, 23 Oct 2018 08:28:14 +0200 Subject: [PATCH] Fix WebGL initialization order issue --- graph.go | 3 +++ page.go | 8 +++++++- scene.go | 10 ++++++++-- widgets/network_selector.go | 8 ++++---- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/graph.go b/graph.go index d995eca..3ff87c6 100644 --- a/graph.go +++ b/graph.go @@ -29,6 +29,9 @@ func (p *Page) UpdateGraph() { // and creates all new objects based on current data and positions. // It doesn't do any calculations of changes to the layout or graph data. func (p *Page) RecreateObjects() { + p.loaded = true + p.loader.Reset() + p.webgl.RemoveObjects() p.webgl.CreateObjects(p.layout.Positions(), p.layout.Links()) diff --git a/page.go b/page.go index d963d71..1cf0574 100644 --- a/page.go +++ b/page.go @@ -39,7 +39,7 @@ func NewPage() *Page { } page.forceEditor = widgets.NewForceEditor(page.onForcesApply) page.network = widgets.NewNetworkSelector(page.onNetworkChange) - page.webgl = NewWebGLScene() + page.webgl = NewWebGLScene(page.onWebGLReady) page.simulationWidget = widgets.NewSimulation("http://localhost:8084", page.startSimulation, page.replaySimulation) page.statsWidget = widgets.NewStats() return page @@ -128,6 +128,7 @@ func (p *Page) onNetworkChange(network *network.Network) { // set forced positions if found in network if network.Positions != nil { + fmt.Println("Using precalculated positions") p.layout.SetPositions(network.Positions) go p.RecreateObjects() return @@ -194,3 +195,8 @@ func (p *Page) header() *vecty.HTML { ), ) } + +// onWebGLReady is executed when WebGL context is up and ready to render scene. +func (p *Page) onWebGLReady() { + p.onNetworkChange(p.network.Current()) +} diff --git a/scene.go b/scene.go index 18c41ee..be6b2f4 100644 --- a/scene.go +++ b/scene.go @@ -33,12 +33,15 @@ type WebGLScene struct { lines []*Line rt *RenderThrottler // used as a helper to reduce rendering calls when animation is not needed (experimental) + + initFn func() // function to run on initialization } // NewWebGLScene inits and returns new WebGL scene and canvas. -func NewWebGLScene() *WebGLScene { +func NewWebGLScene(initFn func()) *WebGLScene { w := &WebGLScene{ - rt: NewRenderThrottler(), + rt: NewRenderThrottler(), + initFn: initFn, } w.WebGLRenderer = vthree.NewWebGLRenderer(vthree.WebGLOptions{ Init: w.init, @@ -61,6 +64,9 @@ func (w *WebGLScene) init(renderer *three.WebGLRenderer) { w.InitScene(windowWidth, windowHeight) + if w.initFn != nil { + w.initFn() + } w.animate() } diff --git a/widgets/network_selector.go b/widgets/network_selector.go index de4a012..fa202ed 100644 --- a/widgets/network_selector.go +++ b/widgets/network_selector.go @@ -139,6 +139,10 @@ func (n *NetworkSelector) onUpload(json []byte) { n.networks[net.Name] = net n.setCurrentNetwork(net) + if n.handler != nil { + go n.handler(n.current) + } + vecty.Rerender(n) } @@ -150,8 +154,4 @@ func (n *NetworkSelector) Current() *network.Network { // setCurrentNetwork changes current network and runs needed update handlers. func (n *NetworkSelector) setCurrentNetwork(net *network.Network) { n.current = net - - if n.handler != nil { - go n.handler(n.current) - } }