123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- /**
- * SEA3D - o3dgc
- * @author Sunag / http://www.sunag.com.br/
- */
- 'use strict';
- //
- // 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;
- }
- } );
|