File tree Expand file tree Collapse file tree 5 files changed +49
-7
lines changed Expand file tree Collapse file tree 5 files changed +49
-7
lines changed Original file line number Diff line number Diff line change @@ -157,11 +157,16 @@ var PreviewView = RenderableView.extend({
157
157
renderScene : function ( ) {
158
158
this . log ( 'renderScene' ) ;
159
159
160
- // TODO: check renderer.domElement.isContextLost()
161
-
162
160
if ( this . isFrozen ) {
163
161
this . unfreeze ( ) ;
164
162
}
163
+
164
+ if ( this . renderer . context . isContextLost ( ) ) {
165
+ // Context is invalid, freeze for now (stops animation etc)
166
+ this . freeze ( ) ;
167
+ return ;
168
+ }
169
+
165
170
if ( this . _rebuildNeeded ) {
166
171
this . constructScene ( ) ;
167
172
}
Original file line number Diff line number Diff line change @@ -96,12 +96,16 @@ var RenderableView = widgets.DOMWidgetView.extend({
96
96
scene = scene || this . scene ;
97
97
camera = camera || this . camera ;
98
98
99
- // TODO: check renderer.domElement.isContextLost()
100
-
101
99
if ( this . isFrozen ) {
102
100
this . unfreeze ( ) ;
103
101
}
104
102
103
+ if ( this . renderer . context . isContextLost ( ) ) {
104
+ // Context is invalid, freeze for now (stops animation etc)
105
+ this . freeze ( ) ;
106
+ return ;
107
+ }
108
+
105
109
this . renderer . render ( scene , camera ) ;
106
110
} ,
107
111
@@ -119,7 +123,6 @@ var RenderableView = widgets.DOMWidgetView.extend({
119
123
}
120
124
121
125
this . acquireRenderer ( ) ;
122
- this . updateSize ( ) ;
123
126
124
127
if ( this . controls ) {
125
128
this . enableControls ( ) ;
@@ -137,6 +140,8 @@ var RenderableView = widgets.DOMWidgetView.extend({
137
140
138
141
this . $el . css ( 'margin-bottom' , '-5px' ) ;
139
142
143
+ this . updateSize ( ) ;
144
+
140
145
this . log ( 'ThreeView.acquireRenderer(' + this . renderer . poolId + ')' ) ;
141
146
} ,
142
147
@@ -216,6 +221,7 @@ var RenderableView = widgets.DOMWidgetView.extend({
216
221
217
222
onRendererReclaimed : function ( ) {
218
223
this . log ( 'ThreeView WebGL context is being reclaimed: ' + this . renderer . poolId ) ;
224
+
219
225
this . freeze ( ) ;
220
226
} ,
221
227
Original file line number Diff line number Diff line change @@ -33,6 +33,7 @@ _.extend(RendererPool.prototype, {
33
33
// required for converting canvas to png
34
34
preserveDrawingBuffer : true ,
35
35
} ) ;
36
+ renderer . context . canvas . addEventListener ( "webglcontextlost" , this . onContextLost . bind ( this ) , false ) ;
36
37
renderer . poolId = this . numCreated ;
37
38
this . numCreated ++ ;
38
39
@@ -79,6 +80,24 @@ _.extend(RendererPool.prototype, {
79
80
80
81
} ,
81
82
83
+ onContextLost : function ( event ) {
84
+ // Find the relevant renderer:
85
+ var claim = _ . find ( this . claimedPool , function ( claimToken ) {
86
+ return claimToken . renderer . domElement === event . target ;
87
+ } ) ;
88
+ if ( ! claim ) {
89
+ console . warn ( 'Could not find lost context' ) ;
90
+ return ;
91
+ }
92
+
93
+ // remove claim token
94
+ this . claimedPool = _ . without ( this . claimedPool , claim ) ;
95
+ this . freePool . push ( renderer ) ;
96
+
97
+ // notify holder
98
+ claim . onReclaim ( ) ;
99
+ } ,
100
+
82
101
} ) ;
83
102
84
103
module . exports = new RendererPool ( ) ;
Original file line number Diff line number Diff line change @@ -128,8 +128,8 @@ var RendererView = RenderableView.extend({
128
128
this . tick ( ) ;
129
129
} ,
130
130
131
- unfreeze : function ( ) {
132
- RenderableView . prototype . unfreeze . call ( this ) ;
131
+ acquireRenderer : function ( ) {
132
+ RenderableView . prototype . acquireRenderer . call ( this ) ;
133
133
134
134
// We need to ensure that renderer properties are applied
135
135
// (we have no idea where the renderer has been...)
Original file line number Diff line number Diff line change @@ -9,6 +9,7 @@ var Promise = require('bluebird');
9
9
10
10
var RenderableModel = require ( '../_base/Renderable' ) . RenderableModel ;
11
11
var RenderableView = require ( '../_base/Renderable' ) . RenderableView ;
12
+ var ThreeModel = require ( '../_base/Three' ) . ThreeModel ;
12
13
13
14
var WebGLRendererModel = RenderableModel . extend ( {
14
15
@@ -69,6 +70,17 @@ var WebGLRendererView = RenderableView.extend({
69
70
console . log ( 'WGLR(' + this . id + '): ' + str ) ;
70
71
} ,
71
72
73
+ acquireRenderer : function ( ) {
74
+ RenderableView . prototype . acquireRenderer . call ( this ) ;
75
+
76
+ // We need to ensure that renderer properties are applied
77
+ // (we have no idea where the renderer has been...)
78
+ var clearColor = ThreeModel . prototype . convertColorModelToThree ( this . model . get ( 'clearColor' ) ) ;
79
+ var clearOpacity = ThreeModel . prototype . convertFloatModelToThree ( this . model . get ( 'clearOpacity' ) ) ;
80
+ this . renderer . setClearColor ( clearColor , clearOpacity ) ;
81
+ // TODO: Apply other model attributes
82
+ } ,
83
+
72
84
//
73
85
// Handlers
74
86
//
You can’t perform that action at this time.
0 commit comments