1
1
import * as THREE from "three" ;
2
+ import { VNode } from "vue" ;
2
3
import { Component , Mixins , Prop , Provide , Vue , Watch } from "vue-property-decorator" ;
3
4
4
5
import { AssetType } from "../types" ;
5
- import { ThreeAssetComponent , ThreeComponent } from "./base" ;
6
+ import { isThreeAssetComponent , ThreeAssetComponent , ThreeComponent } from "./base" ;
6
7
7
8
@Component
8
9
export class Scene extends Mixins ( ThreeComponent ) {
@@ -70,19 +71,37 @@ export class Scene extends Mixins(ThreeComponent) {
70
71
this . m_isReady = true ;
71
72
}
72
73
73
- public async preloadAssets ( ) {
74
- const assets : Array < Promise < AssetType > > = [ ] ;
75
- const preloadNodes = this . $slots . preload ;
76
- if ( preloadNodes ) {
77
- for ( const node of preloadNodes ) {
74
+ private recursivePreload (
75
+ data : { counter : number ; assets : Array < Promise < AssetType > > } ,
76
+ nodes : VNode [ ] | undefined
77
+ ) {
78
+ if ( nodes ) {
79
+ for ( const node of nodes ) {
78
80
const component = node . componentInstance ;
79
- if ( component instanceof ThreeAssetComponent ) {
80
- assets . push ( component . asset ) ;
81
+ if ( component && isThreeAssetComponent ( component ) ) {
82
+ const p = component . asset . then ( asset => {
83
+ ++ data . counter ;
84
+ this . $emit ( "load-progress" , data . counter , data . assets . length ) ;
85
+ return asset ;
86
+ } ) ;
87
+ data . assets . push ( p ) ;
81
88
}
89
+ this . recursivePreload ( data , node . children ) ;
82
90
}
83
91
}
92
+ }
93
+
94
+ public async preloadAssets ( ) {
95
+ this . $emit ( "load" ) ;
96
+
97
+ const data : { counter : number ; assets : Array < Promise < AssetType > > } = {
98
+ assets : [ ] ,
99
+ counter : 0
100
+ } ;
101
+ this . recursivePreload ( data , this . $slots . preload ) ;
84
102
85
- return Promise . all ( assets ) ;
103
+ await Promise . all ( data . assets ) ;
104
+ this . $emit ( "loaded" ) ;
86
105
}
87
106
88
107
public mounted ( ) {
@@ -109,7 +128,7 @@ export class Scene extends Mixins(ThreeComponent) {
109
128
) ;
110
129
111
130
return (
112
- < div className = "scene" >
131
+ < div class = "scene" >
113
132
< h2 > Scene { this . name } </ h2 >
114
133
< div >
115
134
< h3 > Preload</ h3 >
0 commit comments