1
+ ( function ( ) {
2
+ var Class = Hilo3d . Class ;
3
+ var BasicLoader = Hilo3d . BasicLoader ;
4
+ var Geometry = Hilo3d . Geometry ;
5
+ var GeometryData = Hilo3d . GeometryData ;
6
+
7
+ var dracoDecoder = window . dracoDecoder = new DracoDecoderModule ( ) ;
8
+ dracoDecoder . onModuleLoaded = function ( module ) {
9
+ dracoDecoder = module ;
10
+ }
11
+
12
+ function getAttributeData ( decoder , dracoGeometry , attribute ) {
13
+ if ( attribute . ptr === 0 ) {
14
+ return null ;
15
+ }
16
+
17
+ var numComponents = attribute . num_components ( ) ;
18
+ var attributeData = new dracoDecoder . DracoFloat32Array ( ) ;
19
+
20
+ decoder . GetAttributeFloatForAllPoints ( dracoGeometry , attribute , attributeData ) ;
21
+ var numPoints = dracoGeometry . num_points ( ) ;
22
+ var numValues = numPoints * numComponents ;
23
+ var result = new Float32Array ( numValues ) ;
24
+ for ( var i = 0 ; i < numValues ; i ++ ) {
25
+ result [ i ] = attributeData . GetValue ( i ) ;
26
+ }
27
+ return result ;
28
+ }
29
+
30
+ function decode ( byteArray , info , primitive ) {
31
+ var attributesMap = info . attributes ;
32
+ var buffer = new dracoDecoder . DecoderBuffer ( ) ;
33
+ buffer . Init ( byteArray , byteArray . byteLength ) ;
34
+ var decoder = new dracoDecoder . Decoder ( ) ;
35
+
36
+ var geometryType = decoder . GetEncodedGeometryType ( buffer ) ;
37
+ var dracoGeometry , decodingStatus ;
38
+ if ( geometryType == dracoDecoder . TRIANGULAR_MESH ) {
39
+ dracoGeometry = new dracoDecoder . Mesh ( ) ;
40
+ decodingStatus = decoder . DecodeBufferToMesh ( buffer , dracoGeometry ) ;
41
+ } else {
42
+ dracoGeometry = new dracoDecoder . PointCloud ( ) ;
43
+ decodingStatus = decoder . DecodeBufferToPointCloud ( buffer , dracoGeometry ) ;
44
+ }
45
+
46
+ if ( ! decodingStatus . ok ( ) || dracoGeometry . ptr == 0 ) {
47
+ console . error ( 'decodingStatus error' ) ;
48
+ return ;
49
+ }
50
+ dracoDecoder . destroy ( buffer ) ;
51
+
52
+ var geometry = primitive . _geometry || new Geometry ( ) ;
53
+
54
+ var numFaces = dracoGeometry . num_faces ( ) ;
55
+ var numPoints = dracoGeometry . num_points ( ) ;
56
+ // Verify if there is position attribute.
57
+ var posAttId = decoder . GetAttributeId ( dracoGeometry ,
58
+ dracoDecoder . POSITION ) ;
59
+ if ( posAttId == - 1 ) {
60
+ var errorMsg = 'THREE.DRACOLoader: No position attribute found.' ;
61
+ console . error ( errorMsg ) ;
62
+ dracoDecoder . destroy ( decoder ) ;
63
+ dracoDecoder . destroy ( dracoGeometry ) ;
64
+ throw new Error ( errorMsg ) ;
65
+ }
66
+ var posAttribute = decoder . GetAttribute ( dracoGeometry , posAttId ) ;
67
+ var posTransform = new dracoDecoder . AttributeQuantizationTransform ( ) ;
68
+ if ( posTransform . InitFromAttribute ( posAttribute ) ) {
69
+
70
+ }
71
+
72
+ var dracoAttributesMap = {
73
+ POSITION : [ 'vertices' , 3 ] ,
74
+ NORMAL : [ 'normals' , 3 ] ,
75
+ TANGENT : [ 'tangents' , 4 ] ,
76
+ TEX_COORD : [ 'uvs' , 2 ] ,
77
+ TEXCOORD_0 : [ 'uvs' , 2 ] ,
78
+ TEXCOORD_1 : [ 'uvs1' , 2 ] ,
79
+ COLOR : [ 'color' , 2 ] ,
80
+ COLOR_0 : [ 'color' , 2 ] ,
81
+ JOINTS_0 : [ 'skinIndices' , 4 ] ,
82
+ WEIGHTS_0 : [ 'skinWeights' , 4 ] ,
83
+ } ;
84
+
85
+ var attributeUsedMap = { } ;
86
+ for ( var attributeName in dracoAttributesMap ) {
87
+ var info = dracoAttributesMap [ attributeName ] ;
88
+ var attId = decoder . GetAttributeId ( dracoGeometry , dracoDecoder [ attributeName ] ) ;
89
+ if ( dracoDecoder [ attributeName ] !== undefined && attId !== - 1 ) {
90
+ var attribute = decoder . GetAttribute ( dracoGeometry , attId ) ;
91
+ var data = getAttributeData ( decoder , dracoGeometry , attribute ) ;
92
+ if ( data ) {
93
+ geometry [ info [ 0 ] ] = new GeometryData ( data , info [ 1 ] ) ;
94
+ }
95
+ attributeUsedMap [ info [ 0 ] ] = true ;
96
+ }
97
+ }
98
+
99
+ for ( var attributeName in attributesMap ) {
100
+ var info = dracoAttributesMap [ attributeName ] ;
101
+ if ( ! info ) {
102
+ console . warn ( attributeName + ' not exist' ) ;
103
+ continue ;
104
+ }
105
+ if ( attributeUsedMap [ info [ 0 ] ] ) {
106
+ continue ;
107
+ }
108
+ var attributeId = attributesMap [ attributeName ] ;
109
+ var attribute = decoder . GetAttributeByUniqueId ( dracoGeometry ,
110
+ attributeId ) ;
111
+ var data = getAttributeData ( decoder , dracoGeometry , attribute ) ;
112
+ if ( data ) {
113
+ geometry [ info [ 0 ] ] = new GeometryData ( data , info [ 1 ] ) ;
114
+ }
115
+ }
116
+
117
+ if ( geometry . _tangents ) {
118
+ if ( geometry . _tangents . length > geometry . vertices . length ) {
119
+ geometry . _tangents . stride = 16 ;
120
+ geometry . _tangents . size = 3 ;
121
+ }
122
+ }
123
+
124
+ if ( geometry . skinIndices ) {
125
+ var x = geometry . skinIndices . data ;
126
+ for ( var i = x . length - 1 ; i >= 0 ; i -- ) {
127
+ x [ i ] = Math . round ( x [ i ] ) ;
128
+ }
129
+ }
130
+
131
+ var indicesArray ;
132
+ if ( numPoints > 65535 ) {
133
+ indicesArray = new Uint32Array ( numFaces * 3 ) ;
134
+ } else {
135
+ indicesArray = new Uint16Array ( numFaces * 3 ) ;
136
+ }
137
+ var ia = new dracoDecoder . DracoInt32Array ( ) ;
138
+ for ( var i = 0 ; i < numFaces ; i ++ ) {
139
+ decoder . GetFaceFromMesh ( dracoGeometry , i , ia ) ;
140
+ var idx = i * 3 ;
141
+ indicesArray [ idx ] = ia . GetValue ( 0 ) ;
142
+ indicesArray [ idx + 1 ] = ia . GetValue ( 1 ) ;
143
+ indicesArray [ idx + 2 ] = ia . GetValue ( 2 ) ;
144
+ }
145
+ geometry . indices = new GeometryData ( indicesArray , 1 ) ;
146
+
147
+ dracoDecoder . destroy ( ia ) ;
148
+ dracoDecoder . destroy ( dracoGeometry ) ;
149
+ dracoDecoder . destroy ( decoder ) ;
150
+ return geometry ;
151
+ }
152
+
153
+
154
+ var DracoLoader = Class . create ( {
155
+ Extends : BasicLoader ,
156
+ Statics : {
157
+ decode : decode
158
+ } ,
159
+ constructor : function ( ) {
160
+ DracoLoader . superclass . constructor . call ( this ) ;
161
+ } ,
162
+ load : function ( params ) {
163
+ return this . loadRes ( params . src , 'buffer' )
164
+ . then ( function ( data ) {
165
+ return decode ( data ) ;
166
+ } ) . catch ( function ( err ) {
167
+ console . warn ( 'load draco failed' , err ) ;
168
+ throw err ;
169
+ } ) ;
170
+ }
171
+ } ) ;
172
+
173
+ Hilo3d . DracoLoader = DracoLoader ;
174
+ Hilo3d . Loader . addLoader ( 'drc' , DracoLoader ) ;
175
+
176
+ Hilo3d . GLTFParser . extensionHandlers . KHR_draco_mesh_compression = {
177
+ parse : function ( info , parser , result , primitive ) {
178
+ var bufferView = parser . bufferViews [ info . bufferView ] ;
179
+ var uintArray = new Uint8Array ( bufferView . buffer , bufferView . byteOffset , bufferView . byteLength ) ;
180
+ var geometry = decode ( uintArray , info , primitive ) ;
181
+ return geometry ;
182
+ }
183
+ } ;
184
+ } ) ( ) ;
0 commit comments