155 lines
2.6 KiB
JavaScript
155 lines
2.6 KiB
JavaScript
/**
|
|
* 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;
|
|
|
|
}
|
|
|
|
} );
|