| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 | 
							- function LWO2Parser( IFFParser ) {
 
- 	this.IFF = IFFParser;
 
- }
 
- LWO2Parser.prototype = {
 
- 	constructor: LWO2Parser,
 
- 	parseBlock: function () {
 
- 		this.IFF.debugger.offset = this.IFF.reader.offset;
 
- 		this.IFF.debugger.closeForms();
 
- 		var blockID = this.IFF.reader.getIDTag();
 
- 		var length = this.IFF.reader.getUint32(); // size of data in bytes
 
- 		if ( length > this.IFF.reader.dv.byteLength - this.IFF.reader.offset ) {
 
- 			this.IFF.reader.offset -= 4;
 
- 			length = this.IFF.reader.getUint16();
 
- 		}
 
- 		this.IFF.debugger.dataOffset = this.IFF.reader.offset;
 
- 		this.IFF.debugger.length = length;
 
- 		// Data types may be found in either LWO2 OR LWO3 spec
 
- 		switch ( blockID ) {
 
- 			case 'FORM': // form blocks may consist of sub -chunks or sub-forms
 
- 				this.IFF.parseForm( length );
 
- 				break;
 
- 			// SKIPPED CHUNKS
 
- 			// if break; is called directly, the position in the lwoTree is not created
 
- 			// any sub chunks and forms are added to the parent form instead
 
- 			// MISC skipped
 
- 			case 'ICON': // Thumbnail Icon Image
 
- 			case 'VMPA': // Vertex Map Parameter
 
- 			case 'BBOX': // bounding box
 
- 			// case 'VMMD':
 
- 			// case 'VTYP':
 
- 			// normal maps can be specified, normally on models imported from other applications. Currently ignored
 
- 			case 'NORM':
 
- 			// ENVL FORM skipped
 
- 			case 'PRE ':
 
- 			case 'POST':
 
- 			case 'KEY ':
 
- 			case 'SPAN':
 
- 			// CLIP FORM skipped
 
- 			case 'TIME':
 
- 			case 'CLRS':
 
- 			case 'CLRA':
 
- 			case 'FILT':
 
- 			case 'DITH':
 
- 			case 'CONT':
 
- 			case 'BRIT':
 
- 			case 'SATR':
 
- 			case 'HUE ':
 
- 			case 'GAMM':
 
- 			case 'NEGA':
 
- 			case 'IFLT':
 
- 			case 'PFLT':
 
- 			// Image Map Layer skipped
 
- 			case 'PROJ':
 
- 			case 'AXIS':
 
- 			case 'AAST':
 
- 			case 'PIXB':
 
- 			case 'AUVO':
 
- 			case 'STCK':
 
- 			// Procedural Textures skipped
 
- 			case 'PROC':
 
- 			case 'VALU':
 
- 			case 'FUNC':
 
- 			// Gradient Textures skipped
 
- 			case 'PNAM':
 
- 			case 'INAM':
 
- 			case 'GRST':
 
- 			case 'GREN':
 
- 			case 'GRPT':
 
- 			case 'FKEY':
 
- 			case 'IKEY':
 
- 			// Texture Mapping Form skipped
 
- 			case 'CSYS':
 
- 			// Surface CHUNKs skipped
 
- 			case 'OPAQ': // top level 'opacity' checkbox
 
- 			case 'CMAP': // clip map
 
- 			// Surface node CHUNKS skipped
 
- 			// These mainly specify the node editor setup in LW
 
- 			case 'NLOC':
 
- 			case 'NZOM':
 
- 			case 'NVER':
 
- 			case 'NSRV':
 
- 			case 'NVSK': // unknown
 
- 			case 'NCRD':
 
- 			case 'WRPW': // image wrap w ( for cylindrical and spherical projections)
 
- 			case 'WRPH': // image wrap h
 
- 			case 'NMOD':
 
- 			case 'NSEL':
 
- 			case 'NPRW':
 
- 			case 'NPLA':
 
- 			case 'NODS':
 
- 			case 'VERS':
 
- 			case 'ENUM':
 
- 			case 'TAG ':
 
- 			case 'OPAC':
 
- 			// Car Material CHUNKS
 
- 			case 'CGMD':
 
- 			case 'CGTY':
 
- 			case 'CGST':
 
- 			case 'CGEN':
 
- 			case 'CGTS':
 
- 			case 'CGTE':
 
- 			case 'OSMP':
 
- 			case 'OMDE':
 
- 			case 'OUTR':
 
- 			case 'FLAG':
 
- 			case 'TRNL':
 
- 			case 'GLOW':
 
- 			case 'GVAL': // glow intensity
 
- 			case 'SHRP':
 
- 			case 'RFOP':
 
- 			case 'RSAN':
 
- 			case 'TROP':
 
- 			case 'RBLR':
 
- 			case 'TBLR':
 
- 			case 'CLRH':
 
- 			case 'CLRF':
 
- 			case 'ADTR':
 
- 			case 'LINE':
 
- 			case 'ALPH':
 
- 			case 'VCOL':
 
- 			case 'ENAB':
 
- 				this.IFF.debugger.skipped = true;
 
- 				this.IFF.reader.skip( length );
 
- 				break;
 
- 			case 'SURF':
 
- 				this.IFF.parseSurfaceLwo2( length );
 
- 				break;
 
- 			case 'CLIP':
 
- 				this.IFF.parseClipLwo2( length );
 
- 				break;
 
- 			// Texture node chunks (not in spec)
 
- 			case 'IPIX': // usePixelBlending
 
- 			case 'IMIP': // useMipMaps
 
- 			case 'IMOD': // imageBlendingMode
 
- 			case 'AMOD': // unknown
 
- 			case 'IINV': // imageInvertAlpha
 
- 			case 'INCR': // imageInvertColor
 
- 			case 'IAXS': // imageAxis ( for non-UV maps)
 
- 			case 'IFOT': // imageFallofType
 
- 			case 'ITIM': // timing for animated textures
 
- 			case 'IWRL':
 
- 			case 'IUTI':
 
- 			case 'IINX':
 
- 			case 'IINY':
 
- 			case 'IINZ':
 
- 			case 'IREF': // possibly a VX for reused texture nodes
 
- 				if ( length === 4 ) this.IFF.currentNode[ blockID ] = this.IFF.reader.getInt32();
 
- 				else this.IFF.reader.skip( length );
 
- 				break;
 
- 			case 'OTAG':
 
- 				this.IFF.parseObjectTag();
 
- 				break;
 
- 			case 'LAYR':
 
- 				this.IFF.parseLayer( length );
 
- 				break;
 
- 			case 'PNTS':
 
- 				this.IFF.parsePoints( length );
 
- 				break;
 
- 			case 'VMAP':
 
- 				this.IFF.parseVertexMapping( length );
 
- 				break;
 
- 			case 'AUVU':
 
- 			case 'AUVN':
 
- 				this.IFF.reader.skip( length - 1 );
 
- 				this.IFF.reader.getVariableLengthIndex(); // VX
 
- 				break;
 
- 			case 'POLS':
 
- 				this.IFF.parsePolygonList( length );
 
- 				break;
 
- 			case 'TAGS':
 
- 				this.IFF.parseTagStrings( length );
 
- 				break;
 
- 			case 'PTAG':
 
- 				this.IFF.parsePolygonTagMapping( length );
 
- 				break;
 
- 			case 'VMAD':
 
- 				this.IFF.parseVertexMapping( length, true );
 
- 				break;
 
- 			// Misc CHUNKS
 
- 			case 'DESC': // Description Line
 
- 				this.IFF.currentForm.description = this.IFF.reader.getString();
 
- 				break;
 
- 			case 'TEXT':
 
- 			case 'CMNT':
 
- 			case 'NCOM':
 
- 				this.IFF.currentForm.comment = this.IFF.reader.getString();
 
- 				break;
 
- 			// Envelope Form
 
- 			case 'NAME':
 
- 				this.IFF.currentForm.channelName = this.IFF.reader.getString();
 
- 				break;
 
- 			// Image Map Layer
 
- 			case 'WRAP':
 
- 				this.IFF.currentForm.wrap = { w: this.IFF.reader.getUint16(), h: this.IFF.reader.getUint16() };
 
- 				break;
 
- 			case 'IMAG':
 
- 				var index = this.IFF.reader.getVariableLengthIndex();
 
- 				this.IFF.currentForm.imageIndex = index;
 
- 				break;
 
- 			// Texture Mapping Form
 
- 			case 'OREF':
 
- 				this.IFF.currentForm.referenceObject = this.IFF.reader.getString();
 
- 				break;
 
- 			case 'ROID':
 
- 				this.IFF.currentForm.referenceObjectID = this.IFF.reader.getUint32();
 
- 				break;
 
- 			// Surface Blocks
 
- 			case 'SSHN':
 
- 				this.IFF.currentSurface.surfaceShaderName = this.IFF.reader.getString();
 
- 				break;
 
- 			case 'AOVN':
 
- 				this.IFF.currentSurface.surfaceCustomAOVName = this.IFF.reader.getString();
 
- 				break;
 
- 			// Nodal Blocks
 
- 			case 'NSTA':
 
- 				this.IFF.currentForm.disabled = this.IFF.reader.getUint16();
 
- 				break;
 
- 			case 'NRNM':
 
- 				this.IFF.currentForm.realName = this.IFF.reader.getString();
 
- 				break;
 
- 			case 'NNME':
 
- 				this.IFF.currentForm.refName = this.IFF.reader.getString();
 
- 				this.IFF.currentSurface.nodes[ this.IFF.currentForm.refName ] = this.IFF.currentForm;
 
- 				break;
 
- 			// Nodal Blocks : connections
 
- 			case 'INME':
 
- 				if ( ! this.IFF.currentForm.nodeName ) this.IFF.currentForm.nodeName = [];
 
- 				this.IFF.currentForm.nodeName.push( this.IFF.reader.getString() );
 
- 				break;
 
- 			case 'IINN':
 
- 				if ( ! this.IFF.currentForm.inputNodeName ) this.IFF.currentForm.inputNodeName = [];
 
- 				this.IFF.currentForm.inputNodeName.push( this.IFF.reader.getString() );
 
- 				break;
 
- 			case 'IINM':
 
- 				if ( ! this.IFF.currentForm.inputName ) this.IFF.currentForm.inputName = [];
 
- 				this.IFF.currentForm.inputName.push( this.IFF.reader.getString() );
 
- 				break;
 
- 			case 'IONM':
 
- 				if ( ! this.IFF.currentForm.inputOutputName ) this.IFF.currentForm.inputOutputName = [];
 
- 				this.IFF.currentForm.inputOutputName.push( this.IFF.reader.getString() );
 
- 				break;
 
- 			case 'FNAM':
 
- 				this.IFF.currentForm.fileName = this.IFF.reader.getString();
 
- 				break;
 
- 			case 'CHAN': // NOTE: ENVL Forms may also have CHAN chunk, however ENVL is currently ignored
 
- 				if ( length === 4 ) this.IFF.currentForm.textureChannel = this.IFF.reader.getIDTag();
 
- 				else this.IFF.reader.skip( length );
 
- 				break;
 
- 			// LWO2 Spec chunks: these are needed since the SURF FORMs are often in LWO2 format
 
- 			case 'SMAN':
 
- 				var maxSmoothingAngle = this.IFF.reader.getFloat32();
 
- 				this.IFF.currentSurface.attributes.smooth = ( maxSmoothingAngle < 0 ) ? false : true;
 
- 				break;
 
- 			// LWO2: Basic Surface Parameters
 
- 			case 'COLR':
 
- 				this.IFF.currentSurface.attributes.Color = { value: this.IFF.reader.getFloat32Array( 3 ) };
 
- 				this.IFF.reader.skip( 2 ); // VX: envelope
 
- 				break;
 
- 			case 'LUMI':
 
- 				this.IFF.currentSurface.attributes.Luminosity = { value: this.IFF.reader.getFloat32() };
 
- 				this.IFF.reader.skip( 2 );
 
- 				break;
 
- 			case 'SPEC':
 
- 				this.IFF.currentSurface.attributes.Specular = { value: this.IFF.reader.getFloat32() };
 
- 				this.IFF.reader.skip( 2 );
 
- 				break;
 
- 			case 'DIFF':
 
- 				this.IFF.currentSurface.attributes.Diffuse = { value: this.IFF.reader.getFloat32() };
 
- 				this.IFF.reader.skip( 2 );
 
- 				break;
 
- 			case 'REFL':
 
- 				this.IFF.currentSurface.attributes.Reflection = { value: this.IFF.reader.getFloat32() };
 
- 				this.IFF.reader.skip( 2 );
 
- 				break;
 
- 			case 'GLOS':
 
- 				this.IFF.currentSurface.attributes.Glossiness = { value: this.IFF.reader.getFloat32() };
 
- 				this.IFF.reader.skip( 2 );
 
- 				break;
 
- 			case 'TRAN':
 
- 				this.IFF.currentSurface.attributes.opacity = this.IFF.reader.getFloat32();
 
- 				this.IFF.reader.skip( 2 );
 
- 				break;
 
- 			case 'BUMP':
 
- 				this.IFF.currentSurface.attributes.bumpStrength = this.IFF.reader.getFloat32();
 
- 				this.IFF.reader.skip( 2 );
 
- 				break;
 
- 			case 'SIDE':
 
- 				this.IFF.currentSurface.attributes.side = this.IFF.reader.getUint16();
 
- 				break;
 
- 			case 'RIMG':
 
- 				this.IFF.currentSurface.attributes.reflectionMap = this.IFF.reader.getVariableLengthIndex();
 
- 				break;
 
- 			case 'RIND':
 
- 				this.IFF.currentSurface.attributes.refractiveIndex = this.IFF.reader.getFloat32();
 
- 				this.IFF.reader.skip( 2 );
 
- 				break;
 
- 			case 'TIMG':
 
- 				this.IFF.currentSurface.attributes.refractionMap = this.IFF.reader.getVariableLengthIndex();
 
- 				break;
 
- 			case 'IMAP':
 
- 				this.IFF.reader.skip( 2 );
 
- 				break;
 
- 			case 'TMAP':
 
- 				this.IFF.debugger.skipped = true;
 
- 				this.IFF.reader.skip( length ); // needs implementing
 
- 				break;
 
- 			case 'IUVI': // uv channel name
 
- 				this.IFF.currentNode.UVChannel = this.IFF.reader.getString( length );
 
- 				break;
 
- 			case 'IUTL': // widthWrappingMode: 0 = Reset, 1 = Repeat, 2 = Mirror, 3 = Edge
 
- 				this.IFF.currentNode.widthWrappingMode = this.IFF.reader.getUint32();
 
- 				break;
 
- 			case 'IVTL': // heightWrappingMode
 
- 				this.IFF.currentNode.heightWrappingMode = this.IFF.reader.getUint32();
 
- 				break;
 
- 			// LWO2 USE
 
- 			case 'BLOK':
 
- 				// skip
 
- 				break;
 
- 			default:
 
- 				this.IFF.parseUnknownCHUNK( blockID, length );
 
- 		}
 
- 		if ( blockID != 'FORM' ) {
 
- 			this.IFF.debugger.node = 1;
 
- 			this.IFF.debugger.nodeID = blockID;
 
- 			this.IFF.debugger.log();
 
- 		}
 
- 		if ( this.IFF.reader.offset >= this.IFF.currentFormEnd ) {
 
- 			this.IFF.currentForm = this.IFF.parentForm;
 
- 		}
 
- 	}
 
- };
 
- export { LWO2Parser };
 
 
  |