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; | |
} | |
} ); | |