Spaces:
Running
Running
| /** | |
| * SEA3D - o3dgc | |
| * @author Sunag / http://www.sunag.com.br/ | |
| */ | |
| ; | |
| // | |
| // Lossy Compression | |
| // | |
| SEA3D.GeometryGC = function ( name, data, sea3d ) { | |
| this.name = name; | |
| this.data = data; | |
| this.sea3d = sea3d; | |
| var i; | |
| var attrib = data.readUShort(); | |
| var uvIDs = [], jointID, weightID; | |
| this.isBig = ( attrib & 1 ) != 0; | |
| data.readVInt = this.isBig ? data.readUInt : data.readUShort; | |
| // Geometry Flags | |
| // .. | |
| // 1 isBig | |
| // 2 groups | |
| // 4 uv | |
| // 8 tangent | |
| // 16 colors | |
| // 32 joints | |
| // 64 morph | |
| // 128 vertex-animation | |
| // .. | |
| if ( attrib & 2 ) { | |
| this.groups = []; | |
| var numGroups = data.readUByte(), | |
| groupOffset = 0; | |
| for ( i = 0; i < numGroups; i ++ ) { | |
| var groupLength = data.readVInt() * 3; | |
| this.groups.push( { | |
| start: groupOffset, | |
| count: groupLength, | |
| } ); | |
| groupOffset += groupLength; | |
| } | |
| } else { | |
| this.groups = []; | |
| } | |
| if ( attrib & 4 ) { | |
| this.uv = []; | |
| var uvCount = data.readUByte(); | |
| for ( i = 0; i < uvCount; i ++ ) { | |
| uvIDs[ i ] = data.readUByte(); | |
| } | |
| } | |
| if ( attrib & 32 ) { | |
| jointID = data.readUByte(); | |
| weightID = data.readUByte(); | |
| } | |
| var size = data.readUInt(); | |
| var bytes = data.concat( data.position, size ); | |
| var bstream = new o3dgc.BinaryStream( bytes.buffer ); | |
| var decoder = new o3dgc.SC3DMCDecoder(); | |
| var ifs = new o3dgc.IndexedFaceSet(); | |
| decoder.DecodeHeader( ifs, bstream ); | |
| var numIndexes = ifs.GetNCoordIndex(); | |
| var numVertex = ifs.GetNCoord(); | |
| if ( ! this.groups.length ) this.groups.push( { start: 0, count: numIndexes * 3 } ); | |
| this.indexes = this.isBig ? new Uint32Array( numIndexes * 3 ) : new Uint16Array( numIndexes * 3 ); | |
| this.vertex = new Float32Array( numVertex * 3 ); | |
| ifs.SetCoordIndex( this.indexes ); | |
| ifs.SetCoord( this.vertex ); | |
| if ( ifs.GetNNormal() > 0 ) { | |
| this.normal = new Float32Array( numVertex * 3 ); | |
| ifs.SetNormal( this.normal ); | |
| } | |
| for ( i = 0; i < uvIDs.length; i ++ ) { | |
| this.uv[ i ] = new Float32Array( numVertex * 2 ); | |
| ifs.SetFloatAttribute( uvIDs[ i ], this.uv[ i ] ); | |
| } | |
| if ( jointID !== undefined ) { | |
| this.jointPerVertex = ifs.GetIntAttributeDim( jointID ); | |
| this.joint = new Uint16Array( numVertex * this.jointPerVertex ); | |
| this.weight = new Float32Array( numVertex * this.jointPerVertex ); | |
| ifs.SetIntAttribute( jointID, this.joint ); | |
| ifs.SetFloatAttribute( weightID, this.weight ); | |
| } | |
| // decode mesh | |
| decoder.DecodePlayload( ifs, bstream ); | |
| }; | |
| SEA3D.GeometryGC.prototype.type = "s3D"; | |
| // | |
| // Extension | |
| // | |
| THREE.SEA3D.EXTENSIONS_LOADER.push( { | |
| setTypeRead: function () { | |
| this.file.addClass( SEA3D.GeometryGC, true ); | |
| this.file.typeRead[ SEA3D.GeometryGC.prototype.type ] = this.readGeometryBuffer; | |
| } | |
| } ); | |