(function(window,document,Laya){ var __un=Laya.un,__uns=Laya.uns,__static=Laya.static,__class=Laya.class,__getset=Laya.getset,__newvec=Laya.__newvec; var AnimationPlayer=laya.ani.AnimationPlayer,AnimationState=laya.ani.AnimationState,AnimationTemplet=laya.ani.AnimationTemplet; var Arith=laya.maths.Arith,Bitmap=laya.resource.Bitmap,Browser=laya.utils.Browser,Buffer=laya.webgl.utils.Buffer; var Buffer2D=laya.webgl.utils.Buffer2D,Byte=laya.utils.Byte,ClassUtils=laya.utils.ClassUtils,Config=Laya.Config; var EmitterBase=laya.particle.emitter.EmitterBase,Event=laya.events.Event,EventDispatcher=laya.events.EventDispatcher; var Handler=laya.utils.Handler,IndexBuffer2D=laya.webgl.utils.IndexBuffer2D,Loader=laya.net.Loader,LoaderManager=laya.net.LoaderManager; var MathUtil=laya.maths.MathUtil,Node=laya.display.Node,ParticleSetting=laya.particle.ParticleSetting,ParticleShader=laya.particle.shader.ParticleShader; var ParticleTemplateWebGL=laya.particle.ParticleTemplateWebGL,Rectangle=laya.maths.Rectangle,Render=laya.renders.Render; var RenderContext=laya.renders.RenderContext,RenderSprite=laya.renders.RenderSprite,RenderState2D=laya.webgl.utils.RenderState2D; var Resource=laya.resource.Resource,RunDriver=laya.utils.RunDriver,Shader=laya.webgl.shader.Shader,ShaderDefines=laya.webgl.shader.ShaderDefines; var Sprite=laya.display.Sprite,Stat=laya.utils.Stat,URL=laya.net.URL,ValusArray=laya.webgl.utils.ValusArray; var VertexBuffer2D=laya.webgl.utils.VertexBuffer2D,WebGL=laya.webgl.WebGL,WebGLContext=laya.webgl.WebGLContext; var WebGLContext2D=laya.webgl.canvas.WebGLContext2D,WebGLImage=laya.webgl.resource.WebGLImage; Laya.interface('laya.d3.core.IClone'); Laya.interface('laya.d3.graphics.IVertex'); Laya.interface('laya.d3.core.render.IUpdate'); Laya.interface('laya.d3.core.render.IRenderable'); /** *SplineCurvePositionVelocity 类用于通过顶点和速度创建闪光插值。 */ //class laya.d3.core.glitter.SplineCurvePositionVelocity var SplineCurvePositionVelocity=(function(){ function SplineCurvePositionVelocity(){ this._tempVector30=new Vector3(); this._tempVector31=new Vector3(); this._tempVector32=new Vector3(); this._a=new Vector3(); this._b=new Vector3(); this._c=new Vector3(); this._d=new Vector3(); } __class(SplineCurvePositionVelocity,'laya.d3.core.glitter.SplineCurvePositionVelocity'); var __proto=SplineCurvePositionVelocity.prototype; /** *初始化插值所需信息。 *@param position0 顶点0的位置。 *@param velocity0 顶点0的速度。 *@param position1 顶点1的位置。 *@param velocity1 顶点1的速度。 */ __proto.Init=function(position0,velocity0,position1,velocity1){ position0.cloneTo(this._d); velocity0.cloneTo(this._c); Vector3.scale(position0,2.0,this._a); Vector3.scale(position1,2.0,this._tempVector30); Vector3.subtract(this._a,this._tempVector30,this._a); Vector3.add(this._a,velocity0,this._a); Vector3.add(this._a,velocity1,this._a); Vector3.scale(position1,3.0,this._b); Vector3.scale(position0,3.0,this._tempVector30); Vector3.subtract(this._b,this._tempVector30,this._b); Vector3.subtract(this._b,velocity1,this._b); Vector3.scale(velocity0,2.0,this._tempVector30); Vector3.subtract(this._b,this._tempVector30,this._b); } /** *初始化插值所需信息。 *@param t 插值比例 *@param out 输出结果 */ __proto.Slerp=function(t,out){ Vector3.scale(this._a,t *t *t,this._tempVector30); Vector3.scale(this._b,t *t,this._tempVector31); Vector3.scale(this._c,t,this._tempVector32); Vector3.add(this._tempVector30,this._tempVector31,out); Vector3.add(out,this._tempVector32,out); Vector3.add(out,this._d,out); } return SplineCurvePositionVelocity; })() /** *HeightMap 类用于实现高度图数据。 */ //class laya.d3.core.HeightMap var HeightMap=(function(){ function HeightMap(width,height,minHeight,maxHeight){ this._datas=null; this._w=0; this._h=0; this._minHeight=NaN; this._maxHeight=NaN; this._datas=[]; this._w=width; this._h=height; this._minHeight=minHeight; this._maxHeight=maxHeight; } __class(HeightMap,'laya.d3.core.HeightMap'); var __proto=HeightMap.prototype; /**@private */ __proto._inBounds=function(row,col){ return row >=0 && row < this._h && col >=0 && col < this._w; } /** *获取高度。 *@param row 列数。 *@param col 行数。 *@return 高度。 */ __proto.getHeight=function(row,col){ if (this._inBounds(row,col)) return this._datas[row][col]; else return NaN; } /** *获取宽度。 *@return value 宽度。 */ __getset(0,__proto,'width',function(){ return this._w; }); /** *获取高度。 *@return value 高度。 */ __getset(0,__proto,'height',function(){ return this._h; }); /** *最大高度。 *@return value 最大高度。 */ __getset(0,__proto,'maxHeight',function(){ return this._maxHeight; }); /** *最大高度。 *@return value 最大高度。 */ __getset(0,__proto,'minHeight',function(){ return this._minHeight; }); HeightMap.creatFromMesh=function(mesh,width,height,outCellSize){ var vertices=[]; var indexs=[]; var submesheCount=mesh.getSubMeshCount(); for (var i=0;i < submesheCount;i++){ var subMesh=mesh.getSubMesh(i); var vertexBuffer=subMesh._getVertexBuffer(); var verts=vertexBuffer.getData(); var subMeshVertices=[]; for (var j=0;j < verts.length;j+=vertexBuffer.vertexDeclaration.vertexStride / 4){ var position=new Vector3(verts[j+0],verts[j+1],verts[j+2]); subMeshVertices.push(position); } vertices.push(subMeshVertices); var ib=subMesh._getIndexBuffer(); indexs.push(ib.getData()); }; var boundingBox=mesh.boundingBox; var minX=boundingBox.min.x; var minZ=boundingBox.min.z; var maxX=boundingBox.max.x; var maxZ=boundingBox.max.z; var minY=boundingBox.min.y; var maxY=boundingBox.max.y; var widthSize=maxX-minX; var heightSize=maxZ-minZ; var cellWidth=outCellSize.elements[0]=widthSize / (width-1); var cellHeight=outCellSize.elements[1]=heightSize / (height-1); var heightMap=new HeightMap(width,height,minY,maxY); var ray=HeightMap._tempRay; var rayDirE=ray.direction.elements; rayDirE[0]=0; rayDirE[1]=-1; rayDirE[2]=0; var heightOffset=0.1; var rayY=maxY+heightOffset; ray.origin.elements[1]=rayY; for (var w=0;w < width;w++){ var posZ=minZ+w *cellHeight; heightMap._datas[w]=[]; for (var h=0;h < height;h++){ var posX=minX+h *cellWidth; var rayOriE=ray.origin.elements; rayOriE[0]=posX; rayOriE[2]=posZ; var closestIntersection=HeightMap._getPosition(ray,vertices,indexs); heightMap._datas[w][h]=(closestIntersection===Number.MAX_VALUE)? NaN :rayY-closestIntersection; } } return heightMap; } HeightMap.createFromImage=function(texture,minHeight,maxHeight){ var textureWidth=texture.width; var textureHeight=texture.height; var heightMap=new HeightMap(textureWidth,textureHeight,minHeight,maxHeight); var compressionRatio=(maxHeight-minHeight)/ 254; Browser.canvas.size(textureWidth,textureHeight); Browser.context.drawImage(texture._image,0,0,textureWidth,textureHeight); var pixelsInfo=Browser.context.getImageData(0,0,textureWidth,textureHeight).data; var index=0; for (var w=0;w < textureWidth;w++){ var colDatas=heightMap._datas[w]=[]; for (var h=0;h < textureHeight;h++){ var r=pixelsInfo[index++]; var g=pixelsInfo[index++]; var b=pixelsInfo[index++]; var a=pixelsInfo[index++]; if (r==255 && g==255 && b==255 && a==255) colDatas[h]=NaN; else { colDatas[h]=(r+g+b)/ 3 *compressionRatio+minHeight; } } } return heightMap; } HeightMap._getPosition=function(ray,vertices,indexs){ var closestIntersection=Number.MAX_VALUE; for (var i=0;i < vertices.length;i++){ var subMeshVertices=vertices[i]; var subMeshIndexes=indexs[i]; for (var j=0;j < subMeshIndexes.length;j+=3){ var vertex1=subMeshVertices[subMeshIndexes[j+0]]; var vertex2=subMeshVertices[subMeshIndexes[j+1]]; var vertex3=subMeshVertices[subMeshIndexes[j+2]]; var intersection=Picker.rayIntersectsTriangle(ray,vertex1,vertex2,vertex3); if (!isNaN(intersection)&& intersection < closestIntersection){ closestIntersection=intersection; } } } return closestIntersection; } __static(HeightMap, ['_tempRay',function(){return this._tempRay=new Ray(new Vector3(),new Vector3());} ]); return HeightMap; })() /** *Layer 类用于实现遮罩层。 */ //class laya.d3.core.Layer var Layer=(function(){ function Layer(){ this._id=0; this._number=0; this._mask=0; this._active=true; this._visible=true; this.name=null; this._id=Layer._uniqueIDCounter; Layer._uniqueIDCounter++; if (this._id > 1+31) throw new Error("不允许创建Layer,请参考函数getLayerByNumber、getLayerByMask、getLayerByName!"); } __class(Layer,'laya.d3.core.Layer'); var __proto=Layer.prototype; /** *获取编号。 *@return 编号。 */ __getset(0,__proto,'number',function(){ return this._number; }); /** *设置是否显示。 *@param value 是否显示。 */ /** *获取是否显示。 *@return 是否显示。 */ __getset(0,__proto,'visible',function(){ return this._visible; },function(value){ if (this._number===29 || this._number==30) return; this._visible=value; if (value) Layer._visibleLayers=Layer._visibleLayers | this.mask; else Layer._visibleLayers=Layer._visibleLayers & ~this.mask; }); /** *获取蒙版值。 *@return 蒙版值。 */ __getset(0,__proto,'mask',function(){ return this._mask; }); /** *设置是否激活。 *@param value 是否激活。 */ /** *获取是否激活。 *@return 是否激活。 */ __getset(0,__proto,'active',function(){ return this._active; },function(value){ if (this._number===29 || this._number==30) return; this._active=value; if (value) Layer._activeLayers=Layer._activeLayers | this.mask; else Layer._activeLayers=Layer._activeLayers & ~this.mask; }); /** *设置Layer激活层。 *@param value 激活层。 */ /** *获取Layer激活层。 *@return 激活层。 */ __getset(1,Layer,'activeLayers',function(){ return Layer._activeLayers; },function(value){ Layer._activeLayers=value | Layer.getLayerByNumber(29).mask | Layer.getLayerByNumber(30).mask; for (var i=0;i < Layer._layerList.length;i++){ var layer=Layer._layerList[i]; layer._active=(layer._mask & Layer._activeLayers)!==0; } }); /** *设置Layer显示层。 *@param value 显示层。 */ /** *获取Layer显示层。 *@return 显示层。 */ __getset(1,Layer,'visibleLayers',function(){ return Layer._visibleLayers; },function(value){ Layer._visibleLayers=value | Layer.getLayerByNumber(29).mask | Layer.getLayerByNumber(30).mask; for (var i=0;i < Layer._layerList.length;i++){ var layer=Layer._layerList[i]; layer._visible=(layer._mask & Layer._visibleLayers)!==0; } }); Layer.__init__=function(){ Layer._layerList.length=31; for (var i=0;i < 31;i++){ var layer=new Layer(); Layer._layerList[i]=layer; if (i===0) layer.name="Default Layer"; else if (i===29) layer.name="Reserved Layer0"; else if (i===30) layer.name="Reserved Layer1"; else layer.name="Layer-"+i; layer._number=i; layer._mask=Math.pow(2,i); } Layer._activeLayers=2147483647; Layer._visibleLayers=2147483647; Layer._currentCameraCullingMask=2147483647; Layer.currentCreationLayer=Layer._layerList[0]; } Layer.getLayerByNumber=function(number){ if (number < 0 || number > 30) throw new Error("无法返回指定Layer,该number超出范围!"); return Layer._layerList[number]; } Layer.getLayerByMask=function(mask){ for (var i=0;i < 31;i++){ if (Layer._layerList[i].mask===mask) return Layer._layerList[i]; } throw new Error("无法返回指定Layer,该mask不存在"); } Layer.getLayerByName=function(name){ for (var i=0;i < 31;i++){ if (Layer._layerList[i].name===name) return Layer._layerList[i]; } throw new Error("无法返回指定Layer,该name不存在"); } Layer.isActive=function(mask){ return (mask & Layer._activeLayers)!=0; } Layer.isVisible=function(mask){ return (mask & Layer._currentCameraCullingMask & Layer._visibleLayers)!=0; } Layer._uniqueIDCounter=1; Layer._layerCount=31; Layer._layerList=[]; Layer._activeLayers=0; Layer._visibleLayers=0; Layer._currentCameraCullingMask=0; Layer.currentCreationLayer=null return Layer; })() /** *Burst 类用于粒子的爆裂描述。 */ //class laya.d3.core.particleShuriKen.module.Burst var Burst=(function(){ function Burst(time,minCount,maxCount){ this._time=NaN; this._minCount=0; this._maxCount=0; this._time=time; this._minCount=minCount; this._maxCount=maxCount; } __class(Burst,'laya.d3.core.particleShuriKen.module.Burst'); var __proto=Burst.prototype; /** *获取爆裂时间,单位为秒。 *@return 爆裂时间,单位为秒。 */ __getset(0,__proto,'time',function(){ return this._time; }); /** *获取爆裂的最小数量。 *@return 爆裂的最小数量。 */ __getset(0,__proto,'minCount',function(){ return this._minCount; }); /** *获取爆裂的最大数量。 *@return 爆裂的最大数量。 */ __getset(0,__proto,'maxCount',function(){ return this._maxCount; }); return Burst; })() /** *ColorOverLifetime 类用于粒子的生命周期颜色。 */ //class laya.d3.core.particleShuriKen.module.ColorOverLifetime var ColorOverLifetime=(function(){ function ColorOverLifetime(color){ this._color=null; this.enbale=false; this._color=color; } __class(ColorOverLifetime,'laya.d3.core.particleShuriKen.module.ColorOverLifetime'); var __proto=ColorOverLifetime.prototype; /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destColorOverLifetime=destObject; this._color.cloneTo(destColorOverLifetime._color); destColorOverLifetime.enbale=this.enbale; } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destColorOverLifetime=/*__JS__ */new this.constructor(); this.cloneTo(destColorOverLifetime); return destColorOverLifetime; } /** *获取颜色。 */ __getset(0,__proto,'color',function(){ return this._color; }); return ColorOverLifetime; })() /** *FrameOverTime 类用于创建时间帧。 */ //class laya.d3.core.particleShuriKen.module.FrameOverTime var FrameOverTime=(function(){ function FrameOverTime(){ this._type=0; this._constant=0; this._overTime=null; this._constantMin=0; this._constantMax=0; this._overTimeMin=null; this._overTimeMax=null; } __class(FrameOverTime,'laya.d3.core.particleShuriKen.module.FrameOverTime'); var __proto=FrameOverTime.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destFrameOverTime=destObject; destFrameOverTime._type=this._type; destFrameOverTime._constant=this._constant; this._overTime.cloneTo(destFrameOverTime._overTime); destFrameOverTime._constantMin=this._constantMin; destFrameOverTime._constantMax=this._constantMax; this._overTimeMin.cloneTo(destFrameOverTime._overTimeMin); this._overTimeMax.cloneTo(destFrameOverTime._overTimeMax); } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destFrameOverTime=/*__JS__ */new this.constructor(); this.cloneTo(destFrameOverTime); return destFrameOverTime; } /** *时间帧。 */ __getset(0,__proto,'frameOverTimeData',function(){ return this._overTime; }); /** *固定帧。 */ __getset(0,__proto,'constant',function(){ return this._constant; }); /** *生命周期旋转类型,0常量模式,1曲线模式,2随机双常量模式,3随机双曲线模式。 */ __getset(0,__proto,'type',function(){ return this._type; }); /** *最小时间帧。 */ __getset(0,__proto,'frameOverTimeDataMin',function(){ return this._overTimeMin; }); /** *最小固定帧。 */ __getset(0,__proto,'constantMin',function(){ return this._constantMin; }); /** *最大时间帧。 */ __getset(0,__proto,'frameOverTimeDataMax',function(){ return this._overTimeMax; }); /** *最大固定帧。 */ __getset(0,__proto,'constantMax',function(){ return this._constantMax; }); FrameOverTime.createByConstant=function(constant){ var rotationOverLifetime=new FrameOverTime(); rotationOverLifetime._type=0; rotationOverLifetime._constant=constant; return rotationOverLifetime; } FrameOverTime.createByOverTime=function(overTime){ var rotationOverLifetime=new FrameOverTime(); rotationOverLifetime._type=1; rotationOverLifetime._overTime=overTime; return rotationOverLifetime; } FrameOverTime.createByRandomTwoConstant=function(constantMin,constantMax){ var rotationOverLifetime=new FrameOverTime(); rotationOverLifetime._type=2; rotationOverLifetime._constantMin=constantMin; rotationOverLifetime._constantMax=constantMax; return rotationOverLifetime; } FrameOverTime.createByRandomTwoOverTime=function(gradientFrameMin,gradientFrameMax){ var rotationOverLifetime=new FrameOverTime(); rotationOverLifetime._type=3; rotationOverLifetime._overTimeMin=gradientFrameMin; rotationOverLifetime._overTimeMax=gradientFrameMax; return rotationOverLifetime; } return FrameOverTime; })() /** *GradientRotation 类用于创建渐变角速度。 */ //class laya.d3.core.particleShuriKen.module.GradientAngularVelocity var GradientAngularVelocity=(function(){ function GradientAngularVelocity(){ this._type=0; this._separateAxes=false; this._constant=NaN; this._constantSeparate=null; this._gradient=null; this._gradientX=null; this._gradientY=null; this._gradientZ=null; this._constantMin=NaN; this._constantMax=NaN; this._constantMinSeparate=null; this._constantMaxSeparate=null; this._gradientMin=null; this._gradientMax=null; this._gradientXMin=null; this._gradientXMax=null; this._gradientYMin=null; this._gradientYMax=null; this._gradientZMin=null; this._gradientZMax=null; } __class(GradientAngularVelocity,'laya.d3.core.particleShuriKen.module.GradientAngularVelocity'); var __proto=GradientAngularVelocity.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destGradientAngularVelocity=destObject; destGradientAngularVelocity._type=this._type; destGradientAngularVelocity._separateAxes=this._separateAxes; destGradientAngularVelocity._constant=this._constant; this._constantSeparate.cloneTo(destGradientAngularVelocity._constantSeparate); this._gradient.cloneTo(destGradientAngularVelocity._gradient); this._gradientX.cloneTo(destGradientAngularVelocity._gradientX); this._gradientY.cloneTo(destGradientAngularVelocity._gradientY); this._gradientZ.cloneTo(destGradientAngularVelocity._gradientZ); destGradientAngularVelocity._constantMin=this._constantMin; destGradientAngularVelocity._constantMax=this._constantMax; this._constantMinSeparate.cloneTo(destGradientAngularVelocity._constantMinSeparate); this._constantMaxSeparate.cloneTo(destGradientAngularVelocity._constantMaxSeparate); this._gradientMin.cloneTo(destGradientAngularVelocity._gradientMin); this._gradientMax.cloneTo(destGradientAngularVelocity._gradientMax); this._gradientXMin.cloneTo(destGradientAngularVelocity._gradientXMin); this._gradientXMax.cloneTo(destGradientAngularVelocity._gradientXMax); this._gradientYMin.cloneTo(destGradientAngularVelocity._gradientYMin); this._gradientYMax.cloneTo(destGradientAngularVelocity._gradientYMax); this._gradientZMin.cloneTo(destGradientAngularVelocity._gradientZMin); this._gradientZMax.cloneTo(destGradientAngularVelocity._gradientZMax); } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destGradientAngularVelocity=/*__JS__ */new this.constructor(); this.cloneTo(destGradientAngularVelocity); return destGradientAngularVelocity; } /** *渐变角速度Z。 */ __getset(0,__proto,'gradientZ',function(){ return this._gradientZ; }); /** *固定角速度。 */ __getset(0,__proto,'constant',function(){ return this._constant; }); /** *渐变角速度。 */ __getset(0,__proto,'gradient',function(){ return this._gradient; }); /** *是否分轴。 */ __getset(0,__proto,'separateAxes',function(){ return this._separateAxes; }); /** *生命周期角速度类型,0常量模式,1曲线模式,2随机双常量模式,3随机双曲线模式。 */ __getset(0,__proto,'type',function(){ return this._type; }); /** *分轴固定角速度。 */ __getset(0,__proto,'constantSeparate',function(){ return this._constantSeparate; }); /** *最小渐变角速度。 */ __getset(0,__proto,'gradientMin',function(){ return this._gradientMin; }); /** *最小随机双固定角速度。 */ __getset(0,__proto,'constantMin',function(){ return this._constantMin; }); /** *渐变角角速度X。 */ __getset(0,__proto,'gradientX',function(){ return this._gradientX; }); /** *渐变角速度Y。 */ __getset(0,__proto,'gradientY',function(){ return this._gradientY; }); /** *最大渐变角速度。 */ __getset(0,__proto,'gradientMax',function(){ return this._gradientMax; }); /** *最大随机双固定角速度。 */ __getset(0,__proto,'constantMax',function(){ return this._constantMax; }); /** *最小分轴随机双固定角速度。 */ __getset(0,__proto,'constantMinSeparate',function(){ return this._constantMinSeparate; }); /** *最大分轴随机双固定角速度。 */ __getset(0,__proto,'constantMaxSeparate',function(){ return this._constantMaxSeparate; }); /** *最小渐变角速度X。 */ __getset(0,__proto,'gradientXMin',function(){ return this._gradientXMin; }); /** *最大渐变角速度X。 */ __getset(0,__proto,'gradientXMax',function(){ return this._gradientXMax; }); /** *最小渐变角速度Y。 */ __getset(0,__proto,'gradientYMin',function(){ return this._gradientYMin; }); /** *最大渐变角速度Y。 */ __getset(0,__proto,'gradientYMax',function(){ return this._gradientYMax; }); /** *最小渐变角速度Z。 */ __getset(0,__proto,'gradientZMin',function(){ return this._gradientZMin; }); /** *最大渐变角速度Z。 */ __getset(0,__proto,'gradientZMax',function(){ return this._gradientZMax; }); GradientAngularVelocity.createByConstant=function(constant){ var gradientAngularVelocity=new GradientAngularVelocity(); gradientAngularVelocity._type=0; gradientAngularVelocity._separateAxes=false; gradientAngularVelocity._constant=constant; return gradientAngularVelocity; } GradientAngularVelocity.createByConstantSeparate=function(separateConstant){ var gradientAngularVelocity=new GradientAngularVelocity(); gradientAngularVelocity._type=0; gradientAngularVelocity._separateAxes=true; gradientAngularVelocity._constantSeparate=separateConstant; return gradientAngularVelocity; } GradientAngularVelocity.createByGradient=function(gradient){ var gradientAngularVelocity=new GradientAngularVelocity(); gradientAngularVelocity._type=1; gradientAngularVelocity._separateAxes=false; gradientAngularVelocity._gradient=gradient; return gradientAngularVelocity; } GradientAngularVelocity.createByGradientSeparate=function(gradientX,gradientY,gradientZ){ var gradientAngularVelocity=new GradientAngularVelocity(); gradientAngularVelocity._type=1; gradientAngularVelocity._separateAxes=true; gradientAngularVelocity._gradientX=gradientX; gradientAngularVelocity._gradientY=gradientY; gradientAngularVelocity._gradientZ=gradientZ; return gradientAngularVelocity; } GradientAngularVelocity.createByRandomTwoConstant=function(constantMin,constantMax){ var gradientAngularVelocity=new GradientAngularVelocity(); gradientAngularVelocity._type=2; gradientAngularVelocity._separateAxes=false; gradientAngularVelocity._constantMin=constantMin; gradientAngularVelocity._constantMax=constantMax; return gradientAngularVelocity; } GradientAngularVelocity.createByRandomTwoConstantSeparate=function(separateConstantMin,separateConstantMax){ var gradientAngularVelocity=new GradientAngularVelocity(); gradientAngularVelocity._type=2; gradientAngularVelocity._separateAxes=true; gradientAngularVelocity._constantMinSeparate=separateConstantMin; gradientAngularVelocity._constantMaxSeparate=separateConstantMax; return gradientAngularVelocity; } GradientAngularVelocity.createByRandomTwoGradient=function(gradientMin,gradientMax){ var gradientAngularVelocity=new GradientAngularVelocity(); gradientAngularVelocity._type=3; gradientAngularVelocity._separateAxes=false; gradientAngularVelocity._gradientMin=gradientMin; gradientAngularVelocity._gradientMax=gradientMax; return gradientAngularVelocity; } GradientAngularVelocity.createByRandomTwoGradientSeparate=function(gradientXMin,gradientXMax,gradientYMin,gradientYMax,gradientZMin,gradientZMax){ var gradientAngularVelocity=new GradientAngularVelocity(); gradientAngularVelocity._type=3; gradientAngularVelocity._separateAxes=true; gradientAngularVelocity._gradientXMin=gradientXMin; gradientAngularVelocity._gradientXMax=gradientXMax; gradientAngularVelocity._gradientYMin=gradientYMin; gradientAngularVelocity._gradientYMax=gradientYMax; gradientAngularVelocity._gradientZMin=gradientZMin; gradientAngularVelocity._gradientZMax=gradientZMax; return gradientAngularVelocity; } return GradientAngularVelocity; })() /** *GradientColor 类用于创建渐变颜色。 */ //class laya.d3.core.particleShuriKen.module.GradientColor var GradientColor=(function(){ function GradientColor(){ this._type=0; this._constant=null; this._constantMin=null; this._constantMax=null; this._gradient=null; this._gradientMin=null; this._gradientMax=null; } __class(GradientColor,'laya.d3.core.particleShuriKen.module.GradientColor'); var __proto=GradientColor.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destGradientColor=destObject; destGradientColor._type=this._type; this._constant.cloneTo(destGradientColor._constant); this._constantMin.cloneTo(destGradientColor._constantMin); this._constantMax.cloneTo(destGradientColor._constantMax); this._gradient.cloneTo(destGradientColor._gradient); this._gradientMin.cloneTo(destGradientColor._gradientMin); this._gradientMax.cloneTo(destGradientColor._gradientMax); } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destGradientColor=/*__JS__ */new this.constructor(); this.cloneTo(destGradientColor); return destGradientColor; } /** *渐变颜色。 */ __getset(0,__proto,'gradient',function(){ return this._gradient; }); /** *固定颜色。 */ __getset(0,__proto,'constant',function(){ return this._constant; }); /** *生命周期颜色类型,0为固定颜色模式,1渐变模式,2为随机双固定颜色模式,3随机双渐变模式。 */ __getset(0,__proto,'type',function(){ return this._type; }); /** *最小渐变颜色。 */ __getset(0,__proto,'gradientMin',function(){ return this._gradientMin; }); /** *最小固定颜色。 */ __getset(0,__proto,'constantMin',function(){ return this._constantMin; }); /** *最大渐变颜色。 */ __getset(0,__proto,'gradientMax',function(){ return this._gradientMax; }); /** *最大固定颜色。 */ __getset(0,__proto,'constantMax',function(){ return this._constantMax; }); GradientColor.createByConstant=function(constant){ var gradientColor=new GradientColor(); gradientColor._type=0; gradientColor._constant=constant; return gradientColor; } GradientColor.createByGradient=function(gradient){ var gradientColor=new GradientColor(); gradientColor._type=1; gradientColor._gradient=gradient; return gradientColor; } GradientColor.createByRandomTwoConstant=function(minConstant,maxConstant){ var gradientColor=new GradientColor(); gradientColor._type=2; gradientColor._constantMin=minConstant; gradientColor._constantMax=maxConstant; return gradientColor; } GradientColor.createByRandomTwoGradient=function(minGradient,maxGradient){ var gradientColor=new GradientColor(); gradientColor._type=3; gradientColor._gradientMin=minGradient; gradientColor._gradientMax=maxGradient; return gradientColor; } return GradientColor; })() /** *GradientDataColor 类用于创建颜色渐变。 */ //class laya.d3.core.particleShuriKen.module.GradientDataColor var GradientDataColor=(function(){ function GradientDataColor(){ this._alphaCurrentLength=0; this._rgbCurrentLength=0; this._alphaElements=null; this._rgbElements=null; this._alphaElements=new Float32Array(8); this._rgbElements=new Float32Array(16); } __class(GradientDataColor,'laya.d3.core.particleShuriKen.module.GradientDataColor'); var __proto=GradientDataColor.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *增加Alpha渐变。 *@param key 生命周期,范围为0到1。 *@param value rgb值。 */ __proto.addAlpha=function(key,value){ if (this._alphaCurrentLength < 8){ this._alphaElements[this._alphaCurrentLength++]=key; this._alphaElements[this._alphaCurrentLength++]=value; }else { throw new Error("GradientDataColor:Alpha count must less than 4."); } } /** *增加RGB渐变。 *@param key 生命周期,范围为0到1。 *@param value RGB值。 */ __proto.addRGB=function(key,value){ if (this._rgbCurrentLength < 16){ this._rgbElements[this._rgbCurrentLength++]=key; this._rgbElements[this._rgbCurrentLength++]=value.x; this._rgbElements[this._rgbCurrentLength++]=value.y; this._rgbElements[this._rgbCurrentLength++]=value.z; }else { throw new Error("GradientDataColor:RGB count must less than 4."); } } /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destGradientDataColor=destObject; var i=0,n=0; destGradientDataColor._alphaCurrentLength=this._alphaCurrentLength; var destAlphaElements=destGradientDataColor._alphaElements; destAlphaElements.length=this._alphaElements.length; for (i=0,n=this._alphaElements.length;i < n;i++) destAlphaElements[i]=this._alphaElements[i]; destGradientDataColor._rgbCurrentLength=this._rgbCurrentLength; var destRGBElements=destGradientDataColor._rgbElements; destRGBElements.length=this._rgbElements.length; for (i=0,n=this._rgbElements.length;i < n;i++) destRGBElements[i]=this._rgbElements[i]; } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destGradientDataColor=/*__JS__ */new this.constructor(); this.cloneTo(destGradientDataColor); return destGradientDataColor; } /**渐变Alpha数量。*/ __getset(0,__proto,'alphaGradientCount',function(){ return this._alphaCurrentLength / 2; }); /**渐变RGB数量。*/ __getset(0,__proto,'rgbGradientCount',function(){ return this._rgbCurrentLength / 4; }); return GradientDataColor; })() /** *GradientDataInt 类用于创建整形渐变。 */ //class laya.d3.core.particleShuriKen.module.GradientDataInt var GradientDataInt=(function(){ function GradientDataInt(){ this._currentLength=0; this._elements=null; this._elements=new Float32Array(8); } __class(GradientDataInt,'laya.d3.core.particleShuriKen.module.GradientDataInt'); var __proto=GradientDataInt.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *增加整形渐变。 *@param key 生命周期,范围为0到1。 *@param value 整形值。 */ __proto.add=function(key,value){ if (this._currentLength < 8){ this._elements[this._currentLength++]=key; this._elements[this._currentLength++]=value; }else { throw new Error("GradientDataInt: Count must less than 4."); } } /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destGradientDataInt=destObject; destGradientDataInt._currentLength=this._currentLength; var destElements=destGradientDataInt._elements; destElements.length=this._elements.length; for (var i=0,n=this._elements.length;i < n;i++){ destElements[i]=this._elements[i]; } } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destGradientDataInt=/*__JS__ */new this.constructor(); this.cloneTo(destGradientDataInt); return destGradientDataInt; } /**整形渐变数量。*/ __getset(0,__proto,'gradientCount',function(){ return this._currentLength / 2; }); return GradientDataInt; })() /** *GradientDataNumber 类用于创建浮点渐变。 */ //class laya.d3.core.particleShuriKen.module.GradientDataNumber var GradientDataNumber=(function(){ function GradientDataNumber(){ this._currentLength=0; this._elements=null; this._elements=new Float32Array(8); } __class(GradientDataNumber,'laya.d3.core.particleShuriKen.module.GradientDataNumber'); var __proto=GradientDataNumber.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *增加浮点渐变。 *@param key 生命周期,范围为0到1。 *@param value 浮点值。 */ __proto.add=function(key,value){ if (this._currentLength < 8){ this._elements[this._currentLength++]=key; this._elements[this._currentLength++]=value; }else { throw new Error("GradientDataNumber: Count must less than 4."); } } /** *通过索引获取键。 *@param index 索引。 *@return value 键。 */ __proto.getKeyByIndex=function(index){ return this._elements[index *2]; } /** *通过索引获取值。 *@param index 索引。 *@return value 值。 */ __proto.getValueByIndex=function(index){ return this._elements[index *2+1]; } /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destGradientDataNumber=destObject; destGradientDataNumber._currentLength=this._currentLength; var destElements=destGradientDataNumber._elements; destElements.length=this._elements.length; for (var i=0,n=this._elements.length;i < n;i++) destElements[i]=this._elements[i]; } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destGradientDataNumber=/*__JS__ */new this.constructor(); this.cloneTo(destGradientDataNumber); return destGradientDataNumber; } /**渐变浮点数量。*/ __getset(0,__proto,'gradientCount',function(){ return this._currentLength / 2; }); return GradientDataNumber; })() /** *GradientDataVector2 类用于创建二维向量渐变。 */ //class laya.d3.core.particleShuriKen.module.GradientDataVector2 var GradientDataVector2=(function(){ function GradientDataVector2(){ this._currentLength=0; this._elements=null; this._elements=new Float32Array(12); } __class(GradientDataVector2,'laya.d3.core.particleShuriKen.module.GradientDataVector2'); var __proto=GradientDataVector2.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *增加二维向量渐变。 *@param key 生命周期,范围为0到1。 *@param value 二维向量值。 */ __proto.add=function(key,value){ if (this._currentLength < 8){ this._elements[this._currentLength++]=key; this._elements[this._currentLength++]=value.x; this._elements[this._currentLength++]=value.y; }else { throw new Error("GradientDataVector2: Count must less than 4."); } } /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destGradientDataVector2=destObject; destGradientDataVector2._currentLength=this._currentLength; var destElements=destGradientDataVector2._elements; destElements.length=this._elements.length; for (var i=0,n=this._elements.length;i < n;i++){ destElements[i]=this._elements[i]; } } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destGradientDataVector2=/*__JS__ */new this.constructor(); this.cloneTo(destGradientDataVector2); return destGradientDataVector2; } /**二维向量渐变数量。*/ __getset(0,__proto,'gradientCount',function(){ return this._currentLength / 3; }); return GradientDataVector2; })() /** *GradientSize 类用于创建渐变尺寸。 */ //class laya.d3.core.particleShuriKen.module.GradientSize var GradientSize=(function(){ function GradientSize(){ this._type=0; this._separateAxes=false; this._gradient=null; this._gradientX=null; this._gradientY=null; this._gradientZ=null; this._constantMin=NaN; this._constantMax=NaN; this._constantMinSeparate=null; this._constantMaxSeparate=null; this._gradientMin=null; this._gradientMax=null; this._gradientXMin=null; this._gradientXMax=null; this._gradientYMin=null; this._gradientYMax=null; this._gradientZMin=null; this._gradientZMax=null; } __class(GradientSize,'laya.d3.core.particleShuriKen.module.GradientSize'); var __proto=GradientSize.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destGradientSize=destObject; destGradientSize._type=this._type; destGradientSize._separateAxes=this._separateAxes; this._gradient.cloneTo(destGradientSize._gradient); this._gradientX.cloneTo(destGradientSize._gradientX); this._gradientY.cloneTo(destGradientSize._gradientY); this._gradientZ.cloneTo(destGradientSize._gradientZ); destGradientSize._constantMin=this._constantMin; destGradientSize._constantMax=this._constantMax; this._constantMinSeparate.cloneTo(destGradientSize._constantMinSeparate); this._constantMaxSeparate.cloneTo(destGradientSize._constantMaxSeparate); this._gradientMin.cloneTo(destGradientSize._gradientMin); this._gradientMax.cloneTo(destGradientSize._gradientMax); this._gradientXMin.cloneTo(destGradientSize._gradientXMin); this._gradientXMax.cloneTo(destGradientSize._gradientXMax); this._gradientYMin.cloneTo(destGradientSize._gradientYMin); this._gradientYMax.cloneTo(destGradientSize._gradientYMax); this._gradientZMin.cloneTo(destGradientSize._gradientZMin); this._gradientZMax.cloneTo(destGradientSize._gradientZMax); } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destGradientSize=/*__JS__ */new this.constructor(); this.cloneTo(destGradientSize); return destGradientSize; } /** *是否分轴。 */ __getset(0,__proto,'separateAxes',function(){ return this._separateAxes; }); /** *生命周期尺寸类型,0曲线模式,1随机双常量模式,2随机双曲线模式。 */ __getset(0,__proto,'type',function(){ return this._type; }); /** *渐变尺寸X。 */ __getset(0,__proto,'gradientSizeX',function(){ return this._gradientX; }); /** *渐变尺寸。 */ __getset(0,__proto,'gradientSize',function(){ return this._gradient; }); /** *渐变最小尺寸。 */ __getset(0,__proto,'gradientMin',function(){ return this._gradientMin; }); /** *最小随机双固定尺寸。 */ __getset(0,__proto,'constantMin',function(){ return this._constantMin; }); /** *渐变最小尺寸Z。 */ __getset(0,__proto,'gradientZMin',function(){ return this._gradientZMin; }); /** *渐变尺寸Y。 */ __getset(0,__proto,'gradientSizeY',function(){ return this._gradientY; }); /** *最小分轴随机双固定尺寸。 */ __getset(0,__proto,'constantMinSeparate',function(){ return this._constantMinSeparate; }); /** *渐变尺寸Z。 */ __getset(0,__proto,'gradientSizeZ',function(){ return this._gradientZ; }); /** *渐变最大尺寸。 */ __getset(0,__proto,'gradientMax',function(){ return this._gradientMax; }); /** *最大随机双固定尺寸。 */ __getset(0,__proto,'constantMax',function(){ return this._constantMax; }); /** *最小分轴随机双固定尺寸。 */ __getset(0,__proto,'constantMaxSeparate',function(){ return this._constantMaxSeparate; }); /** *渐变最小尺寸X。 */ __getset(0,__proto,'gradientXMin',function(){ return this._gradientXMin; }); /** *渐变最大尺寸X。 */ __getset(0,__proto,'gradientXMax',function(){ return this._gradientXMax; }); /** *渐变最小尺寸Y。 */ __getset(0,__proto,'gradientYMin',function(){ return this._gradientYMin; }); /** *渐变最大尺寸Y。 */ __getset(0,__proto,'gradientYMax',function(){ return this._gradientYMax; }); /** *渐变最大尺寸Z。 */ __getset(0,__proto,'gradientZMax',function(){ return this._gradientZMax; }); GradientSize.createByGradient=function(gradient){ var gradientSize=new GradientSize(); gradientSize._type=0; gradientSize._separateAxes=false; gradientSize._gradient=gradient; return gradientSize; } GradientSize.createByGradientSeparate=function(gradientX,gradientY,gradientZ){ var gradientSize=new GradientSize(); gradientSize._type=0; gradientSize._separateAxes=true; gradientSize._gradientX=gradientX; gradientSize._gradientY=gradientY; gradientSize._gradientZ=gradientZ; return gradientSize; } GradientSize.createByRandomTwoConstant=function(constantMin,constantMax){ var gradientSize=new GradientSize(); gradientSize._type=1; gradientSize._separateAxes=false; gradientSize._constantMin=constantMin; gradientSize._constantMax=constantMax; return gradientSize; } GradientSize.createByRandomTwoConstantSeparate=function(constantMinSeparate,constantMaxSeparate){ var gradientSize=new GradientSize(); gradientSize._type=1; gradientSize._separateAxes=true; gradientSize._constantMinSeparate=constantMinSeparate; gradientSize._constantMaxSeparate=constantMaxSeparate; return gradientSize; } GradientSize.createByRandomTwoGradient=function(gradientMin,gradientMax){ var gradientSize=new GradientSize(); gradientSize._type=2; gradientSize._separateAxes=false; gradientSize._gradientMin=gradientMin; gradientSize._gradientMax=gradientMax; return gradientSize; } GradientSize.createByRandomTwoGradientSeparate=function(gradientXMin,gradientXMax,gradientYMin,gradientYMax,gradientZMin,gradientZMax){ var gradientSize=new GradientSize(); gradientSize._type=2; gradientSize._separateAxes=true; gradientSize._gradientXMin=gradientXMin; gradientSize._gradientXMax=gradientXMax; gradientSize._gradientYMin=gradientYMin; gradientSize._gradientYMax=gradientYMax; gradientSize._gradientZMin=gradientZMin; gradientSize._gradientZMax=gradientZMax; return gradientSize; } return GradientSize; })() /** *GradientVelocity 类用于创建渐变速度。 */ //class laya.d3.core.particleShuriKen.module.GradientVelocity var GradientVelocity=(function(){ function GradientVelocity(){ this._type=0; this._constant=null; this._gradientX=null; this._gradientY=null; this._gradientZ=null; this._constantMin=null; this._constantMax=null; this._gradientXMin=null; this._gradientXMax=null; this._gradientYMin=null; this._gradientYMax=null; this._gradientZMin=null; this._gradientZMax=null; } __class(GradientVelocity,'laya.d3.core.particleShuriKen.module.GradientVelocity'); var __proto=GradientVelocity.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destGradientVelocity=destObject; destGradientVelocity._type=this._type; this._constant.cloneTo(destGradientVelocity._constant); this._gradientX.cloneTo(destGradientVelocity._gradientX); this._gradientY.cloneTo(destGradientVelocity._gradientY); this._gradientZ.cloneTo(destGradientVelocity._gradientZ); this._constantMin.cloneTo(destGradientVelocity._constantMin); this._constantMax.cloneTo(destGradientVelocity._constantMax); this._gradientXMin.cloneTo(destGradientVelocity._gradientXMin); this._gradientXMax.cloneTo(destGradientVelocity._gradientXMax); this._gradientYMin.cloneTo(destGradientVelocity._gradientYMin); this._gradientYMax.cloneTo(destGradientVelocity._gradientYMax); this._gradientZMin.cloneTo(destGradientVelocity._gradientZMin); this._gradientZMax.cloneTo(destGradientVelocity._gradientZMax); } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destGradientVelocity=/*__JS__ */new this.constructor(); this.cloneTo(destGradientVelocity); return destGradientVelocity; } /** *渐变速度Z。 */ __getset(0,__proto,'gradientZ',function(){ return this._gradientZ; }); /**固定速度。*/ __getset(0,__proto,'constant',function(){ return this._constant; }); /** *生命周期速度类型,0常量模式,1曲线模式,2随机双常量模式,3随机双曲线模式。 */ __getset(0,__proto,'type',function(){ return this._type; }); /** *渐变最大速度X。 */ __getset(0,__proto,'gradientXMax',function(){ return this._gradientXMax; }); /**最小固定速度。*/ __getset(0,__proto,'constantMin',function(){ return this._constantMin; }); /** *渐变速度X。 */ __getset(0,__proto,'gradientX',function(){ return this._gradientX; }); /** *渐变速度Y。 */ __getset(0,__proto,'gradientY',function(){ return this._gradientY; }); /** *渐变最小速度X。 */ __getset(0,__proto,'gradientXMin',function(){ return this._gradientXMin; }); /**最大固定速度。*/ __getset(0,__proto,'constantMax',function(){ return this._constantMax; }); /** *渐变最小速度Y。 */ __getset(0,__proto,'gradientYMin',function(){ return this._gradientYMin; }); /** *渐变最大速度Y。 */ __getset(0,__proto,'gradientYMax',function(){ return this._gradientYMax; }); /** *渐变最小速度Z。 */ __getset(0,__proto,'gradientZMin',function(){ return this._gradientZMin; }); /** *渐变最大速度Z。 */ __getset(0,__proto,'gradientZMax',function(){ return this._gradientZMax; }); GradientVelocity.createByConstant=function(constant){ var gradientVelocity=new GradientVelocity(); gradientVelocity._type=0; gradientVelocity._constant=constant; return gradientVelocity; } GradientVelocity.createByGradient=function(gradientX,gradientY,gradientZ){ var gradientVelocity=new GradientVelocity(); gradientVelocity._type=1; gradientVelocity._gradientX=gradientX; gradientVelocity._gradientY=gradientY; gradientVelocity._gradientZ=gradientZ; return gradientVelocity; } GradientVelocity.createByRandomTwoConstant=function(constantMin,constantMax){ var gradientVelocity=new GradientVelocity(); gradientVelocity._type=2; gradientVelocity._constantMin=constantMin; gradientVelocity._constantMax=constantMax; return gradientVelocity; } GradientVelocity.createByRandomTwoGradient=function(gradientXMin,gradientXMax,gradientYMin,gradientYMax,gradientZMin,gradientZMax){ var gradientVelocity=new GradientVelocity(); gradientVelocity._type=3; gradientVelocity._gradientXMin=gradientXMin; gradientVelocity._gradientXMax=gradientXMax; gradientVelocity._gradientYMin=gradientYMin; gradientVelocity._gradientYMax=gradientYMax; gradientVelocity._gradientZMin=gradientZMin; gradientVelocity._gradientZMax=gradientZMax; return gradientVelocity; } return GradientVelocity; })() /** *RotationOverLifetime 类用于粒子的生命周期旋转。 */ //class laya.d3.core.particleShuriKen.module.RotationOverLifetime var RotationOverLifetime=(function(){ function RotationOverLifetime(angularVelocity){ this._angularVelocity=null; this.enbale=false; this._angularVelocity=angularVelocity; } __class(RotationOverLifetime,'laya.d3.core.particleShuriKen.module.RotationOverLifetime'); var __proto=RotationOverLifetime.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destRotationOverLifetime=destObject; this._angularVelocity.cloneTo(destRotationOverLifetime._angularVelocity); destRotationOverLifetime.enbale=this.enbale; } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destRotationOverLifetime=/*__JS__ */new this.constructor(); this.cloneTo(destRotationOverLifetime); return destRotationOverLifetime; } /** *获取角速度。 */ __getset(0,__proto,'angularVelocity',function(){ return this._angularVelocity; }); return RotationOverLifetime; })() /** *BaseShape 类用于粒子形状。 */ //class laya.d3.core.particleShuriKen.module.shape.BaseShape var BaseShape=(function(){ function BaseShape(){ this.enbale=false; } __class(BaseShape,'laya.d3.core.particleShuriKen.module.shape.BaseShape'); var __proto=BaseShape.prototype; /** *用于生成粒子初始位置和方向。 *@param position 粒子位置。 *@param direction 粒子方向。 */ __proto.generatePositionAndDirection=function(position,direction){ throw new Error("BaseShape: must override it."); } return BaseShape; })() /** *... *@author ... */ //class laya.d3.core.particleShuriKen.module.shape.ShapeUtils var ShapeUtils=(function(){ function ShapeUtils(){} __class(ShapeUtils,'laya.d3.core.particleShuriKen.module.shape.ShapeUtils'); ShapeUtils._randomPointUnitArcCircle=function(arc,out){ var outE=out.elements; var angle=Math.random()*arc; outE[0]=Math.cos(angle); outE[1]=Math.sin(angle); } ShapeUtils._randomPointInsideUnitArcCircle=function(arc,out){ var outE=out.elements; ShapeUtils._randomPointUnitArcCircle(arc,out); var range=Math.pow(Math.random(),1.0 / 2.0); outE[0]=outE[0] *range; outE[1]=outE[1] *range; } ShapeUtils._randomPointUnitCircle=function(out){ var outE=out.elements; var angle=Math.random()*Math.PI *2; outE[0]=Math.cos(angle); outE[1]=Math.sin(angle); } ShapeUtils._randomPointInsideUnitCircle=function(out){ var outE=out.elements; ShapeUtils._randomPointUnitCircle(out); var range=Math.pow(Math.random(),1.0 / 2.0); outE[0]=outE[0] *range; outE[1]=outE[1] *range; } ShapeUtils._randomPointUnitSphere=function(out){ var outE=out.elements; var z=outE[2]=Math.random()*2-1.0; var a=Math.random()*Math.PI *2; var r=Math.sqrt(1.0-z *z); outE[0]=r *Math.cos(a); outE[1]=r *Math.sin(a); } ShapeUtils._randomPointInsideUnitSphere=function(out){ var outE=out.elements; ShapeUtils._randomPointUnitSphere(out); var range=Math.pow(Math.random(),1.0 / 3.0); outE[0]=outE[0] *range; outE[1]=outE[1] *range; outE[2]=outE[2] *range; } ShapeUtils._randomPointInsideHalfUnitBox=function(out){ var outE=out.elements; outE[0]=(Math.random()-0.5); outE[1]=(Math.random()-0.5); outE[2]=(Math.random()-0.5); } return ShapeUtils; })() /** *SizeOverLifetime 类用于粒子的生命周期尺寸。 */ //class laya.d3.core.particleShuriKen.module.SizeOverLifetime var SizeOverLifetime=(function(){ function SizeOverLifetime(size){ this._size=null; this.enbale=false; this._size=size; } __class(SizeOverLifetime,'laya.d3.core.particleShuriKen.module.SizeOverLifetime'); var __proto=SizeOverLifetime.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destSizeOverLifetime=destObject; this._size.cloneTo(destSizeOverLifetime._size); destSizeOverLifetime.enbale=this.enbale; } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destSizeOverLifetime=/*__JS__ */new this.constructor(); this.cloneTo(destSizeOverLifetime); return destSizeOverLifetime; } /** *获取尺寸。 */ __getset(0,__proto,'size',function(){ return this._size; }); return SizeOverLifetime; })() /** *StartFrame 类用于创建开始帧。 */ //class laya.d3.core.particleShuriKen.module.StartFrame var StartFrame=(function(){ function StartFrame(){ this._type=0; this._constant=NaN; this._constantMin=NaN; this._constantMax=NaN; } __class(StartFrame,'laya.d3.core.particleShuriKen.module.StartFrame'); var __proto=StartFrame.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destStartFrame=destObject; destStartFrame._type=this._type; destStartFrame._constant=this._constant; destStartFrame._constantMin=this._constantMin; destStartFrame._constantMax=this._constantMax; } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destStartFrame=/*__JS__ */new this.constructor(); this.cloneTo(destStartFrame); return destStartFrame; } /** *固定帧。 */ __getset(0,__proto,'constant',function(){ return this._constant; }); /** *开始帧类型,0常量模式,1随机双常量模式。 */ __getset(0,__proto,'type',function(){ return this._type; }); /** *最小固定帧。 */ __getset(0,__proto,'constantMin',function(){ return this._constantMin; }); /** *最大固定帧。 */ __getset(0,__proto,'constantMax',function(){ return this._constantMax; }); StartFrame.createByConstant=function(constant){ var rotationOverLifetime=new StartFrame(); rotationOverLifetime._type=0; rotationOverLifetime._constant=constant; return rotationOverLifetime; } StartFrame.createByRandomTwoConstant=function(constantMin,constantMax){ var rotationOverLifetime=new StartFrame(); rotationOverLifetime._type=1; rotationOverLifetime._constantMin=constantMin; rotationOverLifetime._constantMax=constantMax; return rotationOverLifetime; } return StartFrame; })() /** *TextureSheetAnimation 类用于创建粒子帧动画。 */ //class laya.d3.core.particleShuriKen.module.TextureSheetAnimation var TextureSheetAnimation=(function(){ function TextureSheetAnimation(frame,startFrame){ this.tiles=null; this.type=0; this.randomRow=false; this.frame=null; this.startFrame=null; this.cycles=0; this.enableUVChannels=0; this.enbale=false; this.tiles=new Vector2(1,1); this.type=0; this.randomRow=true; this.cycles=1; this.enableUVChannels=1; this.frame=frame; this.startFrame=startFrame; } __class(TextureSheetAnimation,'laya.d3.core.particleShuriKen.module.TextureSheetAnimation'); var __proto=TextureSheetAnimation.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destTextureSheetAnimation=destObject; this.tiles.clone(destTextureSheetAnimation.tiles); destTextureSheetAnimation.type=this.type; destTextureSheetAnimation.randomRow=this.randomRow; this.frame.cloneTo(destTextureSheetAnimation.frame); this.startFrame.cloneTo(destTextureSheetAnimation.startFrame); destTextureSheetAnimation.cycles=this.cycles; destTextureSheetAnimation.enableUVChannels=this.enableUVChannels; destTextureSheetAnimation.enbale=this.enbale; } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destTextureSheetAnimation=/*__JS__ */new this.constructor(); this.cloneTo(destTextureSheetAnimation); return destTextureSheetAnimation; } return TextureSheetAnimation; })() /** *VelocityOverLifetime 类用于粒子的生命周期速度。 */ //class laya.d3.core.particleShuriKen.module.VelocityOverLifetime var VelocityOverLifetime=(function(){ function VelocityOverLifetime(velocity){ this._velocity=null; this.enbale=false; this.space=0; this._velocity=velocity; } __class(VelocityOverLifetime,'laya.d3.core.particleShuriKen.module.VelocityOverLifetime'); var __proto=VelocityOverLifetime.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destVelocityOverLifetime=destObject; this._velocity.cloneTo(destVelocityOverLifetime._velocity); destVelocityOverLifetime.enbale=this.enbale; destVelocityOverLifetime.space=this.space; } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destVelocityOverLifetime=/*__JS__ */new this.constructor(); this.cloneTo(destVelocityOverLifetime); return destVelocityOverLifetime; } /** *获取尺寸。 */ __getset(0,__proto,'velocity',function(){ return this._velocity; }); return VelocityOverLifetime; })() /** *@private */ //class laya.d3.core.particleShuriKen.ShurikenParticleData var ShurikenParticleData=(function(){ function ShurikenParticleData(){ this.startLifeTime=NaN; this.position=null; this.direction=null; this.startColor=null; this.startSize=null; this.startRotation0=null; this.startRotation1=null; this.startRotation2=null; this.time=NaN; this.startSpeed=NaN; this.startUVInfo=null; this.simulationWorldPostion=null; } __class(ShurikenParticleData,'laya.d3.core.particleShuriKen.ShurikenParticleData'); ShurikenParticleData._getStartLifetimeFromGradient=function(startLifeTimeGradient,emissionTime){ for (var i=1,n=startLifeTimeGradient.gradientCount;i < n;i++){ var key=startLifeTimeGradient.getKeyByIndex(i); if (key >=emissionTime){ var lastKey=startLifeTimeGradient.getKeyByIndex(i-1); var age=(emissionTime-lastKey)/ (key-lastKey); return MathUtil.lerp(startLifeTimeGradient.getValueByIndex(i-1),startLifeTimeGradient.getValueByIndex(i),age) } } throw new Error("ShurikenParticleData: can't get value foam startLifeTimeGradient."); } ShurikenParticleData.create=function(particleSystem,particleRender,position,direction,time,transform){ var particleData=new ShurikenParticleData(); particleData.position=position; MathUtil.scaleVector3(direction,1.0,ShurikenParticleData._tempDirection); particleData.direction=ShurikenParticleData._tempDirection; particleData.startColor=ShurikenParticleData._tempStartColor; switch (particleSystem.startColorType){ case 0:; var startColorE=particleData.startColor; var constantStartColorE=particleSystem.startColorConstant.elements; startColorE[0]=constantStartColorE[0]; startColorE[1]=constantStartColorE[1]; startColorE[2]=constantStartColorE[2]; startColorE[3]=constantStartColorE[3]; break ; case 2: MathUtil.lerpVector4(particleSystem.startColorConstantMin.elements,particleSystem.startColorConstantMax.elements,Math.random(),particleData.startColor); break ; }; var colorOverLifetime=particleSystem.colorOverLifetime; if (colorOverLifetime && colorOverLifetime.enbale){ var startColor=particleData.startColor; var color=colorOverLifetime.color; switch (color.type){ case 0: startColor[0]=startColor[0] *color.constant.x; startColor[1]=startColor[1] *color.constant.y; startColor[2]=startColor[2] *color.constant.z; startColor[3]=startColor[3] *color.constant.w; break ; case 2:; var colorRandom=Math.random(); var minConstantColor=color.constantMin; var maxConstantColor=color.constantMax; startColor[0]=startColor[0] *MathUtil.lerp(minConstantColor.x,maxConstantColor.x,colorRandom); startColor[1]=startColor[1] *MathUtil.lerp(minConstantColor.y,maxConstantColor.y,colorRandom); startColor[2]=startColor[2] *MathUtil.lerp(minConstantColor.z,maxConstantColor.z,colorRandom); startColor[3]=startColor[3] *MathUtil.lerp(minConstantColor.w,maxConstantColor.w,colorRandom); break ; } } particleData.startSize=ShurikenParticleData._tempStartSize; var particleSize=particleData.startSize; switch (particleSystem.startSizeType){ case 0: if (particleSystem.threeDStartSize){ var startSizeConstantSeparate=particleSystem.startSizeConstantSeparate; particleSize[0]=startSizeConstantSeparate.x; particleSize[1]=startSizeConstantSeparate.y; particleSize[2]=startSizeConstantSeparate.z; }else { particleSize[0]=particleSize[1]=particleSize[2]=particleSystem.startSizeConstant; } break ; case 2: if (particleSystem.threeDStartSize){ var startSizeConstantMinSeparate=particleSystem.startSizeConstantMinSeparate; var startSizeConstantMaxSeparate=particleSystem.startSizeConstantMaxSeparate; particleSize[0]=MathUtil.lerp(startSizeConstantMinSeparate.x,startSizeConstantMaxSeparate.x,Math.random()); particleSize[1]=MathUtil.lerp(startSizeConstantMinSeparate.y,startSizeConstantMaxSeparate.y,Math.random()); particleSize[2]=MathUtil.lerp(startSizeConstantMinSeparate.z,startSizeConstantMaxSeparate.z,Math.random()); }else { particleSize[0]=particleSize[1]=particleSize[2]=MathUtil.lerp(particleSystem.startSizeConstantMin,particleSystem.startSizeConstantMax,Math.random()); } break ; }; var sizeOverLifetime=particleSystem.sizeOverLifetime; if (sizeOverLifetime && sizeOverLifetime.enbale && sizeOverLifetime.size.type===1){ var size=sizeOverLifetime.size; if (size.separateAxes){ particleSize[0]=particleSize[0] *MathUtil.lerp(size.constantMinSeparate.x,size.constantMaxSeparate.x,Math.random()); particleSize[1]=particleSize[1] *MathUtil.lerp(size.constantMinSeparate.y,size.constantMaxSeparate.y,Math.random()); particleSize[2]=particleSize[2] *MathUtil.lerp(size.constantMinSeparate.z,size.constantMaxSeparate.z,Math.random()); }else { var randomSize=MathUtil.lerp(size.constantMin,size.constantMax,Math.random()); particleSize[0]=particleSize[0] *randomSize; particleSize[1]=particleSize[1] *randomSize; particleSize[2]=particleSize[2] *randomSize; } }; var particleRotation0; var particleRotation1; var particleRotation2; var rotationMatrixE; switch (particleSystem.startRotationType){ case 0: if (particleSystem.threeDStartRotation && (particleRender.renderMode!==1)&& (particleRender.renderMode!==1)){ var startRotationConstantSeparate=particleSystem.startRotationConstantSeparate; Matrix4x4.createRotationYawPitchRoll(startRotationConstantSeparate.y,startRotationConstantSeparate.x,startRotationConstantSeparate.z,ShurikenParticleData._tempRotationMatrix); rotationMatrixE=ShurikenParticleData._tempRotationMatrix.elements; particleData.startRotation0=ShurikenParticleData._tempStartRotation0; particleRotation0=particleData.startRotation0; particleRotation0[0]=rotationMatrixE[0]; particleRotation0[1]=rotationMatrixE[1]; particleRotation0[2]=rotationMatrixE[2]; particleData.startRotation1=ShurikenParticleData._tempStartRotation1; particleRotation1=particleData.startRotation1; particleRotation1[0]=rotationMatrixE[4]; particleRotation1[1]=rotationMatrixE[5]; particleRotation1[2]=rotationMatrixE[6]; particleData.startRotation2=ShurikenParticleData._tempStartRotation2; particleRotation2=particleData.startRotation2; particleRotation2[0]=rotationMatrixE[8]; particleRotation2[1]=rotationMatrixE[9]; particleRotation2[2]=rotationMatrixE[10]; }else { particleData.startRotation0=ShurikenParticleData._tempStartRotation0; particleRotation0=particleData.startRotation0; particleRotation0[0]=particleRotation0[1]=particleRotation0[2]=particleSystem.startRotationConstant; } break ; case 2: if (particleSystem.threeDStartRotation && (particleRender.renderMode!==1)&& (particleRender.renderMode!==2)){ particleData.startRotation0=ShurikenParticleData._tempStartRotation0; particleRotation0=particleData.startRotation0; var startRotationConstantMinSeparate=particleSystem.startRotationConstantMinSeparate; var startRotationConstantMaxSeparate=particleSystem.startRotationConstantMaxSeparate; Matrix4x4.createRotationYawPitchRoll(MathUtil.lerp(startRotationConstantMinSeparate.y,startRotationConstantMaxSeparate.y,Math.random()),MathUtil.lerp(startRotationConstantMinSeparate.x,startRotationConstantMaxSeparate.x,Math.random()),MathUtil.lerp(startRotationConstantMinSeparate.z,startRotationConstantMaxSeparate.z,Math.random()),ShurikenParticleData._tempRotationMatrix); rotationMatrixE=ShurikenParticleData._tempRotationMatrix.elements; particleData.startRotation0=ShurikenParticleData._tempStartRotation0; particleRotation0=particleData.startRotation0; particleRotation0[0]=rotationMatrixE[0]; particleRotation0[1]=rotationMatrixE[1]; particleRotation0[2]=rotationMatrixE[2]; particleData.startRotation1=ShurikenParticleData._tempStartRotation1; particleRotation1=particleData.startRotation1; particleRotation1[0]=rotationMatrixE[4]; particleRotation1[1]=rotationMatrixE[5]; particleRotation1[2]=rotationMatrixE[6]; particleData.startRotation2=ShurikenParticleData._tempStartRotation2; particleRotation2=particleData.startRotation2; particleRotation2[0]=rotationMatrixE[8]; particleRotation2[1]=rotationMatrixE[9]; particleRotation2[2]=rotationMatrixE[10]; }else { particleData.startRotation0=ShurikenParticleData._tempStartRotation0; particleRotation0=particleData.startRotation0; particleRotation0[0]=particleRotation0[1]=particleRotation0[2]=MathUtil.lerp(particleSystem.startRotationConstantMin,particleSystem.startRotationConstantMax,Math.random()); } break ; } if (Math.random()< particleSystem.randomizeRotationDirection){ particleRotation0[0]=-particleRotation0[0]; particleRotation0[1]=-particleRotation0[1]; particleRotation0[2]=-particleRotation0[2]; } particleData.startRotation1=ShurikenParticleData._tempStartRotation1; particleData.startRotation2=ShurikenParticleData._tempStartRotation2; switch (particleSystem.startLifetimeType){ case 0: particleData.startLifeTime=particleSystem.startLifetimeConstant; break ; case 1: particleData.startLifeTime=ShurikenParticleData._getStartLifetimeFromGradient(particleSystem.startLifeTimeGradient,particleSystem.emission.emissionTime); break ; case 2: particleData.startLifeTime=MathUtil.lerp(particleSystem.startLifetimeConstantMin,particleSystem.startLifetimeConstantMax,Math.random()); break ; case 3:; var emissionTime=particleSystem.emission.emissionTime; particleData.startLifeTime=MathUtil.lerp(ShurikenParticleData._getStartLifetimeFromGradient(particleSystem.startLifeTimeGradientMin,emissionTime),ShurikenParticleData._getStartLifetimeFromGradient(particleSystem.startLifeTimeGradientMax,emissionTime),Math.random()); break ; } switch (particleSystem.startSpeedType){ case 0: particleData.startSpeed=particleSystem.startSpeedConstant; break ; case 2: particleData.startSpeed=MathUtil.lerp(particleSystem.startSpeedConstantMin,particleSystem.startSpeedConstantMax,Math.random()); break ; } particleData.startUVInfo=ShurikenParticleData._tempStartUVInfo; var textureSheetAnimation=particleSystem.textureSheetAnimation; var enableSheetAnimation=textureSheetAnimation && textureSheetAnimation.enbale; var startUVInfo; if (enableSheetAnimation){ var title=textureSheetAnimation.tiles; var titleX=title.x,titleY=title.y; var subU=1.0 / titleX,subV=1.0 / titleY; var totalFrameCount=0; var startRow=0; var randomRow=textureSheetAnimation.randomRow; switch (textureSheetAnimation.type){ case 0: totalFrameCount=titleX *titleY; break ; case 1: totalFrameCount=titleX; if (randomRow) startRow=Math.round(Math.random()*titleY); else startRow=0; break ; }; var startFrameCount=0; var startFrame=textureSheetAnimation.startFrame; switch (startFrame.type){ case 0: startFrameCount=startFrame.constant; break ; case 1: startFrameCount=Math.round(MathUtil.lerp(startFrame.constantMin,startFrame.constantMax,Math.random())); break ; }; var frame=textureSheetAnimation.frame; switch (frame.type){ case 0: startFrameCount+=frame.constant; break ; case 2: startFrameCount+=Math.round(MathUtil.lerp(frame.constantMin,frame.constantMax,Math.random())); break ; } if (!randomRow) startRow=Math.floor(startFrameCount / titleX); var startCol=startFrameCount % titleX; startUVInfo=particleData.startUVInfo; startUVInfo[0]=subU; startUVInfo[1]=subV; startUVInfo[2]=startCol *subU; startUVInfo[3]=startRow *subV; }else { startUVInfo=particleData.startUVInfo; startUVInfo[0]=1.0; startUVInfo[1]=1.0; startUVInfo[2]=0.0; startUVInfo[3]=0.0; } particleData.time=time; particleData.simulationWorldPostion=ShurikenParticleData._tempSimulationWorldPostion; var particleSimulationWorldPostion=particleData.simulationWorldPostion; if (particleSystem.simulationSpace===0){ var positionE=transform.position.elements; particleSimulationWorldPostion[0]=positionE[0]; particleSimulationWorldPostion[1]=positionE[1]; particleSimulationWorldPostion[2]=positionE[2]; }else { particleSimulationWorldPostion[0]=0; particleSimulationWorldPostion[1]=0; particleSimulationWorldPostion[2]=0; } return particleData; } __static(ShurikenParticleData, ['_tempRotationMatrix',function(){return this._tempRotationMatrix=new Matrix4x4();},'_tempDirection',function(){return this._tempDirection=new Float32Array(3);},'_tempStartColor',function(){return this._tempStartColor=new Float32Array(4);},'_tempStartSize',function(){return this._tempStartSize=new Float32Array(3);},'_tempStartRotation0',function(){return this._tempStartRotation0=new Float32Array(3);},'_tempStartRotation1',function(){return this._tempStartRotation1=new Float32Array(3);},'_tempStartRotation2',function(){return this._tempStartRotation2=new Float32Array(3);},'_tempStartUVInfo',function(){return this._tempStartUVInfo=new Float32Array(4);},'_tempSimulationWorldPostion',function(){return this._tempSimulationWorldPostion=new Float32Array(3);} ]); return ShurikenParticleData; })() /** *ShurikenParticleSystem 类用于创建3D粒子数据模板。 */ //class laya.d3.core.particleShuriKen.ShurikenParticleSystem var ShurikenParticleSystem=(function(){ function ShurikenParticleSystem(owner){ this._owner=null; this._vertices=null; this._floatCountPerVertex=0; this._firstActiveElement=0; this._firstNewElement=0; this._firstFreeElement=0; this._firstRetiredElement=0; this._drawCounter=0; this._currentTime=NaN; this._vertexBuffer=null; this._indexBuffer=null; this._maxParticles=0; this._emission=null; this._aliveParticleCount=0; this._shape=null; this._startUpdateLoopCount=0; this.duration=NaN; this.looping=false; this.prewarm=false; this.startDelayType=0; this.startDelay=NaN; this.startDelayMin=NaN; this.startDelayMax=NaN; this.startLifetimeType=0; this.startLifetimeConstant=NaN; this.startLifeTimeGradient=null; this.startLifetimeConstantMin=NaN; this.startLifetimeConstantMax=NaN; this.startLifeTimeGradientMin=null; this.startLifeTimeGradientMax=null; this.startSpeedType=0; this.startSpeedConstant=NaN; this.startSpeedConstantMin=NaN; this.startSpeedConstantMax=NaN; this.threeDStartSize=false; this.startSizeType=0; this.startSizeConstant=NaN; this.startSizeConstantSeparate=null; this.startSizeConstantMin=NaN; this.startSizeConstantMax=NaN; this.startSizeConstantMinSeparate=null; this.startSizeConstantMaxSeparate=null; this.threeDStartRotation=false; this.startRotationType=0; this.startRotationConstant=NaN; this.startRotationConstantSeparate=null; this.startRotationConstantMin=NaN; this.startRotationConstantMax=NaN; this.startRotationConstantMinSeparate=null; this.startRotationConstantMaxSeparate=null; this.randomizeRotationDirection=NaN; this.startColorType=0; this.startColorConstant=null; this.startColorConstantMin=null; this.startColorConstantMax=null; this.gravity=null; this.gravityModifier=NaN; this.simulationSpace=0; this.scaleMode=0; this.playOnAwake=false; this.velocityOverLifetime=null; this.colorOverLifetime=null; this.sizeOverLifetime=null; this.rotationOverLifetime=null; this.textureSheetAnimation=null; this.isPerformanceMode=false; this._owner=owner; this._currentTime=0; this._floatCountPerVertex=40; this._maxParticles=1000; this.duration=5.0; this.looping=true; this.prewarm=false; this.startDelayType=0; this.startDelay=0.0; this.startDelayMin=0.0; this.startDelayMax=0.0; this.startLifetimeType=0; this.startLifetimeConstant=5.0; this.startRotationConstantSeparate=new Vector3(0,0,0); this.startLifetimeConstantMin=0.0; this.startLifetimeConstantMax=5.0; this.startRotationConstantMinSeparate=new Vector3(0,0,0); this.startRotationConstantMaxSeparate=new Vector3(0,0,0); this.startSpeedType=0; this.startSpeedConstant=5.0; this.startSpeedConstantMin=0.0; this.startSpeedConstantMax=5.0; this.threeDStartSize=false; this.startSizeType=0; this.startSizeConstant=1; this.startSizeConstantSeparate=new Vector3(1,1,1); this.startSizeConstantMin=0; this.startSizeConstantMax=1; this.startSizeConstantMinSeparate=new Vector3(0,0,0); this.startSizeConstantMaxSeparate=new Vector3(1,1,1); this.threeDStartRotation=false; this.startRotationType=0; this.startRotationConstant=0; this.startRotationConstantMin=0.0; this.startRotationConstantMax=0.0; this.randomizeRotationDirection=0.0; this.startColorType=0; this.startColorConstant=new Vector4(1,1,1,1); this.startColorConstantMin=new Vector4(1,1,1,1); this.startColorConstantMax=new Vector4(1,1,1,1); this.gravity=new Vector3(0,-9.81,0); this.gravityModifier=0.0; this.simulationSpace=1; this.scaleMode=0; this.playOnAwake=true; this.isPerformanceMode=true; } __class(ShurikenParticleSystem,'laya.d3.core.particleShuriKen.ShurikenParticleSystem'); var __proto=ShurikenParticleSystem.prototype; Laya.imps(__proto,{"laya.d3.core.render.IRenderable":true}) __proto._getVertexBuffer=function(index){ (index===void 0)&& (index=0); if (index===0) return this._vertexBuffer; else return null; } __proto._getIndexBuffer=function(){ return this._indexBuffer; } __proto._retireActiveParticles=function(){ var epsilon=0.0001; while (this._firstActiveElement !=this._firstNewElement){ var index=this._firstActiveElement *this._floatCountPerVertex *4; var timeIndex=index+27; var particleAge=this._currentTime-this._vertices[timeIndex]; if (particleAge+epsilon < this._vertices[index+26]) break ; this._vertices[timeIndex]=this._drawCounter; this._firstActiveElement++; if (this._firstActiveElement >=this._maxParticles) this._firstActiveElement=0; } } __proto._freeRetiredParticles=function(){ while (this._firstRetiredElement !=this._firstActiveElement){ var age=this._drawCounter-this._vertices[this._firstRetiredElement *this._floatCountPerVertex *4+27]; if (this.isPerformanceMode) if (age < 3) break ; this._firstRetiredElement++; if (this._firstRetiredElement >=this._maxParticles) this._firstRetiredElement=0; } } __proto._setPartVertexDatas=function(subU,subV,startU,startV){ for (var i=0;i < this._maxParticles;i++){ var particleOffset=i *this._floatCountPerVertex *4; this._vertices[particleOffset+this._floatCountPerVertex *0+0]=-0.5; this._vertices[particleOffset+this._floatCountPerVertex *0+1]=-0.5; this._vertices[particleOffset+this._floatCountPerVertex *1+0]=0.5; this._vertices[particleOffset+this._floatCountPerVertex *1+1]=-0.5; this._vertices[particleOffset+this._floatCountPerVertex *2+0]=0.5; this._vertices[particleOffset+this._floatCountPerVertex *2+1]=0.5; this._vertices[particleOffset+this._floatCountPerVertex *3+0]=-0.5; this._vertices[particleOffset+this._floatCountPerVertex *3+1]=0.5; } } __proto._initPartVertexDatas=function(){ this._vertexBuffer=VertexBuffer3D.create(VertexParticleShuriken.vertexDeclaration,this._maxParticles *4,/*laya.webgl.WebGLContext.DYNAMIC_DRAW*/0x88E8); this._vertices=new Float32Array(this._maxParticles *this._floatCountPerVertex *4); var enableSheetAnimation=this.textureSheetAnimation && this.textureSheetAnimation.enbale; if (enableSheetAnimation){ var title=this.textureSheetAnimation.tiles; var titleX=title.x,titleY=title.y; var subU=1.0 / titleX,subV=1.0 / titleY; var totalFrameCount=0; var startRow=0; var randomRow=this.textureSheetAnimation.randomRow; switch (this.textureSheetAnimation.type){ case 0: totalFrameCount=titleX *titleY; break ; case 1: totalFrameCount=titleX; if (randomRow) startRow=Math.round(Math.random()*titleY); else startRow=0; break ; }; var startFrameCount=0; var startFrame=this.textureSheetAnimation.startFrame; switch (startFrame.type){ case 0: startFrameCount=startFrame.constant; break ; case 1: startFrameCount=Math.round(MathUtil.lerp(startFrame.constantMin,startFrame.constantMax,Math.random())); break ; }; var frame=this.textureSheetAnimation.frame; switch (frame.type){ case 0: startFrameCount+=frame.constant; break ; case 2: startFrameCount+=Math.round(MathUtil.lerp(frame.constantMin,frame.constantMax,Math.random())); break ; } if (!randomRow) startRow=Math.floor(startFrameCount / titleX); var startCol=startFrameCount % titleX; this._setPartVertexDatas(subU,subV,startCol *subU,startRow *subV); }else { this._setPartVertexDatas(1.0,1.0,0.0,0.0); } } __proto._initIndexDatas=function(){ this._indexBuffer=IndexBuffer3D.create(/*laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort",this._maxParticles *6,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4); var indexes=new Uint16Array(this._maxParticles *6); for (var i=0;i < this._maxParticles;i++){ var indexOffset=i *6; var vertexOffset=i *4; indexes[indexOffset+0]=(vertexOffset+0); indexes[indexOffset+1]=(vertexOffset+2); indexes[indexOffset+2]=(vertexOffset+1); indexes[indexOffset+3]=(vertexOffset+0); indexes[indexOffset+4]=(vertexOffset+3); indexes[indexOffset+5]=(vertexOffset+2); } this._indexBuffer.setData(indexes); } /** *@private */ __proto._destroy=function(){ this._vertexBuffer.dispose(); this._indexBuffer.dispose(); this._emission._destroy(); this._owner=null; this._vertices=null; this._vertexBuffer=null; this._indexBuffer=null; this._emission=null; this._shape=null; this.startLifeTimeGradient=null; this.startLifeTimeGradientMin=null; this.startLifeTimeGradientMax=null; this.startSizeConstantSeparate=null; this.startSizeConstantMinSeparate=null; this.startSizeConstantMaxSeparate=null; this.startRotationConstantSeparate=null; this.startRotationConstantMinSeparate=null; this.startRotationConstantMaxSeparate=null; this.startColorConstant=null; this.startColorConstantMin=null; this.startColorConstantMax=null; this.gravity=null; this.velocityOverLifetime=null; this.colorOverLifetime=null; this.sizeOverLifetime=null; this.rotationOverLifetime=null; this.textureSheetAnimation=null; } __proto.update=function(state){ var elapsedTime=0; (this._startUpdateLoopCount!==Stat.loopCount)&& (elapsedTime=state.elapsedTime / 1000.0,this._currentTime+=elapsedTime); this._retireActiveParticles(); this._freeRetiredParticles(); this._emission.update(elapsedTime,this._owner.transform); if (this._firstActiveElement===this._firstFreeElement) this._currentTime=0; if (this._firstRetiredElement===this._firstActiveElement) this._drawCounter=0; if (this._firstNewElement >=this._firstRetiredElement) this._aliveParticleCount=this._firstNewElement-this._firstRetiredElement; else this._aliveParticleCount=this._maxParticles-this._firstRetiredElement+this._firstNewElement; } __proto.addParticle=function(position,direction,transform){ Vector3.normalize(direction,direction); var positionE=position.elements; var directionE=direction.elements; var nextFreeParticle=this._firstFreeElement+1; if (nextFreeParticle >=this._maxParticles) nextFreeParticle=0; if (nextFreeParticle===this._firstRetiredElement) return false; var particleData=ShurikenParticleData.create(this,this._owner.particleRender,positionE,directionE,this._currentTime,transform); var startIndex=this._firstFreeElement *this._floatCountPerVertex *4; var randomX0=Math.random(),randomY0=Math.random(),randomZ0=Math.random(),randomW0=Math.random(); var randomX1=Math.random(),randomY1=Math.random(),randomZ1=Math.random(),randomW1=Math.random(); var subU=particleData.startUVInfo[0]; var subV=particleData.startUVInfo[1]; var startU=particleData.startUVInfo[2]; var startV=particleData.startUVInfo[3]; this._vertices[startIndex+2]=startU; this._vertices[startIndex+3]=startV+subV; this._vertices[startIndex+this._floatCountPerVertex+2]=startU+subU; this._vertices[startIndex+this._floatCountPerVertex+3]=startV+subV; this._vertices[startIndex+this._floatCountPerVertex *2+2]=startU+subU; this._vertices[startIndex+this._floatCountPerVertex *2+3]=startV; this._vertices[startIndex+this._floatCountPerVertex *3+2]=startU; this._vertices[startIndex+this._floatCountPerVertex *3+3]=startV; for (var i=0;i < 4;i++){ var vertexStart=startIndex+i *this._floatCountPerVertex; var j=0,offset=0; for (j=0,offset=4;j < 3;j++) this._vertices[vertexStart+offset+j]=particleData.position[j]; for (j=0,offset=7;j < 3;j++) this._vertices[vertexStart+offset+j]=particleData.direction[j]; for (j=0,offset=10;j < 4;j++) this._vertices[vertexStart+offset+j]=particleData.startColor[j]; for (j=0,offset=14;j < 3;j++) this._vertices[vertexStart+offset+j]=particleData.startSize[j]; for (j=0,offset=17;j < 3;j++) this._vertices[vertexStart+offset+j]=particleData.startRotation0[j]; for (j=0,offset=20;j < 3;j++) this._vertices[vertexStart+offset+j]=particleData.startRotation1[j]; for (j=0,offset=23;j < 3;j++) this._vertices[vertexStart+offset+j]=particleData.startRotation2[j]; this._vertices[vertexStart+26]=particleData.startLifeTime; this._vertices[vertexStart+27]=particleData.time; this._vertices[vertexStart+28]=particleData.startSpeed; this._vertices[vertexStart+29]=randomX0; this._vertices[vertexStart+30]=randomY0; this._vertices[vertexStart+31]=randomZ0; this._vertices[vertexStart+32]=randomW0; this._vertices[vertexStart+33]=randomX1; this._vertices[vertexStart+34]=randomY1; this._vertices[vertexStart+35]=randomZ1; this._vertices[vertexStart+36]=randomW1; for (j=0,offset=37;j < 3;j++) this._vertices[vertexStart+offset+j]=particleData.simulationWorldPostion[j]; } this._firstFreeElement=nextFreeParticle; return true; } __proto.addNewParticlesToVertexBuffer=function(){ var start=0; if (this._firstNewElement < this._firstFreeElement){ start=this._firstNewElement *4 *this._floatCountPerVertex; this._vertexBuffer.setData(this._vertices,start,start,(this._firstFreeElement-this._firstNewElement)*4 *this._floatCountPerVertex); }else { start=this._firstNewElement *4 *this._floatCountPerVertex; this._vertexBuffer.setData(this._vertices,start,start,(this._maxParticles-this._firstNewElement)*4 *this._floatCountPerVertex); if (this._firstFreeElement > 0){ this._vertexBuffer.setData(this._vertices,0,0,this._firstFreeElement *4 *this._floatCountPerVertex); } } this._firstNewElement=this._firstFreeElement; } __proto._beforeRender=function(state){ if (this._firstNewElement !=this._firstFreeElement){ this.addNewParticlesToVertexBuffer(); } this._drawCounter++; if (this._firstActiveElement !=this._firstFreeElement){ this._vertexBuffer._bind(); this._indexBuffer._bind(); return true; } return false; } __proto._render=function(state){ var drawVertexCount=0; var glContext=WebGL.mainContext; if (this._firstActiveElement < this._firstFreeElement){ drawVertexCount=(this._firstFreeElement-this._firstActiveElement)*6; glContext.drawElements(/*laya.webgl.WebGLContext.TRIANGLES*/0x0004,drawVertexCount,/*laya.webgl.WebGLContext.UNSIGNED_SHORT*/0x1403,this._firstActiveElement *6 *2); Stat.trianglesFaces+=drawVertexCount / 3; Stat.drawCall++; }else { drawVertexCount=(this._maxParticles-this._firstActiveElement)*6; glContext.drawElements(/*laya.webgl.WebGLContext.TRIANGLES*/0x0004,drawVertexCount,/*laya.webgl.WebGLContext.UNSIGNED_SHORT*/0x1403,this._firstActiveElement *6 *2); Stat.trianglesFaces+=drawVertexCount / 3; Stat.drawCall++; if (this._firstFreeElement > 0){ drawVertexCount=this._firstFreeElement *6; glContext.drawElements(/*laya.webgl.WebGLContext.TRIANGLES*/0x0004,drawVertexCount,/*laya.webgl.WebGLContext.UNSIGNED_SHORT*/0x1403,0); Stat.trianglesFaces+=drawVertexCount / 3; Stat.drawCall++; } } } /**当前粒子时间。*/ __getset(0,__proto,'currentTime',function(){ return this._currentTime; }); __getset(0,__proto,'indexOfHost',function(){ return 0; }); /**设置最大粒子数,注意:谨慎修改此属性,有性能损耗。*/ /**获取最大粒子数。*/ __getset(0,__proto,'maxParticles',function(){ return this._maxParticles-1; },function(value){ var newMaxParticles=value+1; if (newMaxParticles!==this._maxParticles){ this._maxParticles=newMaxParticles; if (this._vertexBuffer){ this._vertexBuffer.dispose(); this._indexBuffer.dispose(); } this._initPartVertexDatas(); this._initIndexDatas(); } }); /** *是否存活。 */ __getset(0,__proto,'isAlive',function(){ if (this._emission.isPlaying || this._aliveParticleCount > 0) return true; return false; }); /** *设置形状。 */ /** *获取形状。 */ __getset(0,__proto,'shape',function(){ return this._shape; },function(value){ this._shape=value; this._emission._shape=value; }); /** *设置发射器。 */ /** *获取发射器。 */ __getset(0,__proto,'emission',function(){ return this._emission; },function(value){ this._emission=value; value._particleSystem=this; value._shape=this._shape; }); /** *粒子存活个数。 */ __getset(0,__proto,'aliveParticleCount',function(){ return this._aliveParticleCount; }); __getset(0,__proto,'_vertexBufferCount',function(){ return 1; }); __getset(0,__proto,'triangleCount',function(){ return this._indexBuffer.indexCount / 3; }); return ShurikenParticleSystem; })() /** *@private *PhasorSpriter3D 类用于创建矢量笔刷。 */ //class laya.d3.core.PhasorSpriter3D var PhasorSpriter3D=(function(){ function PhasorSpriter3D(){ this._tempInt0=0; this._tempInt1=0; this._tempUint0=0; this._tempUint1=0; this._tempUint2=0; this._tempUint3=0; this._tempUint4=0; this._tempUint5=0; this._tempUint6=0; this._tempUint7=0; this._tempNumver0=NaN; this._tempNumver1=NaN; this._tempNumver2=NaN; this._tempNumver3=NaN; this._floatSizePerVer=7; this._defaultBufferSize=600 *this._floatSizePerVer; this._vb=null; this._posInVBData=0; this._ib=null; this._posInIBData=0; this._primitiveType=NaN; this._hasBegun=false; this._numVertsPerPrimitive=0; this._renderState=null; this._sharderNameID=0; this._shader=null; this._posShaderValue=[3,/*laya.webgl.WebGLContext.FLOAT*/0x1406,false,28,0]; this._colorShaderValue=[4,/*laya.webgl.WebGLContext.FLOAT*/0x1406,false,28,12]; this._albedo=new Vector4(1.0,1.0,1.0,1.0); this._vbData=new Float32Array(this._defaultBufferSize); this._ibData=new Uint16Array(this._defaultBufferSize); this._wvpMatrix=new Matrix4x4(); ; this._vb=new VertexBuffer2D(-1,/*laya.webgl.WebGLContext.DYNAMIC_DRAW*/0x88E8); this._ib=new IndexBuffer2D(); this._sharderNameID=Shader.nameKey.get("SIMPLE"); } __class(PhasorSpriter3D,'laya.d3.core.PhasorSpriter3D'); var __proto=PhasorSpriter3D.prototype; __proto.line=function(startX,startY,startZ,startR,startG,startB,startA,endX,endY,endZ,endR,endG,endB,endA){ if (!this._hasBegun || this._primitiveType!==/*laya.webgl.WebGLContext.LINES*/0x0001) this.drawLinesException(); if (this._posInVBData+2 *this._floatSizePerVer > this._vbData.length || this._posInIBData+2 > this._ibData.length) this.flush(); this._tempUint0=this._posInVBData / this._floatSizePerVer; this.addVertex(startX,startY,startZ,startR,startG,startB,startA); this.addVertex(endX,endY,endZ,endR,endG,endB,endA); this.addIndexes(this._tempUint0,this._tempUint0+1); return this; } __proto.circle=function(radius,numberOfPoints,r,g,b,a){ if (!this._hasBegun || (this._primitiveType!==/*laya.webgl.WebGLContext.LINES*/0x0001)) this.drawLinesException(); this._tempUint0=numberOfPoints *2; if (this._posInVBData+this._tempUint0 *this._floatSizePerVer > this._vbData.length || this._posInIBData+2 *this._tempUint0 > this._ibData.length) this.flush(); this._tempUint1=this._posInVBData / this._floatSizePerVer; for (this._tempNumver0=0,this._tempInt0=0;this._tempNumver0 < 3.1416 *2;this._tempNumver0=this._tempNumver0+(3.1416 / numberOfPoints),this._tempInt0++){ this.addVertex(Math.sin(this._tempNumver0)*radius,Math.cos(this._tempNumver0)*radius,0,r,g,b,a); if (this._tempInt0===0){ this.addIndexes(this._tempUint1); }else if (this._tempInt0===this._tempUint0-1){ this._tempUint2=this._tempUint1+this._tempInt0; this.addIndexes(this._tempUint2,this._tempUint2,this._tempUint1); }else { this._tempUint2=this._tempUint1+this._tempInt0; this.addIndexes(this._tempUint2,this._tempUint2); } } return this; } __proto.plane=function(positionX,positionY,positionZ,width,height,r,g,b,a){ if (!this._hasBegun || this._primitiveType!==/*laya.webgl.WebGLContext.TRIANGLES*/0x0004) this.drawTrianglesException(); if (this._posInVBData+4 *this._floatSizePerVer > this._vbData.length || this._posInIBData+6 > this._ibData.length) this.flush(); this._tempNumver0=width / 2; this._tempNumver1=height / 2; this._tempUint0=this._posInVBData / this._floatSizePerVer; this.addVertex(positionX-this._tempNumver0,positionY+this._tempNumver1,positionZ,r,g,b,a); this.addVertex(positionX+this._tempNumver0,positionY+this._tempNumver1,positionZ,r,g,b,a); this.addVertex(positionX-this._tempNumver0,positionY-this._tempNumver1,positionZ,r,g,b,a); this.addVertex(positionX+this._tempNumver0,positionY-this._tempNumver1,positionZ,r,g,b,a); this._tempUint1=this._tempUint0+1; this._tempUint2=this._tempUint0+2; this.addIndexes(this._tempUint0,this._tempUint1,this._tempUint2,this._tempUint2,this._tempUint1,this._tempUint0+3); return this; } __proto.box=function(positionX,positionY,positionZ,width,height,depth,r,g,b,a){ if (!this._hasBegun || this._primitiveType!==/*laya.webgl.WebGLContext.TRIANGLES*/0x0004) this.drawTrianglesException(); if (this._posInVBData+8 *this._floatSizePerVer > this._vbData.length || this._posInIBData+36 > this._ibData.length) this.flush(); this._tempNumver0=width / 2; this._tempNumver1=height / 2; this._tempNumver2=depth / 2; this._tempUint0=this._posInVBData / this._floatSizePerVer; this.addVertex(positionX-this._tempNumver0,positionY+this._tempNumver1,positionZ+this._tempNumver2,r,g,b,a); this.addVertex(positionX+this._tempNumver0,positionY+this._tempNumver1,positionZ+this._tempNumver2,r,g,b,a); this.addVertex(positionX-this._tempNumver0,positionY-this._tempNumver1,positionZ+this._tempNumver2,r,g,b,a); this.addVertex(positionX+this._tempNumver0,positionY-this._tempNumver1,positionZ+this._tempNumver2,r,g,b,a); this.addVertex(positionX+this._tempNumver0,positionY+this._tempNumver1,positionZ-this._tempNumver2,r,g,b,a); this.addVertex(positionX-this._tempNumver0,positionY+this._tempNumver1,positionZ-this._tempNumver2,r,g,b,a); this.addVertex(positionX+this._tempNumver0,positionY-this._tempNumver1,positionZ-this._tempNumver2,r,g,b,a); this.addVertex(positionX-this._tempNumver0,positionY-this._tempNumver1,positionZ-this._tempNumver2,r,g,b,a); this._tempUint1=this._tempUint0+1; this._tempUint2=this._tempUint0+2; this._tempUint3=this._tempUint0+3; this._tempUint4=this._tempUint0+4; this._tempUint5=this._tempUint0+5; this._tempUint6=this._tempUint0+6; this._tempUint7=this._tempUint0+7; this.addIndexes(this._tempUint0,this._tempUint1,this._tempUint2,this._tempUint2,this._tempUint1,this._tempUint3, this._tempUint4,this._tempUint5,this._tempUint6,this._tempUint6,this._tempUint5,this._tempUint7, this._tempUint5,this._tempUint0,this._tempUint7,this._tempUint7,this._tempUint0,this._tempUint2, this._tempUint1,this._tempUint4,this._tempUint3,this._tempUint3,this._tempUint4,this._tempUint6, this._tempUint5,this._tempUint4,this._tempUint0,this._tempUint0,this._tempUint4,this._tempUint1, this._tempUint2,this._tempUint3,this._tempUint7,this._tempUint7,this._tempUint3,this._tempUint6); return this; } __proto.cone=function(radius,length,Slices,r,g,b,a){ if (!this._hasBegun || this._primitiveType!==/*laya.webgl.WebGLContext.TRIANGLES*/0x0004) this.drawTrianglesException(); if (this._posInVBData+(2 *Slices+2)*this._floatSizePerVer > this._vbData.length || this._posInIBData+6 *Slices > this._ibData.length) this.flush(); this._tempUint0=this._posInVBData; this._tempUint1=this._posInVBData / this._floatSizePerVer; this._tempNumver0=Math.PI *2 / Slices; this.addVertexIndex(0,length,0,r,g,b,a,this._tempUint0); this.addVertexIndex(0,0,0,r,g,b,a,this._tempUint0+this._floatSizePerVer); this._tempInt0=2; this._tempNumver1=0; for (this._tempInt1=0;this._tempInt1 < Slices;this._tempInt1++){ this._tempNumver2=Math.cos(this._tempNumver1); this._tempNumver3=Math.sin(this._tempNumver1); this.addVertexIndex(radius *this._tempNumver2,0,radius *this._tempNumver3,r,g,b,a,this._tempUint0+this._tempInt0 *this._floatSizePerVer); this.addIndexes(this._tempUint1,this._tempUint1+this._tempInt0); if (this._tempInt1==Slices-1) this.addIndexes(this._tempUint1+2); else this.addIndexes(this._tempUint1+this._tempInt0+1); this.addVertexIndex(radius *this._tempNumver2,0,radius *this._tempNumver3,r,g,b,a,this._tempUint0+(this._tempInt0+Slices)*this._floatSizePerVer); this.addIndexes(this._tempUint1+1); if (this._tempInt1==Slices-1) this.addIndexes(this._tempUint1+Slices+2); else this.addIndexes(this._tempUint1+this._tempInt0+Slices+1); this.addIndexes(this._tempUint1+this._tempInt0+Slices); this._tempInt0++; this._tempNumver1+=this._tempNumver0; } return this; } __proto.boundingBoxLine=function(minX,minY,minZ,maxX,maxY,maxZ,r,g,b,a){ if (!this._hasBegun || this._primitiveType!==/*laya.webgl.WebGLContext.LINES*/0x0001) this.drawLinesException(); if (this._posInVBData+8 *this._floatSizePerVer > this._vbData.length || this._posInIBData+48 > this._ibData.length) this.flush(); this._tempUint0=this._posInVBData / this._floatSizePerVer; this.addVertex(minX,maxY,maxZ,r,g,b,a); this.addVertex(maxX,maxY,maxZ,r,g,b,a); this.addVertex(minX,minY,maxZ,r,g,b,a); this.addVertex(maxX,minY,maxZ,r,g,b,a); this.addVertex(maxX,maxY,minZ,r,g,b,a); this.addVertex(minX,maxY,minZ,r,g,b,a); this.addVertex(maxX,minY,minZ,r,g,b,a); this.addVertex(minX,minY,minZ,r,g,b,a); this._tempUint1=this._tempUint0+1; this._tempUint2=this._tempUint0+2; this._tempUint3=this._tempUint0+3; this._tempUint4=this._tempUint0+4; this._tempUint5=this._tempUint0+5; this._tempUint6=this._tempUint0+6; this._tempUint7=this._tempUint0+7; this.addIndexes(this._tempUint0,this._tempUint1,this._tempUint1,this._tempUint3,this._tempUint3,this._tempUint2,this._tempUint2,this._tempUint0, this._tempUint4,this._tempUint5,this._tempUint5,this._tempUint7,this._tempUint7,this._tempUint6,this._tempUint6,this._tempUint4, this._tempUint5,this._tempUint0,this._tempUint0,this._tempUint2,this._tempUint2,this._tempUint7,this._tempUint7,this._tempUint5, this._tempUint1,this._tempUint4,this._tempUint4,this._tempUint6,this._tempUint6,this._tempUint3,this._tempUint3,this._tempUint1, this._tempUint5,this._tempUint4,this._tempUint4,this._tempUint1,this._tempUint1,this._tempUint0,this._tempUint0,this._tempUint5, this._tempUint2,this._tempUint3,this._tempUint3,this._tempUint6,this._tempUint6,this._tempUint7,this._tempUint7,this._tempUint2); return this; } __proto.addVertex=function(x,y,z,r,g,b,a){ if (!this._hasBegun) this.addVertexIndexException(); this._vbData[this._posInVBData]=x,this._vbData[this._posInVBData+1]=y,this._vbData[this._posInVBData+2]=z; this._vbData[this._posInVBData+3]=r,this._vbData[this._posInVBData+4]=g,this._vbData[this._posInVBData+5]=b,this._vbData[this._posInVBData+6]=a; this._posInVBData+=this._floatSizePerVer; return this; } __proto.addVertexIndex=function(x,y,z,r,g,b,a,index){ if (!this._hasBegun) this.addVertexIndexException(); this._vbData[index]=x,this._vbData[index+1]=y,this._vbData[index+2]=z; this._vbData[index+3]=r,this._vbData[index+4]=g,this._vbData[index+5]=b,this._vbData[index+6]=a; index+=this._floatSizePerVer; if (index > this._posInVBData) this._posInVBData=index; return this; } __proto.addIndexes=function(__indexes){ var indexes=arguments; if (!this._hasBegun) this.addVertexIndexException(); for (var i=0;i < indexes.length;i++){ this._ibData[this._posInIBData]=indexes[i]; this._posInIBData++; } return this; } __proto.begin=function(primitive,wvpMatrix,renState){ if (this._hasBegun) this.beginException0(); if (primitive!==/*laya.webgl.WebGLContext.LINES*/0x0001 && primitive!==/*laya.webgl.WebGLContext.TRIANGLES*/0x0004) this.beginException1(); this._primitiveType=primitive; this._wvpMatrix=wvpMatrix; this._renderState=renState; this._hasBegun=true; return this; } __proto.end=function(){ if (!this._hasBegun) this.endException(); this.flush(); this._hasBegun=false; return this; } __proto.flush=function(){ if (this._posInVBData===0) return; this._ib.clear(); this._ib.append(this._ibData); this._vb.clear(); this._vb.append(this._vbData); this._vb.bind_upload(this._ib); var presz=this._renderState.shaderValue.length; var predef=this._renderState.shaderDefines.getValue(); this._shader=this.getShader(this._renderState); this._renderState.shaderValue.pushValue(/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION",this._posShaderValue); this._renderState.shaderValue.pushValue(/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR",this._colorShaderValue); this._renderState.shaderValue.pushValue(/*laya.d3.core.material.StandardMaterial.MVPMATRIX*/"MVPMATRIX",this._wvpMatrix.elements); this._renderState.shaderValue.pushValue(/*laya.d3.core.material.StandardMaterial.ALBEDO*/"ALBEDO",this._albedo.elements); this._shader.uploadArray(this._renderState.shaderValue.data,this._renderState.shaderValue.length,null); this._renderState.shaderDefines.setValue(predef); this._renderState.shaderValue.length=presz; Stat.drawCall++; WebGL.mainContext.drawElements(this._primitiveType,this._posInIBData,/*laya.webgl.WebGLContext.UNSIGNED_SHORT*/0x1403,0); this._posInIBData=0; this._posInVBData=0; } __proto.getShader=function(state){ var preDef=state.shaderDefines._value; state.shaderDefines._value=preDef & (~(/*laya.d3.shader.ShaderDefines3D.POINTLIGHT*/0x2000 | /*laya.d3.shader.ShaderDefines3D.SPOTLIGHT*/0x4000 | /*laya.d3.shader.ShaderDefines3D.DIRECTIONLIGHT*/0x1000)); state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.COLOR*/0x800); var nameID=state.shaderDefines.getValue()+this._sharderNameID */*laya.webgl.shader.Shader.SHADERNAME2ID*/0.0002; var shader=this._shader ? this._shader :Shader.getShader(nameID); return shader || (shader=Shader.withCompile(this._sharderNameID,state.shaderDefines.toNameDic(),nameID,null)); } __proto.addVertexIndexException=function(){ throw new Error("请先调用begin()函数"); } __proto.beginException0=function(){ throw new Error("调用begin()前请确保已成功调用end()!"); } __proto.beginException1=function(){ throw new Error("只支持“LINES”和“TRIANGLES”两种基元!"); } __proto.endException=function(){ throw new Error("调用end()前请确保已成功调用begin()!"); } __proto.drawLinesException=function(){ throw new Error("您必须确保在此之前已调用begin()且使用“LINES”基元!"); } __proto.drawTrianglesException=function(){ throw new Error("您必须确保在此之前已调用begin()且使用“TRIANGLES”基元!"); } return PhasorSpriter3D; })() /** *RenderConfig 类用于实现渲染配置。 */ //class laya.d3.core.render.RenderConfig var RenderConfig=(function(){ function RenderConfig(){ this.depthTest=true; this.depthMask=1; this.blend=false; this.cullFace=true; this.sFactor=/*laya.webgl.WebGLContext.ONE*/1; this.dFactor=/*laya.webgl.WebGLContext.ZERO*/0; this.frontFace=/*laya.webgl.WebGLContext.CW*/0x0900; } __class(RenderConfig,'laya.d3.core.render.RenderConfig'); return RenderConfig; })() /** *@private *RenderElement 类用于实现渲染物体。 */ //class laya.d3.core.render.RenderElement var RenderElement=(function(){ function RenderElement(){ this._type=0; this._mainSortID=0; this._renderObject=null; this._sprite3D=null; this._material=null; this._renderObj=null; this._staticBatch=null; this._batchIndexStart=0; this._batchIndexEnd=0; this._canDynamicBatch=false; this._canDynamicBatch=true; } __class(RenderElement,'laya.d3.core.render.RenderElement'); var __proto=RenderElement.prototype; /** *@private */ __proto.getStaticBatchBakedVertexs=function(index){ var byteSizeInFloat=4; var vb=this._renderObj._getVertexBuffer(index); var bakedVertexes=vb.getData().slice(); var vertexDeclaration=vb.vertexDeclaration; var positionOffset=vertexDeclaration.getVertexElementByUsage(/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION").offset / byteSizeInFloat; var normalOffset=vertexDeclaration.getVertexElementByUsage(/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL").offset / byteSizeInFloat; var rootTransform=this._staticBatch._rootSprite.transform.worldMatrix; var transform=this._sprite3D.transform.worldMatrix; var rootInvertMat=RenderElement._tempMatrix4x40; var result=RenderElement._tempMatrix4x41; rootTransform.invert(rootInvertMat); Matrix4x4.multiply(rootInvertMat,transform,result); var rotation=RenderElement._tempQuaternion0; result.decompose(RenderElement._tempVector30,rotation,RenderElement._tempVector31); var vertexFloatCount=vertexDeclaration.vertexStride / byteSizeInFloat; for (var i=0,n=bakedVertexes.length;i < n;i+=vertexFloatCount){ var posOffset=i+positionOffset; var norOffset=i+normalOffset; Utils3D.transformVector3ArrayToVector3ArrayCoordinate(bakedVertexes,posOffset,result,bakedVertexes,posOffset); Utils3D.transformVector3ArrayByQuat(bakedVertexes,normalOffset,rotation,bakedVertexes,normalOffset); } return bakedVertexes; } /** *@private */ __proto.getDynamicBatchBakedVertexs=function(index){ var byteSizeInFloat=4; var vb=this._renderObj._getVertexBuffer(index); var bakedVertexes=vb.getData().slice(); var vertexDeclaration=vb.vertexDeclaration; var positionOffset=vertexDeclaration.getVertexElementByUsage(/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION").offset / byteSizeInFloat; var normalOffset=vertexDeclaration.getVertexElementByUsage(/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL").offset / byteSizeInFloat; var transform=this._sprite3D.transform; var worldMatrix=transform.worldMatrix; var rotation=transform.rotation; var vertexFloatCount=vertexDeclaration.vertexStride / byteSizeInFloat; for (var i=0,n=bakedVertexes.length;i < n;i+=vertexFloatCount){ var posOffset=i+positionOffset; var norOffset=i+normalOffset; Utils3D.transformVector3ArrayToVector3ArrayCoordinate(bakedVertexes,posOffset,worldMatrix,bakedVertexes,posOffset); Utils3D.transformVector3ArrayByQuat(bakedVertexes,normalOffset,rotation,bakedVertexes,normalOffset); } return bakedVertexes; } /** *@private */ __proto.getBakedIndices=function(){ return this._renderObj._getIndexBuffer().getData(); } __getset(0,__proto,'renderObj',function(){ return this._renderObj; },function(value){ if (this._renderObj!==value){ this._renderObj=value; } }); __static(RenderElement, ['_tempVector30',function(){return this._tempVector30=new Vector3();},'_tempVector31',function(){return this._tempVector31=new Vector3();},'_tempQuaternion0',function(){return this._tempQuaternion0=new Quaternion();},'_tempMatrix4x40',function(){return this._tempMatrix4x40=new Matrix4x4();},'_tempMatrix4x41',function(){return this._tempMatrix4x41=new Matrix4x4();} ]); return RenderElement; })() /** *@private *RenderQuene 类用于实现渲染队列。 */ //class laya.d3.core.render.RenderQueue var RenderQueue=(function(){ function RenderQueue(renderConfig,scene){ this._id=0; this._needSort=false; this._renderElements=null; this._staticBatches=null; this._renderableRenderObjects=null; this._renderConfig=null; this._staticBatchCombineRenderElements=null; this._dynamicBatchCombineRenderElements=null; this._finalElements=null; this._scene=null; this._id=++RenderQueue._uniqueIDCounter; this._needSort=false; this._renderConfig=renderConfig; this._scene=scene; this._renderElements=[]; this._renderableRenderObjects=[]; this._staticBatchCombineRenderElements=[]; this._dynamicBatchCombineRenderElements=[]; this._staticBatches=[]; } __class(RenderQueue,'laya.d3.core.render.RenderQueue'); var __proto=RenderQueue.prototype; __proto._sortAlphaFunc=function(a,b){ if (a._renderObject && b._renderObject) return Vector3.distance(b._renderObject._boundingSphere.center,RenderQueue._cameraPosition)-Vector3.distance(a._renderObject._boundingSphere.center,RenderQueue._cameraPosition); else return 0; } /** *@private */ __proto._begainRenderElement=function(state,renderObj,material){ if (renderObj._beforeRender(state)){ state.shaderValue.pushArray(renderObj._getVertexBuffer(0).vertexDeclaration.shaderValues); return true; } return false; } /** *@private */ __proto._endRenderElement=function(state,renderObj,material){ material._upload(state,renderObj._getVertexBuffer(0).vertexDeclaration,null); renderObj._render(state); } /** *@private *更新组件preRenderUpdate函数 *@param state 渲染相关状态 */ __proto._preRenderUpdateComponents=function(sprite3D,state){ for (var i=0;i < sprite3D.componentsCount;i++){ var component=sprite3D.getComponentByIndex(i); (!component.started)&& (component._start(state),component.started=true); (component.isActive)&& (component._preRenderUpdate(state)); } } /** *@private *更新组件postRenderUpdate函数 *@param state 渲染相关状态 */ __proto._postRenderUpdateComponents=function(sprite3D,state){ for (var i=0;i < sprite3D.componentsCount;i++){ var component=sprite3D.getComponentByIndex(i); (!component.started)&& (component._start(state),component.started=true); (component.isActive)&& (component._postRenderUpdate(state)); } } /** *@private */ __proto._sortAlpha=function(cameraPos){ RenderQueue._cameraPosition=cameraPos; this._finalElements.sort(this._sortAlphaFunc); } /** *@private *应用渲染状态到显卡。 *@param gl WebGL上下文。 */ __proto._setState=function(gl,state){ WebGLContext.setDepthTest(gl,this._renderConfig.depthTest); WebGLContext.setDepthMask(gl,this._renderConfig.depthMask); WebGLContext.setBlend(gl,this._renderConfig.blend); WebGLContext.setBlendFunc(gl,this._renderConfig.sFactor,this._renderConfig.dFactor); WebGLContext.setCullFace(gl,this._renderConfig.cullFace); if (state.camera.renderTarget) WebGLContext.setFrontFaceCCW(gl,this._renderConfig.frontFace===/*laya.webgl.WebGLContext.CW*/0x0900 ? /*laya.webgl.WebGLContext.CCW*/0x0901 :/*laya.webgl.WebGLContext.CW*/0x0900); else WebGLContext.setFrontFaceCCW(gl,this._renderConfig.frontFace); } /** *@private *准备渲染队列。 *@param state 渲染状态。 */ __proto._preRender=function(state){ this._staticBatchCombineRenderElements.length=0; for (var i=0,n=this._staticBatches.length;i < n;i++) this._staticBatches[i]._getRenderElement(this._staticBatchCombineRenderElements); this._finalElements=this._renderElements.concat(this._staticBatchCombineRenderElements,this._dynamicBatchCombineRenderElements); } /** *@private *渲染队列。 *@param state 渲染状态。 */ __proto._render=function(state){ var preShaderValue=state.shaderValue.length; var preShadeDef=state.shaderDefines.getValue(); for (var i=0,n=this._finalElements.length;i < n;i++){ var renderElement=this._finalElements[i]; var renderObj,material; if (renderElement._type===0){ var owner=renderElement._sprite3D; state.owner=owner; state.renderElement=renderElement; this._preRenderUpdateComponents(owner,state); renderObj=renderElement.renderObj,material=renderElement._material; if (this._begainRenderElement(state,renderObj,material)){ material._setLoopShaderParams(state,state.projectionViewMatrix,owner.transform.worldMatrix,renderElement.renderObj,material); this._endRenderElement(state,renderObj,material); } this._postRenderUpdateComponents(owner,state); }else if (renderElement._type===1){ var staticBatch=renderElement.renderObj; state.owner=null; state.renderElement=renderElement; state._batchIndexStart=renderElement._batchIndexStart; state._batchIndexEnd=renderElement._batchIndexEnd; renderObj=renderElement.renderObj,material=renderElement._material; if (this._begainRenderElement(state,renderObj,material)){ renderElement._material._setLoopShaderParams(state,state.projectionViewMatrix,staticBatch._rootSprite.transform.worldMatrix,renderElement.renderObj,renderElement._material); this._endRenderElement(state,renderObj,material); } }else if (renderElement._type===2){ var dynamicBatch=renderElement.renderObj; state.owner=null; state.renderElement=renderElement; state._batchIndexStart=renderElement._batchIndexStart; state._batchIndexEnd=renderElement._batchIndexEnd; renderObj=renderElement.renderObj,material=renderElement._material; if (this._begainRenderElement(state,renderObj,material)){ renderElement._material._setLoopShaderParams(state,state.projectionViewMatrix,Matrix4x4.DEFAULT,renderElement.renderObj,renderElement._material); this._endRenderElement(state,renderObj,material); } } state.shaderDefines.setValue(preShadeDef); state.shaderValue.length=preShaderValue; } } /** *清空队列中的渲染物体。 */ __proto._clearRenderElements=function(){ this._staticBatches.length=0; this._dynamicBatchCombineRenderElements.length=0; this._renderElements.length=0; this._needSort=true; } /** *添加渲染物体。 *@param renderObj 渲染物体。 */ __proto._addRenderElement=function(renderElement){ this._renderElements.push(renderElement); this._needSort=true; } /** *添加静态批处理。 *@param renderObj 静态批处理。 */ __proto._addStaticBatch=function(staticBatch){ this._staticBatches.push(staticBatch) } /** *添加动态批处理。 *@param renderObj 动态批处理。 */ __proto._addDynamicBatchElement=function(dynamicBatchElement){ this._dynamicBatchCombineRenderElements.push(dynamicBatchElement); } /** *获取唯一标识ID(通常用于优化或识别)。 */ __getset(0,__proto,'id',function(){ return this._id; }); RenderQueue._uniqueIDCounter=0; RenderQueue.OPAQUE=1; RenderQueue.OPAQUE_DOUBLEFACE=2; RenderQueue.ALPHA_BLEND=3; RenderQueue.ALPHA_BLEND_DOUBLEFACE=4; RenderQueue.ALPHA_ADDTIVE_BLEND=5; RenderQueue.ALPHA_ADDTIVE_BLEND_DOUBLEFACE=6; RenderQueue.DEPTHREAD_ALPHA_BLEND=7; RenderQueue.DEPTHREAD_ALPHA_BLEND_DOUBLEFACE=8; RenderQueue.DEPTHREAD_ALPHA_ADDTIVE_BLEND=9; RenderQueue.DEPTHREAD_ALPHA_ADDTIVE_BLEND_DOUBLEFACE=10; RenderQueue.NONDEPTH_ALPHA_BLEND=11; RenderQueue.NONDEPTH_ALPHA_BLEND_DOUBLEFACE=12; RenderQueue.NONDEPTH_ALPHA_ADDTIVE_BLEND=13; RenderQueue.NONDEPTH_ALPHA_ADDTIVE_BLEND_DOUBLEFACE=14; RenderQueue._cameraPosition=null return RenderQueue; })() /** *RenderState 类用于实现渲染状态。 */ //class laya.d3.core.render.RenderState var RenderState=(function(){ function RenderState(){ this.elapsedTime=NaN; this.loopCount=0; this.context=null; this.scene=null; this.owner=null; this.renderElement=null; this._staticBatch=null; this._batchIndexStart=0; this._batchIndexEnd=0; this.camera=null; this.viewMatrix=null; this.projectionMatrix=null; this.projectionViewMatrix=null; this.cameraBoundingFrustum=null; this.viewport=null; this.shaderValue=new ValusArray; this.shaderDefines=new ShaderDefines3D(); this.reset(); } __class(RenderState,'laya.d3.core.render.RenderState'); var __proto=RenderState.prototype; /** *重置。 */ __proto.reset=function(){ this.shaderValue.length=0; this.shaderDefines.setValue(0); } RenderState.VERTEXSHADERING=0x04; RenderState.PIXELSHADERING=0x08; RenderState.clientWidth=0; RenderState.clientHeight=0; return RenderState; })() /** *@private *DynamicBatch 类用于动态批处理。 */ //class laya.d3.graphics.DynamicBatch var DynamicBatch=(function(){ function DynamicBatch(vertexDeclaration){ this._vertexDeclaration=null; this._vertexDatas=null; this._indexDatas=null; this._vertexBuffer=null; this._indexBuffer=null; this._currentCombineVertexCount=0; this._currentCombineIndexCount=0; this._combineRenderElements=null; this._materials=null; this._materialToRenderElementsOffsets=null; this._merageElements=null; this._combineRenderElementPool=null; this._combineRenderElementPoolIndex=0; this._currentCombineVertexCount=0; this._currentCombineIndexCount=0; this._combineRenderElements=[]; this._materialToRenderElementsOffsets=[]; this._materials=[]; this._merageElements=[]; this._combineRenderElementPool=[]; this._combineRenderElementPoolIndex=0; this._vertexDeclaration=vertexDeclaration; } __class(DynamicBatch,'laya.d3.graphics.DynamicBatch'); var __proto=DynamicBatch.prototype; Laya.imps(__proto,{"laya.d3.core.render.IRenderable":true}) __proto._getVertexBuffer=function(index){ (index===void 0)&& (index=0); if (index===0) return this._vertexBuffer; else return null; } __proto._getIndexBuffer=function(){ return this._indexBuffer; } __proto._getCombineRenderElementFromPool=function(){ var renderElement=this._combineRenderElementPool[this._combineRenderElementPoolIndex++]; return renderElement || (this._combineRenderElementPool[this._combineRenderElementPoolIndex-1]=new RenderElement()); } __proto._getRenderElement=function(){ if (!this._vertexDatas){ this._vertexDatas=new Float32Array(this._vertexDeclaration.vertexStride / 4 *DynamicBatch.maxVertexCount); this._indexDatas=new Uint16Array(DynamicBatch.maxIndexCount); this._vertexBuffer=VertexBuffer3D.create(this._vertexDeclaration,DynamicBatch.maxVertexCount,/*laya.webgl.WebGLContext.DYNAMIC_DRAW*/0x88E8); this._indexBuffer=IndexBuffer3D.create(/*laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort",DynamicBatch.maxIndexCount,/*laya.webgl.WebGLContext.DYNAMIC_DRAW*/0x88E8); } this._merageElements.length=0; var curMerVerCount=0; var curIndexCount=0; for (var i=0,n=this._combineRenderElements.length;i < n;i++){ var renderElement=this._combineRenderElements[i]; var subVertexDatas=renderElement.getDynamicBatchBakedVertexs(0); var subIndexDatas=renderElement.getBakedIndices(); var indexOffset=curMerVerCount / (this._vertexDeclaration.vertexStride / 4); var indexStart=curIndexCount; var indexEnd=indexStart+subIndexDatas.length; renderElement._batchIndexStart=indexStart; renderElement._batchIndexEnd=indexEnd; this._indexDatas.set(subIndexDatas,curIndexCount); for (var k=indexStart;k < indexEnd;k++) this._indexDatas[k]=indexOffset+this._indexDatas[k]; curIndexCount+=subIndexDatas.length; this._vertexDatas.set(subVertexDatas,curMerVerCount); curMerVerCount+=subVertexDatas.length; } this._vertexBuffer.setData(this._vertexDatas); this._indexBuffer.setData(this._indexDatas); this._combineRenderElementPoolIndex=0; for (i=0,n=this._materials.length;i < n;i++){ var merageElement=this._getCombineRenderElementFromPool(); merageElement._type=2; merageElement._staticBatch=null; merageElement.renderObj=this; var renderElementStartIndex=this._combineRenderElements[this._materialToRenderElementsOffsets[i]]._batchIndexStart; var renderElementEndIndex=(i+1===this._materialToRenderElementsOffsets.length)? curIndexCount :this._combineRenderElements[this._materialToRenderElementsOffsets[i+1]]._batchIndexStart; merageElement._batchIndexStart=renderElementStartIndex; merageElement._batchIndexEnd=renderElementEndIndex; merageElement._material=this._materials[i]; this._merageElements.push(merageElement); } } __proto._addCombineRenderObjTest=function(renderElement){ var renderObj=renderElement.renderObj; var indexCount=this._currentCombineIndexCount+renderObj._getIndexBuffer().indexCount; var vertexCount=this._currentCombineVertexCount+renderObj._getVertexBuffer().vertexCount; if (vertexCount > DynamicBatch.maxVertexCount || indexCount > DynamicBatch.maxIndexCount){ return false; } return true; } __proto._addCombineRenderObj=function(renderElement){ var renderObj=renderElement.renderObj; this._combineRenderElements.push(renderElement); this._currentCombineIndexCount=this._currentCombineIndexCount+renderObj._getIndexBuffer().indexCount; this._currentCombineVertexCount=this._currentCombineVertexCount+renderObj._getVertexBuffer().vertexCount; } __proto._addCombineMaterial=function(material){ this._materials.push(material); } __proto._addMaterialToRenderElementOffset=function(offset){ this._materialToRenderElementsOffsets.push(offset); } __proto._clearRenderElements=function(){ this._combineRenderElements.length=0; this._materials.length=0; this._materialToRenderElementsOffsets.length=0; this._currentCombineVertexCount=0; this._currentCombineIndexCount=0; } __proto._addToRenderQueue=function(scene){ this._getRenderElement(); for (var i=0,n=this._materials.length;i < n;i++) scene.getRenderQueue(this._materials[i].renderQueue)._addDynamicBatchElement(this._merageElements[i]); } __proto._beforeRender=function(state){ this._vertexBuffer._bind(); this._indexBuffer._bind(); return true; } __proto._render=function(state){ var indexCount=state._batchIndexEnd-state._batchIndexStart; state.context.drawElements(/*laya.webgl.WebGLContext.TRIANGLES*/0x0004,indexCount,/*laya.webgl.WebGLContext.UNSIGNED_SHORT*/0x1403,state._batchIndexStart *2); Stat.drawCall++; Stat.trianglesFaces+=indexCount / 3; } __getset(0,__proto,'indexOfHost',function(){ return 0; }); __getset(0,__proto,'_vertexBufferCount',function(){ return 1; }); __getset(0,__proto,'triangleCount',function(){ return this._indexBuffer.indexCount / 3; }); __getset(0,__proto,'combineRenderElementsCount',function(){ return this._combineRenderElements.length; }); DynamicBatch.maxVertexCount=20000; DynamicBatch.maxIndexCount=40000; DynamicBatch.maxCombineTriangleCount=50; return DynamicBatch; })() /** *@private *DynamicBatchManager 类用于管理动态批处理。 */ //class laya.d3.graphics.DynamicBatchManager var DynamicBatchManager=(function(){ function DynamicBatchManager(){ this._dynamicBatches=null; this._prepareDynamicBatchCombineElements=null; this._dynamicBatches={}; this._prepareDynamicBatchCombineElements=[]; } __class(DynamicBatchManager,'laya.d3.graphics.DynamicBatchManager'); var __proto=DynamicBatchManager.prototype; __proto.getDynamicBatch=function(_vertexDeclaration,number){ var dynamicBatch; var key=_vertexDeclaration.id.toString()+number; if (!this._dynamicBatches[key]){ this._dynamicBatches[key]=dynamicBatch=new DynamicBatch(_vertexDeclaration); }else { dynamicBatch=this._dynamicBatches[key]; } return dynamicBatch; } /**需手动调用*/ __proto._garbageCollection=function(){ for (var key in this._dynamicBatches) if (this._dynamicBatches[key].combineRenderElementsCount===0) delete this._dynamicBatches[key]; } __proto._addPrepareRenderElement=function(renderElement){ this._prepareDynamicBatchCombineElements.push(renderElement); } /**@private */ __proto._finishCombineDynamicBatch=function(scene){ this._prepareDynamicBatchCombineElements.sort(DynamicBatchManager._sortPrepareDynamicBatch); var lastMaterial; var lastVertexDeclaration; var lastRenderElement; var lastBatchNumber=-1; var lastCanMerage=true; var curMaterial; var curRenderElement; var curDynamicBatch; var curbatchNumber=0; var laterAddMaterial; var laterAddRenderElement; var laterAddMatToElementOffset=-1; for (var i=0,n=this._prepareDynamicBatchCombineElements.length;i < n;i++){ curRenderElement=this._prepareDynamicBatchCombineElements[i]; var curDeclaration=curRenderElement.renderObj._getVertexBuffer(0).vertexDeclaration; var declarationChanged=(lastVertexDeclaration!==curDeclaration); declarationChanged && (curbatchNumber=0,lastVertexDeclaration=curDeclaration); var batchNumbrChanged=(curbatchNumber!==lastBatchNumber); batchNumbrChanged && (lastBatchNumber=curbatchNumber); if ((declarationChanged)|| batchNumbrChanged){ curDynamicBatch=this.getDynamicBatch(curDeclaration,curbatchNumber); lastMaterial=null; } if (lastCanMerage){ if (curDynamicBatch._addCombineRenderObjTest(curRenderElement)){ curMaterial=curRenderElement._material; if (lastMaterial!==curMaterial){ if (laterAddMaterial){ scene.getRenderQueue(laterAddRenderElement._material.renderQueue)._addRenderElement(laterAddRenderElement); laterAddMaterial=null; laterAddRenderElement=null; laterAddMatToElementOffset=-1; } laterAddMaterial=curMaterial; laterAddMatToElementOffset=curDynamicBatch.combineRenderElementsCount; laterAddRenderElement=curRenderElement; lastMaterial=curMaterial; }else { if (laterAddMaterial){ var lastRenderObj=laterAddRenderElement.renderObj; var curRenderObj=curRenderElement.renderObj; if (((lastRenderObj._getVertexBuffer().vertexCount+curRenderObj._getVertexBuffer().vertexCount)> DynamicBatch.maxVertexCount)|| ((lastRenderObj._getIndexBuffer().indexCount+curRenderObj._getIndexBuffer().indexCount)> DynamicBatch.maxIndexCount)){ scene.getRenderQueue(laterAddRenderElement._material.renderQueue)._addRenderElement(laterAddRenderElement); laterAddMaterial=curMaterial; laterAddMatToElementOffset=curDynamicBatch.combineRenderElementsCount; laterAddRenderElement=curRenderElement; }else { curDynamicBatch._addCombineMaterial(laterAddMaterial); curDynamicBatch._addMaterialToRenderElementOffset(laterAddMatToElementOffset); curDynamicBatch._addCombineRenderObj(laterAddRenderElement); laterAddMaterial=null; laterAddRenderElement=null; laterAddMatToElementOffset=-1; curDynamicBatch._addCombineRenderObj(curRenderElement); } }else { curDynamicBatch._addCombineRenderObj(curRenderElement); } } lastCanMerage=true; }else { if (laterAddMaterial){ scene.getRenderQueue(laterAddRenderElement._material.renderQueue)._addRenderElement(laterAddRenderElement); laterAddMaterial=null; laterAddRenderElement=null; laterAddMatToElementOffset=-1; } curbatchNumber++; lastCanMerage=false; } }else { lastRenderElement=this._prepareDynamicBatchCombineElements[i-1]; curDynamicBatch._addMaterialToRenderElementOffset(curDynamicBatch.combineRenderElementsCount); lastMaterial=lastRenderElement._material; curDynamicBatch._addCombineMaterial(lastMaterial); curDynamicBatch._addCombineRenderObj(lastRenderElement); lastCanMerage=true; curMaterial=curRenderElement._material; if (lastMaterial!==curMaterial){ laterAddMaterial=curMaterial; laterAddMatToElementOffset=curDynamicBatch.combineRenderElementsCount; laterAddRenderElement=curRenderElement; }else { curDynamicBatch._addCombineRenderObj(curRenderElement); } lastMaterial=curMaterial; } } if (laterAddMaterial){ scene.getRenderQueue(laterAddRenderElement._material.renderQueue)._addRenderElement(laterAddRenderElement); laterAddMaterial=null; laterAddRenderElement=null; laterAddMatToElementOffset=-1; } this._prepareDynamicBatchCombineElements.length=0; } __proto._clearRenderElements=function(){ for (var key in this._dynamicBatches) this._dynamicBatches[key]._clearRenderElements(); } __proto._addToRenderQueue=function(scene){ for (var key in this._dynamicBatches){ var dynamicBatch=this._dynamicBatches[key]; (dynamicBatch.combineRenderElementsCount > 0)&& (dynamicBatch._addToRenderQueue(scene)); } } __proto.dispose=function(){ this._dynamicBatches=null; } DynamicBatchManager._sortPrepareDynamicBatch=function(a,b){ return a._mainSortID-b._mainSortID; } return DynamicBatchManager; })() /** *... *@author ... */ //class laya.d3.graphics.FrustumCulling var FrustumCulling=(function(){ function FrustumCulling(){} __class(FrustumCulling,'laya.d3.graphics.FrustumCulling'); FrustumCulling.RenderObjectCulling=function(boundFrustum,scene){ var i=0,iNum=0,j=0,jNum=0; var frustumCullingObject; var renderElement; var curRenderQueue; var queues=scene._quenes; var staticBatchMananger=scene._staticBatchManager; var dynamicBatchManager=scene._dynamicBatchManager; var frustumCullingObjects=scene._frustumCullingObjects; for (i=0,iNum=queues.length;i < iNum;i++) (queues[i])&& (queues[i]._clearRenderElements()); staticBatchMananger._clearRenderElements(); dynamicBatchManager._clearRenderElements(); for (i=0,iNum=frustumCullingObjects.length;i < iNum;i++){ frustumCullingObject=frustumCullingObjects[i]; if (Layer.isVisible(frustumCullingObject._layerMask)&& frustumCullingObject._ownerEnable && frustumCullingObject._enable && (boundFrustum.ContainsBoundSphere(frustumCullingObject._boundingSphere)!==/*laya.d3.math.ContainmentType.Disjoint*/0)){ for (j=0,jNum=frustumCullingObject._renderElements.length;j < jNum;j++){ renderElement=frustumCullingObject._renderElements[j]; var staticBatch=renderElement._staticBatch; if (staticBatch && (staticBatch._material===renderElement._material)){ staticBatch._addRenderElement(renderElement); }else { var renderObj=renderElement.renderObj; if ((renderObj.triangleCount < /*laya.d3.graphics.DynamicBatch.maxCombineTriangleCount*/50)&& (renderObj._vertexBufferCount===1)&& (renderObj._getIndexBuffer())&&(renderElement._material.renderQueue<3)&&renderElement._canDynamicBatch) dynamicBatchManager._addPrepareRenderElement(renderElement); else scene.getRenderQueue(renderElement._material.renderQueue)._addRenderElement(renderElement); } } } } staticBatchMananger._addToRenderQueue(scene); dynamicBatchManager._finishCombineDynamicBatch(scene); dynamicBatchManager._addToRenderQueue(scene); } return FrustumCulling; })() /** *... *@author ... */ //class laya.d3.graphics.RenderObject var RenderObject=(function(){ function RenderObject(){ this._render=null; this._renderElements=null; this._layerMask=0; this._ownerEnable=false; this._enable=false; this._renderElements=[]; } __class(RenderObject,'laya.d3.graphics.RenderObject'); var __proto=RenderObject.prototype; __getset(0,__proto,'_boundingSphere',function(){ return this._render.boundingSphere; }); return RenderObject; })() /** *@private *StaticBatch 类用于静态批处理。 */ //class laya.d3.graphics.StaticBatch var StaticBatch=(function(){ function StaticBatch(rootSprite,vertexDeclaration,material){ this._vertexBuffer=null; this._indexBuffer=null; this._renderElements=null; this._combineRenderElementPool=null; this._combineRenderElementPoolIndex=0; this._combineRenderElements=null; this._currentCombineVertexCount=0; this._currentCombineIndexCount=0; this._needFinishCombine=false; this._rootSprite=null; this._vertexDeclaration=null; this._material=null; this._currentCombineVertexCount=0; this._currentCombineIndexCount=0; this._needFinishCombine=false; this._renderElements=[]; this._combineRenderElements=[]; this._combineRenderElementPool=[]; this._combineRenderElementPoolIndex=0; this._rootSprite=rootSprite; this._vertexDeclaration=vertexDeclaration; this._material=material; } __class(StaticBatch,'laya.d3.graphics.StaticBatch'); var __proto=StaticBatch.prototype; Laya.imps(__proto,{"laya.d3.core.render.IRenderable":true}) __proto._getVertexBuffer=function(index){ (index===void 0)&& (index=0); if (index===0) return this._vertexBuffer; else return null; } __proto._getIndexBuffer=function(){ return this._indexBuffer; } __proto._getCombineRenderElementFromPool=function(){ var renderElement=this._combineRenderElementPool[this._combineRenderElementPoolIndex++]; return renderElement || (this._combineRenderElementPool[this._combineRenderElementPoolIndex-1]=new RenderElement()); } __proto._addCombineRenderObjTest=function(renderElement){ var renderObj=renderElement.renderObj; var vertexCount=this._currentCombineVertexCount+renderObj._getVertexBuffer().vertexCount; if (vertexCount > StaticBatch.maxVertexCount){ return false; } return true; } __proto._addCombineRenderObj=function(renderElement){ var renderObj=renderElement.renderObj; this._combineRenderElements.push(renderElement); renderElement._staticBatch=this; this._currentCombineIndexCount=this._currentCombineIndexCount+renderObj._getIndexBuffer().indexCount; this._currentCombineVertexCount=this._currentCombineVertexCount+renderObj._getVertexBuffer().vertexCount; this._needFinishCombine=true; } __proto._deleteCombineRenderObj=function(renderElement){ var renderObj=renderElement.renderObj; var index=this._combineRenderElements.indexOf(renderElement); if (index!==-1){ this._combineRenderElements.splice(index,1); renderElement._staticBatch=null; this._currentCombineIndexCount=this._currentCombineIndexCount-renderObj._getIndexBuffer().indexCount; this._currentCombineVertexCount=this._currentCombineVertexCount-renderObj._getVertexBuffer().vertexCount; this._needFinishCombine=true; } } __proto._finshCombine=function(){ if (this._needFinishCombine){ var curMerVerCount=0; var curIndexCount=0; var vertexDatas=new Float32Array(this._vertexDeclaration.vertexStride / 4 *this._currentCombineVertexCount); var indexDatas=new Uint16Array(this._currentCombineIndexCount); if (this._vertexBuffer){ this._vertexBuffer.dispose(); this._indexBuffer.dispose(); } this._vertexBuffer=VertexBuffer3D.create(this._vertexDeclaration,this._currentCombineVertexCount,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4); this._indexBuffer=IndexBuffer3D.create(/*laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort",this._currentCombineIndexCount,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4); for (var i=0,n=this._combineRenderElements.length;i < n;i++){ var renderElement=this._combineRenderElements[i]; var subVertexDatas=renderElement.getStaticBatchBakedVertexs(0); var subIndexDatas=renderElement.getBakedIndices(); var indexOffset=curMerVerCount / (this._vertexDeclaration.vertexStride / 4); var indexStart=curIndexCount; var indexEnd=indexStart+subIndexDatas.length; renderElement._batchIndexStart=indexStart; renderElement._batchIndexEnd=indexEnd; indexDatas.set(subIndexDatas,curIndexCount); for (var k=indexStart;k < indexEnd;k++) indexDatas[k]=indexOffset+indexDatas[k]; curIndexCount+=subIndexDatas.length; vertexDatas.set(subVertexDatas,curMerVerCount); curMerVerCount+=subVertexDatas.length; } this._vertexBuffer.setData(vertexDatas); this._indexBuffer.setData(indexDatas); this._needFinishCombine=false; } } __proto._clearRenderElements=function(){ this._renderElements.length=0; } __proto._addRenderElement=function(renderElement){ for (var i=0,n=this._renderElements.length;i < n;i++){ if (this._renderElements[i]._batchIndexStart > renderElement._batchIndexStart){ this._renderElements.splice(i,0,renderElement); return; } } this._renderElements.push(renderElement); } __proto._getRenderElement=function(mergeElements){ this._combineRenderElementPoolIndex=0; var length=this._renderElements.length; var merageElement=this._getCombineRenderElementFromPool(); merageElement._type=1; merageElement._staticBatch=null; merageElement.renderObj=this; merageElement._batchIndexStart=this._renderElements[0]._batchIndexStart; merageElement._batchIndexEnd=this._renderElements[0]._batchIndexEnd; merageElement._material=this._material; merageElement._material=this._material; mergeElements.push(merageElement); if (length > 1){ for (var i=1;i < length;i++){ var renderElement=this._renderElements[i]; if (this._renderElements[i-1]._batchIndexEnd!==renderElement._batchIndexStart){ merageElement=this._getCombineRenderElementFromPool(); merageElement._type=1; merageElement._staticBatch=null; merageElement.renderObj=this; merageElement._batchIndexStart=renderElement._batchIndexStart; merageElement._batchIndexEnd=renderElement._batchIndexEnd; merageElement._material=this._material; mergeElements.push(merageElement); }else { merageElement._batchIndexEnd=renderElement._batchIndexEnd; } } } } __proto._addToRenderQueue=function(scene){ (this._renderElements.length > 0)&& (scene.getRenderQueue(this._material.renderQueue)._addStaticBatch(this)); } //TODO:>0移到外层 __proto._beforeRender=function(state){ this._vertexBuffer._bind(); this._indexBuffer._bind(); return true; } __proto._render=function(state){ var indexCount=state._batchIndexEnd-state._batchIndexStart; state.context.drawElements(/*laya.webgl.WebGLContext.TRIANGLES*/0x0004,indexCount,/*laya.webgl.WebGLContext.UNSIGNED_SHORT*/0x1403,state._batchIndexStart *2); Stat.drawCall++; Stat.trianglesFaces+=indexCount / 3; } __getset(0,__proto,'_vertexBufferCount',function(){ return 1; }); __getset(0,__proto,'indexOfHost',function(){ return 0; }); __getset(0,__proto,'triangleCount',function(){ return this._indexBuffer.indexCount / 3; }); StaticBatch._addToRenderQueueStaticBatch=function(scene,sprite3D){ var i=0,n=0; if (((sprite3D instanceof laya.d3.core.MeshSprite3D ))&& (sprite3D.isStatic)){ var renderElements=(sprite3D).meshRender.renderObject._renderElements; for (i=0,n=renderElements.length;i < n;i++){ var renderElement=renderElements[i]; if (renderElement.renderObj._vertexBufferCount===1) scene._staticBatchManager._addPrepareRenderElement(renderElement); } } for (i=0,n=sprite3D.numChildren;i < n;i++) StaticBatch._addToRenderQueueStaticBatch(scene,sprite3D._childs [i]); } StaticBatch.combine=function(staticBatchRoot){ var scene=staticBatchRoot.scene; if (!scene) throw new Error("BaseScene: staticBatchRoot is not a part of scene."); StaticBatch._addToRenderQueueStaticBatch(scene,staticBatchRoot); scene._staticBatchManager._finishCombineStaticBatch(staticBatchRoot); } StaticBatch.maxVertexCount=65535; return StaticBatch; })() /** *@private *StaticBatchManager 类用于管理静态批处理。 */ //class laya.d3.graphics.StaticBatchManager var StaticBatchManager=(function(){ function StaticBatchManager(){ this._staticBatches=null; this._prepareStaticBatchCombineElements=null; this._staticBatches={}; this._prepareStaticBatchCombineElements=[]; } __class(StaticBatchManager,'laya.d3.graphics.StaticBatchManager'); var __proto=StaticBatchManager.prototype; /**完成合并*/ __proto._finshCombine=function(){ for (var key in this._staticBatches) this._staticBatches[key]._finshCombine(); } __proto.getStaticBatch=function(rootSprite,_vertexDeclaration,material,number){ var staticBatch; var key=rootSprite.id.toString()+material.id.toString()+_vertexDeclaration.id.toString()+number; if (!this._staticBatches[key]){ this._staticBatches[key]=staticBatch=new StaticBatch(rootSprite,_vertexDeclaration,material); }else { staticBatch=this._staticBatches[key]; } return staticBatch; } /**@private 通常应在所有getStaticBatchQneue函数相关操作结束后执行*/ __proto._garbageCollection=function(){ for (var key in this._staticBatches) if (this._staticBatches[key].combineRenderElementsCount===0) delete this._staticBatches[key]; } /**@private */ __proto._addPrepareRenderElement=function(renderElement){ this._prepareStaticBatchCombineElements.push(renderElement); } /**@private */ __proto._finishCombineStaticBatch=function(rootSprite){ this._prepareStaticBatchCombineElements.sort(StaticBatchManager._sortPrepareStaticBatch); var lastMaterial; var lastVertexDeclaration; var lastCanMerage=false; var curStaticBatch; var renderElement; var lastRenderObj; var vb; var oldStaticBatch; var batchNumber=0; for (var i=0,n=this._prepareStaticBatchCombineElements.length;i < n;i++){ renderElement=this._prepareStaticBatchCombineElements[i]; vb=renderElement.renderObj._getVertexBuffer(0); if ((lastVertexDeclaration===vb.vertexDeclaration)&& (lastMaterial===renderElement._material)){ if (!lastCanMerage){ lastRenderObj=this._prepareStaticBatchCombineElements[i-1]; var lastRenderElement=lastRenderObj.renderObj; var curRenderElement=renderElement.renderObj; if (((lastRenderElement._getVertexBuffer().vertexCount+curRenderElement._getVertexBuffer().vertexCount)> StaticBatch.maxVertexCount)){ lastCanMerage=false; }else { curStaticBatch=this.getStaticBatch(rootSprite,lastVertexDeclaration,lastMaterial,batchNumber); oldStaticBatch=lastRenderObj._staticBatch; (oldStaticBatch)&& (oldStaticBatch!==curStaticBatch)&& (oldStaticBatch._deleteCombineRenderObj(lastRenderObj)); curStaticBatch._addCombineRenderObj(lastRenderObj); oldStaticBatch=renderElement._staticBatch; (oldStaticBatch)&& (oldStaticBatch!==curStaticBatch)&& (oldStaticBatch._deleteCombineRenderObj(renderElement)); curStaticBatch._addCombineRenderObj(renderElement); lastCanMerage=true; } }else { if (!curStaticBatch._addCombineRenderObjTest(renderElement)){ lastCanMerage=false; batchNumber++; }else { oldStaticBatch=renderElement._staticBatch; (oldStaticBatch)&& (oldStaticBatch!==curStaticBatch)&& (oldStaticBatch._deleteCombineRenderObj(renderElement)); curStaticBatch._addCombineRenderObj(renderElement) } } }else { lastCanMerage=false; batchNumber=0; } lastMaterial=renderElement._material; lastVertexDeclaration=vb.vertexDeclaration; } this._garbageCollection(); this._finshCombine(); this._prepareStaticBatchCombineElements.length=0; } __proto._clearRenderElements=function(){ for (var key in this._staticBatches) this._staticBatches[key]._clearRenderElements(); } __proto._addToRenderQueue=function(scene){ for (var key in this._staticBatches) this._staticBatches[key]._addToRenderQueue(scene); } __proto.dispose=function(){ this._staticBatches=null; } StaticBatchManager._sortPrepareStaticBatch=function(a,b){ var id=a._mainSortID-b._mainSortID; return (id===0)? (a.renderObj.triangleCount-b.renderObj.triangleCount):id; } return StaticBatchManager; })() /** *... *@author ... */ //class laya.d3.graphics.VertexDeclaration var VertexDeclaration=(function(){ function VertexDeclaration(vertexStride,vertexElements){ this._id=0; this._shaderValues=null; this._shaderDefineValue=0; this._vertexStride=0; this._vertexElements=null; this._vertexElementsDic=null; this._id=++VertexDeclaration._uniqueIDCounter; if (this._id > VertexDeclaration.maxVertexDeclaration) throw new Error("VertexDeclaration: VertexDeclaration count should not large than ",VertexDeclaration.maxVertexDeclaration); this._shaderValues=new ValusArray(); this._vertexElementsDic={}; this._vertexStride=vertexStride; this._vertexElements=vertexElements; for (var i=0;i < vertexElements.length;i++){ var vertexElement=vertexElements[i]; var attributeName=vertexElement.elementUsage; this._vertexElementsDic[attributeName]=vertexElement; var value=[VertexDeclaration._getTypeSize(vertexElement.elementFormat)/ 4,/*laya.webgl.WebGLContext.FLOAT*/0x1406,false,this._vertexStride,vertexElement.offset]; this._shaderValues.pushValue(attributeName,value); switch (attributeName){ case /*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV": this._shaderDefineValue |=/*laya.d3.shader.ShaderDefines3D.UV*/0x400; break ; case /*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR": this._shaderDefineValue |=/*laya.d3.shader.ShaderDefines3D.COLOR*/0x800; break ; } } } __class(VertexDeclaration,'laya.d3.graphics.VertexDeclaration'); var __proto=VertexDeclaration.prototype; __proto.getVertexElements=function(){ return this._vertexElements.slice(); } __proto.getVertexElementByUsage=function(usage){ return this._vertexElementsDic[usage]; } __proto.unBinding=function(){} __getset(0,__proto,'shaderDefineValue',function(){ return this._shaderDefineValue; }); /** *获取唯一标识ID(通常用于优化或识别)。 *@return 唯一标识ID */ __getset(0,__proto,'id',function(){ return this._id; }); __getset(0,__proto,'vertexStride',function(){ return this._vertexStride; }); __getset(0,__proto,'shaderValues',function(){ return this._shaderValues; }); VertexDeclaration._getTypeSize=function(format){ switch (format){ case /*laya.d3.graphics.VertexElementFormat.Single*/"single": return 4; case /*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2": return 8; case /*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3": return 12; case /*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4": return 16; case /*laya.d3.graphics.VertexElementFormat.Color*/"color": return 4; case /*laya.d3.graphics.VertexElementFormat.Byte4*/"byte4": return 4; case /*laya.d3.graphics.VertexElementFormat.Short2*/"short2": return 4; case /*laya.d3.graphics.VertexElementFormat.Short4*/"short4": return 8; case /*laya.d3.graphics.VertexElementFormat.NormalizedShort2*/"normalizedshort2": return 4; case /*laya.d3.graphics.VertexElementFormat.NormalizedShort4*/"normalizedshort4": return 8; case /*laya.d3.graphics.VertexElementFormat.HalfVector2*/"halfvector2": return 4; case /*laya.d3.graphics.VertexElementFormat.HalfVector4*/"halfvector4": return 8; } return 0; } VertexDeclaration.getVertexStride=function(vertexElements){ var curStride=0; for (var i=0;i < vertexElements.Length;i++){ var element=vertexElements[i]; var stride=element.offset+VertexDeclaration._getTypeSize(element.elementFormat); if (curStride < stride){ curStride=stride; } } return curStride; } VertexDeclaration._maxVertexDeclarationBit=1000; VertexDeclaration._uniqueIDCounter=1; __static(VertexDeclaration, ['maxVertexDeclaration',function(){return this.maxVertexDeclaration=2147483647-Math.floor(2147483647 / 1000)*1000;} ]); return VertexDeclaration; })() /** *VertexElement 类用于创建顶点结构分配。 */ //class laya.d3.graphics.VertexElement var VertexElement=(function(){ function VertexElement(offset,elementFormat,elementUsage){ this.offset=0; this.elementFormat=null; this.elementUsage=null; this.offset=offset; this.elementFormat=elementFormat; this.elementUsage=elementUsage; } __class(VertexElement,'laya.d3.graphics.VertexElement'); return VertexElement; })() /** *... *@author ... */ //class laya.d3.graphics.VertexElementFormat var VertexElementFormat=(function(){ function VertexElementFormat(){}; __class(VertexElementFormat,'laya.d3.graphics.VertexElementFormat'); VertexElementFormat.Single="single"; VertexElementFormat.Vector2="vector2"; VertexElementFormat.Vector3="vector3"; VertexElementFormat.Vector4="vector4"; VertexElementFormat.Color="color"; VertexElementFormat.Byte4="byte4"; VertexElementFormat.Short2="short2"; VertexElementFormat.Short4="short4"; VertexElementFormat.NormalizedShort2="normalizedshort2"; VertexElementFormat.NormalizedShort4="normalizedshort4"; VertexElementFormat.HalfVector2="halfvector2"; VertexElementFormat.HalfVector4="halfvector4"; return VertexElementFormat; })() /** *... *@author ... */ //class laya.d3.graphics.VertexElementUsage var VertexElementUsage=(function(){ function VertexElementUsage(){}; __class(VertexElementUsage,'laya.d3.graphics.VertexElementUsage'); VertexElementUsage.POSITION0="POSITION"; VertexElementUsage.COLOR0="COLOR"; VertexElementUsage.TEXTURECOORDINATE0="UV"; VertexElementUsage.NORMAL0="NORMAL"; VertexElementUsage.BINORMAL0="BINORMAL"; VertexElementUsage.TANGENT0="TANGENT0"; VertexElementUsage.BLENDINDICES0="BLENDINDICES"; VertexElementUsage.BLENDWEIGHT0="BLENDWEIGHT"; VertexElementUsage.DEPTH0="DEPTH"; VertexElementUsage.FOG0="FOG"; VertexElementUsage.POINTSIZE0="POINTSIZE"; VertexElementUsage.SAMPLE0="SAMPLE"; VertexElementUsage.TESSELLATEFACTOR0="TESSELLATEFACTOR"; VertexElementUsage.COLOR1="COLOR1"; VertexElementUsage.NEXTTEXTURECOORDINATE0="NEXTUV"; VertexElementUsage.TEXTURECOORDINATE1="UV1"; VertexElementUsage.NEXTTEXTURECOORDINATE1="NEXTUV1"; VertexElementUsage.CORNERTEXTURECOORDINATE0="CORNERTEXTURECOORDINATE"; VertexElementUsage.VELOCITY0="VELOCITY"; VertexElementUsage.STARTCOLOR0="STARTCOLOR"; VertexElementUsage.STARTSIZE="STARTSIZE"; VertexElementUsage.AGEADDSCALE0="AGEADDSCALE0"; VertexElementUsage.STARTROTATION0="STARTROTATION0"; VertexElementUsage.STARTROTATION1="STARTROTATION1"; VertexElementUsage.STARTROTATION2="STARTROTATION2"; VertexElementUsage.ENDCOLOR0="ENDCOLOR"; VertexElementUsage.SIZEROTATION0="SIZEROTATION"; VertexElementUsage.RADIUS0="RADIUS"; VertexElementUsage.RADIAN0="RADIAN"; VertexElementUsage.STARTLIFETIME="STARTLIFETIME"; VertexElementUsage.STARTSPEED="STARTSPEED"; VertexElementUsage.DIRECTION="DIRECTION"; VertexElementUsage.TIME0="TIME"; VertexElementUsage.RANDOM0="RANDOM0"; VertexElementUsage.RANDOM1="RANDOM1"; VertexElementUsage.SIMULATIONWORLDPOSTION="SIMULATIONWORLDPOSTION"; return VertexElementUsage; })() /** *VertexPositionNormalColorTangent 类用于创建粒子顶点结构。 */ //class laya.d3.graphics.VertexGlitter var VertexGlitter=(function(){ function VertexGlitter(position,textureCoordinate,time){ this._position=null; this._textureCoordinate0=null; this._time=NaN; this._position=position; this._textureCoordinate0=textureCoordinate; this._time=time; } __class(VertexGlitter,'laya.d3.graphics.VertexGlitter'); var __proto=VertexGlitter.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'textureCoordinate',function(){ return this._textureCoordinate0; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'time',function(){ return this._time; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexGlitter._vertexDeclaration; }); __getset(1,VertexGlitter,'vertexDeclaration',function(){ return VertexGlitter._vertexDeclaration; }); __static(VertexGlitter, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(24, [new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(20,/*laya.d3.graphics.VertexElementFormat.Single*/"single",/*laya.d3.graphics.VertexElementUsage.TIME0*/"TIME")]);} ]); return VertexGlitter; })() /** *VertexPositionNormalColorTangent 类用于创建粒子顶点结构。 */ //class laya.d3.graphics.VertexParticle var VertexParticle=(function(){ function VertexParticle(cornerTextureCoordinate,position,velocity,startColor,endColor,sizeRotation,radius,radian,ageAddScale,time){ this._cornerTextureCoordinate=null; this._position=null; this._velocity=null; this._startColor=null; this._endColor=null; this._sizeRotation=null; this._radius=null; this._radian=null; this._ageAddScale=NaN; this._time=NaN; this._cornerTextureCoordinate=cornerTextureCoordinate; this._position=position; this._velocity=velocity; this._startColor=startColor; this._endColor=endColor; this._sizeRotation=sizeRotation; this._radius=radius; this._radian=radian; this._ageAddScale=ageAddScale; this._time=time; } __class(VertexParticle,'laya.d3.graphics.VertexParticle'); var __proto=VertexParticle.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'endColor',function(){ return this._endColor; }); __getset(0,__proto,'cornerTextureCoordinate',function(){ return this._cornerTextureCoordinate; }); __getset(0,__proto,'sizeRotation',function(){ return this._sizeRotation; }); __getset(0,__proto,'velocity',function(){ return this._velocity; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'startColor',function(){ return this._startColor; }); __getset(0,__proto,'radius',function(){ return this._radius; }); __getset(0,__proto,'radian',function(){ return this._radian; }); __getset(0,__proto,'ageAddScale',function(){ return this._ageAddScale; }); __getset(0,__proto,'time',function(){ return this._time; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexParticle._vertexDeclaration; }); __getset(1,VertexParticle,'vertexDeclaration',function(){ return VertexParticle._vertexDeclaration; }); __static(VertexParticle, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(116, [new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.CORNERTEXTURECOORDINATE0*/"CORNERTEXTURECOORDINATE"), new VertexElement(16,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(28,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.VELOCITY0*/"VELOCITY"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.STARTCOLOR0*/"STARTCOLOR"), new VertexElement(56,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.ENDCOLOR0*/"ENDCOLOR"), new VertexElement(72,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.SIZEROTATION0*/"SIZEROTATION"), new VertexElement(84,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.RADIUS0*/"RADIUS"), new VertexElement(92,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.RADIAN0*/"RADIAN"), new VertexElement(108,/*laya.d3.graphics.VertexElementFormat.Single*/"single",/*laya.d3.graphics.VertexElementUsage.STARTLIFETIME*/"STARTLIFETIME"), new VertexElement(112,/*laya.d3.graphics.VertexElementFormat.Single*/"single",/*laya.d3.graphics.VertexElementUsage.TIME0*/"TIME")]);} ]); return VertexParticle; })() /** *VertexPositionNormalColorTangent 类用于创建粒子顶点结构。 */ //class laya.d3.graphics.VertexParticleShuriken var VertexParticleShuriken=(function(){ function VertexParticleShuriken(cornerTextureCoordinate,position,velocity,startColor,startSize,startRotation0,startRotation1,startRotation2,ageAddScale,time,startSpeed,randoms0,randoms1,simulationWorldPostion){ this._cornerTextureCoordinate=null; this._position=null; this._velocity=null; this._startColor=null; this._startSize=null; this._startRotation0=null; this._startRotation1=null; this._startRotation2=null; this._startLifeTime=NaN; this._time=NaN; this._startSpeed=NaN; this._randoms0=null; this._randoms1=null; this._simulationWorldPostion=null; this._cornerTextureCoordinate=cornerTextureCoordinate; this._position=position; this._velocity=velocity; this._startColor=startColor; this._startSize=startSize; this._startRotation0=startRotation0; this._startRotation1=startRotation1; this._startRotation2=startRotation2; this._startLifeTime=ageAddScale; this._time=time; this._startSpeed=startSpeed; this._randoms0=this.random0; this._randoms1=this.random1; this._simulationWorldPostion=simulationWorldPostion; } __class(VertexParticleShuriken,'laya.d3.graphics.VertexParticleShuriken'); var __proto=VertexParticleShuriken.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'cornerTextureCoordinate',function(){ return this._cornerTextureCoordinate; }); __getset(0,__proto,'velocity',function(){ return this._velocity; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'random0',function(){ return this._randoms0; }); __getset(0,__proto,'startSize',function(){ return this._startSize; }); __getset(0,__proto,'startColor',function(){ return this._startColor; }); __getset(0,__proto,'startRotation0',function(){ return this._startRotation0; }); __getset(0,__proto,'startRotation1',function(){ return this._startRotation1; }); __getset(0,__proto,'random1',function(){ return this._randoms1; }); __getset(0,__proto,'startRotation2',function(){ return this._startRotation2; }); __getset(0,__proto,'startLifeTime',function(){ return this._startLifeTime; }); __getset(0,__proto,'time',function(){ return this._time; }); __getset(0,__proto,'startSpeed',function(){ return this._startSpeed; }); __getset(0,__proto,'simulationWorldPostion',function(){ return this._simulationWorldPostion; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexParticleShuriken._vertexDeclaration; }); __getset(1,VertexParticleShuriken,'vertexDeclaration',function(){ return VertexParticleShuriken._vertexDeclaration; }); __static(VertexParticleShuriken, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(160,[new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.CORNERTEXTURECOORDINATE0*/"CORNERTEXTURECOORDINATE"),new VertexElement(16,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"),new VertexElement(28,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.DIRECTION*/"DIRECTION"),new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.STARTCOLOR0*/"STARTCOLOR"),new VertexElement(56,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.STARTSIZE*/"STARTSIZE"),new VertexElement(68,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.STARTROTATION0*/"STARTROTATION0"),new VertexElement(80,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.STARTROTATION1*/"STARTROTATION1"),new VertexElement(92,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.STARTROTATION2*/"STARTROTATION2"),new VertexElement(104,/*laya.d3.graphics.VertexElementFormat.Single*/"single",/*laya.d3.graphics.VertexElementUsage.STARTLIFETIME*/"STARTLIFETIME"),new VertexElement(108,/*laya.d3.graphics.VertexElementFormat.Single*/"single",/*laya.d3.graphics.VertexElementUsage.TIME0*/"TIME"),new VertexElement(112,/*laya.d3.graphics.VertexElementFormat.Single*/"single",/*laya.d3.graphics.VertexElementUsage.STARTSPEED*/"STARTSPEED"),new VertexElement(116,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.RANDOM0*/"RANDOM0"),new VertexElement(132,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.RANDOM1*/"RANDOM1"),new VertexElement(148,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.SIMULATIONWORLDPOSTION*/"SIMULATIONWORLDPOSTION")]);} ]); return VertexParticleShuriken; })() /** *VertexPositionNormalColor 类用于创建位置、法线、颜色顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalColor var VertexPositionNormalColor=(function(){ function VertexPositionNormalColor(position,normal,color){ this._position=null; this._normal=null; this._color=null; this._position=position; this._normal=normal; this._color=color; } __class(VertexPositionNormalColor,'laya.d3.graphics.VertexPositionNormalColor'); var __proto=VertexPositionNormalColor.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'color',function(){ return this._color; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalColor._vertexDeclaration; }); __getset(1,VertexPositionNormalColor,'vertexDeclaration',function(){ return VertexPositionNormalColor._vertexDeclaration; }); __static(VertexPositionNormalColor, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(40,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR")]);} ]); return VertexPositionNormalColor; })() /** *VertexPositionNormalColorSkin 类用于创建位置、法线、颜色、骨骼索引、骨骼权重顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalColorSkin var VertexPositionNormalColorSkin=(function(){ function VertexPositionNormalColorSkin(position,normal,color,blendIndex,blendWeight){ this._position=null; this._normal=null; this._color=null; this._blendIndex=null; this._blendWeight=null; this._position=position; this._normal=normal; this._color=color; this._blendIndex=blendIndex; this._blendWeight=blendWeight; } __class(VertexPositionNormalColorSkin,'laya.d3.graphics.VertexPositionNormalColorSkin'); var __proto=VertexPositionNormalColorSkin.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'blendWeight',function(){ return this._blendWeight; }); __getset(0,__proto,'color',function(){ return this._color; }); __getset(0,__proto,'blendIndex',function(){ return this._blendIndex; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalColorSkin._vertexDeclaration; }); __getset(1,VertexPositionNormalColorSkin,'vertexDeclaration',function(){ return VertexPositionNormalColorSkin._vertexDeclaration; }); __static(VertexPositionNormalColorSkin, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(72,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDWEIGHT0*/"BLENDWEIGHT"), new VertexElement(56,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDINDICES0*/"BLENDINDICES")]);} ]); return VertexPositionNormalColorSkin; })() /** *VertexPositionNormalColorSkin 类用于创建位置、法线、颜色、骨骼索引、骨骼权重顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalColorSkinTangent var VertexPositionNormalColorSkinTangent=(function(){ function VertexPositionNormalColorSkinTangent(position,normal,color,tangent,blendIndex,blendWeight){ this._position=null; this._normal=null; this._color=null; this._blendIndex=null; this._blendWeight=null; this._tangent=null; this._position=position; this._normal=normal; this._color=color; this._tangent=tangent; this._blendIndex=blendIndex; this._blendWeight=blendWeight; } __class(VertexPositionNormalColorSkinTangent,'laya.d3.graphics.VertexPositionNormalColorSkinTangent'); var __proto=VertexPositionNormalColorSkinTangent.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'tangent',function(){ return this._tangent; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'blendWeight',function(){ return this._blendWeight; }); __getset(0,__proto,'color',function(){ return this._color; }); __getset(0,__proto,'blendIndex',function(){ return this._blendIndex; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalColorSkinTangent._vertexDeclaration; }); __getset(1,VertexPositionNormalColorSkinTangent,'vertexDeclaration',function(){ return VertexPositionNormalColorSkinTangent._vertexDeclaration; }); __static(VertexPositionNormalColorSkinTangent, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(84,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDWEIGHT0*/"BLENDWEIGHT"), new VertexElement(56,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDINDICES0*/"BLENDINDICES"), new VertexElement(72,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.TANGENT0*/"TANGENT0")]);} ]); return VertexPositionNormalColorSkinTangent; })() /** *VertexPositionNormalColorTangent 类用于创建位置、法线、颜色、切线顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalColorTangent var VertexPositionNormalColorTangent=(function(){ function VertexPositionNormalColorTangent(position,normal,color,tangent){ this._position=null; this._normal=null; this._color=null; this._tangent=null; this._position=position; this._normal=normal; this._color=color; this._tangent=tangent; } __class(VertexPositionNormalColorTangent,'laya.d3.graphics.VertexPositionNormalColorTangent'); var __proto=VertexPositionNormalColorTangent.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'tangent',function(){ return this._tangent; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'color',function(){ return this._color; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalColorTangent._vertexDeclaration; }); __getset(1,VertexPositionNormalColorTangent,'vertexDeclaration',function(){ return VertexPositionNormalColorTangent._vertexDeclaration; }); __static(VertexPositionNormalColorTangent, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(52,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.TANGENT0*/"TANGENT0")]);} ]); return VertexPositionNormalColorTangent; })() /** *VertexPositionNormalColorTexture 类用于创建位置、法线、颜色、纹理顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalColorTexture var VertexPositionNormalColorTexture=(function(){ function VertexPositionNormalColorTexture(position,normal,color,textureCoordinate){ this._position=null; this._normal=null; this._color=null; this._textureCoordinate=null; this._position=position; this._normal=normal; this._color=color; this._textureCoordinate=textureCoordinate; } __class(VertexPositionNormalColorTexture,'laya.d3.graphics.VertexPositionNormalColorTexture'); var __proto=VertexPositionNormalColorTexture.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'textureCoordinate',function(){ return this._textureCoordinate; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'color',function(){ return this._color; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalColorTexture._vertexDeclaration; }); __getset(1,VertexPositionNormalColorTexture,'vertexDeclaration',function(){ return VertexPositionNormalColorTexture._vertexDeclaration; }); __static(VertexPositionNormalColorTexture, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(48,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV")]);} ]); return VertexPositionNormalColorTexture; })() /** *VertexPositionNormalColorTexture 类用于创建位置、法线、颜色、纹理顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalColorTexture0Texture1 var VertexPositionNormalColorTexture0Texture1=(function(){ function VertexPositionNormalColorTexture0Texture1(position,normal,color,textureCoordinate0,textureCoordinate1){ this._position=null; this._normal=null; this._color=null; this._textureCoordinate0=null; this._textureCoordinate1=null; this._position=position; this._normal=normal; this._color=color; this._textureCoordinate0=textureCoordinate0; this._textureCoordinate1=textureCoordinate1; } __class(VertexPositionNormalColorTexture0Texture1,'laya.d3.graphics.VertexPositionNormalColorTexture0Texture1'); var __proto=VertexPositionNormalColorTexture0Texture1.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'color',function(){ return this._color; }); __getset(0,__proto,'textureCoordinate0',function(){ return this._textureCoordinate0; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalColorTexture0Texture1._vertexDeclaration; }); __getset(0,__proto,'textureCoordinate1',function(){ return this._textureCoordinate1; }); __getset(1,VertexPositionNormalColorTexture0Texture1,'vertexDeclaration',function(){ return VertexPositionNormalColorTexture0Texture1._vertexDeclaration; }); __static(VertexPositionNormalColorTexture0Texture1, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(56,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(48,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE1*/"UV1")]);} ]); return VertexPositionNormalColorTexture0Texture1; })() /** *VertexPositionNormalColorTextureSkin 类用于创建位置、法线、颜色、纹理、骨骼索引、骨骼权重顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalColorTexture0Texture1Skin var VertexPositionNormalColorTexture0Texture1Skin=(function(){ function VertexPositionNormalColorTexture0Texture1Skin(position,normal,color,textureCoordinate0,textureCoordinate1,blendIndex,blendWeight){ this._position=null; this._normal=null; this._color=null; this._textureCoordinate0=null; this._textureCoordinate1=null; this._blendIndex=null; this._blendWeight=null; this._position=position; this._normal=normal; this._color=color; this._textureCoordinate0=textureCoordinate0; this._textureCoordinate1=textureCoordinate1; this._blendIndex=blendIndex; this._blendWeight=blendWeight; } __class(VertexPositionNormalColorTexture0Texture1Skin,'laya.d3.graphics.VertexPositionNormalColorTexture0Texture1Skin'); var __proto=VertexPositionNormalColorTexture0Texture1Skin.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'blendWeight',function(){ return this._blendWeight; }); __getset(0,__proto,'color',function(){ return this._color; }); __getset(0,__proto,'textureCoordinate0',function(){ return this._textureCoordinate0; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalColorTexture0Texture1Skin._vertexDeclaration; }); __getset(0,__proto,'textureCoordinate1',function(){ return this._textureCoordinate1; }); __getset(0,__proto,'blendIndex',function(){ return this._blendIndex; }); __getset(1,VertexPositionNormalColorTexture0Texture1Skin,'vertexDeclaration',function(){ return VertexPositionNormalColorTexture0Texture1Skin._vertexDeclaration; }); __static(VertexPositionNormalColorTexture0Texture1Skin, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(88,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(48,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE1*/"UV1"), new VertexElement(56,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDWEIGHT0*/"BLENDWEIGHT"), new VertexElement(72,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDINDICES0*/"BLENDINDICES")]);} ]); return VertexPositionNormalColorTexture0Texture1Skin; })() /** *VertexPositionNormalTextureSkin 类用于创建位置、法线、纹理、骨骼索引、骨骼权重顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalColorTexture0Texture1SkinTangent var VertexPositionNormalColorTexture0Texture1SkinTangent=(function(){ function VertexPositionNormalColorTexture0Texture1SkinTangent(){ this._position=null; this._normal=null; this._color=null; this._textureCoordinate0=null; this._textureCoordinate1=null; this._blendIndex=null; this._blendWeight=null; this._tangent=null; } __class(VertexPositionNormalColorTexture0Texture1SkinTangent,'laya.d3.graphics.VertexPositionNormalColorTexture0Texture1SkinTangent'); var __proto=VertexPositionNormalColorTexture0Texture1SkinTangent.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __proto.VertexPositionNormalColorTexture0SkinTangent=function(position,normal,color,textureCoordinate0,textureCoordinate1,tangent,blendIndex,blendWeight){ this._position=position; this._normal=normal; this._color=color; this._textureCoordinate0=textureCoordinate0; this._textureCoordinate1=textureCoordinate1; this._tangent=tangent; this._blendIndex=blendIndex; this._blendWeight=blendWeight; } __getset(0,__proto,'tangent',function(){ return this._tangent; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'blendWeight',function(){ return this._blendWeight; }); __getset(0,__proto,'color',function(){ return this._color; }); __getset(0,__proto,'textureCoordinate0',function(){ return this._textureCoordinate0; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalColorTexture0Texture1SkinTangent._vertexDeclaration; }); __getset(0,__proto,'textureCoordinate1',function(){ return this._textureCoordinate1; }); __getset(0,__proto,'blendIndex',function(){ return this._blendIndex; }); __getset(1,VertexPositionNormalColorTexture0Texture1SkinTangent,'vertexDeclaration',function(){ return VertexPositionNormalColorTexture0Texture1SkinTangent._vertexDeclaration; }); __static(VertexPositionNormalColorTexture0Texture1SkinTangent, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(100,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(48,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE1*/"UV1"), new VertexElement(56,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDWEIGHT0*/"BLENDWEIGHT"), new VertexElement(72,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDINDICES0*/"BLENDINDICES"), new VertexElement(88,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.TANGENT0*/"TANGENT0")]);} ]); return VertexPositionNormalColorTexture0Texture1SkinTangent; })() /** *VertexPositionNormalColorTextureTangent 类用于创建位置、法线、颜色、纹理、切线顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalColorTexture0Texture1Tangent var VertexPositionNormalColorTexture0Texture1Tangent=(function(){ function VertexPositionNormalColorTexture0Texture1Tangent(){ this._position=null; this._normal=null; this._color=null; this._textureCoordinate0=null; this._textureCoordinate1=null; this._tangent=null; } __class(VertexPositionNormalColorTexture0Texture1Tangent,'laya.d3.graphics.VertexPositionNormalColorTexture0Texture1Tangent'); var __proto=VertexPositionNormalColorTexture0Texture1Tangent.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __proto.VertexPositionNormalColorTexture0Tangent=function(position,normal,color,textureCoordinate0,textureCoordinate1,tangent){ this._position=position; this._normal=normal; this._color=color; this._textureCoordinate0=textureCoordinate0; this._textureCoordinate1=textureCoordinate1; this._tangent=tangent; } __getset(0,__proto,'tangent',function(){ return this._tangent; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'color',function(){ return this._color; }); __getset(0,__proto,'textureCoordinate0',function(){ return this._textureCoordinate0; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalColorTexture0Texture1Tangent._vertexDeclaration; }); __getset(0,__proto,'textureCoordinate1',function(){ return this._textureCoordinate1; }); __getset(1,VertexPositionNormalColorTexture0Texture1Tangent,'vertexDeclaration',function(){ return VertexPositionNormalColorTexture0Texture1Tangent._vertexDeclaration; }); __static(VertexPositionNormalColorTexture0Texture1Tangent, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(68,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(48,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE1*/"UV1"), new VertexElement(56,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.TANGENT0*/"TANGENT0")]);} ]); return VertexPositionNormalColorTexture0Texture1Tangent; })() /** *VertexPositionNormalColorTextureSkin 类用于创建位置、法线、颜色、纹理、骨骼索引、骨骼权重顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalColorTextureSkin var VertexPositionNormalColorTextureSkin=(function(){ function VertexPositionNormalColorTextureSkin(position,normal,color,textureCoordinate,blendIndex,blendWeight){ this._position=null; this._normal=null; this._color=null; this._textureCoordinate=null; this._blendIndex=null; this._blendWeight=null; this._position=position; this._normal=normal; this._color=color; this._textureCoordinate=textureCoordinate; this._blendIndex=blendIndex; this._blendWeight=blendWeight; } __class(VertexPositionNormalColorTextureSkin,'laya.d3.graphics.VertexPositionNormalColorTextureSkin'); var __proto=VertexPositionNormalColorTextureSkin.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'textureCoordinate',function(){ return this._textureCoordinate; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'blendWeight',function(){ return this._blendWeight; }); __getset(0,__proto,'color',function(){ return this._color; }); __getset(0,__proto,'blendIndex',function(){ return this._blendIndex; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalColorTextureSkin._vertexDeclaration; }); __getset(1,VertexPositionNormalColorTextureSkin,'vertexDeclaration',function(){ return VertexPositionNormalColorTextureSkin._vertexDeclaration; }); __static(VertexPositionNormalColorTextureSkin, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(80,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(48,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDWEIGHT0*/"BLENDWEIGHT"), new VertexElement(64,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDINDICES0*/"BLENDINDICES")]);} ]); return VertexPositionNormalColorTextureSkin; })() /** *VertexPositionNormalTextureSkin 类用于创建位置、法线、纹理、骨骼索引、骨骼权重顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalColorTextureSkinTangent var VertexPositionNormalColorTextureSkinTangent=(function(){ function VertexPositionNormalColorTextureSkinTangent(position,normal,color,textureCoordinate,tangent,blendIndex,blendWeight){ this._position=null; this._normal=null; this._color=null; this._textureCoordinate=null; this._blendIndex=null; this._blendWeight=null; this._tangent=null; this._position=position; this._normal=normal; this._color=color; this._textureCoordinate=textureCoordinate; this._tangent=tangent; this._blendIndex=blendIndex; this._blendWeight=blendWeight; } __class(VertexPositionNormalColorTextureSkinTangent,'laya.d3.graphics.VertexPositionNormalColorTextureSkinTangent'); var __proto=VertexPositionNormalColorTextureSkinTangent.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'tangent',function(){ return this._tangent; }); __getset(0,__proto,'textureCoordinate',function(){ return this._textureCoordinate; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'blendWeight',function(){ return this._blendWeight; }); __getset(0,__proto,'color',function(){ return this._color; }); __getset(0,__proto,'blendIndex',function(){ return this._blendIndex; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalColorTextureSkinTangent._vertexDeclaration; }); __getset(1,VertexPositionNormalColorTextureSkinTangent,'vertexDeclaration',function(){ return VertexPositionNormalColorTextureSkinTangent._vertexDeclaration; }); __static(VertexPositionNormalColorTextureSkinTangent, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(92,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(48,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDWEIGHT0*/"BLENDWEIGHT"), new VertexElement(64,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDINDICES0*/"BLENDINDICES"), new VertexElement(80,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.TANGENT0*/"TANGENT0")]);} ]); return VertexPositionNormalColorTextureSkinTangent; })() /** *VertexPositionNormalColorTextureTangent 类用于创建位置、法线、颜色、纹理、切线顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalColorTextureTangent var VertexPositionNormalColorTextureTangent=(function(){ function VertexPositionNormalColorTextureTangent(position,normal,color,textureCoordinate,tangent){ this._position=null; this._normal=null; this._color=null; this._textureCoordinate=null; this._tangent=null; this._position=position; this._normal=normal; this._color=color; this._textureCoordinate=textureCoordinate; this._tangent=tangent; } __class(VertexPositionNormalColorTextureTangent,'laya.d3.graphics.VertexPositionNormalColorTextureTangent'); var __proto=VertexPositionNormalColorTextureTangent.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'tangent',function(){ return this._tangent; }); __getset(0,__proto,'textureCoordinate',function(){ return this._textureCoordinate; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'color',function(){ return this._color; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalColorTextureTangent._vertexDeclaration; }); __getset(1,VertexPositionNormalColorTextureTangent,'vertexDeclaration',function(){ return VertexPositionNormalColorTextureTangent._vertexDeclaration; }); __static(VertexPositionNormalColorTextureTangent, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(60,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(48,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.TANGENT0*/"TANGENT0")]);} ]); return VertexPositionNormalColorTextureTangent; })() /** *VertexPositionNormalTexture 类用于创建位置、法线、纹理顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalTexture var VertexPositionNormalTexture=(function(){ function VertexPositionNormalTexture(position,normal,textureCoordinate){ this._position=null; this._normal=null; this._textureCoordinate=null; this._position=position; this._normal=normal; this._textureCoordinate=textureCoordinate; } __class(VertexPositionNormalTexture,'laya.d3.graphics.VertexPositionNormalTexture'); var __proto=VertexPositionNormalTexture.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'textureCoordinate',function(){ return this._textureCoordinate; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalTexture._vertexDeclaration; }); __getset(1,VertexPositionNormalTexture,'vertexDeclaration',function(){ return VertexPositionNormalTexture._vertexDeclaration; }); __static(VertexPositionNormalTexture, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(32,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV")]);} ]); return VertexPositionNormalTexture; })() /** *VertexPositionNormalTexture 类用于创建位置、法线、纹理顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalTexture0Texture1 var VertexPositionNormalTexture0Texture1=(function(){ function VertexPositionNormalTexture0Texture1(position,normal,textureCoordinate0,textureCoordinate1){ this._position=null; this._normal=null; this._textureCoordinate0=null; this._textureCoordinate1=null; this._position=position; this._normal=normal; this._textureCoordinate0=textureCoordinate0; this._textureCoordinate1=textureCoordinate1; } __class(VertexPositionNormalTexture0Texture1,'laya.d3.graphics.VertexPositionNormalTexture0Texture1'); var __proto=VertexPositionNormalTexture0Texture1.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'textureCoordinate0',function(){ return this._textureCoordinate0; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalTexture0Texture1._vertexDeclaration; }); __getset(0,__proto,'textureCoordinate1',function(){ return this._textureCoordinate1; }); __getset(1,VertexPositionNormalTexture0Texture1,'vertexDeclaration',function(){ return VertexPositionNormalTexture0Texture1._vertexDeclaration; }); __static(VertexPositionNormalTexture0Texture1, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(40,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(32,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE1*/"UV1")]);} ]); return VertexPositionNormalTexture0Texture1; })() /** *VertexPositionNormalColorTextureSkin 类用于创建位置、法线、颜色、纹理、骨骼索引、骨骼权重顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalTexture0Texture1Skin var VertexPositionNormalTexture0Texture1Skin=(function(){ function VertexPositionNormalTexture0Texture1Skin(position,normal,textureCoordinate0,textureCoordinate1,blendIndex,blendWeight){ this._position=null; this._normal=null; this._textureCoordinate0=null; this._textureCoordinate1=null; this._blendIndex=null; this._blendWeight=null; this._position=position; this._normal=normal; this._textureCoordinate0=textureCoordinate0; this._textureCoordinate1=textureCoordinate1; this._blendIndex=blendIndex; this._blendWeight=blendWeight; } __class(VertexPositionNormalTexture0Texture1Skin,'laya.d3.graphics.VertexPositionNormalTexture0Texture1Skin'); var __proto=VertexPositionNormalTexture0Texture1Skin.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'textureCoordinate0',function(){ return this._textureCoordinate0; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalTexture0Texture1Skin._vertexDeclaration; }); __getset(0,__proto,'textureCoordinate1',function(){ return this._textureCoordinate1; }); __getset(0,__proto,'blendIndex',function(){ return this._blendIndex; }); __getset(0,__proto,'blendWeight',function(){ return this._blendWeight; }); __getset(1,VertexPositionNormalTexture0Texture1Skin,'vertexDeclaration',function(){ return VertexPositionNormalTexture0Texture1Skin._vertexDeclaration; }); __static(VertexPositionNormalTexture0Texture1Skin, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(72,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(32,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE1*/"UV1"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDWEIGHT0*/"BLENDWEIGHT"), new VertexElement(56,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDINDICES0*/"BLENDINDICES")]);} ]); return VertexPositionNormalTexture0Texture1Skin; })() /** *VertexPositionNormalTextureSkin 类用于创建位置、法线、纹理、骨骼索引、骨骼权重顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalTexture0Texture1SkinTangent var VertexPositionNormalTexture0Texture1SkinTangent=(function(){ function VertexPositionNormalTexture0Texture1SkinTangent(){ this._position=null; this._normal=null; this._textureCoordinate0=null; this._textureCoordinate1=null; this._blendIndex=null; this._blendWeight=null; this._tangent=null; } __class(VertexPositionNormalTexture0Texture1SkinTangent,'laya.d3.graphics.VertexPositionNormalTexture0Texture1SkinTangent'); var __proto=VertexPositionNormalTexture0Texture1SkinTangent.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __proto.VertexPositionNormalTexture0SkinTangent=function(position,normal,textureCoordinate0,textureCoordinate1,tangent,blendIndex,blendWeight){ this._position=position; this._normal=normal; this._textureCoordinate0=textureCoordinate0; this._textureCoordinate1=textureCoordinate1; this._tangent=tangent; this._blendIndex=blendIndex; this._blendWeight=blendWeight; } __getset(0,__proto,'tangent',function(){ return this._tangent; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'textureCoordinate0',function(){ return this._textureCoordinate0; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalTexture0Texture1SkinTangent._vertexDeclaration; }); __getset(0,__proto,'textureCoordinate1',function(){ return this._textureCoordinate1; }); __getset(0,__proto,'blendIndex',function(){ return this._blendIndex; }); __getset(0,__proto,'blendWeight',function(){ return this._blendWeight; }); __getset(1,VertexPositionNormalTexture0Texture1SkinTangent,'vertexDeclaration',function(){ return VertexPositionNormalTexture0Texture1SkinTangent._vertexDeclaration; }); __static(VertexPositionNormalTexture0Texture1SkinTangent, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(84,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(32,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE1*/"UV1"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDWEIGHT0*/"BLENDWEIGHT"), new VertexElement(56,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDINDICES0*/"BLENDINDICES"), new VertexElement(72,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.TANGENT0*/"TANGENT0")]);} ]); return VertexPositionNormalTexture0Texture1SkinTangent; })() /** *VertexPositionNormalTextureTangent 类用于创建位置、法线、纹理、切线顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalTexture0Texture1Tangent var VertexPositionNormalTexture0Texture1Tangent=(function(){ function VertexPositionNormalTexture0Texture1Tangent(){ this._position=null; this._normal=null; this._textureCoordinate0=null; this._textureCoordinate1=null; this._tangent=null; } __class(VertexPositionNormalTexture0Texture1Tangent,'laya.d3.graphics.VertexPositionNormalTexture0Texture1Tangent'); var __proto=VertexPositionNormalTexture0Texture1Tangent.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __proto.VertexPositionNormalTexture0Tangent=function(position,normal,textureCoordinate0,textureCoordinate1,tangent){ this._position=position; this._normal=normal; this._textureCoordinate0=textureCoordinate0; this._textureCoordinate1=textureCoordinate1; this._tangent=tangent; } __getset(0,__proto,'tangent',function(){ return this._tangent; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'textureCoordinate0',function(){ return this._textureCoordinate0; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalTexture0Texture1Tangent._vertexDeclaration; }); __getset(0,__proto,'textureCoordinate1',function(){ return this._textureCoordinate1; }); __getset(1,VertexPositionNormalTexture0Texture1Tangent,'vertexDeclaration',function(){ return VertexPositionNormalTexture0Texture1Tangent._vertexDeclaration; }); __static(VertexPositionNormalTexture0Texture1Tangent, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(52,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(32,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE1*/"UV1"), new VertexElement(40,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.TANGENT0*/"TANGENT0")]);} ]); return VertexPositionNormalTexture0Texture1Tangent; })() /** *VertexPositionNormalColorTextureSkin 类用于创建位置、法线、颜色、纹理、骨骼索引、骨骼权重顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalTextureSkin var VertexPositionNormalTextureSkin=(function(){ function VertexPositionNormalTextureSkin(position,normal,textureCoordinate,blendIndex,blendWeight){ this._position=null; this._normal=null; this._textureCoordinate=null; this._blendIndex=null; this._blendWeight=null; this._position=position; this._normal=normal; this._textureCoordinate=textureCoordinate; this._blendIndex=blendIndex; this._blendWeight=blendWeight; } __class(VertexPositionNormalTextureSkin,'laya.d3.graphics.VertexPositionNormalTextureSkin'); var __proto=VertexPositionNormalTextureSkin.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'textureCoordinate',function(){ return this._textureCoordinate; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'blendIndex',function(){ return this._blendIndex; }); __getset(0,__proto,'blendWeight',function(){ return this._blendWeight; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalTextureSkin._vertexDeclaration; }); __getset(1,VertexPositionNormalTextureSkin,'vertexDeclaration',function(){ return VertexPositionNormalTextureSkin._vertexDeclaration; }); __static(VertexPositionNormalTextureSkin, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(64,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(32,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDWEIGHT0*/"BLENDWEIGHT"), new VertexElement(48,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDINDICES0*/"BLENDINDICES")]);} ]); return VertexPositionNormalTextureSkin; })() /** *VertexPositionNormalTextureSkin 类用于创建位置、法线、纹理、骨骼索引、骨骼权重顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalTextureSkinTangent var VertexPositionNormalTextureSkinTangent=(function(){ function VertexPositionNormalTextureSkinTangent(position,normal,textureCoordinate,tangent,blendIndex,blendWeight){ this._position=null; this._normal=null; this._textureCoordinate=null; this._blendIndex=null; this._blendWeight=null; this._tangent=null; this._position=position; this._normal=normal; this._textureCoordinate=textureCoordinate; this._tangent=tangent; this._blendIndex=blendIndex; this._blendWeight=blendWeight; } __class(VertexPositionNormalTextureSkinTangent,'laya.d3.graphics.VertexPositionNormalTextureSkinTangent'); var __proto=VertexPositionNormalTextureSkinTangent.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'tangent',function(){ return this._tangent; }); __getset(0,__proto,'textureCoordinate',function(){ return this._textureCoordinate; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'blendIndex',function(){ return this._blendIndex; }); __getset(0,__proto,'blendWeight',function(){ return this._blendWeight; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalTextureSkinTangent._vertexDeclaration; }); __getset(1,VertexPositionNormalTextureSkinTangent,'vertexDeclaration',function(){ return VertexPositionNormalTextureSkinTangent._vertexDeclaration; }); __static(VertexPositionNormalTextureSkinTangent, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(76,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(32,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDWEIGHT0*/"BLENDWEIGHT"), new VertexElement(48,/*laya.d3.graphics.VertexElementFormat.Vector4*/"vector4",/*laya.d3.graphics.VertexElementUsage.BLENDINDICES0*/"BLENDINDICES"), new VertexElement(64,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.TANGENT0*/"TANGENT0")]);} ]); return VertexPositionNormalTextureSkinTangent; })() /** *VertexPositionNormalTextureTangent 类用于创建位置、法线、纹理、切线顶点结构。 */ //class laya.d3.graphics.VertexPositionNormalTextureTangent var VertexPositionNormalTextureTangent=(function(){ function VertexPositionNormalTextureTangent(position,normal,textureCoordinate,tangent){ this._position=null; this._normal=null; this._textureCoordinate=null; this._tangent=null; this._position=position; this._normal=normal; this._textureCoordinate=textureCoordinate; this._tangent=tangent; } __class(VertexPositionNormalTextureTangent,'laya.d3.graphics.VertexPositionNormalTextureTangent'); var __proto=VertexPositionNormalTextureTangent.prototype; Laya.imps(__proto,{"laya.d3.graphics.IVertex":true}) __getset(0,__proto,'tangent',function(){ return this._tangent; }); __getset(0,__proto,'textureCoordinate',function(){ return this._textureCoordinate; }); __getset(0,__proto,'normal',function(){ return this._normal; }); __getset(0,__proto,'position',function(){ return this._position; }); __getset(0,__proto,'vertexDeclaration',function(){ return VertexPositionNormalTextureTangent._vertexDeclaration; }); __getset(1,VertexPositionNormalTextureTangent,'vertexDeclaration',function(){ return VertexPositionNormalTextureTangent._vertexDeclaration; }); __static(VertexPositionNormalTextureTangent, ['_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(44,[ new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"), new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"), new VertexElement(24,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV"), new VertexElement(32,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.TANGENT0*/"TANGENT0")]);} ]); return VertexPositionNormalTextureTangent; })() /** *@private *LoadModel 类用于模型加载。 */ //class laya.d3.loaders.LoadModel var LoadModel=(function(){ function LoadModel(data,mesh,materials,materialMap){ this._version=null; this._strings=['BLOCK','DATA',"STRINGS"]; this._materials=null; this._materialMap=null; this._fileData=null; this._readData=null; this._mesh=null; this._BLOCK={count:0}; this._DATA={offset:0,size:0}; this._STRINGS={offset:0,size:0}; this._shaderAttributes=null; this._mesh=mesh; this._materials=materials; this._materialMap=materialMap; this._onLoaded(data); } __class(LoadModel,'laya.d3.loaders.LoadModel'); var __proto=LoadModel.prototype; /** *@private */ __proto._onLoaded=function(data){ this._fileData=data; this._readData=new Byte(this._fileData); this._readData.pos=0; this._version=this._readData.readUTFString(); this.READ_BLOCK(); for (var i=0;i < this._BLOCK.count;i++){ var index=this._readData.getUint16(); var blockName=this._strings[index]; var fn=this["READ_"+blockName]; if (fn==null)throw new Error("model file err,no this function:"+index+" "+blockName); if (!fn.call(this))break ; } return this._mesh; } __proto.onError=function(){} /** *@private */ __proto._readString=function(){ return this._strings[this._readData.getUint16()]; } __proto.READ_BLOCK=function(){ var n=this._readData.getUint16(); this._BLOCK.count=this._readData.getUint16(); return true; } __proto.READ_DATA=function(){ this._DATA.offset=this._readData.getUint32(); this._DATA.size=this._readData.getUint32(); return true; } __proto.READ_STRINGS=function(){ this._STRINGS.offset=this._readData.getUint16(); this._STRINGS.size=this._readData.getUint16(); var ofs=this._readData.pos; this._readData.pos=this._STRINGS.offset+this._DATA.offset; for (var i=0;i < this._STRINGS.size;i++){ this._strings[i]=this._readData.readUTFString(); } this._readData.pos=ofs; return true; } __proto.READ_MATERIAL=function(){ var i=0,n=0; var index=this._readData.getUint16(); var shaderName=this._readString(); var url=this._readString(); if (url!=="null") this._materials[index]=Loader.getRes(this._materialMap[url]); else this._materials[index]=new BaseMaterial(); return true; } __proto.READ_MESH=function(){ var name=this._readString(); switch (this._version){ case "LAYAMODEL:01": console.log("Warning: The (.lm) file is converted by old fbxTools,please reConverted it use lastest fbxTools version,later we will remove the support of old version (.lm) support."); break ; case "LAYASKINANI:01":; var arrayBuffer=this._readData.__getBuffer(); var i=0,n=0; var bindPoseStart=this._readData.getUint32(); var binPoseLength=this._readData.getUint32(); var bindPoseDatas=new Float32Array(arrayBuffer.slice(bindPoseStart+this._DATA.offset,bindPoseStart+this._DATA.offset+binPoseLength)); this.mesh._bindPoses=[]; for (i=0,n=bindPoseDatas.length;i < n;i+=16){ var bindPose=new Matrix4x4(bindPoseDatas[i+0],bindPoseDatas[i+1],bindPoseDatas[i+2],bindPoseDatas[i+3],bindPoseDatas[i+4],bindPoseDatas[i+5],bindPoseDatas[i+6],bindPoseDatas[i+7],bindPoseDatas[i+8],bindPoseDatas[i+9],bindPoseDatas[i+10],bindPoseDatas[i+11],bindPoseDatas[i+12],bindPoseDatas[i+13],bindPoseDatas[i+14],bindPoseDatas[i+15]); this.mesh._bindPoses.push(bindPose); }; var inverseGlobalBindPoseStart=this._readData.getUint32(); var inverseGlobalBinPoseLength=this._readData.getUint32(); var invGloBindPoseDatas=new Float32Array(arrayBuffer.slice(inverseGlobalBindPoseStart+this._DATA.offset,inverseGlobalBindPoseStart+this._DATA.offset+inverseGlobalBinPoseLength)); this.mesh._inverseBindPoses=[]; for (i=0,n=invGloBindPoseDatas.length;i < n;i+=16){ var inverseGlobalBindPose=new Matrix4x4(invGloBindPoseDatas[i+0],invGloBindPoseDatas[i+1],invGloBindPoseDatas[i+2],invGloBindPoseDatas[i+3],invGloBindPoseDatas[i+4],invGloBindPoseDatas[i+5],invGloBindPoseDatas[i+6],invGloBindPoseDatas[i+7],invGloBindPoseDatas[i+8],invGloBindPoseDatas[i+9],invGloBindPoseDatas[i+10],invGloBindPoseDatas[i+11],invGloBindPoseDatas[i+12],invGloBindPoseDatas[i+13],invGloBindPoseDatas[i+14],invGloBindPoseDatas[i+15]); this.mesh._inverseBindPoses.push(inverseGlobalBindPose); } break ; default : throw new Error("LoadModel:unknown version."); } return true; } __proto.READ_SUBMESH=function(){ var className=this._readString(); var material=this._readData.getUint8(); var bufferAttribute=this._readString(); this._shaderAttributes=bufferAttribute.match(LoadModel._attrReg); var ibofs=this._readData.getUint32(); var ibsize=this._readData.getUint32(); var vbIndicesofs=this._readData.getUint32(); var vbIndicessize=this._readData.getUint32(); var vbofs=this._readData.getUint32(); var vbsize=this._readData.getUint32(); var boneDicofs=this._readData.getUint32(); var boneDicsize=this._readData.getUint32(); var arrayBuffer=this._readData.__getBuffer(); var submesh=new SubMesh(); var vertexDeclaration=this._getVertexDeclaration(); var vb=VertexBuffer3D.create(vertexDeclaration,vbsize / vertexDeclaration.vertexStride,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4,true); var vbStart=vbofs+this._DATA.offset; var vbArrayBuffer=arrayBuffer.slice(vbStart,vbStart+vbsize); vb.setData(new Float32Array(vbArrayBuffer)); submesh._vertexBuffer=vb; var vertexElements=vb.vertexDeclaration.getVertexElements(); for (var i=0;i < vertexElements.length;i++) submesh._bufferUsage[(vertexElements [i]).elementUsage]=vb; var ib=IndexBuffer3D.create(/*laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort",ibsize / 2,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4,true); var ibStart=ibofs+this._DATA.offset; var ibArrayBuffer=arrayBuffer.slice(ibStart,ibStart+ibsize); ib.setData(new Uint16Array(ibArrayBuffer)); submesh._indexBuffer=ib; var boneDicArrayBuffer=arrayBuffer.slice(boneDicofs+this._DATA.offset,boneDicofs+this._DATA.offset+boneDicsize); submesh._boneIndices=new Uint8Array(boneDicArrayBuffer); this._mesh._add(submesh); return true; } __proto.READ_DATAAREA=function(){ return false; } __proto._getVertexDeclaration=function(){ var position=false,normal=false,color=false,texcoord0=false,texcoord1=false,tangent=false,blendWeight=false,blendIndex=false; for (var i=0;i < this._shaderAttributes.length;i+=8){ switch (this._shaderAttributes[i]){ case "POSITION": position=true; break ; case "NORMAL": normal=true; break ; case "COLOR": color=true; break ; case "UV": texcoord0=true; break ; case "UV1": texcoord1=true; break ; case "BLENDWEIGHT": blendWeight=true; break ; case "BLENDINDICES": blendIndex=true; break ; case "TANGENT": tangent=true; break ; } }; var vertexDeclaration; if (position && normal && color && texcoord0 && texcoord1 && blendWeight && blendIndex && tangent) vertexDeclaration=VertexPositionNormalColorTexture0Texture1SkinTangent.vertexDeclaration; else if (position && normal && color && texcoord0 && texcoord1 && blendWeight && blendIndex) vertexDeclaration=VertexPositionNormalColorTexture0Texture1Skin.vertexDeclaration; else if (position && normal && texcoord0 && texcoord1 && blendWeight && blendIndex && tangent) vertexDeclaration=VertexPositionNormalTexture0Texture1SkinTangent.vertexDeclaration; else if (position && normal && texcoord0 && texcoord1 && blendWeight && blendIndex) vertexDeclaration=VertexPositionNormalTexture0Texture1Skin.vertexDeclaration; else if (position && normal && color && texcoord0 && blendWeight && blendIndex && tangent) vertexDeclaration=VertexPositionNormalColorTextureSkinTangent.vertexDeclaration; else if (position && normal && color && texcoord0 && blendWeight && blendIndex) vertexDeclaration=VertexPositionNormalColorTextureSkin.vertexDeclaration; else if (position && normal && texcoord0 && blendWeight && blendIndex && tangent) vertexDeclaration=VertexPositionNormalTextureSkinTangent.vertexDeclaration; else if (position && normal && texcoord0 && blendWeight && blendIndex) vertexDeclaration=VertexPositionNormalTextureSkin.vertexDeclaration; else if (position && normal && color && blendWeight && blendIndex && tangent) vertexDeclaration=VertexPositionNormalColorSkinTangent.vertexDeclaration; else if (position && normal && color && blendWeight && blendIndex) vertexDeclaration=VertexPositionNormalColorSkin.vertexDeclaration; else if (position && normal && color && texcoord0 && texcoord1 && tangent) vertexDeclaration=VertexPositionNormalColorTexture0Texture1Tangent.vertexDeclaration; else if (position && normal && color && texcoord0 && texcoord1) vertexDeclaration=VertexPositionNormalColorTexture0Texture1.vertexDeclaration; else if (position && normal && texcoord0 && texcoord1 && tangent) vertexDeclaration=VertexPositionNormalTexture0Texture1Tangent.vertexDeclaration; else if (position && normal && texcoord0 && texcoord1) vertexDeclaration=VertexPositionNormalTexture0Texture1.vertexDeclaration; else if (position && normal && color && texcoord0 && tangent) vertexDeclaration=VertexPositionNormalColorTextureTangent.vertexDeclaration; else if (position && normal && color && texcoord0) vertexDeclaration=VertexPositionNormalColorTexture.vertexDeclaration; else if (position && normal && texcoord0 && tangent) vertexDeclaration=VertexPositionNormalTextureTangent.vertexDeclaration; else if (position && normal && texcoord0) vertexDeclaration=VertexPositionNormalTexture.vertexDeclaration; else if (position && normal && color && tangent) vertexDeclaration=VertexPositionNormalColorTangent.vertexDeclaration; else if (position && normal && color) vertexDeclaration=VertexPositionNormalColor.vertexDeclaration; return vertexDeclaration; } __getset(0,__proto,'mesh',function(){ return this._mesh; }); LoadModel._attrReg=new RegExp("(\\w+)|([:,;])","g"); return LoadModel; })() /** *BoundBox 类用于创建包围盒。 */ //class laya.d3.math.BoundBox var BoundBox=(function(){ function BoundBox(min,max){ this.min=null; this.max=null; this.min=min; this.max=max; } __class(BoundBox,'laya.d3.math.BoundBox'); var __proto=BoundBox.prototype; /** *获取包围盒的8个角顶点。 *@param corners 返回顶点的输出队列。 */ __proto.getCorners=function(corners){ corners.length=8; var mine=this.min.elements; var maxe=this.max.elements; var minX=mine[0]; var minY=mine[1]; var minZ=mine[2]; var maxX=maxe[0]; var maxY=maxe[1]; var maxZ=maxe[2]; corners[0]=new Vector3(minX,maxY,maxZ); corners[1]=new Vector3(maxX,maxY,maxZ); corners[2]=new Vector3(maxX,minY,maxZ); corners[3]=new Vector3(minX,minY,maxZ); corners[4]=new Vector3(minX,maxY,minZ); corners[5]=new Vector3(maxX,maxY,minZ); corners[6]=new Vector3(maxX,minY,minZ); corners[7]=new Vector3(minX,minY,minZ); } __proto.toDefault=function(){ this.min.toDefault(); this.max.toDefault(); } BoundBox.createfromPoints=function(points,out){ if (points==null) throw new Error("points"); var min=new Vector3(Number.MAX_VALUE); var max=new Vector3(-Number.MAX_VALUE); for (var i=0;i < points.length;++i){ Vector3.min(min,points[i],min); Vector3.max(max,points[i],max); } out.min=min; out.max=max; } return BoundBox; })() /** *BoundFrustum 类用于创建锥截体。 */ //class laya.d3.math.BoundFrustum var BoundFrustum=(function(){ function BoundFrustum(matrix){ this._matrix=null; this._near=null; this._far=null; this._left=null; this._right=null; this._top=null; this._bottom=null; this._matrix=matrix; this._near=new Plane(new Vector3()); this._far=new Plane(new Vector3()); this._left=new Plane(new Vector3()); this._right=new Plane(new Vector3()); this._top=new Plane(new Vector3()); this._bottom=new Plane(new Vector3()); BoundFrustum._getPlanesFromMatrix(this._matrix,this._near,this._far,this._left,this._right,this._top,this._bottom); } __class(BoundFrustum,'laya.d3.math.BoundFrustum'); var __proto=BoundFrustum.prototype; /** *判断是否与其他锥截体相等。 *@param other 锥截体。 */ __proto.equalsBoundFrustum=function(other){ return this._matrix.equalsOtherMatrix(other.matrix) } /** *判断是否与其他对象相等。 *@param obj 对象。 */ __proto.equalsObj=function(obj){ if ((obj instanceof laya.d3.math.BoundFrustum )){ var bf=obj; return this.equalsBoundFrustum(bf); } return false; } /** *获取锥截体的任意一平面。 *0:近平面 *1:远平面 *2:左平面 *3:右平面 *4:顶平面 *5:底平面 *@param index 索引。 */ __proto.getPlane=function(index){ switch(index){ case 0: return this._near; case 1: return this._far; case 2: return this._left; case 3: return this._right; case 4: return this._top; case 5: return this._bottom; default : return null; } } /** *锥截体的8个顶点。 *@param corners 返回顶点的输出队列。 */ __proto.getCorners=function(corners){ corners[0]=BoundFrustum.get3PlaneInterPoint(this._near,this._bottom,this._right); corners[1]=BoundFrustum.get3PlaneInterPoint(this._near,this._top,this._right); corners[2]=BoundFrustum.get3PlaneInterPoint(this._near,this._top,this._left); corners[3]=BoundFrustum.get3PlaneInterPoint(this._near,this._bottom,this._left); corners[4]=BoundFrustum.get3PlaneInterPoint(this._far,this._bottom,this._right); corners[5]=BoundFrustum.get3PlaneInterPoint(this._far,this._top,this._right); corners[6]=BoundFrustum.get3PlaneInterPoint(this._far,this._top,this._left); corners[7]=BoundFrustum.get3PlaneInterPoint(this._far,this._bottom,this._left); } /** *与点的位置关系。返回-1,包涵;0,相交;1,不相交 *@param point 点。 */ __proto.ContainsPoint=function(point){ var result=Plane.PlaneIntersectionType_Front; var planeResult=Plane.PlaneIntersectionType_Front; for (var i=0;i < 6;i++){ switch(i){ case 0: planeResult=Collision.intersectsPlaneAndPoint(this._near,point); break ; case 1: planeResult=Collision.intersectsPlaneAndPoint(this._far,point); break ; case 2: planeResult=Collision.intersectsPlaneAndPoint(this._left,point); break ; case 3: planeResult=Collision.intersectsPlaneAndPoint(this._right,point); break ; case 4: planeResult=Collision.intersectsPlaneAndPoint(this._top,point); break ; case 5: planeResult=Collision.intersectsPlaneAndPoint(this._bottom,point); break ; } switch(planeResult){ case Plane.PlaneIntersectionType_Back: return /*laya.d3.math.ContainmentType.Disjoint*/0; case Plane.PlaneIntersectionType_Intersecting: result=Plane.PlaneIntersectionType_Intersecting; break ; } } switch(result){ case Plane.PlaneIntersectionType_Intersecting: return /*laya.d3.math.ContainmentType.Intersects*/2; default : return /*laya.d3.math.ContainmentType.Contains*/1; } } /** *与包围盒的位置关系。返回-1,包涵;0,相交;1,不相交 *@param box 包围盒。 */ __proto.ContainsBoundBox=function(box){ var plane; var result=/*laya.d3.math.ContainmentType.Contains*/1; for (var i=0;i < 6;i++){ plane=this.getPlane(i); this._getBoxToPlanePVertexNVertex(box,plane.normal,BoundFrustum._tempV30,BoundFrustum._tempV31); if (Collision.intersectsPlaneAndPoint(plane,BoundFrustum._tempV30)==Plane.PlaneIntersectionType_Back) return /*laya.d3.math.ContainmentType.Disjoint*/0; if (Collision.intersectsPlaneAndPoint(plane,BoundFrustum._tempV31)==Plane.PlaneIntersectionType_Back) result=/*laya.d3.math.ContainmentType.Intersects*/2; } return result; } /** *与包围球的位置关系。返回-1,包涵;0,相交;1,不相交 *@param sphere 包围球。 */ __proto.ContainsBoundSphere=function(sphere){ var result=Plane.PlaneIntersectionType_Front; var planeResult=Plane.PlaneIntersectionType_Front; for (var i=0;i < 6;i++){ switch(i){ case 0: planeResult=Collision.intersectsPlaneAndSphere(this._near,sphere); break ; case 1: planeResult=Collision.intersectsPlaneAndSphere(this._far,sphere); break ; case 2: planeResult=Collision.intersectsPlaneAndSphere(this._left,sphere); break ; case 3: planeResult=Collision.intersectsPlaneAndSphere(this._right,sphere); break ; case 4: planeResult=Collision.intersectsPlaneAndSphere(this._top,sphere); break ; case 5: planeResult=Collision.intersectsPlaneAndSphere(this._bottom,sphere); break ; } switch(planeResult){ case Plane.PlaneIntersectionType_Back: return /*laya.d3.math.ContainmentType.Disjoint*/0; case Plane.PlaneIntersectionType_Intersecting: result=Plane.PlaneIntersectionType_Intersecting; break ; } } switch(result){ case Plane.PlaneIntersectionType_Intersecting: return /*laya.d3.math.ContainmentType.Intersects*/2; default : return /*laya.d3.math.ContainmentType.Contains*/1; } } /** *@private */ __proto._getBoxToPlanePVertexNVertex=function(box,planeNormal,outP,outN){ var boxMin=box.min; var boxMinE=boxMin.elements; var boxMax=box.max; var boxMaxE=boxMax.elements; var planeNorE=planeNormal.elements; var planeNorEX=planeNorE[0]; var planeNorEY=planeNorE[1]; var planeNorEZ=planeNorE[2]; outP=boxMin; var outPE=outP.elements; if (planeNorEX >=0) outPE[0]=boxMaxE[0]; if (planeNorEY >=0) outPE[1]=boxMaxE[1]; if (planeNorEZ >=0) outPE[2]=boxMaxE[2]; outN=boxMax; var outNE=outN.elements; if (planeNorEX >=0) outNE[0]=boxMinE[0]; if (planeNorEY >=0) outNE[1]=boxMinE[1]; if (planeNorEZ >=0) outNE[2]=boxMinE[2]; } /** *获取顶平面。 *@return 顶平面。 */ __getset(0,__proto,'top',function(){ return this._top; }); /** *设置描述矩阵。 *@param matrix 描述矩阵。 */ /** *获取描述矩阵。 *@return 描述矩阵。 */ __getset(0,__proto,'matrix',function(){ return this._matrix; },function(matrix){ this._matrix=matrix; BoundFrustum._getPlanesFromMatrix(this._matrix,this._near,this._far,this._left,this._right,this._top,this._bottom); }); /** *获取近平面。 *@return 近平面。 */ __getset(0,__proto,'near',function(){ return this._near; }); /** *获取远平面。 *@return 远平面。 */ __getset(0,__proto,'far',function(){ return this._far; }); /** *获取左平面。 *@return 左平面。 */ __getset(0,__proto,'left',function(){ return this._left; }); /** *获取右平面。 *@return 右平面。 */ __getset(0,__proto,'right',function(){ return this._right; }); /** *获取底平面。 *@return 底平面。 */ __getset(0,__proto,'bottom',function(){ return this._bottom; }); BoundFrustum._getPlanesFromMatrix=function(m,np,fp,lp,rp,tp,bp){ var matrixE=m.elements; var m11=matrixE[0]; var m12=matrixE[1]; var m13=matrixE[2]; var m14=matrixE[3]; var m21=matrixE[4]; var m22=matrixE[5]; var m23=matrixE[6]; var m24=matrixE[7]; var m31=matrixE[8]; var m32=matrixE[9]; var m33=matrixE[10]; var m34=matrixE[11]; var m41=matrixE[12]; var m42=matrixE[13]; var m43=matrixE[14]; var m44=matrixE[15]; var nearNorE=np.normal.elements; nearNorE[0]=m13; nearNorE[1]=m23; nearNorE[2]=m33; np.distance=m43; np.normalize(); var farNorE=fp.normal.elements; farNorE[0]=m14-m13; farNorE[1]=m24-m23; farNorE[2]=m34-m33; fp.distance=m44-m43; fp.normalize(); var leftNorE=lp.normal.elements; leftNorE[0]=m14+m11; leftNorE[1]=m24+m21; leftNorE[2]=m34+m31; lp.distance=m44+m41; lp.normalize(); var rightNorE=rp.normal.elements; rightNorE[0]=m14-m11; rightNorE[1]=m24-m21; rightNorE[2]=m34-m31; rp.distance=m44-m41; rp.normalize(); var topNorE=tp.normal.elements; topNorE[0]=m14-m12; topNorE[1]=m24-m22; topNorE[2]=m34-m32; tp.distance=m44-m42; tp.normalize(); var bottomNorE=bp.normal.elements; bottomNorE[0]=m14+m12; bottomNorE[1]=m24+m22; bottomNorE[2]=m34+m32; bp.distance=m44+m42; bp.normalize(); } BoundFrustum.get3PlaneInterPoint=function(p1,p2,p3){ var p1Nor=p1.normal; var p2Nor=p2.normal; var p3Nor=p3.normal; Vector3.cross(p2Nor,p3Nor,BoundFrustum._tempV30); Vector3.cross(p3Nor,p1Nor,BoundFrustum._tempV31); Vector3.cross(p1Nor,p2Nor,BoundFrustum._tempV32); var a=Vector3.dot(p1Nor,BoundFrustum._tempV30); var b=Vector3.dot(p2Nor,BoundFrustum._tempV31); var c=Vector3.dot(p3Nor,BoundFrustum._tempV32); Vector3.scale(BoundFrustum._tempV30,-p1.distance / a,BoundFrustum._tempV33); Vector3.scale(BoundFrustum._tempV31,-p2.distance / b,BoundFrustum._tempV34); Vector3.scale(BoundFrustum._tempV32,-p3.distance / c,BoundFrustum._tempV35); Vector3.add(BoundFrustum._tempV33,BoundFrustum._tempV34,BoundFrustum._tempV36); Vector3.add(BoundFrustum._tempV35,BoundFrustum._tempV36,BoundFrustum._tempV37); var v=BoundFrustum._tempV37; return v; } __static(BoundFrustum, ['_tempV30',function(){return this._tempV30=new Vector3();},'_tempV31',function(){return this._tempV31=new Vector3();},'_tempV32',function(){return this._tempV32=new Vector3();},'_tempV33',function(){return this._tempV33=new Vector3();},'_tempV34',function(){return this._tempV34=new Vector3();},'_tempV35',function(){return this._tempV35=new Vector3();},'_tempV36',function(){return this._tempV36=new Vector3();},'_tempV37',function(){return this._tempV37=new Vector3();} ]); return BoundFrustum; })() /** *BoundSphere 类用于创建包围球。 */ //class laya.d3.math.BoundSphere var BoundSphere=(function(){ function BoundSphere(center,radius){ this.center=null; this.radius=NaN; this.center=center; this.radius=radius; } __class(BoundSphere,'laya.d3.math.BoundSphere'); var __proto=BoundSphere.prototype; __proto.toDefault=function(){ this.center.toDefault(); this.radius=0; } BoundSphere.createFromSubPoints=function(points,start,count,out){ if (points==null){ throw new Error("points"); } if (start < 0 || start >=points.length){ throw new Error("start"+start+"Must be in the range [0, "+(points.length-1)+"]"); } if (count < 0 || (start+count)> points.length){ throw new Error("count"+count+"Must be in the range <= "+points.length+"}"); }; var upperEnd=start+count; var center=BoundSphere._tempVector3; center.elements[0]=0; center.elements[1]=0; center.elements[2]=0; for (var i=start;i < upperEnd;++i){ Vector3.add(points[i],center,center); }; var outCenter=out.center; Vector3.scale(center,1 / count,outCenter); var radius=0.0; for (i=start;i < upperEnd;++i){ var distance=Vector3.distanceSquared(outCenter,points[i]); if (distance > radius) radius=distance; } out.radius=Math.sqrt(radius); } BoundSphere.createfromPoints=function(points,out){ if (points==null){ throw new Error("points"); } BoundSphere.createFromSubPoints(points,0,points.length,out); } __static(BoundSphere, ['_tempVector3',function(){return this._tempVector3=new Vector3();} ]); return BoundSphere; })() /** *Collision 类用于检测碰撞。 */ //class laya.d3.math.Collision var Collision=(function(){ /** *创建一个 Collision 实例。 */ function Collision(){} __class(Collision,'laya.d3.math.Collision'); Collision.distancePlaneToPoint=function(plane,point){ var dot=Vector3.dot(plane.normal,point); return dot-plane.distance; } Collision.distanceBoxToPoint=function(box,point){ var boxMine=box.min.elements; var boxMineX=boxMine[0]; var boxMineY=boxMine[1]; var boxMineZ=boxMine[2]; var boxMaxe=box.max.elements; var boxMaxeX=boxMaxe[0]; var boxMaxeY=boxMaxe[1]; var boxMaxeZ=boxMaxe[2]; var pointe=point.elements; var pointeX=pointe[0]; var pointeY=pointe[1]; var pointeZ=pointe[2]; var distance=0; if (pointeX < boxMineX) distance+=(boxMineX-pointeX)*(boxMineX-pointeX); if (pointeX > boxMaxeX) distance+=(boxMaxeX-pointeX)*(boxMaxeX-pointeX); if (pointeY < boxMineY) distance+=(boxMineY-pointeY)*(boxMineY-pointeY); if (pointeY > boxMaxeY) distance+=(boxMaxeY-pointeY)*(boxMaxeY-pointeY); if (pointeZ < boxMineZ) distance+=(boxMineZ-pointeZ)*(boxMineZ-pointeZ); if (pointeZ > boxMaxeZ) distance+=(boxMaxeZ-pointeZ)*(boxMaxeZ-pointeZ); return Math.sqrt(distance); } Collision.distanceBoxToBox=function(box1,box2){ var box1Mine=box1.min.elements; var box1MineX=box1Mine[0]; var box1MineY=box1Mine[1]; var box1MineZ=box1Mine[2]; var box1Maxe=box1.max.elements; var box1MaxeX=box1Maxe[0]; var box1MaxeY=box1Maxe[1]; var box1MaxeZ=box1Maxe[2]; var box2Mine=box2.min.elements; var box2MineX=box2Mine[0]; var box2MineY=box2Mine[1]; var box2MineZ=box2Mine[2]; var box2Maxe=box2.max.elements; var box2MaxeX=box2Maxe[0]; var box2MaxeY=box2Maxe[1]; var box2MaxeZ=box2Maxe[2]; var distance=0; var delta=NaN; if (box1MineX > box2MaxeX){ delta=box1MineX-box2MaxeX; distance+=delta *delta; }else if (box2MineX > box1MaxeX){ delta=box2MineX-box1MaxeX; distance+=delta *delta; } if (box1MineY > box2MaxeY){ delta=box1MineY-box2MaxeY; distance+=delta *delta; }else if (box2MineY > box1MaxeY){ delta=box2MineY-box1MaxeY; distance+=delta *delta; } if (box1MineZ > box2MaxeZ){ delta=box1MineZ-box2MaxeZ; distance+=delta *delta; }else if (box2MineZ > box1MaxeZ){ delta=box2MineZ-box1MaxeZ; distance+=delta *delta; } return Math.sqrt(distance); } Collision.distanceSphereToPoint=function(sphere,point){ var distance=Math.sqrt(Vector3.distanceSquared(sphere.center,point)); distance-=sphere.radius; return Math.max(distance,0); } Collision.distanceSphereToSphere=function(sphere1,sphere2){ var distance=Math.sqrt(Vector3.distanceSquared(sphere1.center,sphere2.center)); distance-=sphere1.radius+sphere2.radius; return Math.max(distance,0); } Collision.intersectsRayAndTriangleRD=function(ray,vertex1,vertex2,vertex3,out){ var rayO=ray.origin; var rayOe=rayO.elements; var rayOeX=rayOe[0]; var rayOeY=rayOe[1]; var rayOeZ=rayOe[2]; var rayD=ray.direction; var rayDe=rayD.elements; var rayDeX=rayDe[0]; var rayDeY=rayDe[1]; var rayDeZ=rayDe[2]; var v1e=vertex1.elements; var v1eX=v1e[0]; var v1eY=v1e[1]; var v1eZ=v1e[2]; var v2e=vertex2.elements; var v2eX=v2e[0]; var v2eY=v2e[1]; var v2eZ=v2e[2]; var v3e=vertex3.elements; var v3eX=v3e[0]; var v3eY=v3e[1]; var v3eZ=v3e[2]; var _tempV30e=Collision._tempV30.elements; var _tempV30eX=_tempV30e[0]; var _tempV30eY=_tempV30e[1]; var _tempV30eZ=_tempV30e[2]; _tempV30eX=v2eX-v1eX; _tempV30eY=v2eY-v1eY; _tempV30eZ=v2eZ-v1eZ; var _tempV31e=Collision._tempV31.elements; var _tempV31eX=_tempV31e[0]; var _tempV31eY=_tempV31e[1]; var _tempV31eZ=_tempV31e[2]; _tempV31eX=v3eX-v1eX; _tempV31eY=v3eY-v1eY; _tempV31eZ=v3eZ-v1eZ; var _tempV32e=Collision._tempV32.elements; var _tempV32eX=_tempV32e[0]; var _tempV32eY=_tempV32e[1]; var _tempV32eZ=_tempV32e[2]; _tempV32eX=(rayDeY *_tempV31eZ)-(rayDeZ *_tempV31eY); _tempV32eY=(rayDeZ *_tempV31eX)-(rayDeX *_tempV31eZ); _tempV32eZ=(rayDeX *_tempV31eY)-(rayDeY *_tempV31eX); var determinant=(_tempV30eX *_tempV32eX)+(_tempV30eY *_tempV32eY)+(_tempV30eZ *_tempV32eZ); if (MathUtils3D.isZero(determinant)){ out=0; return false; }; var inversedeterminant=1 / determinant; var _tempV33e=Collision._tempV33.elements; var _tempV33eX=_tempV33e[0]; var _tempV33eY=_tempV33e[1]; var _tempV33eZ=_tempV33e[2]; _tempV33eX=rayOeX-v1eX; _tempV33eY=rayOeY-v1eY; _tempV33eZ=rayOeZ-v1eZ; var triangleU=(_tempV33eX *_tempV32eX)+(_tempV33eY *_tempV32eY)+(_tempV33eZ *_tempV32eZ); triangleU *=inversedeterminant; if (triangleU < 0 || triangleU > 1){ out=0; return false; }; var _tempV34e=Collision._tempV34.elements; var _tempV34eX=_tempV34e[0]; var _tempV34eY=_tempV34e[1]; var _tempV34eZ=_tempV34e[2]; _tempV34eX=(_tempV33eY *_tempV30eZ)-(_tempV33eZ *_tempV30eY); _tempV34eY=(_tempV33eZ *_tempV30eX)-(_tempV33eX *_tempV30eZ); _tempV34eZ=(_tempV33eX *_tempV30eY)-(_tempV33eY *_tempV30eX); var triangleV=((rayDeX *_tempV34eX)+(rayDeY *_tempV34eY))+(rayDeZ *_tempV34eZ); triangleV *=inversedeterminant; if (triangleV < 0 || triangleU+triangleV > 1){ out=0; return false; }; var raydistance=(_tempV31eX *_tempV34eX)+(_tempV31eY *_tempV34eY)+(_tempV31eZ *_tempV34eZ); raydistance *=inversedeterminant; if (raydistance < 0){ out=0; return false; } out=raydistance; return true; } Collision.intersectsRayAndTriangleRP=function(ray,vertex1,vertex2,vertex3,out){ var distance=NaN; if (!Collision.intersectsRayAndTriangleRD(ray,vertex1,vertex2,vertex3,distance)){ out=Vector3.ZERO; return false; } Vector3.scale(ray.direction,distance,Collision._tempV30); Vector3.add(ray.origin,Collision._tempV30,out); return true; } Collision.intersectsRayAndPoint=function(ray,point){ Vector3.subtract(ray.origin,point,Collision._tempV30); var b=Vector3.dot(Collision._tempV30,ray.direction); var c=Vector3.dot(Collision._tempV30,Collision._tempV30)-MathUtils3D.zeroTolerance; if (c > 0 && b > 0) return false; var discriminant=b *b-c; if (discriminant < 0) return false; return true; } Collision.intersectsRayAndRay=function(ray1,ray2,out){ var ray1o=ray1.origin; var ray1oe=ray1o.elements; var ray1oeX=ray1oe[0]; var ray1oeY=ray1oe[1]; var ray1oeZ=ray1oe[2]; var ray1d=ray1.direction; var ray1de=ray1d.elements; var ray1deX=ray1de[0]; var ray1deY=ray1de[1]; var ray1deZ=ray1de[2]; var ray2o=ray2.origin; var ray2oe=ray2o.elements; var ray2oeX=ray2oe[0]; var ray2oeY=ray2oe[1]; var ray2oeZ=ray2oe[2]; var ray2d=ray2.direction; var ray2de=ray2d.elements; var ray2deX=ray2de[0]; var ray2deY=ray2de[1]; var ray2deZ=ray2de[2]; Vector3.cross(ray1d,ray2d,Collision._tempV30); var tempV3e=Collision._tempV30.elements; var denominator=Vector3.scalarLength(Collision._tempV30); if (MathUtils3D.isZero(denominator)){ if (MathUtils3D.nearEqual(ray2oeX,ray1oeX)&& MathUtils3D.nearEqual(ray2oeY,ray1oeY)&& MathUtils3D.nearEqual(ray2oeZ,ray1oeZ)){ out=Vector3.ZERO; return true; } } denominator=denominator *denominator; var m11=ray2oeX-ray1oeX; var m12=ray2oeY-ray1oeY; var m13=ray2oeZ-ray1oeZ; var m21=ray2deX; var m22=ray2deY; var m23=ray2deZ; var m31=tempV3e[0]; var m32=tempV3e[1]; var m33=tempV3e[2]; var dets=m11 *m22 *m33+m12 *m23 *m31+m13 *m21 *m32-m11 *m23 *m32-m12 *m21 *m33-m13 *m22 *m31; m21=ray1deX; m22=ray1deY; m23=ray1deZ; var dett=m11 *m22 *m33+m12 *m23 *m31+m13 *m21 *m32-m11 *m23 *m32-m12 *m21 *m33-m13 *m22 *m31; var s=dets / denominator; var t=dett / denominator; Vector3.scale(ray1d,s,Collision._tempV30); Vector3.scale(ray2d,s,Collision._tempV31); Vector3.add(ray1o,Collision._tempV30,Collision._tempV32); Vector3.add(ray2o,Collision._tempV31,Collision._tempV33); var point1e=Collision._tempV32.elements; var point2e=Collision._tempV33.elements; if (!MathUtils3D.nearEqual(point2e[0],point1e[0])|| !MathUtils3D.nearEqual(point2e[1],point1e[1])|| !MathUtils3D.nearEqual(point2e[2],point1e[2])){ out=Vector3.ZERO; return false; } out=Collision._tempV32; return true; } Collision.intersectsPlaneAndTriangle=function(plane,vertex1,vertex2,vertex3){ var test1=Collision.intersectsPlaneAndPoint(plane,vertex1); var test2=Collision.intersectsPlaneAndPoint(plane,vertex2); var test3=Collision.intersectsPlaneAndPoint(plane,vertex3); if (test1==Plane.PlaneIntersectionType_Front && test2==Plane.PlaneIntersectionType_Front && test3==Plane.PlaneIntersectionType_Front) return Plane.PlaneIntersectionType_Front; if (test1==Plane.PlaneIntersectionType_Back && test2==Plane.PlaneIntersectionType_Back && test3==Plane.PlaneIntersectionType_Back) return Plane.PlaneIntersectionType_Back; return Plane.PlaneIntersectionType_Intersecting; } Collision.intersectsRayAndPlaneRD=function(ray,plane,out){ var planeNor=plane.normal; var direction=Vector3.dot(planeNor,ray.direction); if (MathUtils3D.isZero(direction)){ out=0; return false; }; var position=Vector3.dot(planeNor,ray.origin); out=(-plane.distance-position)/ direction; if (out < 0){ out=0; return false; } return true; } Collision.intersectsRayAndPlaneRP=function(ray,plane,out){ var distance=NaN; if (!Collision.intersectsRayAndPlaneRD(ray,plane,distance)){ out=Vector3.ZERO; return false; } Vector3.scale(ray.direction,distance,Collision._tempV30); Vector3.add(ray.origin,Collision._tempV30,Collision._tempV31); out=Collision._tempV31; return true; } Collision.intersectsRayAndBoxRD=function(ray,box,out){ var rayoe=ray.origin.elements; var rayoeX=rayoe[0]; var rayoeY=rayoe[1]; var rayoeZ=rayoe[2]; var rayde=ray.direction.elements; var raydeX=rayde[0]; var raydeY=rayde[1]; var raydeZ=rayde[2]; var boxMine=box.min.elements; var boxMineX=boxMine[0]; var boxMineY=boxMine[1]; var boxMineZ=boxMine[2]; var boxMaxe=box.max.elements; var boxMaxeX=boxMaxe[0]; var boxMaxeY=boxMaxe[1]; var boxMaxeZ=boxMaxe[2]; out=0; var tmax=MathUtils3D.MaxValue; if (MathUtils3D.isZero(raydeX)){ if (rayoeX < boxMineX || rayoeX > boxMaxeX){ out=0; return false; } }else { var inverse=1 / raydeX; var t1=(boxMineX-rayoeX)*inverse; var t2=(boxMaxeX-rayoeX)*inverse; if (t1 > t2){ var temp=t1; t1=t2; t2=temp; } out=Math.max(t1,out); tmax=Math.min(t2,tmax); if (out > tmax){ out=0; return false; } } if (MathUtils3D.isZero(raydeY)){ if (rayoeY < boxMineY || rayoeY > boxMaxeY){ out=0; return false; } }else { var inverse1=1 / raydeY; var t3=(boxMineY-rayoeY)*inverse1; var t4=(boxMaxeY-rayoeY)*inverse1; if (t3 > t4){ var temp1=t3; t3=t4; t4=temp1; } out=Math.max(t3,out); tmax=Math.min(t4,tmax); if (out > tmax){ out=0; return false; } } if (MathUtils3D.isZero(raydeZ)){ if (rayoeZ < boxMineZ || rayoeZ > boxMaxeZ){ out=0; return false; } }else { var inverse2=1 / raydeZ; var t5=(boxMineZ-rayoeZ)*inverse2; var t6=(boxMaxeZ-rayoeZ)*inverse2; if (t5 > t6){ var temp2=t5; t5=t6; t6=temp2; } out=Math.max(t5,out); tmax=Math.min(t6,tmax); if (out > tmax){ out=0; return false; } } return true; } Collision.intersectsRayAndBoxRP=function(ray,box,out){ var distance=NaN; if (!Collision.intersectsRayAndBoxRD(ray,box,distance)){ out=Vector3.ZERO; return false; } Vector3.scale(ray.direction,distance,Collision._tempV30); Vector3.add(ray.origin,Collision._tempV30,Collision._tempV31); out=Collision._tempV31; return true; } Collision.intersectsRayAndSphereRD=function(ray,sphere,out){ var sphereR=sphere.radius; Vector3.subtract(ray.origin,sphere.center,Collision._tempV30); var b=Vector3.dot(Collision._tempV30,ray.direction); var c=Vector3.dot(Collision._tempV30,Collision._tempV30)-(sphereR *sphereR); if (c > 0 && b > 0){ out=0; return false; }; var discriminant=b *b-c; if (discriminant < 0){ out=0; return false; } out=-b-Math.sqrt(discriminant); if (out < 0) out=0; return true; } Collision.intersectsRayAndSphereRP=function(ray,sphere,out){ var distance=NaN; if (!Collision.intersectsRayAndSphereRD(ray,sphere,distance)){ out=Vector3.ZERO; return false; } Vector3.scale(ray.direction,distance,Collision._tempV30); Vector3.add(ray.origin,Collision._tempV30,Collision._tempV31); out=Collision._tempV31; return true; } Collision.intersectsSphereAndTriangle=function(sphere,vertex1,vertex2,vertex3){ var sphereC=sphere.center; var sphereR=sphere.radius; Collision.closestPointPointTriangle(sphereC,vertex1,vertex2,vertex3,Collision._tempV30); Vector3.subtract(Collision._tempV30,sphereC,Collision._tempV31); var dot=Vector3.dot(Collision._tempV31,Collision._tempV31); return dot <=sphereR *sphereR; } Collision.intersectsPlaneAndPoint=function(plane,point){ var distance=Vector3.dot(plane.normal,point)+plane.distance; if (distance > 0) return Plane.PlaneIntersectionType_Front; else if (distance < 0) return Plane.PlaneIntersectionType_Back; else return Plane.PlaneIntersectionType_Intersecting; } Collision.intersectsPlaneAndPlane=function(plane1,plane2){ Vector3.cross(plane1.normal,plane2.normal,Collision._tempV30); var denominator=Vector3.dot(Collision._tempV30,Collision._tempV30); if (MathUtils3D.isZero(denominator)) return false; return true; } Collision.intersectsPlaneAndPlaneRL=function(plane1,plane2,line){ var plane1nor=plane1.normal; var plane2nor=plane2.normal; Vector3.cross(plane1nor,plane2nor,Collision._tempV34); var denominator=Vector3.dot(Collision._tempV34,Collision._tempV34); if (MathUtils3D.isZero(denominator)) return false; Vector3.scale(plane2nor,plane1.distance,Collision._tempV30); Vector3.scale(plane1nor,plane2.distance,Collision._tempV31); Vector3.subtract(Collision._tempV30,Collision._tempV31,Collision._tempV32); Vector3.cross(Collision._tempV32,Collision._tempV34,Collision._tempV33); Vector3.normalize(Collision._tempV34,Collision._tempV34); line=new Ray(Collision._tempV33,Collision._tempV34); return true; } Collision.intersectsPlaneAndBox=function(plane,box){ var planeD=plane.distance; var planeNor=plane.normal; var planeNore=planeNor.elements; var planeNoreX=planeNore[0]; var planeNoreY=planeNore[1]; var planeNoreZ=planeNore[2]; var boxMine=box.min.elements; var boxMineX=boxMine[0]; var boxMineY=boxMine[1]; var boxMineZ=boxMine[2]; var boxMaxe=box.max.elements; var boxMaxeX=boxMaxe[0]; var boxMaxeY=boxMaxe[1]; var boxMaxeZ=boxMaxe[2]; Collision._tempV30.elements[0]=(planeNoreX > 0)? boxMineX :boxMaxeX; Collision._tempV30.elements[1]=(planeNoreY > 0)? boxMineY :boxMaxeY; Collision._tempV30.elements[2]=(planeNoreZ > 0)? boxMineZ :boxMaxeZ; Collision._tempV31.elements[0]=(planeNoreX > 0)? boxMaxeX :boxMineX; Collision._tempV31.elements[1]=(planeNoreY > 0)? boxMaxeY :boxMineY; Collision._tempV31.elements[2]=(planeNoreZ > 0)? boxMaxeZ :boxMineZ; var distance=Vector3.dot(planeNor,Collision._tempV30); if (distance+planeD > 0) return Plane.PlaneIntersectionType_Front; distance=Vector3.dot(planeNor,Collision._tempV31); if (distance+planeD < 0) return Plane.PlaneIntersectionType_Back; return Plane.PlaneIntersectionType_Intersecting; } Collision.intersectsPlaneAndSphere=function(plane,sphere){ var sphereR=sphere.radius; var distance=Vector3.dot(plane.normal,sphere.center)+plane.distance; if (distance > sphereR) return Plane.PlaneIntersectionType_Front; if (distance <-sphereR) return Plane.PlaneIntersectionType_Back; return Plane.PlaneIntersectionType_Intersecting; } Collision.intersectsBoxAndBox=function(box1,box2){ var box1Mine=box1.min.elements; var box1Maxe=box1.max.elements; var box2Mine=box2.min.elements; var box2Maxe=box2.max.elements; if (box1Mine[0] > box2Maxe[0] || box2Mine[0] > box1Maxe[0]) return false; if (box1Mine[1] > box2Maxe[1] || box2Mine[1] > box1Maxe[1]) return false; if (box1Mine[2] > box2Maxe[2] || box2Mine[2] > box1Maxe[2]) return false; return true; } Collision.intersectsBoxAndSphere=function(box,sphere){ var sphereC=sphere.center; var sphereR=sphere.radius; Vector3.Clamp(sphereC,box.min,box.max,Collision._tempV30); var distance=Vector3.distanceSquared(sphereC,Collision._tempV30); return distance <=sphereR *sphereR; } Collision.intersectsSphereAndSphere=function(sphere1,sphere2){ var radiisum=sphere1.radius+sphere2.radius; return Vector3.distanceSquared(sphere1.center,sphere2.center)<=radiisum *radiisum; } Collision.boxContainsPoint=function(box,point){ var boxMine=box.min.elements; var boxMaxe=box.max.elements; var pointe=point.elements; if (boxMine[0] <=pointe[0] && boxMaxe[0] >=pointe[0] && boxMine[1] <=pointe[1] && boxMaxe[1] >=pointe[1] && boxMine[2] <=pointe[2] && boxMaxe[2] >=pointe[2]) return /*laya.d3.math.ContainmentType.Contains*/1; return /*laya.d3.math.ContainmentType.Disjoint*/0; } Collision.boxContainsBox=function(box1,box2){ var box1Mine=box1.min.elements; var box1MineX=box1Mine[0]; var box1MineY=box1Mine[1]; var box1MineZ=box1Mine[2]; var box1Maxe=box1.max.elements; var box1MaxeX=box1Maxe[0]; var box1MaxeY=box1Maxe[1]; var box1MaxeZ=box1Maxe[2]; var box2Mine=box2.min.elements; var box2MineX=box2Mine[0]; var box2MineY=box2Mine[1]; var box2MineZ=box2Mine[2]; var box2Maxe=box2.max.elements; var box2MaxeX=box2Maxe[0]; var box2MaxeY=box2Maxe[1]; var box2MaxeZ=box2Maxe[2]; if (box1MaxeX < box2MineX || box1MineX > box2MaxeX) return /*laya.d3.math.ContainmentType.Disjoint*/0; if (box1MaxeY < box2MineY || box1MineY > box2MaxeY) return /*laya.d3.math.ContainmentType.Disjoint*/0; if (box1MaxeZ < box2MineZ || box1MineZ > box2MaxeZ) return /*laya.d3.math.ContainmentType.Disjoint*/0; if (box1MineX <=box2MineX && box2MaxeX <=box2MineX && box1MineY <=box2MineY && box2MaxeY <=box1MaxeY && box1MineZ <=box2MineZ && box2MaxeZ <=box1MaxeZ){ return /*laya.d3.math.ContainmentType.Contains*/1; } return /*laya.d3.math.ContainmentType.Intersects*/2; } Collision.boxContainsSphere=function(box,sphere){ var boxMin=box.min; var boxMine=boxMin.elements; var boxMineX=boxMine[0]; var boxMineY=boxMine[1]; var boxMineZ=boxMine[2]; var boxMax=box.max; var boxMaxe=boxMax.elements; var boxMaxeX=boxMaxe[0]; var boxMaxeY=boxMaxe[1]; var boxMaxeZ=boxMaxe[2]; var sphereC=sphere.center; var sphereCe=sphereC.elements; var sphereCeX=sphereCe[0]; var sphereCeY=sphereCe[1]; var sphereCeZ=sphereCe[2]; var sphereR=sphere.radius; Vector3.Clamp(sphereC,boxMin,boxMax,Collision._tempV30); var distance=Vector3.distanceSquared(sphereC,Collision._tempV30); if (distance > sphereR *sphereR) return /*laya.d3.math.ContainmentType.Disjoint*/0; if ((((boxMineX+sphereR <=sphereCeX)&& (sphereCeX <=boxMaxeX-sphereR))&& ((boxMaxeX-boxMineX > sphereR)&& (boxMineY+sphereR <=sphereCeY)))&& (((sphereCeY <=boxMaxeY-sphereR)&& (boxMaxeY-boxMineY > sphereR))&& (((boxMineZ+sphereR <=sphereCeZ)&& (sphereCeZ <=boxMaxeZ-sphereR))&& (boxMaxeZ-boxMineZ > sphereR)))) return /*laya.d3.math.ContainmentType.Contains*/1; return /*laya.d3.math.ContainmentType.Intersects*/2; } Collision.sphereContainsPoint=function(sphere,point){ if (Vector3.distanceSquared(point,sphere.center)<=sphere.radius *sphere.radius) return /*laya.d3.math.ContainmentType.Contains*/1; return /*laya.d3.math.ContainmentType.Disjoint*/0; } Collision.sphereContainsTriangle=function(sphere,vertex1,vertex2,vertex3){ var test1=Collision.sphereContainsPoint(sphere,vertex1); var test2=Collision.sphereContainsPoint(sphere,vertex2); var test3=Collision.sphereContainsPoint(sphere,vertex3); if (test1==/*laya.d3.math.ContainmentType.Contains*/1 && test2==/*laya.d3.math.ContainmentType.Contains*/1 && test3==/*laya.d3.math.ContainmentType.Contains*/1) return /*laya.d3.math.ContainmentType.Contains*/1; if (Collision.intersectsSphereAndTriangle(sphere,vertex1,vertex2,vertex3)) return /*laya.d3.math.ContainmentType.Intersects*/2; return /*laya.d3.math.ContainmentType.Disjoint*/0; } Collision.sphereContainsBox=function(sphere,box){ var sphereC=sphere.center; var sphereCe=sphereC.elements; var sphereCeX=sphereCe[0]; var sphereCeY=sphereCe[1]; var sphereCeZ=sphereCe[2]; var sphereR=sphere.radius; var boxMin=box.min; var boxMine=boxMin.elements; var boxMineX=boxMine[0]; var boxMineY=boxMine[1]; var boxMineZ=boxMine[2]; var boxMax=box.max; var boxMaxe=boxMax.elements; var boxMaxeX=boxMaxe[0]; var boxMaxeY=boxMaxe[1]; var boxMaxeZ=boxMaxe[2]; var _tempV30e=Collision._tempV30.elements; var _tempV30eX=_tempV30e[0]; var _tempV30eY=_tempV30e[1]; var _tempV30eZ=_tempV30e[2]; if (!Collision.intersectsBoxAndSphere(box,sphere)) return /*laya.d3.math.ContainmentType.Disjoint*/0; var radiusSquared=sphereR *sphereR; _tempV30eX=sphereCeX-boxMineX; _tempV30eY=sphereCeY-boxMaxeY; _tempV30eZ=sphereCeZ-boxMaxeZ; if (Vector3.scalarLengthSquared(Collision._tempV30)> radiusSquared) return /*laya.d3.math.ContainmentType.Intersects*/2; _tempV30eX=sphereCeX-boxMaxeX; _tempV30eY=sphereCeY-boxMaxeY; _tempV30eZ=sphereCeZ-boxMaxeZ; if (Vector3.scalarLengthSquared(Collision._tempV30)> radiusSquared) return /*laya.d3.math.ContainmentType.Intersects*/2; _tempV30eX=sphereCeX-boxMaxeX; _tempV30eY=sphereCeY-boxMineY; _tempV30eZ=sphereCeZ-boxMaxeZ; if (Vector3.scalarLengthSquared(Collision._tempV30)> radiusSquared) return /*laya.d3.math.ContainmentType.Intersects*/2; _tempV30eX=sphereCeX-boxMineX; _tempV30eY=sphereCeY-boxMineY; _tempV30eZ=sphereCeZ-boxMaxeZ; if (Vector3.scalarLengthSquared(Collision._tempV30)> radiusSquared) return /*laya.d3.math.ContainmentType.Intersects*/2; _tempV30eX=sphereCeX-boxMineX; _tempV30eY=sphereCeY-boxMaxeY; _tempV30eZ=sphereCeZ-boxMineZ; if (Vector3.scalarLengthSquared(Collision._tempV30)> radiusSquared) return /*laya.d3.math.ContainmentType.Intersects*/2; _tempV30eX=sphereCeX-boxMaxeX; _tempV30eY=sphereCeY-boxMaxeY; _tempV30eZ=sphereCeZ-boxMineZ; if (Vector3.scalarLengthSquared(Collision._tempV30)> radiusSquared) return /*laya.d3.math.ContainmentType.Intersects*/2; _tempV30eX=sphereCeX-boxMaxeX; _tempV30eY=sphereCeY-boxMineY; _tempV30eZ=sphereCeZ-boxMineZ; if (Vector3.scalarLengthSquared(Collision._tempV30)> radiusSquared) return /*laya.d3.math.ContainmentType.Intersects*/2; _tempV30eX=sphereCeX-boxMineX; _tempV30eY=sphereCeY-boxMineY; _tempV30eZ=sphereCeZ-boxMineZ; if (Vector3.scalarLengthSquared(Collision._tempV30)> radiusSquared) return /*laya.d3.math.ContainmentType.Intersects*/2; return /*laya.d3.math.ContainmentType.Contains*/1; } Collision.sphereContainsSphere=function(sphere1,sphere2){ var sphere1R=sphere1.radius; var sphere2R=sphere2.radius; var distance=Vector3.distance(sphere1.center,sphere2.center); if (sphere1R+sphere2R < distance) return /*laya.d3.math.ContainmentType.Disjoint*/0; if (sphere1R-sphere2R < distance) return /*laya.d3.math.ContainmentType.Intersects*/2; return /*laya.d3.math.ContainmentType.Contains*/1; } Collision.closestPointPointTriangle=function(point,vertex1,vertex2,vertex3,out){ Vector3.subtract(vertex2,vertex1,Collision._tempV30); Vector3.subtract(vertex3,vertex1,Collision._tempV31); Vector3.subtract(point,vertex1,Collision._tempV32); Vector3.subtract(point,vertex2,Collision._tempV33); Vector3.subtract(point,vertex3,Collision._tempV34); var d1=Vector3.dot(Collision._tempV30,Collision._tempV32); var d2=Vector3.dot(Collision._tempV31,Collision._tempV32); var d3=Vector3.dot(Collision._tempV30,Collision._tempV33); var d4=Vector3.dot(Collision._tempV31,Collision._tempV33); var d5=Vector3.dot(Collision._tempV30,Collision._tempV34); var d6=Vector3.dot(Collision._tempV31,Collision._tempV34); if (d1 <=0 && d2 <=0){ vertex1.cloneTo(out); return; } if (d3 >=0 && d4 <=d3){ vertex2.cloneTo(out); return; }; var vc=d1 *d4-d3 *d2; if (vc <=0 && d1 >=0 && d3 <=0){ var v=d1 / (d1-d3); Vector3.scale(Collision._tempV30,v,out); Vector3.add(vertex1,out,out); return; } if (d6 >=0 && d5 <=d6){ vertex3.cloneTo(out); return; }; var vb=d5 *d2-d1 *d6; if (vb <=0 && d2 >=0 && d6 <=0){ var w=d2 / (d2-d6); Vector3.scale(Collision._tempV31,w,out); Vector3.add(vertex1,out,out); return; }; var va=d3 *d6-d5 *d4; if (va <=0 && (d4-d3)>=0 && (d5-d6)>=0){ var w3=(d4-d3)/ ((d4-d3)+(d5-d6)); Vector3.subtract(vertex3,vertex2,out); Vector3.scale(out,w3,out); Vector3.add(vertex2,out,out); return; }; var denom=1 / (va+vb+vc); var v2=vb *denom; var w2=vc *denom; Vector3.scale(Collision._tempV30,v2,Collision._tempV35); Vector3.scale(Collision._tempV31,w2,Collision._tempV36); Vector3.add(Collision._tempV35,Collision._tempV36,out); Vector3.add(vertex1,out,out); } Collision.closestPointPlanePoint=function(plane,point,out){ var planeN=plane.normal; var t=Vector3.dot(planeN,point)-plane.distance; Vector3.scale(planeN,t,Collision._tempV30); Vector3.subtract(point,Collision._tempV30,out); } Collision.closestPointBoxPoint=function(box,point,out){ Vector3.max(point,box.min,Collision._tempV30); Vector3.min(Collision._tempV30,box.max,out); } Collision.closestPointSpherePoint=function(sphere,point,out){ var sphereC=sphere.center; Vector3.subtract(point,sphereC,out); Vector3.normalize(out,out); Vector3.scale(out,sphere.radius,out); Vector3.add(out,sphereC,out); } Collision.closestPointSphereSphere=function(sphere1,sphere2,out){ var sphere1C=sphere1.center; Vector3.subtract(sphere2.center,sphere1C,out); Vector3.normalize(out,out); Vector3.scale(out,sphere1.radius,out); Vector3.add(out,sphere1C,out); } __static(Collision, ['_tempV30',function(){return this._tempV30=new Vector3();},'_tempV31',function(){return this._tempV31=new Vector3();},'_tempV32',function(){return this._tempV32=new Vector3();},'_tempV33',function(){return this._tempV33=new Vector3();},'_tempV34',function(){return this._tempV34=new Vector3();},'_tempV35',function(){return this._tempV35=new Vector3();},'_tempV36',function(){return this._tempV36=new Vector3();} ]); return Collision; })() /** *ContainmentType 类用于定义空间物体位置关系。 */ //class laya.d3.math.ContainmentType var ContainmentType=(function(){ function ContainmentType(){}; __class(ContainmentType,'laya.d3.math.ContainmentType'); ContainmentType.Disjoint=0; ContainmentType.Contains=1; ContainmentType.Intersects=2; return ContainmentType; })() /** *MathUtils 类用于创建数学工具。 */ //class laya.d3.math.MathUtils3D var MathUtils3D=(function(){ /** *创建一个 MathUtils 实例。 */ function MathUtils3D(){} __class(MathUtils3D,'laya.d3.math.MathUtils3D'); MathUtils3D.isZero=function(v){ return Math.abs(v)< MathUtils3D.zeroTolerance; } MathUtils3D.nearEqual=function(n1,n2){ if (MathUtils3D.isZero(n1-n2)) return true; return false; } MathUtils3D.fastInvSqrt=function(value){ if (MathUtils3D.isZero(value)) return value; return 1.0 / Math.sqrt(value); } __static(MathUtils3D, ['zeroTolerance',function(){return this.zeroTolerance=1e-6;},'MaxValue',function(){return this.MaxValue=3.40282347e+38;},'MinValue',function(){return this.MinValue=-3.40282347e+38;} ]); return MathUtils3D; })() /** *Matrix3x3 类用于创建3x3矩阵。 */ //class laya.d3.math.Matrix3x3 var Matrix3x3=(function(){ function Matrix3x3(){ //this.elements=null; var e=this.elements=new Float32Array(9); e[0]=1; e[1]=0; e[2]=0; e[3]=0; e[4]=1; e[5]=0; e[6]=0; e[7]=0; e[8]=1; } __class(Matrix3x3,'laya.d3.math.Matrix3x3'); var __proto=Matrix3x3.prototype; /** *计算3x3矩阵的行列式 *@return 矩阵的行列式 */ __proto.determinant=function(){ var f=this.elements; var a00=f[0],a01=f[1],a02=f[2]; var a10=f[3],a11=f[4],a12=f[5]; var a20=f[6],a21=f[7],a22=f[8]; return a00 *(a22 *a11-a12 *a21)+a01 *(-a22 *a10+a12 *a20)+a02 *(a21 *a10-a11 *a20); } /** *通过一个二维向量转换3x3矩阵 *@param tra 转换向量 *@param out 输出矩阵 */ __proto.translate=function(trans,out){ var e=out.elements; var f=this.elements; var g=trans.elements; var a00=f[0],a01=f[1],a02=f[2]; var a10=f[3],a11=f[4],a12=f[5]; var a20=f[6],a21=f[7],a22=f[8]; var x=g[0],y=g[1]; e[0]=a00; e[1]=a01; e[2]=a02; e[3]=a10; e[4]=a11; e[5]=a12; e[6]=x *a00+y *a10+a20; e[7]=x *a01+y *a11+a21; e[8]=x *a02+y *a12+a22; } /** *根据指定角度旋转3x3矩阵 *@param rad 旋转角度 *@param out 输出矩阵 */ __proto.rotate=function(rad,out){ var e=out.elements; var f=this.elements; var a00=f[0],a01=f[1],a02=f[2]; var a10=f[3],a11=f[4],a12=f[5]; var a20=f[6],a21=f[7],a22=f[8]; var s=Math.sin(rad); var c=Math.cos(rad); e[0]=c *a00+s *a10; e[1]=c *a01+s *a11; e[2]=c *a02+s *a12; e[3]=c *a10-s *a00; e[4]=c *a11-s *a01; e[5]=c *a12-s *a02; e[6]=a20; e[7]=a21; e[8]=a22; } /** *根据制定缩放3x3矩阵 *@param scale 缩放值 *@param out 输出矩阵 */ __proto.scale=function(scale,out){ var e=out.elements; var f=this.elements; var g=scale.elements; var x=g[0],y=g[1]; e[0]=x *f[0]; e[1]=x *f[1]; e[2]=x *f[2]; e[3]=y *f[3]; e[4]=y *f[4]; e[5]=y *f[5]; e[6]=f[6]; e[7]=f[7]; e[8]=f[8]; } /** *计算3x3矩阵的逆矩阵 *@param out 输出的逆矩阵 */ __proto.invert=function(out){ var e=out.elements; var f=this.elements; var a00=f[0],a01=f[1],a02=f[2]; var a10=f[3],a11=f[4],a12=f[5]; var a20=f[6],a21=f[7],a22=f[8]; var b01=a22 *a11-a12 *a21; var b11=-a22 *a10+a12 *a20; var b21=a21 *a10-a11 *a20; var det=a00 *b01+a01 *b11+a02 *b21; if (!det){ out=null; } det=1.0 / det; e[0]=b01 *det; e[1]=(-a22 *a01+a02 *a21)*det; e[2]=(a12 *a01-a02 *a11)*det; e[3]=b11 *det; e[4]=(a22 *a00-a02 *a20)*det; e[5]=(-a12 *a00+a02 *a10)*det; e[6]=b21 *det; e[7]=(-a21 *a00+a01 *a20)*det; e[8]=(a11 *a00-a01 *a10)*det; } /** *计算3x3矩阵的转置矩阵 *@param out 输出矩阵 */ __proto.transpose=function(out){ var e=out.elements; var f=this.elements; if (out===this){ var a01=f[1],a02=f[2],a12=f[5]; e[1]=f[3]; e[2]=f[6]; e[3]=a01; e[5]=f[7]; e[6]=a02; e[7]=a12; }else { e[0]=f[0]; e[1]=f[3]; e[2]=f[6]; e[3]=f[1]; e[4]=f[4]; e[5]=f[7]; e[6]=f[2]; e[7]=f[5]; e[8]=f[8]; } } /**设置已有的矩阵为单位矩阵*/ __proto.identity=function(){ var e=this.elements; e[0]=1; e[1]=0; e[2]=0; e[3]=0; e[4]=1; e[5]=0; e[6]=0; e[7]=0; e[8]=1; } /** *克隆一个3x3矩阵 *@param out 输出的3x3矩阵 */ __proto.cloneTo=function(out){ var i,s,d; s=this.elements; d=out.elements; if (s===d){ return; } for (i=0;i < 9;++i){ d[i]=s[i]; } } /** *从一个3x3矩阵复制 *@param sou 源3x3矩阵 */ __proto.copyFrom=function(sou){ var i,s,d; s=sou.elements; d=this.elements; if (s===d){ return; } for (i=0;i < 9;++i){ d[i]=s[i]; } } /** *从一个数组复制 *@param sou 源Float32Array数组 */ __proto.copyFromArray=function(sou){ var i,d; d=this.elements; if (sou===d){ return; } for (i=0;i < 9;++i){ d[i]=sou[i]; } } Matrix3x3.createFromTranslation=function(trans,out){ var e=out.elements; var g=trans.elements; out[0]=1; out[1]=0; out[2]=0; out[3]=0; out[4]=1; out[5]=0; out[6]=g[0]; out[7]=g[1]; out[8]=1; } Matrix3x3.createFromRotation=function(rad,out){ var e=out.elements; var s=Math.sin(rad),c=Math.cos(rad); e[0]=c; e[1]=s; e[2]=0; e[3]=-s; e[4]=c; e[5]=0; e[6]=0; e[7]=0; e[8]=1; } Matrix3x3.createFromScaling=function(scale,out){ var e=out.elements; var g=scale.elements; e[0]=g[0]; e[1]=0; e[2]=0; e[3]=0; e[4]=g[1]; e[5]=0; e[6]=0; e[7]=0; e[8]=1; } Matrix3x3.createFromMatrix4x4=function(sou,out){ out[0]=sou[0]; out[1]=sou[1]; out[2]=sou[2]; out[3]=sou[4]; out[4]=sou[5]; out[5]=sou[6]; out[6]=sou[8]; out[7]=sou[9]; out[8]=sou[10]; } Matrix3x3.multiply=function(left,right,out){ var e=out.elements; var f=left.elements; var g=right.elements; var a00=f[0],a01=f[1],a02=f[2]; var a10=f[3],a11=f[4],a12=f[5]; var a20=f[6],a21=f[7],a22=f[8]; var b00=g[0],b01=g[1],b02=g[2]; var b10=g[3],b11=g[4],b12=g[5]; var b20=g[6],b21=g[7],b22=g[8]; e[0]=b00 *a00+b01 *a10+b02 *a20; e[1]=b00 *a01+b01 *a11+b02 *a21; e[2]=b00 *a02+b01 *a12+b02 *a22; e[3]=b10 *a00+b11 *a10+b12 *a20; e[4]=b10 *a01+b11 *a11+b12 *a21; e[5]=b10 *a02+b11 *a12+b12 *a22; e[6]=b20 *a00+b21 *a10+b22 *a20; e[7]=b20 *a01+b21 *a11+b22 *a21; e[8]=b20 *a02+b21 *a12+b22 *a22; } Matrix3x3.DEFAULT=new Matrix3x3(); return Matrix3x3; })() /** *Matrix4x4 类用于创建4x4矩阵。 */ //class laya.d3.math.Matrix4x4 var Matrix4x4=(function(){ function Matrix4x4(m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44){ //this.elements=null; (m11===void 0)&& (m11=1); (m12===void 0)&& (m12=0); (m13===void 0)&& (m13=0); (m14===void 0)&& (m14=0); (m21===void 0)&& (m21=0); (m22===void 0)&& (m22=1); (m23===void 0)&& (m23=0); (m24===void 0)&& (m24=0); (m31===void 0)&& (m31=0); (m32===void 0)&& (m32=0); (m33===void 0)&& (m33=1); (m34===void 0)&& (m34=0); (m41===void 0)&& (m41=0); (m42===void 0)&& (m42=0); (m43===void 0)&& (m43=0); (m44===void 0)&& (m44=1); var e=this.elements=new Float32Array(16); e[0]=m11; e[1]=m12; e[2]=m13; e[3]=m14; e[4]=m21; e[5]=m22; e[6]=m23; e[7]=m24; e[8]=m31; e[9]=m32; e[10]=m33; e[11]=m34; e[12]=m41; e[13]=m42; e[14]=m43; e[15]=m44; } __class(Matrix4x4,'laya.d3.math.Matrix4x4'); var __proto=Matrix4x4.prototype; /** *判断两个4x4矩阵的值是否相等。 *@param other 4x4矩阵 */ __proto.equalsOtherMatrix=function(other){ var e=this.elements; var oe=other.elements; return (MathUtils3D.nearEqual(e[0],oe[0])&& MathUtils3D.nearEqual(e[1],oe[1])&& MathUtils3D.nearEqual(e[2],oe[2])&& MathUtils3D.nearEqual(e[3],oe[3])&& MathUtils3D.nearEqual(e[4],oe[4])&& MathUtils3D.nearEqual(e[5],oe[5])&& MathUtils3D.nearEqual(e[6],oe[6])&& MathUtils3D.nearEqual(e[7],oe[7])&& MathUtils3D.nearEqual(e[8],oe[8])&& MathUtils3D.nearEqual(e[9],oe[9])&& MathUtils3D.nearEqual(e[10],oe[10])&& MathUtils3D.nearEqual(e[11],oe[11])&& MathUtils3D.nearEqual(e[12],oe[12])&& MathUtils3D.nearEqual(e[13],oe[13])&& MathUtils3D.nearEqual(e[14],oe[14])&& MathUtils3D.nearEqual(e[15],oe[15])); } /** *分解矩阵 *@param translation 平移 *@param rotation 旋转 *@param scale 缩放 *@return 是否成功 */ __proto.decompose=function(translation,rotation,scale){ var me=this.elements; var te=translation.elements; var re=rotation.elements; var se=scale.elements; te[0]=me[12]; te[1]=me[13]; te[2]=me[14]; se[0]=Math.sqrt((me[0] *me[0])+(me[1] *me[1])+(me[2] *me[2])); se[1]=Math.sqrt((me[4] *me[4])+(me[5] *me[5])+(me[6] *me[6])); se[2]=Math.sqrt((me[8] *me[8])+(me[9] *me[9])+(me[10] *me[10])); if (MathUtils3D.isZero(se[0])|| MathUtils3D.isZero(se[1])|| MathUtils3D.isZero(se[2])){ re[0]=re[1]=re[2]=0; re[3]=1; return false; }; var rotationmatrix=new Matrix4x4(); var rme=rotationmatrix.elements; rme[0]=me[0] / se[0]; rme[1]=me[1] / se[0]; rme[2]=me[2] / se[0]; rme[4]=me[4] / se[1]; rme[5]=me[5] / se[1]; rme[6]=me[6] / se[1]; rme[8]=me[8] / se[2]; rme[9]=me[9] / se[2]; rme[10]=me[10] / se[2]; rotationmatrix[15]=1; Quaternion.createFromMatrix4x4(rotationmatrix,rotation); return true; } /**归一化矩阵 */ __proto.normalize=function(){ var v=this.elements; var c=v[0],d=v[1],e=v[2],g=Math.sqrt(c *c+d *d+e *e); if (g){ if (g==1) return; }else { v[0]=0; v[1]=0; v[2]=0; return; } g=1 / g; v[0]=c *g; v[1]=d *g; v[2]=e *g; } /**计算矩阵的转置矩阵*/ __proto.transpose=function(){ var e,t; e=this.elements; t=e[1]; e[1]=e[4]; e[4]=t; t=e[2]; e[2]=e[8]; e[8]=t; t=e[3]; e[3]=e[12]; e[12]=t; t=e[6]; e[6]=e[9]; e[9]=t; t=e[7]; e[7]=e[13]; e[13]=t; t=e[11]; e[11]=e[14]; e[14]=t; return this; } /** *计算一个矩阵的逆矩阵 *@param out 输出矩阵 */ __proto.invert=function(out){ var ae=this.elements; var oe=out.elements; var a00=ae[0],a01=ae[1],a02=ae[2],a03=ae[3],a10=ae[4],a11=ae[5],a12=ae[6],a13=ae[7],a20=ae[8],a21=ae[9],a22=ae[10],a23=ae[11],a30=ae[12],a31=ae[13],a32=ae[14],a33=ae[15], b00=a00 *a11-a01 *a10,b01=a00 *a12-a02 *a10,b02=a00 *a13-a03 *a10,b03=a01 *a12-a02 *a11,b04=a01 *a13-a03 *a11,b05=a02 *a13-a03 *a12,b06=a20 *a31-a21 *a30,b07=a20 *a32-a22 *a30,b08=a20 *a33-a23 *a30,b09=a21 *a32-a22 *a31,b10=a21 *a33-a23 *a31,b11=a22 *a33-a23 *a32, det=b00 *b11-b01 *b10+b02 *b09+b03 *b08-b04 *b07+b05 *b06; if (Math.abs(det)===0.0){ return; } det=1.0 / det; oe[0]=(a11 *b11-a12 *b10+a13 *b09)*det; oe[1]=(a02 *b10-a01 *b11-a03 *b09)*det; oe[2]=(a31 *b05-a32 *b04+a33 *b03)*det; oe[3]=(a22 *b04-a21 *b05-a23 *b03)*det; oe[4]=(a12 *b08-a10 *b11-a13 *b07)*det; oe[5]=(a00 *b11-a02 *b08+a03 *b07)*det; oe[6]=(a32 *b02-a30 *b05-a33 *b01)*det; oe[7]=(a20 *b05-a22 *b02+a23 *b01)*det; oe[8]=(a10 *b10-a11 *b08+a13 *b06)*det; oe[9]=(a01 *b08-a00 *b10-a03 *b06)*det; oe[10]=(a30 *b04-a31 *b02+a33 *b00)*det; oe[11]=(a21 *b02-a20 *b04-a23 *b00)*det; oe[12]=(a11 *b07-a10 *b09-a12 *b06)*det; oe[13]=(a00 *b09-a01 *b07+a02 *b06)*det; oe[14]=(a31 *b01-a30 *b03-a32 *b00)*det; oe[15]=(a20 *b03-a21 *b01+a22 *b00)*det; } /**设置矩阵为单位矩阵*/ __proto.identity=function(){ var e=this.elements; e[1]=e[2]=e[3]=e[4]=e[6]=e[7]=e[8]=e[9]=e[11]=e[12]=e[13]=e[14]=0; e[0]=e[5]=e[10]=e[15]=1; } /** *克隆一个4x4矩阵 *@param out 输出的4x4矩阵 */ __proto.cloneTo=function(out){ var i,s,d; s=this.elements; d=out.elements; if (s===d){ return; } for (i=0;i < 16;++i){ d[i]=s[i]; } } /** *从一个4x4矩阵复制 *@param sou 源4x4矩阵 */ __proto.copyFrom=function(sou){ var i,s,d; s=sou.elements; d=this.elements; if (s===d){ return; } for (i=0;i < 16;++i){ d[i]=s[i]; } } /** *从一个数组复制 *@param sou 源Float32Array数组 */ __proto.copyFromArray=function(sou){ var i,d; d=this.elements; if (sou===d){ return; } for (i=0;i < 16;++i){ d[i]=sou[i]; } } __getset(0,__proto,'translationVector',function(){ var me=this.elements; var oe=Matrix4x4._translationVector.elements; oe[0]=me[12]; oe[1]=me[13]; oe[2]=me[14]; return Matrix4x4._translationVector; },function(v3){ var me=this.elements; var ve=v3.elements; me[12]=ve[0]; me[13]=ve[1]; me[14]=ve[2]; }); Matrix4x4.createRotationX=function(rad,out){ var oe=out.elements; var s=Math.sin(rad),c=Math.cos(rad); oe[1]=oe[2]=oe[3]=oe[4]=oe[7]=oe[8]=oe[11]=oe[12]=oe[13]=oe[14]=0; oe[0]=oe[15]=1; oe[5]=oe[10]=c; oe[6]=s; oe[9]=-s; } Matrix4x4.createRotationY=function(rad,out){ var oe=out.elements; var s=Math.sin(rad),c=Math.cos(rad); oe[1]=oe[3]=oe[4]=oe[6]=oe[7]=oe[9]=oe[11]=oe[12]=oe[13]=oe[14]=0; oe[5]=oe[15]=1; oe[0]=oe[10]=c; oe[2]=-s; oe[8]=s; } Matrix4x4.createRotationZ=function(rad,out){ var oe=out.elements; var s=Math.sin(rad),c=Math.cos(rad); oe[2]=oe[3]=oe[6]=oe[7]=oe[8]=oe[9]=oe[11]=oe[12]=oe[13]=oe[14]=0; oe[10]=oe[15]=1; oe[0]=oe[5]=c; oe[1]=s; oe[4]=-s; } Matrix4x4.createRotationYawPitchRoll=function(yaw,pitch,roll,result){ Quaternion.createFromYawPitchRoll(yaw,pitch,roll,Matrix4x4._tempQuaternion); Matrix4x4.createRotationQuaternion(Matrix4x4._tempQuaternion,result); } Matrix4x4.createRotationQuaternion=function(rotation,result){ var rotationE=rotation.elements; var resultE=result.elements; var rotationX=rotationE[0]; var rotationY=rotationE[1]; var rotationZ=rotationE[2]; var rotationW=rotationE[3]; var xx=rotationX *rotationX; var yy=rotationY *rotationY; var zz=rotationZ *rotationZ; var xy=rotationX *rotationY; var zw=rotationZ *rotationW; var zx=rotationZ *rotationX; var yw=rotationY *rotationW; var yz=rotationY *rotationZ; var xw=rotationX *rotationW; resultE[3]=resultE[7]=resultE[11]=resultE[12]=resultE[13]=resultE[14]=0; resultE[15]=1.0; resultE[0]=1.0-(2.0 *(yy+zz)); resultE[1]=2.0 *(xy+zw); resultE[2]=2.0 *(zx-yw); resultE[4]=2.0 *(xy-zw); resultE[5]=1.0-(2.0 *(zz+xx)); resultE[6]=2.0 *(yz+xw); resultE[8]=2.0 *(zx+yw); resultE[9]=2.0 *(yz-xw); resultE[10]=1.0-(2.0 *(yy+xx)); } Matrix4x4.createTranslate=function(trans,out){ var te=trans.elements; var oe=out.elements; oe[4]=oe[8]=oe[1]=oe[9]=oe[2]=oe[6]=oe[3]=oe[7]=oe[11]=0; oe[0]=oe[5]=oe[10]=oe[15]=1; oe[12]=te[0]; oe[13]=te[1]; oe[14]=te[2]; } Matrix4x4.createScaling=function(scale,out){ var se=scale.elements; var oe=out.elements; oe[0]=se[0]; oe[5]=se[1]; oe[10]=se[2]; oe[1]=oe[4]=oe[8]=oe[12]=oe[9]=oe[13]=oe[2]=oe[6]=oe[14]=oe[3]=oe[7]=oe[11]=0; oe[15]=1; } Matrix4x4.multiply=function(left,right,out){ var i,e,a,b,ai0,ai1,ai2,ai3; e=out.elements; a=left.elements; b=right.elements; if (e===b){ b=new Float32Array(16); for (i=0;i < 16;++i){ b[i]=e[i]; } } for (i=0;i < 4;i++){ ai0=a[i]; ai1=a[i+4]; ai2=a[i+8]; ai3=a[i+12]; e[i]=ai0 *b[0]+ai1 *b[1]+ai2 *b[2]+ai3 *b[3]; e[i+4]=ai0 *b[4]+ai1 *b[5]+ai2 *b[6]+ai3 *b[7]; e[i+8]=ai0 *b[8]+ai1 *b[9]+ai2 *b[10]+ai3 *b[11]; e[i+12]=ai0 *b[12]+ai1 *b[13]+ai2 *b[14]+ai3 *b[15]; } } Matrix4x4.createFromQuaternion=function(rotation,out){ var e=out.elements; var q=rotation.elements; var x=q[0],y=q[1],z=q[2],w=q[3]; var x2=x+x; var y2=y+y; var z2=z+z; var xx=x *x2; var yx=y *x2; var yy=y *y2; var zx=z *x2; var zy=z *y2; var zz=z *z2; var wx=w *x2; var wy=w *y2; var wz=w *z2; e[0]=1-yy-zz; e[1]=yx+wz; e[2]=zx-wy; e[3]=0; e[4]=yx-wz; e[5]=1-xx-zz; e[6]=zy+wx; e[7]=0; e[8]=zx+wy; e[9]=zy-wx; e[10]=1-xx-yy; e[11]=0; e[12]=0; e[13]=0; e[14]=0; out[15]=1; } Matrix4x4.createAffineTransformation=function(trans,rot,scale,out){ var te=trans.elements; var re=rot.elements; var se=scale.elements; var oe=out.elements; var x=re[0],y=re[1],z=re[2],w=re[3],x2=x+x,y2=y+y,z2=z+z; var xx=x *x2,xy=x *y2,xz=x *z2,yy=y *y2,yz=y *z2,zz=z *z2; var wx=w *x2,wy=w *y2,wz=w *z2,sx=se[0],sy=se[1],sz=se[2]; oe[0]=(1-(yy+zz))*sx; oe[1]=(xy+wz)*sx; oe[2]=(xz-wy)*sx; oe[3]=0; oe[4]=(xy-wz)*sy; oe[5]=(1-(xx+zz))*sy; oe[6]=(yz+wx)*sy; oe[7]=0; oe[8]=(xz+wy)*sz; oe[9]=(yz-wx)*sz; oe[10]=(1-(xx+yy))*sz; oe[11]=0; oe[12]=te[0]; oe[13]=te[1]; oe[14]=te[2]; oe[15]=1; } Matrix4x4.createLookAt=function(eye,center,up,out){ var ee=eye.elements; var ce=center.elements; var ue=up.elements; var oe=out.elements; var x0,x1,x2,y0,y1,y2,z0,z1,z2,len,eyex=ee[0],eyey=ee[1],eyez=ee[2],upx=ue[0],upy=ue[1],upz=ue[2],centerx=ce[0],centery=ce[1],centerz=ce[2]; if (Math.abs(eyex-centerx)< MathUtils3D.zeroTolerance && Math.abs(eyey-centery)< MathUtils3D.zeroTolerance && Math.abs(eyez-centerz)< MathUtils3D.zeroTolerance){ out.identity(); return; } z0=eyex-centerx; z1=eyey-centery; z2=eyez-centerz; len=1 / Math.sqrt(z0 *z0+z1 *z1+z2 *z2); z0 *=len; z1 *=len; z2 *=len; x0=upy *z2-upz *z1; x1=upz *z0-upx *z2; x2=upx *z1-upy *z0; len=Math.sqrt(x0 *x0+x1 *x1+x2 *x2); if (!len){ x0=x1=x2=0; }else { len=1 / len; x0 *=len; x1 *=len; x2 *=len; } y0=z1 *x2-z2 *x1; y1=z2 *x0-z0 *x2; y2=z0 *x1-z1 *x0; len=Math.sqrt(y0 *y0+y1 *y1+y2 *y2); if (!len){ y0=y1=y2=0; }else { len=1 / len; y0 *=len; y1 *=len; y2 *=len; } oe[0]=x0; oe[1]=y0; oe[2]=z0; oe[3]=0; oe[4]=x1; oe[5]=y1; oe[6]=z1; oe[7]=0; oe[8]=x2; oe[9]=y2; oe[10]=z2; oe[11]=0; oe[12]=-(x0 *eyex+x1 *eyey+x2 *eyez); oe[13]=-(y0 *eyex+y1 *eyey+y2 *eyez); oe[14]=-(z0 *eyex+z1 *eyey+z2 *eyez); oe[15]=1; } Matrix4x4.createPerspective=function(fov,aspect,near,far,out){ var oe=out.elements; var yScale=1.0 / Math.tan(fov *0.5); var q=far / (near-far); oe[0]=yScale / aspect; oe[5]=yScale; oe[10]=q; oe[11]=-1.0; oe[14]=q *near; oe[1]=oe[2]=oe[3]=oe[4]=oe[6]=oe[7]=oe[8]=oe[9]=oe[12]=oe[13]=oe[15]=0; } Matrix4x4.createOrthogonal=function(left,right,bottom,top,near,far,out){ var oe=out.elements; var lr=1 / (left-right); var bt=1 / (bottom-top); var nf=1 / (near-far); oe[1]=oe[2]=oe[3]=oe[4]=oe[6]=oe[7]=oe[8]=oe[9]=oe[11]=0; oe[15]=1; oe[0]=-2 *lr; oe[5]=-2 *bt; oe[10]=2 *nf; oe[12]=(left+right)*lr; oe[13]=(top+bottom)*bt; oe[14]=(far+near)*nf; } Matrix4x4.translation=function(v3,out){ var ve=v3.elements; var oe=out.elements; oe[0]=oe[5]=oe[10]=oe[15]=1; oe[12]=ve[0]; oe[13]=ve[1]; oe[14]=ve[2]; } Matrix4x4._tempMatrix4x4=new Matrix4x4(); Matrix4x4.DEFAULT=new Matrix4x4(); __static(Matrix4x4, ['_tempQuaternion',function(){return this._tempQuaternion=new Quaternion();},'_translationVector',function(){return this._translationVector=new Vector3();} ]); return Matrix4x4; })() /** *OrientedBoundBox 类用于创建OBB包围盒。 */ //class laya.d3.math.OrientedBoundBox var OrientedBoundBox=(function(){ function OrientedBoundBox(box){ this.extents=null; this.transformation=null; var min=box.min; var max=box.max; Vector3.subtract(max,min,OrientedBoundBox._tempV30); Vector3.scale(OrientedBoundBox._tempV30,0.5,OrientedBoundBox._tempV30); Vector3.add(min,OrientedBoundBox._tempV30,OrientedBoundBox._tempV31); Vector3.subtract(max,OrientedBoundBox._tempV31,this.extents); Matrix4x4.translation(OrientedBoundBox._tempV31,this.transformation); } __class(OrientedBoundBox,'laya.d3.math.OrientedBoundBox'); var __proto=OrientedBoundBox.prototype; /** *获取OBB包围盒的8个角顶点。 *@param corners 返回顶点的输出队列。 */ __proto.getCorners=function(corners){ var extentsE=this.extents.elements; corners.length=8; OrientedBoundBox._tempV30.x=extentsE[0]; OrientedBoundBox._tempV31.y=extentsE[1]; OrientedBoundBox._tempV32.z=extentsE[2]; Vector3.TransformNormal(OrientedBoundBox._tempV30,this.transformation,OrientedBoundBox._tempV30); Vector3.TransformNormal(OrientedBoundBox._tempV31,this.transformation,OrientedBoundBox._tempV31); Vector3.TransformNormal(OrientedBoundBox._tempV32,this.transformation,OrientedBoundBox._tempV32); OrientedBoundBox._tempV33=this.transformation.translationVector; Vector3.add(OrientedBoundBox._tempV33,OrientedBoundBox._tempV30,OrientedBoundBox._tempV34); Vector3.add(OrientedBoundBox._tempV34,OrientedBoundBox._tempV31,OrientedBoundBox._tempV34); Vector3.add(OrientedBoundBox._tempV34,OrientedBoundBox._tempV32,corners[0]); Vector3.add(OrientedBoundBox._tempV33,OrientedBoundBox._tempV30,OrientedBoundBox._tempV34); Vector3.add(OrientedBoundBox._tempV34,OrientedBoundBox._tempV31,OrientedBoundBox._tempV34); Vector3.subtract(OrientedBoundBox._tempV34,OrientedBoundBox._tempV32,corners[1]); Vector3.subtract(OrientedBoundBox._tempV33,OrientedBoundBox._tempV30,OrientedBoundBox._tempV34); Vector3.add(OrientedBoundBox._tempV34,OrientedBoundBox._tempV31,OrientedBoundBox._tempV34); Vector3.subtract(OrientedBoundBox._tempV34,OrientedBoundBox._tempV32,corners[2]); Vector3.subtract(OrientedBoundBox._tempV33,OrientedBoundBox._tempV30,OrientedBoundBox._tempV34); Vector3.add(OrientedBoundBox._tempV34,OrientedBoundBox._tempV31,OrientedBoundBox._tempV34); Vector3.add(OrientedBoundBox._tempV34,OrientedBoundBox._tempV32,corners[3]); Vector3.add(OrientedBoundBox._tempV33,OrientedBoundBox._tempV30,OrientedBoundBox._tempV34); Vector3.subtract(OrientedBoundBox._tempV34,OrientedBoundBox._tempV31,OrientedBoundBox._tempV34); Vector3.add(OrientedBoundBox._tempV34,OrientedBoundBox._tempV32,corners[4]); Vector3.add(OrientedBoundBox._tempV33,OrientedBoundBox._tempV30,OrientedBoundBox._tempV34); Vector3.subtract(OrientedBoundBox._tempV34,OrientedBoundBox._tempV31,OrientedBoundBox._tempV34); Vector3.subtract(OrientedBoundBox._tempV34,OrientedBoundBox._tempV32,corners[5]); Vector3.subtract(OrientedBoundBox._tempV33,OrientedBoundBox._tempV30,OrientedBoundBox._tempV34); Vector3.subtract(OrientedBoundBox._tempV34,OrientedBoundBox._tempV31,OrientedBoundBox._tempV34); Vector3.subtract(OrientedBoundBox._tempV34,OrientedBoundBox._tempV32,corners[6]); Vector3.subtract(OrientedBoundBox._tempV33,OrientedBoundBox._tempV30,OrientedBoundBox._tempV34); Vector3.subtract(OrientedBoundBox._tempV34,OrientedBoundBox._tempV31,OrientedBoundBox._tempV34); Vector3.add(OrientedBoundBox._tempV34,OrientedBoundBox._tempV32,corners[7]); } /** *变换该包围盒的矩阵信息。 *@param mat 矩阵 */ __proto.transform=function(mat){ Matrix4x4.multiply(this.transformation,mat,this.transformation); } /** *缩放该包围盒 *@param scaling 各轴的缩放比。 */ __proto.scale=function(scaling){ Vector3.multiply(this.extents,scaling,this.extents); } /** *平移该包围盒。 *@param translation 平移参数 */ __proto.translate=function(translation){ var v3=this.transformation.translationVector; Vector3.add(v3,translation,OrientedBoundBox._tempV30); this.transformation.translationVector=OrientedBoundBox._tempV30; } /** *该包围盒的尺寸。 *@param out 输出 */ __proto.Size=function(out){ Vector3.scale(this.extents,2,out); } /** *该包围盒需要考虑的尺寸 *@param out 输出 */ __proto.getSize=function(out){ var extentsE=this.extents.elements; OrientedBoundBox._tempV30.x=extentsE[0]; OrientedBoundBox._tempV31.y=extentsE[1]; OrientedBoundBox._tempV32.z=extentsE[2]; Vector3.TransformNormal(OrientedBoundBox._tempV30,this.transformation,OrientedBoundBox._tempV30); Vector3.TransformNormal(OrientedBoundBox._tempV31,this.transformation,OrientedBoundBox._tempV31); Vector3.TransformNormal(OrientedBoundBox._tempV31,this.transformation,OrientedBoundBox._tempV32); var oe=out.elements; oe[0]=Vector3.scalarLength(OrientedBoundBox._tempV30); oe[1]=Vector3.scalarLength(OrientedBoundBox._tempV31); oe[2]=Vector3.scalarLength(OrientedBoundBox._tempV32); } /** *该包围盒需要考虑尺寸的平方 *@param out 输出 */ __proto.getSizeSquared=function(out){ var extentsE=this.extents.elements; OrientedBoundBox._tempV30.x=extentsE[0]; OrientedBoundBox._tempV31.y=extentsE[1]; OrientedBoundBox._tempV32.z=extentsE[2]; Vector3.TransformNormal(OrientedBoundBox._tempV30,this.transformation,OrientedBoundBox._tempV30); Vector3.TransformNormal(OrientedBoundBox._tempV31,this.transformation,OrientedBoundBox._tempV31); Vector3.TransformNormal(OrientedBoundBox._tempV31,this.transformation,OrientedBoundBox._tempV32); var oe=out.elements; oe[0]=Vector3.scalarLengthSquared(OrientedBoundBox._tempV30); oe[1]=Vector3.scalarLengthSquared(OrientedBoundBox._tempV31); oe[2]=Vector3.scalarLengthSquared(OrientedBoundBox._tempV32); } /** *该包围盒的几何中心 */ __proto.getCenter=function(){ return this.transformation.translationVector; } /** *该包围盒是否包含空间中一点 *@param point 点 *@return 返回位置关系 */ __proto.containsPoint=function(point){ var extentsE=this.extents.elements; var extentsEX=extentsE[0]; var extentsEY=extentsE[1]; var extentsEZ=extentsE[2]; this.transformation.invert(OrientedBoundBox._tempM0); Vector3.transformCoordinate(point,OrientedBoundBox._tempM0,OrientedBoundBox._tempV30); var _tempV30e=OrientedBoundBox._tempV30.elements; var _tempV30ex=Math.abs(_tempV30e[0]); var _tempV30ey=Math.abs(_tempV30e[1]); var _tempV30ez=Math.abs(_tempV30e[2]); if (MathUtils3D.nearEqual(_tempV30ex,extentsEX)&& MathUtils3D.nearEqual(_tempV30ey,extentsEY)&& MathUtils3D.nearEqual(_tempV30ez,extentsEZ)) return /*laya.d3.math.ContainmentType.Intersects*/2; if (_tempV30ex < extentsEX && _tempV30ey < extentsEY && _tempV30ez < extentsEZ) return /*laya.d3.math.ContainmentType.Contains*/1; else return /*laya.d3.math.ContainmentType.Disjoint*/0; } /** *该包围盒是否包含空间中一包围球 *@param sphere 包围球 *@param ignoreScale 是否考虑该包围盒的缩放 *@return 返回位置关系 */ __proto.containsSphere=function(sphere,ignoreScale){ (ignoreScale===void 0)&& (ignoreScale=false); var extentsE=this.extents.elements; var extentsEX=extentsE[0]; var extentsEY=extentsE[1]; var extentsEZ=extentsE[2]; var sphereR=sphere.radius; this.transformation.invert(OrientedBoundBox._tempM0); Vector3.transformCoordinate(sphere.center,OrientedBoundBox._tempM0,OrientedBoundBox._tempV30); var locRadius=NaN; if (ignoreScale){ locRadius=sphereR; }else { Vector3.scale(Vector3.UnitX,sphereR,OrientedBoundBox._tempV31); Vector3.TransformNormal(OrientedBoundBox._tempV31,OrientedBoundBox._tempM0,OrientedBoundBox._tempV31); locRadius=Vector3.scalarLength(OrientedBoundBox._tempV31); } Vector3.scale(this.extents,-1,OrientedBoundBox._tempV32); Vector3.Clamp(OrientedBoundBox._tempV30,OrientedBoundBox._tempV32,this.extents,OrientedBoundBox._tempV33); var distance=Vector3.distanceSquared(OrientedBoundBox._tempV30,OrientedBoundBox._tempV33); if (distance > locRadius *locRadius) return /*laya.d3.math.ContainmentType.Disjoint*/0; var tempV30e=OrientedBoundBox._tempV30.elements; var tempV30ex=tempV30e[0]; var tempV30ey=tempV30e[1]; var tempV30ez=tempV30e[2]; var tempV32e=OrientedBoundBox._tempV32.elements; var tempV32ex=tempV32e[0]; var tempV32ey=tempV32e[1]; var tempV32ez=tempV32e[2]; if ((((tempV32ex+locRadius <=tempV30ex)&& (tempV30ex <=extentsEX-locRadius))&& ((extentsEX-tempV32ex > locRadius)&& (tempV32ey+locRadius <=tempV30ey)))&& (((tempV30ey <=extentsEY-locRadius)&& (extentsEY-tempV32ey > locRadius))&& (((tempV32ez+locRadius <=tempV30ez)&& (tempV30ez <=extentsEZ-locRadius))&& (extentsEZ-tempV32ez > locRadius)))){ return /*laya.d3.math.ContainmentType.Contains*/1; } return /*laya.d3.math.ContainmentType.Intersects*/2; } OrientedBoundBox._getRows=function(mat,out){ out.length=3; var mate=mat.elements; var row0e=out[0].elements; row0e[0]=mate[0]; row0e[1]=mate[1]; row0e[2]=mate[2]; var row1e=out[1].elements; row1e[0]=mate[4]; row1e[1]=mate[5]; row1e[2]=mate[6]; var row2e=out[2].elements; row2e[0]=mate[8]; row2e[1]=mate[9]; row2e[2]=mate[10]; } __static(OrientedBoundBox, ['_tempV30',function(){return this._tempV30=new Vector3();},'_tempV31',function(){return this._tempV31=new Vector3();},'_tempV32',function(){return this._tempV32=new Vector3();},'_tempV33',function(){return this._tempV33=new Vector3();},'_tempV34',function(){return this._tempV34=new Vector3();},'_tempM0',function(){return this._tempM0=new Matrix4x4();},'_tempM1',function(){return this._tempM1=new Matrix4x4();} ]); return OrientedBoundBox; })() /** *Plane 类用于创建平面。 */ //class laya.d3.math.Plane var Plane=(function(){ function Plane(normal,d){ this.normal=null; this.distance=NaN; (d===void 0)&& (d=0); this.normal=normal; this.distance=d; } __class(Plane,'laya.d3.math.Plane'); var __proto=Plane.prototype; /** *更改平面法线向量的系数,使之成单位长度。 */ __proto.normalize=function(){ var normalE=this.normal.elements; var normalEX=normalE[0]; var normalEY=normalE[1]; var normalEZ=normalE[2]; var magnitude=1 / Math.sqrt(normalEX *normalEX+normalEY *normalEY+normalEZ *normalEZ); normalE[0]=normalEX *magnitude; normalE[1]=normalEY *magnitude; normalE[2]=normalEZ *magnitude; this.distance *=magnitude; } Plane.createPlaneBy3P=function(point1,point2,point3){ var point1e=point1.elements; var point2e=point2.elements; var point3e=point3.elements; var x1=point2e[0]-point1e[0]; var y1=point2e[1]-point1e[1]; var z1=point2e[2]-point1e[2]; var x2=point3e[0]-point1e[0]; var y2=point3e[1]-point1e[1]; var z2=point3e[2]-point1e[2]; var yz=(y1 *z2)-(z1 *y2); var xz=(z1 *x2)-(x1 *z2); var xy=(x1 *y2)-(y1 *x2); var invPyth=1 / (Math.sqrt((yz *yz)+(xz *xz)+(xy *xy))); var x=yz *invPyth; var y=xz *invPyth; var z=xy *invPyth; var TEMPVec3e=Plane._TEMPVec3.elements; TEMPVec3e[0]=x; TEMPVec3e[1]=y; TEMPVec3e[2]=z; var d=-((x *point1e[0])+(y *point1e[1])+(z *point1e[2])); var plane=new Plane(Plane._TEMPVec3,d); return plane; } Plane.PlaneIntersectionType_Back=0; Plane.PlaneIntersectionType_Front=1; Plane.PlaneIntersectionType_Intersecting=2; __static(Plane, ['_TEMPVec3',function(){return this._TEMPVec3=new Vector3();} ]); return Plane; })() /** *Quaternion 类用于创建四元数。 */ //class laya.d3.math.Quaternion var Quaternion=(function(){ function Quaternion(x,y,z,w){ this.elements=new Float32Array(4); (x===void 0)&& (x=0); (y===void 0)&& (y=0); (z===void 0)&& (z=0); (w===void 0)&& (w=1); this.elements[0]=x; this.elements[1]=y; this.elements[2]=z; this.elements[3]=w; } __class(Quaternion,'laya.d3.math.Quaternion'); var __proto=Quaternion.prototype; /** *根据缩放值缩放四元数 *@param scale 缩放值 *@param out 输出四元数 */ __proto.scaling=function(scaling,out){ var e=out.elements; var f=this.elements; e[0]=f[0] *scaling; e[1]=f[1] *scaling; e[2]=f[2] *scaling; e[3]=f[3] *scaling; } /** *归一化四元数 *@param out 输出四元数 */ __proto.normalize=function(out){ var e=out.elements; var f=this.elements; var x=f[0],y=f[1],z=f[2],w=f[3]; var len=x *x+y *y+z *z+w *w; if (len > 0){ len=1 / Math.sqrt(len); e[0]=x *len; e[1]=y *len; e[2]=z *len; e[3]=w *len; } } /** *计算四元数的长度 *@return 长度 */ __proto.length=function(){ var f=this.elements; var x=f[0],y=f[1],z=f[2],w=f[3]; return Math.sqrt(x *x+y *y+z *z+w *w); } /** *根据绕X轴的角度旋转四元数 *@param rad 角度 *@param out 输出四元数 */ __proto.rotateX=function(rad,out){ var e=out.elements; var f=this.elements; rad *=0.5; var ax=f[0],ay=f[1],az=f[2],aw=f[3]; var bx=Math.sin(rad),bw=Math.cos(rad); e[0]=ax *bw+aw *bx; e[1]=ay *bw+az *bx; e[2]=az *bw-ay *bx; e[3]=aw *bw-ax *bx; } /** *根据绕Y轴的制定角度旋转四元数 *@param rad 角度 *@param out 输出四元数 */ __proto.rotateY=function(rad,out){ var e=out.elements; var f=this.elements; rad *=0.5; var ax=f[0],ay=f[1],az=f[2],aw=f[3],by=Math.sin(rad),bw=Math.cos(rad); e[0]=ax *bw-az *by; e[1]=ay *bw+aw *by; e[2]=az *bw+ax *by; e[3]=aw *bw-ay *by; } /** *根据绕Z轴的制定角度旋转四元数 *@param rad 角度 *@param out 输出四元数 */ __proto.rotateZ=function(rad,out){ var e=out.elements; var f=this.elements; rad *=0.5; var ax=f[0],ay=f[1],az=f[2],aw=f[3],bz=Math.sin(rad),bw=Math.cos(rad); e[0]=ax *bw+ay *bz; e[1]=ay *bw-ax *bz; e[2]=az *bw+aw *bz; e[3]=aw *bw-az *bz; } /** *分解四元数到欧拉角(顺序为Yaw、Pitch、Roll),参考自http://xboxforums.create.msdn.com/forums/p/4574/23988.aspx#23988,问题绕X轴翻转超过±90度时有,会产生瞬间反转 *@param quaternion 源四元数 *@param out 欧拉角值 */ __proto.getYawPitchRoll=function(out){ Vector3.transformQuat(Vector3.ForwardRH,this,Quaternion.TEMPVector31); Vector3.transformQuat(Vector3.Up,this,Quaternion.TEMPVector32); var upe=Quaternion.TEMPVector32.elements; Quaternion.angleTo(Vector3.ZERO,Quaternion.TEMPVector31,Quaternion.TEMPVector33); var anglee=Quaternion.TEMPVector33.elements; if (anglee[0]==Math.PI / 2){ anglee[1]=Quaternion.arcTanAngle(upe[2],upe[0]); anglee[2]=0; }else if (anglee[0]==-Math.PI / 2){ anglee[1]=Quaternion.arcTanAngle(-upe[2],-upe[0]); anglee[2]=0; }else { Matrix4x4.createRotationY(-anglee[1],Quaternion.TEMPMatrix0); Matrix4x4.createRotationX(-anglee[0],Quaternion.TEMPMatrix1); Vector3.transformCoordinate(Quaternion.TEMPVector32,Quaternion.TEMPMatrix0,Quaternion.TEMPVector32); Vector3.transformCoordinate(Quaternion.TEMPVector32,Quaternion.TEMPMatrix1,Quaternion.TEMPVector32); anglee[2]=Quaternion.arcTanAngle(upe[1],-upe[0]); } if (anglee[1] <=-Math.PI) anglee[1]=Math.PI; if (anglee[2] <=-Math.PI) anglee[2]=Math.PI; if (anglee[1] >=Math.PI && anglee[2] >=Math.PI){ anglee[1]=0; anglee[2]=0; anglee[0]=Math.PI-anglee[0]; }; var oe=out.elements; oe[0]=anglee[1]; oe[1]=anglee[0]; oe[2]=anglee[2]; } /** *求四元数的逆 *@param out 输出四元数 */ __proto.invert=function(out){ var e=out.elements; var f=this.elements; var a0=f[0],a1=f[1],a2=f[2],a3=f[3]; var dot=a0 *a0+a1 *a1+a2 *a2+a3 *a3; var invDot=dot ? 1.0 / dot :0; e[0]=-a0 *invDot; e[1]=-a1 *invDot; e[2]=-a2 *invDot; e[3]=a3 *invDot; } /** *设置四元数为单位算数 *@param out 输出四元数 */ __proto.identity=function(){ var e=this.elements; e[0]=0; e[1]=0; e[2]=0; e[3]=1; } /** *克隆一个四元数 *@param out 输出的四元数 */ __proto.cloneTo=function(out){ var i,s,d; s=this.elements; d=out.elements; if (s===d){ return; } for (i=0;i < 4;++i){ d[i]=s[i]; } } /** *从一个四元数复制 *@param sou 源四元数 */ __proto.copyFrom=function(sou){ var i,s,d; s=sou.elements; d=this.elements; if (s===d){ return; } for (i=0;i < 4;++i){ d[i]=s[i]; } } /** *从一个数组复制 *@param sou 源Float32Array数组 */ __proto.copyFromArray=function(sou){ var i,d; d=this.elements; if (sou===d){ return; } for (i=0;i < 4;++i){ d[i]=sou[i]; } } /** *获取四元数的x值 */ __getset(0,__proto,'x',function(){ return this.elements[0]; }); /** *获取四元数的y值 */ __getset(0,__proto,'y',function(){ return this.elements[1]; }); /** *获取四元数的z值 */ __getset(0,__proto,'z',function(){ return this.elements[2]; }); /** *获取四元数的w值 */ __getset(0,__proto,'w',function(){ return this.elements[3]; }); Quaternion.createFromYawPitchRoll=function(yaw,pitch,roll,out){ var halfRoll=roll *0.5; var halfPitch=pitch *0.5; var halfYaw=yaw *0.5; var sinRoll=Math.sin(halfRoll); var cosRoll=Math.cos(halfRoll); var sinPitch=Math.sin(halfPitch); var cosPitch=Math.cos(halfPitch); var sinYaw=Math.sin(halfYaw); var cosYaw=Math.cos(halfYaw); var oe=out.elements; oe[0]=(cosYaw *sinPitch *cosRoll)+(sinYaw *cosPitch *sinRoll); oe[1]=(sinYaw *cosPitch *cosRoll)-(cosYaw *sinPitch *sinRoll); oe[2]=(cosYaw *cosPitch *sinRoll)-(sinYaw *sinPitch *cosRoll); oe[3]=(cosYaw *cosPitch *cosRoll)+(sinYaw *sinPitch *sinRoll); } Quaternion.multiply=function(left,right,out){ var le=left.elements; var re=right.elements; var oe=out.elements; var lx=le[0]; var ly=le[1]; var lz=le[2]; var lw=le[3]; var rx=re[0]; var ry=re[1]; var rz=re[2]; var rw=re[3]; var a=(ly *rz-lz *ry); var b=(lz *rx-lx *rz); var c=(lx *ry-ly *rx); var d=(lx *rx+ly *ry+lz *rz); oe[0]=(lx *rw+rx *lw)+a; oe[1]=(ly *rw+ry *lw)+b; oe[2]=(lz *rw+rz *lw)+c; oe[3]=lw *rw-d; } Quaternion.arcTanAngle=function(x,y){ if (x==0){ if (y==1) return Math.PI / 2; return-Math.PI / 2; } if (x > 0) return Math.atan(y / x); if (x < 0){ if (y > 0) return Math.atan(y / x)+Math.PI; return Math.atan(y / x)-Math.PI; } return 0; } Quaternion.angleTo=function(from,location,angle){ Vector3.subtract(location,from,Quaternion.TEMPVector30); Vector3.normalize(Quaternion.TEMPVector30,Quaternion.TEMPVector30); angle.elements[0]=Math.asin(Quaternion.TEMPVector30.y); angle.elements[1]=Quaternion.arcTanAngle(-Quaternion.TEMPVector30.z,-Quaternion.TEMPVector30.x); } Quaternion.createFromAxisAngle=function(axis,rad,out){ var e=out.elements; var f=axis.elements; rad=rad *0.5; var s=Math.sin(rad); e[0]=s *f[0]; e[1]=s *f[1]; e[2]=s *f[2]; e[3]=Math.cos(rad); } Quaternion.createFromMatrix3x3=function(sou,out){ var e=out.elements; var f=sou.elements; var fTrace=f[0]+f[4]+f[8]; var fRoot; if (fTrace > 0.0){ fRoot=Math.sqrt(fTrace+1.0); e[3]=0.5 *fRoot; fRoot=0.5 / fRoot; e[0]=(f[5]-f[7])*fRoot; e[1]=(f[6]-f[2])*fRoot; e[2]=(f[1]-f[3])*fRoot; }else { var i=0; if (f[4] > f[0]) i=1; if (f[8] > f[i *3+i]) i=2; var j=(i+1)% 3; var k=(i+2)% 3; fRoot=Math.sqrt(f[i *3+i]-f[j *3+j]-f[k *3+k]+1.0); e[i]=0.5 *fRoot; fRoot=0.5 / fRoot; e[3]=(f[j *3+k]-f[k *3+j])*fRoot; e[j]=(f[j *3+i]+f[i *3+j])*fRoot; e[k]=(f[k *3+i]+f[i *3+k])*fRoot; } return; } Quaternion.createFromMatrix4x4=function(mat,out){ var me=mat.elements; var oe=out.elements; var sqrt; var half; var scale=me[0]+me[5]+me[10]; if (scale > 0.0){ sqrt=Math.sqrt(scale+1.0); oe[3]=sqrt *0.5; sqrt=0.5 / sqrt; oe[0]=(me[6]-me[9])*sqrt; oe[1]=(me[8]-me[2])*sqrt; oe[2]=(me[1]-me[4])*sqrt; }else if ((me[0] >=me[5])&& (me[0] >=me[10])){ sqrt=Math.sqrt(1.0+me[0]-me[5]-me[10]); half=0.5 / sqrt; oe[0]=0.5 *sqrt; oe[1]=(me[1]+me[4])*half; oe[2]=(me[2]+me[8])*half; oe[3]=(me[6]-me[9])*half; }else if (me[5] > me[10]){ sqrt=Math.sqrt(1.0+me[5]-me[0]-me[10]); half=0.5 / sqrt; oe[0]=(me[4]+me[1])*half; oe[1]=0.5 *sqrt; oe[2]=(me[9]+me[6])*half; oe[3]=(me[8]-me[2])*half; }else { sqrt=Math.sqrt(1.0+me[10]-me[0]-me[5]); half=0.5 / sqrt; oe[0]=(me[8]+me[2])*half; oe[1]=(me[9]+me[6])*half; oe[2]=0.5 *sqrt; oe[3]=(me[1]-me[4])*half; } } Quaternion.slerp=function(left,right,t,out){ var a=left.elements; var b=right.elements; var oe=out.elements; var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=b[0],by=b[1],bz=b[2],bw=b[3]; var omega,cosom,sinom,scale0,scale1; cosom=ax *bx+ay *by+az *bz+aw *bw; if (cosom < 0.0){ cosom=-cosom; bx=-bx; by=-by; bz=-bz; bw=-bw; } if ((1.0-cosom)> 0.000001){ omega=Math.acos(cosom); sinom=Math.sin(omega); scale0=Math.sin((1.0-t)*omega)/ sinom; scale1=Math.sin(t *omega)/ sinom; }else { scale0=1.0-t; scale1=t; } oe[0]=scale0 *ax+scale1 *bx; oe[1]=scale0 *ay+scale1 *by; oe[2]=scale0 *az+scale1 *bz; oe[3]=scale0 *aw+scale1 *bw; return oe; } Quaternion.lerp=function(left,right,t,out){ var e=out.elements; var f=left.elements; var g=right.elements; var ax=f[0],ay=f[1],az=f[2],aw=f[3]; e[0]=ax+t *(g[0]-ax); e[1]=ay+t *(g[1]-ay); e[2]=az+t *(g[2]-az); e[3]=aw+t *(g[3]-aw); } Quaternion.add=function(left,right,out){ var e=out.elements; var f=left.elements; var g=right.elements; e[0]=f[0]+g[0]; e[1]=f[1]+g[1]; e[2]=f[2]+g[2]; e[3]=f[3]+g[3]; } Quaternion.dot=function(left,right){ var f=left.elements; var g=right.elements; return f[0] *g[0]+f[1] *g[1]+f[2] *g[2]+f[3] *g[3]; } Quaternion.DEFAULT=new Quaternion(); __static(Quaternion, ['TEMPVector30',function(){return this.TEMPVector30=new Vector3();},'TEMPVector31',function(){return this.TEMPVector31=new Vector3();},'TEMPVector32',function(){return this.TEMPVector32=new Vector3();},'TEMPVector33',function(){return this.TEMPVector33=new Vector3();},'TEMPMatrix0',function(){return this.TEMPMatrix0=new Matrix4x4();},'TEMPMatrix1',function(){return this.TEMPMatrix1=new Matrix4x4();} ]); return Quaternion; })() /** *Ray 类用于创建射线。 */ //class laya.d3.math.Ray var Ray=(function(){ function Ray(origin,direction){ this.origin=null; this.direction=null; this.origin=origin; this.direction=direction; } __class(Ray,'laya.d3.math.Ray'); return Ray; })() /** *Vector2 类用于创建二维向量。 */ //class laya.d3.math.Vector2 var Vector2=(function(){ function Vector2(x,y){ this.elements=new Float32Array(2); (x===void 0)&& (x=0); (y===void 0)&& (y=0); var v=this.elements; v[0]=x; v[1]=y; } __class(Vector2,'laya.d3.math.Vector2'); var __proto=Vector2.prototype; /** *从一个克隆二维向量克隆。 *@param v 源二维向量。 */ __proto.clone=function(v){ var out=this.elements,s=v.elements; out[0]=s[0]; out[1]=s[1]; } /** *获取X轴坐标。 *@return x X轴坐标。 */ __getset(0,__proto,'x',function(){ return this.elements[0]; }); /** *获取Y轴坐标。 *@return y Y轴坐标。 */ __getset(0,__proto,'y',function(){ return this.elements[1]; }); Vector2.scale=function(a,b,out){ var e=out.elements; var f=a.elements; e[0]=f[0] *b; e[1]=f[1] *b; } __static(Vector2, ['ZERO',function(){return this.ZERO=new Vector2(0.0,0.0);},'ONE',function(){return this.ONE=new Vector2(1.0,1.0);} ]); return Vector2; })() /** *Vector3 类用于创建三维向量。 */ //class laya.d3.math.Vector3 var Vector3=(function(){ function Vector3(x,y,z){ this.elements=new Float32Array(3); (x===void 0)&& (x=0); (y===void 0)&& (y=0); (z===void 0)&& (z=0); var v=this.elements; v[0]=x; v[1]=y; v[2]=z; } __class(Vector3,'laya.d3.math.Vector3'); var __proto=Vector3.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destVector3=destObject; var destE=destVector3.elements; var s=this.elements; destE[0]=s[0]; destE[1]=s[1]; destE[2]=s[2]; } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destVector3=/*__JS__ */new this.constructor(); this.cloneTo(destVector3); return destVector3; } __proto.toDefault=function(){ this.elements[0]=0; this.elements[1]=0; this.elements[2]=0; } /** *设置X轴坐标。 *@param x X轴坐标。 */ /** *获取X轴坐标。 *@return x X轴坐标。 */ __getset(0,__proto,'x',function(){ return this.elements[0]; },function(value){ this.elements[0]=value; }); /** *设置Y轴坐标。 *@param y Y轴坐标。 */ /** *获取Y轴坐标。 *@return y Y轴坐标。 */ __getset(0,__proto,'y',function(){ return this.elements[1]; },function(value){ this.elements[1]=value; }); /** *设置Z轴坐标。 *@param z Z轴坐标。 */ /** *获取Z轴坐标。 *@return z Z轴坐标。 */ __getset(0,__proto,'z',function(){ return this.elements[2]; },function(value){ this.elements[2]=value; }); Vector3.distanceSquared=function(value1,value2){ var value1e=value1.elements; var value2e=value2.elements; var x=value1e[0]-value2e[0]; var y=value1e[1]-value2e[1]; var z=value1e[2]-value2e[2]; return (x *x)+(y *y)+(z *z); } Vector3.distance=function(value1,value2){ var value1e=value1.elements; var value2e=value2.elements; var x=value1e[0]-value2e[0]; var y=value1e[1]-value2e[1]; var z=value1e[2]-value2e[2]; return Math.sqrt((x *x)+(y *y)+(z *z)); } Vector3.min=function(a,b,out){ var e=out.elements; var f=a.elements; var g=b.elements e[0]=Math.min(f[0],g[0]); e[1]=Math.min(f[1],g[1]); e[2]=Math.min(f[2],g[2]); } Vector3.max=function(a,b,out){ var e=out.elements; var f=a.elements; var g=b.elements e[0]=Math.max(f[0],g[0]); e[1]=Math.max(f[1],g[1]); e[2]=Math.max(f[2],g[2]); } Vector3.transformQuat=function(source,rotation,out){ var destination=out.elements; var se=source.elements; var re=rotation.elements; var x=se[0],y=se[1],z=se[2],qx=re[0],qy=re[1],qz=re[2],qw=re[3], ix=qw *x+qy *z-qz *y,iy=qw *y+qz *x-qx *z,iz=qw *z+qx *y-qy *x,iw=-qx *x-qy *y-qz *z; destination[0]=ix *qw+iw *-qx+iy *-qz-iz *-qy; destination[1]=iy *qw+iw *-qy+iz *-qx-ix *-qz; destination[2]=iz *qw+iw *-qz+ix *-qy-iy *-qx; } Vector3.scalarLength=function(a){ var f=a.elements; var x=f[0],y=f[1],z=f[2]; return Math.sqrt(x *x+y *y+z *z); } Vector3.scalarLengthSquared=function(a){ var f=a.elements; var x=f[0],y=f[1],z=f[2]; return x *x+y *y+z *z; } Vector3.normalize=function(s,out){ var se=s.elements; var oe=out.elements; var x=se[0],y=se[1],z=se[2]; var len=x *x+y *y+z *z; if (len > 0){ len=1 / Math.sqrt(len); oe[0]=se[0] *len; oe[1]=se[1] *len; oe[2]=se[2] *len; } } Vector3.multiply=function(a,b,out){ var e=out.elements; var f=a.elements; var g=b.elements e[0]=f[0] *g[0]; e[1]=f[1] *g[1]; e[2]=f[2] *g[2]; } Vector3.scale=function(a,b,out){ var e=out.elements; var f=a.elements; e[0]=f[0] *b; e[1]=f[1] *b; e[2]=f[2] *b; } Vector3.lerp=function(a,b,t,out){ var e=out.elements; var f=a.elements; var g=b.elements; var ax=f[0],ay=f[1],az=f[2]; e[0]=ax+t *(g[0]-ax); e[1]=ay+t *(g[1]-ay); e[2]=az+t *(g[2]-az); } Vector3.transformV3ToV3=function(vector,transform,result){ var intermediate=new Vector4(); Vector3.transformV3ToV4(vector,transform,intermediate); var intermediateElem=intermediate.elements; var resultElem=result.elements; resultElem[0]=intermediateElem[0]; resultElem[1]=intermediateElem[1]; resultElem[2]=intermediateElem[2]; } Vector3.transformV3ToV4=function(vector,transform,result){ var vectorElem=vector.elements; var vectorX=vectorElem[0]; var vectorY=vectorElem[1]; var vectorZ=vectorElem[2]; var transformElem=transform.elements; var resultElem=result.elements; resultElem[0]=(vectorX *transformElem[0])+(vectorY *transformElem[4])+(vectorZ *transformElem[8])+transformElem[12]; resultElem[1]=(vectorX *transformElem[1])+(vectorY *transformElem[5])+(vectorZ *transformElem[9])+transformElem[13]; resultElem[2]=(vectorX *transformElem[2])+(vectorY *transformElem[6])+(vectorZ *transformElem[10])+transformElem[14]; resultElem[3]=(vectorX *transformElem[3])+(vectorY *transformElem[7])+(vectorZ *transformElem[11])+transformElem[15]; } Vector3.TransformNormal=function(normal,transform,result){ var normalElem=normal.elements; var normalX=normalElem[0]; var normalY=normalElem[1]; var normalZ=normalElem[2]; var transformElem=transform.elements; var resultElem=result.elements; resultElem[0]=(normalX *transformElem[0])+(normalY *transformElem[4])+(normalZ *transformElem[8]); resultElem[1]=(normalX *transformElem[1])+(normalY *transformElem[5])+(normalZ *transformElem[9]); resultElem[2]=(normalX *transformElem[2])+(normalY *transformElem[6])+(normalZ *transformElem[10]); } Vector3.transformCoordinate=function(coordinate,transform,result){ var vectorElem=Vector3.TEMPVec4.elements; var coordinateElem=coordinate.elements; var coordinateX=coordinateElem[0]; var coordinateY=coordinateElem[1]; var coordinateZ=coordinateElem[2]; var transformElem=transform.elements; vectorElem[0]=(coordinateX *transformElem[0])+(coordinateY *transformElem[4])+(coordinateZ *transformElem[8])+transformElem[12]; vectorElem[1]=(coordinateX *transformElem[1])+(coordinateY *transformElem[5])+(coordinateZ *transformElem[9])+transformElem[13]; vectorElem[2]=(coordinateX *transformElem[2])+(coordinateY *transformElem[6])+(coordinateZ *transformElem[10])+transformElem[14]; vectorElem[3]=1.0 / ((coordinateX *transformElem[3])+(coordinateY *transformElem[7])+(coordinateZ *transformElem[11])+transformElem[15]); var resultElem=result.elements; resultElem[0]=vectorElem[0] *vectorElem[3]; resultElem[1]=vectorElem[1] *vectorElem[3]; resultElem[2]=vectorElem[2] *vectorElem[3]; } Vector3.Clamp=function(value,min,max,out){ var valuee=value.elements; var x=valuee[0]; var y=valuee[1]; var z=valuee[2]; var mine=min.elements; var mineX=mine[0]; var mineY=mine[1]; var mineZ=mine[2]; var maxe=max.elements; var maxeX=maxe[0]; var maxeY=maxe[1]; var maxeZ=maxe[2]; var oute=out.elements; x=(x > maxeX)? maxeX :x; x=(x < mineX)? mineX :x; y=(y > maxeY)? maxeY :y; y=(y < mineY)? mineY :y; z=(z > maxeZ)? maxeZ :z; z=(z < mineZ)? mineZ :z; oute[0]=x; oute[1]=y; oute[2]=z; } Vector3.add=function(a,b,out){ var e=out.elements; var f=a.elements; var g=b.elements e[0]=f[0]+g[0]; e[1]=f[1]+g[1]; e[2]=f[2]+g[2]; } Vector3.subtract=function(a,b,o){ var oe=o.elements; var ae=a.elements; var be=b.elements; oe[0]=ae[0]-be[0]; oe[1]=ae[1]-be[1]; oe[2]=ae[2]-be[2]; } Vector3.cross=function(a,b,o){ var ae=a.elements; var be=b.elements; var oe=o.elements; var ax=ae[0],ay=ae[1],az=ae[2],bx=be[0],by=be[1],bz=be[2]; oe[0]=ay *bz-az *by; oe[1]=az *bx-ax *bz; oe[2]=ax *by-ay *bx; } Vector3.dot=function(a,b){ var ae=a.elements; var be=b.elements; var r=(ae[0] *be[0])+(ae[1] *be[1])+(ae[2] *be[2]); return r; } Vector3.equals=function(a,b){ var ae=a.elements; var be=b.elements; return MathUtils3D.nearEqual(Math.abs(ae[0]),Math.abs(be[0])) && MathUtils3D.nearEqual(Math.abs(ae[1]),Math.abs(be[1])) && MathUtils3D.nearEqual(Math.abs(ae[2]),Math.abs(be[2])); } __static(Vector3, ['TEMPVec4',function(){return this.TEMPVec4=new Vector4();},'ZERO',function(){return this.ZERO=new Vector3(0.0,0.0,0.0);},'ONE',function(){return this.ONE=new Vector3(1.0,1.0,1.0);},'NegativeUnitX',function(){return this.NegativeUnitX=new Vector3(-1,0,0);},'UnitX',function(){return this.UnitX=new Vector3(1,0,0);},'UnitY',function(){return this.UnitY=new Vector3(0,1,0);},'UnitZ',function(){return this.UnitZ=new Vector3(0,0,1);},'ForwardRH',function(){return this.ForwardRH=new Vector3(0,0,-1);},'ForwardLH',function(){return this.ForwardLH=new Vector3(0,0,1);},'Up',function(){return this.Up=new Vector3(0,1,0);} ]); return Vector3; })() /** *Vector4 类用于创建四维向量。 */ //class laya.d3.math.Vector4 var Vector4=(function(){ function Vector4(x,y,z,w){ this.elements=new Float32Array(4); (x===void 0)&& (x=0); (y===void 0)&& (y=0); (z===void 0)&& (z=0); (w===void 0)&& (w=0); var v=this.elements; v[0]=x; v[1]=y; v[2]=z; v[3]=w; } __class(Vector4,'laya.d3.math.Vector4'); var __proto=Vector4.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destVector4=destObject; var destE=destVector4.elements; var s=this.elements; destE[0]=s[0]; destE[1]=s[1]; destE[2]=s[2]; destE[3]=s[3]; } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destVector4=/*__JS__ */new this.constructor(); this.cloneTo(destVector4); return destVector4; } /** *获取X轴坐标。 *@return x X轴坐标。 */ __getset(0,__proto,'x',function(){ return this.elements[0]; }); /** *获取Y轴坐标。 *@return y Y轴坐标。 */ __getset(0,__proto,'y',function(){ return this.elements[1]; }); /** *获取Z轴坐标。 *@return z Z轴坐标。 */ __getset(0,__proto,'z',function(){ return this.elements[2]; }); /** *获取W轴坐标。 *@return w W轴坐标。 */ __getset(0,__proto,'w',function(){ return this.elements[3]; }); Vector4.lerp=function(a,b,t,out){ var e=out.elements; var f=a.elements; var g=b.elements; var ax=f[0],ay=f[1],az=f[2],aw=f[3]; e[0]=ax+t *(g[0]-ax); e[1]=ay+t *(g[1]-ay); e[2]=az+t *(g[2]-az); e[3]=aw+t *(g[3]-aw); } __static(Vector4, ['ZERO',function(){return this.ZERO=new Vector4();} ]); return Vector4; })() /** *Viewport 类用于创建视口。 */ //class laya.d3.math.Viewport var Viewport=(function(){ function Viewport(x,y,width,height){ //this.x=NaN; //this.y=NaN; //this.width=NaN; //this.height=NaN; //this.minDepth=NaN; //this.maxDepth=NaN; this.minDepth=0.0; this.maxDepth=1.0; this.x=x; this.y=y; this.width=width; this.height=height; } __class(Viewport,'laya.d3.math.Viewport'); var __proto=Viewport.prototype; /** *变换一个三维向量。 *@param source 源三维向量。 *@param matrix 变换矩阵。 *@param vector 输出三维向量。 */ __proto.project=function(source,matrix,out){ Vector3.transformV3ToV3(source,matrix,out); var sourceEleme=source.elements; var matrixEleme=matrix.elements; var outEleme=out.elements; var a=(((sourceEleme[0] *matrixEleme[3])+(sourceEleme[1] *matrixEleme[7]))+(sourceEleme[2] *matrixEleme[11]))+matrixEleme[15]; if (a!==1.0){ outEleme[0]=outEleme[0] / a; outEleme[1]=outEleme[1] / a; outEleme[2]=outEleme[2] / a; } outEleme[0]=(((outEleme[0]+1.0)*0.5)*this.width)+this.x; outEleme[1]=(((-outEleme[1]+1.0)*0.5)*this.height)+this.y; outEleme[2]=(outEleme[2] *(this.maxDepth-this.minDepth))+this.minDepth; } /** *反变换一个三维向量。 *@param source 源三维向量。 *@param matrix 变换矩阵。 *@param vector 输出三维向量。 */ __proto.unprojectFromMat=function(source,matrix,out){ var sourceEleme=source.elements; var matrixEleme=matrix.elements; var outEleme=out.elements; outEleme[0]=(((sourceEleme[0]-this.x)/ (this.width))*2.0)-1.0; outEleme[1]=-((((sourceEleme[1]-this.y)/ (this.height))*2.0)-1.0); var halfDepth=(this.maxDepth-this.minDepth)/ 2; outEleme[2]=(sourceEleme[2]-this.minDepth-halfDepth)/ halfDepth; var a=(((outEleme[0] *matrixEleme[3])+(outEleme[1] *matrixEleme[7]))+(outEleme[2] *matrixEleme[11]))+matrixEleme[15]; Vector3.transformV3ToV3(out,matrix,out); if (a!==1.0){ outEleme[0]=outEleme[0] / a; outEleme[1]=outEleme[1] / a; outEleme[2]=outEleme[2] / a; } } /** *反变换一个三维向量。 *@param source 源三维向量。 *@param projection 透视投影矩阵。 *@param view 视图矩阵。 *@param world 世界矩阵,可设置为null。 *@param out 输出向量。 */ __proto.unprojectFromWVP=function(source,projection,view,world,out){ Matrix4x4.multiply(projection,view,Viewport._tempMatrix4x4); (world)&& (Matrix4x4.multiply(Viewport._tempMatrix4x4,world,Viewport._tempMatrix4x4)); Viewport._tempMatrix4x4.invert(Viewport._tempMatrix4x4); this.unprojectFromMat(source,Viewport._tempMatrix4x4,out); } __static(Viewport, ['_tempMatrix4x4',function(){return this._tempMatrix4x4=new Matrix4x4();} ]); return Viewport; })() /** *SubMesh 类用于创建子网格数据模板。 */ //class laya.d3.resource.models.SubMesh var SubMesh=(function(){ function SubMesh(){ this._indexBuffer=null; this._vertexBuffer=null; this._boneIndices=null; this._bufferUsage=null; this._indexInMesh=0; this._bufferUsage={}; } __class(SubMesh,'laya.d3.resource.models.SubMesh'); var __proto=SubMesh.prototype; Laya.imps(__proto,{"laya.d3.core.render.IRenderable":true,"laya.resource.IDispose":true}) /** *@private */ __proto._getVertexBuffer=function(index){ (index===void 0)&& (index=0); if (index===0) return this._vertexBuffer; else return null; } /** *@private */ __proto._getIndexBuffer=function(){ return this._indexBuffer; } /** *@private */ __proto._beforeRender=function(state){ this._vertexBuffer._bind(); this._indexBuffer._bind(); return true; } /** *@private *渲染。 *@param state 渲染状态。 */ __proto._render=function(state){ var indexCount=this._indexBuffer.indexCount; state.context.drawElements(/*laya.webgl.WebGLContext.TRIANGLES*/0x0004,indexCount,/*laya.webgl.WebGLContext.UNSIGNED_SHORT*/0x1403,0); Stat.drawCall++; Stat.trianglesFaces+=indexCount / 3; } /** *

彻底清理资源。

*

注意:会强制解锁清理。

*/ __proto.dispose=function(){ this._boneIndices=null; this._indexBuffer.dispose(); this._vertexBuffer.dispose(); } /** *@private */ __getset(0,__proto,'_vertexBufferCount',function(){ return 1; }); /** *@private */ __getset(0,__proto,'indexOfHost',function(){ return this._indexInMesh; }); /** *@private */ __getset(0,__proto,'triangleCount',function(){ return this._indexBuffer.indexCount / 3; }); return SubMesh; })() /** *... *@author ... */ //class laya.d3.utils.Physics var Physics=(function(){ function Physics(){} __class(Physics,'laya.d3.utils.Physics'); Physics.rayCastNode=function(ray,sprite3D,outHitInfo){ if ((sprite3D instanceof laya.d3.core.MeshSprite3D )){ var meshSprite3D=sprite3D; var worldMatrix=sprite3D.transform.worldMatrix; var invertWorldMatrix=Physics._tempMatrix4x40; worldMatrix.invert(invertWorldMatrix); var preRayOrigin=Physics._tempVector30; var preRayDirection=Physics._tempVector31; var rayOrigin=ray.origin; var rayDirection=ray.direction; rayOrigin.cloneTo(preRayOrigin); rayDirection.cloneTo(preRayDirection); Vector3.transformCoordinate(rayOrigin,invertWorldMatrix,rayOrigin); Vector3.TransformNormal(rayDirection,invertWorldMatrix,rayDirection); Vector3.normalize(rayDirection,rayDirection); var renderElements=meshSprite3D.meshRender.renderObject._renderElements; for (var i=0,iNum=renderElements.length;i < iNum;i++){ var renderObj=renderElements[i].renderObj; var vertexBuffer=renderObj._getVertexBuffer(0); var vertexDatas=vertexBuffer.getData(); var indexDatas=renderObj._getIndexBuffer().getData(); var elementRaycastHit=Physics._tempRaycastHit0; var isHit=Picker.rayIntersectsPositionsAndIndices(ray,vertexDatas,vertexBuffer.vertexDeclaration,indexDatas,elementRaycastHit); if (isHit){ Vector3.transformCoordinate(elementRaycastHit.position,worldMatrix,elementRaycastHit.position); var trianglePositions=elementRaycastHit.trianglePositions; Vector3.transformCoordinate(trianglePositions[0],worldMatrix,trianglePositions[0]); Vector3.transformCoordinate(trianglePositions[1],worldMatrix,trianglePositions[1]); Vector3.transformCoordinate(trianglePositions[2],worldMatrix,trianglePositions[2]); var triangleNormals=elementRaycastHit.triangleNormals; Vector3.transformCoordinate(triangleNormals[0],worldMatrix,triangleNormals[0]); Vector3.transformCoordinate(triangleNormals[1],worldMatrix,triangleNormals[1]); Vector3.transformCoordinate(triangleNormals[2],worldMatrix,triangleNormals[2]); var rayOriToPos=Physics._tempVector33; Vector3.subtract(preRayOrigin,elementRaycastHit.position,rayOriToPos); outHitInfo.distance=Vector3.scalarLength(rayOriToPos); } if (isHit && elementRaycastHit.distance < outHitInfo.distance){ elementRaycastHit.copy(outHitInfo); } } preRayOrigin.cloneTo(rayOrigin); preRayDirection.cloneTo(rayDirection); } for (var j=0,jNum=sprite3D._childs.length;j < jNum;j++) Physics.rayCast(ray,sprite3D._childs[j],outHitInfo); } Physics.rayCast=function(ray,sprite3D,outHitInfo){ outHitInfo.position.toDefault(); outHitInfo.distance=Number.MAX_VALUE; outHitInfo.trianglePositions[0].toDefault(); outHitInfo.trianglePositions[1].toDefault(); outHitInfo.trianglePositions[2].toDefault(); outHitInfo.triangleNormals[0].toDefault(); outHitInfo.triangleNormals[1].toDefault(); outHitInfo.triangleNormals[2].toDefault(); Physics.rayCastNode(ray,sprite3D,outHitInfo); } __static(Physics, ['_tempVector30',function(){return this._tempVector30=new Vector3();},'_tempVector31',function(){return this._tempVector31=new Vector3();},'_tempVector33',function(){return this._tempVector33=new Vector3();},'_tempMatrix4x40',function(){return this._tempMatrix4x40=new Matrix4x4();},'_tempRaycastHit0',function(){return this._tempRaycastHit0=new RaycastHit();} ]); return Physics; })() /** *Picker 类用于创建拾取。 */ //class laya.d3.utils.Picker var Picker=(function(){ /** *创建一个 Picker 实例。 */ function Picker(){} __class(Picker,'laya.d3.utils.Picker'); Picker.calculateCursorRay=function(point,viewPort,projectionMatrix,viewMatrix,world,out){ var x=point.elements[0]; var y=point.elements[1]; var nearSource=Picker._tempVector30; var nerSourceE=nearSource.elements; nerSourceE[0]=x; nerSourceE[1]=y; nerSourceE[2]=viewPort.minDepth; var farSource=Picker._tempVector31; var farSourceE=farSource.elements; farSourceE[0]=x; farSourceE[1]=y; farSourceE[2]=viewPort.maxDepth; var nearPoint=out.origin; var farPoint=Picker._tempVector32; viewPort.unprojectFromWVP(nearSource,projectionMatrix,viewMatrix,world,nearPoint); viewPort.unprojectFromWVP(farSource,projectionMatrix,viewMatrix,world,farPoint); var outDire=out.direction.elements; outDire[0]=farPoint.x-nearPoint.x; outDire[1]=farPoint.y-nearPoint.y; outDire[2]=farPoint.z-nearPoint.z; Vector3.normalize(out.direction,out.direction); } Picker.rayIntersectsPositionsAndIndices=function(ray,vertexDatas,vertexDeclaration,indices,outHitInfo){ var vertexStrideFloatCount=vertexDeclaration.vertexStride / 4; var positionVertexElementOffset=vertexDeclaration.getVertexElementByUsage(/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION").offset / 4; var closestIntersection=Number.MAX_VALUE; var closestTriangleVertexIndex1=-1; var closestTriangleVertexIndex2=-1; var closestTriangleVertexIndex3=-1; for (var j=0;j < indices.length;j+=3){ var vertex1=Picker._tempVector35; var vertex1E=vertex1.elements; var vertex1Index=indices[j] *vertexStrideFloatCount; var vertex1PositionIndex=vertex1Index+positionVertexElementOffset; vertex1E[0]=vertexDatas[vertex1PositionIndex]; vertex1E[1]=vertexDatas[vertex1PositionIndex+1]; vertex1E[2]=vertexDatas[vertex1PositionIndex+2]; var vertex2=Picker._tempVector36; var vertex2E=vertex2.elements; var vertex2Index=indices[j+1] *vertexStrideFloatCount; var vertex2PositionIndex=vertex2Index+positionVertexElementOffset; vertex2E[0]=vertexDatas[vertex2PositionIndex]; vertex2E[1]=vertexDatas[vertex2PositionIndex+1]; vertex2E[2]=vertexDatas[vertex2PositionIndex+2]; var vertex3=Picker._tempVector37; var vertex3E=vertex3.elements; var vertex3Index=indices[j+2] *vertexStrideFloatCount; var vertex3PositionIndex=vertex3Index+positionVertexElementOffset; vertex3E[0]=vertexDatas[vertex3PositionIndex]; vertex3E[1]=vertexDatas[vertex3PositionIndex+1]; vertex3E[2]=vertexDatas[vertex3PositionIndex+2]; var intersection=laya.d3.utils.Picker.rayIntersectsTriangle(ray,vertex1,vertex2,vertex3); if (!isNaN(intersection)&& intersection < closestIntersection){ closestIntersection=intersection; closestTriangleVertexIndex1=vertex1Index; closestTriangleVertexIndex2=vertex2Index; closestTriangleVertexIndex3=vertex3Index; } } if (closestIntersection!==Number.MAX_VALUE){ outHitInfo.distance=closestIntersection; Vector3.normalize(ray.direction,ray.direction); Vector3.scale(ray.direction,closestIntersection,outHitInfo.position); Vector3.add(ray.origin,outHitInfo.position,outHitInfo.position); var trianglePositions=outHitInfo.trianglePositions; var position0=trianglePositions[0]; var position1=trianglePositions[1]; var position2=trianglePositions[2]; var position0E=position0.elements; var position1E=position1.elements; var position2E=position2.elements; var closestVertex1PositionIndex=closestTriangleVertexIndex1+positionVertexElementOffset; position0E[0]=vertexDatas[closestVertex1PositionIndex]; position0E[1]=vertexDatas[closestVertex1PositionIndex+1]; position0E[2]=vertexDatas[closestVertex1PositionIndex+2]; var closestVertex2PositionIndex=closestTriangleVertexIndex2+positionVertexElementOffset; position1E[0]=vertexDatas[closestVertex2PositionIndex]; position1E[1]=vertexDatas[closestVertex2PositionIndex+1]; position1E[2]=vertexDatas[closestVertex2PositionIndex+2]; var closestVertex3PositionIndex=closestTriangleVertexIndex3+positionVertexElementOffset; position2E[0]=vertexDatas[closestVertex3PositionIndex]; position2E[1]=vertexDatas[closestVertex3PositionIndex+1]; position2E[2]=vertexDatas[closestVertex3PositionIndex+2]; var normalVertexElement=vertexDeclaration.getVertexElementByUsage(/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL"); if (normalVertexElement){ var normalVertexElementOffset=normalVertexElement.offset / 4; var triangleNormals=outHitInfo.triangleNormals; var normal0=triangleNormals[0]; var normal1=triangleNormals[1]; var normal2=triangleNormals[2]; var normal0E=normal0.elements; var normal1E=normal1.elements; var normal2E=normal2.elements; var closestVertex1NormalIndex=closestTriangleVertexIndex1+normalVertexElementOffset; normal0E[0]=vertexDatas[closestVertex1NormalIndex]; normal0E[1]=vertexDatas[closestVertex1NormalIndex+1]; normal0E[2]=vertexDatas[closestVertex1NormalIndex+2]; var closestVertex2NormalIndex=closestTriangleVertexIndex2+normalVertexElementOffset; normal1E[0]=vertexDatas[closestVertex2NormalIndex]; normal1E[1]=vertexDatas[closestVertex2NormalIndex+1]; normal1E[2]=vertexDatas[closestVertex2NormalIndex+2]; var closestVertex3NormalIndex=closestTriangleVertexIndex3+normalVertexElementOffset; normal2E[0]=vertexDatas[closestVertex3NormalIndex]; normal2E[1]=vertexDatas[closestVertex3NormalIndex+1]; normal2E[2]=vertexDatas[closestVertex3NormalIndex+2]; } return true; }else { outHitInfo.position.toDefault(); outHitInfo.distance=Number.MAX_VALUE; outHitInfo.trianglePositions[0].toDefault(); outHitInfo.trianglePositions[1].toDefault(); outHitInfo.trianglePositions[2].toDefault(); outHitInfo.triangleNormals[0].toDefault(); outHitInfo.triangleNormals[1].toDefault(); outHitInfo.triangleNormals[2].toDefault(); return false; } } Picker.rayIntersectsTriangle=function(ray,vertex1,vertex2,vertex3){ var result; var edge1=Picker._tempVector30,edge2=Picker._tempVector31; Vector3.subtract(vertex2,vertex1,edge1); Vector3.subtract(vertex3,vertex1,edge2); var directionCrossEdge2=Picker._tempVector32; Vector3.cross(ray.direction,edge2,directionCrossEdge2); var determinant; determinant=Vector3.dot(edge1,directionCrossEdge2); if (determinant >-Number.MIN_VALUE && determinant < Number.MIN_VALUE){ result=Number.NaN; return result; }; var inverseDeterminant=1.0 / determinant; var distanceVector=Picker._tempVector33; Vector3.subtract(ray.origin,vertex1,distanceVector); var triangleU; triangleU=Vector3.dot(distanceVector,directionCrossEdge2); triangleU *=inverseDeterminant; if (triangleU < 0 || triangleU > 1){ result=Number.NaN; return result; }; var distanceCrossEdge1=Picker._tempVector34; Vector3.cross(distanceVector,edge1,distanceCrossEdge1); var triangleV; triangleV=Vector3.dot(ray.direction,distanceCrossEdge1); triangleV *=inverseDeterminant; if (triangleV < 0 || triangleU+triangleV > 1){ result=Number.NaN; return result; }; var rayDistance; rayDistance=Vector3.dot(edge2,distanceCrossEdge1); rayDistance *=inverseDeterminant; if (rayDistance < 0){ result=Number.NaN; return result; } result=rayDistance; return result; } __static(Picker, ['_tempVector30',function(){return this._tempVector30=new Vector3();},'_tempVector31',function(){return this._tempVector31=new Vector3();},'_tempVector32',function(){return this._tempVector32=new Vector3();},'_tempVector33',function(){return this._tempVector33=new Vector3();},'_tempVector34',function(){return this._tempVector34=new Vector3();},'_tempVector35',function(){return this._tempVector35=new Vector3();},'_tempVector36',function(){return this._tempVector36=new Vector3();},'_tempVector37',function(){return this._tempVector37=new Vector3();} ]); return Picker; })() /** *... *@author ... */ //class laya.d3.utils.RaycastHit var RaycastHit=(function(){ function RaycastHit(){ this.distance=NaN; this.trianglePositions=null; this.triangleNormals=null; this.position=null; this.distance=Number.MAX_VALUE; this.trianglePositions=[new Vector3(),new Vector3(),new Vector3()]; this.trianglePositions.length=3; this.triangleNormals=[new Vector3(),new Vector3(),new Vector3()]; this.triangleNormals.length=3; this.position=new Vector3(); } __class(RaycastHit,'laya.d3.utils.RaycastHit'); var __proto=RaycastHit.prototype; __proto.copy=function(dec){ dec.distance=this.distance; this.trianglePositions[0].cloneTo(dec.trianglePositions[0]); this.trianglePositions[1].cloneTo(dec.trianglePositions[1]); this.trianglePositions[2].cloneTo(dec.trianglePositions[2]); this.triangleNormals[0].cloneTo(dec.triangleNormals[0]); this.triangleNormals[1].cloneTo(dec.triangleNormals[1]); this.triangleNormals[2].cloneTo(dec.triangleNormals[2]); this.position.cloneTo(dec.position); } return RaycastHit; })() //class laya.d3.utils.Size var Size=(function(){ function Size(width,height){ this._width=0; this._height=0; this._width=width; this._height=height; } __class(Size,'laya.d3.utils.Size'); var __proto=Size.prototype; __getset(0,__proto,'width',function(){ if (this._width===-1) return RenderState.clientWidth; return this._width; }); __getset(0,__proto,'height',function(){ if (this._height===-1) return RenderState.clientHeight; return this._height; }); __getset(1,Size,'fullScreen',function(){ return new Size(-1,-1); }); return Size; })() /** *Utils3D 类用于创建3D工具。 */ //class laya.d3.utils.Utils3D var Utils3D=(function(){ function Utils3D(){}; __class(Utils3D,'laya.d3.utils.Utils3D'); var __proto=Utils3D.prototype; /** *@private */ __proto.testTangent=function(renderElement,vertexBuffer,indeBuffer,bufferUsage){ var vertexDeclaration=vertexBuffer.vertexDeclaration; var material=renderElement._material; if (material.normalTexture && !vertexDeclaration.getVertexElementByUsage(/*laya.d3.graphics.VertexElementUsage.TANGENT0*/"TANGENT0")){ var vertexDatas=vertexBuffer.getData(); var newVertexDatas=laya.d3.utils.Utils3D.generateTangent(vertexDatas,vertexDeclaration.vertexStride / 4,vertexDeclaration.getVertexElementByUsage(/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION").offset / 4,vertexDeclaration.getVertexElementByUsage(/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV").offset / 4,indeBuffer.getData()); vertexDeclaration=laya.d3.utils.Utils3D.getVertexTangentDeclaration(vertexDeclaration.getVertexElements()); var newVB=VertexBuffer3D.create(vertexDeclaration,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4); newVB.setData(newVertexDatas); vertexBuffer.dispose(); bufferUsage[ /*laya.d3.graphics.VertexElementUsage.TANGENT0*/"TANGENT0"]=newVB; return newVB; } return vertexBuffer; } Utils3D._getTexturePath=function(path){ var extenIndex=path.length-4; if (path.indexOf(".dds")==extenIndex || path.indexOf(".tga")==extenIndex || path.indexOf(".exr")==extenIndex || path.indexOf(".DDS")==extenIndex || path.indexOf(".TGA")==extenIndex || path.indexOf(".EXR")==extenIndex) path=path.substr(0,extenIndex)+".png"; return path=URL.formatURL(path); } Utils3D._rotationTransformScaleSkinAnimation=function(tx,ty,tz,qx,qy,qz,qw,sx,sy,sz,outArray,outOffset){ var re=Utils3D._tempArray16_0; var se=Utils3D._tempArray16_1; var tse=Utils3D._tempArray16_2; var x2=qx+qx; var y2=qy+qy; var z2=qz+qz; var xx=qx *x2; var yx=qy *x2; var yy=qy *y2; var zx=qz *x2; var zy=qz *y2; var zz=qz *z2; var wx=qw *x2; var wy=qw *y2; var wz=qw *z2; re[15]=1; re[0]=1-yy-zz; re[1]=yx+wz; re[2]=zx-wy; re[4]=yx-wz; re[5]=1-xx-zz; re[6]=zy+wx; re[8]=zx+wy; re[9]=zy-wx; re[10]=1-xx-yy; se[15]=1; se[0]=sx; se[5]=sy; se[10]=sz; var i,a,b,e,ai0,ai1,ai2,ai3; for (i=0;i < 4;i++){ ai0=re[i]; ai1=re[i+4]; ai2=re[i+8]; ai3=re[i+12]; tse[i]=ai0; tse[i+4]=ai1; tse[i+8]=ai2; tse[i+12]=ai0 *tx+ai1 *ty+ai2 *tz+ai3; } for (i=0;i < 4;i++){ ai0=tse[i]; ai1=tse[i+4]; ai2=tse[i+8]; ai3=tse[i+12]; outArray[i+outOffset]=ai0 *se[0]+ai1 *se[1]+ai2 *se[2]+ai3 *se[3]; outArray[i+outOffset+4]=ai0 *se[4]+ai1 *se[5]+ai2 *se[6]+ai3 *se[7]; outArray[i+outOffset+8]=ai0 *se[8]+ai1 *se[9]+ai2 *se[10]+ai3 *se[11]; outArray[i+outOffset+12]=ai0 *se[12]+ai1 *se[13]+ai2 *se[14]+ai3 *se[15]; } } Utils3D._applyMeshMaterials=function(meshSprite3D,mesh){ var meshRender=meshSprite3D.meshRender; var shaderMaterials=meshRender.sharedMaterials; var meshMaterials=mesh.materials; for (var i=0,n=meshMaterials.length;i < n;i++) (shaderMaterials[i])|| (shaderMaterials[i]=meshMaterials[i]); meshRender.sharedMaterials=shaderMaterials; } Utils3D._loadParticle=function(settting,particle,innerResouMap){ var anglelToRad=Math.PI / 180.0; var i=0,n=0; var material=new ShurikenParticleMaterial(); material.diffuseTexture=innerResouMap ? Loader.getRes(innerResouMap[settting.texturePath]):Texture2D.load(settting.texturePath); material.renderMode=/*laya.d3.core.material.BaseMaterial.RENDERMODE_DEPTHREAD_ADDTIVEDOUBLEFACE*/8; particle.particleRender.sharedMaterial=material; var particleSystem=particle.particleSystem; particleSystem.isPerformanceMode=settting.isPerformanceMode; particleSystem.duration=settting.duration; particleSystem.looping=settting.looping; particleSystem.prewarm=settting.prewarm; particleSystem.startDelayType=settting.startDelayType; particleSystem.startDelay=settting.startDelay; particleSystem.startDelayMin=settting.startDelayMin; particleSystem.startDelayMax=settting.startDelayMax; particleSystem.startLifetimeType=settting.startLifetimeType; particleSystem.startLifetimeConstant=settting.startLifetimeConstant; particleSystem.startLifeTimeGradient=Utils3D._initStartLife(settting.startLifetimeGradient); particleSystem.startLifetimeConstantMin=settting.startLifetimeConstantMin; particleSystem.startLifetimeConstantMax=settting.startLifetimeConstantMax; particleSystem.startLifeTimeGradientMin=Utils3D._initStartLife(settting.startLifetimeGradientMin); particleSystem.startLifeTimeGradientMax=Utils3D._initStartLife(settting.startLifetimeGradientMax); particleSystem.startSpeedType=settting.startSpeedType; particleSystem.startSpeedConstant=settting.startSpeedConstant; particleSystem.startSpeedConstantMin=settting.startSpeedConstantMin; particleSystem.startSpeedConstantMax=settting.startSpeedConstantMax; particleSystem.threeDStartSize=settting.threeDStartSize; particleSystem.startSizeType=settting.startSizeType; particleSystem.startSizeConstant=settting.startSizeConstant; var startSizeConstantSeparateArray=settting.startSizeConstantSeparate; var startSizeConstantSeparateElement=particleSystem.startSizeConstantSeparate.elements; startSizeConstantSeparateElement[0]=startSizeConstantSeparateArray[0]; startSizeConstantSeparateElement[1]=startSizeConstantSeparateArray[1]; startSizeConstantSeparateElement[2]=startSizeConstantSeparateArray[2]; particleSystem.startSizeConstantMin=settting.startSizeConstantMin; particleSystem.startSizeConstantMax=settting.startSizeConstantMax; var startSizeConstantMinSeparateArray=settting.startSizeConstantMinSeparate; var startSizeConstantMinSeparateElement=particleSystem.startSizeConstantMinSeparate.elements; startSizeConstantMinSeparateElement[0]=startSizeConstantMinSeparateArray[0]; startSizeConstantMinSeparateElement[1]=startSizeConstantMinSeparateArray[1]; startSizeConstantMinSeparateElement[2]=startSizeConstantMinSeparateArray[2]; var startSizeConstantMaxSeparateArray=settting.startSizeConstantMaxSeparate; var startSizeConstantMaxSeparateElement=particleSystem.startSizeConstantMaxSeparate.elements; startSizeConstantMaxSeparateElement[0]=startSizeConstantMaxSeparateArray[0]; startSizeConstantMaxSeparateElement[1]=startSizeConstantMaxSeparateArray[1]; startSizeConstantMaxSeparateElement[2]=startSizeConstantMaxSeparateArray[2]; particleSystem.threeDStartRotation=settting.threeDStartRotation; particleSystem.startRotationType=settting.startRotationType; particleSystem.startRotationConstant=settting.startRotationConstant *anglelToRad; var startRotationConstantSeparateArray=settting.startRotationConstantSeparate; var startRotationConstantSeparateElement=particleSystem.startRotationConstantSeparate.elements; startRotationConstantSeparateElement[0]=startRotationConstantSeparateArray[0] *anglelToRad; startRotationConstantSeparateElement[1]=startRotationConstantSeparateArray[1] *anglelToRad; startRotationConstantSeparateElement[2]=startRotationConstantSeparateArray[2] *anglelToRad; particleSystem.startRotationConstantMin=settting.startRotationConstantMin *anglelToRad; particleSystem.startRotationConstantMax=settting.startRotationConstantMax *anglelToRad; var startRotationConstantMinSeparateArray=settting.startRotationConstantMinSeparate; var startRotationConstantMinSeparateElement=particleSystem.startRotationConstantMinSeparate.elements; startRotationConstantMinSeparateElement[0]=startRotationConstantMinSeparateArray[0] *anglelToRad; startRotationConstantMinSeparateElement[1]=startRotationConstantMinSeparateArray[1] *anglelToRad; startRotationConstantMinSeparateElement[2]=startRotationConstantMinSeparateArray[2] *anglelToRad; var startRotationConstantMaxSeparateArray=settting.startRotationConstantMaxSeparate; var startRotationConstantMaxSeparateElement=particleSystem.startRotationConstantMaxSeparate.elements; startRotationConstantMaxSeparateElement[0]=startRotationConstantMaxSeparateArray[0] *anglelToRad; startRotationConstantMaxSeparateElement[1]=startRotationConstantMaxSeparateArray[1] *anglelToRad; startRotationConstantMaxSeparateElement[2]=startRotationConstantMaxSeparateArray[2] *anglelToRad; particleSystem.randomizeRotationDirection=settting.randomizeRotationDirection; particleSystem.startColorType=settting.startColorType; var startColorConstantArray=settting.startColorConstant; var startColorConstantElement=particleSystem.startColorConstant.elements; startColorConstantElement[0]=startColorConstantArray[0]; startColorConstantElement[1]=startColorConstantArray[1]; startColorConstantElement[2]=startColorConstantArray[2]; startColorConstantElement[3]=startColorConstantArray[3]; var startColorConstantMinArray=settting.startColorConstantMin; var startColorConstantMinElement=particleSystem.startColorConstantMin.elements; startColorConstantMinElement[0]=startColorConstantMinArray[0]; startColorConstantMinElement[1]=startColorConstantMinArray[1]; startColorConstantMinElement[2]=startColorConstantMinArray[2]; startColorConstantMinElement[3]=startColorConstantMinArray[3]; var startColorConstantMaxArray=settting.startColorConstantMax; var startColorConstantMaxElement=particleSystem.startColorConstantMax.elements; startColorConstantMaxElement[0]=startColorConstantMaxArray[0]; startColorConstantMaxElement[1]=startColorConstantMaxArray[1]; startColorConstantMaxElement[2]=startColorConstantMaxArray[2]; startColorConstantMaxElement[3]=startColorConstantMaxArray[3]; var gravityArray=settting.gravity; var gravityE=particleSystem.gravity.elements; gravityE[0]=gravityArray[0]; gravityE[1]=gravityArray[1]; gravityE[2]=gravityArray[2]; particleSystem.gravityModifier=settting.gravityModifier; particleSystem.simulationSpace=settting.simulationSpace; particleSystem.scaleMode=settting.scaleMode; particleSystem.playOnAwake=settting.playOnAwake; particleSystem.maxParticles=settting.maxParticles; var emissionData=settting.emission; var emission=new Emission(); emission.emissionRate=emissionData.emissionRate; var burstsData=emissionData.bursts; if (burstsData) for (i=0,n=burstsData.length;i < n;i++){ var brust=burstsData[i]; emission.addBurst(new Burst(brust.time,brust.min,brust.max)); } emission.enbale=emissionData.enable; particleSystem.emission=emission; var shapeData=settting.shape; var shape; switch (shapeData.shapeType){ case 0:; var sphereShape; shape=sphereShape=new SphereShape(); sphereShape.radius=shapeData.sphereRadius; sphereShape.emitFromShell=shapeData.sphereEmitFromShell; sphereShape.randomDirection=shapeData.sphereRandomDirection; break ; case 1:; var hemiSphereShape; shape=hemiSphereShape=new HemisphereShape(); hemiSphereShape.radius=shapeData.hemiSphereRadius; hemiSphereShape.emitFromShell=shapeData.hemiSphereEmitFromShell; hemiSphereShape.randomDirection=shapeData.hemiSphereRandomDirection; break ; case 2:; var coneShape; shape=coneShape=new ConeShape(); coneShape.angle=shapeData.coneAngle *anglelToRad; coneShape.radius=shapeData.coneRadius; coneShape.length=shapeData.coneLength; coneShape.emitType=shapeData.coneEmitType; coneShape.randomDirection=shapeData.coneRandomDirection; break ; case 3:; var boxShape; shape=boxShape=new BoxShape(); boxShape.x=shapeData.boxX; boxShape.y=shapeData.boxY; boxShape.z=shapeData.boxZ; boxShape.randomDirection=shapeData.boxRandomDirection; break ; case 7:; var circleShape; shape=circleShape=new CircleShape(); circleShape.radius=shapeData.circleRadius; circleShape.arc=shapeData.circleArc *anglelToRad; circleShape.emitFromEdge=shapeData.circleEmitFromEdge; circleShape.randomDirection=shapeData.circleRandomDirection; break ; } shape.enbale=shapeData.enable; particleSystem.shape=shape; var velocityOverLifetimeData=settting.velocityOverLifetime; if (velocityOverLifetimeData){ var velocityData=velocityOverLifetimeData.velocity; var velocity; switch (velocityData.type){ case 0:; var constantData=velocityData.constant; velocity=GradientVelocity.createByConstant(new Vector3(constantData[0],constantData[1],constantData[2])); break ; case 1: velocity=GradientVelocity.createByGradient(Utils3D._initParticleVelocity(velocityData.gradientX),Utils3D._initParticleVelocity(velocityData.gradientY),Utils3D._initParticleVelocity(velocityData.gradientZ)); break ; case 2:; var constantMinData=velocityData.constantMin; var constantMaxData=velocityData.constantMax; velocity=GradientVelocity.createByRandomTwoConstant(new Vector3(constantMinData[0],constantMinData[1],constantMinData[2]),new Vector3(constantMaxData[0],constantMaxData[1],constantMaxData[2])); break ; case 3: velocity=GradientVelocity.createByRandomTwoGradient(Utils3D._initParticleVelocity(velocityData.gradientXMin),Utils3D._initParticleVelocity(velocityData.gradientXMax),Utils3D._initParticleVelocity(velocityData.gradientYMin),Utils3D._initParticleVelocity(velocityData.gradientYMax),Utils3D._initParticleVelocity(velocityData.gradientZMin),Utils3D._initParticleVelocity(velocityData.gradientZMax)); break ; }; var velocityOverLifetime=new VelocityOverLifetime(velocity); velocityOverLifetime.space=velocityOverLifetimeData.space; velocityOverLifetime.enbale=velocityOverLifetimeData.enable; particleSystem.velocityOverLifetime=velocityOverLifetime; }; var colorOverLifetimeData=settting.colorOverLifetime; if (colorOverLifetimeData){ var colorData=colorOverLifetimeData.color; var color; switch (colorData.type){ case 0:; var constColorData=colorData.constant; color=GradientColor.createByConstant(new Vector4(constColorData[0],constColorData[1],constColorData[2],constColorData[3])); break ; case 1: color=GradientColor.createByGradient(Utils3D._initParticleColor(colorData.gradient)); break ; case 2:; var minConstColorData=colorData.constantMin; var maxConstColorData=colorData.constantMax; color=GradientColor.createByRandomTwoConstant(new Vector4(minConstColorData[0],minConstColorData[1],minConstColorData[2],minConstColorData[3]),new Vector4(maxConstColorData[0],maxConstColorData[1],maxConstColorData[2],maxConstColorData[3])); break ; case 3: color=GradientColor.createByRandomTwoGradient(Utils3D._initParticleColor(colorData.gradientMin),Utils3D._initParticleColor(colorData.gradientMax)); break ; }; var colorOverLifetime=new ColorOverLifetime(color); colorOverLifetime.enbale=colorOverLifetimeData.enable; particleSystem.colorOverLifetime=colorOverLifetime; }; var sizeOverLifetimeData=settting.sizeOverLifetime; if (sizeOverLifetimeData){ var sizeData=sizeOverLifetimeData.size; var size; switch (sizeData.type){ case 0: if (sizeData.separateAxes){ size=GradientSize.createByGradientSeparate(Utils3D._initParticleSize(sizeData.gradientX),Utils3D._initParticleSize(sizeData.gradientY),Utils3D._initParticleSize(sizeData.gradientZ)); }else { size=GradientSize.createByGradient(Utils3D._initParticleSize(sizeData.gradient)); } break ; case 1: if (sizeData.separateAxes){ var constantMinSeparateData=sizeData.constantMinSeparate; var constantMaxSeparateData=sizeData.constantMaxSeparate; size=GradientSize.createByRandomTwoConstantSeparate(new Vector3(constantMinSeparateData[0],constantMinSeparateData[1],constantMinSeparateData[2]),new Vector3(constantMaxSeparateData[0],constantMaxSeparateData[1],constantMaxSeparateData[2])); }else { size=GradientSize.createByRandomTwoConstant(sizeData.constantMin,sizeData.constantMax); } break ; case 2: if (sizeData.separateAxes){ size=GradientSize.createByRandomTwoGradientSeparate(Utils3D._initParticleSize(sizeData.gradientXMin),Utils3D._initParticleSize(sizeData.gradientYMin),Utils3D._initParticleSize(sizeData.gradientZMin),Utils3D._initParticleSize(sizeData.gradientXMax),Utils3D._initParticleSize(sizeData.gradientYMax),Utils3D._initParticleSize(sizeData.gradientZMax)); }else { size=GradientSize.createByRandomTwoGradient(Utils3D._initParticleSize(sizeData.gradientMin),Utils3D._initParticleSize(sizeData.gradientMax)); } break ; }; var sizeOverLifetime=new SizeOverLifetime(size); sizeOverLifetime.enbale=sizeOverLifetimeData.enable; particleSystem.sizeOverLifetime=sizeOverLifetime; }; var rotationOverLifetimeData=settting.rotationOverLifetime; if (rotationOverLifetimeData){ var angularVelocityData=rotationOverLifetimeData.angularVelocity; var angularVelocity; switch (angularVelocityData.type){ case 0: if (angularVelocityData.separateAxes){ }else { angularVelocity=GradientAngularVelocity.createByConstant(angularVelocityData.constant *anglelToRad); } break ; case 1: if (angularVelocityData.separateAxes){ }else { angularVelocity=GradientAngularVelocity.createByGradient(Utils3D._initParticleRotation(angularVelocityData.gradient)); } break ; case 2: if (angularVelocityData.separateAxes){ }else { angularVelocity=GradientAngularVelocity.createByRandomTwoConstant(angularVelocityData.constantMin *anglelToRad,angularVelocityData.constantMax *anglelToRad); } break ; case 3: if (angularVelocityData.separateAxes){ }else { angularVelocity=GradientAngularVelocity.createByRandomTwoGradient(Utils3D._initParticleRotation(angularVelocityData.gradientMin),Utils3D._initParticleRotation(angularVelocityData.gradientMax)); } break ; }; var rotationOverLifetime=new RotationOverLifetime(angularVelocity); rotationOverLifetime.enbale=rotationOverLifetimeData.enable; particleSystem.rotationOverLifetime=rotationOverLifetime; }; var textureSheetAnimationData=settting.textureSheetAnimation; if (textureSheetAnimationData){ var frameData=textureSheetAnimationData.frame; var frameOverTime; switch (frameData.type){ case 0: frameOverTime=FrameOverTime.createByConstant(frameData.constant); break ; case 1: frameOverTime=FrameOverTime.createByOverTime(Utils3D._initParticleFrame(frameData.overTime)); break ; case 2: frameOverTime=FrameOverTime.createByRandomTwoConstant(frameData.constantMin,frameData.constantMax); break ; case 3: frameOverTime=FrameOverTime.createByRandomTwoOverTime(Utils3D._initParticleFrame(frameData.overTimeMin),Utils3D._initParticleFrame(frameData.overTimeMax)); break ; }; var startFrameData=textureSheetAnimationData.startFrame; var startFrame; switch (startFrameData.type){ case 0: startFrame=StartFrame.createByConstant(startFrameData.constant); break ; case 1: startFrame=StartFrame.createByRandomTwoConstant(startFrameData.constantMin,startFrameData.constantMax); break ; }; var textureSheetAnimation=new TextureSheetAnimation(frameOverTime,startFrame); textureSheetAnimation.enbale=textureSheetAnimationData.enable; var tilesData=textureSheetAnimationData.tiles; textureSheetAnimation.tiles=new Vector2(tilesData[0],tilesData[1]); textureSheetAnimation.type=textureSheetAnimationData.type; textureSheetAnimation.randomRow=textureSheetAnimationData.randomRow; textureSheetAnimation.cycles=textureSheetAnimationData.cycles; particleSystem.textureSheetAnimation=textureSheetAnimation; }; var particleRender=particle.particleRender; particleRender.renderMode=settting.renderMode; particleRender.stretchedBillboardCameraSpeedScale=settting.stretchedBillboardCameraSpeedScale; particleRender.stretchedBillboardSpeedScale=settting.stretchedBillboardSpeedScale; particleRender.stretchedBillboardLengthScale=settting.stretchedBillboardLengthScale; (particleSystem.playOnAwake)&& (emission.play()); } Utils3D._parseHierarchyProp=function(innerResouMap,node,json){ var customProps=json.customProps; var transValue=customProps.translate; var loccalPosition=node.transform.localPosition; var loccalPositionElments=loccalPosition.elements; loccalPositionElments[0]=transValue[0]; loccalPositionElments[1]=transValue[1]; loccalPositionElments[2]=transValue[2]; node.transform.localPosition=loccalPosition; var rotValue=customProps.rotation; var localRotation=node.transform.localRotation; var localRotationElement=localRotation.elements; localRotationElement[0]=rotValue[0]; localRotationElement[1]=rotValue[1]; localRotationElement[2]=rotValue[2]; localRotationElement[3]=rotValue[3]; node.transform.localRotation=localRotation; var scaleValue=customProps.scale; var localScale=node.transform.localScale; var localSceleElement=localScale.elements; localSceleElement[0]=scaleValue[0]; localSceleElement[1]=scaleValue[1]; localSceleElement[2]=scaleValue[2]; node.transform.localScale=localScale; switch (json.type){ case "Sprite3D": break ; case "MeshSprite3D":; var mesh=Loader.getRes(innerResouMap[json.instanceParams.loadPath]); var meshSprite3D=(node); meshSprite3D.meshFilter.sharedMesh=mesh; if (mesh.loaded) meshSprite3D.meshRender.sharedMaterials=mesh.materials; else mesh.once(/*laya.events.Event.LOADED*/"loaded",meshSprite3D,meshSprite3D._applyMeshMaterials); break ; case "ShuriKenParticle3D":; var shuriKenParticle3D=(node); Utils3D._loadParticle(customProps,shuriKenParticle3D,innerResouMap); break ; } } Utils3D._parseHierarchyNode=function(json){ switch (json.type){ case "Sprite3D": return new Sprite3D(); break ; case "MeshSprite3D": return new MeshSprite3D(); break ; case "ShuriKenParticle3D": return new ShuriKenParticle3D(); break ; default : throw new Error("Utils3D:unidentified class type in (.lh) file."); } } Utils3D._initStartLife=function(gradientData){ var gradient=new GradientDataNumber(); var startLifetimesData=gradientData.startLifetimes; for (var i=0,n=startLifetimesData.length;i < n;i++){ var valueData=startLifetimesData[i]; gradient.add(valueData.key,valueData.value); } return gradient } Utils3D._initParticleVelocity=function(gradientData){ var gradient=new GradientDataNumber(); var velocitysData=gradientData.velocitys; for (var i=0,n=velocitysData.length;i < n;i++){ var valueData=velocitysData[i]; gradient.add(valueData.key,valueData.value); } return gradient; } Utils3D._initParticleColor=function(gradientColorData){ var gradientColor=new GradientDataColor(); var alphasData=gradientColorData.alphas; var i=0,n=0; for (i=0,n=alphasData.length;i < n;i++){ var alphaData=alphasData[i]; gradientColor.addAlpha(alphaData.key,alphaData.value); }; var rgbsData=gradientColorData.rgbs; for (i=0,n=rgbsData.length;i < n;i++){ var rgbData=rgbsData[i]; var rgbValue=rgbData.value; gradientColor.addRGB(rgbData.key,new Vector3(rgbValue[0],rgbValue[1],rgbValue[2])); } return gradientColor; } Utils3D._initParticleSize=function(gradientSizeData){ var gradientSize=new GradientDataNumber(); var sizesData=gradientSizeData.sizes; for (var i=0,n=sizesData.length;i < n;i++){ var valueData=sizesData[i]; gradientSize.add(valueData.key,valueData.value); } return gradientSize; } Utils3D._initParticleRotation=function(gradientData){ var gradient=new GradientDataNumber(); var angularVelocitysData=gradientData.angularVelocitys; for (var i=0,n=angularVelocitysData.length;i < n;i++){ var valueData=angularVelocitysData[i]; gradient.add(valueData.key,valueData.value / 180.0 *Math.PI); } return gradient; } Utils3D._initParticleFrame=function(overTimeFramesData){ var overTimeFrame=new GradientDataInt(); var framesData=overTimeFramesData.frames; for (var i=0,n=framesData.length;i < n;i++){ var frameData=framesData[i]; overTimeFrame.add(frameData.key,frameData.value); } return overTimeFrame; } Utils3D._parseMaterial=function(textureMap,material,json){ var customProps=json.customProps; var ambientColorValue=customProps.ambientColor; material.ambientColor=new Vector3(ambientColorValue[0],ambientColorValue[1],ambientColorValue[2]); var diffuseColorValue=customProps.diffuseColor; material.diffuseColor=new Vector3(diffuseColorValue[0],diffuseColorValue[1],diffuseColorValue[2]); var specularColorValue=customProps.specularColor; material.specularColor=new Vector4(specularColorValue[0],specularColorValue[1],specularColorValue[2],specularColorValue[3]); var reflectColorValue=customProps.reflectColor; material.reflectColor=new Vector3(reflectColorValue[0],reflectColorValue[1],reflectColorValue[2]); var diffuseTexture=customProps.diffuseTexture.texture2D; (diffuseTexture)&& (material.diffuseTexture=Loader.getRes(textureMap[diffuseTexture])); var normalTexture=customProps.normalTexture.texture2D; (normalTexture)&& (material.normalTexture=Loader.getRes(textureMap[normalTexture])); var specularTexture=customProps.specularTexture.texture2D; (specularTexture)&& (material.specularTexture=Loader.getRes(textureMap[specularTexture])); var emissiveTexture=customProps.emissiveTexture.texture2D; (emissiveTexture)&& (material.emissiveTexture=Loader.getRes(textureMap[emissiveTexture])); var ambientTexture=customProps.ambientTexture.texture2D; (ambientTexture)&& (material.ambientTexture=Loader.getRes(textureMap[ambientTexture])); var reflectTexture=customProps.reflectTexture.texture2D; (reflectTexture)&& (material.reflectTexture=Loader.getRes(textureMap[reflectTexture])); } Utils3D._computeBoneAndAnimationDatas=function(bones,curData,exData,outBonesDatas,outAnimationDatas){ var offset=0; var matOffset=0; var len=exData.length / 2; var i; var parentOffset; var boneLength=bones.length; for (i=0;i < boneLength;offset+=bones[i].keyframeWidth,matOffset+=16,i++){ laya.d3.utils.Utils3D._rotationTransformScaleSkinAnimation(curData[offset+7],curData[offset+8],curData[offset+9],curData[offset+3],curData[offset+4],curData[offset+5],curData[offset+6],curData[offset+0],curData[offset+1],curData[offset+2],outBonesDatas,matOffset); if (i !=0){ parentOffset=bones[i].parentIndex *16; laya.d3.utils.Utils3D.mulMatrixByArray(outBonesDatas,parentOffset,outBonesDatas,matOffset,outBonesDatas,matOffset); } } for (i=0;i < len;i+=16){ laya.d3.utils.Utils3D.mulMatrixByArrayFast(outBonesDatas,i,exData,len+i,outAnimationDatas,i); } } Utils3D._computeAnimationDatas=function(exData,bonesDatas,outAnimationDatas){ var len=exData.length / 2; for (var i=0;i < len;i+=16){ laya.d3.utils.Utils3D.mulMatrixByArrayFast(bonesDatas,i,exData,len+i,outAnimationDatas,i); } } Utils3D._computeBoneAndAnimationDatasByBindPoseMatrxix=function(bones,curData,inverGlobalBindPose,outBonesDatas,outAnimationDatas){ var offset=0; var matOffset=0; var i; var parentOffset; var boneLength=bones.length; for (i=0;i < boneLength;offset+=bones[i].keyframeWidth,matOffset+=16,i++){ laya.d3.utils.Utils3D._rotationTransformScaleSkinAnimation(curData[offset+7],curData[offset+8],curData[offset+9],curData[offset+3],curData[offset+4],curData[offset+5],curData[offset+6],curData[offset+0],curData[offset+1],curData[offset+2],outBonesDatas,matOffset); if (i !=0){ parentOffset=bones[i].parentIndex *16; laya.d3.utils.Utils3D.mulMatrixByArray(outBonesDatas,parentOffset,outBonesDatas,matOffset,outBonesDatas,matOffset); } }; var n=inverGlobalBindPose.length; for (i=0;i < n;i++){ var arrayOffset=i *16; laya.d3.utils.Utils3D.mulMatrixByArrayAndMatrixFast(outBonesDatas,arrayOffset,inverGlobalBindPose[i],outAnimationDatas,arrayOffset); } } Utils3D._computeAnimationDatasByArrayAndMatrixFast=function(inverGlobalBindPose,bonesDatas,outAnimationDatas){ var n=inverGlobalBindPose.length; for (var i=0;i < n;i++){ var arrayOffset=i *16; laya.d3.utils.Utils3D.mulMatrixByArrayAndMatrixFast(bonesDatas,arrayOffset,inverGlobalBindPose[i],outAnimationDatas,arrayOffset); } } Utils3D._computeRootAnimationData=function(bones,curData,animationDatas){ for (var i=0,offset=0,matOffset=0,boneLength=bones.length;i < boneLength;offset+=bones[i].keyframeWidth,matOffset+=16,i++) laya.d3.utils.Utils3D.createAffineTransformationArray(curData[offset+0],curData[offset+1],curData[offset+2],curData[offset+3],curData[offset+4],curData[offset+5],curData[offset+6],curData[offset+7],curData[offset+8],curData[offset+9],animationDatas,matOffset); } Utils3D.generateTangent=function(vertexDatas,vertexStride,positionOffset,uvOffset,indices){ var tangentElementCount=3; var newVertexStride=vertexStride+tangentElementCount; var tangentVertexDatas=new Float32Array(newVertexStride *(vertexDatas.length / vertexStride)); for (var i=0;i < indices.length;i+=3){ var index1=indices[i+0]; var index2=indices[i+1]; var index3=indices[i+2]; var position1Offset=vertexStride *index1+positionOffset; var position1=Utils3D._tempVector3_0; position1.x=vertexDatas[position1Offset+0]; position1.y=vertexDatas[position1Offset+1]; position1.z=vertexDatas[position1Offset+2]; var position2Offset=vertexStride *index2+positionOffset; var position2=Utils3D._tempVector3_1; position2.x=vertexDatas[position2Offset+0]; position2.y=vertexDatas[position2Offset+1]; position2.z=vertexDatas[position2Offset+2]; var position3Offset=vertexStride *index3+positionOffset; var position3=Utils3D._tempVector3_2; position3.x=vertexDatas[position3Offset+0]; position3.y=vertexDatas[position3Offset+1]; position3.z=vertexDatas[position3Offset+2]; var uv1Offset=vertexStride *index1+uvOffset; var UV1X=vertexDatas[uv1Offset+0]; var UV1Y=vertexDatas[uv1Offset+1]; var uv2Offset=vertexStride *index2+uvOffset; var UV2X=vertexDatas[uv2Offset+0]; var UV2Y=vertexDatas[uv2Offset+1]; var uv3Offset=vertexStride *index3+uvOffset; var UV3X=vertexDatas[uv3Offset+0]; var UV3Y=vertexDatas[uv3Offset+1]; var lengthP2ToP1=Utils3D._tempVector3_3; Vector3.subtract(position2,position1,lengthP2ToP1); var lengthP3ToP1=Utils3D._tempVector3_4; Vector3.subtract(position3,position1,lengthP3ToP1); Vector3.scale(lengthP2ToP1,UV3Y-UV1Y,lengthP2ToP1); Vector3.scale(lengthP3ToP1,UV2Y-UV1Y,lengthP3ToP1); var tangent=Utils3D._tempVector3_5; Vector3.subtract(lengthP2ToP1,lengthP3ToP1,tangent); Vector3.scale(tangent,1.0 / ((UV2X-UV1X)*(UV3Y-UV1Y)-(UV2Y-UV1Y)*(UV3X-UV1X)),tangent); var j=0; for (j=0;j < vertexStride;j++) tangentVertexDatas[newVertexStride *index1+j]=vertexDatas[vertexStride *index1+j]; for (j=0;j < tangentElementCount;j++) tangentVertexDatas[newVertexStride *index1+vertexStride+j]=+tangent.elements[j]; for (j=0;j < vertexStride;j++) tangentVertexDatas[newVertexStride *index2+j]=vertexDatas[vertexStride *index2+j]; for (j=0;j < tangentElementCount;j++) tangentVertexDatas[newVertexStride *index2+vertexStride+j]=+tangent.elements[j]; for (j=0;j < vertexStride;j++) tangentVertexDatas[newVertexStride *index3+j]=vertexDatas[vertexStride *index3+j]; for (j=0;j < tangentElementCount;j++) tangentVertexDatas[newVertexStride *index3+vertexStride+j]=+tangent.elements[j]; } for (i=0;i < tangentVertexDatas.length;i+=newVertexStride){ var tangentStartIndex=newVertexStride *i+vertexStride; var t=Utils3D._tempVector3_6; t.x=tangentVertexDatas[tangentStartIndex+0]; t.y=tangentVertexDatas[tangentStartIndex+1]; t.z=tangentVertexDatas[tangentStartIndex+2]; Vector3.normalize(t,t); tangentVertexDatas[tangentStartIndex+0]=t.x; tangentVertexDatas[tangentStartIndex+1]=t.y; tangentVertexDatas[tangentStartIndex+2]=t.z; } return tangentVertexDatas; } Utils3D.getVertexTangentDeclaration=function(vertexElements){ var position=false,normal=false,color=false,texcoord0=false,texcoord1=false,blendWeight=false,blendIndex=false; for (var i=0;i < vertexElements.length;i++){ switch ((vertexElements [i]).elementUsage){ case "POSITION": position=true; break ; case "NORMAL": normal=true; break ; case "COLOR": color=true; break ; case "UV": texcoord0=true; break ; case "UV1": texcoord1=true; break ; case "BLENDWEIGHT": blendWeight=true; break ; case "BLENDINDICES": blendIndex=true; break ; } }; var vertexDeclaration; if (position && normal && color && texcoord0 && texcoord1 && blendWeight && blendIndex) vertexDeclaration=VertexPositionNormalColorTexture0Texture1SkinTangent.vertexDeclaration; if (position && normal && color && texcoord0 && blendWeight && blendIndex) vertexDeclaration=VertexPositionNormalColorTextureSkinTangent.vertexDeclaration; else if (position && normal && texcoord0 && texcoord1 && blendWeight && blendIndex) vertexDeclaration=VertexPositionNormalTexture0Texture1SkinTangent.vertexDeclaration; else if (position && normal && texcoord0 && blendWeight && blendIndex) vertexDeclaration=VertexPositionNormalTextureSkinTangent.vertexDeclaration; else if (position && normal && color && blendWeight && blendIndex) vertexDeclaration=VertexPositionNormalColorSkinTangent.vertexDeclaration; else if (position && normal && color && texcoord0 && texcoord1) vertexDeclaration=VertexPositionNormalColorTexture0Texture1Tangent.vertexDeclaration; else if (position && normal && color && texcoord0) vertexDeclaration=VertexPositionNormalColorTextureTangent.vertexDeclaration; else if (position && normal && texcoord0 && texcoord1) vertexDeclaration=VertexPositionNormalTexture0Texture1Tangent.vertexDeclaration; else if (position && normal && texcoord0) vertexDeclaration=VertexPositionNormalTextureTangent.vertexDeclaration; else if (position && normal && color) vertexDeclaration=VertexPositionNormalColorTangent.vertexDeclaration; return vertexDeclaration; } Utils3D.transformVector3ArrayByQuat=function(sourceArray,sourceOffset,rotation,outArray,outOffset){ var re=rotation.elements; var x=sourceArray[sourceOffset],y=sourceArray[sourceOffset+1],z=sourceArray[sourceOffset+2],qx=re[0],qy=re[1],qz=re[2],qw=re[3], ix=qw *x+qy *z-qz *y,iy=qw *y+qz *x-qx *z,iz=qw *z+qx *y-qy *x,iw=-qx *x-qy *y-qz *z; outArray[outOffset]=ix *qw+iw *-qx+iy *-qz-iz *-qy; outArray[outOffset+1]=iy *qw+iw *-qy+iz *-qx-ix *-qz; outArray[outOffset+2]=iz *qw+iw *-qz+ix *-qy-iy *-qx; } Utils3D.mulMatrixByArray=function(leftArray,leftOffset,rightArray,rightOffset,outArray,outOffset){ var i,ai0,ai1,ai2,ai3; if (outArray===rightArray){ rightArray=Utils3D._tempArray16_3; for (i=0;i < 16;++i){ rightArray[i]=outArray[outOffset+i]; } rightOffset=0; } for (i=0;i < 4;i++){ ai0=leftArray[leftOffset+i]; ai1=leftArray[leftOffset+i+4]; ai2=leftArray[leftOffset+i+8]; ai3=leftArray[leftOffset+i+12]; outArray[outOffset+i]=ai0 *rightArray[rightOffset+0]+ai1 *rightArray[rightOffset+1]+ai2 *rightArray[rightOffset+2]+ai3 *rightArray[rightOffset+3]; outArray[outOffset+i+4]=ai0 *rightArray[rightOffset+4]+ai1 *rightArray[rightOffset+5]+ai2 *rightArray[rightOffset+6]+ai3 *rightArray[rightOffset+7]; outArray[outOffset+i+8]=ai0 *rightArray[rightOffset+8]+ai1 *rightArray[rightOffset+9]+ai2 *rightArray[rightOffset+10]+ai3 *rightArray[rightOffset+11]; outArray[outOffset+i+12]=ai0 *rightArray[rightOffset+12]+ai1 *rightArray[rightOffset+13]+ai2 *rightArray[rightOffset+14]+ai3 *rightArray[rightOffset+15]; } } Utils3D.mulMatrixByArrayFast=function(leftArray,leftOffset,rightArray,rightOffset,outArray,outOffset){ var i,ai0,ai1,ai2,ai3; for (i=0;i < 4;i++){ ai0=leftArray[leftOffset+i]; ai1=leftArray[leftOffset+i+4]; ai2=leftArray[leftOffset+i+8]; ai3=leftArray[leftOffset+i+12]; outArray[outOffset+i]=ai0 *rightArray[rightOffset+0]+ai1 *rightArray[rightOffset+1]+ai2 *rightArray[rightOffset+2]+ai3 *rightArray[rightOffset+3]; outArray[outOffset+i+4]=ai0 *rightArray[rightOffset+4]+ai1 *rightArray[rightOffset+5]+ai2 *rightArray[rightOffset+6]+ai3 *rightArray[rightOffset+7]; outArray[outOffset+i+8]=ai0 *rightArray[rightOffset+8]+ai1 *rightArray[rightOffset+9]+ai2 *rightArray[rightOffset+10]+ai3 *rightArray[rightOffset+11]; outArray[outOffset+i+12]=ai0 *rightArray[rightOffset+12]+ai1 *rightArray[rightOffset+13]+ai2 *rightArray[rightOffset+14]+ai3 *rightArray[rightOffset+15]; } } Utils3D.mulMatrixByArrayAndMatrixFast=function(leftArray,leftOffset,rightMatrix,outArray,outOffset){ var i,ai0,ai1,ai2,ai3; var rightMatrixE=rightMatrix.elements; var m11=rightMatrixE[0],m12=rightMatrixE[1],m13=rightMatrixE[2],m14=rightMatrixE[3]; var m21=rightMatrixE[4],m22=rightMatrixE[5],m23=rightMatrixE[6],m24=rightMatrixE[7]; var m31=rightMatrixE[8],m32=rightMatrixE[9],m33=rightMatrixE[10],m34=rightMatrixE[11]; var m41=rightMatrixE[12],m42=rightMatrixE[13],m43=rightMatrixE[14],m44=rightMatrixE[15]; var ai0LeftOffset=leftOffset; var ai1LeftOffset=leftOffset+4; var ai2LeftOffset=leftOffset+8; var ai3LeftOffset=leftOffset+12; var ai0OutOffset=outOffset; var ai1OutOffset=outOffset+4; var ai2OutOffset=outOffset+8; var ai3OutOffset=outOffset+12; for (i=0;i < 4;i++){ ai0=leftArray[ai0LeftOffset+i]; ai1=leftArray[ai1LeftOffset+i]; ai2=leftArray[ai2LeftOffset+i]; ai3=leftArray[ai3LeftOffset+i]; outArray[ai0OutOffset+i]=ai0 *m11+ai1 *m12+ai2 *m13+ai3 *m14; outArray[ai1OutOffset+i]=ai0 *m21+ai1 *m22+ai2 *m23+ai3 *m24; outArray[ai2OutOffset+i]=ai0 *m31+ai1 *m32+ai2 *m33+ai3 *m34; outArray[ai3OutOffset+i]=ai0 *m41+ai1 *m42+ai2 *m43+ai3 *m44; } } Utils3D.createAffineTransformationArray=function(tX,tY,tZ,rX,rY,rZ,rW,sX,sY,sZ,outArray,outOffset){ var x2=rX+rX,y2=rY+rY,z2=rZ+rZ; var xx=rX *x2,xy=rX *y2,xz=rX *z2,yy=rY *y2,yz=rY *z2,zz=rZ *z2; var wx=rW *x2,wy=rW *y2,wz=rW *z2; outArray[outOffset+0]=(1-(yy+zz))*sX; outArray[outOffset+1]=(xy+wz)*sX; outArray[outOffset+2]=(xz-wy)*sX; outArray[outOffset+3]=0; outArray[outOffset+4]=(xy-wz)*sY; outArray[outOffset+5]=(1-(xx+zz))*sY; outArray[outOffset+6]=(yz+wx)*sY; outArray[outOffset+7]=0; outArray[outOffset+8]=(xz+wy)*sZ; outArray[outOffset+9]=(yz-wx)*sZ; outArray[outOffset+10]=(1-(xx+yy))*sZ; outArray[outOffset+11]=0; outArray[outOffset+12]=tX; outArray[outOffset+13]=tY; outArray[outOffset+14]=tZ; outArray[outOffset+15]=1; } Utils3D.transformVector3ArrayToVector3ArrayCoordinate=function(source,sourceOffset,transform,result,resultOffset){ var vectorElem=Utils3D._tempArray4_0; var coordinateX=source[sourceOffset+0]; var coordinateY=source[sourceOffset+1]; var coordinateZ=source[sourceOffset+2]; var transformElem=transform.elements; vectorElem[0]=(coordinateX *transformElem[0])+(coordinateY *transformElem[4])+(coordinateZ *transformElem[8])+transformElem[12]; vectorElem[1]=(coordinateX *transformElem[1])+(coordinateY *transformElem[5])+(coordinateZ *transformElem[9])+transformElem[13]; vectorElem[2]=(coordinateX *transformElem[2])+(coordinateY *transformElem[6])+(coordinateZ *transformElem[10])+transformElem[14]; vectorElem[3]=1.0 / ((coordinateX *transformElem[3])+(coordinateY *transformElem[7])+(coordinateZ *transformElem[11])+transformElem[15]); result[resultOffset+0]=vectorElem[0] *vectorElem[3]; result[resultOffset+1]=vectorElem[1] *vectorElem[3]; result[resultOffset+2]=vectorElem[2] *vectorElem[3]; } Utils3D.convert3DCoordTo2DScreenCoord=function(source,out){ var se=source.elements; var oe=out.elements; oe[0]=-RenderState.clientWidth / 2+se[0]; oe[1]=RenderState.clientHeight / 2-se[1]; oe[2]=se[2]; } Utils3D.getURLVerion=function(url){ var index=url.indexOf("?"); return index >=0 ? url.substr(index):null; } Utils3D._tempVector3_0=new Vector3(); Utils3D._tempVector3_1=new Vector3(); Utils3D._tempVector3_2=new Vector3(); Utils3D._tempVector3_3=new Vector3(); Utils3D._tempVector3_4=new Vector3(); Utils3D._tempVector3_5=new Vector3(); Utils3D._tempVector3_6=new Vector3(); Utils3D._tempArray4_0=new Float32Array(4); Utils3D._tempArray16_0=new Float32Array(16); Utils3D._tempArray16_1=new Float32Array(16); Utils3D._tempArray16_2=new Float32Array(16); Utils3D._tempArray16_3=new Float32Array(16); __static(Utils3D, ['_typeToFunO',function(){return this._typeToFunO={"INT16":"writeInt16","SHORT":"writeInt16","UINT16":"writeUint16","UINT32":"writeUint32","FLOAT32":"writeFloat32","INT":"writeInt32","UINT":"writeUint32","BYTE":"writeByte","STRING":"writeUTFString"};} ]); return Utils3D; })() /** *Laya3D 类用于初始化3D设置。 */ //class Laya3D var Laya3D=(function(){ /** *创建一个 Laya3D 实例。 */ function Laya3D(){} __class(Laya3D,'Laya3D'); Laya3D._changeWebGLSize=function(width,height){ WebGL.onStageResize(width,height); RenderState.clientWidth=width; RenderState.clientHeight=height; } Laya3D._initShader=function(){ Shader.addInclude("LightHelper.glsl","\nstruct DirectionLight\n{\n vec3 Direction;\n vec3 Diffuse;\n vec3 Ambient;\n vec3 Specular;\n};\n\nstruct PointLight\n{\n vec3 Diffuse;\n vec3 Ambient;\n vec3 Specular;\n vec3 Attenuation;\n vec3 Position;\n float Range;\n};\n\nstruct SpotLight\n{\n vec3 Diffuse;\n vec3 Ambient;\n vec3 Specular;\n vec3 Attenuation;\n vec3 Position;\n vec3 Direction;\n float Spot;\n float Range;\n};\n\n\nvoid computeDirectionLight(in vec3 matDif,in vec3 matAmb,in vec4 matSpe,in DirectionLight dirLight,in vec3 normal,in vec3 toEye,out vec3 dif,out vec3 amb,out vec3 spec)\n{\n dif=vec3(0.0);//不初始化在IOS中闪烁,PC中不会闪烁\n amb=vec3(0.0);\n spec=vec3(0.0);\n vec3 lightVec=-normalize(dirLight.Direction);\n \n amb=matAmb*dirLight.Ambient;\n \n float diffuseFactor=dot(lightVec, normal);\n \n if(diffuseFactor>0.0)\n {\n vec3 v = reflect(-lightVec, normal);\n float specFactor = pow(max(dot(v, toEye), 0.0), matSpe.w);\n \n dif = diffuseFactor * matDif * dirLight.Diffuse;\n spec = specFactor * matSpe.rgb * dirLight.Specular;\n }\n \n}\n\nvoid computePointLight(in vec3 matDif,in vec3 matAmb,in vec4 matSpe,in PointLight poiLight, in vec3 pos,in vec3 normal,in vec3 toEye,out vec3 dif,out vec3 amb,out vec3 spec)\n{\n dif=vec3(0.0);\n amb=vec3(0.0);\n spec=vec3(0.0);\n vec3 lightVec = poiLight.Position - pos;\n \n float d = length(lightVec);\n \n if( d > poiLight.Range )\n return;\n \n lightVec /= d; \n \n amb = matAmb * poiLight.Ambient; \n\n float diffuseFactor = dot(lightVec, normal);\n\n if( diffuseFactor > 0.0 )\n {\n vec3 v= reflect(-lightVec, normal);\n float specFactor = pow(max(dot(v, toEye), 0.0), matSpe.w);\n \n dif = diffuseFactor * matDif * poiLight.Diffuse;\n spec = specFactor * matSpe.rgb * poiLight.Specular;\n }\n\n float attenuate = 1.0 / dot(poiLight.Attenuation, vec3(1.0, d, d*d));\n\n dif *= attenuate;\n spec*= attenuate;\n}\n\nvoid ComputeSpotLight(in vec3 matDif,in vec3 matAmb,in vec4 matSpe,in SpotLight spoLight,in vec3 pos, in vec3 normal,in vec3 toEye,out vec3 dif,out vec3 amb,out vec3 spec)\n{\n amb = vec3(0.0);\n dif =vec3(0.0);\n spec= vec3(0.0);\n vec3 lightVec = spoLight.Position - pos;\n \n float d = length(lightVec);\n \n if( d > spoLight.Range)\n return;\n \n lightVec /= d; \n \n amb = matAmb * spoLight.Ambient; \n\n float diffuseFactor = dot(lightVec, normal);\n\n if(diffuseFactor > 0.0)\n {\n vec3 v= reflect(-lightVec, normal);\n float specFactor = pow(max(dot(v, toEye), 0.0), matSpe.w);\n \n dif = diffuseFactor * matDif * spoLight.Diffuse;\n spec = specFactor * matSpe.rgb * spoLight.Specular;\n }\n \n float spot = pow(max(dot(-lightVec, normalize(spoLight.Direction)), 0.0), spoLight.Spot);\n\n float attenuate = spot/dot(spoLight.Attenuation, vec3(1.0, d, d*d));\n\n amb *= spot;\n dif *= attenuate;\n spec*= attenuate;\n}\n\nvec3 NormalSampleToWorldSpace(vec3 normalMapSample, vec3 unitNormal, vec3 tangent)\n{\n vec3 normalT = 2.0*normalMapSample - 1.0;\n\n // Build orthonormal basis.\n vec3 N = normalize(unitNormal);\n vec3 T = normalize(tangent- dot(tangent, N)*N);\n vec3 B = cross(T, N);\n\n mat3 TBN = mat3(T, B, N);\n\n // Transform from tangent space to world space.\n vec3 bumpedNormal = TBN*normalT;\n\n return bumpedNormal;\n}\n"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/LightHelper.glsl*/); Shader.addInclude("VRHelper.glsl","\nvec4 DistortFishEye(vec4 p)\n{\n vec2 v = p.xy / p.w;\n float radius = length(v);// Convert to polar coords\n if (radius > 0.0)\n {\n float theta = atan(v.y,v.x);\n \n radius = pow(radius, 0.93);// Distort:\n\n v.x = radius * cos(theta);// Convert back to Cartesian\n v.y = radius * sin(theta);\n p.xy = v.xy * p.w;\n }\n return p;\n}"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/VRHelper.glsl*/); var vs,ps; var shaderNameMap={ 'a_Position':/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION", 'a_Color':/*laya.d3.graphics.VertexElementUsage.COLOR0*/"COLOR", 'a_Normal':/*laya.d3.graphics.VertexElementUsage.NORMAL0*/"NORMAL", 'a_Texcoord0':/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV", 'a_Texcoord1':/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE1*/"UV1", 'a_TexcoordNext0':/*laya.d3.graphics.VertexElementUsage.NEXTTEXTURECOORDINATE0*/"NEXTUV", 'a_BoneWeights':/*laya.d3.graphics.VertexElementUsage.BLENDWEIGHT0*/"BLENDWEIGHT", 'a_BoneIndices':/*laya.d3.graphics.VertexElementUsage.BLENDINDICES0*/"BLENDINDICES", 'a_Tangent0':/*laya.d3.graphics.VertexElementUsage.TANGENT0*/"TANGENT0", 'u_CameraPos':/*laya.d3.core.scene.BaseScene.CAMERAPOS*/"CAMERAPOS", 'u_FogStart':/*laya.d3.core.scene.BaseScene.FOGSTART*/"FOGSTART", 'u_FogRange':/*laya.d3.core.scene.BaseScene.FOGRANGE*/"FOGRANGE", 'u_FogColor':/*laya.d3.core.scene.BaseScene.FOGCOLOR*/"FOGCOLOR", 'u_DirectionLight.Direction':/*laya.d3.core.scene.BaseScene.LIGHTDIRECTION*/"LIGHTDIRECTION", 'u_DirectionLight.Diffuse':/*laya.d3.core.scene.BaseScene.LIGHTDIRDIFFUSE*/"LIGHTDIRDIFFUSE", 'u_DirectionLight.Ambient':/*laya.d3.core.scene.BaseScene.LIGHTDIRAMBIENT*/"LIGHTDIRAMBIENT", 'u_DirectionLight.Specular':/*laya.d3.core.scene.BaseScene.LIGHTDIRSPECULAR*/"LIGHTDIRSPECULAR", 'u_PointLight.Position':/*laya.d3.core.scene.BaseScene.POINTLIGHTPOS*/"POINTLIGHTPOS", 'u_PointLight.Range':/*laya.d3.core.scene.BaseScene.POINTLIGHTRANGE*/"POINTLIGHTRANGE", 'u_PointLight.Attenuation':/*laya.d3.core.scene.BaseScene.POINTLIGHTATTENUATION*/"POINTLIGHTATTENUATION", 'u_PointLight.Diffuse':/*laya.d3.core.scene.BaseScene.POINTLIGHTDIFFUSE*/"POINTLIGHTDIFFUSE", 'u_PointLight.Ambient':/*laya.d3.core.scene.BaseScene.POINTLIGHTAMBIENT*/"POINTLIGHTAMBIENT", 'u_PointLight.Specular':/*laya.d3.core.scene.BaseScene.POINTLIGHTSPECULAR*/"POINTLIGHTSPECULAR", 'u_SpotLight.Position':/*laya.d3.core.scene.BaseScene.SPOTLIGHTPOS*/"SPOTLIGHTPOS", 'u_SpotLight.Direction':/*laya.d3.core.scene.BaseScene.SPOTLIGHTDIRECTION*/"SPOTLIGHTDIRECTION", 'u_SpotLight.Range':/*laya.d3.core.scene.BaseScene.SPOTLIGHTRANGE*/"SPOTLIGHTRANGE", 'u_SpotLight.Spot':/*laya.d3.core.scene.BaseScene.SPOTLIGHTSPOT*/"SPOTLIGHTSPOT", 'u_SpotLight.Attenuation':/*laya.d3.core.scene.BaseScene.SPOTLIGHTATTENUATION*/"SPOTLIGHTATTENUATION", 'u_SpotLight.Diffuse':/*laya.d3.core.scene.BaseScene.SPOTLIGHTDIFFUSE*/"SPOTLIGHTDIFFUSE", 'u_SpotLight.Ambient':/*laya.d3.core.scene.BaseScene.SPOTLIGHTAMBIENT*/"SPOTLIGHTAMBIENT", 'u_SpotLight.Specular':/*laya.d3.core.scene.BaseScene.SPOTLIGHTSPECULAR*/"SPOTLIGHTSPECULAR", 'u_WorldMat':/*laya.d3.core.material.StandardMaterial.WORLDMATRIX*/"MATRIX1", 'u_DiffuseTexture':/*laya.d3.core.material.StandardMaterial.DIFFUSETEXTURE*/"DIFFUSETEXTURE", 'u_SpecularTexture':/*laya.d3.core.material.StandardMaterial.SPECULARTEXTURE*/"SPECULARTEXTURE", 'u_NormalTexture':/*laya.d3.core.material.StandardMaterial.NORMALTEXTURE*/"NORMALTEXTURE", 'u_AmbientTexture':/*laya.d3.core.material.StandardMaterial.AMBIENTTEXTURE*/"AMBIENTTEXTURE", 'u_ReflectTexture':/*laya.d3.core.material.StandardMaterial.REFLECTTEXTURE*/"REFLECTTEXTURE", 'u_MvpMatrix':/*laya.d3.core.material.StandardMaterial.MVPMATRIX*/"MVPMATRIX", 'u_Bones':/*laya.d3.core.material.StandardMaterial.Bones*/"MATRIXARRAY0", 'u_Albedo':/*laya.d3.core.material.StandardMaterial.ALBEDO*/"ALBEDO", 'u_AlphaTestValue':/*laya.d3.core.material.StandardMaterial.ALPHATESTVALUE*/"ALPHATESTVALUE", 'u_UVMatrix':/*laya.d3.core.material.StandardMaterial.UVMATRIX*/"MATRIX2", 'u_UVAge':/*laya.d3.core.material.StandardMaterial.UVAGE*/"FLOAT0", 'u_UVAniAge':/*laya.d3.core.material.StandardMaterial.UVANIAGE*/"UVAGEX", 'u_MaterialDiffuse':/*laya.d3.core.material.StandardMaterial.MATERIALDIFFUSE*/"MATERIALDIFFUSE", 'u_MaterialAmbient':/*laya.d3.core.material.StandardMaterial.MATERIALAMBIENT*/"MATERIALAMBIENT", 'u_MaterialSpecular':/*laya.d3.core.material.StandardMaterial.MATERIALSPECULAR*/"MATERIALSPECULAR", 'u_MaterialReflect':/*laya.d3.core.material.StandardMaterial.MATERIALREFLECT*/"MATERIALREFLECT"}; var SIMPLE=Shader.nameKey.add("SIMPLE"); vs="#include?VR \"VRHelper.glsl\";\nattribute vec4 a_Position;\nuniform mat4 u_MvpMatrix;\n\n\n\n#ifdef DIFFUSEMAP||((DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT)&&(COLOR&&SPECULARMAP||NORMALMAP))\nattribute vec2 a_Texcoord0;\nvarying vec2 v_Texcoord0;\n #ifdef MIXUV\n attribute vec2 a_TexcoordNext0;\n uniform float u_UVAge;\n #endif\n #ifdef UVTRANSFORM \n uniform mat4 u_UVMatrix;\n #endif\n#endif\n\n#ifdef AMBIENTMAP\nattribute vec2 a_Texcoord1;\nvarying vec2 v_Texcoord1;\n#endif\n\n#ifdef COLOR\nattribute vec4 a_Color;\nvarying vec4 v_Color;\n#endif\n\n#ifdef BONE\nattribute vec4 a_BoneIndices;\nattribute vec4 a_BoneWeights;\nconst int c_MaxBoneCount = 24;\nuniform mat4 u_Bones[c_MaxBoneCount];\n#endif\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||REFLECTMAP\nattribute vec3 a_Normal;\nvarying vec3 v_Normal;\n#endif\n\n#ifdef (DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||REFLECTMAP)&&NORMALMAP\nattribute vec3 a_Tangent0;\nvarying vec3 v_Tangent0;\n#endif\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||FOG||REFLECTMAP\nuniform mat4 u_WorldMat;\nvarying vec3 v_PositionWorld;\n#endif\n\n\nvoid main()\n{\n #ifdef BONE\n mat4 skinTransform=mat4(0.0);\n skinTransform += u_Bones[int(a_BoneIndices.x)] * a_BoneWeights.x;\n skinTransform += u_Bones[int(a_BoneIndices.y)] * a_BoneWeights.y;\n skinTransform += u_Bones[int(a_BoneIndices.z)] * a_BoneWeights.z;\n skinTransform += u_Bones[int(a_BoneIndices.w)] * a_BoneWeights.w;\n vec4 position=skinTransform*a_Position;\n #ifdef VR\n gl_Position = DistortFishEye(u_MvpMatrix * position);\n #else\n gl_Position = u_MvpMatrix * position;\n #endif\n #else\n #ifdef VR\n gl_Position = DistortFishEye(u_MvpMatrix * a_Position);\n #else\n gl_Position = u_MvpMatrix * a_Position;\n #endif\n #endif\n \n\n #ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||REFLECTMAP\n mat3 worldMat;\n #ifdef BONE\n worldMat=mat3(u_WorldMat*skinTransform);\n #else\n worldMat=mat3(u_WorldMat);\n #endif \n v_Normal=worldMat*a_Normal;\n #ifdef (DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT)&&NORMALMAP\n v_Tangent0=worldMat*a_Tangent0;\n #endif\n #endif\n \n #ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||FOG\n #ifdef BONE\n v_PositionWorld=(u_WorldMat*position).xyz;\n #else\n v_PositionWorld=(u_WorldMat*a_Position).xyz;\n #endif\n #endif\n \n#ifdef DIFFUSEMAP||((DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT)&&(COLOR&&SPECULARMAP||NORMALMAP))\n #ifdef MIXUV\n v_Texcoord0=mix(a_Texcoord0,a_TexcoordNext0,u_UVAge);\n #else\n v_Texcoord0=a_Texcoord0;\n #endif\n #ifdef UVTRANSFORM\n v_Texcoord0=(u_UVMatrix*vec4(v_Texcoord0,0.0,1.0)).xy;\n #endif\n#endif\n\n#ifdef AMBIENTMAP\nv_Texcoord1=a_Texcoord1;\n#endif\n\n \n#ifdef COLOR\nv_Color=a_Color;\n#endif\n}"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/PixelSimpleTextureSkinnedMesh.vs*/; ps="#ifdef FSHIGHPRECISION\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\n#include?DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT \"LightHelper.glsl\";\n\nuniform vec4 u_Albedo;\n\n#ifdef ALPHATEST\nuniform float u_AlphaTestValue;\n#endif\n\n#ifdef DIFFUSEMAP\nuniform sampler2D u_DiffuseTexture;\n#endif\n\n#ifdef REFLECTMAP\nuniform samplerCube u_ReflectTexture;\nuniform vec3 u_MaterialReflect;\n#endif\n\n#ifdef DIFFUSEMAP||((DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT)&&(COLOR&&SPECULARMAP||NORMALMAP))\nvarying vec2 v_Texcoord0;\n#endif\n\n#ifdef AMBIENTMAP\nvarying vec2 v_Texcoord1;\nuniform sampler2D u_AmbientTexture;\n#endif\n\n#ifdef COLOR\nvarying vec4 v_Color;\n#endif\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT\nuniform vec3 u_MaterialDiffuse;\nuniform vec4 u_MaterialSpecular;\n #ifdef (DIFFUSEMAP||COLOR)&&SPECULARMAP \n uniform sampler2D u_SpecularTexture;\n #endif\n#endif\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||AMBIENTMAP\nuniform vec3 u_MaterialAmbient;\n#endif\n\n#ifdef FOG\nuniform float u_FogStart;\nuniform float u_FogRange;\nuniform vec3 u_FogColor;\n#endif\n\n#ifdef MIXUV\nuniform float u_UVAniAge;\n#endif\n\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||REFLECTMAP\nvarying vec3 v_Normal;\n#endif\n\n#ifdef (DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT)&&NORMALMAP\nuniform sampler2D u_NormalTexture;\nvarying vec3 v_Tangent0;\n#endif\n\n#ifdef DIRECTIONLIGHT\nuniform DirectionLight u_DirectionLight;\n#endif\n\n#ifdef POINTLIGHT\nuniform PointLight u_PointLight;\n#endif\n\n#ifdef SPOTLIGHT\nuniform SpotLight u_SpotLight;\n#endif\n\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||FOG||REFLECTMAP\nuniform vec3 u_CameraPos;\nvarying vec3 v_PositionWorld;\n#endif\n\n\nvoid main()\n{\n #ifdef DIFFUSEMAP&&!COLOR\n gl_FragColor=texture2D(u_DiffuseTexture, v_Texcoord0);\n #endif \n \n #ifdef COLOR&&!DIFFUSEMAP\n gl_FragColor=v_Color;\n #endif \n \n #ifdef DIFFUSEMAP&&COLOR\n vec4 texColor=texture2D(u_DiffuseTexture, v_Texcoord0);\n gl_FragColor=texColor*v_Color;\n #endif\n \n #ifdef !DIFFUSEMAP&&!COLOR\n gl_FragColor=vec4(1.0,1.0,1.0,1.0);\n #endif \n \n #ifdef AMBIENTMAP\n gl_FragColor.rgb=gl_FragColor.rgb*(u_MaterialAmbient+texture2D(u_AmbientTexture, v_Texcoord1).rgb);\n #endif \n \n gl_FragColor=gl_FragColor*u_Albedo;\n \n #ifdef ALPHATEST\n if(gl_FragColor.a-u_AlphaTestValue<0.0)\n discard;\n #endif\n \n \n #ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||REFLECTMAP\n vec3 normal;\n #ifdef (DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT)&&NORMALMAP\n vec3 normalMapSample = texture2D(u_NormalTexture, v_Texcoord0).rgb;\n normal = normalize(NormalSampleToWorldSpace(normalMapSample, v_Normal, v_Tangent0));\n #else\n normal = normalize(v_Normal);\n #endif\n #endif\n \n #ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT\n vec3 diffuse = vec3(0.0);\n vec3 ambient = vec3(0.0);\n vec3 specular= vec3(0.0);\n vec3 dif, amb, spe;\n #endif\n \n #ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||FOG||REFLECTMAP\n vec3 toEye;\n #ifdef FOG\n toEye=u_CameraPos-v_PositionWorld;\n float toEyeLength=length(toEye);\n toEye/=toEyeLength;\n #else\n toEye=normalize(u_CameraPos-v_PositionWorld);\n #endif\n #endif\n \n #ifdef DIRECTIONLIGHT\n computeDirectionLight(u_MaterialDiffuse,u_MaterialAmbient,u_MaterialSpecular,u_DirectionLight,normal,toEye, dif, amb, spe);\n diffuse+=dif;\n ambient+=amb;\n specular+=spe;\n #endif\n \n #ifdef POINTLIGHT\n computePointLight(u_MaterialDiffuse,u_MaterialAmbient,u_MaterialSpecular,u_PointLight,v_PositionWorld,normal,toEye, dif, amb, spe);\n diffuse+=dif;\n ambient+=amb;\n specular+=spe;\n #endif\n\n #ifdef SPOTLIGHT\n ComputeSpotLight(u_MaterialDiffuse,u_MaterialAmbient,u_MaterialSpecular,u_SpotLight,v_PositionWorld,normal,toEye, dif, amb, spe);\n diffuse+=dif;\n ambient+=amb;\n specular+=spe;\n #endif\n \n\n \n \n \n #ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT\n #ifdef (DIFFUSEMAP||COLOR)&&SPECULARMAP\n specular =specular*texture2D(u_SpecularTexture, v_Texcoord0).rgb;\n #endif\n gl_FragColor =vec4( gl_FragColor.rgb*(ambient + diffuse) + specular,gl_FragColor.a);\n #endif\n \n #ifdef REFLECTMAP\n vec3 incident = -toEye;\n vec3 reflectionVector = reflect(incident,normal);\n vec3 reflectionColor = textureCube(u_ReflectTexture,reflectionVector).rgb;\n gl_FragColor.rgb += u_MaterialReflect*reflectionColor;\n #endif\n \n #ifdef FOG\n float lerpFact=clamp((toEyeLength-u_FogStart)/u_FogRange,0.0,1.0);\n gl_FragColor.rgb=mix(gl_FragColor.rgb,u_FogColor,lerpFact);\n #endif\n}\n\n"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/PixelSimpleTextureSkinnedMesh.ps*/; Shader.preCompile(SIMPLE,vs,ps,shaderNameMap); var SIMPLEVEXTEX=Shader.nameKey.add("SIMPLEVEXTEX"); vs="#include?DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT \"LightHelper.glsl\";\n\nattribute vec4 a_Position;\nuniform mat4 u_MvpMatrix;\n\n#include?VR \"VRHelper.glsl\";\n\n\n\n#ifdef DIFFUSEMAP||((DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT)&&COLOR&&SPECULARMAP)\nattribute vec2 a_Texcoord0;\nvarying vec2 v_Texcoord0;\n #ifdef MIXUV\n attribute vec2 a_TexcoordNext0;\n uniform float u_UVAge;\n #endif\n #ifdef UVTRANSFORM\n uniform mat4 u_UVMatrix;\n #endif\n#endif\n\n#ifdef AMBIENTMAP\nattribute vec2 a_Texcoord1;\nvarying vec2 v_Texcoord1;\n#endif\n\n\n#ifdef COLOR\nattribute vec4 a_Color;\nvarying vec4 v_Color;\n#endif\n\n#ifdef BONE\nattribute vec4 a_BoneIndices;\nattribute vec4 a_BoneWeights;\nconst int c_MaxBoneCount = 24;\nuniform mat4 u_Bones[c_MaxBoneCount];\n#endif\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||REFLECTMAP\nattribute vec3 a_Normal;\n#endif\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||FOG||REFLECTMAP\nuniform mat4 u_WorldMat;\nuniform vec3 u_CameraPos;\n#endif\n\n#ifdef DIRECTIONLIGHT\nuniform DirectionLight u_DirectionLight;\n#endif\n\n#ifdef POINTLIGHT\nuniform PointLight u_PointLight;\n#endif\n\n#ifdef SPOTLIGHT\nuniform SpotLight u_SpotLight;\n#endif\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT\nuniform vec3 u_MaterialDiffuse;\nuniform vec4 u_MaterialSpecular;\n\nvarying vec3 v_Diffuse;\nvarying vec3 v_Ambient;\nvarying vec3 v_Specular;\n#endif\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||AMBIENTMAP\nuniform vec3 u_MaterialAmbient;\n#endif\n\n#ifdef FOG\nvarying float v_ToEyeLength;\n#endif\n\n#ifdef REFLECTMAP\nvarying vec3 v_ToEye;\nvarying vec3 v_Normal;\n#endif\n\n\nvoid main()\n{\n #ifdef BONE\n mat4 skinTransform=mat4(0.0);\n skinTransform += u_Bones[int(a_BoneIndices.x)] * a_BoneWeights.x;\n skinTransform += u_Bones[int(a_BoneIndices.y)] * a_BoneWeights.y;\n skinTransform += u_Bones[int(a_BoneIndices.z)] * a_BoneWeights.z;\n skinTransform += u_Bones[int(a_BoneIndices.w)] * a_BoneWeights.w;\n vec4 position=skinTransform*a_Position;\n #ifdef VR\n gl_Position = DistortFishEye(u_MvpMatrix * position);\n #else\n gl_Position = u_MvpMatrix * position;\n #endif\n #else\n #ifdef VR\n gl_Position = DistortFishEye(u_MvpMatrix * a_Position);\n #else\n gl_Position = u_MvpMatrix * a_Position;\n #endif\n #endif\n \n \n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||REFLECTMAP\n #ifdef BONE\n vec3 normal=normalize( mat3(u_WorldMat*skinTransform)*a_Normal);\n #else\n vec3 normal=normalize( mat3(u_WorldMat)*a_Normal);\n #endif\n \n #ifdef REFLECTMAP\n v_Normal=normal;\n #endif\n#endif\n \n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT\n v_Diffuse=vec3(0.0);\n v_Ambient=vec3(0.0);\n v_Specular=vec3(0.0);\n vec3 dif, amb, spe;\n#endif\n\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||FOG||REFLECTMAP\n #ifdef BONE\n vec3 positionWorld=(u_WorldMat*position).xyz;\n #else\n vec3 positionWorld=(u_WorldMat*a_Position).xyz;\n #endif\n#endif\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||FOG||REFLECTMAP\nvec3 toEye;\n #ifdef FOG\n toEye=u_CameraPos-positionWorld;\n v_ToEyeLength=length(toEye);\n toEye/=v_ToEyeLength;\n #else\n toEye=normalize(u_CameraPos-positionWorld);\n #endif\n \n #ifdef REFLECTMAP\n v_ToEye=toEye;\n #endif\n#endif\n \n#ifdef DIRECTIONLIGHT\ncomputeDirectionLight(u_MaterialDiffuse,u_MaterialAmbient,u_MaterialSpecular,u_DirectionLight,normal,toEye, dif, amb, spe);\nv_Diffuse+=dif;\nv_Ambient+=amb;\nv_Specular+=spe;\n#endif\n \n#ifdef POINTLIGHT\ncomputePointLight(u_MaterialDiffuse,u_MaterialAmbient,u_MaterialSpecular,u_PointLight,positionWorld,normal,toEye, dif, amb, spe);\nv_Diffuse+=dif;\nv_Ambient+=amb;\nv_Specular+=spe;\n#endif\n\n#ifdef SPOTLIGHT\nComputeSpotLight(u_MaterialDiffuse,u_MaterialAmbient,u_MaterialSpecular,u_SpotLight,positionWorld,normal,toEye, dif, amb, spe);\nv_Diffuse+=dif;\nv_Ambient+=amb;\nv_Specular+=spe;\n#endif\n \n#ifdef DIFFUSEMAP||((DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT)&&COLOR&&SPECULARMAP)\n #ifdef MIXUV\n v_Texcoord0=mix(a_Texcoord0,a_TexcoordNext0,u_UVAge);\n #else\n v_Texcoord0=a_Texcoord0;\n #endif\n #ifdef UVTRANSFORM\n v_Texcoord0=(u_UVMatrix*vec4(v_Texcoord0,0.0,1.0)).xy;\n #endif\n#endif\n\n#ifdef AMBIENTMAP\nv_Texcoord1=a_Texcoord1;\n#endif\n \n#ifdef COLOR\nv_Color=a_Color;\n#endif\n}"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/VertexSimpleTextureSkinnedMesh.vs*/; ps="#ifdef FSHIGHPRECISION\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform vec4 u_Albedo;\n\n#ifdef ALPHATEST\nuniform float u_AlphaTestValue;\n#endif\n\n#ifdef DIFFUSEMAP\nuniform sampler2D u_DiffuseTexture;\n#endif\n\n#ifdef REFLECTMAP\nuniform samplerCube u_ReflectTexture;\nuniform vec3 u_MaterialReflect;\n#endif\n\n\n#ifdef DIFFUSEMAP||((DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT)&&COLOR&&SPECULARMAP)\nvarying vec2 v_Texcoord0;\n#endif\n\n#ifdef AMBIENTMAP\nvarying vec2 v_Texcoord1;\nuniform sampler2D u_AmbientTexture;\n#endif\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT||AMBIENTMAP\nuniform vec3 u_MaterialAmbient;\n#endif\n\n#ifdef COLOR\nvarying vec4 v_Color;\n#endif\n\n#ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT\nvarying vec3 v_Diffuse;\nvarying vec3 v_Ambient;\nvarying vec3 v_Specular;\n #ifdef (DIFFUSEMAP||COLOR)&&SPECULARMAP\n uniform sampler2D u_SpecularTexture;\n #endif\n#endif\n\n#ifdef FOG\nuniform float u_FogStart;\nuniform float u_FogRange;\nuniform vec3 u_FogColor;\nvarying float v_ToEyeLength;\n#endif\n\n#ifdef MIXUV\nuniform float u_UVAniAge;\n#endif\n\n#ifdef REFLECTMAP\nvarying vec3 v_Normal;\nvarying vec3 v_ToEye;\n#endif\n\n\nvoid main()\n{\n #ifdef DIFFUSEMAP&&!COLOR\n gl_FragColor=texture2D(u_DiffuseTexture, v_Texcoord0);\n #endif \n \n #ifdef COLOR&&!DIFFUSEMAP\n gl_FragColor=v_Color;\n #endif \n \n #ifdef DIFFUSEMAP&&COLOR\n vec4 texColor=texture2D(u_DiffuseTexture, v_Texcoord0);\n gl_FragColor=texColor*v_Color;\n #endif\n \n #ifdef !DIFFUSEMAP&&!COLOR\n gl_FragColor=vec4(1.0,1.0,1.0,1.0);\n #endif \n \n #ifdef AMBIENTMAP\n gl_FragColor.rgb=gl_FragColor.rgb*(u_MaterialAmbient+texture2D(u_AmbientTexture, v_Texcoord1).rgb);\n #endif \n \n gl_FragColor=gl_FragColor*u_Albedo;\n \n #ifdef ALPHATEST\n if(gl_FragColor.a-u_AlphaTestValue<0.0)\n discard;\n #endif\n \n \n #ifdef REFLECTMAP\n vec3 normal=normalize(v_Normal);\n #endif \n\n \n #ifdef DIRECTIONLIGHT||POINTLIGHT||SPOTLIGHT\n #ifdef (DIFFUSEMAP||COLOR)&&SPECULARMAP\n vec3 specular =v_Specular*texture2D(u_SpecularTexture,v_Texcoord0).rgb;\n gl_FragColor =vec4( gl_FragColor.rgb*(v_Ambient + v_Diffuse)+specular,gl_FragColor.a);\n #else\n gl_FragColor =vec4( gl_FragColor.rgb*(v_Ambient + v_Diffuse)+v_Specular,gl_FragColor.a);\n #endif\n #endif\n \n #ifdef REFLECTMAP\n vec3 incident = -v_ToEye;\n vec3 reflectionVector = reflect(incident,v_Normal);\n vec3 reflectionColor = textureCube(u_ReflectTexture,reflectionVector).rgb;\n gl_FragColor.rgb += u_MaterialReflect*reflectionColor;\n #endif\n \n #ifdef FOG\n float lerpFact=clamp((v_ToEyeLength-u_FogStart)/u_FogRange,0.0,1.0);\n gl_FragColor.rgb=mix(gl_FragColor.rgb,u_FogColor,lerpFact);\n #endif\n}\n\n"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/VertexSimpleTextureSkinnedMesh.ps*/; Shader.preCompile(SIMPLEVEXTEX,vs,ps,shaderNameMap); shaderNameMap={ 'a_Position':/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION", 'a_Texcoord':/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV", 'u_FogStart':/*laya.d3.core.scene.BaseScene.FOGSTART*/"FOGSTART", 'u_FogRange':/*laya.d3.core.scene.BaseScene.FOGRANGE*/"FOGRANGE", 'u_FogColor':/*laya.d3.core.scene.BaseScene.FOGCOLOR*/"FOGCOLOR", 'u_CameraPos':/*laya.d3.core.scene.BaseScene.CAMERAPOS*/"CAMERAPOS", 'u_WorldMat':/*laya.d3.core.material.StandardMaterial.WORLDMATRIX*/"MATRIX1", 'u_BlendTexture':/*laya.d3.core.material.StandardMaterial.DIFFUSETEXTURE*/"DIFFUSETEXTURE", 'u_LayerTexture0':/*laya.d3.core.material.StandardMaterial.NORMALTEXTURE*/"NORMALTEXTURE", 'u_LayerTexture1':/*laya.d3.core.material.StandardMaterial.SPECULARTEXTURE*/"SPECULARTEXTURE", 'u_LayerTexture2':/*laya.d3.core.material.StandardMaterial.EMISSIVETEXTURE*/"EMISSIVETEXTURE", 'u_LayerTexture3':/*laya.d3.core.material.StandardMaterial.AMBIENTTEXTURE*/"AMBIENTTEXTURE", 'u_MvpMatrix':/*laya.d3.core.material.StandardMaterial.MVPMATRIX*/"MVPMATRIX", 'u_Albedo':/*laya.d3.core.material.StandardMaterial.ALBEDO*/"ALBEDO", 'u_Ambient':/*laya.d3.core.material.StandardMaterial.MATERIALAMBIENT*/"MATERIALAMBIENT", 'u_UVMatrix':/*laya.d3.core.material.StandardMaterial.UVMATRIX*/"MATRIX2"}; var TERRAIN=Shader.nameKey.add("TERRAIN"); vs="#include?VR \"VRHelper.glsl\";\nattribute vec4 a_Position;\nuniform mat4 u_MvpMatrix;\nuniform mat4 u_UVMatrix;\n\n#ifdef DIFFUSEMAP&&NORMALMAP&&SPECULARMAP&&EMISSIVEMAP&&AMBIENTMAP\nattribute vec2 a_Texcoord;\nvarying vec2 v_Texcoord;\nvarying vec2 v_TiledTexcoord;\n#endif\n\n#ifdef FOG\nuniform mat4 u_WorldMat;\nvarying vec3 v_PositionWorld;\n#endif\n\n\nvoid main()\n{\n #ifdef VR\n gl_Position = DistortFishEye(u_MvpMatrix * a_Position);\n #else\n gl_Position = u_MvpMatrix * a_Position;\n #endif\n \n #ifdef FOG\n v_PositionWorld=(u_WorldMat*a_Position).xyz;\n #endif\n \n #ifdef DIFFUSEMAP&&NORMALMAP&&SPECULARMAP&&EMISSIVEMAP&&AMBIENTMAP\n v_Texcoord=a_Texcoord;\n v_TiledTexcoord=(u_UVMatrix*vec4(a_Texcoord,0.0,1.0)).xy;\n #endif\n}"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/modelTerrain.vs*/; ps="#ifdef FSHIGHPRECISION\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform vec4 u_Albedo;\nuniform vec3 u_Ambient;\n\n#ifdef FOG\nuniform vec3 u_CameraPos;\nvarying vec3 v_PositionWorld;\n\nuniform float u_FogStart;\nuniform float u_FogRange;\nuniform vec3 u_FogColor;\n#endif\n\n#ifdef DIFFUSEMAP&&NORMALMAP&&SPECULARMAP&&EMISSIVEMAP&&AMBIENTMAP\n varying vec2 v_Texcoord;\n varying vec2 v_TiledTexcoord;\n uniform sampler2D u_BlendTexture;\n uniform sampler2D u_LayerTexture0;\n uniform sampler2D u_LayerTexture1;\n uniform sampler2D u_LayerTexture2;\n uniform sampler2D u_LayerTexture3;\n#endif\n\nvoid main()\n{ \n #ifdef DIFFUSEMAP&&NORMALMAP&&SPECULARMAP&&EMISSIVEMAP&&AMBIENTMAP\n vec4 blend=texture2D(u_BlendTexture, v_Texcoord);\n vec4 c0=texture2D(u_LayerTexture0, v_TiledTexcoord);\n vec4 c1=texture2D(u_LayerTexture1, v_TiledTexcoord);\n vec4 c2=texture2D(u_LayerTexture2, v_TiledTexcoord);\n vec4 c3=texture2D(u_LayerTexture3, v_TiledTexcoord);\n vec4 texColor = c0;\n texColor = mix(texColor, c1, blend.r);\n texColor = mix(texColor, c2, blend.g);\n texColor = mix(texColor, c3, blend.b);\n gl_FragColor=vec4(texColor.rgb*u_Ambient.rgb*blend.a,1.0);\n gl_FragColor=gl_FragColor*u_Albedo;\n #endif \n \n #ifdef FOG\n vec3 toEye=u_CameraPos-v_PositionWorld;\n float toEyeLength=length(toEye);\n \n float lerpFact=clamp((toEyeLength-u_FogStart)/u_FogRange,0.0,1.0);\n gl_FragColor.rgb=mix(gl_FragColor.rgb,u_FogColor,lerpFact);\n #endif\n}\n\n"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/modelTerrain.ps*/; Shader.preCompile(TERRAIN,vs,ps,shaderNameMap); shaderNameMap={ 'a_CornerTextureCoordinate':/*laya.d3.graphics.VertexElementUsage.CORNERTEXTURECOORDINATE0*/"CORNERTEXTURECOORDINATE", 'a_Position':/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION", 'a_Velocity':/*laya.d3.graphics.VertexElementUsage.VELOCITY0*/"VELOCITY", 'a_StartColor':/*laya.d3.graphics.VertexElementUsage.STARTCOLOR0*/"STARTCOLOR", 'a_EndColor':/*laya.d3.graphics.VertexElementUsage.ENDCOLOR0*/"ENDCOLOR", 'a_SizeRotation':/*laya.d3.graphics.VertexElementUsage.SIZEROTATION0*/"SIZEROTATION", 'a_Radius':/*laya.d3.graphics.VertexElementUsage.RADIUS0*/"RADIUS", 'a_Radian':/*laya.d3.graphics.VertexElementUsage.RADIAN0*/"RADIAN", 'a_AgeAddScale':/*laya.d3.graphics.VertexElementUsage.STARTLIFETIME*/"STARTLIFETIME", 'a_Time':/*laya.d3.graphics.VertexElementUsage.TIME0*/"TIME", 'u_WorldMat':/*laya.d3.core.material.ParticleMaterial.WORLDMATRIX*/"MVPMATRIX", 'u_View':/*laya.d3.core.material.ParticleMaterial.VIEWMATRIX*/"MATRIX1", 'u_Projection':/*laya.d3.core.material.ParticleMaterial.PROJECTIONMATRIX*/"MATRIX2", 'u_ViewportScale':/*laya.d3.core.material.ParticleMaterial.VIEWPORTSCALE*/"VIEWPORTSCALE", 'u_CurrentTime':/*laya.d3.core.material.ParticleMaterial.CURRENTTIME*/"CURRENTTIME", 'u_Duration':/*laya.d3.core.material.ParticleMaterial.DURATION*/"DURATION", 'u_Gravity':/*laya.d3.core.material.ParticleMaterial.GRAVITY*/"GRAVITY", 'u_EndVelocity':/*laya.d3.core.material.ParticleMaterial.ENDVELOCITY*/"ENDVELOCITY", 'u_texture':/*laya.d3.core.material.ParticleMaterial.DIFFUSETEXTURE*/"DIFFUSETEXTURE"}; var PARTICLE=Shader.nameKey.add("PARTICLE"); Shader.preCompile(PARTICLE,ParticleShader.vs,ParticleShader.ps,shaderNameMap); shaderNameMap={ 'a_CornerTextureCoordinate':/*laya.d3.graphics.VertexElementUsage.CORNERTEXTURECOORDINATE0*/"CORNERTEXTURECOORDINATE", 'a_Position':/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION", 'a_Direction':/*laya.d3.graphics.VertexElementUsage.DIRECTION*/"DIRECTION", 'a_StartColor':/*laya.d3.graphics.VertexElementUsage.STARTCOLOR0*/"STARTCOLOR", 'a_EndColor':/*laya.d3.graphics.VertexElementUsage.ENDCOLOR0*/"ENDCOLOR", 'a_StartSize':/*laya.d3.graphics.VertexElementUsage.STARTSIZE*/"STARTSIZE", 'a_StartRotation0':/*laya.d3.graphics.VertexElementUsage.STARTROTATION0*/"STARTROTATION0", 'a_StartRotation1':/*laya.d3.graphics.VertexElementUsage.STARTROTATION1*/"STARTROTATION1", 'a_StartRotation2':/*laya.d3.graphics.VertexElementUsage.STARTROTATION2*/"STARTROTATION2", 'a_StartLifeTime':/*laya.d3.graphics.VertexElementUsage.STARTLIFETIME*/"STARTLIFETIME", 'a_StartSpeed':/*laya.d3.graphics.VertexElementUsage.STARTSPEED*/"STARTSPEED", 'a_Time':/*laya.d3.graphics.VertexElementUsage.TIME0*/"TIME", 'a_Random0':/*laya.d3.graphics.VertexElementUsage.RANDOM0*/"RANDOM0", 'a_Random1':/*laya.d3.graphics.VertexElementUsage.RANDOM1*/"RANDOM1", 'a_SimulationWorldPostion':/*laya.d3.graphics.VertexElementUsage.SIMULATIONWORLDPOSTION*/"SIMULATIONWORLDPOSTION", 'u_WorldPosition':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.WORLDPOSITION*/"WORLDPOSITION", 'u_WorldRotationMat':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.WORLDROTATIONMATRIX*/"WORLDROTATIONMATRIX", 'u_ThreeDStartRotation':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.THREEDSTARTROTATION*/"THREEDSTARTROTATION", 'u_ScalingMode':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.SCALINGMODE*/"SCALINGMODE", 'u_PositionScale':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.POSITIONSCALE*/"POSITIONSCALE", 'u_SizeScale':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.SIZESCALE*/"SIZESCALE", 'u_View':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.VIEWMATRIX*/"MATRIX1", 'u_Projection':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.PROJECTIONMATRIX*/"MATRIX2", 'u_CurrentTime':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.CURRENTTIME*/"CURRENTTIME", 'u_Gravity':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.GRAVITY*/"GRAVITY", 'u_texture':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.DIFFUSETEXTURE*/"DIFFUSETEXTURE", 'u_CameraDirection':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.CAMERADIRECTION*/"CAMERADIRECTION", 'u_CameraUp':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.CAMERAUP*/"CAMERAUP", 'u_StretchedBillboardLengthScale':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.STRETCHEDBILLBOARDLENGTHSCALE*/"STRETCHEDBILLBOARDLENGTHSCALE", 'u_StretchedBillboardSpeedScale':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.STRETCHEDBILLBOARDSPEEDSCALE*/"STRETCHEDBILLBOARDSPEEDSCALE", 'u_ColorOverLifeGradientAlphas':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.COLOROVERLIFEGRADIENTALPHAS*/"COLOROVERLIFEGRADIENTALPHAS", 'u_ColorOverLifeGradientColors':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.COLOROVERLIFEGRADIENTCOLORS*/"COLOROVERLIFEGRADIENTCOLORS", 'u_MaxColorOverLifeGradientAlphas':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.MAXCOLOROVERLIFEGRADIENTALPHAS*/"MAXCOLOROVERLIFEGRADIENTALPHAS", 'u_MaxColorOverLifeGradientColors':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.MAXCOLOROVERLIFEGRADIENTCOLORS*/"MAXCOLOROVERLIFEGRADIENTCOLORS", 'u_SimulationSpace':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.SIMULATIONSPACE*/"SIMULATIONSPACE", 'u_VOLType':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.VOLTYPE*/"VOLTYPE", 'u_VOLVelocityConst':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.VOLVELOCITYCONST*/"VOLVELOCITYCONST", 'u_VOLVelocityGradientX':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.VOLVELOCITYGRADIENTX*/"VOLVELOCITYGRADIENTX", 'u_VOLVelocityGradientY':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.VOLVELOCITYGRADIENTY*/"VOLVELOCITYGRADIENTY", 'u_VOLVelocityGradientZ':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.VOLVELOCITYGRADIENTZ*/"VOLVELOCITYGRADIENTZ", 'u_VOLVelocityConstMax':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.VOLVELOCITYCONSTMAX*/"VOLVELOCITYCONSTMAX", 'u_VOLVelocityGradientMaxX':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.VOLVELOCITYGRADIENTXMAX*/"VOLVELOCITYGRADIENTXMAX", 'u_VOLVelocityGradientMaxY':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.VOLVELOCITYGRADIENTYMAX*/"VOLVELOCITYGRADIENTYMAX", 'u_VOLVelocityGradientMaxZ':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.VOLVELOCITYGRADIENTZMAX*/"VOLVELOCITYGRADIENTZMAX", 'u_VOLSpaceType':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.VOLSPACETYPE*/"VOLSPACETYPE", 'u_SOLType':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.SOLTYPE*/"SOLTYPE", 'u_SOLSeprarate':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.SOLSEPRARATE*/"SOLSEPRARATE", 'u_SOLSizeGradient':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.SOLSIZEGRADIENT*/"SOLSIZEGRADIENT", 'u_SOLSizeGradientX':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.SOLSIZEGRADIENTX*/"SOLSIZEGRADIENTX", 'u_SOLSizeGradientY':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.SOLSIZEGRADIENTY*/"SOLSIZEGRADIENTY", 'u_SOLSizeGradientZ':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.SOLSizeGradientZ*/"SOLSizeGradientZ", 'u_SOLSizeGradientMax':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.SOLSizeGradientMax*/"SOLSizeGradientMax", 'u_SOLSizeGradientMaxX':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.SOLSIZEGRADIENTXMAX*/"SOLSIZEGRADIENTXMAX", 'u_SOLSizeGradientMaxY':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.SOLSIZEGRADIENTYMAX*/"SOLSIZEGRADIENTYMAX", 'u_SOLSizeGradientMaxZ':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.SOLSizeGradientZMAX*/"SOLSizeGradientZMAX", 'u_ROLType':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLTYPE*/"ROLTYPE", 'u_ROLSeprarate':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLSEPRARATE*/"ROLSEPRARATE", 'u_ROLAngularVelocityConst':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLANGULARVELOCITYCONST*/"ROLANGULARVELOCITYCONST", 'u_ROLAngularVelocityConstSeprarate':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLANGULARVELOCITYCONSTSEPRARATE*/"ROLANGULARVELOCITYCONSTSEPRARATE", 'u_ROLAngularVelocityGradient':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENT*/"ROLANGULARVELOCITYGRADIENT", 'u_ROLAngularVelocityGradientX':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTX*/"ROLANGULARVELOCITYGRADIENTX", 'u_ROLAngularVelocityGradientY':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTY*/"ROLANGULARVELOCITYGRADIENTY", 'u_ROLAngularVelocityGradientZ':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTZ*/"ROLANGULARVELOCITYGRADIENTZ", 'u_ROLAngularVelocityConstMax':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLANGULARVELOCITYCONSTMAX*/"ROLANGULARVELOCITYCONSTMAX", 'u_ROLAngularVelocityConstMaxSeprarate':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLANGULARVELOCITYCONSTMAXSEPRARATE*/"ROLANGULARVELOCITYCONSTMAXSEPRARATE", 'u_ROLAngularVelocityGradientMax':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTMAX*/"ROLANGULARVELOCITYGRADIENTMAX", 'u_ROLAngularVelocityGradientMaxX':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTXMAX*/"ROLANGULARVELOCITYGRADIENTXMAX", 'u_ROLAngularVelocityGradientMaxY':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTYMAX*/"ROLANGULARVELOCITYGRADIENTYMAX", 'u_ROLAngularVelocityGradientMaxZ':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTZMAX*/"ROLANGULARVELOCITYGRADIENTZMAX", 'u_TSAType':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.TEXTURESHEETANIMATIONTYPE*/"TEXTURESHEETANIMATIONTYPE", 'u_TSACycles':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.TEXTURESHEETANIMATIONCYCLES*/"TEXTURESHEETANIMATIONCYCLES", 'u_TSASubUVLength':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.TEXTURESHEETANIMATIONSUBUVLENGTH*/"TEXTURESHEETANIMATIONSUBUVLENGTH", 'u_TSAGradientUVs':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.TEXTURESHEETANIMATIONGRADIENTUVS*/"TEXTURESHEETANIMATIONGRADIENTUVS", 'u_TSAMaxGradientUVs':/*laya.d3.core.particleShuriKen.ShurikenParticleMaterial.TEXTURESHEETANIMATIONGRADIENTMAXUVS*/"TEXTURESHEETANIMATIONGRADIENTMAXUVS"}; var PARTICLESHURIKEN=Shader.nameKey.add("PARTICLESHURIKEN"); vs="attribute vec4 a_CornerTextureCoordinate;\nattribute vec3 a_Position;\nattribute vec3 a_Direction;\nattribute vec4 a_StartColor;\nattribute vec3 a_StartSize;\nattribute vec3 a_StartRotation0;\nattribute vec3 a_StartRotation1;\nattribute vec3 a_StartRotation2;\nattribute float a_StartLifeTime;\nattribute float a_Time;\nattribute float a_StartSpeed;\n#ifdef VELOCITYOVERLIFETIME||COLOROVERLIFETIME||RANDOMCOLOROVERLIFETIME||SIZEOVERLIFETIME||ROTATIONOVERLIFETIME\n attribute vec4 a_Random0;\n#endif\n#ifdef TEXTURESHEETANIMATION\n attribute vec4 a_Random1;\n#endif\nattribute vec3 a_SimulationWorldPostion;\n\nvarying float v_Discard;\nvarying vec4 v_Color;\nvarying vec2 v_TextureCoordinate;\n\nuniform float u_CurrentTime;\nuniform vec3 u_Gravity;\n\nuniform vec3 u_WorldPosition;\nuniform mat4 u_WorldRotationMat;\nuniform bool u_ThreeDStartRotation;\nuniform int u_ScalingMode;\nuniform vec3 u_PositionScale;\nuniform vec3 u_SizeScale;\nuniform mat4 u_View;\nuniform mat4 u_Projection;\n\nuniform vec3 u_CameraDirection;//TODO:只有几种广告牌模式需要用\nuniform vec3 u_CameraUp;\n\nuniform float u_StretchedBillboardLengthScale;\nuniform float u_StretchedBillboardSpeedScale;\nuniform int u_SimulationSpace;\n\n#ifdef VELOCITYOVERLIFETIME\n uniform int u_VOLType;\n uniform vec3 u_VOLVelocityConst;\n uniform vec2 u_VOLVelocityGradientX[4];//x为key,y为速度\n uniform vec2 u_VOLVelocityGradientY[4];//x为key,y为速度\n uniform vec2 u_VOLVelocityGradientZ[4];//x为key,y为速度\n uniform vec3 u_VOLVelocityConstMax;\n uniform vec2 u_VOLVelocityGradientMaxX[4];//x为key,y为速度\n uniform vec2 u_VOLVelocityGradientMaxY[4];//x为key,y为速度\n uniform vec2 u_VOLVelocityGradientMaxZ[4];//x为key,y为速度\n uniform int u_VOLSpaceType;\n#endif\n\n#ifdef COLOROVERLIFETIME\n uniform vec4 u_ColorOverLifeGradientColors[4];//x为key,yzw为Color\n uniform vec2 u_ColorOverLifeGradientAlphas[4];//x为key,y为Alpha\n#endif\n\n#ifdef RANDOMCOLOROVERLIFETIME\n uniform vec4 u_ColorOverLifeGradientColors[4];//x为key,yzw为Color\n uniform vec2 u_ColorOverLifeGradientAlphas[4];//x为key,y为Alpha\n uniform vec4 u_MaxColorOverLifeGradientColors[4];//x为key,yzw为Color\n uniform vec2 u_MaxColorOverLifeGradientAlphas[4];//x为key,y为Alpha\n#endif\n\n#ifdef SIZEOVERLIFETIME\n uniform int u_SOLType;\n uniform bool u_SOLSeprarate;\n uniform vec2 u_SOLSizeGradient[4];//x为key,y为尺寸\n uniform vec2 u_SOLSizeGradientX[4];//x为key,y为尺寸\n uniform vec2 u_SOLSizeGradientY[4];//x为key,y为尺寸\n uniform vec2 u_SOLSizeGradientZ[4];//x为key,y为尺寸\n uniform vec2 u_SOLSizeGradientMax[4];//x为key,y为尺寸\n uniform vec2 u_SOLSizeGradientMaxX[4];//x为key,y为尺寸\n uniform vec2 u_SOLSizeGradientMaxY[4];//x为key,y为尺寸\n uniform vec2 u_SOLSizeGradientMaxZ[4];//x为key,y为尺寸\n#endif\n\n\n#ifdef ROTATIONOVERLIFETIME\n uniform int u_ROLType;\n uniform bool u_ROLSeprarate;\n uniform float u_ROLAngularVelocityConst;\n uniform vec3 u_ROLAngularVelocityConstSeprarate;\n uniform vec2 u_ROLAngularVelocityGradient[4];//x为key,y为旋转\n uniform vec2 u_ROLAngularVelocityGradientX[4];//x为key,y为旋转\n uniform vec2 u_ROLAngularVelocityGradientY[4];//x为key,y为旋转\n uniform vec2 u_ROLAngularVelocityGradientZ[4];//x为key,y为旋转\n uniform float u_ROLAngularVelocityConstMax;\n uniform vec3 u_ROLAngularVelocityConstMaxSeprarate;\n uniform vec2 u_ROLAngularVelocityGradientMax[4];//x为key,y为旋转\n uniform vec2 u_ROLAngularVelocityGradientMaxX[4];//x为key,y为旋转\n uniform vec2 u_ROLAngularVelocityGradientMaxY[4];//x为key,y为旋转\n uniform vec2 u_ROLAngularVelocityGradientMaxZ[4];//x为key,y为旋转\n#endif\n\n#ifdef TEXTURESHEETANIMATION\n uniform int u_TSAType;\n uniform float u_TSACycles;\n uniform vec2 u_TSASubUVLength;\n uniform vec2 u_TSAGradientUVs[4];//x为key,y为frame\n uniform vec2 u_TSAMaxGradientUVs[4];//x为key,y为frame\n#endif\n\nfloat getCurValueFromGradientFloat(in vec2 gradientNumbers[4],in float normalizedAge)\n{\n float curValue;\n for(int i=1;i<4;i++)\n {\n vec2 gradientNumber=gradientNumbers[i];\n float key=gradientNumber.x;\n if(key>=normalizedAge)\n {\n vec2 lastGradientNumber=gradientNumbers[i-1];\n float lastKey=lastGradientNumber.x;\n float age=(normalizedAge-lastKey)/(key-lastKey);\n curValue=mix(lastGradientNumber.y,gradientNumber.y,age);\n break;\n }\n }\n return curValue;\n}\n\n#ifdef VELOCITYOVERLIFETIME\n//float getTotalPositionFromGradientFloat(in vec2 gradientNumbers[4],in float normalizedAge)\n//{\n// float totalPosition=0.0;\n// for(int i=1;i<4;i++)\n// {\n// vec2 gradientNumber=gradientNumbers[i];\n// float key=gradientNumber.x;\n// vec2 lastGradientNumber=gradientNumbers[i-1];\n// float lastValue=lastGradientNumber.y;\n// \n// if(key>=normalizedAge){\n// float lastKey=lastGradientNumber.x;\n// float age=(normalizedAge-lastKey)/(key-lastKey);\n// \n// float velocity=(lastValue+mix(lastValue,gradientNumber.y,age))/2.0;\n// totalPosition+=velocity*a_StartLifeTime*(normalizedAge-lastKey);//TODO:计算POSITION时可用优化,用已计算好速度\n// break;\n// }\n// else{\n// float velocity=(lastValue+gradientNumber.y)/2.0;\n// totalPosition+=velocity*a_StartLifeTime*(key-lastGradientNumber.x);\n// }\n// }\n// return totalPosition;\n//}\n#endif\n\n\nfloat getTotalValueFromGradientFloat(in vec2 gradientNumbers[4],in float normalizedAge)\n{\n float totalValue=0.0;\n for(int i=1;i<4;i++)\n {\n vec2 gradientNumber=gradientNumbers[i];\n float key=gradientNumber.x;\n vec2 lastGradientNumber=gradientNumbers[i-1];\n float lastValue=lastGradientNumber.y;\n \n if(key>=normalizedAge){\n float lastKey=lastGradientNumber.x;\n float age=(normalizedAge-lastKey)/(key-lastKey);\n totalValue+=(lastValue+mix(lastValue,gradientNumber.y,age))/2.0*a_StartLifeTime*(normalizedAge-lastKey);\n break;\n }\n else{\n totalValue+=(lastValue+gradientNumber.y)/2.0*a_StartLifeTime*(key-lastGradientNumber.x);\n }\n }\n return totalValue;\n}\n\nvec4 getColorFromGradient(in vec2 gradientAlphas[4],in vec4 gradientColors[4],in float normalizedAge)\n{\n vec4 overTimeColor;\n for(int i=1;i<4;i++)\n {\n vec2 gradientAlpha=gradientAlphas[i];\n float alphaKey=gradientAlpha.x;\n if(alphaKey>=normalizedAge)\n {\n vec2 lastGradientAlpha=gradientAlphas[i-1];\n float lastAlphaKey=lastGradientAlpha.x;\n float age=(normalizedAge-lastAlphaKey)/(alphaKey-lastAlphaKey);\n overTimeColor.a=mix(lastGradientAlpha.y,gradientAlpha.y,age);\n break;\n }\n }\n \n for(int i=1;i<4;i++)\n {\n vec4 gradientColor=gradientColors[i];\n float colorKey=gradientColor.x;\n if(colorKey>=normalizedAge)\n {\n vec4 lastGradientColor=gradientColors[i-1];\n float lastColorKey=lastGradientColor.x;\n float age=(normalizedAge-lastColorKey)/(colorKey-lastColorKey);\n overTimeColor.rgb=mix(gradientColors[i-1].yzw,gradientColor.yzw,age);\n break;\n }\n }\n return overTimeColor;\n}\n\n\n\nfloat getFrameFromGradient(in vec2 gradientFrames[4],in float normalizedAge)\n{\n float overTimeFrame;\n for(int i=1;i<4;i++)\n {\n vec2 gradientFrame=gradientFrames[i];\n float key=gradientFrame.x;\n if(key>=normalizedAge)\n {\n vec2 lastGradientFrame=gradientFrames[i-1];\n float lastKey=lastGradientFrame.x;\n float age=(normalizedAge-lastKey)/(key-lastKey);\n overTimeFrame=mix(lastGradientFrame.y,gradientFrame.y,age);\n break;\n }\n }\n return floor(overTimeFrame);\n}\n\n#ifdef VELOCITYOVERLIFETIME\nvec3 computeParticleLifeVelocity(in float normalizedAge)\n{\n vec3 outLifeVelocity;\n if(u_VOLType==0)\n outLifeVelocity=u_VOLVelocityConst; \n else if(u_VOLType==1)\n outLifeVelocity= vec3(getCurValueFromGradientFloat(u_VOLVelocityGradientX,normalizedAge),getCurValueFromGradientFloat(u_VOLVelocityGradientY,normalizedAge),getCurValueFromGradientFloat(u_VOLVelocityGradientZ,normalizedAge));\n else if(u_VOLType==2)\n outLifeVelocity=mix(u_VOLVelocityConst,u_VOLVelocityConstMax,a_Random0.x); \n else if(u_VOLType==3)\n outLifeVelocity=vec3(mix(getCurValueFromGradientFloat(u_VOLVelocityGradientX,normalizedAge),getCurValueFromGradientFloat(u_VOLVelocityGradientMaxX,normalizedAge),a_Random0.x),\n mix(getCurValueFromGradientFloat(u_VOLVelocityGradientY,normalizedAge),getCurValueFromGradientFloat(u_VOLVelocityGradientMaxY,normalizedAge),a_Random0.x),\n mix(getCurValueFromGradientFloat(u_VOLVelocityGradientZ,normalizedAge),getCurValueFromGradientFloat(u_VOLVelocityGradientMaxZ,normalizedAge),a_Random0.x));\n \n return outLifeVelocity;\n} \n#endif\n\nvec3 computeParticlePosition(in vec3 startVelocity, in vec3 lifeVelocity,in float age,in float normalizedAge)\n{\n vec3 startPosition;\n vec3 lifePosition;\n #ifdef VELOCITYOVERLIFETIME\n if(u_VOLType==0){\n startPosition=startVelocity*age;\n lifePosition=lifeVelocity*age;\n }\n else if(u_VOLType==1){\n startPosition=startVelocity*age;\n lifePosition=vec3(getTotalValueFromGradientFloat(u_VOLVelocityGradientX,normalizedAge),getTotalValueFromGradientFloat(u_VOLVelocityGradientY,normalizedAge),getTotalValueFromGradientFloat(u_VOLVelocityGradientZ,normalizedAge));\n }\n else if(u_VOLType==2){\n startPosition=startVelocity*age;\n lifePosition=lifeVelocity*age;\n }\n else if(u_VOLType==3){\n startPosition=startVelocity*age;\n lifePosition=vec3(mix(getTotalValueFromGradientFloat(u_VOLVelocityGradientX,normalizedAge),getTotalValueFromGradientFloat(u_VOLVelocityGradientMaxX,normalizedAge),a_Random0.x)\n ,mix(getTotalValueFromGradientFloat(u_VOLVelocityGradientY,normalizedAge),getTotalValueFromGradientFloat(u_VOLVelocityGradientMaxY,normalizedAge),a_Random0.x)\n ,mix(getTotalValueFromGradientFloat(u_VOLVelocityGradientZ,normalizedAge),getTotalValueFromGradientFloat(u_VOLVelocityGradientMaxZ,normalizedAge),a_Random0.x));\n }\n \n vec3 finalPosition;\n if(u_VOLSpaceType==0){\n if(u_ScalingMode!=2)\n finalPosition =mat3(u_WorldRotationMat)*(u_PositionScale*(a_Position+startPosition+lifePosition));\n else\n finalPosition =mat3(u_WorldRotationMat)*(u_PositionScale*a_Position+startPosition+lifePosition);\n }\n else{\n if(u_ScalingMode!=2)\n finalPosition = mat3(u_WorldRotationMat)*(u_PositionScale*(a_Position+startPosition))+lifePosition;\n else\n finalPosition = mat3(u_WorldRotationMat)*(u_PositionScale*a_Position+startPosition)+lifePosition;\n }\n #else\n startPosition=startVelocity*age;\n vec3 finalPosition;\n if(u_ScalingMode!=2)\n finalPosition = mat3(u_WorldRotationMat)*(u_PositionScale*(a_Position+startPosition));\n else\n finalPosition = mat3(u_WorldRotationMat)*(u_PositionScale*a_Position+startPosition);\n #endif\n \n if(u_SimulationSpace==0)\n finalPosition=finalPosition+a_SimulationWorldPostion;\n else if(u_SimulationSpace==1) \n finalPosition=finalPosition+u_WorldPosition;\n \n finalPosition+=u_Gravity*age*normalizedAge;//计算受重力影响的位置//TODO:移除\n \n return finalPosition;\n}\n\n\nvec4 computeParticleColor(in vec4 color,in float normalizedAge)\n{\n #ifdef COLOROVERLIFETIME\n color*=getColorFromGradient(u_ColorOverLifeGradientAlphas,u_ColorOverLifeGradientColors,normalizedAge);\n #endif\n \n #ifdef RANDOMCOLOROVERLIFETIME\n color*=mix(getColorFromGradient(u_ColorOverLifeGradientAlphas,u_ColorOverLifeGradientColors,normalizedAge),getColorFromGradient(u_MaxColorOverLifeGradientAlphas,u_MaxColorOverLifeGradientColors,normalizedAge),a_Random0.y);\n #endif\n\n return color;\n}\n\nvec2 computeParticleSize(in vec2 size,in float normalizedAge)\n{\n #ifdef SIZEOVERLIFETIME\n if(u_SOLType==0){\n if(u_SOLSeprarate){\n size*=vec2(getCurValueFromGradientFloat(u_SOLSizeGradientX,normalizedAge),getCurValueFromGradientFloat(u_SOLSizeGradientY,normalizedAge));\n }\n else{\n size*=getCurValueFromGradientFloat(u_SOLSizeGradient,normalizedAge);\n }\n }\n else if(u_SOLType==2){\n if(u_SOLSeprarate){\n size*=vec2(mix(getCurValueFromGradientFloat(u_SOLSizeGradientX,normalizedAge),getCurValueFromGradientFloat(u_SOLSizeGradientMaxX,normalizedAge),a_Random0.z)\n ,mix(getCurValueFromGradientFloat(u_SOLSizeGradientY,normalizedAge),getCurValueFromGradientFloat(u_SOLSizeGradientMaxY,normalizedAge),a_Random0.z));\n }\n else{\n size*=mix(getCurValueFromGradientFloat(u_SOLSizeGradient,normalizedAge),getCurValueFromGradientFloat(u_SOLSizeGradientMax,normalizedAge),a_Random0.z); \n }\n }\n #endif\n return size;\n}\n\nvec3 computeParticleRotation(in vec3 rotation,in float age,in float normalizedAge)//TODO:不分轴是否无需计算XY,Billboard模式下好像是,待确认。\n{ \n #ifdef ROTATIONOVERLIFETIME\n if(u_ROLType==0){\n if(u_ROLSeprarate){\n vec3 ageRot=u_ROLAngularVelocityConstSeprarate*age;\n rotation+=ageRot;\n }\n else{\n float ageRot=u_ROLAngularVelocityConst*age;\n rotation+=ageRot;\n }\n }\n else if(u_ROLType==1){\n if(u_ROLSeprarate){\n rotation+=vec3(getTotalValueFromGradientFloat(u_ROLAngularVelocityGradientX,normalizedAge),getTotalValueFromGradientFloat(u_ROLAngularVelocityGradientY,normalizedAge),getTotalValueFromGradientFloat(u_ROLAngularVelocityGradientZ,normalizedAge));\n }\n else{\n rotation+=getTotalValueFromGradientFloat(u_ROLAngularVelocityGradient,normalizedAge);\n }\n }\n else if(u_ROLType==2){\n if(u_ROLSeprarate){\n vec3 ageRot=mix(u_ROLAngularVelocityConstSeprarate,u_ROLAngularVelocityConstMaxSeprarate,a_Random0.w)*age;\n rotation+=ageRot;\n }\n else{\n float ageRot=mix(u_ROLAngularVelocityConst,u_ROLAngularVelocityConstMax,a_Random0.w)*age;\n rotation+=ageRot;\n }\n }\n else if(u_ROLType==3){\n if(u_ROLSeprarate){\n rotation+=vec3(mix(getTotalValueFromGradientFloat(u_ROLAngularVelocityGradientX,normalizedAge),getTotalValueFromGradientFloat(u_ROLAngularVelocityGradientMaxX,normalizedAge),a_Random0.w)\n ,mix(getTotalValueFromGradientFloat(u_ROLAngularVelocityGradientY,normalizedAge),getTotalValueFromGradientFloat(u_ROLAngularVelocityGradientMaxY,normalizedAge),a_Random0.w)\n ,mix(getTotalValueFromGradientFloat(u_ROLAngularVelocityGradientZ,normalizedAge),getTotalValueFromGradientFloat(u_ROLAngularVelocityGradientMaxZ,normalizedAge),a_Random0.w));\n }\n else{\n rotation+=mix(getTotalValueFromGradientFloat(u_ROLAngularVelocityGradient,normalizedAge),getTotalValueFromGradientFloat(u_ROLAngularVelocityGradientMax,normalizedAge),a_Random0.w);\n }\n }\n #endif\n return rotation;\n}\n\nvec2 computeParticleUV(in vec2 uv,in float normalizedAge)\n{ \n #ifdef TEXTURESHEETANIMATION\n if(u_TSAType==1){\n float cycleNormalizedAge=normalizedAge*u_TSACycles;\n float frame=getFrameFromGradient(u_TSAGradientUVs,cycleNormalizedAge-floor(cycleNormalizedAge));\n float totalULength=frame*u_TSASubUVLength.x;\n float floorTotalULength=floor(totalULength);\n uv.x=uv.x+totalULength-floorTotalULength;\n uv.y=uv.y+floorTotalULength*u_TSASubUVLength.y;\n }\n else if(u_TSAType==3){\n float cycleNormalizedAge=normalizedAge*u_TSACycles;\n float uvNormalizedAge=cycleNormalizedAge-floor(cycleNormalizedAge);\n float frame=floor(mix(getFrameFromGradient(u_TSAGradientUVs,uvNormalizedAge),getFrameFromGradient(u_TSAMaxGradientUVs,uvNormalizedAge),a_Random1.x));\n float totalULength=frame*u_TSASubUVLength.x;\n float floorTotalULength=floor(totalULength);\n uv.x=uv.x+totalULength-floorTotalULength;\n uv.y=uv.y+floorTotalULength*u_TSASubUVLength.y;\n }\n #endif\n return uv;\n}\n\nvoid main()\n{\n float age = u_CurrentTime - a_Time;\n float normalizedAge = age/a_StartLifeTime;\n vec3 lifeVelocity;\n if(normalizedAge<1.0){ \n vec3 startVelocity=a_Direction*a_StartSpeed;\n #ifdef VELOCITYOVERLIFETIME\n lifeVelocity= computeParticleLifeVelocity(normalizedAge);//计算粒子生命周期速度\n #endif \n \n vec3 center=computeParticlePosition(startVelocity, lifeVelocity, age, normalizedAge);//计算粒子位置\n vec2 corner=a_CornerTextureCoordinate.xy;//Billboard模式z轴无效\n \n #ifdef SPHERHBILLBOARD\n vec3 cameraUpVector =normalize(u_CameraUp);//TODO:是否外面归一化\n vec3 sideVector = normalize(cross(u_CameraDirection,cameraUpVector));\n vec3 upVector = normalize(cross(sideVector,u_CameraDirection));\n corner*=computeParticleSize(a_StartSize.xy,normalizedAge);\n if(u_ThreeDStartRotation){\n center += u_SizeScale.xzy*(mat3(a_StartRotation0,a_StartRotation1,a_StartRotation2)*(corner.x*sideVector+corner.y*upVector));\n }\n else{\n vec3 rotationAng = computeParticleRotation(a_StartRotation0, age,normalizedAge);\n float rot=rotationAng.z;\n float c = cos(rot);\n float s = sin(rot);\n mat2 rotation= mat2(c, -s, s, c);\n corner=rotation*corner;\n center += u_SizeScale.xzy*(corner.x*sideVector+corner.y*upVector);\n }\n \n #endif\n \n #ifdef STRETCHEDBILLBOARD\n vec3 velocity;\n #ifdef VELOCITYOVERLIFETIME\n if(u_VOLSpaceType==0)\n velocity=mat3(u_WorldRotationMat)*(u_SizeScale*(startVelocity+lifeVelocity));\n else\n velocity=mat3(u_WorldRotationMat)*(u_SizeScale*startVelocity)+lifeVelocity;\n #else\n velocity= mat3(u_WorldRotationMat)*(u_SizeScale*startVelocity);\n #endif \n vec3 cameraUpVector =normalize(velocity);\n vec3 sideVector = normalize(cross(u_CameraDirection,cameraUpVector));\n vec2 size=computeParticleSize(a_StartSize.xy,normalizedAge);\n const mat2 rotaionZHalfPI=mat2(0.0, -1.0, 1.0, 0.0);\n corner=rotaionZHalfPI*corner;\n corner.y=corner.y-abs(corner.y);\n float speed=length(velocity);//TODO:\n center +=u_SizeScale.xzy*size.x*corner.x*sideVector+((cameraUpVector*speed)*u_StretchedBillboardSpeedScale+cameraUpVector*size.y*u_StretchedBillboardLengthScale)*corner.y;\n #endif\n \n #ifdef HORIZONTALBILLBOARD\n const vec3 cameraUpVector =vec3(0.0,0.0,-1.0);\n const vec3 sideVector = vec3(1.0,0.0,0.0);\n corner*=computeParticleSize(a_StartSize.xy,normalizedAge);\n vec3 rotationAng = computeParticleRotation(a_StartRotation0, age,normalizedAge);\n float rot=rotationAng.z;\n float c = cos(rot);\n float s = sin(rot);\n mat2 rotation= mat2(c, -s, s, c);\n corner=rotation*corner*cos(0.78539816339744830961566084581988);//TODO:临时缩小cos45,不确定U3D原因\n center +=u_SizeScale.xzy*(corner.x*sideVector+ corner.y*cameraUpVector);\n #endif\n \n #ifdef VERTICALBILLBOARD\n const vec3 cameraUpVector =vec3(0.0,1.0,0.0);\n vec3 sideVector = normalize(cross(u_CameraDirection,cameraUpVector));\n corner*=computeParticleSize(a_StartSize.xy,normalizedAge);\n vec3 rotationAng = computeParticleRotation(a_StartRotation0, age,normalizedAge);\n float rot=rotationAng.z;\n float c = cos(rot);\n float s = sin(rot);\n mat2 rotation= mat2(c, -s, s, c);\n corner=rotation*corner*cos(0.78539816339744830961566084581988);//TODO:临时缩小cos45,不确定U3D原因\n center +=u_SizeScale.xzy*(corner.x*sideVector+ corner.y*cameraUpVector);\n #endif\n \n gl_Position=u_Projection*u_View*vec4(center,1.0);\n v_Color = computeParticleColor(a_StartColor, normalizedAge);\n v_TextureCoordinate =computeParticleUV(a_CornerTextureCoordinate.zw, normalizedAge);\n v_Discard=0.0;\n }\n else\n {\n v_Discard=1.0;\n }\n}\n\n"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/ParticleShuriKen.vs*/; ps="#ifdef FSHIGHPRECISION\n precision highp float;\n#else\n precision mediump float;\n#endif\n\nvarying float v_Discard;\nvarying vec4 v_Color;\nvarying vec2 v_TextureCoordinate;\nuniform sampler2D u_texture;\n\n\nvoid main()\n{ \n #ifdef DIFFUSEMAP\n if(v_Discard!=0.0)\n discard;\n gl_FragColor=texture2D(u_texture,v_TextureCoordinate)*v_Color;\n #else\n gl_FragColor=vec4(0.0);\n #endif\n}"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/ParticleShuriKen.ps*/; Shader.preCompile(PARTICLESHURIKEN,vs,ps,shaderNameMap); shaderNameMap={ 'a_Position':/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION", 'a_Texcoord0':/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV", 'a_Time':/*laya.d3.core.material.GlitterMaterial.TIME*/"TIME", 'u_Texture':/*laya.d3.core.material.GlitterMaterial.DIFFUSETEXTURE*/"DIFFUSETEXTURE", 'u_MvpMatrix':/*laya.d3.core.material.GlitterMaterial.MVPMATRIX*/"MVPMATRIX", 'u_Albedo':/*laya.d3.core.material.GlitterMaterial.ALBEDO*/"ALBEDO", 'u_CurrentTime':/*laya.d3.core.material.GlitterMaterial.CURRENTTIME*/"CURRENTTIME", 'u_Color':/*laya.d3.core.material.GlitterMaterial.UNICOLOR*/"UNICOLOR", 'u_Duration':/*laya.d3.core.material.GlitterMaterial.DURATION*/"DURATION"}; var GLITTER=Shader.nameKey.add("GLITTER"); vs="attribute vec4 a_Position;\nattribute vec2 a_Texcoord0;\nattribute float a_Time;\n\nuniform mat4 u_MvpMatrix;\nuniform float u_CurrentTime;\nuniform vec4 u_Color;\nuniform float u_Duration;\n\nvarying vec2 v_Texcoord;\nvarying vec4 v_Color;\n\n\nvoid main()\n{\n gl_Position = u_MvpMatrix * a_Position;\n \n float age = u_CurrentTime-a_Time;\n float normalizedAge = clamp(age / u_Duration,0.0,1.0);\n \n v_Texcoord=a_Texcoord0;\n \n v_Color=u_Color;\n v_Color.a*=1.0-normalizedAge;\n}\n"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/Glitter.vs*/; ps="#ifdef FSHIGHPRECISION\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform vec4 u_Albedo;\nuniform sampler2D u_Texture;\n\nvarying vec2 v_Texcoord;\nvarying vec4 v_Color;\n\n\nvoid main()\n{ \n gl_FragColor=texture2D(u_Texture, v_Texcoord)*v_Color;\n gl_FragColor=gl_FragColor*u_Albedo;\n}\n\n"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/Glitter.ps*/; Shader.preCompile(GLITTER,vs,ps,shaderNameMap); shaderNameMap={ 'a_Position':/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION", 'u_MvpMatrix':/*laya.d3.resource.models.Sky.MVPMATRIX*/"MVPMATRIX", 'u_Intensity':/*laya.d3.resource.models.Sky.INTENSITY*/"INTENSITY", 'u_AlphaBlending':/*laya.d3.resource.models.Sky.ALPHABLENDING*/"ALPHABLENDING", 'u_CubeTexture':/*laya.d3.resource.models.Sky.DIFFUSETEXTURE*/"DIFFUSETEXTURE"}; var skyBox=Shader.nameKey.add("SkyBox"); vs="attribute vec4 a_Position;\nuniform mat4 u_MvpMatrix;\nvarying vec3 v_Texcoord;\n\n\nvoid main()\n{\n gl_Position = (u_MvpMatrix*a_Position).xyww;\n v_Texcoord=a_Position.xyz;\n}\n"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/SkyBox.vs*/; ps="#ifdef FSHIGHPRECISION\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform float u_Intensity;\nuniform float u_AlphaBlending;\nuniform samplerCube u_CubeTexture;\n\nvarying vec3 v_Texcoord;\n\n\nvoid main()\n{ \n gl_FragColor=vec4(textureCube(u_CubeTexture, v_Texcoord).rgb*u_Intensity,u_AlphaBlending);\n}\n\n"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/SkyBox.ps*/; Shader.preCompile(skyBox,vs,ps,shaderNameMap); shaderNameMap={ 'a_Position':/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION", 'a_Texcoord0':/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV", 'u_MvpMatrix':/*laya.d3.resource.models.Sky.MVPMATRIX*/"MVPMATRIX", 'u_Intensity':/*laya.d3.resource.models.Sky.INTENSITY*/"INTENSITY", 'u_AlphaBlending':/*laya.d3.resource.models.Sky.ALPHABLENDING*/"ALPHABLENDING", 'u_texture':/*laya.d3.resource.models.Sky.DIFFUSETEXTURE*/"DIFFUSETEXTURE"}; var skyDome=Shader.nameKey.add("SkyDome"); vs="attribute vec4 a_Position;\nattribute vec2 a_Texcoord0;\nuniform mat4 u_MvpMatrix;\nvarying vec2 v_Texcoord;\n\n\nvoid main()\n{\n gl_Position = (u_MvpMatrix*a_Position).xyww;\n v_Texcoord = a_Texcoord0;\n}\n"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/SkyDome.vs*/; ps="#ifdef FSHIGHPRECISION\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform float u_Intensity;\nuniform float u_AlphaBlending;\nuniform sampler2D u_texture;\n\nvarying vec2 v_Texcoord;\n\n\nvoid main()\n{ \n gl_FragColor=vec4(texture2D(u_texture, v_Texcoord).rgb*u_Intensity,u_AlphaBlending);\n}\n\n"/*__INCLUDESTR__E:/trank/libs/LayaAir/publish/LayaAirPublish/branch/src/d3/src/laya/d3/shader/files/SkyDome.ps*/; Shader.preCompile(skyDome,vs,ps,shaderNameMap); } Laya3D._initResourceLoad=function(){ var createMap=LoaderManager.createMap; createMap["lh"]=[Sprite3D,/*CLASS CONST:Laya3D.SPRITE3DHIERARCHY*/"SPRITE3DHIERARCHY"]; createMap["lm"]=[Mesh,/*CLASS CONST:Laya3D.MESH*/"MESH"]; createMap["lmat"]=[StandardMaterial,/*CLASS CONST:Laya3D.MATERIAL*/"MATERIAL"]; createMap["ltc"]=[TextureCube,/*CLASS CONST:Laya3D.TEXTURECUBE*/"TEXTURECUBE"]; createMap["jpg"]=[Texture2D,"nativeimage"]; createMap["jpeg"]=[Texture2D,"nativeimage"]; createMap["png"]=[Texture2D,"nativeimage"]; createMap["lsani"]=[AnimationTemplet,/*laya.net.Loader.BUFFER*/"arraybuffer"]; createMap["lrani"]=[AnimationTemplet,/*laya.net.Loader.BUFFER*/"arraybuffer"]; createMap["ani"]=[AnimationTemplet,/*laya.net.Loader.BUFFER*/"arraybuffer"]; createMap["lani"]=[AnimationTemplet,/*laya.net.Loader.BUFFER*/"arraybuffer"]; Loader.parserMap[ /*CLASS CONST:Laya3D.SPRITE3DHIERARCHY*/"SPRITE3DHIERARCHY"]=Laya3D._loadSprite3DHierarchy; Loader.parserMap[ /*CLASS CONST:Laya3D.MESH*/"MESH"]=Laya3D._loadMesh; Loader.parserMap[ /*CLASS CONST:Laya3D.MATERIAL*/"MATERIAL"]=Laya3D._loadMaterial; Loader.parserMap[ /*CLASS CONST:Laya3D.TEXTURECUBE*/"TEXTURECUBE"]=Laya3D._loadTextureCube; } Laya3D.READ_BLOCK=function(){ Laya3D._readData.pos+=4; return true; } Laya3D.READ_DATA=function(){ Laya3D._DATA.offset=Laya3D._readData.getUint32(); Laya3D._DATA.size=Laya3D._readData.getUint32(); return true; } Laya3D.READ_STRINGS=function(){ var materialUrls=[]; var _STRINGS={offset:0,size:0}; _STRINGS.offset=Laya3D._readData.getUint16(); _STRINGS.size=Laya3D._readData.getUint16(); var ofs=Laya3D._readData.pos; Laya3D._readData.pos=_STRINGS.offset+Laya3D._DATA.offset; for (var i=0;i < _STRINGS.size;i++){ var string=Laya3D._readData.readUTFString(); if (string.lastIndexOf(".lmat")!==-1) materialUrls.push(string); } return materialUrls; } Laya3D._getSprite3DHierarchyInnerUrls=function(hierarchyNode,urls,urlMap,urlVersion){ var path; var clas; switch (hierarchyNode.type){ case "MeshSprite3D": path=hierarchyNode.instanceParams.loadPath; clas=Mesh; break ; case "ShuriKenParticle3D": path=hierarchyNode.customProps.texturePath; clas=Texture2D; break ; } if (path){ var formatSubUrl=URL.formatURL(path); (urlVersion)&& (formatSubUrl=formatSubUrl+urlVersion); urls.push({url:formatSubUrl,clas:clas}); urlMap[path]=formatSubUrl; }; var children=hierarchyNode.child; for (var i=0,n=children.length;i < n;i++) Laya3D._getSprite3DHierarchyInnerUrls(children[i],urls,urlMap,urlVersion); } Laya3D._loadSprite3DHierarchy=function(loader){ var lmLoader=new Loader(); lmLoader.on(/*laya.events.Event.COMPLETE*/"complete",null,Laya3D._onSprite3DHierarchylhLoaded,[loader]); lmLoader.load(loader.url,/*laya.net.Loader.TEXT*/"text",false,null,true); } Laya3D._onSprite3DHierarchylhLoaded=function(loader,lhData){ var url=loader.url; var urlVersion=Utils3D.getURLVerion(url); var preBasePath=URL.basePath; URL.basePath=URL.getPath(URL.formatURL(url)); var urls=[]; var urlMap={}; var hierarchyData=JSON.parse(lhData); Laya3D._getSprite3DHierarchyInnerUrls(hierarchyData,urls,urlMap,urlVersion); var urlCount=urls.length; var totalProcessCount=urlCount+1; var lhWeight=1 / totalProcessCount; Laya3D._onProcessChange(loader,0,lhWeight,1.0); if (urlCount > 0){ var processHandler=Handler.create(null,Laya3D._onProcessChange,[loader,lhWeight,urlCount / totalProcessCount],false); Laya3D._innerSprite3DHierarchyLoaderManager.create(urls,Handler.create(null,Laya3D._onSprite3DMeshsLoaded,[loader,processHandler,lhData,urlMap]),processHandler); }else { Laya3D._onSprite3DMeshsLoaded(loader,null,lhData,null); } URL.basePath=preBasePath; } Laya3D._onSprite3DMeshsLoaded=function(loader,processHandler,lhData,urlMap){ loader.endLoad([lhData,urlMap]); (processHandler)&& (processHandler.recover()); } Laya3D._loadMesh=function(loader){ var lmLoader=new Loader(); lmLoader.on(/*laya.events.Event.COMPLETE*/"complete",null,Laya3D._onMeshLmLoaded,[loader]); lmLoader.load(loader.url,/*laya.net.Loader.BUFFER*/"arraybuffer",false,null,true); } Laya3D._onMeshLmLoaded=function(loader,lmData){ var url=loader.url; var urlVersion=Utils3D.getURLVerion(url); var preBasePath=URL.basePath; URL.basePath=URL.getPath(URL.formatURL(url)); var urls; var urlMap={}; var formatSubUrl; Laya3D._readData=new Byte(lmData); Laya3D._readData.pos=0; Laya3D._readData.readUTFString(); Laya3D.READ_BLOCK(); var i=0,n=0; for (i=0;i < 2;i++){ var index=Laya3D._readData.getUint16(); var blockName=Laya3D._strings[index]; var fn=Laya3D["READ_"+blockName]; if (fn==null)throw new Error("model file err,no this function:"+index+" "+blockName); if (i===1) urls=fn.call(); else fn.call() } for (i=0,n=urls.length;i < n;i++){ var subUrl=urls[i]; formatSubUrl=URL.formatURL(subUrl); (urlVersion)&& (formatSubUrl=formatSubUrl+urlVersion); urls[i]=formatSubUrl; urlMap[subUrl]=formatSubUrl; }; var urlCount=1; var totalProcessCount=urlCount+1; var lmatWeight=1 / totalProcessCount; Laya3D._onProcessChange(loader,0,lmatWeight,1.0); var processHandler=Handler.create(null,Laya3D._onProcessChange,[loader,lmatWeight,urlCount / totalProcessCount],false); Laya3D._innerMeshLoaderManager.create(urls,Handler.create(null,Laya3D._onMeshMateialLoaded,[loader,processHandler,lmData,urlMap]),processHandler,StandardMaterial); URL.basePath=preBasePath; } Laya3D._onMeshMateialLoaded=function(loader,processHandler,lmData,urlMap){ loader.endLoad([lmData,urlMap]); processHandler.recover(); } Laya3D._getMaterialTexturePath=function(path,urlVersion){ var extenIndex=path.length-4; if (path.indexOf(".dds")==extenIndex || path.indexOf(".tga")==extenIndex || path.indexOf(".exr")==extenIndex || path.indexOf(".DDS")==extenIndex || path.indexOf(".TGA")==extenIndex || path.indexOf(".EXR")==extenIndex) path=path.substr(0,extenIndex)+".png"; path=URL.formatURL(path); (urlVersion)&& (path=path+urlVersion); return path; } Laya3D._loadMaterial=function(loader){ var lmatLoader=new Loader(); lmatLoader.on(/*laya.events.Event.COMPLETE*/"complete",null,Laya3D._onMaterilLmatLoaded,[loader]); lmatLoader.load(loader.url,/*laya.net.Loader.JSON*/"json",false,null,true); } Laya3D._onMaterilLmatLoaded=function(loader,lmatData){ var url=loader.url; var urlVersion=Utils3D.getURLVerion(url); var preBasePath=URL.basePath; URL.basePath=URL.getPath(URL.formatURL(url)); var urls=[]; var urlMap={}; var customProps=lmatData.customProps; var formatSubUrl; var diffuseTexture=customProps.diffuseTexture.texture2D; if (diffuseTexture){ formatSubUrl=Laya3D._getMaterialTexturePath(diffuseTexture,urlVersion); urls.push(formatSubUrl); urlMap[diffuseTexture]=formatSubUrl; }; var normalTexture=customProps.normalTexture.texture2D; if (normalTexture){ formatSubUrl=Laya3D._getMaterialTexturePath(normalTexture,urlVersion); urls.push(formatSubUrl); urlMap[normalTexture]=formatSubUrl; }; var specularTexture=customProps.specularTexture.texture2D; if (specularTexture){ formatSubUrl=Laya3D._getMaterialTexturePath(specularTexture,urlVersion); urls.push(formatSubUrl); urlMap[specularTexture]=formatSubUrl; }; var emissiveTexture=customProps.emissiveTexture.texture2D; if (emissiveTexture){ formatSubUrl=Laya3D._getMaterialTexturePath(emissiveTexture,urlVersion); urls.push(formatSubUrl); urlMap[emissiveTexture]=formatSubUrl; }; var ambientTexture=customProps.ambientTexture.texture2D; if (ambientTexture){ formatSubUrl=Laya3D._getMaterialTexturePath(ambientTexture,urlVersion); urls.push(formatSubUrl); urlMap[ambientTexture]=formatSubUrl; }; var reflectTexture=customProps.reflectTexture.texture2D; if (reflectTexture){ formatSubUrl=Laya3D._getMaterialTexturePath(reflectTexture,urlVersion); urls.push(formatSubUrl); urlMap[reflectTexture]=formatSubUrl; }; var urlCount=urls.length; var totalProcessCount=urlCount+1; var lmatWeight=1 / totalProcessCount; Laya3D._onProcessChange(loader,0,lmatWeight,1.0); if (urlCount > 0){ var processHandler=Handler.create(null,Laya3D._onProcessChange,[loader,lmatWeight,urlCount / totalProcessCount],false); Laya3D._innerMaterialLoaderManager.create(urls,Handler.create(null,Laya3D._onMateialTexturesLoaded,[loader,processHandler,lmatData,urlMap]),processHandler,Texture2D); }else { Laya3D._onMateialTexturesLoaded(loader,null,lmatData,null); } URL.basePath=preBasePath; } Laya3D._onMateialTexturesLoaded=function(loader,processHandler,lmatData,urlMap){ loader.endLoad([lmatData,urlMap]); (processHandler)&& (processHandler.recover()); } Laya3D._loadTextureCube=function(loader){ var ltcLoader=new Loader(); ltcLoader.on(/*laya.events.Event.COMPLETE*/"complete",null,Laya3D._onTextureCubeLtcLoaded,[loader]); ltcLoader.load(loader.url,/*laya.net.Loader.JSON*/"json",false,null,true); } Laya3D._onTextureCubeLtcLoaded=function(loader,ltcData){ var preBasePath=URL.basePath; URL.basePath=URL.getPath(URL.formatURL(loader.url)); var urls=[URL.formatURL(ltcData.px),URL.formatURL(ltcData.nx),URL.formatURL(ltcData.py),URL.formatURL(ltcData.ny),URL.formatURL(ltcData.pz),URL.formatURL(ltcData.nz)]; var ltcWeight=1 / 7; Laya3D._onProcessChange(loader,0,ltcWeight,1.0); var processHandler=Handler.create(null,Laya3D._onProcessChange,[loader,ltcWeight,6 / 7],false); Laya3D._innerTextureCubeLoaderManager.load(urls,Handler.create(null,Laya3D._onTextureCubeImagesLoaded,[loader,urls,processHandler]),processHandler,"nativeimage"); URL.basePath=preBasePath; } Laya3D._onTextureCubeImagesLoaded=function(loader,urls,processHandler){ var images=[]; images.length=6; for (var i=0;i < 6;i++){ var url=urls[i]; images[i]=Loader.getRes(url); Loader.clearRes(url); } loader.endLoad(images); processHandler.recover(); } Laya3D._onProcessChange=function(loader,offset,weight,process){ var process=offset+process *weight; (process < 1.0)&& (loader.event(/*laya.events.Event.PROGRESS*/"progress",process)); } Laya3D.init=function(width,height,antialias,alpha,premultipliedAlpha){ (antialias===void 0)&& (antialias=false); (alpha===void 0)&& (alpha=false); (premultipliedAlpha===void 0)&& (premultipliedAlpha=false); if (!WebGL.enable()){ alert("Laya3D init err,must support webGL!"); return; } Laya3D._innerTextureCubeLoaderManager.maxLoader=1; Laya3D._innerMaterialLoaderManager.maxLoader=1; Laya3D._innerMeshLoaderManager.maxLoader=1; Laya3D._innerSprite3DHierarchyLoaderManager.maxLoader=1; RunDriver.changeWebGLSize=Laya3D._changeWebGLSize; Config.isAntialias=antialias; Config.isAlpha=alpha; Config.premultipliedAlpha=premultipliedAlpha; Render.is3DMode=true; Laya.init(width,height); Layer.__init__(); ShaderDefines3D.__init__(); Laya3D._initShader(); Laya3D._initResourceLoad(); } Laya3D._readData=null Laya3D.SPRITE3DHIERARCHY="SPRITE3DHIERARCHY"; Laya3D.MESH="MESH"; Laya3D.MATERIAL="MATERIAL"; Laya3D.TEXTURECUBE="TEXTURECUBE"; __static(Laya3D, ['_DATA',function(){return this._DATA={offset:0,size:0};},'_strings',function(){return this._strings=['BLOCK','DATA',"STRINGS"];},'_innerTextureCubeLoaderManager',function(){return this._innerTextureCubeLoaderManager=new LoaderManager();},'_innerMaterialLoaderManager',function(){return this._innerMaterialLoaderManager=new LoaderManager();},'_innerMeshLoaderManager',function(){return this._innerMeshLoaderManager=new LoaderManager();},'_innerSprite3DHierarchyLoaderManager',function(){return this._innerSprite3DHierarchyLoaderManager=new LoaderManager();} ]); return Laya3D; })() /** *Component3D 类用于创建组件的父类。 */ //class laya.d3.component.Component3D extends laya.events.EventDispatcher var Component3D=(function(_super){ function Component3D(){ this._id=0; this._cachedOwnerLayerMask=0; this._cachedOwnerEnable=false; this._enable=false; this._owner=null; this.started=false; Component3D.__super.call(this); this._id=Component3D._uniqueIDCounter; Component3D._uniqueIDCounter++; } __class(Component3D,'laya.d3.component.Component3D',_super); var __proto=Component3D.prototype; Laya.imps(__proto,{"laya.d3.core.render.IUpdate":true}) /** *@private *owner蒙版变化事件处理。 *@param mask 蒙版值。 */ __proto._onLayerChanged=function(layer){ this._cachedOwnerLayerMask=layer.mask; } /** *@private *owner启用变化事件处理。 *@param enable 是否启用。 */ __proto._onEnableChanged=function(enable){ this._cachedOwnerEnable=enable; } /** *@private *初始化组件。 *@param owner 所属Sprite3D节点。 */ __proto._initialize=function(owner){ this._owner=owner; this.enable=true; this.started=false; this._cachedOwnerLayerMask=owner.layer.mask; this._owner.on(/*laya.events.Event.LAYER_CHANGED*/"layerchanged",this,this._onLayerChanged); this._cachedOwnerEnable=owner.enable; this._owner.on(/*laya.events.Event.ENABLED_CHANGED*/"enabledchanged",this,this._onEnableChanged); this._load(owner); } /** *@private *卸载组件。 */ __proto._uninitialize=function(){ this._unload(this.owner); this._owner=null; } /** *@private *载入组件时执行,可重写此函数。 */ __proto._load=function(owner){} /** *@private *在任意第一次更新时执行,可重写此函数。 */ __proto._start=function(state){} /** *@private *更新组件,可重写此函数。 *@param state 渲染状态参数。 */ __proto._update=function(state){} /** *@private *更新的最后阶段执行,可重写此函数。 *@param state 渲染状态参数。 */ __proto._lateUpdate=function(state){} /** *@private *渲染前设置组件相关参数,可重写此函数。 *@param state 渲染状态参数。 */ __proto._preRenderUpdate=function(state){} /** *@private *渲染的最后阶段执行,可重写此函数。 *@param state 渲染状态参数。 */ __proto._postRenderUpdate=function(state){} /** *@private *卸载组件时执行,可重写此函数。 */ __proto._unload=function(owner){ this.offAll(); } /** *获取唯一标识ID。 *@return 唯一标识ID。 */ __getset(0,__proto,'id',function(){ return this._id; }); /** *获取所属Sprite3D节点。 *@return 所属Sprite3D节点。 */ __getset(0,__proto,'owner',function(){ return this._owner; }); /** *设置是否启用。 *@param value 是否启动 */ /** *获取是否启用。 *@return 是否启动。 */ __getset(0,__proto,'enable',function(){ return this._enable; },function(value){ if (this._enable!==value){ this._enable=value; this.event(/*laya.events.Event.ENABLED_CHANGED*/"enabledchanged",this._enable); } }); /** *获取是否激活。 *@return 是否激活。 */ __getset(0,__proto,'isActive',function(){ return Layer.isActive(this._cachedOwnerLayerMask)&& this._cachedOwnerEnable && this._enable; }); /** *获取是否可见。 *@return 是否可见。 */ __getset(0,__proto,'isVisible',function(){ return Layer.isVisible(this._cachedOwnerLayerMask)&& this._cachedOwnerEnable && this._enable; }); Component3D._uniqueIDCounter=1; return Component3D; })(EventDispatcher) /** *Render 类用于渲染器的父类,抽象类不允许示例。 */ //class laya.d3.core.render.BaseRender extends laya.events.EventDispatcher var BaseRender=(function(_super){ function BaseRender(owner){ this._owner=null; this._enable=false; this._renderObject=null; this._materials=null; this._boundingSphereNeedChange=false; this._boundingBoxNeedChange=false; this._boundingSphere=null; this._boundingBox=null; BaseRender.__super.call(this); this._owner=owner; this._enable=true; this._boundingBox=new BoundBox(new Vector3(),new Vector3()); this._boundingSphere=new BoundSphere(new Vector3(),0); this._boundingSphereNeedChange=true; this._boundingBoxNeedChange=true; this._renderObject=new RenderObject(); this._renderObject._render=this; this._renderObject._layerMask=this._owner.layer.mask; this._renderObject._ownerEnable=this._owner.enable; this._renderObject._enable=this._enable; this._materials=[]; this._owner.transform.on(/*laya.events.Event.WORLDMATRIX_NEEDCHANGE*/"worldmatrixneedchanged",this,this._onWorldMatNeedChange); this._owner.on(/*laya.events.Event.LAYER_CHANGED*/"layerchanged",this,this._onOwnerLayerChanged); this._owner.on(/*laya.events.Event.ENABLED_CHANGED*/"enabledchanged",this,this._onOwnerEnableChanged); this.on(/*laya.events.Event.ENABLED_CHANGED*/"enabledchanged",this,this._onEnableChanged); } __class(BaseRender,'laya.d3.core.render.BaseRender',_super); var __proto=BaseRender.prototype; Laya.imps(__proto,{"laya.resource.IDestroy":true}) /** *@private */ __proto._onWorldMatNeedChange=function(){ this._boundingSphereNeedChange=true; this._boundingBoxNeedChange=true; } /** *@private */ __proto._onOwnerLayerChanged=function(layer){ this._renderObject._layerMask=layer.mask; } /** *@private */ __proto._onOwnerEnableChanged=function(enable){ this._renderObject._ownerEnable=enable; } /** *@private */ __proto._onEnableChanged=function(sender,enable){ this._renderObject._enable=enable; } /** *@private */ __proto._calculateBoundingSphere=function(){ throw("BaseRender: must override it."); } /** *@private */ __proto._calculateBoundingBox=function(){ throw("BaseRender: must override it."); } /** *@private */ __proto._destroy=function(){ this.offAll(); this._owner=null; this._renderObject=null; this._materials=null; this._boundingBox=null; this._boundingSphere=null; } /** *设置是否可用。 *@param value 是否可用。 */ /** *获取是否可用。 *@return 是否可用。 */ __getset(0,__proto,'enable',function(){ return this._enable; },function(value){ this._enable=value; this.event(/*laya.events.Event.ENABLED_CHANGED*/"enabledchanged",[this,value]); }); /** *获取包围盒。 *@return 包围盒。 */ __getset(0,__proto,'boundingBox',function(){ if (this._boundingBoxNeedChange){ this._calculateBoundingBox(); this._boundingBoxNeedChange=false; } return this._boundingBox; }); /** *设置材质列表。 *@param value 材质列表。 */ /** *获取浅拷贝材质列表。 *@return 浅拷贝材质列表。 */ __getset(0,__proto,'sharedMaterials',function(){ var materials=this._materials.slice(); return materials; },function(value){ if (!value) throw new Error("MeshRender: shadredMaterials value can't be null."); this._materials=value; for (var i=0,n=value.length;iMeshFilter 类用于创建网格过滤器。 */ //class laya.d3.core.MeshFilter extends laya.events.EventDispatcher var MeshFilter=(function(_super){ function MeshFilter(owner){ this._owner=null; this._sharedMesh=null; MeshFilter.__super.call(this); this._owner=owner; } __class(MeshFilter,'laya.d3.core.MeshFilter',_super); var __proto=MeshFilter.prototype; Laya.imps(__proto,{"laya.resource.IDestroy":true}) /** *@private */ __proto._destroy=function(){ this.offAll(); this._owner=null; this._sharedMesh=null; } /** *设置共享网格。 *@return value 共享网格。 */ /** *获取共享网格。 *@return 共享网格。 */ __getset(0,__proto,'sharedMesh',function(){ return this._sharedMesh; },function(value){ var oldMesh=this._sharedMesh; this._sharedMesh=value; this.event(/*laya.events.Event.MESH_CHANGED*/"meshchanged",[this,oldMesh,value]); }); return MeshFilter; })(EventDispatcher) /** *Emission 类用于粒子发射器。 */ //class laya.d3.core.particleShuriKen.module.Emission extends laya.events.EventDispatcher var Emission=(function(_super){ function Emission(){ this._burstsIndex=0; this._bursts=null; this._startDelay=NaN; this._isPlaying=false; this._isPaused=false; this._frameTime=NaN; this._emissionTime=NaN; this._playbackTime=NaN; this._minEmissionTime=NaN; this._emissionRate=0; this._particleSystem=null; this._shape=null; this.enbale=false; Emission.__super.call(this); this._burstsIndex=0; this._isPlaying=false; this._isPaused=false; this._frameTime=0; this._emissionTime=0; this._playbackTime=0; this.emissionRate=10; this._bursts=[]; } __class(Emission,'laya.d3.core.particleShuriKen.module.Emission',_super); var __proto=Emission.prototype; Laya.imps(__proto,{"laya.resource.IDestroy":true}) /** *@private */ __proto._burst=function(fromTime,toTime){ var totalEmitCount=0; for (var n=this._bursts.length;this._burstsIndex < n;this._burstsIndex++){ var burst=this._bursts[this._burstsIndex]; var burstTime=burst.time; if (burstTime >=fromTime && burstTime <=toTime){ var emitCount=MathUtil.lerp(burst.minCount,burst.maxCount,Math.random()); totalEmitCount+=emitCount; }else { break ; } } return totalEmitCount; } /** *@private */ __proto._advanceTime=function(elapsedTime,transform){ if (!this._isPlaying || this._isPaused) return; this._playbackTime+=elapsedTime; if (this._playbackTime < this._startDelay) return; var i=0; var lastEmissionTime=this._emissionTime; this._emissionTime+=elapsedTime; var duration=this._particleSystem.duration; var totalBurstCount=0; if (this._emissionTime > duration){ totalBurstCount+=this._burst(lastEmissionTime,duration); if (this._particleSystem.looping){ this._emissionTime-=duration; this.event(/*laya.events.Event.COMPLETE*/"complete"); this._burstsIndex=0; totalBurstCount+=this._burst(0,this._emissionTime); }else { this._isPlaying=false; totalBurstCount=Math.min(this._particleSystem.maxParticles-this._particleSystem.aliveParticleCount,totalBurstCount); for (i=0;i < totalBurstCount;i++) this.emit(transform); this.event(/*laya.events.Event.STOPPED*/"stopped"); return; } }else { totalBurstCount+=this._burst(lastEmissionTime,this._emissionTime); } totalBurstCount=Math.min(this._particleSystem.maxParticles-this._particleSystem.aliveParticleCount,totalBurstCount); for (i=0;i < totalBurstCount;i++) this.emit(transform); this._frameTime+=elapsedTime; if (this._frameTime < this._minEmissionTime) return; while (this._frameTime > this._minEmissionTime){ if (this.emit(transform)) this._frameTime-=this._minEmissionTime; else break ; } } /** *@private */ __proto._destroy=function(){ this.offAll(); this._bursts=null; this._particleSystem=null; } /** *开始发射粒子。 */ __proto.play=function(){ this._burstsIndex=0; this._isPlaying=true; this._isPaused=false; this._frameTime=0; this._emissionTime=0; this._playbackTime=0; switch (this._particleSystem.startDelayType){ case 0: this._startDelay=this._particleSystem.startDelay; break ; case 1: this._startDelay=MathUtil.lerp(this._particleSystem.startDelayMin,this._particleSystem.startDelayMax,Math.random()); break ; default : throw new Error("Utils3D: startDelayType is invalid."); } this._particleSystem._startUpdateLoopCount=Stat.loopCount; this.event(/*laya.events.Event.PLAYED*/"played"); } /** *暂停发射粒子。 */ __proto.pause=function(){ this._isPaused=true; this.event(/*laya.events.Event.PAUSED*/"paused"); } /** *停止发射粒子。 */ __proto.stop=function(){ this._burstsIndex=0; this._frameTime=0; this._isPlaying=false; this._isPaused=false; this._emissionTime=0; this._playbackTime=0; this.event(/*laya.events.Event.STOPPED*/"stopped"); } /** *获取粒子爆裂个数。 *@return 粒子爆裂个数。 */ __proto.getBurstsCount=function(){ return this._bursts.length; } /** *通过索引获取粒子爆裂。 *@param index 爆裂索引。 *@return 粒子爆裂。 */ __proto.getBurstByIndex=function(index){ return this._bursts[index]; } /** *增加粒子爆裂。 *@param burst 爆裂。 */ __proto.addBurst=function(burst){ var burstsCount=this._bursts.length; if (burstsCount > 0) for (var i=0;i < burstsCount;i++){ if (this._bursts[i].time > burst.time) this._bursts.splice(i,0,burst); } else this._bursts.push(burst); } /** *移除粒子爆裂。 *@param burst 爆裂。 */ __proto.removeBurst=function(burst){ var index=this._bursts.indexOf(burst); if (index!==-1){ this._bursts.splice(index,1); var maxBurstsIndex=this._bursts.length; if (this._burstsIndex > maxBurstsIndex) this._burstsIndex=maxBurstsIndex; } } /** *通过索引移除粒子爆裂。 *@param index 爆裂索引。 */ __proto.removeBurstByIndex=function(index){ this._bursts.splice(index,1); var maxBurstsIndex=this._bursts.length; if (this._burstsIndex > maxBurstsIndex) this._burstsIndex=maxBurstsIndex; } /** *清空粒子爆裂。 */ __proto.clearBurst=function(){ this._burstsIndex=0; this._bursts.length=0; } /** *更新球粒子发射器。 *@param state 渲染相关状态参数。 */ __proto.update=function(elapsedTime,transform){ (this.enbale)&& (this._advanceTime(elapsedTime,transform)); } /** *发射一个粒子。 */ __proto.emit=function(transform){ var position=Emission._tempPosition; var direction=Emission._tempDirection; if (this._shape.enbale){ this._shape.generatePositionAndDirection(position,direction); }else { var positionE=position.elements; var directionE=direction.elements; positionE[0]=positionE[1]=positionE[2]=0; directionE[0]=directionE[1]=0; directionE[2]=1; } return this._particleSystem.addParticle(position,direction,transform); } /** *获取播放的累计时间。 *@return 播放的累计时间。 */ __getset(0,__proto,'playbackTime',function(){ return this._playbackTime; }); /**是否正在播放。*/ __getset(0,__proto,'isPlaying',function(){ return this._isPlaying; }); /**是否已暂停。*/ __getset(0,__proto,'isPaused',function(){ return this._isPaused; }); /** *获取一次循环内的累计时间。 *@return 一次循环内的累计时间。 */ __getset(0,__proto,'emissionTime',function(){ var duration=this._particleSystem.duration; return this._emissionTime > duration ? duration :this._emissionTime; }); /** *设置粒子发射速率。 *@param emissionRate 粒子发射速率 (个/秒)。 */ /** *获取粒子发射速率。 *@return 粒子发射速率 (个/秒)。 */ __getset(0,__proto,'emissionRate',function(){ return this._emissionRate; },function(value){ if (value < 0) throw new Error("ParticleBaseShape:emissionRate value must large or equal than 0."); this._emissionRate=value; if (value===0) this._minEmissionTime=2147483647; else this._minEmissionTime=1 / value; }); __static(Emission, ['_tempPosition',function(){return this._tempPosition=new Vector3();},'_tempDirection',function(){return this._tempDirection=new Vector3();} ]); return Emission; })(EventDispatcher) /** *Transform3D 类用于实现3D变换。 */ //class laya.d3.core.Transform3D extends laya.events.EventDispatcher var Transform3D=(function(_super){ function Transform3D(owner){ this._owner=null; this._preWorldTransformModifyID=-1; this._localUpdate=false; this._worldUpdate=true; this._parent=null; Transform3D.__super.call(this); this._tempMatrix0=new Matrix4x4(); this._tempQuaternion0=new Quaternion(); this._tempVector30=new Vector3(); this._localPosition=new Vector3(); this._localRotation=new Quaternion(0,0,0,1); this._localScale=new Vector3(1,1,1); this._localMatrix=new Matrix4x4(); this._position=new Vector3(); this._rotation=new Quaternion(0,0,0,1); this._scale=new Vector3(1,1,1); this._worldMatrix=new Matrix4x4(); this._forward=new Vector3(); this._up=new Vector3(); this._right=new Vector3(); this._owner=owner; } __class(Transform3D,'laya.d3.core.Transform3D',_super); var __proto=Transform3D.prototype; /** *@private */ __proto._updateLocalMatrix=function(){ Matrix4x4.createAffineTransformation(this._localPosition,this._localRotation,this._localScale,this._localMatrix); } /** *@private */ __proto._onLocalTransform=function(){ this._localUpdate=true; } /** *@private */ __proto._onWorldTransform=function(){ if (!this._worldUpdate){ this._worldUpdate=true; this.event(/*laya.events.Event.WORLDMATRIX_NEEDCHANGE*/"worldmatrixneedchanged"); for (var i=0,n=this._owner._childs.length;i < n;i++) (this._owner._childs [i]).transform._onWorldTransform(); } } /** *平移变换。 *@param translation 移动距离。 *@param isLocal 是否局部空间。 */ __proto.translate=function(translation,isLocal){ (isLocal===void 0)&& (isLocal=true); if (isLocal){ Matrix4x4.createFromQuaternion(this.localRotation,this._tempMatrix0); Vector3.transformCoordinate(translation,this._tempMatrix0,this._tempVector30); Vector3.add(this.localPosition,this._tempVector30,this._localPosition); this.localPosition=this._localPosition; }else { Vector3.add(this.position,translation,this._position); this.position=this._position; } } /** *旋转变换。 *@param rotations 旋转幅度。 *@param isLocal 是否局部空间。 *@param isRadian 是否弧度制。 */ __proto.rotate=function(rotation,isLocal,isRadian){ (isLocal===void 0)&& (isLocal=true); (isRadian===void 0)&& (isRadian=true); var rot; if (!isRadian){ Vector3.scale(rotation,Math.PI / 180,this._tempVector30); rot=this._tempVector30; }else { rot=rotation; } Quaternion.createFromYawPitchRoll(rot.y,rot.x,rot.z,this._tempQuaternion0); if (isLocal){ Quaternion.multiply(this._localRotation,this._tempQuaternion0,this._localRotation); this.localRotation=this._localRotation; }else { Quaternion.multiply(this._tempQuaternion0,this.rotation,this._rotation); this.rotation=this._rotation; } } /** *设置局部旋转。 *@param value 局部旋转。 */ /** *获取局部旋转。 *@return 局部旋转。 */ __getset(0,__proto,'localRotation',function(){ return this._localRotation; },function(value){ this._localRotation=value; this._localRotation.normalize(this._localRotation); this._onLocalTransform(); this._onWorldTransform(); }); /** *设置世界矩阵。 *@param value 世界矩阵。 */ /** *获取世界矩阵。 *@return 世界矩阵。 */ __getset(0,__proto,'worldMatrix',function(){ if (!this._worldUpdate) return this._worldMatrix; if (this._parent !=null) Matrix4x4.multiply(this._parent.worldMatrix,this.localMatrix,this._worldMatrix); else this.localMatrix.cloneTo(this._worldMatrix); this._worldUpdate=false; return this._worldMatrix; },function(value){ if (this._parent===null) this.localMatrix=value; else { this._parent.worldMatrix.invert(this._localMatrix); Matrix4x4.multiply(this._localMatrix,value,this._localMatrix); this.localMatrix=this._localMatrix; } }); /** *获取世界矩阵是否需要更新。 *@return 世界矩阵是否需要更新。 */ __getset(0,__proto,'worldNeedUpdate',function(){ return this._worldUpdate; }); /** *设置局部矩阵。 *@param value 局部矩阵。 */ /** *获取局部矩阵。 *@return 局部矩阵。 */ __getset(0,__proto,'localMatrix',function(){ if (this._localUpdate){ this._updateLocalMatrix(); this._localUpdate=false; } return this._localMatrix; },function(value){ this._localMatrix=value; this._localMatrix.decompose(this._localPosition,this._localRotation,this._localScale); this._onWorldTransform(); }); /** *设置局部位置。 *@param value 局部位置。 */ /** *获取局部位置。 *@return 局部位置。 */ __getset(0,__proto,'localPosition',function(){ return this._localPosition; },function(value){ this._localPosition=value; this._onLocalTransform(); this._onWorldTransform(); }); /** *设置局部缩放。 *@param value 局部缩放。 */ /** *获取局部缩放。 *@return 局部缩放。 */ __getset(0,__proto,'localScale',function(){ return this._localScale; },function(value){ this._localScale=value; this._onLocalTransform(); this._onWorldTransform(); }); /** *设置世界位置。 *@param value 世界位置。 */ /** *获取世界位置。 *@return 世界位置。 */ __getset(0,__proto,'position',function(){ if (this._parent!==null){ var worldMatElem=this.worldMatrix.elements; this._position.elements[0]=worldMatElem[12]; this._position.elements[1]=worldMatElem[13]; this._position.elements[2]=worldMatElem[14]; }else { this._localPosition.cloneTo(this._position); } return this._position; },function(value){ if (this._parent!==null){ this._parent.worldMatrix.invert(this._tempMatrix0); Vector3.transformCoordinate(value,this._tempMatrix0,this._localPosition); this.localPosition=this._localPosition; }else { value.cloneTo(this._localPosition); this.localPosition=this._localPosition; } }); /** *设置世界旋转。 *@param value 世界旋转。 */ /** *获取世界旋转。 *@return 世界旋转。 */ __getset(0,__proto,'rotation',function(){ if (this._parent!==null){ this.worldMatrix.decompose(this._position,this._rotation,this._scale); }else { this._localRotation.cloneTo(this._rotation); } return this._rotation; },function(value){ if (this._parent!==null){ this._parent.rotation.invert(this._tempQuaternion0); Quaternion.multiply(value,this._tempQuaternion0,this._localRotation); this.localRotation=this._localRotation; }else { value.cloneTo(this._localRotation); this.localRotation=this._localRotation; } }); /** *设置局部空间的旋转角度。 *@param value 欧拉角的旋转值,顺序为x、y、z。 */ __getset(0,__proto,'localRotationEuler',null,function(value){ Quaternion.createFromYawPitchRoll(value.y,value.x,value.z,this._localRotation); this._onLocalTransform(); this._onWorldTransform(); }); /** *获取世界缩放。 *@return 世界缩放。 */ __getset(0,__proto,'scale',function(){ if (this._parent!==null){ Vector3.multiply(this._parent.scale,this._localScale,this._scale); }else { this._localScale.cloneTo(this._scale); } return this._scale; }); /** *设置局部空间的旋转角度。 *@param 欧拉角的旋转值,顺序为x、y、z。 */ __getset(0,__proto,'rotationEuler',null,function(value){ Quaternion.createFromYawPitchRoll(value.y,value.x,value.z,this._rotation); this.rotation=this._rotation; }); /** *获取向前方向。 *@return 向前方向。 */ __getset(0,__proto,'forward',function(){ var worldMatElem=this.worldMatrix.elements; this._forward.elements[0]=-worldMatElem[8]; this._forward.elements[1]=-worldMatElem[9]; this._forward.elements[2]=-worldMatElem[10]; return this._forward; }); /** *获取向上方向。 *@return 向上方向。 */ __getset(0,__proto,'up',function(){ var worldMatElem=this.worldMatrix.elements; this._up.elements[0]=worldMatElem[4]; this._up.elements[1]=worldMatElem[5]; this._up.elements[2]=worldMatElem[6]; return this._up; }); /** *获取向右方向。 *@return 向右方向。 */ __getset(0,__proto,'right',function(){ var worldMatElem=this.worldMatrix.elements; this._right.elements[0]=worldMatElem[0]; this._right.elements[1]=worldMatElem[1]; this._right.elements[2]=worldMatElem[2]; return this._right; }); /** *设置父3D变换。 *@param value 父3D变换。 */ __getset(0,__proto,'parent',null,function(value){ this._parent=value; this._onWorldTransform(); }); return Transform3D; })(EventDispatcher) /** *TransformUV 类用于实现UV变换。 */ //class laya.d3.core.TransformUV extends laya.events.EventDispatcher var TransformUV=(function(_super){ function TransformUV(){ this._rotation=0; this._matNeedUpdte=false; TransformUV.__super.call(this); this._tempTitlingV3=new Vector3(); this._tempRotationMatrix=new Matrix4x4(); this._tempTitlingMatrix=new Matrix4x4(); this._matrix=new Matrix4x4(); this._offset=new Vector2(); this._tiling=new Vector2(); } __class(TransformUV,'laya.d3.core.TransformUV',_super); var __proto=TransformUV.prototype; /** *@private */ __proto._updateMatrix=function(){ this._tempTitlingV3.elements[0]=this._tiling.x; this._tempTitlingV3.elements[1]=this._tiling.y; this._tempTitlingV3.elements[2]=1; Matrix4x4.createScaling(this._tempTitlingV3,this._tempTitlingMatrix); Matrix4x4.createRotationZ(this._rotation,this._tempRotationMatrix); Matrix4x4.multiply(this._tempRotationMatrix,this._tempTitlingMatrix,this._matrix); var mate=this._matrix.elements; mate[12]=this._offset.x; mate[13]=this._offset.y; mate[14]=0; } /** *获取变换矩阵。 *@return 变换矩阵。 */ __getset(0,__proto,'matrix',function(){ if (this._matNeedUpdte){ this._updateMatrix(); this._matNeedUpdte=false; } return this._matrix; }); /** *设置平铺次数。 *@param value 平铺次数。 */ /** *获取平铺次数。 *@return 平铺次数。 */ __getset(0,__proto,'tiling',function(){ return this._tiling; },function(value){ this._tiling=value; this._matNeedUpdte=true; }); /** *设置偏移。 *@param value 偏移。 */ /** *获取偏移。 *@return 偏移。 */ __getset(0,__proto,'offset',function(){ return this._offset; },function(value){ this._offset=value; this._matNeedUpdte=true; }); /** *设置旋转。 *@param value 旋转。 */ /** *获取旋转。 *@return 旋转。 */ __getset(0,__proto,'rotation',function(){ return this._rotation; },function(value){ this._rotation=value; this._matNeedUpdte=true; }); return TransformUV; })(EventDispatcher) /** *@private *GlitterTemplet 类用于创建闪光数据模板。 */ //class laya.d3.resource.tempelet.GlitterTemplet extends laya.events.EventDispatcher var GlitterTemplet=(function(_super){ function GlitterTemplet(owner){ this._floatCountPerVertex=6; this._owner=null; this._vertices=null; this._vertexBuffer=null; this._firstActiveElement=0; this._firstNewElement=0; this._firstFreeElement=0; this._firstRetiredElement=0; this._currentTime=NaN; this._drawCounter=0; this.scLeft=null; this.scRight=null; this._numPositionMode=0; this._numPositionVelocityMode=0; this._lastTime=NaN; this._needPatch=false; this._lastPatchAddPos0=null; this._lastPatchAddPos1=null; this._lastPatchAddTime=NaN; this.lifeTime=NaN; this.minSegmentDistance=NaN; this.minInterpDistance=NaN; this.maxSlerpCount=0; this.color=null; this._maxSegments=0; GlitterTemplet.__super.call(this); this._tempVector0=new Vector3(); this._tempVector1=new Vector3(); this._tempVector2=new Vector3(); this._tempVector3=new Vector3(); this._albedo=new Vector4(1.0,1.0,1.0,1.0); this._posModeLastPosition0=new Vector3(); this._posModeLastPosition1=new Vector3(); this._posModePosition0=new Vector3(); this._posModePosition1=new Vector3(); this._posVelModePosition0=new Vector3(); this._posVelModeVelocity0=new Vector3(); this._posVelModePosition1=new Vector3(); this._posVelModeVelocity1=new Vector3(); this._owner=owner; this._lastTime=0 this._firstActiveElement=0; this._firstNewElement=0; this._firstFreeElement=0; this._firstRetiredElement=0; this._currentTime=0; this._drawCounter=0; this._needPatch=false; this._lastPatchAddPos0=new Vector3(); this._lastPatchAddPos1=new Vector3(); this.scLeft=new SplineCurvePositionVelocity(); this.scRight=new SplineCurvePositionVelocity(); this.lifeTime=0.5; this.minSegmentDistance=0.1; this.minInterpDistance=0.6; this.maxSlerpCount=128; this.color=new Vector4(1.0,1.0,1.0,1.0); this._maxSegments=200; this._owner.on(/*laya.events.Event.ENABLED_CHANGED*/"enabledchanged",this,this._onEnableChanged); } __class(GlitterTemplet,'laya.d3.resource.tempelet.GlitterTemplet',_super); var __proto=GlitterTemplet.prototype; Laya.imps(__proto,{"laya.d3.core.render.IRenderable":true}) __proto._getVertexBuffer=function(index){ (index===void 0)&& (index=0); if (index===0) return this._vertexBuffer; else return null; } __proto._getIndexBuffer=function(){ return null; } /** *@private */ __proto._initialize=function(){ this._vertexBuffer=VertexBuffer3D.create(VertexGlitter.vertexDeclaration,this.maxSegments *2,/*laya.webgl.WebGLContext.DYNAMIC_DRAW*/0x88E8); this._vertices=new Float32Array(this.maxSegments *this._floatCountPerVertex *2); } __proto._onEnableChanged=function(enable){ if (!enable){ this._numPositionMode=0; this._numPositionVelocityMode=0; this._firstActiveElement=0; this._firstNewElement=0; this._firstFreeElement=0; this._firstRetiredElement=0; this._currentTime=0; this._drawCounter=0; } } /** *@private */ __proto._updateTextureCoordinates=function(){ if (this._firstActiveElement < this._firstFreeElement){ this._updateSubTextureCoordinates(this._firstActiveElement,(this._firstFreeElement-this._firstActiveElement)*2); }else { this._updateSubTextureCoordinates(this._firstActiveElement,(this.maxSegments-this._firstActiveElement)*2); if (this._firstFreeElement > 0) this._updateSubTextureCoordinates(0,this._firstFreeElement *2); } } /** *@private */ __proto._updateSubTextureCoordinates=function(start,count){ var startOffset=start *2; for (var i=0;i < count;i+=2){ var vertexOffset=startOffset+i; var upVertexOffset=vertexOffset *this._floatCountPerVertex; var downVertexOffset=(vertexOffset+1)*this._floatCountPerVertex; this._vertices[upVertexOffset+3]=this._vertices[downVertexOffset+3]=(this._vertices[upVertexOffset+5]-this._currentTime)/ this.lifeTime; } } /** *@private */ __proto._retireActiveGlitter=function(){ var particleDuration=this.lifeTime; var _floatCountOneSegement=this._floatCountPerVertex *2; while (this._firstActiveElement !=this._firstNewElement){ var index=this._firstActiveElement *_floatCountOneSegement+5; var particleAge=this._currentTime-this._vertices[index]; if (particleAge < particleDuration) break ; this._vertices[index]=this._drawCounter; this._firstActiveElement++; if (this._firstActiveElement >=this.maxSegments) this._firstActiveElement=0; } } /** *@private */ __proto._freeRetiredGlitter=function(){ var _floatCountOneSegement=this._floatCountPerVertex *2; while (this._firstRetiredElement !=this._firstActiveElement){ var age=this._drawCounter-this._vertices[this._firstRetiredElement *_floatCountOneSegement+5]; if (age < 3) break ; this._firstRetiredElement++; if (this._firstRetiredElement >=this.maxSegments) this._firstRetiredElement=0; } } /** *@private */ __proto._calcVelocity=function(left,right,out){ Vector3.subtract(left,right,out); Vector3.scale(out,0.5,out); } /** *@private */ __proto._addNewGlitterSegementToVertexBuffer=function(){ var start=0; if (this._firstActiveElement < this._firstFreeElement){ start=this._firstActiveElement *2 *this._floatCountPerVertex; this._vertexBuffer.setData(this._vertices,start,start,(this._firstFreeElement-this._firstActiveElement)*2 *this._floatCountPerVertex); }else { start=this._firstActiveElement *2 *this._floatCountPerVertex; this._vertexBuffer.setData(this._vertices,start,start,(this.maxSegments-this._firstActiveElement)*2 *this._floatCountPerVertex); if (this._firstFreeElement > 0){ this._vertexBuffer.setData(this._vertices,0,0,this._firstFreeElement *2 *this._floatCountPerVertex); } } this._firstNewElement=this._firstFreeElement; } /** *@private */ __proto._addGlitter=function(position0,position1,time){ if (this._needPatch){ this._needPatch=false; this._addGlitter(this._lastPatchAddPos0,this._lastPatchAddPos1,this._lastPatchAddTime); }; var nextFreeParticle=this._firstFreeElement+1; if (nextFreeParticle >=this.maxSegments){ nextFreeParticle=0; position0.cloneTo(this._lastPatchAddPos0); position1.cloneTo(this._lastPatchAddPos1); this._lastPatchAddTime=time; this._needPatch=true; } if (nextFreeParticle===this._firstRetiredElement) throw new Error("GlitterTemplet:current segement count have large than maxSegments,please adjust the value of maxSegments or add Glitter Vertex Frequency."); var position0e=position0.elements; var position1e=position1.elements; var j=0; var positionIndex=this._firstFreeElement *this._floatCountPerVertex *2; for (j=0;j < 3;j++) this._vertices[positionIndex+j]=position0e[j]; this._vertices[positionIndex+3]=0.0; this._vertices[positionIndex+4]=0.0; this._vertices[positionIndex+5]=time; var nextPositionIndex=positionIndex+this._floatCountPerVertex; for (j=0;j < 3;j++) this._vertices[nextPositionIndex+j]=position1e[j]; this._vertices[nextPositionIndex+3]=0.0; this._vertices[nextPositionIndex+4]=1.0; this._vertices[nextPositionIndex+5]=time; this._firstFreeElement=nextFreeParticle; } /** *@private *更新闪光。 *@param elapsedTime 间隔时间 */ __proto._update=function(elapsedTime){ this._currentTime+=elapsedTime / 1000; this._retireActiveGlitter(); this._freeRetiredGlitter(); if (this._firstActiveElement==this._firstFreeElement) this._currentTime=0; if (this._firstRetiredElement==this._firstActiveElement) this._drawCounter=0; this._updateTextureCoordinates(); } //实时更新纹理坐标 __proto._beforeRender=function(state){ if (this._firstNewElement !=this._firstFreeElement){ this._addNewGlitterSegementToVertexBuffer(); } this._drawCounter++; if (this._firstActiveElement !=this._firstFreeElement){ this._vertexBuffer.bindWithIndexBuffer(null); return true; } return false; } /** *@private *渲染闪光。 *@param state 相关渲染状态 */ __proto._render=function(state){ var drawVertexCount=0; var glContext=WebGL.mainContext; if (this._firstActiveElement < this._firstFreeElement){ drawVertexCount=(this._firstFreeElement-this._firstActiveElement)*2; glContext.drawArrays(/*laya.webgl.WebGLContext.TRIANGLE_STRIP*/0x0005,this._firstActiveElement *2,drawVertexCount); Stat.trianglesFaces+=drawVertexCount-2; Stat.drawCall++; }else { drawVertexCount=(this.maxSegments-this._firstActiveElement)*2; glContext.drawArrays(/*laya.webgl.WebGLContext.TRIANGLE_STRIP*/0x0005,this._firstActiveElement *2,drawVertexCount); Stat.trianglesFaces+=drawVertexCount-2; Stat.drawCall++; if (this._firstFreeElement > 0){ drawVertexCount=this._firstFreeElement *2; glContext.drawArrays(/*laya.webgl.WebGLContext.TRIANGLE_STRIP*/0x0005,0,drawVertexCount); Stat.trianglesFaces+=drawVertexCount-2; Stat.drawCall++; } } } /** *通过位置添加刀光。 *@param position0 位置0。 *@param position1 位置1。 */ __proto.addVertexPosition=function(position0,position1){ if (this._owner.enable){ if (this._numPositionMode < 2){ if (this._numPositionMode===0){ position0.cloneTo(this._posModeLastPosition0); position1.cloneTo(this._posModeLastPosition1); }else { position0.cloneTo(this._posModePosition0); position1.cloneTo(this._posModePosition1); } this._numPositionMode++; }else { var v0=this._tempVector2; this._calcVelocity(position0,this._posModeLastPosition0,v0); var v1=this._tempVector3; this._calcVelocity(position1,this._posModeLastPosition1,v1); this.addVertexPositionVelocity(this._posModePosition0,v0,this._posModePosition1,v1); this._posModePosition0.cloneTo(this._posModeLastPosition0); this._posModePosition1.cloneTo(this._posModeLastPosition1); position0.cloneTo(this._posModePosition0); position1.cloneTo(this._posModePosition1); } } } /** *通过位置和速度添加刀光。 *@param position0 位置0。 *@param velocity0 速度0。 *@param position1 位置1。 *@param velocity1 速度1。 */ __proto.addVertexPositionVelocity=function(position0,velocity0,position1,velocity1){ if (this._owner.enable){ if (this._numPositionVelocityMode===0){ this._numPositionVelocityMode++; }else { var d=this._tempVector0; Vector3.subtract(position0,this._posVelModePosition0,d); var distance0=Vector3.scalarLength(d); Vector3.subtract(position1,this._posVelModePosition1,d); var distance1=Vector3.scalarLength(d); var slerpCount=0; var minSegmentDistance=minSegmentDistance; if (distance0 < minSegmentDistance && distance1 < minSegmentDistance) return; slerpCount=1+Math.floor(Math.max(distance0,distance1)/ this.minInterpDistance); if (slerpCount===1){ this._addGlitter(position0,position1,this._currentTime); }else { slerpCount=Math.min(slerpCount,this.maxSlerpCount); this.scLeft.Init(this._posVelModePosition0,this._posVelModeVelocity0,position0,velocity0); this.scRight.Init(this._posVelModePosition1,this._posVelModeVelocity1,position1,velocity1); var segment=1.0 / slerpCount; var addSegment=segment; var timeOffset=this._currentTime-this._lastTime; for (var i=1;i <=slerpCount;i++){ var pos0=this._tempVector0; this.scLeft.Slerp(addSegment,pos0); var pos1=this._tempVector1; this.scRight.Slerp(addSegment,pos1); var time=this._lastTime+timeOffset *i / slerpCount; this._addGlitter(pos0,pos1,time); addSegment+=segment; } } } this._lastTime=this._currentTime; position0.cloneTo(this._posVelModePosition0); velocity0.cloneTo(this._posVelModeVelocity0); position1.cloneTo(this._posVelModePosition1); velocity1.cloneTo(this._posVelModeVelocity1); } } __proto.dispose=function(){ this._owner.off(/*laya.events.Event.ENABLED_CHANGED*/"enabledchanged",this,this._onEnableChanged); } /**设置最大分段数,注意:谨慎修改此属性,有性能损耗。*/ /**获取最大分段数。*/ __getset(0,__proto,'maxSegments',function(){ return this._maxSegments-1; },function(value){ var newMaxSegments=value+1; if (newMaxSegments!==this._maxSegments){ this._maxSegments=newMaxSegments; if (this._vertexBuffer){ this._vertexBuffer.dispose(); } this._initialize(); } }); __getset(0,__proto,'indexOfHost',function(){ return 0; }); __getset(0,__proto,'_vertexBufferCount',function(){ return 1; }); __getset(0,__proto,'triangleCount',function(){ var drawVertexCount=0; if (this._firstActiveElement < this._firstFreeElement){ drawVertexCount=(this._firstFreeElement-this._firstActiveElement)*2-2; }else { drawVertexCount=(this.maxSegments-this._firstActiveElement)*2-2; drawVertexCount+=this._firstFreeElement *2-2; } return drawVertexCount; }); return GlitterTemplet; })(EventDispatcher) /** *EmitterBox 类用于盒发射器。 */ //class laya.d3.core.particle.EmitterBox extends laya.particle.emitter.EmitterBase var EmitterBox=(function(_super){ function EmitterBox(particle3D){ this._settings=null; this._particle3D=null; EmitterBox.__super.call(this); this._resultPosition=new Vector3(); this._resultVelocity=new Vector3(); this.centerPosition=new Vector3(); this.size=new Vector3(); this.velocity=new Vector3(); this.velocityAddVariance=new Vector3(); this._particle3D=particle3D; var setting=particle3D.templet.settings; for (var i=0;i < 3;i++){ this.centerPosition.elements[i]=setting.boxEmitterCenterPosition[i]; this.size.elements[i]=setting.boxEmitterSize[i]; this.velocity.elements[i]=setting.boxEmitterVelocity[i]; this.velocityAddVariance.elements[i]=setting.boxEmitterVelocityAddVariance[i]; } this.emissionRate=setting.emissionRate; } __class(EmitterBox,'laya.d3.core.particle.EmitterBox',_super); var __proto=EmitterBox.prototype; /** *@private */ __proto._randomPositionOnBox=function(){ var rpe=this._resultPosition.elements; var cpe=this.centerPosition.elements; var se=this.size.elements; rpe[0]=cpe[0]+se[0] *(Math.random()-0.5); rpe[1]=cpe[1]+se[1] *(Math.random()-0.5); rpe[2]=cpe[2]+se[2] *(Math.random()-0.5); return this._resultPosition; } /** *@private */ __proto._randomVelocityOnBox=function(){ var rve=this._resultVelocity.elements; var ve=this.velocity.elements; var vve=this.velocityAddVariance.elements; rve[0]=ve[0]+vve[0] *Math.random(); rve[1]=ve[1]+vve[1] *Math.random(); rve[2]=ve[2]+vve[2] *Math.random(); return this._resultVelocity; } /** *盒发射器发射函数。 */ __proto.emit=function(){ _super.prototype.emit.call(this); this._particle3D.templet.addParticle(this._randomPositionOnBox(),this._randomVelocityOnBox()); } /** *更新盒粒子发射器。 *@param state 渲染相关状态参数。 */ __proto.update=function(state){ this.advanceTime(state.elapsedTime / 1000); } return EmitterBox; })(EmitterBase) /** *EmitterPoint 类用于点发射器。 */ //class laya.d3.core.particle.EmitterPoint extends laya.particle.emitter.EmitterBase var EmitterPoint=(function(_super){ function EmitterPoint(particle3D){ this._settings=null; this._particle3D=null; EmitterPoint.__super.call(this); this._resultPosition=new Vector3(); this._resultVelocity=new Vector3(); this.position=new Vector3(); this.positionVariance=new Vector3(); this.velocity=new Vector3(); this.velocityAddVariance=new Vector3(); this._particle3D=particle3D; var setting=particle3D.templet.settings; for (var i=0;i < 3;i++){ this.position.elements[i]=setting.pointEmitterPosition[i]; this.positionVariance.elements[i]=setting.pointEmitterPositionVariance[i]; this.velocity.elements[i]=setting.pointEmitterVelocity[i]; this.velocityAddVariance.elements[i]=setting.pointEmitterVelocityAddVariance[i]; } this.emissionRate=setting.emissionRate; } __class(EmitterPoint,'laya.d3.core.particle.EmitterPoint',_super); var __proto=EmitterPoint.prototype; /** *@private */ __proto._randomPositionOnPoint=function(){ var rpe=this._resultPosition.elements; var pe=this.position.elements; var pve=this.positionVariance.elements; rpe[0]=pe[0]+pve[0] *(Math.random()-0.5)*2; rpe[1]=pe[1]+pve[1] *(Math.random()-0.5)*2; rpe[2]=pe[2]+pve[2] *(Math.random()-0.5)*2; return this._resultPosition; } /** *@private */ __proto._randomVelocityOnPoint=function(){ var rve=this._resultVelocity.elements; var ve=this.velocity.elements; var vve=this.velocityAddVariance.elements; rve[0]=ve[0]+vve[0] *Math.random(); rve[1]=ve[1]+vve[1] *Math.random(); rve[2]=ve[2]+vve[2] *Math.random(); return this._resultVelocity; } /** *点发射器发射函数。 */ __proto.emit=function(){ _super.prototype.emit.call(this); this._particle3D.templet.addParticle(this._randomPositionOnPoint(),this._randomVelocityOnPoint()); } /** *更新点粒子发射器。 *@param state 渲染相关状态参数。 */ __proto.update=function(state){ this.advanceTime(state.elapsedTime / 1000); } return EmitterPoint; })(EmitterBase) /** *EmitterRing 类用于环发射器。 */ //class laya.d3.core.particle.EmitterRing extends laya.particle.emitter.EmitterBase var EmitterRing=(function(_super){ function EmitterRing(particle3D){ this._settings=null; this._particle3D=null; this.radius=30; this.velocity=0; this.velocityAddVariance=0; this.up=2; EmitterRing.__super.call(this); this._resultPosition=new Vector3(); this._resultVelocity=new Vector3(); this._direction=new Vector3(); this.centerPosition=new Vector3(); this._particle3D=particle3D; var setting=particle3D.templet.settings; for (var i=0;i < 3;i++){ this.centerPosition.elements[i]=setting.ringEmitterCenterPosition[i]; } this.radius=setting.ringEmitterRadius this.velocity=setting.ringEmitterVelocity this.velocityAddVariance=setting.ringEmitterVelocityAddVariance this.emissionRate=setting.emissionRate; } __class(EmitterRing,'laya.d3.core.particle.EmitterRing',_super); var __proto=EmitterRing.prototype; /** *@private */ __proto._randomPointOnRing=function(){ var angle=Math.random()*Math.PI *2; var x=Math.cos(angle); var y=Math.sin(angle); var rpe=this._resultPosition.elements; var cpe=this.centerPosition.elements; switch (this.up){ case 0: rpe[0]=cpe[0]+0; rpe[1]=cpe[1]+x *this.radius; rpe[2]=cpe[2]+y *this.radius; break ; case 1: rpe[0]=cpe[0]+x *this.radius; rpe[1]=cpe[1]+0; rpe[2]=cpe[2]+y *this.radius; break ; case 2: rpe[0]=cpe[0]+x *this.radius; rpe[1]=cpe[1]+y *this.radius; rpe[2]=cpe[2]+0; break ; } return this._resultPosition; } /** *@private */ __proto._randomVelocityOnRing=function(){ var rve=this._resultVelocity.elements; this._resultPosition.cloneTo(this._direction); Vector3.normalize(this._direction,this._direction); var de=this._direction.elements; rve[0]=de[0] *(this.velocity+this.velocityAddVariance *Math.random()); rve[1]=de[1] *(this.velocity+this.velocityAddVariance *Math.random()); rve[2]=de[2] *(this.velocity+this.velocityAddVariance *Math.random()); return this._resultVelocity; } /** *环发射器发射函数。 */ __proto.emit=function(){ _super.prototype.emit.call(this); this._particle3D.templet.addParticle(this._randomPointOnRing(),this._randomVelocityOnRing()); } /** *更新环粒子发射器。 *@param state 渲染相关状态参数。 */ __proto.update=function(elapsedTime){ this.advanceTime(elapsedTime / 1000); } return EmitterRing; })(EmitterBase) /** *EmitterSphere 类用于球发射器。 */ //class laya.d3.core.particle.EmitterSphere extends laya.particle.emitter.EmitterBase var EmitterSphere=(function(_super){ function EmitterSphere(particle3D){ this._settings=null; this._particle3D=null; this.radius=1; this.velocity=0; this.velocityAddVariance=0; EmitterSphere.__super.call(this); this._reultPosition=new Vector3(); this._resultVelocity=new Vector3(); this._direction=new Vector3(); this.centerPosition=new Vector3(); this._particle3D=particle3D; var setting=particle3D.templet.settings; for (var i=0;i < 3;i++){ this.centerPosition.elements[i]=setting.sphereEmitterCenterPosition[i]; } this.radius=setting.sphereEmitterRadius this.velocity=setting.sphereEmitterVelocity this.velocityAddVariance=setting.sphereEmitterVelocityAddVariance this.emissionRate=setting.emissionRate; } __class(EmitterSphere,'laya.d3.core.particle.EmitterSphere',_super); var __proto=EmitterSphere.prototype; /** *@private */ __proto._randomPositionOnSphere=function(){ var angleVer=Math.random()*Math.PI *2; var angleHor=Math.random()*Math.PI *2; var r=Math.cos(angleVer)*this.radius; var y=Math.sin(angleVer)*this.radius; var x=Math.cos(angleHor)*r; var z=Math.sin(angleHor)*r; var rpe=this._reultPosition.elements; var cpe=this.centerPosition.elements; rpe[0]=cpe[0]+x; rpe[1]=cpe[1]+y; rpe[2]=cpe[2]+z; return this._reultPosition; } /** *@private */ __proto._randomVelocityOnSphere=function(){ var rve=this._resultVelocity.elements; this._reultPosition.cloneTo(this._direction); Vector3.normalize(this._direction,this._direction); var de=this._direction.elements; rve[0]=de[0] *(this.velocity+this.velocityAddVariance *Math.random()); rve[1]=de[1] *(this.velocity+this.velocityAddVariance *Math.random()); rve[2]=de[2] *(this.velocity+this.velocityAddVariance *Math.random()); return this._resultVelocity; } /** *球发射器发射函数。 */ __proto.emit=function(){ _super.prototype.emit.call(this); this._particle3D.templet.addParticle(this._randomPositionOnSphere(),this._randomVelocityOnSphere()); } /** *更新球粒子发射器。 *@param state 渲染相关状态参数。 */ __proto.update=function(state){ this.advanceTime(state.elapsedTime / 1000); } return EmitterSphere; })(EmitterBase) /** *SplineCurvePosition 类用于通过顶点创建闪光插值。 */ //class laya.d3.core.glitter.SplineCurvePosition extends laya.d3.core.glitter.SplineCurvePositionVelocity var SplineCurvePosition=(function(_super){ /** *创建一个 SplineCurvePosition 实例。 */ function SplineCurvePosition(){ SplineCurvePosition.__super.call(this); } __class(SplineCurvePosition,'laya.d3.core.glitter.SplineCurvePosition',_super); var __proto=SplineCurvePosition.prototype; /** *@private *计算速度。 */ __proto._CalcVelocity=function(left,right,out){ Vector3.subtract(left,right,out); Vector3.scale(out,0.5,out); } /** *初始化插值所需信息。 *@param lastPosition0 顶点0的上次位置。 *@param position0 顶点0的位置。 *@param lastPosition1 顶点1的上次位置。 *@param position1 顶点1的位置。 */ __proto.Init=function(lastPosition0,position0,lastPosition1,position1){ this._CalcVelocity(position0,lastPosition0,this._tempVector30); this._CalcVelocity(position1,lastPosition1,this._tempVector31); _super.prototype.Init.call(this,position0,this._tempVector30,position1,this._tempVector31); } return SplineCurvePosition; })(SplineCurvePositionVelocity) /** *@private *ShaderDefines3D 类用于创建3DshaderDefine相关。 */ //class laya.d3.shader.ShaderDefines3D extends laya.webgl.shader.ShaderDefines var ShaderDefines3D=(function(_super){ function ShaderDefines3D(){ ShaderDefines3D.__super.call(this,ShaderDefines3D._name2int,ShaderDefines3D._int2name,ShaderDefines3D._int2nameMap); } __class(ShaderDefines3D,'laya.d3.shader.ShaderDefines3D',_super); ShaderDefines3D.__init__=function(){ ShaderDefines3D.reg("FSHIGHPRECISION",0x80); ShaderDefines3D.reg("DIFFUSEMAP",0x1); ShaderDefines3D.reg("NORMALMAP",0x2); ShaderDefines3D.reg("SPECULARMAP",0x4); ShaderDefines3D.reg("EMISSIVEMAP",0x8); ShaderDefines3D.reg("AMBIENTMAP",0x10); ShaderDefines3D.reg("REFLECTMAP",0x20); ShaderDefines3D.reg("PARTICLE3D",0x40000); ShaderDefines3D.reg("COLOR",0x800); ShaderDefines3D.reg("UV",0x400); ShaderDefines3D.reg("SKINNED",0x10000); ShaderDefines3D.reg("DIRECTIONLIGHT",0x1000); ShaderDefines3D.reg("POINTLIGHT",0x2000); ShaderDefines3D.reg("SPOTLIGHT",0x4000); ShaderDefines3D.reg("BONE",0x8000); ShaderDefines3D.reg("ALPHATEST",0x20000); ShaderDefines3D.reg("UVTRANSFORM",0x100); ShaderDefines3D.reg("FOG",0x200); ShaderDefines3D.reg("VR",0x40); ShaderDefines3D.reg("SPHERHBILLBOARD",0x80000); ShaderDefines3D.reg("STRETCHEDBILLBOARD",0x100000); ShaderDefines3D.reg("HORIZONTALBILLBOARD",0x200000); ShaderDefines3D.reg("VERTICALBILLBOARD",0x400000); ShaderDefines3D.reg("COLOROVERLIFETIME",0x800000); ShaderDefines3D.reg("RANDOMCOLOROVERLIFETIME",0x1000000); ShaderDefines3D.reg("SIZEOVERLIFETIME",0x2000000); ShaderDefines3D.reg("ROTATIONOVERLIFETIME",0x4000000); ShaderDefines3D.reg("TEXTURESHEETANIMATION",0x8000000); ShaderDefines3D.reg("VELOCITYOVERLIFETIME",0x10000000); } ShaderDefines3D.reg=function(name,value){ ShaderDefines._reg(name,value,ShaderDefines3D._name2int,ShaderDefines3D._int2name); } ShaderDefines3D.toText=function(value,_int2name,_int2nameMap){ return ShaderDefines._toText(value,_int2name,_int2nameMap); } ShaderDefines3D.toInt=function(names){ return ShaderDefines._toInt(names,ShaderDefines3D._name2int); } ShaderDefines3D.FSHIGHPRECISION=0x80; ShaderDefines3D.VR=0x40; ShaderDefines3D.FOG=0x200; ShaderDefines3D.DIRECTIONLIGHT=0x1000; ShaderDefines3D.POINTLIGHT=0x2000; ShaderDefines3D.SPOTLIGHT=0x4000; ShaderDefines3D.DIFFUSEMAP=0x1; ShaderDefines3D.NORMALMAP=0x2; ShaderDefines3D.SPECULARMAP=0x4; ShaderDefines3D.EMISSIVEMAP=0x8; ShaderDefines3D.AMBIENTMAP=0x10; ShaderDefines3D.REFLECTMAP=0x20; ShaderDefines3D.UVTRANSFORM=0x100; ShaderDefines3D.UV=0x400; ShaderDefines3D.COLOR=0x800; ShaderDefines3D.BONE=0x8000; ShaderDefines3D.SKINNED=0x10000; ShaderDefines3D.ALPHATEST=0x20000; ShaderDefines3D.PARTICLE3D=0x40000; ShaderDefines3D.SPHERHBILLBOARD=0x80000; ShaderDefines3D.STRETCHEDBILLBOARD=0x100000; ShaderDefines3D.HORIZONTALBILLBOARD=0x200000; ShaderDefines3D.VERTICALBILLBOARD=0x400000; ShaderDefines3D.COLOROVERLIFETIME=0x800000; ShaderDefines3D.RANDOMCOLOROVERLIFETIME=0x1000000; ShaderDefines3D.SIZEOVERLIFETIME=0x2000000; ShaderDefines3D.ROTATIONOVERLIFETIME=0x4000000; ShaderDefines3D.TEXTURESHEETANIMATION=0x8000000; ShaderDefines3D.VELOCITYOVERLIFETIME=0x10000000; ShaderDefines3D._name2int={}; ShaderDefines3D._int2name=[]; ShaderDefines3D._int2nameMap=[]; return ShaderDefines3D; })(ShaderDefines) /** *BoxShape 类用于创建球形粒子形状。 */ //class laya.d3.core.particleShuriKen.module.shape.BoxShape extends laya.d3.core.particleShuriKen.module.shape.BaseShape var BoxShape=(function(_super){ function BoxShape(){ this.x=NaN; this.y=NaN; this.z=NaN; this.randomDirection=false; BoxShape.__super.call(this); this.x=1.0; this.y=1.0; this.z=1.0; this.randomDirection=false; } __class(BoxShape,'laya.d3.core.particleShuriKen.module.shape.BoxShape',_super); var __proto=BoxShape.prototype; /** *用于生成粒子初始位置和方向。 *@param position 粒子位置。 *@param direction 粒子方向。 */ __proto.generatePositionAndDirection=function(position,direction){ var rpE=position.elements; var rdE=direction.elements; ShapeUtils._randomPointInsideHalfUnitBox(position); rpE[0]=this.x *rpE[0]; rpE[1]=this.y *rpE[1]; rpE[2]=this.z *rpE[2]; if (this.randomDirection){ ShapeUtils._randomPointUnitSphere(direction); }else { rdE[0]=0.0; rdE[1]=0.0; rdE[2]=-1.0; } } return BoxShape; })(BaseShape) /** *CircleShape 类用于创建环形粒子形状。 */ //class laya.d3.core.particleShuriKen.module.shape.CircleShape extends laya.d3.core.particleShuriKen.module.shape.BaseShape var CircleShape=(function(_super){ function CircleShape(){ this.radius=NaN; this.arc=NaN; this.emitFromEdge=false; this.randomDirection=false; CircleShape.__super.call(this); this.radius=1.0; this.arc=360.0 / 180.0 *Math.PI; this.emitFromEdge=false; this.randomDirection=false; } __class(CircleShape,'laya.d3.core.particleShuriKen.module.shape.CircleShape',_super); var __proto=CircleShape.prototype; /** *用于生成粒子初始位置和方向。 *@param position 粒子位置。 *@param direction 粒子方向。 */ __proto.generatePositionAndDirection=function(position,direction){ var rpE=position.elements; var positionPointE=CircleShape._tempPositionPoint.elements; if (this.emitFromEdge) ShapeUtils._randomPointUnitArcCircle(this.arc,CircleShape._tempPositionPoint); else ShapeUtils._randomPointInsideUnitArcCircle(this.arc,CircleShape._tempPositionPoint); rpE[0]=positionPointE[0]; rpE[1]=positionPointE[1]; rpE[2]=0; Vector3.scale(position,this.radius,position); if (this.randomDirection){ ShapeUtils._randomPointUnitSphere(direction); }else { position.cloneTo(direction); } } __static(CircleShape, ['_tempPositionPoint',function(){return this._tempPositionPoint=new Vector2();} ]); return CircleShape; })(BaseShape) /** *ConeShape 类用于创建锥形粒子形状。 */ //class laya.d3.core.particleShuriKen.module.shape.ConeShape extends laya.d3.core.particleShuriKen.module.shape.BaseShape var ConeShape=(function(_super){ function ConeShape(){ this.angle=NaN; this.radius=NaN; this.length=NaN; this.emitType=0; this.randomDirection=false; ConeShape.__super.call(this); this.angle=25.0 / 180.0 *Math.PI; this.radius=1.0; this.length=5.0; this.emitType=0; this.randomDirection=false; } __class(ConeShape,'laya.d3.core.particleShuriKen.module.shape.ConeShape',_super); var __proto=ConeShape.prototype; /** *用于生成粒子初始位置和方向。 *@param position 粒子位置。 *@param direction 粒子方向。 */ __proto.generatePositionAndDirection=function(position,direction){ var rpE=position.elements; var rdE=direction.elements; var positionPointE=ConeShape._tempPositionPoint.elements; var positionX=NaN; var positionY=NaN; var directionPointE; var dirCosA=Math.cos(this.angle); var dirSinA=Math.sin(this.angle); switch (this.emitType){ case 0: ShapeUtils._randomPointInsideUnitCircle(ConeShape._tempPositionPoint); positionX=positionPointE[0]; positionY=positionPointE[1]; rpE[0]=positionX *this.radius; rpE[1]=positionY *this.radius; rpE[2]=0; if (this.randomDirection){ ShapeUtils._randomPointInsideUnitCircle(ConeShape._tempDirectionPoint); directionPointE=ConeShape._tempDirectionPoint.elements; rdE[0]=directionPointE[0] *dirSinA; rdE[1]=directionPointE[1] *dirSinA; }else { rdE[0]=positionX *dirSinA; rdE[1]=positionY *dirSinA; } rdE[2]=-dirCosA; break ; case 1: ShapeUtils._randomPointUnitCircle(ConeShape._tempPositionPoint); positionX=positionPointE[0]; positionY=positionPointE[1]; rpE[0]=positionX *this.radius; rpE[1]=positionY *this.radius; rpE[2]=0; if (this.randomDirection){ ShapeUtils._randomPointInsideUnitCircle(ConeShape._tempDirectionPoint); directionPointE=ConeShape._tempDirectionPoint.elements; rdE[0]=directionPointE[0] *dirSinA; rdE[1]=directionPointE[1] *dirSinA; }else { rdE[0]=positionX *dirSinA; rdE[1]=positionY *dirSinA; } rdE[2]=-dirCosA; break ; case 2: ShapeUtils._randomPointInsideUnitCircle(ConeShape._tempPositionPoint); positionX=positionPointE[0]; positionY=positionPointE[1]; rpE[0]=positionX *this.radius; rpE[1]=positionY *this.radius; rpE[2]=0; rdE[0]=positionX *dirSinA; rdE[1]=positionY *dirSinA; rdE[2]=-dirCosA; Vector3.normalize(direction,direction); Vector3.scale(direction,this.length *Math.random(),direction); Vector3.add(position,direction,position); if (this.randomDirection) ShapeUtils._randomPointUnitSphere(direction); break ; case 3: ShapeUtils._randomPointUnitCircle(ConeShape._tempPositionPoint); positionX=positionPointE[0]; positionY=positionPointE[1]; rpE[0]=positionX *this.radius; rpE[1]=positionY *this.radius; rpE[2]=0; rdE[0]=positionX *dirSinA; rdE[1]=positionY *dirSinA; rdE[2]=-dirCosA; Vector3.normalize(direction,direction); Vector3.scale(direction,this.length *Math.random(),direction); Vector3.add(position,direction,position); if (this.randomDirection) ShapeUtils._randomPointUnitSphere(direction); break ; default : throw new Error("ConeShape:emitType is invalid."); } } __static(ConeShape, ['_tempPositionPoint',function(){return this._tempPositionPoint=new Vector2();},'_tempDirectionPoint',function(){return this._tempDirectionPoint=new Vector2();} ]); return ConeShape; })(BaseShape) /** *HemisphereShape 类用于创建半球形粒子形状。 */ //class laya.d3.core.particleShuriKen.module.shape.HemisphereShape extends laya.d3.core.particleShuriKen.module.shape.BaseShape var HemisphereShape=(function(_super){ function HemisphereShape(){ this.radius=NaN; this.emitFromShell=false; this.randomDirection=false; HemisphereShape.__super.call(this); this.radius=1.0; this.emitFromShell=false; this.randomDirection=false; } __class(HemisphereShape,'laya.d3.core.particleShuriKen.module.shape.HemisphereShape',_super); var __proto=HemisphereShape.prototype; /** *用于生成粒子初始位置和方向。 *@param position 粒子位置。 *@param direction 粒子方向。 */ __proto.generatePositionAndDirection=function(position,direction){ var rpE=position.elements; if (this.emitFromShell) ShapeUtils._randomPointUnitSphere(position); else ShapeUtils._randomPointInsideUnitSphere(position); Vector3.scale(position,this.radius,position); var z=rpE[2]; (z > 0.0)&& (rpE[2]=z *-1.0); if (this.randomDirection){ ShapeUtils._randomPointUnitSphere(direction); }else { position.cloneTo(direction); } } return HemisphereShape; })(BaseShape) /** *SphereShape 类用于创建球形粒子形状。 */ //class laya.d3.core.particleShuriKen.module.shape.SphereShape extends laya.d3.core.particleShuriKen.module.shape.BaseShape var SphereShape=(function(_super){ function SphereShape(){ this.radius=NaN; this.emitFromShell=false; this.randomDirection=false; SphereShape.__super.call(this); this.radius=1.0; this.emitFromShell=false; this.randomDirection=false; } __class(SphereShape,'laya.d3.core.particleShuriKen.module.shape.SphereShape',_super); var __proto=SphereShape.prototype; /** *用于生成粒子初始位置和方向。 *@param position 粒子位置。 *@param direction 粒子方向。 */ __proto.generatePositionAndDirection=function(position,direction){ if (this.emitFromShell) ShapeUtils._randomPointUnitSphere(position); else ShapeUtils._randomPointInsideUnitSphere(position); Vector3.scale(position,this.radius,position); if (this.randomDirection){ ShapeUtils._randomPointUnitSphere(direction); }else { position.cloneTo(direction); } } return SphereShape; })(BaseShape) /** *Sprite3D 类用于实现3D精灵。 */ //class laya.d3.core.Sprite3D extends laya.display.Node var Sprite3D=(function(_super){ function Sprite3D(name){ this._id=0; this._enable=false; this._layerMask=0; this._componentsMap=[]; this.transform=null; this.isStatic=false; Sprite3D.__super.call(this); this._components=[]; (name)? (this.name=name):(this.name="Sprite3D-"+Sprite3D._nameNumberCounter++); this._enable=true; this._id=++Sprite3D._uniqueIDCounter; this.layer=Layer.currentCreationLayer; this.transform=new Transform3D(this); this.on(/*laya.events.Event.DISPLAY*/"display",this,this._onDisplay); this.on(/*laya.events.Event.UNDISPLAY*/"undisplay",this,this._onUnDisplay); } __class(Sprite3D,'laya.d3.core.Sprite3D',_super); var __proto=Sprite3D.prototype; Laya.imps(__proto,{"laya.d3.core.render.IUpdate":true,"laya.resource.ICreateResource":true,"laya.d3.core.IClone":true}) /** *@private */ __proto._onDisplay=function(){ this.transform.parent=(this._parent).transform; this._addSelfRenderObjects(); } /** *@private */ __proto._onUnDisplay=function(){ this.transform.parent=null; this._clearSelfRenderObjects(); } /** *清理自身渲染物体,请重载此函数。 */ __proto._clearSelfRenderObjects=function(){} /** *添加自身渲染物体,请重载此函数。 */ __proto._addSelfRenderObjects=function(){} /** *更新组件update函数。 *@param state 渲染相关状态。 */ __proto._updateComponents=function(state){ for (var i=0,n=this._components.length;i < n;i++){ var component=this._components[i]; (!component.started)&& (component._start(state),component.started=true); (component.isActive)&& (component._update(state)); } } /** *更新组件lateUpdate函数。 *@param state 渲染相关状态。 */ __proto._lateUpdateComponents=function(state){ for (var i=0;i < this._components.length;i++){ var component=this._components[i]; (!component.started)&& (component._start(state),component.started=true); (component.isActive)&& (component._lateUpdate(state)); } } /** *更新子节点。 *@param state 渲染相关状态。 */ __proto._updateChilds=function(state){ var n=this._childs.length; if (n===0)return; for (var i=0;i < n;++i) this._childs[i]._update((state)); } /** *排序函数。 *@param state 渲染相关状态。 */ __proto._getSortID=function(renderElement,material){ return renderElement._getVertexBuffer().vertexDeclaration.id+material.id */*laya.d3.graphics.VertexDeclaration._maxVertexDeclarationBit*/1000; } /** *更新 *@param state 渲染相关状态 */ __proto._update=function(state){ state.owner=this; if (this._enable){ this._updateComponents(state); this._lateUpdateComponents(state); } Stat.spriteCount++; this._childs.length && this._updateChilds(state); } /** *加载层级文件,并作为该节点的子节点。 *@param url */ __proto.loadHierarchy=function(url){ this.addChild(laya.d3.core.Sprite3D.load(url)); } __proto.addChildAt=function(node,index){ if (!((node instanceof laya.d3.core.Sprite3D ))) throw new Error("Sprite3D:Node type must Sprite3D."); return _super.prototype.addChildAt.call(this,node,index); } __proto.addChild=function(node){ if (!((node instanceof laya.d3.core.Sprite3D ))) throw new Error("Sprite3D:Node type must Sprite3D."); return _super.prototype.addChild.call(this,node); } /** *添加指定类型组件。 *@param type 组件类型。 *@return 组件。 */ __proto.addComponent=function(type){ if (this._componentsMap.indexOf(type)!==-1) throw new Error("无法创建"+type+"组件"+","+type+"组件已存在!"); var component=ClassUtils.getInstance(type); component._initialize(this); this._componentsMap.push(type); this._components.push(component); this.event(/*laya.events.Event.COMPONENT_ADDED*/"componentadded",component); return component; } /** *获得指定类型组件。 *@param type 组件类型。 *@return 组件。 */ __proto.getComponentByType=function(type){ var index=this._componentsMap.indexOf(type); if (index===-1) return null; return this._components[index]; } /** *获得指定类型组件。 *@param type 组件类型。 *@return 组件。 */ __proto.getComponentByIndex=function(index){ return this._components[index]; } /** *移除指定类型组件。 *@param type 组件类型。 */ __proto.removeComponent=function(type){ var index=this._componentsMap.indexOf(type); if (index===-1) return; var component=this._components[index]; this._components.splice(index,1); this._componentsMap.splice(index,1); component._uninitialize(); this.event(/*laya.events.Event.COMPONENT_REMOVED*/"componentremoved",component); } /** *移除全部组件。 */ __proto.removeAllComponent=function(){ for (var component in this._componentsMap) this.removeComponent(component); } /** *@private */ __proto.onAsynLoaded=function(url,data){ var oriData=data[0]; var innerResouMap=data[1]; ClassUtils.createByJson(oriData,this,this,Handler.create(null,Utils3D._parseHierarchyProp,[innerResouMap],false),Handler.create(null,Utils3D._parseHierarchyNode,null,false)); this.event(/*laya.events.Event.HIERARCHY_LOADED*/"hierarchyloaded",[this]); } __proto.cloneTo=function(destObject){ var destSprite3D=destObject; destSprite3D.name=this.name; destSprite3D.destroyed=this.destroyed; destSprite3D.timer=this.timer; destSprite3D._displayedInStage=this._displayedInStage; destSprite3D._$P=this._$P; destSprite3D._enable=this._enable; destSprite3D._layerMask=this._layerMask; var destLocalMatrix=destSprite3D.transform.localMatrix; this.transform.localMatrix.cloneTo(destLocalMatrix); destSprite3D.transform.localMatrix=destLocalMatrix; destSprite3D.isStatic=this.isStatic; var i=0,n=0; for (i=0,n=this._componentsMap.length;i < n;i++) destSprite3D.addComponent(this._componentsMap[i]); for (i=0,n=this._childs.length;i < n;i++) destSprite3D.addChild(this._childs[i].clone()); } __proto.clone=function(){ var destSprite3D=/*__JS__ */new this.constructor(); this.cloneTo(destSprite3D); return destSprite3D; } /** *

销毁此对象。

*@param destroyChild 是否同时销毁子节点,若值为true,则销毁子节点,否则不销毁子节点。 */ __proto.destroy=function(destroyChild){ (destroyChild===void 0)&& (destroyChild=true); _super.prototype.destroy.call(this,destroyChild); for (var i=0,n=this._components.length;i < n;i++) this._components[i]._uninitialize(); this._components=null; this._componentsMap=null; this.transform=null; } /** *获得组件的数量。 *@return 组件数量。 */ __getset(0,__proto,'componentsCount',function(){ return this._components.length; }); /** *获取唯一标识ID。 *@return 唯一标识ID。 */ __getset(0,__proto,'id',function(){ return this._id; }); /** *设置蒙版。 *@param value 蒙版。 */ /** *获取蒙版。 *@return 蒙版。 */ __getset(0,__proto,'layer',function(){ return Layer.getLayerByMask(this._layerMask); },function(value){ this._layerMask=value.mask; this.event(/*laya.events.Event.LAYER_CHANGED*/"layerchanged",value); }); /** *设置是否启用。 *@param value 是否启动。 */ /** *获取是否启用。 *@return 是否激活。 */ __getset(0,__proto,'enable',function(){ return this._enable; },function(value){ if (this._enable!==value){ this._enable=value; this.event(/*laya.events.Event.ENABLED_CHANGED*/"enabledchanged",this._enable); } }); /** *获取是否激活。 *@return 是否激活。 */ __getset(0,__proto,'active',function(){ return Layer.isActive(this._layerMask)&& this._enable; }); /** *获取是否显示。 *@return 是否显示。 */ __getset(0,__proto,'visible',function(){ return Layer.isVisible(this._layerMask)&& this._enable; }); /** *获得所属场景。 *@return 场景。 */ __getset(0,__proto,'scene',function(){ return this.parent ? (this.parent).scene :null; }); Sprite3D.instantiate=function(original,position,rotation,parent,worldPositionStays){ (worldPositionStays===void 0)&& (worldPositionStays=true); var destSprite3D=original.clone(); var transform; if (position || rotation){ (parent)&& (parent.addChild(destSprite3D)); transform=destSprite3D.transform; (position)&& (transform.position=position); (rotation)&& (transform.rotation=rotation); }else { if (worldPositionStays){ transform=destSprite3D.transform; if (parent){ var oriPosition=transform.position; var oriRotation=transform.rotation; parent.addChild(destSprite3D); transform.position=oriPosition; transform.rotation=oriRotation; } }else { if (parent){ parent.addChild(destSprite3D); } } } return destSprite3D; } Sprite3D.load=function(url){ return Laya.loader.create(url,null,null,Sprite3D,1,false); } Sprite3D._uniqueIDCounter=0; Sprite3D._nameNumberCounter=0; return Sprite3D; })(Node) /** *BaseMaterial 类用于创建材质,抽象类,不允许实例。 */ //class laya.d3.core.material.BaseMaterial extends laya.resource.Resource var BaseMaterial=(function(_super){ function BaseMaterial(){ this._renderQueue=0; this._renderMode=0; this._sharderNameID=0; this._shaderDefineValue=0; this._disableShaderDefineValue=0; this._shaderValues=null; this._textureSharderIndices=null; this._colorSharderIndices=null; this._numberSharderIndices=null; this._matrix4x4SharderIndices=null; this._textures=null; this._colors=null; this._numbers=null; this._matrix4x4s=null; this._isInstance=false; this.shader=null; BaseMaterial.__super.call(this); this._loaded=true; this._isInstance=false; this._shaderDefineValue=0; this._disableShaderDefineValue=0; this._shaderValues=new ValusArray(); this._textures=[]; this._colors=[]; this._numbers=[]; this._matrix4x4s=[]; this._textureSharderIndices=[]; this._colorSharderIndices=[]; this._numberSharderIndices=[]; this._matrix4x4SharderIndices=[]; this.renderMode=1; } __class(BaseMaterial,'laya.d3.core.material.BaseMaterial',_super); var __proto=BaseMaterial.prototype; Laya.imps(__proto,{"laya.d3.core.IClone":true}) /** *@private */ __proto._uploadTextures=function(){ for (var i=0,n=this._textures.length;i < n;i++){ var texture=this._textures[i]; if (texture){ var source=texture.source; (source)? this._uploadTexture(i,source):this._uploadTexture(i,SolidColorTexture2D.grayTexture.source); } } } /** *获取Shader。 *@param state 相关渲染状态。 *@return Shader。 */ __proto._getShader=function(stateShaderDefines,vertexShaderDefineValue){ var defineValue=stateShaderDefines._value | vertexShaderDefineValue | this._shaderDefineValue; this._disableShaderDefineValue && (defineValue=defineValue & (~this._disableShaderDefineValue)); stateShaderDefines._value=defineValue; var nameID=defineValue+this._sharderNameID */*laya.webgl.shader.Shader.SHADERNAME2ID*/0.0002; this.shader=Shader.withCompile(this._sharderNameID,stateShaderDefines.toNameDic(),nameID,null); } /** *@private */ __proto._uploadTexture=function(shaderIndex,textureSource){ this._shaderValues.data[this._textureSharderIndices[shaderIndex]]=textureSource; } /** *增加Shader宏定义。 *@param value 宏定义。 */ __proto._addShaderDefine=function(value){ this._shaderDefineValue |=value; } /** *移除Shader宏定义。 *@param value 宏定义。 */ __proto._removeShaderDefine=function(value){ this._shaderDefineValue &=~value; } /** *增加禁用宏定义。 *@param value 宏定义。 */ __proto._addDisableShaderDefine=function(value){ this._disableShaderDefineValue |=value; } /** *移除禁用宏定义。 *@param value 宏定义。 */ __proto._removeDisableShaderDefine=function(value){ this._disableShaderDefineValue &=~value; } __proto._setMatrix4x4=function(matrix4x4Index,shaderName,matrix4x4){ var shaderValue=this._shaderValues; var index=this._matrix4x4SharderIndices[matrix4x4Index]; if (!index && matrix4x4){ this._matrix4x4SharderIndices[matrix4x4Index]=index=shaderValue.length+1; shaderValue.pushValue(shaderName,null); } shaderValue.data[index]=matrix4x4.elements; this._matrix4x4s[matrix4x4Index]=matrix4x4; } __proto._getMatrix4x4=function(matrix4x4Index){ return this._matrix4x4s[matrix4x4Index]; } __proto._setNumber=function(numberIndex,shaderName,number){ var shaderValue=this._shaderValues; var index=this._numberSharderIndices[numberIndex]; if (!index && number){ this._numberSharderIndices[numberIndex]=index=shaderValue.length+1; shaderValue.pushValue(shaderName,null); } shaderValue.data[index]=number; this._numbers[numberIndex]=number; } __proto._getNumber=function(numberIndex){ return this._numbers[numberIndex]; } __proto._setColor=function(colorIndex,shaderName,color){ var shaderValue=this._shaderValues; var index=this._colorSharderIndices[colorIndex]; if (!index && color){ this._colorSharderIndices[colorIndex]=index=shaderValue.length+1; shaderValue.pushValue(shaderName,null); } shaderValue.data[index]=color.elements; this._colors[colorIndex]=color; } __proto._getColor=function(colorIndex){ return this._colors[colorIndex]; } /** *设置纹理。 */ __proto._setTexture=function(texture,textureIndex,shaderName){ var shaderValue=this._shaderValues; var index=this._textureSharderIndices[textureIndex]; if (!index && texture){ this._textureSharderIndices[textureIndex]=index=shaderValue.length+1; shaderValue.pushValue(shaderName,null); } this._textures[textureIndex]=texture; } /** *获取纹理。 */ __proto._getTexture=function(textureIndex){ return this._textures[textureIndex]; } /** *上传材质。 *@param state 相关渲染状态。 *@param bufferUsageShader Buffer相关绑定。 *@param shader 着色器。 *@return 是否成功。 */ __proto._upload=function(state,vertexDeclaration,bufferUsageShader){ this._uploadTextures(); this._getShader(state.shaderDefines,vertexDeclaration.shaderDefineValue); var shaderValue=state.shaderValue; shaderValue.pushArray(this._shaderValues); this.shader.uploadArray(shaderValue.data,shaderValue.length,bufferUsageShader); } __proto._setLoopShaderParams=function(state,projectionView,worldMatrix,mesh,material){ throw new Error("Marterial:must override it."); } /** *@private */ __proto.onAsynLoaded=function(url,data){ var jsonData=data[0]; var textureMap=data[1]; var customHandler=Handler.create(null,Utils3D._parseMaterial,[textureMap],false); ClassUtils.createByJson(jsonData,this,null,customHandler,null); customHandler.recover(); this.event(/*laya.events.Event.LOADED*/"loaded",this); } /** *设置使用Shader名字。 *@param name 名称。 */ __proto.setShaderName=function(name){ this._sharderNameID=Shader.nameKey.get(name); } /** *克隆。 *@param destObject 克隆源。 */ __proto.cloneTo=function(destObject){ var destBaseMaterial=destObject; destBaseMaterial.name=this.name; destBaseMaterial._loaded=this._loaded; destBaseMaterial._renderQueue=this._renderQueue; destBaseMaterial._renderMode=this._renderMode; destBaseMaterial.shader=this.shader; destBaseMaterial._sharderNameID=this._sharderNameID; destBaseMaterial._disableShaderDefineValue=this._disableShaderDefineValue; destBaseMaterial._shaderDefineValue=this._shaderDefineValue; var i=0,n=0; var shaderDataIndex=0; var destShaderValues=destBaseMaterial._shaderValues; destBaseMaterial._shaderValues.length=this._shaderValues.length destBaseMaterial._colorSharderIndices=this._colorSharderIndices.slice(); var colorCount=this._colors.length; var destColors=destBaseMaterial._colors; destColors.length=colorCount; for (i=0,n=colorCount;i < n;i++){ var destColor=destColors[i]; (this._colors [i]).cloneTo(destColor); shaderDataIndex=this._colorSharderIndices[i]-1; destShaderValues.data[shaderDataIndex]=this._shaderValues.data[shaderDataIndex]; destShaderValues.data[shaderDataIndex+1]=destColor.elements; } destBaseMaterial._numberSharderIndices=this._numberSharderIndices.slice(); var numberCount=this._numbers.length; var destNumbers=destBaseMaterial._numbers; destNumbers.length=numberCount; for (i=0,n=numberCount;i < n;i++){ var number=this._numbers[i]; destNumbers[i]=number; shaderDataIndex=this._numberSharderIndices[i]-1; destShaderValues.data[shaderDataIndex]=this._shaderValues.data[shaderDataIndex]; destShaderValues.data[shaderDataIndex+1]=number; } destBaseMaterial._matrix4x4SharderIndices=this._matrix4x4SharderIndices.slice(); var matrixCount=this._matrix4x4s.length; var destMatrixs=destBaseMaterial._matrix4x4s; destMatrixs.length=matrixCount; for (i=0,n=matrixCount;i < n;i++){ var destMatrix=destMatrixs[i]; (this._matrix4x4s [i]).cloneTo(destMatrix); shaderDataIndex=this._matrix4x4SharderIndices[i]-1; destShaderValues.data[shaderDataIndex]=this._shaderValues.data[shaderDataIndex]; destShaderValues.data[shaderDataIndex+1]=destMatrix.elements; } destBaseMaterial._textureSharderIndices=this._textureSharderIndices.slice(); var textureCount=this._textures.length; var destTextures=destBaseMaterial._textures; destTextures.length=textureCount; for (i=0,n=textureCount;i < n;i++){ destTextures[i]=this._textures[i]; shaderDataIndex=this._textureSharderIndices[i]-1; destShaderValues.data[shaderDataIndex]=this._shaderValues.data[shaderDataIndex]; } } /** *克隆。 *@return 克隆副本。 */ __proto.clone=function(){ var destBaseMaterial=/*__JS__ */new this.constructor(); this.cloneTo(destBaseMaterial); return destBaseMaterial; } __proto.dispose=function(){ this.resourceManager.removeResource(this); _super.prototype.dispose.call(this); } /** *获取所属渲染队列。 *@return 渲染队列。 */ __getset(0,__proto,'renderQueue',function(){ return this._renderQueue; }); /** *设置渲染模式。 *@return 渲染模式。 */ /** *获取渲染状态。 *@return 渲染状态。 */ __getset(0,__proto,'renderMode',function(){ return this._renderMode; },function(value){ this._renderMode=value; switch (value){ case 1: this._renderQueue=/*laya.d3.core.render.RenderQueue.OPAQUE*/1; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 2: this._renderQueue=/*laya.d3.core.render.RenderQueue.OPAQUE_DOUBLEFACE*/2; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 3: this._renderQueue=/*laya.d3.core.render.RenderQueue.OPAQUE*/1; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 4: this._renderQueue=/*laya.d3.core.render.RenderQueue.OPAQUE_DOUBLEFACE*/2; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 13: this._renderQueue=/*laya.d3.core.render.RenderQueue.ALPHA_BLEND*/3; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 14: this._renderQueue=/*laya.d3.core.render.RenderQueue.ALPHA_BLEND_DOUBLEFACE*/4; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 15: this._renderQueue=/*laya.d3.core.render.RenderQueue.ALPHA_ADDTIVE_BLEND*/5; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 16: this._renderQueue=/*laya.d3.core.render.RenderQueue.ALPHA_ADDTIVE_BLEND_DOUBLEFACE*/6; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 5: this._renderQueue=/*laya.d3.core.render.RenderQueue.DEPTHREAD_ALPHA_BLEND*/7; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 6: this._renderQueue=/*laya.d3.core.render.RenderQueue.DEPTHREAD_ALPHA_BLEND_DOUBLEFACE*/8; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 7: this._renderQueue=/*laya.d3.core.render.RenderQueue.DEPTHREAD_ALPHA_ADDTIVE_BLEND*/9; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 8: this._renderQueue=/*laya.d3.core.render.RenderQueue.DEPTHREAD_ALPHA_ADDTIVE_BLEND_DOUBLEFACE*/10; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 9: this._renderQueue=/*laya.d3.core.render.RenderQueue.NONDEPTH_ALPHA_BLEND*/11; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 10: this._renderQueue=/*laya.d3.core.render.RenderQueue.NONDEPTH_ALPHA_BLEND_DOUBLEFACE*/12; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 11: this._renderQueue=/*laya.d3.core.render.RenderQueue.NONDEPTH_ALPHA_ADDTIVE_BLEND*/13; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; case 12: this._renderQueue=/*laya.d3.core.render.RenderQueue.NONDEPTH_ALPHA_ADDTIVE_BLEND_DOUBLEFACE*/14; this.event(/*laya.events.Event.RENDERQUEUE_CHANGED*/"renderqueuechanged",this); break ; default : throw new Error("Material:renderMode value error."); } if (this._renderMode===3 || this._renderMode===4) this._addShaderDefine(/*laya.d3.shader.ShaderDefines3D.ALPHATEST*/0x20000); else this._removeShaderDefine(/*laya.d3.shader.ShaderDefines3D.ALPHATEST*/0x20000); }); BaseMaterial.RENDERMODE_OPAQUE=1; BaseMaterial.RENDERMODE_OPAQUEDOUBLEFACE=2; BaseMaterial.RENDERMODE_CUTOUT=3; BaseMaterial.RENDERMODE_CUTOUTDOUBLEFACE=4; BaseMaterial.RENDERMODE_TRANSPARENT=13; BaseMaterial.RENDERMODE_TRANSPARENTDOUBLEFACE=14; BaseMaterial.RENDERMODE_ADDTIVE=15; BaseMaterial.RENDERMODE_ADDTIVEDOUBLEFACE=16; BaseMaterial.RENDERMODE_DEPTHREAD_TRANSPARENT=5; BaseMaterial.RENDERMODE_DEPTHREAD_TRANSPARENTDOUBLEFACE=6; BaseMaterial.RENDERMODE_DEPTHREAD_ADDTIVE=7; BaseMaterial.RENDERMODE_DEPTHREAD_ADDTIVEDOUBLEFACE=8; BaseMaterial.RENDERMODE_NONDEPTH_TRANSPARENT=9; BaseMaterial.RENDERMODE_NONDEPTH_TRANSPARENTDOUBLEFACE=10; BaseMaterial.RENDERMODE_NONDEPTH_ADDTIVE=11; BaseMaterial.RENDERMODE_NONDEPTH_ADDTIVEDOUBLEFACE=12; return BaseMaterial; })(Resource) /** *BaseTexture 纹理的父类,抽象类,不允许实例。 */ //class laya.d3.resource.BaseTexture extends laya.resource.Resource var BaseTexture=(function(_super){ function BaseTexture(){ this._width=0; this._height=0; this._size=null; this._repeat=false; this._mipmap=false; this._minFifter=0; this._magFifter=0; this._source=null; BaseTexture.__super.call(this); this._repeat=true; this._mipmap=true; this._minFifter=-1; this._magFifter=-1; } __class(BaseTexture,'laya.d3.resource.BaseTexture',_super); var __proto=BaseTexture.prototype; __proto.dispose=function(){ this.resourceManager.removeResource(this); _super.prototype.dispose.call(this); } /** *获取宽度。 */ __getset(0,__proto,'width',function(){ return this._width; }); /** *是否使用重复模式纹理寻址 */ __getset(0,__proto,'repeat',function(){ return this._repeat; }); /** *获取高度。 */ __getset(0,__proto,'height',function(){ return this._height; }); /** *放大过滤器 */ __getset(0,__proto,'magFifter',function(){ return this._magFifter; }); /** *获取尺寸。 */ __getset(0,__proto,'size',function(){ return this._size; }); /** *是否使用mipLevel */ __getset(0,__proto,'mipmap',function(){ return this._mipmap; }); /**\ *缩小过滤器 */ __getset(0,__proto,'minFifter',function(){ return this._minFifter; }); /** *获取纹理资源。 */ __getset(0,__proto,'source',function(){ this.activeResource(); return this._source; }); return BaseTexture; })(Resource) /** *BaseMesh 类用于创建网格,抽象类,不允许实例。 */ //class laya.d3.resource.models.BaseMesh extends laya.resource.Resource var BaseMesh=(function(_super){ function BaseMesh(){ this._subMeshCount=0; this._boundingBox=null; this._boundingSphere=null; BaseMesh.__super.call(this); this._loaded=false; } __class(BaseMesh,'laya.d3.resource.models.BaseMesh',_super); var __proto=BaseMesh.prototype; /** *获取渲染单元数量,请重载此方法。 *@return 渲染单元数量。 */ __proto.getRenderElementsCount=function(){ throw new Error("未Override,请重载该属性!"); } /** *获取渲染单元,请重载此方法。 *@param index 索引。 *@return 渲染单元。 */ __proto.getRenderElement=function(index){ throw new Error("未Override,请重载该属性!"); } /** *获取网格顶点,请重载此方法。 *@return 网格顶点。 */ __getset(0,__proto,'positions',function(){ throw new Error("未Override,请重载该属性!"); }); /** *获取SubMesh的个数。 *@return SubMesh的个数。 */ __getset(0,__proto,'subMeshCount',function(){ return this._subMeshCount; }); /** *获取AABB包围盒。 *@return AABB包围盒。 */ __getset(0,__proto,'boundingBox',function(){ return this._boundingBox; }); /** *获取包围球。 *@return 包围球。 */ __getset(0,__proto,'boundingSphere',function(){ return this._boundingSphere; }); return BaseMesh; })(Resource) /** *Sky 类用于创建天空的父类,抽象类不允许实例。 */ //class laya.d3.resource.models.Sky extends laya.resource.Resource var Sky=(function(_super){ function Sky(){ Sky.__super.call(this); } __class(Sky,'laya.d3.resource.models.Sky',_super); var __proto=Sky.prototype; __proto._render=function(state){} Sky.MVPMATRIX="MVPMATRIX"; Sky.INTENSITY="INTENSITY"; Sky.ALPHABLENDING="ALPHABLENDING"; Sky.DIFFUSETEXTURE="DIFFUSETEXTURE"; return Sky; })(Resource) /** *KeyframeAnimation 类用于帧动画组件的父类。 */ //class laya.d3.component.animation.KeyframeAnimations extends laya.d3.component.Component3D var KeyframeAnimations=(function(_super){ function KeyframeAnimations(){ this._player=null; this._templet=null; KeyframeAnimations.__super.call(this); this._player=new AnimationPlayer(); } __class(KeyframeAnimations,'laya.d3.component.animation.KeyframeAnimations',_super); var __proto=KeyframeAnimations.prototype; /** *@private */ __proto._updateAnimtionPlayer=function(){ this._player.update(Laya.timer.delta); } /** *@private */ __proto._addUpdatePlayerToTimer=function(){ Laya.timer.frameLoop(1,this,this._updateAnimtionPlayer); } /** *@private */ __proto._removeUpdatePlayerToTimer=function(){ Laya.timer.clear(this,this._updateAnimtionPlayer); } /** *@private */ __proto._onOwnerEnableChanged=function(enable){ if (this._owner.displayedInStage){ if (enable) this._addUpdatePlayerToTimer(); else this._removeUpdatePlayerToTimer(); } } /** *@private */ __proto._onDisplayInStage=function(){ (this._owner.enable)&& (this._addUpdatePlayerToTimer()); } /** *@private */ __proto._onUnDisplayInStage=function(){ (this._owner.enable)&& (this._removeUpdatePlayerToTimer()); } /** *@private *载入组件时执行 */ __proto._load=function(owner){ (this._owner.displayedInStage && this._owner.enable)&& (this._addUpdatePlayerToTimer()); this._owner.on(/*laya.events.Event.ENABLED_CHANGED*/"enabledchanged",this,this._onOwnerEnableChanged); this._owner.on(/*laya.events.Event.DISPLAY*/"display",this,this._onDisplayInStage); this._owner.on(/*laya.events.Event.UNDISPLAY*/"undisplay",this,this._onUnDisplayInStage); } /** *@private *卸载组件时执行 */ __proto._unload=function(owner){ _super.prototype._unload.call(this,owner); (this._owner.displayedInStage && this._owner.enable)&& (this._removeUpdatePlayerToTimer()); this._owner.off(/*laya.events.Event.ENABLED_CHANGED*/"enabledchanged",this,this._onOwnerEnableChanged); this._owner.off(/*laya.events.Event.DISPLAY*/"display",this,this._onDisplayInStage); this._owner.off(/*laya.events.Event.UNDISPLAY*/"undisplay",this,this._onUnDisplayInStage); this._player._destroy(); this._player=null; this._templet=null; } /** *设置url地址。 *@param value 地址。 */ __getset(0,__proto,'url',null,function(value){ console.log("Warning: discard property,please use templet property instead."); var templet=Laya.loader.create(value,null,null,AnimationTemplet); if (this._templet!==templet){ if (this._player.state!==/*laya.ani.AnimationState.stopped*/0) this._player.stop(true); this._templet=templet; this._player.templet=templet; this.event(/*laya.events.Event.ANIMATION_CHANGED*/"animationchanged",this); } }); /** *获取动画播放器。 *@return 动画播放器。 */ __getset(0,__proto,'player',function(){ return this._player; }); /** *设置动画模板。 *@param value 设置动画模板。 */ /** *获取动画模板。 *@return value 动画模板。 */ __getset(0,__proto,'templet',function(){ return this._templet; },function(value){ if (this._templet!==value){ if (this._player.state!==/*laya.ani.AnimationState.stopped*/0) this._player.stop(true); this._templet=value; this._player.templet=value; this.event(/*laya.events.Event.ANIMATION_CHANGED*/"animationchanged",this); } }); /** *获取播放器帧数。 *@return 播放器帧数。 */ __getset(0,__proto,'currentFrameIndex',function(){ return this._player.currentKeyframeIndex; }); /** *获取播放器的动画索引。 *@return 动画索引。 */ __getset(0,__proto,'currentAnimationClipIndex',function(){ return this._player.currentAnimationClipIndex; }); /** *获取播放器当前动画的节点数量。 *@return 节点数量。 */ __getset(0,__proto,'nodeCount',function(){ return this._templet.getNodeCount(this._player.currentAnimationClipIndex); }); return KeyframeAnimations; })(Component3D) /** *AttachPoint 类用于创建挂点组件。 */ //class laya.d3.component.AttachPoint extends laya.d3.component.Component3D var AttachPoint=(function(_super){ function AttachPoint(){ this._attachSkeleton=null; this._data=null; this._extenData=null; this.attachBones=null; this.matrixs=null; AttachPoint.__super.call(this); this.attachBones=[]; this.matrixs=[]; } __class(AttachPoint,'laya.d3.component.AttachPoint',_super); var __proto=AttachPoint.prototype; /** *@private *初始化载入挂点组件。 *@param owner 所属精灵对象。 */ __proto._load=function(owner){ _super.prototype._load.call(this,owner); this._attachSkeleton=owner.getComponentByType(SkinAnimations); } /** *@private *更新挂点组件。 *@param state 渲染状态。 */ __proto._update=function(state){ if (!this._attachSkeleton || this._attachSkeleton.player.state!==/*laya.ani.AnimationState.playing*/2 || !this._attachSkeleton.curBonesDatas) return; var player=this._attachSkeleton.player; this.matrixs.length=this.attachBones.length; for (var i=0;i < this.attachBones.length;i++){ var index=this._attachSkeleton.templet.getNodeIndexWithName(player.currentAnimationClipIndex,this.attachBones[i]); this._data=this._attachSkeleton.curBonesDatas.subarray(index *16,(index+1)*16); var matrix=this.matrixs[i]; matrix || (matrix=this.matrixs[i]=new Matrix4x4()); matrix.copyFromArray(this._data); Matrix4x4.multiply(this.owner.transform.worldMatrix,matrix,matrix); } } return AttachPoint; })(Component3D) /** *Script 类用于创建脚本的父类。 */ //class laya.d3.component.Script extends laya.d3.component.Component3D var Script=(function(_super){ /** *创建一个新的 Script 实例。 */ function Script(){ Script.__super.call(this); } __class(Script,'laya.d3.component.Script',_super); return Script; })(Component3D) /** *... *@author ... */ //class laya.d3.core.GlitterRender extends laya.d3.core.render.BaseRender var GlitterRender=(function(_super){ function GlitterRender(owner){ GlitterRender.__super.call(this,owner); } __class(GlitterRender,'laya.d3.core.GlitterRender',_super); var __proto=GlitterRender.prototype; __proto._calculateBoundingBox=function(){ var minE=this._boundingBox.min.elements; minE[0]=-Number.MAX_VALUE; minE[1]=-Number.MAX_VALUE; minE[2]=-Number.MAX_VALUE; var maxE=this._boundingBox.min.elements; maxE[0]=Number.MAX_VALUE; maxE[1]=Number.MAX_VALUE; maxE[2]=Number.MAX_VALUE; } __proto._calculateBoundingSphere=function(){ var centerE=this._boundingSphere.center.elements; centerE[0]=0; centerE[1]=0; centerE[2]=0; this._boundingSphere.radius=Number.MAX_VALUE; } return GlitterRender; })(BaseRender) /** *MeshRender 类用于网格渲染器。 */ //class laya.d3.core.MeshRender extends laya.d3.core.render.BaseRender var MeshRender=(function(_super){ function MeshRender(owner){ this._meshSprite3DOwner=null; this.castShadow=false; this.receiveShadow=false; MeshRender.__super.call(this,owner); this._meshSprite3DOwner=owner; this.castShadow=true; this.receiveShadow=true; this._meshSprite3DOwner.meshFilter.on(/*laya.events.Event.MESH_CHANGED*/"meshchanged",this,this._onMeshChanged); } __class(MeshRender,'laya.d3.core.MeshRender',_super); var __proto=MeshRender.prototype; /** *@private */ __proto._onMeshChanged=function(sender,oldMesh,mesh){ if (mesh.loaded){ this._boundingSphereNeedChange=true; this._boundingBoxNeedChange=true; }else { mesh.once(/*laya.events.Event.LOADED*/"loaded",this,this._onMeshLoaed); } } /** *@private */ __proto._onMeshLoaed=function(sender,enable){ this._boundingSphereNeedChange=true; this._boundingBoxNeedChange=true; } __proto._calculateBoundingSphere=function(){ if (this._meshSprite3DOwner.meshFilter.sharedMesh===null || this._meshSprite3DOwner.meshFilter.sharedMesh.boundingSphere===null){ this._boundingSphere.toDefault(); }else { var meshBoundingSphere=this._meshSprite3DOwner.meshFilter.sharedMesh.boundingSphere; var maxScale=NaN; var transform=this._meshSprite3DOwner.transform; var scale=transform.scale; if (scale.x >=scale.y && scale.x >=scale.z) maxScale=scale.x; else maxScale=scale.y >=scale.z ? scale.y :scale.z; Vector3.transformCoordinate(meshBoundingSphere.center,transform.worldMatrix,this._boundingSphere.center); this._boundingSphere.radius=meshBoundingSphere.radius *maxScale; } } __proto._calculateBoundingBox=function(){ if (this._meshSprite3DOwner.meshFilter.sharedMesh===null || this._meshSprite3DOwner.meshFilter.sharedMesh.boundingBox===null){ this._boundingBox.toDefault(); }else { var meshBoudingBox=this._meshSprite3DOwner.meshFilter.sharedMesh.boundingBox; var worldMat=this._meshSprite3DOwner.transform.worldMatrix; Vector3.transformCoordinate(meshBoudingBox.min,worldMat,this._boundingBox.min); Vector3.transformCoordinate(meshBoudingBox.max,worldMat,this._boundingBox.max); } } /** *@private */ __proto._destroy=function(){ _super.prototype._destroy.call(this); this._meshSprite3DOwner=null; } return MeshRender; })(BaseRender) /** *... *@author ... */ //class laya.d3.core.ParticleRender extends laya.d3.core.render.BaseRender var ParticleRender=(function(_super){ function ParticleRender(owner){ ParticleRender.__super.call(this,owner); } __class(ParticleRender,'laya.d3.core.ParticleRender',_super); var __proto=ParticleRender.prototype; __proto._calculateBoundingBox=function(){ var minE=this._boundingBox.min.elements; minE[0]=-Number.MAX_VALUE; minE[1]=-Number.MAX_VALUE; minE[2]=-Number.MAX_VALUE; var maxE=this._boundingBox.min.elements; maxE[0]=Number.MAX_VALUE; maxE[1]=Number.MAX_VALUE; maxE[2]=Number.MAX_VALUE; } __proto._calculateBoundingSphere=function(){ var centerE=this._boundingSphere.center.elements; centerE[0]=0; centerE[1]=0; centerE[2]=0; this._boundingSphere.radius=Number.MAX_VALUE; } return ParticleRender; })(BaseRender) /** *... *@author ... */ //class laya.d3.core.particleShuriKen.ShurikenParticleRender extends laya.d3.core.render.BaseRender var ShurikenParticleRender=(function(_super){ function ShurikenParticleRender(owner){ this.renderMode=0; this.stretchedBillboardCameraSpeedScale=0; this.stretchedBillboardSpeedScale=0; this.stretchedBillboardLengthScale=1; ShurikenParticleRender.__super.call(this,owner); this.renderMode=0; } __class(ShurikenParticleRender,'laya.d3.core.particleShuriKen.ShurikenParticleRender',_super); var __proto=ShurikenParticleRender.prototype; __proto._calculateBoundingBox=function(){ var minE=this._boundingBox.min.elements; minE[0]=-Number.MAX_VALUE; minE[1]=-Number.MAX_VALUE; minE[2]=-Number.MAX_VALUE; var maxE=this._boundingBox.min.elements; maxE[0]=Number.MAX_VALUE; maxE[1]=Number.MAX_VALUE; maxE[2]=Number.MAX_VALUE; } __proto._calculateBoundingSphere=function(){ var centerE=this._boundingSphere.center.elements; centerE[0]=0; centerE[1]=0; centerE[2]=0; this._boundingSphere.radius=Number.MAX_VALUE; } return ShurikenParticleRender; })(BaseRender) /** *@private *ParticleTemplet3D 类用于创建3D粒子数据模板。 */ //class laya.d3.resource.tempelet.ParticleTemplet3D extends laya.particle.ParticleTemplateWebGL var ParticleTemplet3D=(function(_super){ function ParticleTemplet3D(owner,setting){ this._owner=null; this._vertexBuffer3D=null; this._indexBuffer3D=null; ParticleTemplet3D.__super.call(this,setting); this._owner=owner; this.initialize(); this._vertexBuffer=this._vertexBuffer3D=VertexBuffer3D.create(VertexParticle.vertexDeclaration,setting.maxPartices *4,/*laya.webgl.WebGLContext.DYNAMIC_DRAW*/0x88E8); this._indexBuffer=this._indexBuffer3D=IndexBuffer3D.create(/*laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort",setting.maxPartices *6,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4,true); this.loadContent(); } __class(ParticleTemplet3D,'laya.d3.resource.tempelet.ParticleTemplet3D',_super); var __proto=ParticleTemplet3D.prototype; Laya.imps(__proto,{"laya.d3.core.render.IRenderable":true}) __proto._getVertexBuffer=function(index){ (index===void 0)&& (index=0); if (index===0) return this._vertexBuffer3D; else return null; } __proto._getIndexBuffer=function(){ return this._indexBuffer3D; } __proto.addParticle=function(position,velocity){ this.addParticleArray(position.elements,velocity.elements); } __proto.loadContent=function(){ var indexes=new Uint16Array(this.settings.maxPartices *6); for (var i=0;i < this.settings.maxPartices;i++){ indexes[i *6+0]=(i *4+0); indexes[i *6+1]=(i *4+1); indexes[i *6+2]=(i *4+2); indexes[i *6+3]=(i *4+0); indexes[i *6+4]=(i *4+2); indexes[i *6+5]=(i *4+3); } this._indexBuffer3D.setData(indexes); } __proto.addNewParticlesToVertexBuffer=function(){ var start=0; if (this._firstNewElement < this._firstFreeElement){ start=this._firstNewElement *4 *this._floatCountPerVertex; this._vertexBuffer3D.setData(this._vertices,start,start,(this._firstFreeElement-this._firstNewElement)*4 *this._floatCountPerVertex); }else { start=this._firstNewElement *4 *this._floatCountPerVertex; this._vertexBuffer3D.setData(this._vertices,start,start,(this.settings.maxPartices-this._firstNewElement)*4 *this._floatCountPerVertex); if (this._firstFreeElement > 0){ this._vertexBuffer3D.setData(this._vertices,0,0,this._firstFreeElement *4 *this._floatCountPerVertex); } } this._firstNewElement=this._firstFreeElement; } __proto._beforeRender=function(state){ if (this._firstNewElement !=this._firstFreeElement){ this.addNewParticlesToVertexBuffer(); } this._drawCounter++; if (this._firstActiveElement !=this._firstFreeElement){ this._vertexBuffer3D._bind(); this._indexBuffer._bind(); return true; } return false; } __proto._render=function(state){ var drawVertexCount=0; var glContext=WebGL.mainContext; if (this._firstActiveElement < this._firstFreeElement){ drawVertexCount=(this._firstFreeElement-this._firstActiveElement)*6; glContext.drawElements(/*laya.webgl.WebGLContext.TRIANGLES*/0x0004,drawVertexCount,/*laya.webgl.WebGLContext.UNSIGNED_SHORT*/0x1403,this._firstActiveElement *6 *2); Stat.trianglesFaces+=drawVertexCount / 3; Stat.drawCall++; }else { drawVertexCount=(this.settings.maxPartices-this._firstActiveElement)*6; glContext.drawElements(/*laya.webgl.WebGLContext.TRIANGLES*/0x0004,drawVertexCount,/*laya.webgl.WebGLContext.UNSIGNED_SHORT*/0x1403,this._firstActiveElement *6 *2); Stat.trianglesFaces+=drawVertexCount / 3; Stat.drawCall++; if (this._firstFreeElement > 0){ drawVertexCount=this._firstFreeElement *6; glContext.drawElements(/*laya.webgl.WebGLContext.TRIANGLES*/0x0004,drawVertexCount,/*laya.webgl.WebGLContext.UNSIGNED_SHORT*/0x1403,0); Stat.trianglesFaces+=drawVertexCount / 3; Stat.drawCall++; } } } __getset(0,__proto,'indexOfHost',function(){ return 0; }); __getset(0,__proto,'_vertexBufferCount',function(){ return 1; }); __getset(0,__proto,'triangleCount',function(){ return this._indexBuffer3D.indexCount / 3; }); return ParticleTemplet3D; })(ParticleTemplateWebGL) /** *BaseScene 类用于实现场景的父类。 */ //class laya.d3.core.scene.BaseScene extends laya.display.Sprite var BaseScene=(function(_super){ function BaseScene(){ this._invertYProjectionMatrix=null; this._invertYProjectionViewMatrix=null; this._invertYScaleMatrix=null; this._boundFrustum=null; this._enableLightCount=3; this._renderTargetTexture=null; this._customRenderQueneIndex=11; this._lastCurrentTime=NaN; this._staticBatchManager=null; this._dynamicBatchManager=null; this.enableFog=false; this.fogStart=NaN; this.fogRange=NaN; this.fogColor=null; this.enableLight=true; BaseScene.__super.call(this); this._renderState=new RenderState(); this._lights=new Array; this._renderConfigs=[]; this._frustumCullingObjects=[]; this._quenes=[]; this._cameraPool=[]; this._invertYProjectionMatrix=new Matrix4x4(); this._invertYProjectionViewMatrix=new Matrix4x4(); this._invertYScaleMatrix=new Matrix4x4(); Matrix4x4.createScaling(new Vector3(1,-1,1),this._invertYScaleMatrix); this._staticBatchManager=new StaticBatchManager(); this._dynamicBatchManager=new DynamicBatchManager(); this._boundFrustum=new BoundFrustum(Matrix4x4.DEFAULT); this.enableFog=false; this.fogStart=300; this.fogRange=1000; this.fogColor=new Vector3(0.7,0.7,0.7); var renderConfig; renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.OPAQUE*/1]=new RenderConfig(); renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.OPAQUE_DOUBLEFACE*/2]=new RenderConfig(); renderConfig.cullFace=false; renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.ALPHA_BLEND*/3]=new RenderConfig(); renderConfig.blend=true; renderConfig.sFactor=/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302; renderConfig.dFactor=/*laya.webgl.WebGLContext.ONE_MINUS_SRC_ALPHA*/0x0303; renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.ALPHA_BLEND_DOUBLEFACE*/4]=new RenderConfig(); renderConfig.cullFace=false; renderConfig.blend=true; renderConfig.sFactor=/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302; renderConfig.dFactor=/*laya.webgl.WebGLContext.ONE_MINUS_SRC_ALPHA*/0x0303; renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.ALPHA_ADDTIVE_BLEND*/5]=new RenderConfig(); renderConfig.blend=true; renderConfig.sFactor=/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302; renderConfig.dFactor=/*laya.webgl.WebGLContext.ONE*/1; renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.ALPHA_ADDTIVE_BLEND_DOUBLEFACE*/6]=new RenderConfig(); renderConfig.cullFace=false; renderConfig.blend=true; renderConfig.sFactor=/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302; renderConfig.dFactor=/*laya.webgl.WebGLContext.ONE*/1; renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.DEPTHREAD_ALPHA_BLEND*/7]=new RenderConfig(); renderConfig.blend=true; renderConfig.depthMask=0; renderConfig.sFactor=/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302; renderConfig.dFactor=/*laya.webgl.WebGLContext.ONE_MINUS_SRC_ALPHA*/0x0303; renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.DEPTHREAD_ALPHA_ADDTIVE_BLEND*/9]=new RenderConfig(); renderConfig.blend=true; renderConfig.depthMask=0; renderConfig.sFactor=/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302; renderConfig.dFactor=/*laya.webgl.WebGLContext.ONE*/1; renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.DEPTHREAD_ALPHA_BLEND_DOUBLEFACE*/8]=new RenderConfig(); renderConfig.cullFace=false; renderConfig.blend=true; renderConfig.depthMask=0; renderConfig.sFactor=/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302; renderConfig.dFactor=/*laya.webgl.WebGLContext.ONE_MINUS_SRC_ALPHA*/0x0303; renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.DEPTHREAD_ALPHA_ADDTIVE_BLEND_DOUBLEFACE*/10]=new RenderConfig(); renderConfig.cullFace=false; renderConfig.blend=true; renderConfig.depthMask=0; renderConfig.sFactor=/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302; renderConfig.dFactor=/*laya.webgl.WebGLContext.ONE*/1; renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.NONDEPTH_ALPHA_BLEND*/11]=new RenderConfig(); renderConfig.blend=true; renderConfig.depthTest=false; renderConfig.sFactor=/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302; renderConfig.dFactor=/*laya.webgl.WebGLContext.ONE_MINUS_SRC_ALPHA*/0x0303; renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.NONDEPTH_ALPHA_ADDTIVE_BLEND*/13]=new RenderConfig(); renderConfig.blend=true; renderConfig.depthTest=false; renderConfig.sFactor=/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302; renderConfig.dFactor=/*laya.webgl.WebGLContext.ONE*/1; renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.NONDEPTH_ALPHA_BLEND_DOUBLEFACE*/12]=new RenderConfig(); renderConfig.cullFace=false; renderConfig.blend=true; renderConfig.depthTest=false; renderConfig.sFactor=/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302; renderConfig.dFactor=/*laya.webgl.WebGLContext.ONE_MINUS_SRC_ALPHA*/0x0303; renderConfig=this._renderConfigs[ /*laya.d3.core.render.RenderQueue.NONDEPTH_ALPHA_ADDTIVE_BLEND_DOUBLEFACE*/14]=new RenderConfig(); renderConfig.cullFace=false; renderConfig.blend=true; renderConfig.depthTest=false; renderConfig.sFactor=/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302; renderConfig.dFactor=/*laya.webgl.WebGLContext.ONE*/1; this.on(/*laya.events.Event.DISPLAY*/"display",this,this._$3__onDisplay); this.on(/*laya.events.Event.UNDISPLAY*/"undisplay",this,this._onUnDisplay); } __class(BaseScene,'laya.d3.core.scene.BaseScene',_super); var __proto=BaseScene.prototype; Laya.imps(__proto,{"laya.webgl.submit.ISubmit":true}) /** *@private */ __proto._$3__onDisplay=function(){ Laya.stage._scenes.push(this); Laya.stage._scenes.sort(BaseScene._sortScenes); } /** *@private */ __proto._onUnDisplay=function(){ var scenes=Laya.stage._scenes; scenes.splice(scenes.indexOf(this),1); } /** *@private *场景相关渲染准备设置。 *@param gl WebGL上下文。 *@return state 渲染状态。 */ __proto._prepareUpdateToRenderState=function(gl,state){ state.context=WebGL.mainContext; state.elapsedTime=this._lastCurrentTime ? this.timer.currTimer-this._lastCurrentTime :0; this._lastCurrentTime=this.timer.currTimer; state.loopCount=Stat.loopCount; state.scene=this; } /** *@private *场景相关渲染准备设置。 *@param gl WebGL上下文。 *@return state 渲染状态。 */ __proto._prepareRenderToRenderState=function(camera,state){ var shaderDefines=state.shaderDefines; (WebGL.frameShaderHighPrecision)&& (shaderDefines.addInt(/*laya.d3.shader.ShaderDefines3D.FSHIGHPRECISION*/0x80)); Layer._currentCameraCullingMask=camera.cullingMask; state.camera=camera; var shaderValue=state.shaderValue; camera && shaderValue.pushValue(/*CLASS CONST:laya.d3.core.scene.BaseScene.CAMERAPOS*/"CAMERAPOS",camera.transform.position.elements); if (this._lights.length > 0){ var lightCount=0; for (var i=0;i < this._lights.length;i++){ var light=this._lights[i]; if (!light.active)continue ; lightCount++; if (lightCount > this._enableLightCount) break ; light.updateToWorldState(state); } } if (this.enableFog){ shaderDefines.addInt(/*laya.d3.shader.ShaderDefines3D.FOG*/0x200); shaderValue.pushValue(/*CLASS CONST:laya.d3.core.scene.BaseScene.FOGSTART*/"FOGSTART",this.fogStart); shaderValue.pushValue(/*CLASS CONST:laya.d3.core.scene.BaseScene.FOGRANGE*/"FOGRANGE",this.fogRange); shaderValue.pushValue(/*CLASS CONST:laya.d3.core.scene.BaseScene.FOGCOLOR*/"FOGCOLOR",this.fogColor.elements); } } __proto._endRenderToRenderState=function(state){ state.reset(); } /** *@private */ __proto._updateScene=function(){ var renderState=this._renderState; this._prepareUpdateToRenderState(WebGL.mainContext,renderState); this.beforeUpate(renderState); this._updateChilds(renderState); this.lateUpate(renderState); } /** *@private */ __proto._updateChilds=function(state){ for (var i=0,n=this._childs.length;i < n;++i) this._childs[i]._update(state); } /** *@private */ __proto._preRenderScene=function(gl,state){ this._boundFrustum.matrix=state.projectionViewMatrix; FrustumCulling.RenderObjectCulling(this._boundFrustum,this); for (var i=0,iNum=this._quenes.length;i < iNum;i++) (this._quenes[i])&& (this._quenes[i]._preRender(state)); } __proto._clear=function(gl,state){ var viewport=state.viewport; var camera=state.camera; var renderTargetHeight=camera.renderTargetSize.height; gl.viewport(viewport.x,renderTargetHeight-viewport.y-viewport.height,viewport.width,viewport.height); var clearFlag=0; switch (camera.clearFlag){ case /*laya.d3.core.BaseCamera.CLEARFLAG_SOLIDCOLOR*/0: if (camera.clearColor){ gl.enable(/*laya.webgl.WebGLContext.SCISSOR_TEST*/0x0C11); gl.scissor(viewport.x,renderTargetHeight-viewport.y-viewport.height,viewport.width,viewport.height); var clearColorE=camera.clearColor.elements; gl.clearColor(clearColorE[0],clearColorE[1],clearColorE[2],clearColorE[3]); clearFlag=/*laya.webgl.WebGLContext.COLOR_BUFFER_BIT*/0x00004000; if (camera.renderTarget){ switch (camera.renderTarget.depthStencilFormat){ case /*laya.webgl.WebGLContext.DEPTH_COMPONENT16*/0x81A5: clearFlag |=/*laya.webgl.WebGLContext.DEPTH_BUFFER_BIT*/0x00000100; break ; case /*laya.webgl.WebGLContext.STENCIL_INDEX8*/0x8D48: clearFlag |=/*laya.webgl.WebGLContext.STENCIL_BUFFER_BIT*/0x00000400; break ; case /*laya.webgl.WebGLContext.DEPTH_STENCIL*/0x84F9: clearFlag |=/*laya.webgl.WebGLContext.DEPTH_BUFFER_BIT*/0x00000100; clearFlag |=/*laya.webgl.WebGLContext.STENCIL_BUFFER_BIT*/0x00000400 break ; } }else { clearFlag |=/*laya.webgl.WebGLContext.DEPTH_BUFFER_BIT*/0x00000100; } gl.clear(clearFlag); gl.disable(/*laya.webgl.WebGLContext.SCISSOR_TEST*/0x0C11); }else { gl.clear(/*laya.webgl.WebGLContext.DEPTH_BUFFER_BIT*/0x00000100); } break ; case /*laya.d3.core.BaseCamera.CLEARFLAG_SKY*/1: case /*laya.d3.core.BaseCamera.CLEARFLAG_DEPTHONLY*/2: if (camera.renderTarget){ switch (camera.renderTarget.depthStencilFormat){ case /*laya.webgl.WebGLContext.DEPTH_COMPONENT16*/0x81A5: clearFlag |=/*laya.webgl.WebGLContext.DEPTH_BUFFER_BIT*/0x00000100; break ; case /*laya.webgl.WebGLContext.STENCIL_INDEX8*/0x8D48: clearFlag |=/*laya.webgl.WebGLContext.STENCIL_BUFFER_BIT*/0x00000400; break ; case /*laya.webgl.WebGLContext.DEPTH_STENCIL*/0x84F9: clearFlag |=/*laya.webgl.WebGLContext.DEPTH_BUFFER_BIT*/0x00000100; clearFlag |=/*laya.webgl.WebGLContext.STENCIL_BUFFER_BIT*/0x00000400 break ; } }else { clearFlag |=/*laya.webgl.WebGLContext.DEPTH_BUFFER_BIT*/0x00000100; } break ; case /*laya.d3.core.BaseCamera.CLEARFLAG_NONE*/3: break ; default : throw new Error("BaseScene:camera clearFlag invalid."); } } /** *@private */ __proto._renderScene=function(gl,state){ var camera=state.camera; var i=0,n=0; var queue; for (i=0;i < 3;i++){ queue=this._quenes[i]; if (queue){ queue._setState(gl,state); queue._render(state); } } if (camera.clearFlag===/*laya.d3.core.BaseCamera.CLEARFLAG_SKY*/1){ var sky=camera.sky; if (sky){ WebGLContext.setCullFace(gl,false); WebGLContext.setDepthFunc(gl,/*laya.webgl.WebGLContext.LEQUAL*/0x0203); WebGLContext.setDepthMask(gl,0); sky._render(state); WebGLContext.setDepthFunc(gl,/*laya.webgl.WebGLContext.LESS*/0x0201); WebGLContext.setDepthMask(gl,1); } } for (i=3,n=this._quenes.length;i < n;i++){ queue=this._quenes[i]; if (queue){ queue._sortAlpha(state.camera.transform.position); queue._setState(gl,state); queue._render(state); } } } /** *@private */ __proto._set3DRenderConfig=function(gl){ gl.disable(/*laya.webgl.WebGLContext.BLEND*/0x0BE2); WebGLContext._blend=false; gl.blendFunc(/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302,/*laya.webgl.WebGLContext.ONE_MINUS_SRC_ALPHA*/0x0303); WebGLContext._sFactor=/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302; WebGLContext._dFactor=/*laya.webgl.WebGLContext.ONE_MINUS_SRC_ALPHA*/0x0303; gl.disable(/*laya.webgl.WebGLContext.DEPTH_TEST*/0x0B71); WebGLContext._depthTest=false; gl.enable(/*laya.webgl.WebGLContext.CULL_FACE*/0x0B44); WebGLContext._cullFace=true; gl.depthMask(1); WebGLContext._depthMask=1; gl.frontFace(/*laya.webgl.WebGLContext.CW*/0x0900); WebGLContext._frontFace=/*laya.webgl.WebGLContext.CW*/0x0900; } /** *@private */ __proto._set2DRenderConfig=function(gl){ WebGLContext.setBlend(gl,true); WebGLContext.setBlendFunc(gl,/*laya.webgl.WebGLContext.SRC_ALPHA*/0x0302,/*laya.webgl.WebGLContext.ONE_MINUS_SRC_ALPHA*/0x0303); WebGLContext.setDepthTest(gl,false); WebGLContext.setCullFace(gl,false); WebGLContext.setDepthMask(gl,1); WebGLContext.setFrontFaceCCW(gl,/*laya.webgl.WebGLContext.CCW*/0x0901); gl.viewport(0,0,RenderState2D.width,RenderState2D.height); } /** *@private */ __proto._addLight=function(light){ if (this._lights.indexOf(light)< 0)this._lights.push(light); } /** *@private */ __proto._removeLight=function(light){ var index=this._lights.indexOf(light); index >=0 && (this._lights.splice(index,1)); } __proto.addChildAt=function(node,index){ if (!((node instanceof laya.d3.core.Sprite3D ))) throw new Error("Sprite3D:Node type must Sprite3D."); return laya.display.Node.prototype.addChildAt.call(this,node,index); } __proto.addChild=function(node){ if (!((node instanceof laya.d3.core.Sprite3D ))) throw new Error("Sprite3D:Node type must Sprite3D."); return laya.display.Node.prototype.addChild.call(this,node); } __proto.addFrustumCullingObject=function(frustumCullingObject){ this._frustumCullingObjects.push(frustumCullingObject); } __proto.removeFrustumCullingObject=function(frustumCullingObject){ var index=this._frustumCullingObjects.indexOf(frustumCullingObject); (index!==-1)&& (this._frustumCullingObjects.splice(index,1)); } /** *获得某个渲染队列。 *@param index 渲染队列索引。 *@return 渲染队列。 */ __proto.getRenderQueue=function(index){ return (this._quenes[index] || (this._quenes[index]=new RenderQueue(this._renderConfigs[index],this))); } /** *添加渲染队列。 *@param renderConfig 渲染队列配置文件。 */ __proto.addRenderQuene=function(renderConfig){ this._quenes[this._customRenderQueneIndex++]=new RenderQueue(renderConfig,this); } /** *更新前处理,可重写此函数。 *@param state 渲染相关状态。 */ __proto.beforeUpate=function(state){} /** *更新后处理,可重写此函数。 *@param state 渲染相关状态。 */ __proto.lateUpate=function(state){} /** *渲染前处理,可重写此函数。 *@param state 渲染相关状态。 */ __proto.beforeRender=function(state){} /** *渲染后处理,可重写此函数。 *@param state 渲染相关状态。 */ __proto.lateRender=function(state){} /** *@private */ __proto.render=function(context,x,y){ (Render._context.ctx)._shader2D.glTexture=null; this._childs.length > 0 && context.addRenderObject(this); this._renderType &=~ /*laya.renders.RenderSprite.CHILDS*/0x800; _super.prototype.render.call(this,context,x,y); } /** *@private */ __proto.renderSubmit=function(){ return 1; } /** *@private */ __proto.getRenderType=function(){ return 0; } /** *@private */ __proto.releaseRender=function(){} /** *获取当前场景。 *@return 当前场景。 */ __getset(0,__proto,'scene',function(){ return this; }); BaseScene._sortScenes=function(a,b){ if (a.parent===Laya.stage && b.parent===Laya.stage){ var stageChildren=Laya.stage._childs; return stageChildren.indexOf(a)-stageChildren.indexOf(b); }else if (a.parent!==Laya.stage && b.parent!==Laya.stage){ return BaseScene._sortScenes(a.parent,b.parent); }else { return (a.parent===Laya.stage)?-1 :1; } } BaseScene.FOGCOLOR="FOGCOLOR"; BaseScene.FOGSTART="FOGSTART"; BaseScene.FOGRANGE="FOGRANGE"; BaseScene.CAMERAPOS="CAMERAPOS"; BaseScene.LIGHTDIRECTION="LIGHTDIRECTION"; BaseScene.LIGHTDIRDIFFUSE="LIGHTDIRDIFFUSE"; BaseScene.LIGHTDIRAMBIENT="LIGHTDIRAMBIENT"; BaseScene.LIGHTDIRSPECULAR="LIGHTDIRSPECULAR"; BaseScene.POINTLIGHTPOS="POINTLIGHTPOS"; BaseScene.POINTLIGHTRANGE="POINTLIGHTRANGE"; BaseScene.POINTLIGHTATTENUATION="POINTLIGHTATTENUATION"; BaseScene.POINTLIGHTDIFFUSE="POINTLIGHTDIFFUSE"; BaseScene.POINTLIGHTAMBIENT="POINTLIGHTAMBIENT"; BaseScene.POINTLIGHTSPECULAR="POINTLIGHTSPECULAR"; BaseScene.SPOTLIGHTPOS="SPOTLIGHTPOS"; BaseScene.SPOTLIGHTDIRECTION="SPOTLIGHTDIRECTION"; BaseScene.SPOTLIGHTSPOT="SPOTLIGHTSPOT"; BaseScene.SPOTLIGHTRANGE="SPOTLIGHTRANGE"; BaseScene.SPOTLIGHTATTENUATION="SPOTLIGHTATTENUATION"; BaseScene.SPOTLIGHTDIFFUSE="SPOTLIGHTDIFFUSE"; BaseScene.SPOTLIGHTAMBIENT="SPOTLIGHTAMBIENT"; BaseScene.SPOTLIGHTSPECULAR="SPOTLIGHTSPECULAR"; return BaseScene; })(Sprite) /** *BaseCamera 类用于创建摄像机的父类。 */ //class laya.d3.core.BaseCamera extends laya.d3.core.Sprite3D var BaseCamera=(function(_super){ function BaseCamera(nearPlane,farPlane){ //this._tempVector3=null; //this._position=null; //this._up=null; //this._forward=null; //this._right=null; //this._renderTarget=null; //this._renderingOrder=0; //this._renderTargetSize=null; //this._nearPlane=NaN; //this._farPlane=NaN; //this._fieldOfView=NaN; //this._orthographic=false; //this._orthographicVerticalSize=NaN; //this._useUserProjectionMatrix=false; //this._viewportExpressedInClipSpace=false; this._projectionMatrixModifyID=0; //this.clearFlag=0; //this.clearColor=null; //this.cullingMask=0; //this.sky=null; BaseCamera.__super.call(this); (nearPlane===void 0)&& (nearPlane=0.1); (farPlane===void 0)&& (farPlane=1000); this._tempVector3=new Vector3(); this._position=new Vector3(); this._up=new Vector3(); this._forward=new Vector3(); this._right=new Vector3(); this._fieldOfView=60; this._useUserProjectionMatrix=false; this._orthographic=false; this._viewportExpressedInClipSpace=true; this._renderTargetSize=Size.fullScreen; this._orthographicVerticalSize=10; this.renderingOrder=0; this._nearPlane=nearPlane; this._farPlane=farPlane; this.cullingMask=2147483647; this.clearColor=new Vector4(0.26,0.26,0.26,1.0); this.clearFlag=/*CLASS CONST:laya.d3.core.BaseCamera.CLEARFLAG_SOLIDCOLOR*/0; this._calculateProjectionMatrix(); Laya.stage.on(/*laya.events.Event.RESIZE*/"resize",this,this._onScreenSizeChanged); } __class(BaseCamera,'laya.d3.core.BaseCamera',_super); var __proto=BaseCamera.prototype; /** *通过RenderingOrder属性对摄像机机型排序。 */ __proto._sortCamerasByRenderingOrder=function(){ if (this._displayedInStage){ var cameraPool=this.scene._cameraPool; var n=cameraPool.length-1; for (var i=0;i < n;i++){ if (cameraPool[i].renderingOrder > cameraPool[n].renderingOrder){ var tempCamera=cameraPool[i]; cameraPool[i]=cameraPool[n]; cameraPool[n]=tempCamera; } } } } __proto._calculateProjectionMatrix=function(){} __proto._onScreenSizeChanged=function(){ this._calculateProjectionMatrix(); } /** *增加可视图层。 *@param layer 图层。 */ __proto.addLayer=function(layer){ if (layer.number===29 || layer.number==30) return; this.cullingMask=this.cullingMask | layer.mask; } /** *移除可视图层。 *@param layer 图层。 */ __proto.removeLayer=function(layer){ if (layer.number===29 || layer.number==30) return; this.cullingMask=this.cullingMask & ~layer.mask; } /** *增加所有图层。 */ __proto.addAllLayers=function(){ this.cullingMask=2147483647; } /** *移除所有图层。 */ __proto.removeAllLayers=function(){ this.cullingMask=0 | Layer.getLayerByNumber(29).mask | Layer.getLayerByNumber(30).mask; } __proto.ResetProjectionMatrix=function(){ this._useUserProjectionMatrix=false; this._calculateProjectionMatrix(); } __proto.destroy=function(destroyChild){ (destroyChild===void 0)&& (destroyChild=true); this.sky=null; this.renderTarget=null; Laya.stage.off(/*laya.events.Event.RESIZE*/"resize",this,this._onScreenSizeChanged); _super.prototype.destroy.call(this,destroyChild); } /** *向前移动。 *@param distance 移动距离。 */ __proto.moveForward=function(distance){ this._tempVector3.elements[0]=this._tempVector3.elements[1]=0; this._tempVector3.elements[2]=distance; this.transform.translate(this._tempVector3); } /** *向右移动。 *@param distance 移动距离。 */ __proto.moveRight=function(distance){ this._tempVector3.elements[1]=this._tempVector3.elements[2]=0; this._tempVector3.elements[0]=distance; this.transform.translate(this._tempVector3); } /** *向上移动。 *@param distance 移动距离。 */ __proto.moveVertical=function(distance){ this._tempVector3.elements[0]=this._tempVector3.elements[2]=0; this._tempVector3.elements[1]=distance; this.transform.translate(this._tempVector3,false); } //}// BoundingFrustumWorldSpace __proto._addSelfRenderObjects=function(){ var cameraPool=this.scene._cameraPool; var cmaeraCount=cameraPool.length; if (cmaeraCount > 0){ for (var i=cmaeraCount-1;i >=0;i--){ if (this.renderingOrder <=cameraPool[i].renderingOrder){ cameraPool.splice(i+1,0,this); break ; } } }else { cameraPool.push(this); } } __proto._clearSelfRenderObjects=function(){ var cameraPool=this.scene._cameraPool; cameraPool.splice(cameraPool.indexOf(this),1); } /** *获取前向量。 *@return 前向量。 */ __getset(0,__proto,'forward',function(){ var worldMatrixe=this.transform.worldMatrix.elements; var forwarde=this._forward.elements; forwarde[0]=-worldMatrixe[8]; forwarde[1]=-worldMatrixe[9]; forwarde[2]=-worldMatrixe[10]; return this._forward; }); /**获取位置。*/ __getset(0,__proto,'position',function(){ var worldMatrixe=this.transform.worldMatrix.elements; var positione=this._position.elements; positione[0]=worldMatrixe[12]; positione[1]=worldMatrixe[13]; positione[2]=worldMatrixe[14]; return this._position; }); /** *设置远裁面。 *@param value 远裁面。 */ /** *获取远裁面。 *@return 远裁面。 */ __getset(0,__proto,'farPlane',function(){ return this._farPlane; },function(vaule){ this._farPlane=vaule; this._calculateProjectionMatrix(); }); /** *设置渲染场景的渲染目标。 *@param value 渲染场景的渲染目标。 */ /** *获取渲染场景的渲染目标。 *@return 渲染场景的渲染目标。 */ __getset(0,__proto,'renderTarget',function(){ return this._renderTarget; },function(value){ this._renderTarget=value; if (value !=null) this._renderTargetSize=value.size; }); /** *获取上向量。 *@return 上向量。 */ __getset(0,__proto,'up',function(){ var worldMatrixe=this.transform.worldMatrix.elements; var upe=this._up.elements; upe[0]=worldMatrixe[4]; upe[1]=worldMatrixe[5]; upe[2]=worldMatrixe[6]; return this._up; }); /** *获取右向量。 *@return 右向量。 */ __getset(0,__proto,'right',function(){ var worldMatrixe=this.transform.worldMatrix.elements; var righte=this._right.elements; righte[0]=worldMatrixe[0]; righte[1]=worldMatrixe[1]; righte[2]=worldMatrixe[2]; return this._right; }); /** *设置渲染目标的尺寸 *@param value 渲染目标的尺寸。 */ /** *获取渲染目标的尺寸 *@return 渲染目标的尺寸。 */ __getset(0,__proto,'renderTargetSize',function(){ return this._renderTargetSize; },function(value){ if (this.renderTarget !=null && this._renderTargetSize !=value){} this._renderTargetSize=value; this._calculateProjectionMatrix(); }); /** *设置视野。 *@param value 视野。 */ /** *获取视野。 *@return 视野。 */ __getset(0,__proto,'fieldOfView',function(){ return this._fieldOfView; },function(value){ this._fieldOfView=value; this._calculateProjectionMatrix(); }); /** *设置近裁面。 *@param value 近裁面。 */ /** *获取近裁面。 *@return 近裁面。 */ __getset(0,__proto,'nearPlane',function(){ return this._nearPlane; },function(value){ this._nearPlane=value; this._calculateProjectionMatrix(); }); /** *设置是否正交投影矩阵。 *@param 是否正交投影矩阵。 */ /** *获取是否正交投影矩阵。 *@return 是否正交投影矩阵。 */ __getset(0,__proto,'orthographicProjection',function(){ return this._orthographic; },function(vaule){ this._orthographic=vaule; this._calculateProjectionMatrix(); }); /** *设置正交投影垂直矩阵尺寸。 *@param 正交投影垂直矩阵尺寸。 */ /** *获取正交投影垂直矩阵尺寸。 *@return 正交投影垂直矩阵尺寸。 */ __getset(0,__proto,'orthographicVerticalSize',function(){ return this._orthographicVerticalSize; },function(vaule){ this._orthographicVerticalSize=vaule; this._calculateProjectionMatrix(); }); __getset(0,__proto,'renderingOrder',function(){ return this._renderingOrder; },function(value){ this._renderingOrder=value; this._sortCamerasByRenderingOrder(); }); BaseCamera.RENDERINGTYPE_DEFERREDLIGHTING="DEFERREDLIGHTING"; BaseCamera.RENDERINGTYPE_FORWARDRENDERING="FORWARDRENDERING"; BaseCamera.CLEARFLAG_SOLIDCOLOR=0; BaseCamera.CLEARFLAG_SKY=1; BaseCamera.CLEARFLAG_DEPTHONLY=2; BaseCamera.CLEARFLAG_NONE=3; return BaseCamera; })(Sprite3D) /** *Glitter 类用于创建闪光。 */ //class laya.d3.core.glitter.Glitter extends laya.d3.core.Sprite3D var Glitter=(function(_super){ function Glitter(){ this._templet=null; this._glitterRender=null; Glitter.__super.call(this); this._glitterRender=new GlitterRender(this); this._glitterRender.on(/*laya.events.Event.MATERIAL_CHANGED*/"materialchanged",this,this._onMaterialChanged); var material=new GlitterMaterial(); this._glitterRender.sharedMaterial=material; this._templet=new GlitterTemplet(this); material.renderMode=/*laya.d3.core.material.BaseMaterial.RENDERMODE_DEPTHREAD_ADDTIVEDOUBLEFACE*/8; this._changeRenderObject(0); } __class(Glitter,'laya.d3.core.glitter.Glitter',_super); var __proto=Glitter.prototype; /**@private */ __proto._changeRenderObject=function(index){ var renderObjects=this._glitterRender.renderObject._renderElements; var renderElement=renderObjects[index]; (renderElement)|| (renderElement=renderObjects[index]=new RenderElement()); renderElement._renderObject=this._glitterRender.renderObject; var material=this._glitterRender.sharedMaterials[index]; (material)|| (material=GlitterMaterial.defaultMaterial); var element=this._templet; renderElement._mainSortID=0; renderElement._sprite3D=this; renderElement.renderObj=element; renderElement._material=material; return renderElement; } /**@private */ __proto._onMaterialChanged=function(_glitterRender,index,material){ var renderElementCount=_glitterRender.renderObject._renderElements.length; (index < renderElementCount)&& this._changeRenderObject(index); } /**@private */ __proto._clearSelfRenderObjects=function(){ this.scene.removeFrustumCullingObject(this._glitterRender.renderObject); } /**@private */ __proto._addSelfRenderObjects=function(){ this.scene.addFrustumCullingObject(this._glitterRender.renderObject); } /** *@private *更新闪光。 *@param state 渲染状态参数。 */ __proto._update=function(state){ this._templet._update(state.elapsedTime); state.owner=this; Stat.spriteCount++; this._childs.length && this._updateChilds(state); } /** *通过位置添加刀光。 *@param position0 位置0。 *@param position1 位置1。 */ __proto.addGlitterByPositions=function(position0,position1){ this._templet.addVertexPosition(position0,position1); } /** *通过位置和速度添加刀光。 *@param position0 位置0。 *@param velocity0 速度0。 *@param position1 位置1。 *@param velocity1 速度1。 */ __proto.addGlitterByPositionsVelocitys=function(position0,velocity0,position1,velocity1){ this._templet.addVertexPositionVelocity(position0,velocity0,position1,velocity1); } __proto.cloneTo=function(destObject){ _super.prototype.cloneTo.call(this,destObject); var destGlitter=destObject; var destTemplet=destGlitter.templet; destTemplet.lifeTime=this._templet.lifeTime; destTemplet.minSegmentDistance=this._templet.minSegmentDistance; destTemplet.minInterpDistance=this._templet.minInterpDistance; destTemplet.maxSlerpCount=this._templet.maxSlerpCount; this._templet.color.cloneTo(destTemplet.color); destTemplet._maxSegments=this._templet._maxSegments; var destGlitterRender=destGlitter._glitterRender; destGlitterRender.sharedMaterials=this._glitterRender.sharedMaterials; destGlitterRender.enable=this._glitterRender.enable; } /** *

销毁此对象。

*@param destroyChild 是否同时销毁子节点,若值为true,则销毁子节点,否则不销毁子节点。 */ __proto.destroy=function(destroyChild){ (destroyChild===void 0)&& (destroyChild=true); _super.prototype.destroy.call(this,destroyChild); this._glitterRender._destroy(); this._templet=null; } /** *获取闪光模板。 *@return 闪光模板。 */ __getset(0,__proto,'templet',function(){ return this._templet; }); /** *获取刀光渲染器。 *@return 刀光渲染器。 */ __getset(0,__proto,'glitterRender',function(){ return this._glitterRender; }); return Glitter; })(Sprite3D) /** *LightSprite 类用于创建灯光的父类。 */ //class laya.d3.core.light.LightSprite extends laya.d3.core.Sprite3D var LightSprite=(function(_super){ function LightSprite(){ this._diffuseColor=null; this._ambientColor=null; this._specularColor=null; this._reflectColor=null; LightSprite.__super.call(this); this.on(/*laya.events.Event.ADDED*/"added",this,this._onAdded); this.on(/*laya.events.Event.REMOVED*/"removed",this,this._onRemoved); this._diffuseColor=new Vector3(0.8,0.8,0.8); this._ambientColor=new Vector3(0.6,0.6,0.6); this._specularColor=new Vector3(1.0,1.0,1.0); this._reflectColor=new Vector3(1.0,1.0,1.0); } __class(LightSprite,'laya.d3.core.light.LightSprite',_super); var __proto=LightSprite.prototype; /** *@private *灯光节点移除事件处理函数。 */ __proto._onRemoved=function(){ this.scene._removeLight(this); } /** *@private *灯光节点添加事件处理函数。 */ __proto._onAdded=function(){ this.scene._addLight(this); } /** *更新灯光相关渲染状态参数。 *@param state 渲染状态参数。 */ __proto.updateToWorldState=function(state){} /** *设置灯光的漫反射颜色。 *@param value 灯光的漫反射颜色。 */ /** *获取灯光的漫反射颜色。 *@return 灯光的漫反射颜色。 */ __getset(0,__proto,'diffuseColor',function(){ return this._diffuseColor; },function(value){ this._diffuseColor=value; }); /** *设置灯光的环境光颜色。 *@param value 灯光的环境光颜色。 */ /** *获取灯光的环境光颜色。 *@return 灯光的环境光颜色。 */ __getset(0,__proto,'ambientColor',function(){ return this._ambientColor; },function(value){ this._ambientColor=value; }); /** *获取灯光的类型。 *@return 灯光的类型。 */ __getset(0,__proto,'lightType',function(){ return-1; }); /** *设置灯光的高光颜色。 *@param value 灯光的高光颜色。 */ /** *获取灯光的高光颜色。 *@return 灯光的高光颜色。 */ __getset(0,__proto,'specularColor',function(){ return this._specularColor; },function(value){ this._specularColor=value; }); /** *设置灯光的反射颜色。 *@param value 灯光的反射颜色。 */ /** *获取灯光的反射颜色。 *@return 灯光的反射颜色。 */ __getset(0,__proto,'reflectColor',function(){ return this._reflectColor; },function(value){ this._reflectColor=value; }); LightSprite.TYPE_DIRECTIONLIGHT=1; LightSprite.TYPE_POINTLIGHT=2; LightSprite.TYPE_SPOTLIGHT=3; return LightSprite; })(Sprite3D) /** *MeshSprite3D 类用于创建网格。 */ //class laya.d3.core.MeshSprite3D extends laya.d3.core.Sprite3D var MeshSprite3D=(function(_super){ function MeshSprite3D(mesh,name){ this._meshFilter=null; this._meshRender=null; MeshSprite3D.__super.call(this,name); this._meshFilter=new MeshFilter(this); this._meshRender=new MeshRender(this); this._meshFilter.on(/*laya.events.Event.MESH_CHANGED*/"meshchanged",this,this._onMeshChanged); this._meshRender.on(/*laya.events.Event.MATERIAL_CHANGED*/"materialchanged",this,this._onMaterialChanged); if (mesh){ this._meshFilter.sharedMesh=mesh; if ((mesh instanceof laya.d3.resource.models.Mesh )) if (mesh.loaded) this._meshRender.sharedMaterials=(mesh).materials; else mesh.once(/*laya.events.Event.LOADED*/"loaded",this,this._applyMeshMaterials); } } __class(MeshSprite3D,'laya.d3.core.MeshSprite3D',_super); var __proto=MeshSprite3D.prototype; /**@private */ __proto._changeRenderObjectByMesh=function(index){ var renderObjects=this._meshRender.renderObject._renderElements; var renderElement=renderObjects[index]; (renderElement)|| (renderElement=renderObjects[index]=new RenderElement()); renderElement._renderObject=this._meshRender.renderObject; var material=this._meshRender.sharedMaterials[index]; (material)|| (material=StandardMaterial.defaultMaterial); var element=this._meshFilter.sharedMesh.getRenderElement(index); renderElement._mainSortID=this._getSortID(element,material); renderElement._sprite3D=this; renderElement.renderObj=element; renderElement._material=material; return renderElement; } /**@private */ __proto._changeRenderObjectByMaterial=function(index,material){ var renderElement=this._meshRender.renderObject._renderElements[index]; var element=this._meshFilter.sharedMesh.getRenderElement(index); renderElement._mainSortID=this._getSortID(element,material); renderElement._sprite3D=this; renderElement.renderObj=element; renderElement._material=material; return renderElement; } /**@private */ __proto._changeRenderObjectsByMesh=function(){ var renderElementsCount=this._meshFilter.sharedMesh.getRenderElementsCount(); this._meshRender.renderObject._renderElements.length=renderElementsCount; for (var i=0;i < renderElementsCount;i++) this._changeRenderObjectByMesh(i); } /**@private */ __proto._onMeshChanged=function(meshFilter){ var mesh=meshFilter.sharedMesh; if (mesh.loaded) this._changeRenderObjectsByMesh(); else mesh.once(/*laya.events.Event.LOADED*/"loaded",this,this._onMeshLoaded); } /**@private */ __proto._onMeshLoaded=function(sender){ (sender===this.meshFilter.sharedMesh)&& (this._changeRenderObjectsByMesh()); } /**@private */ __proto._onMaterialChanged=function(meshRender,index,material){ var renderElementCount=this._meshRender.renderObject._renderElements.length; (index < renderElementCount)&& this._changeRenderObjectByMaterial(index,material); } /**@private */ __proto._clearSelfRenderObjects=function(){ this.scene.removeFrustumCullingObject(this._meshRender.renderObject); } /**@private */ __proto._addSelfRenderObjects=function(){ this.scene.addFrustumCullingObject(this._meshRender.renderObject); } /**@private */ __proto._applyMeshMaterials=function(mesh){ var shaderMaterials=this._meshRender.sharedMaterials; var meshMaterials=mesh.materials; for (var i=0,n=meshMaterials.length;i < n;i++) (shaderMaterials[i])|| (shaderMaterials[i]=meshMaterials[i]); this._meshRender.sharedMaterials=shaderMaterials; } /** *@private */ __proto._update=function(state){ state.owner=this; if (this._enable){ this._updateComponents(state); this._lateUpdateComponents(state); } Stat.spriteCount++; this._childs.length && this._updateChilds(state); } __proto.cloneTo=function(destObject){ _super.prototype.cloneTo.call(this,destObject); var meshSprite3D=destObject; meshSprite3D._meshFilter.sharedMesh=this._meshFilter.sharedMesh; var destMeshRender=meshSprite3D._meshRender; destMeshRender.enable=this._meshRender.enable; destMeshRender.sharedMaterials=this._meshRender.sharedMaterials; destMeshRender.castShadow=this._meshRender.castShadow; destMeshRender.receiveShadow=this._meshRender.receiveShadow; } __proto.destroy=function(destroyChild){ (destroyChild===void 0)&& (destroyChild=true); _super.prototype.destroy.call(this,destroyChild); this._meshFilter._destroy(); this._meshRender._destroy(); } /** *获取网格过滤器。 *@return 网格过滤器。 */ __getset(0,__proto,'meshFilter',function(){ return this._meshFilter; }); /** *获取网格渲染器。 *@return 网格渲染器。 */ __getset(0,__proto,'meshRender',function(){ return this._meshRender; }); return MeshSprite3D; })(Sprite3D) /** *Particle3D 3D粒子。 */ //class laya.d3.core.particle.Particle3D extends laya.d3.core.Sprite3D var Particle3D=(function(_super){ function Particle3D(setting){ this._setting=null; this._templet=null; this._particleRender=null; Particle3D.__super.call(this); this._setting=setting; this._particleRender=new ParticleRender(this); this._particleRender.on(/*laya.events.Event.MATERIAL_CHANGED*/"materialchanged",this,this._onMaterialChanged); var material=new ParticleMaterial(); if (setting.textureName){ material.diffuseTexture=Texture2D.load(setting.textureName); } this._particleRender.sharedMaterial=material; this._templet=new ParticleTemplet3D(this,setting); if (setting.blendState===0) material.renderMode=/*laya.d3.core.material.BaseMaterial.RENDERMODE_DEPTHREAD_TRANSPARENT*/5; else if (setting.blendState===1) material.renderMode=/*laya.d3.core.material.BaseMaterial.RENDERMODE_DEPTHREAD_ADDTIVE*/7; this._changeRenderObject(0); } __class(Particle3D,'laya.d3.core.particle.Particle3D',_super); var __proto=Particle3D.prototype; /**@private */ __proto._changeRenderObject=function(index){ var renderObjects=this._particleRender.renderObject._renderElements; var renderElement=renderObjects[index]; (renderElement)|| (renderElement=renderObjects[index]=new RenderElement()); renderElement._renderObject=this._particleRender.renderObject; var material=this._particleRender.sharedMaterials[index]; (material)|| (material=ParticleMaterial.defaultMaterial); var element=this._templet; renderElement._mainSortID=0; renderElement._sprite3D=this; renderElement.renderObj=element; renderElement._material=material; return renderElement; } /**@private */ __proto._onMaterialChanged=function(_particleRender,index,material){ var renderElementCount=_particleRender.renderObject._renderElements.length; (index < renderElementCount)&& this._changeRenderObject(index); } /**@private */ __proto._clearSelfRenderObjects=function(){ this.scene.removeFrustumCullingObject(this._particleRender.renderObject); } /**@private */ __proto._addSelfRenderObjects=function(){ this.scene.addFrustumCullingObject(this._particleRender.renderObject); } /** *更新粒子。 *@param state 渲染相关状态参数。 */ __proto._update=function(state){ this._templet.update(state.elapsedTime); state.owner=this; Stat.spriteCount++; this._childs.length && this._updateChilds(state); } /** *添加粒子。 *@param position 粒子位置。 *@param velocity 粒子速度。 */ __proto.addParticle=function(position,velocity){ Vector3.add(this.transform.localPosition,position,position); this._templet.addParticle(position,velocity); } __proto.cloneTo=function(destObject){ _super.prototype.cloneTo.call(this,destObject); var destParticle3D=destObject; destParticle3D._templet=this._templet; var destParticleRender=destParticle3D._particleRender; destParticleRender.sharedMaterials=this._particleRender.sharedMaterials; destParticleRender.enable=this._particleRender.enable; } /** *

销毁此对象。

*@param destroyChild 是否同时销毁子节点,若值为true,则销毁子节点,否则不销毁子节点。 */ __proto.destroy=function(destroyChild){ (destroyChild===void 0)&& (destroyChild=true); _super.prototype.destroy.call(this,destroyChild); this._particleRender._destroy(); this._templet=null; } /** *获取粒子模板。 *@return 粒子模板。 */ __getset(0,__proto,'templet',function(){ return this._templet; }); /** *获取粒子渲染器。 *@return 粒子渲染器。 */ __getset(0,__proto,'particleRender',function(){ return this._particleRender; }); return Particle3D; })(Sprite3D) /** *ShuriKenParticle3D 3D粒子。 */ //class laya.d3.core.particleShuriKen.ShuriKenParticle3D extends laya.d3.core.Sprite3D var ShuriKenParticle3D=(function(_super){ function ShuriKenParticle3D(material){ this._particleSystem=null; this._particleRender=null; ShuriKenParticle3D.__super.call(this); this._particleRender=new ShurikenParticleRender(this); this._particleRender.on(/*laya.events.Event.MATERIAL_CHANGED*/"materialchanged",this,this._onMaterialChanged); this._particleSystem=new ShurikenParticleSystem(this); this._changeRenderObject(0); (material)&& (this._particleRender.sharedMaterial=material); } __class(ShuriKenParticle3D,'laya.d3.core.particleShuriKen.ShuriKenParticle3D',_super); var __proto=ShuriKenParticle3D.prototype; /**@private */ __proto._changeRenderObject=function(index){ var renderObjects=this._particleRender.renderObject._renderElements; var renderElement=renderObjects[index]; (renderElement)|| (renderElement=renderObjects[index]=new RenderElement()); renderElement._renderObject=this._particleRender.renderObject; var material=this._particleRender.sharedMaterials[index]; (material)|| (material=ShurikenParticleMaterial.defaultMaterial); var element=this._particleSystem; renderElement._mainSortID=0; renderElement._sprite3D=this; renderElement.renderObj=element; renderElement._material=material; return renderElement; } /**@private */ __proto._onMaterialChanged=function(_particleRender,index,material){ var renderElementCount=_particleRender.renderObject._renderElements.length; (index < renderElementCount)&& this._changeRenderObject(index); } /**@private */ __proto._clearSelfRenderObjects=function(){ this.scene.removeFrustumCullingObject(this._particleRender.renderObject); } /**@private */ __proto._addSelfRenderObjects=function(){ this.scene.addFrustumCullingObject(this._particleRender.renderObject); } /** *更新粒子。 *@param state 渲染相关状态参数。 */ __proto._update=function(state){ state.owner=this; this._particleSystem.update(state); Stat.spriteCount++; this._childs.length && this._updateChilds(state); } __proto.cloneTo=function(destObject){ _super.prototype.cloneTo.call(this,destObject); var destShuriKenParticle3D=destObject; var destParticleSystem=destShuriKenParticle3D._particleSystem; destParticleSystem.duration=this._particleSystem.duration; destParticleSystem.looping=this._particleSystem.looping; destParticleSystem.prewarm=this._particleSystem.prewarm; destParticleSystem.startDelayType=this._particleSystem.startDelayType; destParticleSystem.startDelay=this._particleSystem.startDelay; destParticleSystem.startDelayMin=this._particleSystem.startDelayMin; destParticleSystem.startDelayMax=this._particleSystem.startDelayMax; destParticleSystem.startLifetimeType=this._particleSystem.startLifetimeType; destParticleSystem.startLifetimeConstant=this._particleSystem.startLifetimeConstant; this._particleSystem.startLifeTimeGradient.cloneTo(destParticleSystem.startLifeTimeGradient); destParticleSystem.startLifetimeConstantMin=this._particleSystem.startLifetimeConstantMin; destParticleSystem.startLifetimeConstantMax=this._particleSystem.startLifetimeConstantMax; this._particleSystem.startLifeTimeGradientMin.cloneTo(destParticleSystem.startLifeTimeGradientMin); this._particleSystem.startLifeTimeGradientMax.cloneTo(destParticleSystem.startLifeTimeGradientMax); destParticleSystem.startSpeedType=this._particleSystem.startSpeedType; destParticleSystem.startSpeedConstant=this._particleSystem.startSpeedConstant; destParticleSystem.startSpeedConstantMin=this._particleSystem.startSpeedConstantMin; destParticleSystem.startSpeedConstantMax=this._particleSystem.startSpeedConstantMax; destParticleSystem.threeDStartSize=this._particleSystem.threeDStartSize; destParticleSystem.startSizeType=this._particleSystem.startSizeType; destParticleSystem.startSizeConstant=this._particleSystem.startSizeConstant; this._particleSystem.startSizeConstantSeparate.cloneTo(destParticleSystem.startSizeConstantSeparate); destParticleSystem.startSizeConstantMin=this._particleSystem.startSizeConstantMin; destParticleSystem.startSizeConstantMax=this._particleSystem.startSizeConstantMax; this._particleSystem.startSizeConstantMinSeparate.cloneTo(destParticleSystem.startSizeConstantMinSeparate); this._particleSystem.startSizeConstantMaxSeparate.cloneTo(destParticleSystem.startSizeConstantMaxSeparate); destParticleSystem.threeDStartRotation=this._particleSystem.threeDStartRotation; destParticleSystem.startRotationType=this._particleSystem.startRotationType; destParticleSystem.startRotationConstant=this._particleSystem.startRotationConstant; this._particleSystem.startRotationConstantSeparate.cloneTo(destParticleSystem.startRotationConstantSeparate); destParticleSystem.startRotationConstantMin=this._particleSystem.startRotationConstantMin; destParticleSystem.startRotationConstantMax=this._particleSystem.startRotationConstantMax; this._particleSystem.startRotationConstantMinSeparate.cloneTo(destParticleSystem.startRotationConstantMinSeparate); this._particleSystem.startRotationConstantMaxSeparate.cloneTo(destParticleSystem.startRotationConstantMaxSeparate); destParticleSystem.randomizeRotationDirection=this._particleSystem.randomizeRotationDirection; destParticleSystem.startColorType=this._particleSystem.startColorType; this._particleSystem.startColorConstant.cloneTo(destParticleSystem.startColorConstant); this._particleSystem.startColorConstantMin.cloneTo(destParticleSystem.startColorConstantMin); this._particleSystem.startColorConstantMax.cloneTo(destParticleSystem.startColorConstantMax); this._particleSystem.gravity.cloneTo(destParticleSystem.gravity); destParticleSystem.gravityModifier=this._particleSystem.gravityModifier; destParticleSystem.simulationSpace=this._particleSystem.simulationSpace; destParticleSystem.scaleMode=this._particleSystem.scaleMode; destParticleSystem.playOnAwake=this._particleSystem.playOnAwake; this._particleSystem.velocityOverLifetime.cloneTo(destParticleSystem.velocityOverLifetime); this._particleSystem.colorOverLifetime.cloneTo(destParticleSystem.colorOverLifetime); this._particleSystem.sizeOverLifetime.cloneTo(destParticleSystem.sizeOverLifetime); this._particleSystem.rotationOverLifetime.cloneTo(destParticleSystem.rotationOverLifetime); this._particleSystem.textureSheetAnimation.cloneTo(destParticleSystem.textureSheetAnimation); destParticleSystem.isPerformanceMode=this._particleSystem.isPerformanceMode; var destParticleRender=destShuriKenParticle3D._particleRender; destParticleRender.sharedMaterials=this._particleRender.sharedMaterials; destParticleRender.enable=this._particleRender.enable; destParticleRender.renderMode=this._particleRender.renderMode; destParticleRender.stretchedBillboardCameraSpeedScale=this._particleRender.stretchedBillboardCameraSpeedScale; destParticleRender.stretchedBillboardSpeedScale=this._particleRender.stretchedBillboardSpeedScale; destParticleRender.stretchedBillboardLengthScale=this._particleRender.stretchedBillboardLengthScale; } /** *

销毁此对象。

*@param destroyChild 是否同时销毁子节点,若值为true,则销毁子节点,否则不销毁子节点。 */ __proto.destroy=function(destroyChild){ (destroyChild===void 0)&& (destroyChild=true); _super.prototype.destroy.call(this,destroyChild); this._particleRender._destroy(); this._particleSystem._destroy(); this._particleRender=null; this._particleSystem=null; } /** *获取粒子系统。 *@return 粒子系统。 */ __getset(0,__proto,'particleSystem',function(){ return this._particleSystem; }); /** *获取粒子渲染器。 *@return 粒子渲染器。 */ __getset(0,__proto,'particleRender',function(){ return this._particleRender; }); return ShuriKenParticle3D; })(Sprite3D) /** *... *@author ... */ //class laya.d3.core.material.GlitterMaterial extends laya.d3.core.material.BaseMaterial var GlitterMaterial=(function(_super){ function GlitterMaterial(){ GlitterMaterial.__super.call(this); this.setShaderName("GLITTER"); } __class(GlitterMaterial,'laya.d3.core.material.GlitterMaterial',_super); var __proto=GlitterMaterial.prototype; __proto._setLoopShaderParams=function(state,projectionView,worldMatrix,mesh,material){ var glitter=state.owner; var templet=glitter.templet; state.shaderValue.pushValue("UNICOLOR",templet.color.elements); state.shaderValue.pushValue("MVPMATRIX",state.projectionViewMatrix.elements); state.shaderValue.pushValue("DURATION",templet.lifeTime); state.shaderValue.pushValue("ALBEDO",templet._albedo.elements); state.shaderValue.pushValue("CURRENTTIME",templet._currentTime); } /** *设置漫反射贴图。 *@param value 漫反射贴图。 */ /** *获取漫反射贴图。 *@return 漫反射贴图。 */ __getset(0,__proto,'diffuseTexture',function(){ return this._getTexture(0); },function(value){ if (value){ this._addShaderDefine(/*laya.d3.shader.ShaderDefines3D.DIFFUSEMAP*/0x1); }else { this._removeShaderDefine(/*laya.d3.shader.ShaderDefines3D.DIFFUSEMAP*/0x1); } this._setTexture(value,0,"DIFFUSETEXTURE"); }); GlitterMaterial.load=function(url){ return Laya.loader.create(url,null,null,GlitterMaterial); } GlitterMaterial.TIME="TIME"; GlitterMaterial.DIFFUSETEXTURE="DIFFUSETEXTURE"; GlitterMaterial.MVPMATRIX="MVPMATRIX"; GlitterMaterial.ALBEDO="ALBEDO"; GlitterMaterial.CURRENTTIME="CURRENTTIME"; GlitterMaterial.UNICOLOR="UNICOLOR"; GlitterMaterial.DURATION="DURATION"; GlitterMaterial._diffuseTextureIndex=0; __static(GlitterMaterial, ['defaultMaterial',function(){return this.defaultMaterial=new GlitterMaterial();} ]); return GlitterMaterial; })(BaseMaterial) /** *... *@author ... */ //class laya.d3.core.material.ParticleMaterial extends laya.d3.core.material.BaseMaterial var ParticleMaterial=(function(_super){ function ParticleMaterial(){ ParticleMaterial.__super.call(this); this._addShaderDefine(/*laya.d3.shader.ShaderDefines3D.PARTICLE3D*/0x40000); this.setShaderName("PARTICLE"); } __class(ParticleMaterial,'laya.d3.core.material.ParticleMaterial',_super); var __proto=ParticleMaterial.prototype; __proto._setLoopShaderParams=function(state,projectionView,worldMatrix,mesh,material){ var particle=state.owner; var templet=particle.templet; var setting=templet.settings; state.shaderValue.pushValue("DURATION",setting.duration); state.shaderValue.pushValue("GRAVITY",setting.gravity); state.shaderValue.pushValue("ENDVELOCITY",setting.endVelocity); state.shaderValue.pushValue("MVPMATRIX",worldMatrix.elements); state.shaderValue.pushValue("MATRIX1",state.viewMatrix.elements); state.shaderValue.pushValue("MATRIX2",state.projectionMatrix.elements); var aspectRadio=state.viewport.width / state.viewport.height; var viewportScale=new Vector2(0.5 / aspectRadio,-0.5); state.shaderValue.pushValue("VIEWPORTSCALE",viewportScale.elements); state.shaderValue.pushValue("CURRENTTIME",templet._currentTime); } /** *设置漫反射贴图。 *@param value 漫反射贴图。 */ /** *获取漫反射贴图。 *@return 漫反射贴图。 */ __getset(0,__proto,'diffuseTexture',function(){ return this._getTexture(0); },function(value){ if (value){ this._addShaderDefine(/*laya.d3.shader.ShaderDefines3D.DIFFUSEMAP*/0x1); }else { this._removeShaderDefine(/*laya.d3.shader.ShaderDefines3D.DIFFUSEMAP*/0x1); } this._setTexture(value,0,"DIFFUSETEXTURE"); }); ParticleMaterial.load=function(url){ return Laya.loader.create(url,null,null,ParticleMaterial); } ParticleMaterial.WORLDMATRIX="MVPMATRIX"; ParticleMaterial.VIEWMATRIX="MATRIX1"; ParticleMaterial.PROJECTIONMATRIX="MATRIX2"; ParticleMaterial.VIEWPORTSCALE="VIEWPORTSCALE"; ParticleMaterial.CURRENTTIME="CURRENTTIME"; ParticleMaterial.DURATION="DURATION"; ParticleMaterial.GRAVITY="GRAVITY"; ParticleMaterial.ENDVELOCITY="ENDVELOCITY"; ParticleMaterial.DIFFUSETEXTURE="DIFFUSETEXTURE"; ParticleMaterial._diffuseTextureIndex=0; __static(ParticleMaterial, ['defaultMaterial',function(){return this.defaultMaterial=new ParticleMaterial();} ]); return ParticleMaterial; })(BaseMaterial) /** *... *@author ... */ //class laya.d3.core.material.StandardMaterial extends laya.d3.core.material.BaseMaterial var StandardMaterial=(function(_super){ function StandardMaterial(){ this._transformUV=null; StandardMaterial.__super.call(this); this._setColor(0,"MATERIALAMBIENT",new Vector3(0.6,0.6,0.6)); this._setColor(1,"MATERIALDIFFUSE",new Vector3(1.0,1.0,1.0)); this._setColor(2,"MATERIALSPECULAR",new Vector4(1.0,1.0,1.0,8.0)); this._setColor(3,"MATERIALREFLECT",new Vector3(1.0,1.0,1.0)); this._setColor(4,"ALBEDO",new Vector4(1.0,1.0,1.0,1.0)); this._setNumber(0,"ALPHATESTVALUE",0.5); this.setShaderName("SIMPLE"); } __class(StandardMaterial,'laya.d3.core.material.StandardMaterial',_super); var __proto=StandardMaterial.prototype; /** *禁用灯光。 */ __proto.disableLight=function(){ this._addDisableShaderDefine(/*laya.d3.shader.ShaderDefines3D.POINTLIGHT*/0x2000 | /*laya.d3.shader.ShaderDefines3D.SPOTLIGHT*/0x4000 | /*laya.d3.shader.ShaderDefines3D.DIRECTIONLIGHT*/0x1000); } /** *禁用雾化。 */ __proto.disableFog=function(){ this._addDisableShaderDefine(/*laya.d3.shader.ShaderDefines3D.FOG*/0x200); } __proto._setLoopShaderParams=function(state,projectionView,worldMatrix,mesh,material){ (this._transformUV)&& (this._transformUV.matrix); var pvw; if (worldMatrix===Matrix4x4.DEFAULT){ pvw=projectionView; }else { pvw=StandardMaterial._tempMatrix4x40; Matrix4x4.multiply(projectionView,worldMatrix,pvw); } state.shaderValue.pushValue("MATRIX1",worldMatrix.elements); state.shaderValue.pushValue("MVPMATRIX",pvw.elements); } /** *设置环境光颜色。 *@param value 环境光颜色。 */ __getset(0,__proto,'ambientColor',function(){ return this._getColor(0); },function(value){ this._setColor(0,"MATERIALAMBIENT",value); }); /** *设置反射率。 *@param value 反射率。 */ __getset(0,__proto,'albedo',function(){ return this._getColor(4); },function(value){ this._setColor(4,"ALBEDO",value); }); /** *设置漫反射光颜色。 *@param value 漫反射光颜色。 */ __getset(0,__proto,'diffuseColor',function(){ return this._getColor(1); },function(value){ this._setColor(1,"MATERIALDIFFUSE",value); }); /** *设置高光颜色。 *@param value 高光颜色。 */ __getset(0,__proto,'specularColor',function(){ return this._getColor(2); },function(value){ this._setColor(2,"MATERIALSPECULAR",value); }); /** *设置法线贴图。 *@param value 法线贴图。 */ /** *获取法线贴图。 *@return 法线贴图。 */ __getset(0,__proto,'normalTexture',function(){ return this._getTexture(1); },function(value){ if (value){ this._addShaderDefine(/*laya.d3.shader.ShaderDefines3D.NORMALMAP*/0x2); }else { this._removeShaderDefine(/*laya.d3.shader.ShaderDefines3D.NORMALMAP*/0x2); } this._setTexture(value,1,"NORMALTEXTURE"); }); /** *设置反射颜色。 *@param value 反射颜色。 */ __getset(0,__proto,'reflectColor',function(){ return this._getColor(3); },function(value){ this._setColor(3,"MATERIALREFLECT",value); }); /** *设置漫反射贴图。 *@param value 漫反射贴图。 */ /** *获取漫反射贴图。 *@return 漫反射贴图。 */ __getset(0,__proto,'diffuseTexture',function(){ return this._getTexture(0); },function(value){ if (value){ this._addShaderDefine(/*laya.d3.shader.ShaderDefines3D.DIFFUSEMAP*/0x1); }else { this._removeShaderDefine(/*laya.d3.shader.ShaderDefines3D.DIFFUSEMAP*/0x1); } this._setTexture(value,0,"DIFFUSETEXTURE"); }); /** *设置透明测试模式裁剪值。 *@param value 透明测试模式裁剪值。 */ /** *获取透明测试模式裁剪值。 *@return 透明测试模式裁剪值。 */ __getset(0,__proto,'alphaTestValue',function(){ return this._getNumber(0); },function(value){ this._setNumber(0,"ALPHATESTVALUE",value); }); /** *设置高光贴图。 *@param value 高光贴图。 */ /** *获取高光贴图。 *@return 高光贴图。 */ __getset(0,__proto,'specularTexture',function(){ return this._getTexture(2); },function(value){ if (value){ this._addShaderDefine(/*laya.d3.shader.ShaderDefines3D.SPECULARMAP*/0x4); }else { this._removeShaderDefine(/*laya.d3.shader.ShaderDefines3D.SPECULARMAP*/0x4); } this._setTexture(value,2,"SPECULARTEXTURE"); }); /** *设置放射贴图。 *@param value 放射贴图。 */ /** *获取放射贴图。 *@return 放射贴图。 */ __getset(0,__proto,'emissiveTexture',function(){ return this._getTexture(3); },function(value){ if (value){ this._addShaderDefine(/*laya.d3.shader.ShaderDefines3D.EMISSIVEMAP*/0x8); }else { this._removeShaderDefine(/*laya.d3.shader.ShaderDefines3D.EMISSIVEMAP*/0x8); } this._setTexture(value,3,"EMISSIVETEXTURE"); }); /** *设置环境贴图。 *@param value 环境贴图。 */ /** *获取环境贴图。 *@return 环境贴图。 */ __getset(0,__proto,'ambientTexture',function(){ return this._getTexture(4); },function(value){ if (value){ this._addShaderDefine(/*laya.d3.shader.ShaderDefines3D.AMBIENTMAP*/0x10); }else { this._removeShaderDefine(/*laya.d3.shader.ShaderDefines3D.AMBIENTMAP*/0x10); } this._setTexture(value,4,"AMBIENTTEXTURE"); }); /** *设置反射贴图。 *@param value 反射贴图。 */ /** *获取反射贴图。 *@return 反射贴图。 */ __getset(0,__proto,'reflectTexture',function(){ return this._getTexture(5); },function(value){ if (value){ this._addShaderDefine(/*laya.d3.shader.ShaderDefines3D.REFLECTMAP*/0x20); }else { this._removeShaderDefine(/*laya.d3.shader.ShaderDefines3D.REFLECTMAP*/0x20); } this._setTexture(value,5,"REFLECTTEXTURE"); }); /** *设置UV变换。 *@param value UV变换。 */ /** *获取UV变换。 *@return UV变换。 */ __getset(0,__proto,'transformUV',function(){ return this._transformUV; },function(value){ this._transformUV=value; this._setMatrix4x4(0,"MATRIX2",value.matrix); if (value) this._addShaderDefine(/*laya.d3.shader.ShaderDefines3D.UVTRANSFORM*/0x100); else this._removeShaderDefine(/*laya.d3.shader.ShaderDefines3D.UVTRANSFORM*/0x100); }); StandardMaterial.load=function(url){ return Laya.loader.create(url,null,null,StandardMaterial); } StandardMaterial.WORLDMATRIX="MATRIX1"; StandardMaterial.MVPMATRIX="MVPMATRIX"; StandardMaterial.DIFFUSETEXTURE="DIFFUSETEXTURE"; StandardMaterial.NORMALTEXTURE="NORMALTEXTURE"; StandardMaterial.SPECULARTEXTURE="SPECULARTEXTURE"; StandardMaterial.EMISSIVETEXTURE="EMISSIVETEXTURE"; StandardMaterial.AMBIENTTEXTURE="AMBIENTTEXTURE"; StandardMaterial.REFLECTTEXTURE="REFLECTTEXTURE"; StandardMaterial.Bones="MATRIXARRAY0"; StandardMaterial.ALBEDO="ALBEDO"; StandardMaterial.ALPHATESTVALUE="ALPHATESTVALUE"; StandardMaterial.UVANIAGE="UVAGEX"; StandardMaterial.MATERIALAMBIENT="MATERIALAMBIENT"; StandardMaterial.MATERIALDIFFUSE="MATERIALDIFFUSE"; StandardMaterial.MATERIALSPECULAR="MATERIALSPECULAR"; StandardMaterial.MATERIALREFLECT="MATERIALREFLECT"; StandardMaterial.UVMATRIX="MATRIX2"; StandardMaterial.UVAGE="FLOAT0"; StandardMaterial._ambientColorIndex=0; StandardMaterial._diffuseColorIndex=1; StandardMaterial._speclarColorIndex=2; StandardMaterial._reflectColorIndex=3; StandardMaterial._albedoColorIndex=4; StandardMaterial._alphaTestValueIndex=0; StandardMaterial._diffuseTextureIndex=0; StandardMaterial._normalTextureIndex=1; StandardMaterial._specularTextureIndex=2; StandardMaterial._emissiveTextureIndex=3; StandardMaterial._ambientTextureIndex=4; StandardMaterial._reflectTextureIndex=5; StandardMaterial.TRANSFORMUV=0; __static(StandardMaterial, ['_tempMatrix4x40',function(){return this._tempMatrix4x40=new Matrix4x4();},'defaultMaterial',function(){return this.defaultMaterial=new StandardMaterial();} ]); return StandardMaterial; })(BaseMaterial) /** *IndexBuffer3D 类用于创建索引缓冲。 */ //class laya.d3.graphics.IndexBuffer3D extends laya.webgl.utils.Buffer var IndexBuffer3D=(function(_super){ function IndexBuffer3D(indexType,indexCount,bufferUsage,canRead){ this._indexType=null; this._indexTypeByteCount=0; this._indexCount=0; this._canRead=false; (bufferUsage===void 0)&& (bufferUsage=/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4); (canRead===void 0)&& (canRead=false); IndexBuffer3D.__super.call(this); this._indexType=indexType; this._indexCount=indexCount; this._bufferUsage=bufferUsage; this._bufferType=/*laya.webgl.WebGLContext.ELEMENT_ARRAY_BUFFER*/0x8893; this._canRead=canRead; this._bind(); var byteLength=0; if (indexType==/*CLASS CONST:laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort") this._indexTypeByteCount=2; else if (indexType==/*CLASS CONST:laya.d3.graphics.IndexBuffer3D.INDEXTYPE_UBYTE*/"ubyte") this._indexTypeByteCount=1; else throw new Error("unidentification index type."); byteLength=this._indexTypeByteCount *indexCount; this._byteLength=byteLength; Buffer._gl.bufferData(this._bufferType,byteLength,this._bufferUsage); if (canRead){ if (indexType==/*CLASS CONST:laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort") this._buffer=new Uint16Array(indexCount); else if (indexType==/*CLASS CONST:laya.d3.graphics.IndexBuffer3D.INDEXTYPE_UBYTE*/"ubyte") this._buffer=new Uint8Array(indexCount); this.memorySize=byteLength *2; }else { this.memorySize=byteLength; } } __class(IndexBuffer3D,'laya.d3.graphics.IndexBuffer3D',_super); var __proto=IndexBuffer3D.prototype; /** *设置数据。 *@param data 索引数据。 *@param bufferOffset 索引缓冲中的偏移。 *@param dataStartIndex 索引数据的偏移。 *@param dataCount 索引数据的数量。 */ __proto.setData=function(data,bufferOffset,dataStartIndex,dataCount){ (bufferOffset===void 0)&& (bufferOffset=0); (dataStartIndex===void 0)&& (dataStartIndex=0); (dataCount===void 0)&& (dataCount=4294967295); var byteCount=0; if (this._indexType==/*CLASS CONST:laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort"){ byteCount=2; if (dataStartIndex!==0 || dataCount!==4294967295) data=new Uint16Array(data.buffer,dataStartIndex *byteCount,dataCount); }else if (this._indexType==/*CLASS CONST:laya.d3.graphics.IndexBuffer3D.INDEXTYPE_UBYTE*/"ubyte"){ byteCount=1; if (dataStartIndex!==0 || dataCount!==4294967295) data=new Uint8Array(data.buffer,dataStartIndex *byteCount,dataCount); } this._bind(); Buffer._gl.bufferSubData(this._bufferType,bufferOffset *byteCount,data); if (this._canRead){ if (bufferOffset!==0 || dataStartIndex!==0 || dataCount!==4294967295){ var maxLength=this._buffer.length-bufferOffset; if (dataCount > maxLength) dataCount=maxLength; for (var i=0;i < dataCount;i++) this._buffer[bufferOffset+i]=data[i]; }else { this._buffer=data; } } } /** *获取索引数据。 *@return 索引数据。 */ __proto.getData=function(){ if (this._canRead) return this._buffer; else throw new Error("Can't read data from VertexBuffer with only write flag!"); } /**彻底销毁索引缓冲。*/ __proto.dispose=function(){ this._buffer=null; _super.prototype.dispose.call(this); this.memorySize=0; } /** *获取索引类型。 *@return 索引类型。 */ __getset(0,__proto,'indexType',function(){ return this._indexType; }); /** *获取索引类型字节数量。 *@return 索引类型字节数量。 */ __getset(0,__proto,'indexTypeByteCount',function(){ return this._indexTypeByteCount; }); /** *获取索引个数。 *@return 索引个数。 */ __getset(0,__proto,'indexCount',function(){ return this._indexCount; }); /** *获取是否可读。 *@return 是否可读。 */ __getset(0,__proto,'canRead',function(){ return this._canRead; }); IndexBuffer3D.INDEXTYPE_UBYTE="ubyte"; IndexBuffer3D.INDEXTYPE_USHORT="ushort"; IndexBuffer3D.create=function(indexType,indexCount,bufferUsage,canRead){ (bufferUsage===void 0)&& (bufferUsage=/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4); (canRead===void 0)&& (canRead=false); return new IndexBuffer3D(indexType,indexCount,bufferUsage,canRead); } return IndexBuffer3D; })(Buffer) /** *VertexBuffer3D 类用于创建顶点缓冲。 */ //class laya.d3.graphics.VertexBuffer3D extends laya.webgl.utils.Buffer var VertexBuffer3D=(function(_super){ function VertexBuffer3D(vertexDeclaration,vertexCount,bufferUsage,canRead){ this._vertexDeclaration=null; this._vertexCount=0; this._canRead=false; (canRead===void 0)&& (canRead=false); VertexBuffer3D.__super.call(this); this._vertexDeclaration=vertexDeclaration; this._vertexCount=vertexCount; this._bufferUsage=bufferUsage; this._bufferType=/*laya.webgl.WebGLContext.ARRAY_BUFFER*/0x8892; this._canRead=canRead; this._bind(); var byteLength=this._vertexDeclaration.vertexStride *vertexCount; this.memorySize=byteLength; this._byteLength=byteLength; Buffer._gl.bufferData(this._bufferType,byteLength,this._bufferUsage); canRead && (this._buffer=new Float32Array(byteLength / 4)); } __class(VertexBuffer3D,'laya.d3.graphics.VertexBuffer3D',_super); var __proto=VertexBuffer3D.prototype; /** *和索引缓冲一起绑定。 *@param ib 索引缓冲。 */ __proto.bindWithIndexBuffer=function(ib){ (ib)&& (ib._bind()); this._bind(); } /** *设置数据。 *@param data 顶点数据。 *@param bufferOffset 顶点缓冲中的偏移。 *@param dataStartIndex 顶点数据的偏移。 *@param dataCount 顶点数据的数量。 */ __proto.setData=function(data,bufferOffset,dataStartIndex,dataCount){ (bufferOffset===void 0)&& (bufferOffset=0); (dataStartIndex===void 0)&& (dataStartIndex=0); (dataCount===void 0)&& (dataCount=4294967295); if (dataStartIndex!==0 || dataCount!==4294967295) data=new Float32Array(data.buffer,dataStartIndex *4,dataCount); this._bind(); Buffer._gl.bufferSubData(this._bufferType,bufferOffset *4,data); if (this._canRead){ if (bufferOffset!==0 || dataStartIndex!==0 || dataCount!==4294967295){ var maxLength=this._buffer.length-bufferOffset; if (dataCount > maxLength) dataCount=maxLength; for (var i=0;i < dataCount;i++) this._buffer[bufferOffset+i]=data[i]; }else { this._buffer=data; } } } /** *获取顶点数据。 *@return 顶点数据。 */ __proto.getData=function(){ if (this._canRead) return this._buffer; else throw new Error("Can't read data from VertexBuffer with only write flag!"); } /**销毁顶点缓冲。*/ __proto.detoryResource=function(){ var elements=this._vertexDeclaration.getVertexElements(); for (var i=0;i < elements.length;i++) WebGL.mainContext.disableVertexAttribArray(i); _super.prototype.detoryResource.call(this); } /**彻底销毁顶点缓冲。*/ __proto.dispose=function(){ _super.prototype.dispose.call(this); this._buffer=null; this._vertexDeclaration=null; this.memorySize=0; } /** *获取顶点结构声明。 *@return 顶点结构声明。 */ __getset(0,__proto,'vertexDeclaration',function(){ return this._vertexDeclaration; }); /** *获取顶点个数。 *@return 顶点个数。 */ __getset(0,__proto,'vertexCount',function(){ return this._vertexCount; }); /** *获取是否可读。 *@return 是否可读。 */ __getset(0,__proto,'canRead',function(){ return this._canRead; }); VertexBuffer3D.create=function(vertexDeclaration,vertexCount,bufferUsage,canRead){ (bufferUsage===void 0)&& (bufferUsage=/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4); (canRead===void 0)&& (canRead=false); return new VertexBuffer3D(vertexDeclaration,vertexCount,bufferUsage,canRead); } return VertexBuffer3D; })(Buffer) /** *... *@author ... */ //class laya.d3.core.particleShuriKen.ShurikenParticleMaterial extends laya.d3.core.material.BaseMaterial var ShurikenParticleMaterial=(function(_super){ function ShurikenParticleMaterial(){ this._tempRotationMatrix=new Matrix4x4(); this._uvLength=new Vector2(); ShurikenParticleMaterial.__super.call(this); this.setShaderName("PARTICLESHURIKEN"); } __class(ShurikenParticleMaterial,'laya.d3.core.particleShuriKen.ShurikenParticleMaterial',_super); var __proto=ShurikenParticleMaterial.prototype; __proto._setLoopShaderParams=function(state,projectionView,worldMatrix,mesh,material){ var particle=state.owner; var particleSystem=particle.particleSystem; var particleRender=particle.particleRender; var transform=particle.transform; var finalGravityE=ShurikenParticleMaterial._tempGravity.elements; var gravityE=particleSystem.gravity.elements; var gravityModifier=particleSystem.gravityModifier; finalGravityE[0]=gravityE[0] *gravityModifier; finalGravityE[1]=gravityE[1] *gravityModifier; finalGravityE[2]=gravityE[2] *gravityModifier; var shaderValues=state.shaderValue; shaderValues.pushValue("GRAVITY",finalGravityE); shaderValues.pushValue("SIMULATIONSPACE",particleSystem.simulationSpace); switch (particleSystem.simulationSpace){ case 0: shaderValues.pushValue("WORLDPOSITION",Vector3.ZERO.elements); break ; case 1: shaderValues.pushValue("WORLDPOSITION",transform.position.elements); break ; default : throw new Error("ShurikenParticleMaterial: SimulationSpace value is invalid."); } Matrix4x4.createFromQuaternion(transform.rotation,this._tempRotationMatrix); shaderValues.pushValue("WORLDROTATIONMATRIX",this._tempRotationMatrix.elements); shaderValues.pushValue("THREEDSTARTROTATION",particleSystem.threeDStartRotation); shaderValues.pushValue("SCALINGMODE",particleSystem.scaleMode); switch (particleSystem.scaleMode){ case 0: shaderValues.pushValue("POSITIONSCALE",transform.scale.elements); shaderValues.pushValue("SIZESCALE",transform.scale.elements); break ; case 1: shaderValues.pushValue("POSITIONSCALE",transform.localScale.elements); shaderValues.pushValue("SIZESCALE",transform.localScale.elements); break ; case 2: shaderValues.pushValue("POSITIONSCALE",transform.scale.elements); shaderValues.pushValue("SIZESCALE",Vector3.ONE.elements); break ; } shaderValues.pushValue("CAMERADIRECTION",state.camera.forward.elements); shaderValues.pushValue("CAMERAUP",state.camera.up.elements); shaderValues.pushValue("MATRIX1",state.viewMatrix.elements); shaderValues.pushValue("MATRIX2",state.projectionMatrix.elements); shaderValues.pushValue("STRETCHEDBILLBOARDLENGTHSCALE",particleRender.stretchedBillboardLengthScale); shaderValues.pushValue("STRETCHEDBILLBOARDSPEEDSCALE",particleRender.stretchedBillboardSpeedScale); shaderValues.pushValue("CURRENTTIME",particleSystem.currentTime); switch (particleRender.renderMode){ case 0: state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.SPHERHBILLBOARD*/0x80000); break ; case 1: state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.STRETCHEDBILLBOARD*/0x100000); break ; case 2: state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.HORIZONTALBILLBOARD*/0x200000); break ; case 3: state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.VERTICALBILLBOARD*/0x400000); break ; }; var velocityOverLifetime=particleSystem.velocityOverLifetime; if (velocityOverLifetime && velocityOverLifetime.enbale){ state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.VELOCITYOVERLIFETIME*/0x10000000); var velocity=velocityOverLifetime.velocity; var velocityType=velocity.type; shaderValues.pushValue("VOLTYPE",velocityType); switch (velocityType){ case 0: shaderValues.pushValue("VOLVELOCITYCONST",velocity.constant.elements); break ; case 1: shaderValues.pushValue("VOLVELOCITYGRADIENTX",velocity.gradientX._elements); shaderValues.pushValue("VOLVELOCITYGRADIENTY",velocity.gradientY._elements); shaderValues.pushValue("VOLVELOCITYGRADIENTZ",velocity.gradientZ._elements); break ; case 2: shaderValues.pushValue("VOLVELOCITYCONST",velocity.constantMin.elements); shaderValues.pushValue("VOLVELOCITYCONSTMAX",velocity.constantMax.elements); break ; case 3: shaderValues.pushValue("VOLVELOCITYGRADIENTX",velocity.gradientXMin._elements); shaderValues.pushValue("VOLVELOCITYGRADIENTXMAX",velocity.gradientXMax._elements); shaderValues.pushValue("VOLVELOCITYGRADIENTY",velocity.gradientYMin._elements); shaderValues.pushValue("VOLVELOCITYGRADIENTYMAX",velocity.gradientYMax._elements); shaderValues.pushValue("VOLVELOCITYGRADIENTZ",velocity.gradientZMin._elements); shaderValues.pushValue("VOLVELOCITYGRADIENTZMAX",velocity.gradientZMax._elements); break ; }; var spaceType=velocityOverLifetime.space; shaderValues.pushValue("VOLSPACETYPE",spaceType); }; var colorOverLifetime=particleSystem.colorOverLifetime; if (colorOverLifetime && colorOverLifetime.enbale){ var color=colorOverLifetime.color; switch (color.type){ case 1: state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.COLOROVERLIFETIME*/0x800000); var gradientColor=color.gradient; shaderValues.pushValue("COLOROVERLIFEGRADIENTALPHAS",gradientColor._alphaElements); shaderValues.pushValue("COLOROVERLIFEGRADIENTCOLORS",gradientColor._rgbElements); break ; case 3: state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.RANDOMCOLOROVERLIFETIME*/0x1000000); var minGradientColor=color.gradientMin; var maxGradientColor=color.gradientMax; shaderValues.pushValue("COLOROVERLIFEGRADIENTALPHAS",minGradientColor._alphaElements); shaderValues.pushValue("COLOROVERLIFEGRADIENTCOLORS",minGradientColor._rgbElements); shaderValues.pushValue("MAXCOLOROVERLIFEGRADIENTALPHAS",maxGradientColor._alphaElements); shaderValues.pushValue("MAXCOLOROVERLIFEGRADIENTCOLORS",maxGradientColor._rgbElements); break ; } }; var sizeOverLifetime=particleSystem.sizeOverLifetime; if (sizeOverLifetime && sizeOverLifetime.enbale){ var size=sizeOverLifetime.size; var sizeType=size.type; var sizeSeparate=false; switch (sizeType){ case 0: sizeSeparate=size.separateAxes; state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.SIZEOVERLIFETIME*/0x2000000); shaderValues.pushValue("SOLTYPE",sizeType); shaderValues.pushValue("SOLSEPRARATE",sizeSeparate); if (sizeSeparate){ shaderValues.pushValue("SOLSIZEGRADIENTX",size.gradientSizeX._elements); shaderValues.pushValue("SOLSIZEGRADIENTY",size.gradientSizeY._elements); shaderValues.pushValue("SOLSizeGradientZ",size.gradientSizeZ._elements); }else { shaderValues.pushValue("SOLSIZEGRADIENT",size.gradientSize._elements); } break ; case 2: sizeSeparate=size.separateAxes; state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.SIZEOVERLIFETIME*/0x2000000); shaderValues.pushValue("SOLTYPE",sizeType); shaderValues.pushValue("SOLSEPRARATE",sizeSeparate); if (sizeSeparate){ shaderValues.pushValue("SOLSIZEGRADIENTX",size.gradientXMin._elements); shaderValues.pushValue("SOLSIZEGRADIENTXMAX",size.gradientXMax._elements); shaderValues.pushValue("SOLSIZEGRADIENTY",size.gradientYMin._elements); shaderValues.pushValue("SOLSIZEGRADIENTYMAX",size.gradientYMax._elements); shaderValues.pushValue("SOLSizeGradientZ",size.gradientZMin._elements); shaderValues.pushValue("SOLSizeGradientZMAX",size.gradientZMax._elements); }else { shaderValues.pushValue("SOLSIZEGRADIENT",size.gradientMin._elements); shaderValues.pushValue("SOLSizeGradientMax",size.gradientMax._elements); } break ; } }; var rotationOverLifetime=particleSystem.rotationOverLifetime; if (rotationOverLifetime && rotationOverLifetime.enbale){ state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.ROTATIONOVERLIFETIME*/0x4000000); var rotation=rotationOverLifetime.angularVelocity; var rotationType=rotation.type; var rotationSeparate=rotation.separateAxes; shaderValues.pushValue("ROLTYPE",rotationType); shaderValues.pushValue("ROLSEPRARATE",rotationSeparate); switch (rotationType){ case 0: if (rotationSeparate){ shaderValues.pushValue("ROLANGULARVELOCITYCONSTSEPRARATE",rotation.constantSeparate.elements); }else { shaderValues.pushValue("ROLANGULARVELOCITYCONST",rotation.constant); } break ; case 1: if (rotationSeparate){ shaderValues.pushValue("ROLANGULARVELOCITYGRADIENTX",rotation.gradientX._elements); shaderValues.pushValue("ROLANGULARVELOCITYGRADIENTY",rotation.gradientY._elements); shaderValues.pushValue("ROLANGULARVELOCITYGRADIENTZ",rotation.gradientZ._elements); }else { shaderValues.pushValue("ROLANGULARVELOCITYGRADIENT",rotation.gradient._elements); } break ; case 2: if (rotationSeparate){ shaderValues.pushValue("ROLANGULARVELOCITYCONSTSEPRARATE",rotation.constantMinSeparate.elements); shaderValues.pushValue("ROLANGULARVELOCITYCONSTMAXSEPRARATE",rotation.constantMaxSeparate.elements); }else { shaderValues.pushValue("ROLANGULARVELOCITYCONST",rotation.constantMin); shaderValues.pushValue("ROLANGULARVELOCITYCONSTMAX",rotation.constantMax); } break ; case 3: if (rotationSeparate){ shaderValues.pushValue("ROLANGULARVELOCITYGRADIENTX",rotation.gradientXMin._elements); shaderValues.pushValue("ROLANGULARVELOCITYGRADIENTXMAX",rotation.gradientXMax._elements); shaderValues.pushValue("ROLANGULARVELOCITYGRADIENTY",rotation.gradientYMin._elements); shaderValues.pushValue("ROLANGULARVELOCITYGRADIENTYMAX",rotation.gradientYMax._elements); shaderValues.pushValue("ROLANGULARVELOCITYGRADIENTZ",rotation.gradientZMin._elements); shaderValues.pushValue("ROLANGULARVELOCITYGRADIENTZMAX",rotation.gradientZMax._elements); }else { shaderValues.pushValue("ROLANGULARVELOCITYGRADIENT",rotation.gradientMin._elements); shaderValues.pushValue("ROLANGULARVELOCITYGRADIENTMAX",rotation.gradientMax._elements); } break ; } }; var textureSheetAnimation=particleSystem.textureSheetAnimation; if (textureSheetAnimation && textureSheetAnimation.enbale){ var frameOverTime=textureSheetAnimation.frame; var textureAniType=frameOverTime.type; if (textureAniType===1 || textureAniType===3){ state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.TEXTURESHEETANIMATION*/0x8000000); shaderValues.pushValue("TEXTURESHEETANIMATIONTYPE",textureAniType); shaderValues.pushValue("TEXTURESHEETANIMATIONCYCLES",textureSheetAnimation.cycles); var title=textureSheetAnimation.tiles; var _uvLengthE=this._uvLength.elements; _uvLengthE[0]=1.0 / title.x; _uvLengthE[1]=1.0 / title.y; shaderValues.pushValue("TEXTURESHEETANIMATIONSUBUVLENGTH",this._uvLength.elements); } switch (textureAniType){ case 1: shaderValues.pushValue("TEXTURESHEETANIMATIONGRADIENTUVS",frameOverTime.frameOverTimeData._elements); break ; case 3: shaderValues.pushValue("TEXTURESHEETANIMATIONGRADIENTUVS",frameOverTime.frameOverTimeDataMin._elements); shaderValues.pushValue("TEXTURESHEETANIMATIONGRADIENTMAXUVS",frameOverTime.frameOverTimeDataMax._elements); break ; } } } /** *设置漫反射贴图。 *@param value 漫反射贴图。 */ /** *获取漫反射贴图。 *@return 漫反射贴图。 */ __getset(0,__proto,'diffuseTexture',function(){ return this._getTexture(0); },function(value){ if (value){ this._addShaderDefine(/*laya.d3.shader.ShaderDefines3D.DIFFUSEMAP*/0x1); }else { this._removeShaderDefine(/*laya.d3.shader.ShaderDefines3D.DIFFUSEMAP*/0x1); } this._setTexture(value,0,"DIFFUSETEXTURE"); }); ShurikenParticleMaterial.load=function(url){ return Laya.loader.create(url,null,null,ShurikenParticleMaterial); } ShurikenParticleMaterial.WORLDPOSITION="WORLDPOSITION"; ShurikenParticleMaterial.WORLDROTATIONMATRIX="WORLDROTATIONMATRIX"; ShurikenParticleMaterial.THREEDSTARTROTATION="THREEDSTARTROTATION"; ShurikenParticleMaterial.SCALINGMODE="SCALINGMODE"; ShurikenParticleMaterial.POSITIONSCALE="POSITIONSCALE"; ShurikenParticleMaterial.SIZESCALE="SIZESCALE"; ShurikenParticleMaterial.VIEWMATRIX="MATRIX1"; ShurikenParticleMaterial.PROJECTIONMATRIX="MATRIX2"; ShurikenParticleMaterial.CURRENTTIME="CURRENTTIME"; ShurikenParticleMaterial.GRAVITY="GRAVITY"; ShurikenParticleMaterial.DIFFUSETEXTURE="DIFFUSETEXTURE"; ShurikenParticleMaterial.CAMERADIRECTION="CAMERADIRECTION"; ShurikenParticleMaterial.CAMERAUP="CAMERAUP"; ShurikenParticleMaterial.STRETCHEDBILLBOARDLENGTHSCALE="STRETCHEDBILLBOARDLENGTHSCALE"; ShurikenParticleMaterial.STRETCHEDBILLBOARDSPEEDSCALE="STRETCHEDBILLBOARDSPEEDSCALE"; ShurikenParticleMaterial.SIMULATIONSPACE="SIMULATIONSPACE"; ShurikenParticleMaterial.VOLTYPE="VOLTYPE"; ShurikenParticleMaterial.VOLVELOCITYCONST="VOLVELOCITYCONST"; ShurikenParticleMaterial.VOLVELOCITYGRADIENTX="VOLVELOCITYGRADIENTX"; ShurikenParticleMaterial.VOLVELOCITYGRADIENTY="VOLVELOCITYGRADIENTY"; ShurikenParticleMaterial.VOLVELOCITYGRADIENTZ="VOLVELOCITYGRADIENTZ"; ShurikenParticleMaterial.VOLVELOCITYCONSTMAX="VOLVELOCITYCONSTMAX"; ShurikenParticleMaterial.VOLVELOCITYGRADIENTXMAX="VOLVELOCITYGRADIENTXMAX"; ShurikenParticleMaterial.VOLVELOCITYGRADIENTYMAX="VOLVELOCITYGRADIENTYMAX"; ShurikenParticleMaterial.VOLVELOCITYGRADIENTZMAX="VOLVELOCITYGRADIENTZMAX"; ShurikenParticleMaterial.VOLSPACETYPE="VOLSPACETYPE"; ShurikenParticleMaterial.COLOROVERLIFEGRADIENTALPHAS="COLOROVERLIFEGRADIENTALPHAS"; ShurikenParticleMaterial.COLOROVERLIFEGRADIENTCOLORS="COLOROVERLIFEGRADIENTCOLORS"; ShurikenParticleMaterial.MAXCOLOROVERLIFEGRADIENTALPHAS="MAXCOLOROVERLIFEGRADIENTALPHAS"; ShurikenParticleMaterial.MAXCOLOROVERLIFEGRADIENTCOLORS="MAXCOLOROVERLIFEGRADIENTCOLORS"; ShurikenParticleMaterial.SOLTYPE="SOLTYPE"; ShurikenParticleMaterial.SOLSEPRARATE="SOLSEPRARATE"; ShurikenParticleMaterial.SOLSIZEGRADIENT="SOLSIZEGRADIENT"; ShurikenParticleMaterial.SOLSIZEGRADIENTX="SOLSIZEGRADIENTX"; ShurikenParticleMaterial.SOLSIZEGRADIENTY="SOLSIZEGRADIENTY"; ShurikenParticleMaterial.SOLSizeGradientZ="SOLSizeGradientZ"; ShurikenParticleMaterial.SOLSizeGradientMax="SOLSizeGradientMax"; ShurikenParticleMaterial.SOLSIZEGRADIENTXMAX="SOLSIZEGRADIENTXMAX"; ShurikenParticleMaterial.SOLSIZEGRADIENTYMAX="SOLSIZEGRADIENTYMAX"; ShurikenParticleMaterial.SOLSizeGradientZMAX="SOLSizeGradientZMAX"; ShurikenParticleMaterial.ROLTYPE="ROLTYPE"; ShurikenParticleMaterial.ROLSEPRARATE="ROLSEPRARATE"; ShurikenParticleMaterial.ROLANGULARVELOCITYCONST="ROLANGULARVELOCITYCONST"; ShurikenParticleMaterial.ROLANGULARVELOCITYCONSTSEPRARATE="ROLANGULARVELOCITYCONSTSEPRARATE"; ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENT="ROLANGULARVELOCITYGRADIENT"; ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTX="ROLANGULARVELOCITYGRADIENTX"; ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTY="ROLANGULARVELOCITYGRADIENTY"; ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTZ="ROLANGULARVELOCITYGRADIENTZ"; ShurikenParticleMaterial.ROLANGULARVELOCITYCONSTMAX="ROLANGULARVELOCITYCONSTMAX"; ShurikenParticleMaterial.ROLANGULARVELOCITYCONSTMAXSEPRARATE="ROLANGULARVELOCITYCONSTMAXSEPRARATE"; ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTMAX="ROLANGULARVELOCITYGRADIENTMAX"; ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTXMAX="ROLANGULARVELOCITYGRADIENTXMAX"; ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTYMAX="ROLANGULARVELOCITYGRADIENTYMAX"; ShurikenParticleMaterial.ROLANGULARVELOCITYGRADIENTZMAX="ROLANGULARVELOCITYGRADIENTZMAX"; ShurikenParticleMaterial.TEXTURESHEETANIMATIONTYPE="TEXTURESHEETANIMATIONTYPE"; ShurikenParticleMaterial.TEXTURESHEETANIMATIONCYCLES="TEXTURESHEETANIMATIONCYCLES"; ShurikenParticleMaterial.TEXTURESHEETANIMATIONSUBUVLENGTH="TEXTURESHEETANIMATIONSUBUVLENGTH"; ShurikenParticleMaterial.TEXTURESHEETANIMATIONGRADIENTUVS="TEXTURESHEETANIMATIONGRADIENTUVS"; ShurikenParticleMaterial.TEXTURESHEETANIMATIONGRADIENTMAXUVS="TEXTURESHEETANIMATIONGRADIENTMAXUVS"; ShurikenParticleMaterial._diffuseTextureIndex=0; __static(ShurikenParticleMaterial, ['_tempGravity',function(){return this._tempGravity=new Vector3();},'defaultMaterial',function(){return this.defaultMaterial=new ShurikenParticleMaterial();} ]); return ShurikenParticleMaterial; })(BaseMaterial) /** *CameraAnimations 类用于创建摄像机动画组件。 */ //class laya.d3.component.animation.CameraAnimations extends laya.d3.component.animation.KeyframeAnimations var CameraAnimations=(function(_super){ function CameraAnimations(){ this._tempCurAnimationData=null; this._lastFrameIndex=-1; this._currentTransform=null; this._originalAnimationTransform=null; this._originalFov=0; this._camera=null; this._cacheAnimationDatas=[]; this._currentAnimationData=null; this.localMode=true; this.addMode=true; this._tempVector30=new Vector3(); this._tempVector31=new Vector3(); this._tempVector32=new Vector3(); CameraAnimations.__super.call(this); } __class(CameraAnimations,'laya.d3.component.animation.CameraAnimations',_super); var __proto=CameraAnimations.prototype; /** *@private *摄像机动画作用函数。 */ __proto._effect=function(){ var i=0; for (i=0;i < 3;i++){ this._tempVector30.elements[i]=this._currentAnimationData[i]; this._tempVector31.elements[i]=this._currentAnimationData[i+3]; this._tempVector32.elements[i]=this._currentAnimationData[i+6]; } this._currentTransform || (this._currentTransform=new Matrix4x4()); Matrix4x4.createLookAt(this._tempVector30,this._tempVector31,this._tempVector32,this._currentTransform); this._currentTransform.invert(this._currentTransform); if (this.addMode){ Matrix4x4.multiply(this._originalAnimationTransform,this._currentTransform,this._currentTransform); } if (this.localMode) this.owner.transform.localMatrix=this._currentTransform; else this.owner.transform.worldMatrix=this._currentTransform; this._camera.fieldOfView=this._currentAnimationData[9]; } /** *@private *初始化载入摄像机动画组件。 *@param owner 所属精灵对象。 */ __proto._load=function(owner){ var _$this=this; if ((owner instanceof laya.d3.core.Camera )) this._camera=owner; else throw new Error("该Sprite3D并非Camera"); this._player.on(/*laya.events.Event.STOPPED*/"stopped",this,function(){ if (_$this._player.returnToZeroStopped){ if (_$this.localMode) _$this._originalAnimationTransform && (owner.transform.localMatrix=_$this._originalAnimationTransform); else _$this._originalAnimationTransform && (owner.transform.worldMatrix=_$this._originalAnimationTransform); _$this._camera.fieldOfView=_$this._originalFov; } }); } /** *@private *更新摄像机动画组件。 *@param state 渲染状态。 */ __proto._update=function(state){ if (!this._templet || !this._templet.loaded || this._player.state!==/*laya.ani.AnimationState.playing*/2) return; var rate=this._player.playbackRate *Laya.timer.scale; var frameIndex=(this._player.isCache && rate >=1.0)? this.currentFrameIndex :-1; var animationClipIndex=this.currentAnimationClipIndex; if (frameIndex!==-1 && this._lastFrameIndex===frameIndex){ laya.d3.component.Component3D.prototype._update.call(this,state); return; } if (this._player.isCache && rate >=1.0){ var cache=this._templet.getAnimationDataWithCache(this._player.cacheFrameRate,this._cacheAnimationDatas,animationClipIndex,frameIndex); if (cache){ this._currentAnimationData=cache; this._lastFrameIndex=frameIndex; laya.d3.component.Component3D.prototype._update.call(this,state); this._effect(); return; } }; var nodes=this._templet.getNodes(animationClipIndex); var nodeCount=nodes.length; if (this._player.isCache && rate >=1.0){ this._currentAnimationData=new Float32Array(nodeCount *10); }else{ (this._tempCurAnimationData)|| (this._tempCurAnimationData=new Float32Array(nodeCount *10)); this._currentAnimationData=this._tempCurAnimationData; } if (this._player.isCache && rate >=1.0) this._templet.getOriginalData(animationClipIndex,this._currentAnimationData,this._player._fullFrames[animationClipIndex],frameIndex,this._player.currentPlayTime); else this._templet.getOriginalDataUnfixedRate(animationClipIndex,this._currentAnimationData,this._player.currentPlayTime); if (this._player.isCache && rate >=1.0){ this._templet.setAnimationDataWithCache(this._player.cacheFrameRate,this._cacheAnimationDatas,animationClipIndex,frameIndex,this._currentAnimationData); } this._lastFrameIndex=frameIndex; laya.d3.component.Component3D.prototype._update.call(this,state); this._effect(); } return CameraAnimations; })(KeyframeAnimations) /** *RigidAnimations 类用于创建变换动画组件。 */ //class laya.d3.component.animation.RigidAnimations extends laya.d3.component.animation.KeyframeAnimations var RigidAnimations=(function(_super){ function RigidAnimations(){ this._animationSprites=null; this._animationSpritesInitLocalMatrix=null; this._tempCurAnimationData=null; this._curOriginalData=null; this._lastFrameIndex=-1; this._curAnimationDatas=null; RigidAnimations.__super.call(this); this._animationSprites=[]; this._animationSpritesInitLocalMatrix=[]; } __class(RigidAnimations,'laya.d3.component.animation.RigidAnimations',_super); var __proto=RigidAnimations.prototype; /** *@private */ __proto._init=function(){ var nodes=this._templet.getNodes(this.currentAnimationClipIndex); var curParentSprite=this._owner; var nodeLength=nodes.length; var pathStart=0; var extentDatas=new Uint16Array(this._templet.getPublicExtData()); for (var i=0;i < nodeLength;i++){ var hierarchys=extentDatas.slice(pathStart+1,pathStart+1+extentDatas[pathStart]); pathStart+=(extentDatas[pathStart]+1); for (var j=1;j < hierarchys.length;j++){ var childIndex=hierarchys[j]; curParentSprite=curParentSprite._childs[hierarchys[j]]; }; var curSprite=curParentSprite.getChildByName(nodes[i].name); if (!curSprite) break ; this._animationSprites[i]=curSprite; var localMatrix=this._animationSpritesInitLocalMatrix[i]; (localMatrix)|| (localMatrix=this._animationSpritesInitLocalMatrix[i]=new Matrix4x4()); curSprite.transform.localMatrix.cloneTo(localMatrix); curParentSprite=this._owner; } } /** *@private */ __proto._animtionPlay=function(){ if (this._templet.loaded) this._init(); else this._templet.once(/*laya.events.Event.LOADED*/"loaded",this,this._init); } /** *@private */ __proto._animtionStop=function(){ this._lastFrameIndex=-1; if (this._player.returnToZeroStopped){ this._curAnimationDatas=null; for (var i=0;i < this._animationSprites.length;i++) this._animationSprites[i].transform.localMatrix=this._animationSpritesInitLocalMatrix[i]; } } /** *@private *摄像机动画作用函数。 */ __proto._effectAnimation=function(nodes){ for (var nodeIndex=0,nodeLength=this._animationSprites.length;nodeIndex < nodeLength;nodeIndex++){ var sprite=this._animationSprites[nodeIndex]; var matrix=sprite.transform.localMatrix; var matrixE=matrix.elements; for (var i=0;i < 16;i++) matrixE[i]=this._curAnimationDatas[nodeIndex *16+i]; sprite.transform.localMatrix=matrix; } } /** *@private *初始化载入摄像机动画组件。 *@param owner 所属精灵对象。 */ __proto._load=function(owner){ _super.prototype._load.call(this,owner); this._player.on(/*laya.events.Event.STOPPED*/"stopped",this,this._animtionStop); this._player.on(/*laya.events.Event.PLAYED*/"played",this,this._animtionPlay); } /** *@private *更新摄像机动画组件。 *@param state 渲染状态。 */ __proto._update=function(state){ if (this._player.state!==/*laya.ani.AnimationState.playing*/2 || !this._templet || !this._templet.loaded) return; var rate=this._player.playbackRate *Laya.timer.scale; var cachePlayRate=this._player.cachePlayRate; var isCache=this._player.isCache && rate >=cachePlayRate; var frameIndex=isCache ? this.currentFrameIndex :-1; if (frameIndex!==-1 && this._lastFrameIndex===frameIndex) return; var animationClipIndex=this.currentAnimationClipIndex; var nodes=this._templet.getNodes(animationClipIndex); var animationDatasCache=this._templet._animationDatasCache; if (isCache){ var cacheData=this._templet.getAnimationDataWithCache(cachePlayRate,animationDatasCache,animationClipIndex,frameIndex); if (cacheData){ this._curAnimationDatas=cacheData; this._lastFrameIndex=frameIndex; this._effectAnimation(nodes); return; } }; var nodeFloatCount=nodes.length *16; if (isCache){ this._curAnimationDatas=new Float32Array(nodeFloatCount); }else{ (this._tempCurAnimationData)|| (this._tempCurAnimationData=new Float32Array(nodeFloatCount)); this._curAnimationDatas=this._tempCurAnimationData; } this._curOriginalData || (this._curOriginalData=new Float32Array(this._templet.getTotalkeyframesLength(animationClipIndex))); if (isCache) this._templet.getOriginalData(animationClipIndex,this._curOriginalData,this._player._fullFrames[animationClipIndex],frameIndex,this._player.currentFrameTime); else this._templet.getOriginalDataUnfixedRate(animationClipIndex,this._curOriginalData,this._player.currentPlayTime); Utils3D._computeRootAnimationData(nodes,this._curOriginalData,this._curAnimationDatas); if (isCache){ this._templet.setAnimationDataWithCache(cachePlayRate,animationDatasCache,animationClipIndex,frameIndex,this._curAnimationDatas); } this._lastFrameIndex=frameIndex; this._effectAnimation(nodes); } /** *@private *卸载组件时执行。 */ __proto._unload=function(owner){ _super.prototype._unload.call(this,owner); this._animationSprites=null; this._animationSpritesInitLocalMatrix=null; this._tempCurAnimationData=null; this._curOriginalData=null; this._curAnimationDatas=null; } /** *设置url地址。 *@param value 地址。 */ __getset(0,__proto,'url',null,function(value){ _super.prototype._$set_url.call(this,value); this._curOriginalData=null; this._curAnimationDatas=null; this._tempCurAnimationData=null; (this._templet._animationDatasCache)|| (this._templet._animationDatasCache=[]); }); __getset(0,__proto,'templet',_super.prototype._$get_templet,function(value){ _super.prototype._$set_templet.call(this,value); this._curOriginalData=null; this._curAnimationDatas=null; this._tempCurAnimationData=null; (this._templet._animationDatasCache)|| (this._templet._animationDatasCache=[]); }); return RigidAnimations; })(KeyframeAnimations) /** *SkinAnimations 类用于创建蒙皮动画组件。 */ //class laya.d3.component.animation.SkinAnimations extends laya.d3.component.animation.KeyframeAnimations var SkinAnimations=(function(_super){ function SkinAnimations(){ this._tempCurAnimationData=null; this._tempCurBonesData=null; this._curOriginalData=null; this._extenData=null; this._lastFrameIndex=-1; this._curMeshAnimationData=null; this._curBonesDatas=null; this._curAnimationDatas=null; this._ownerMesh=null; SkinAnimations.__super.call(this); } __class(SkinAnimations,'laya.d3.component.animation.SkinAnimations',_super); var __proto=SkinAnimations.prototype; /**@private */ __proto._getAnimationDatasWithCache=function(rate,mesh,cacheDatas,aniIndex,frameIndex){ var aniDatas=cacheDatas[aniIndex]; if (!aniDatas){ return null; }else { var rateDatas=aniDatas[rate]; if (!rateDatas) return null; else { var meshDatas=rateDatas[mesh.id]; if (!meshDatas) return null; else return meshDatas[frameIndex]; } } } /**@private */ __proto._setAnimationDatasWithCache=function(rate,mesh,cacheDatas,aniIndex,frameIndex,animationDatas){ var aniDatas=(cacheDatas[aniIndex])|| (cacheDatas[aniIndex]={}); var rateDatas=(aniDatas[rate])|| (aniDatas[rate]={}); var meshDatas=(rateDatas[mesh.id])|| (rateDatas[mesh.id]=[]); meshDatas[frameIndex]=animationDatas; } /**@private */ __proto._onAnimationPlayMeshLoaded=function(){ var renderElements=this._ownerMesh.meshRender.renderObject._renderElements; for (var i=0,n=renderElements.length;i < n;i++) renderElements[i]._canDynamicBatch=false; } /**@private */ __proto._onAnimationPlay=function(){ var mesh=this._ownerMesh.meshFilter.sharedMesh; if (mesh.loaded) this._onAnimationPlayMeshLoaded(); else mesh.on(/*laya.events.Event.LOADED*/"loaded",this,this._onAnimationPlayMeshLoaded); } /**@private */ __proto._onAnimationStop=function(){ this._lastFrameIndex=-1; if (this._player.returnToZeroStopped){ this._curBonesDatas=null; this._curAnimationDatas=null; }; var renderElements=this._ownerMesh.meshRender.renderObject._renderElements; for (var i=0,n=renderElements.length;i < n;i++) renderElements[i]._canDynamicBatch=true; } /** *@private *初始化载入蒙皮动画组件。 *@param owner 所属精灵对象。 */ __proto._load=function(owner){ _super.prototype._load.call(this,owner); this._ownerMesh=(owner); this._player.on(/*laya.events.Event.PLAYED*/"played",this,this._onAnimationPlay); this._player.on(/*laya.events.Event.STOPPED*/"stopped",this,this._onAnimationStop); } /** *预缓存帧动画数据(需确保动画模板、模型模板都已加载完成)。 *@param animationClipIndex 动画索引 *@param meshTemplet 动画模板 */ __proto.preComputeKeyFrames=function(animationClipIndex){ if (!this._templet.loaded || !this._ownerMesh.meshFilter.sharedMesh.loaded) throw new Error("SkinAnimations: must to be sure animation templet and mesh templet has loaded."); var cachePlayRate=this._player.cachePlayRate; var cacheFrameRateInterval=this._player.cacheFrameRateInterval *cachePlayRate; var maxKeyFrame=Math.floor(this._templet.getAniDuration(animationClipIndex)/ cacheFrameRateInterval); for (var frameIndex=0;frameIndex <=maxKeyFrame;frameIndex++){ var boneDatasCache=this._templet._animationDatasCache[0]; var animationDatasCache=this._templet._animationDatasCache[1]; var mesh=this._ownerMesh.meshFilter.sharedMesh; var cacheAnimationDatas=this._getAnimationDatasWithCache(cachePlayRate,mesh,animationDatasCache,animationClipIndex,frameIndex); if (cacheAnimationDatas){ continue ; }; var bones=this._templet.getNodes(animationClipIndex); var boneFloatCount=bones.length *16; (this._curMeshAnimationData)|| (this._curMeshAnimationData=new Float32Array(boneFloatCount)); var i=0,n=0; this._curAnimationDatas=[]; for (i=0,n=mesh.getSubMeshCount();i < n;i++) this._curAnimationDatas[i]=new Float32Array(mesh.getSubMesh(i)._boneIndices.length *16); this._curBonesDatas=new Float32Array(boneFloatCount); this._curOriginalData || (this._curOriginalData=new Float32Array(this._templet.getTotalkeyframesLength(animationClipIndex))); this._templet.getOriginalData(animationClipIndex,this._curOriginalData,this._player._fullFrames[animationClipIndex],frameIndex,cacheFrameRateInterval *frameIndex); var inverseAbsoluteBindPoses=mesh.InverseAbsoluteBindPoses; if (inverseAbsoluteBindPoses){ Utils3D._computeBoneAndAnimationDatasByBindPoseMatrxix(bones,this._curOriginalData,inverseAbsoluteBindPoses,this._curBonesDatas,this._curMeshAnimationData); }else { this._extenData || (this._extenData=new Float32Array(this._templet.getPublicExtData())); Utils3D._computeBoneAndAnimationDatas(bones,this._curOriginalData,this._extenData,this._curBonesDatas,this._curMeshAnimationData); } for (i=0,n=mesh.getSubMeshCount();i < n;i++){ var subMesh=mesh.getSubMesh(i); SkinAnimations._computeSubMeshAniDatas(i,subMesh._boneIndices,this._curMeshAnimationData,this._curAnimationDatas); } this._setAnimationDatasWithCache(cachePlayRate,mesh,animationDatasCache,animationClipIndex,frameIndex,this._curAnimationDatas); this._templet.setAnimationDataWithCache(cachePlayRate,boneDatasCache,animationClipIndex,frameIndex,this._curBonesDatas); } } /** *@private *更新蒙皮动画组件。 *@param state 渲染状态参数。 */ __proto._update=function(state){ var mesh=this._ownerMesh.meshFilter.sharedMesh; if (this._player.state!==/*laya.ani.AnimationState.playing*/2 || !this._templet || !this._templet.loaded || !mesh.loaded) return; var rate=this._player.playbackRate *Laya.timer.scale; var cachePlayRate=this._player.cachePlayRate; var isCache=this._player.isCache && rate >=cachePlayRate; var frameIndex=isCache ? this.currentFrameIndex :-1; if (frameIndex!==-1 && this._lastFrameIndex===frameIndex) return; var animationClipIndex=this.currentAnimationClipIndex; var boneDatasCache=this._templet._animationDatasCache[0]; var animationDatasCache=this._templet._animationDatasCache[1]; if (isCache){ var cacheAnimationDatas=this._getAnimationDatasWithCache(cachePlayRate,mesh,animationDatasCache,animationClipIndex,frameIndex); if (cacheAnimationDatas){ this._curAnimationDatas=cacheAnimationDatas; this._curBonesDatas=this._templet.getAnimationDataWithCache(cachePlayRate,boneDatasCache,animationClipIndex,frameIndex); this._lastFrameIndex=frameIndex; return; } }; var isCacheBonesDatas=false; if (isCache){ this._curBonesDatas=this._templet.getAnimationDataWithCache(cachePlayRate,boneDatasCache,animationClipIndex,frameIndex); isCacheBonesDatas=this._curBonesDatas ? true :false; }; var bones=this._templet.getNodes(animationClipIndex); var boneFloatCount=bones.length *16; (this._curMeshAnimationData)|| (this._curMeshAnimationData=new Float32Array(boneFloatCount)); var i=0,n=0; if (isCache){ this._curAnimationDatas=[]; for (i=0,n=mesh.getSubMeshCount();i < n;i++) this._curAnimationDatas[i]=new Float32Array(mesh.getSubMesh(i)._boneIndices.length *16); (isCacheBonesDatas)|| (this._curBonesDatas=new Float32Array(boneFloatCount)); }else { if (!this._tempCurAnimationData){ this._tempCurAnimationData=[]; for (i=0,n=mesh.getSubMeshCount();i < n;i++) this._tempCurAnimationData[i]=new Float32Array(mesh.getSubMesh(i)._boneIndices.length *16); } (this._tempCurBonesData)|| (this._tempCurBonesData=new Float32Array(boneFloatCount)); this._curAnimationDatas=this._tempCurAnimationData; this._curBonesDatas=this._tempCurBonesData; } this._curOriginalData || (this._curOriginalData=new Float32Array(this._templet.getTotalkeyframesLength(animationClipIndex))); if (isCache) this._templet.getOriginalData(animationClipIndex,this._curOriginalData,this._player._fullFrames[animationClipIndex],frameIndex,this._player.currentFrameTime); else this._templet.getOriginalDataUnfixedRate(animationClipIndex,this._curOriginalData,this._player.currentPlayTime); var inverseAbsoluteBindPoses=mesh.InverseAbsoluteBindPoses; if (inverseAbsoluteBindPoses){ if (isCache && isCacheBonesDatas) Utils3D._computeAnimationDatasByArrayAndMatrixFast(inverseAbsoluteBindPoses,this._curBonesDatas,this._curMeshAnimationData); else Utils3D._computeBoneAndAnimationDatasByBindPoseMatrxix(bones,this._curOriginalData,inverseAbsoluteBindPoses,this._curBonesDatas,this._curMeshAnimationData); }else { this._extenData || (this._extenData=new Float32Array(this._templet.getPublicExtData())); if (isCache && isCacheBonesDatas) Utils3D._computeAnimationDatas(this._extenData,this._curBonesDatas,this._curMeshAnimationData); else Utils3D._computeBoneAndAnimationDatas(bones,this._curOriginalData,this._extenData,this._curBonesDatas,this._curMeshAnimationData); } for (i=0,n=mesh.getSubMeshCount();i < n;i++){ var subMesh=mesh.getSubMesh(i); SkinAnimations._computeSubMeshAniDatas(i,subMesh._boneIndices,this._curMeshAnimationData,this._curAnimationDatas); } if (isCache){ this._setAnimationDatasWithCache(cachePlayRate,mesh,animationDatasCache,animationClipIndex,frameIndex,this._curAnimationDatas); (isCacheBonesDatas)|| (this._templet.setAnimationDataWithCache(cachePlayRate,boneDatasCache,animationClipIndex,frameIndex,this._curBonesDatas)); } this._lastFrameIndex=frameIndex; } /** *@private *在渲染前更新蒙皮动画组件渲染参数。 *@param state 渲染状态参数。 */ __proto._preRenderUpdate=function(state){ if (this._curAnimationDatas){ state.shaderDefines.addInt(/*laya.d3.shader.ShaderDefines3D.BONE*/0x8000); var subMeshIndex=state.renderElement.renderObj.indexOfHost; state.shaderValue.pushValue(/*laya.d3.core.material.StandardMaterial.Bones*/"MATRIXARRAY0",this._curAnimationDatas[subMeshIndex]); } } /** *@private *卸载组件时执行 */ __proto._unload=function(owner){ _super.prototype._unload.call(this,owner); this._tempCurAnimationData=null; this._tempCurBonesData=null; this._curOriginalData=null; this._extenData=null; this._curMeshAnimationData=null; this._curBonesDatas=null; this._curAnimationDatas=null; this._ownerMesh=null; } /** *获取骨骼数据。 *@return 骨骼数据。 */ __getset(0,__proto,'curBonesDatas',function(){ return this._curBonesDatas; }); /** *获取动画数据。 *@return 动画数据。 */ __getset(0,__proto,'curAnimationDatas',function(){ return this._curAnimationDatas; }); /** *设置url地址。 *@param value 地址。 */ __getset(0,__proto,'url',null,function(value){ _super.prototype._$set_url.call(this,value); this._curOriginalData=this._extenData=null; this._curMeshAnimationData=null; this._tempCurBonesData=null; this._tempCurAnimationData=null; (this._templet._animationDatasCache)|| (this._templet._animationDatasCache=[[],[]]); }); __getset(0,__proto,'templet',_super.prototype._$get_templet,function(value){ _super.prototype._$set_templet.call(this,value); this._curOriginalData=this._extenData=null; this._curMeshAnimationData=null; this._tempCurBonesData=null; this._tempCurAnimationData=null; (this._templet._animationDatasCache)|| (this._templet._animationDatasCache=[[],[]]); }); SkinAnimations._computeSubMeshAniDatas=function(subMeshIndex,index,bonesData,animationDatas){ var data=animationDatas[subMeshIndex]; for (var i=0,n=index.length,ii=0;i < n;i++){ for (var j=0;j < 16;j++,ii++){ data[ii]=bonesData[(index[i] << 4)+j]; } } } SkinAnimations._copyBone=function(index,bonesData,out){ for (var i=0,n=index.length,ii=0;i < n;i++){ for (var j=0;j < 16;j++,ii++){ out[ii]=bonesData[(index[i] << 4)+j]; } } } return SkinAnimations; })(KeyframeAnimations) /** *UVAnimations 类用于创建UV动画组件。 */ //class laya.d3.component.animation.UVAnimations extends laya.d3.component.animation.KeyframeAnimations var UVAnimations=(function(_super){ function UVAnimations(){ this._nodes=null; this._lasstInitIndex=-1; this._materials=null; this._mesh=null; this._meshDataInited=false; this._uvDatasCount=0; this._subMeshIndexToNodeIndex=[]; this._keyframeAges=[]; this._ages=[]; this._bufferUsages=[]; this._originalShaderAttributes=[]; this._uvShaderValues=[]; this._uvNextShaderValues=[]; this._uvAnimationBuffers=[]; UVAnimations.__super.call(this); this._meshDataInited=false; } __class(UVAnimations,'laya.d3.component.animation.UVAnimations',_super); var __proto=UVAnimations.prototype; /** *@private *初始化Mesh相关数据函数。 */ __proto._initMeshData=function(){ this._materials=this._mesh.meshRender.sharedMaterials; this._meshDataInited=true; } /** *@private *初始化UV动画相关数据函数。 */ __proto._initAnimationData=function(animationIndex){} /** *@private *初始化载入UV动画组件。 *@param owner 所属精灵对象。 */ __proto._load=function(owner){ if ((owner instanceof laya.d3.core.MeshSprite3D )) this._mesh=owner; else throw new Error("该Sprite3D并非Mesh"); owner.on(/*laya.events.Event.LOADED*/"loaded",this,function(mesh){ }); this.on(/*laya.events.Event.LOADED*/"loaded",this,function(){ }); this.player.on(/*laya.events.Event.PLAYED*/"played",this,function(){ }); this.player.on(/*laya.events.Event.STOPPED*/"stopped",this,function(){ }); } /** *@private *更新UV动画组件。 *@param state 渲染状态参数。 */ __proto._update=function(state){ this.player.update(state.elapsedTime); if (!this._templet || !this._templet.loaded || this.player.state!==/*laya.ani.AnimationState.playing*/2) return; var animationClipIndex=this.currentAnimationClipIndex; var unfixedIndexes=this._templet.getNodesCurrentFrameIndex(animationClipIndex,this.player.currentPlayTime); for (var i=0;i < this._nodes.length;i++){ var index=unfixedIndexes[i]; this._keyframeAges[i]=(this.player.currentPlayTime-this._nodes[i].keyFrame[index].startTime)/ this._nodes[i].keyFrame[index].duration; this._ages[i]=this.player.currentPlayTime / this._nodes[i].playTime; var subkeyframeWidth=this._nodes[i].keyframeWidth / this._uvDatasCount; (this._uvShaderValues[i])|| (this._uvShaderValues[i]=[]); (this._uvNextShaderValues[i])|| (this._uvNextShaderValues[i]=[]); for (var c=0;c < this._uvDatasCount;c++){ var uvShaderValue=[2,/*laya.webgl.WebGLContext.FLOAT*/0x1406,false,0,(index)*subkeyframeWidth *4]; var uvNextShaderValue=[2,/*laya.webgl.WebGLContext.FLOAT*/0x1406,false,0,(index+1)*subkeyframeWidth *4]; this._uvShaderValues[i][c]=uvShaderValue; this._uvNextShaderValues[i][c]=uvNextShaderValue; } } laya.d3.component.Component3D.prototype._update.call(this,state); } /** *@private *在渲染前更新UV动画组件渲染参数。 *@param state 渲染状态参数。 */ __proto._preRenderUpdate=function(state){} return UVAnimations; })(KeyframeAnimations) /** *@private *PrimitiveMesh 类用于创建基本网格的父类。 */ //class laya.d3.resource.models.PrimitiveMesh extends laya.d3.resource.models.BaseMesh var PrimitiveMesh=(function(_super){ function PrimitiveMesh(){ this._numberVertices=0; this._numberIndices=0; this._vertexBuffer=null; this._indexBuffer=null; this._indexOfHost=0; PrimitiveMesh.__super.call(this); this._indexOfHost=0; } __class(PrimitiveMesh,'laya.d3.resource.models.PrimitiveMesh',_super); var __proto=PrimitiveMesh.prototype; Laya.imps(__proto,{"laya.d3.core.render.IRenderable":true}) __proto._getVertexBuffer=function(index){ (index===void 0)&& (index=0); if (index===0) return this._vertexBuffer; else return null; } __proto._getIndexBuffer=function(){ return this._indexBuffer; } __proto.getRenderElement=function(index){ return this; } __proto.getRenderElementsCount=function(){ return 1; } __proto.detoryResource=function(){ (this._vertexBuffer)&& (this._vertexBuffer.dispose(),this._vertexBuffer=null); (this._indexBuffer)&& (this._indexBuffer.dispose(),this._indexBuffer=null); this.memorySize=0; } __proto._beforeRender=function(state){ this._vertexBuffer._bind(); this._indexBuffer._bind(); return true; } __proto._render=function(state){ state.context.drawElements(/*laya.webgl.WebGLContext.TRIANGLES*/0x0004,this._numberIndices,/*laya.webgl.WebGLContext.UNSIGNED_SHORT*/0x1403,0); Stat.drawCall++; Stat.trianglesFaces+=this._numberIndices / 3; } __getset(0,__proto,'indexOfHost',function(){ return this._indexOfHost; }); __getset(0,__proto,'_vertexBufferCount',function(){ return 1; }); __getset(0,__proto,'triangleCount',function(){ return this._indexBuffer.indexCount / 3; }); /** *获取网格顶点 *@return 网格顶点。 */ __getset(0,__proto,'positions',function(){ var vertices=[]; var positionElement; var vertexElements=this._vertexBuffer.vertexDeclaration.getVertexElements(); var j=0; for (j=0;j < vertexElements.length;j++){ var vertexElement=vertexElements[j]; if (vertexElement.elementFormat===/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3" && vertexElement.elementUsage===/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"){ positionElement=vertexElement; break ; } }; var verticesData=this._vertexBuffer.getData(); for (j=0;j < verticesData.length;j+=this._vertexBuffer.vertexDeclaration.vertexStride / 4){ var ofset=j+positionElement.offset / 4; var position=new Vector3(verticesData[ofset+0],verticesData[ofset+1],verticesData[ofset+2]); vertices.push(position); } return vertices; }); return PrimitiveMesh; })(BaseMesh) /** *Mesh 类用于创建文件网格数据模板。 */ //class laya.d3.resource.models.Mesh extends laya.d3.resource.models.BaseMesh var Mesh=(function(_super){ function Mesh(){ this._materials=null; this._subMeshes=null; this._bindPoses=null; this._inverseBindPoses=null; Mesh.__super.call(this); this._subMeshes=[]; this._materials=[]; if (this._loaded) this._generateBoundingObject(); else this.once(/*laya.events.Event.LOADED*/"loaded",this,this._generateBoundingObject); } __class(Mesh,'laya.d3.resource.models.Mesh',_super); var __proto=Mesh.prototype; __proto._generateBoundingObject=function(){ var pos=this.positions; this._boundingBox=new BoundBox(new Vector3(),new Vector3()); BoundBox.createfromPoints(pos,this._boundingBox); this._boundingSphere=new BoundSphere(new Vector3(),0); BoundSphere.createfromPoints(pos,this._boundingSphere); } /** *添加子网格(开发者禁止修改)。 *@param subMesh 子网格。 */ __proto._add=function(subMesh){ subMesh._indexInMesh=this._subMeshes.length; this._subMeshes.push(subMesh); this._subMeshCount++; } /** *移除子网格(开发者禁止修改)。 *@param subMesh 子网格。 *@return 是否成功。 */ __proto._remove=function(subMesh){ var index=this._subMeshes.indexOf(subMesh); if (index < 0)return false; this._subMeshes.splice(index,1); this._subMeshCount--; return true; } /** *@private */ __proto.onAsynLoaded=function(url,data){ var bufferData=data[0]; var textureMap=data[1]; new LoadModel(bufferData,this,this._materials,textureMap); this._loaded=true; this.event(/*laya.events.Event.LOADED*/"loaded",this); } /** *获得子网格。 *@param index 子网格索引。 *@return 子网格。 */ __proto.getSubMesh=function(index){ return this._subMeshes[index]; } /** *获得子网格数量。 *@return 子网格数量。 */ __proto.getSubMeshCount=function(){ return this._subMeshes.length; } __proto.getRenderElementsCount=function(){ return this._subMeshes.length; } __proto.getRenderElement=function(index){ return this._subMeshes[index]; } /** *

彻底清理资源。

*

注意:会强制解锁清理。

*/ __proto.dispose=function(){ this._resourceManager.removeResource(this); laya.resource.Resource.prototype.dispose.call(this); for (var i=0;i < this._subMeshes.length;i++) this._subMeshes[i].dispose(); this._subMeshes=null; this._subMeshCount=0; } /** *获取网格顶点 *@return 网格顶点。 */ __getset(0,__proto,'positions',function(){ var vertices=[]; var submesheCount=this._subMeshes.length; for (var i=0;i < submesheCount;i++){ var subMesh=this._subMeshes[i]; var vertexBuffer=subMesh._getVertexBuffer(); var positionElement; var vertexElements=vertexBuffer.vertexDeclaration.getVertexElements(); var j=0; for (j=0;j < vertexElements.length;j++){ var vertexElement=vertexElements[j]; if (vertexElement.elementFormat===/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3" && vertexElement.elementUsage===/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"){ positionElement=vertexElement; break ; } }; var verticesData=vertexBuffer.getData(); for (j=0;j < verticesData.length;j+=vertexBuffer.vertexDeclaration.vertexStride / 4){ var ofset=j+positionElement.offset / 4; var position=new Vector3(verticesData[ofset+0],verticesData[ofset+1],verticesData[ofset+2]); vertices.push(position); } } return vertices; }); /** *获取材质队列的浅拷贝。 *@return 材质队列的浅拷贝。 */ __getset(0,__proto,'materials',function(){ return this._materials.slice(); }); /** *获取网格的默认绑定动作矩阵。 *@return 网格的默认绑定动作矩阵。 */ __getset(0,__proto,'bindPoses',function(){ return this._bindPoses; }); /** *获取网格的全局默认绑定动作逆矩阵。 *@return 网格的全局默认绑定动作逆矩阵。 */ __getset(0,__proto,'InverseAbsoluteBindPoses',function(){ return this._inverseBindPoses; }); Mesh.load=function(url){ return Laya.loader.create(url,null,null,Mesh); } return Mesh; })(BaseMesh) /** *RenderTarget 类用于创建渲染目标。 */ //class laya.d3.resource.RenderTexture extends laya.d3.resource.BaseTexture var RenderTexture=(function(_super){ function RenderTexture(width,height,surfaceFormat,surfaceType,depthStencilFormat,mipMap,repeat,minFifter,magFifter){ this._alreadyResolved=false; this._surfaceFormat=0; this._surfaceType=0; this._depthStencilFormat=0; this._frameBuffer=null; this._depthStencilBuffer=null; (surfaceFormat===void 0)&& (surfaceFormat=/*laya.webgl.WebGLContext.RGBA*/0x1908); (surfaceType===void 0)&& (surfaceType=/*laya.webgl.WebGLContext.UNSIGNED_BYTE*/0x1401); (depthStencilFormat===void 0)&& (depthStencilFormat=/*laya.webgl.WebGLContext.DEPTH_COMPONENT16*/0x81A5); (mipMap===void 0)&& (mipMap=false); (repeat===void 0)&& (repeat=false); (minFifter===void 0)&& (minFifter=-1); (magFifter===void 0)&& (magFifter=-1); RenderTexture.__super.call(this); this._width=width; this._height=height; this._size=new Size(width,height); this._surfaceFormat=surfaceFormat; this._surfaceType=surfaceType; this._depthStencilFormat=depthStencilFormat; this._mipmap=mipMap; this._repeat=repeat; this._minFifter=minFifter; this._magFifter=magFifter; this.activeResource(); this._loaded=true; this._alreadyResolved=true; } __class(RenderTexture,'laya.d3.resource.RenderTexture',_super); var __proto=RenderTexture.prototype; __proto.recreateResource=function(){ this.startCreate(); var gl=WebGL.mainContext; this._frameBuffer=gl.createFramebuffer(); this._source=gl.createTexture(); var preTarget=WebGLContext.curBindTexTarget; var preTexture=WebGLContext.curBindTexValue; WebGLContext.bindTexture(gl,/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,this._source); gl.texImage2D(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,0,/*laya.webgl.WebGLContext.RGBA*/0x1908,this._width,this._height,0,this._surfaceFormat,this._surfaceType,null); var minFifter=this._minFifter; var magFifter=this._magFifter; var repeat=this._repeat ? /*laya.webgl.WebGLContext.REPEAT*/0x2901 :/*laya.webgl.WebGLContext.CLAMP_TO_EDGE*/0x812F; var isPot=Arith.isPOT(this._width,this._height); if (isPot){ if (this._mipmap) (minFifter!==-1)|| (minFifter=/*laya.webgl.WebGLContext.LINEAR_MIPMAP_LINEAR*/0x2703); else (minFifter!==-1)|| (minFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); (magFifter!==-1)|| (magFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_MIN_FILTER*/0x2801,minFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_MAG_FILTER*/0x2800,magFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_WRAP_S*/0x2802,repeat); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_WRAP_T*/0x2803,repeat); this._mipmap && gl.generateMipmap(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1); }else { (minFifter!==-1)|| (minFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); (magFifter!==-1)|| (magFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_MIN_FILTER*/0x2801,minFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_MAG_FILTER*/0x2800,magFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_WRAP_S*/0x2802,/*laya.webgl.WebGLContext.CLAMP_TO_EDGE*/0x812F); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_WRAP_T*/0x2803,/*laya.webgl.WebGLContext.CLAMP_TO_EDGE*/0x812F); } gl.bindFramebuffer(/*laya.webgl.WebGLContext.FRAMEBUFFER*/0x8D40,this._frameBuffer); gl.framebufferTexture2D(/*laya.webgl.WebGLContext.FRAMEBUFFER*/0x8D40,/*laya.webgl.WebGLContext.COLOR_ATTACHMENT0*/0x8CE0,/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,this._source,0); if (this._depthStencilFormat){ this._depthStencilBuffer=gl.createRenderbuffer(); gl.bindRenderbuffer(/*laya.webgl.WebGLContext.RENDERBUFFER*/0x8D41,this._depthStencilBuffer); gl.renderbufferStorage(/*laya.webgl.WebGLContext.RENDERBUFFER*/0x8D41,this._depthStencilFormat,this._width,this._height); switch (this._depthStencilFormat){ case /*laya.webgl.WebGLContext.DEPTH_COMPONENT16*/0x81A5: gl.framebufferRenderbuffer(/*laya.webgl.WebGLContext.FRAMEBUFFER*/0x8D40,/*laya.webgl.WebGLContext.DEPTH_ATTACHMENT*/0x8D00,/*laya.webgl.WebGLContext.RENDERBUFFER*/0x8D41,this._depthStencilBuffer); break ; case /*laya.webgl.WebGLContext.STENCIL_INDEX8*/0x8D48: gl.framebufferRenderbuffer(/*laya.webgl.WebGLContext.FRAMEBUFFER*/0x8D40,/*laya.webgl.WebGLContext.STENCIL_ATTACHMENT*/0x8D20,/*laya.webgl.WebGLContext.RENDERBUFFER*/0x8D41,this._depthStencilBuffer); break ; case /*laya.webgl.WebGLContext.DEPTH_STENCIL*/0x84F9: gl.framebufferRenderbuffer(/*laya.webgl.WebGLContext.FRAMEBUFFER*/0x8D40,/*laya.webgl.WebGLContext.DEPTH_STENCIL_ATTACHMENT*/0x821A,/*laya.webgl.WebGLContext.RENDERBUFFER*/0x8D41,this._depthStencilBuffer); break ; } } gl.bindFramebuffer(/*laya.webgl.WebGLContext.FRAMEBUFFER*/0x8D40,null); (preTarget && preTexture)&& (WebGLContext.bindTexture(gl,preTarget,preTexture)); gl.bindRenderbuffer(/*laya.webgl.WebGLContext.RENDERBUFFER*/0x8D41,null); this.memorySize=this._width *this._height *4; this.completeCreate(); } /** *开始绑定。 */ __proto.start=function(){ WebGL.mainContext.bindFramebuffer(/*laya.webgl.WebGLContext.FRAMEBUFFER*/0x8D40,this.frameBuffer); RenderTexture._currentRenderTarget=this; this._alreadyResolved=false; } /** *结束绑定。 */ __proto.end=function(){ WebGL.mainContext.bindFramebuffer(/*laya.webgl.WebGLContext.FRAMEBUFFER*/0x8D40,null); RenderTexture._currentRenderTarget=null; this._alreadyResolved=true; } /** *获得像素数据。 *@param x X像素坐标。 *@param y Y像素坐标。 *@param width 宽度。 *@param height 高度。 *@return 像素数据。 */ __proto.getData=function(x,y,width,height){ var gl=WebGL.mainContext; gl.bindFramebuffer(/*laya.webgl.WebGLContext.FRAMEBUFFER*/0x8D40,this._frameBuffer); var canRead=(gl.checkFramebufferStatus(/*laya.webgl.WebGLContext.FRAMEBUFFER*/0x8D40)===/*laya.webgl.WebGLContext.FRAMEBUFFER_COMPLETE*/0x8CD5); if (!canRead){ gl.bindFramebuffer(/*laya.webgl.WebGLContext.FRAMEBUFFER*/0x8D40,null); return null; }; var pixels=new Uint8Array(this._width *this._height *4); gl.readPixels(x,y,width,height,this._surfaceFormat,this._surfaceType,pixels); gl.bindFramebuffer(/*laya.webgl.WebGLContext.FRAMEBUFFER*/0x8D40,null); return pixels; } /** *销毁资源。 */ __proto.detoryResource=function(){ if (this._frameBuffer){ var gl=WebGL.mainContext; gl.deleteTexture(this._source); gl.deleteFramebuffer(this._frameBuffer); gl.deleteRenderbuffer(this._depthStencilBuffer); this._source=null; this._frameBuffer=null; this._depthStencilBuffer=null; this.memorySize=0; } } /** *获取表面格式。 *@return 表面格式。 */ __getset(0,__proto,'surfaceFormat',function(){ return this._surfaceFormat; }); /** *获取表面类型。 *@return 表面类型。 */ __getset(0,__proto,'surfaceType',function(){ return this._surfaceType; }); /** *获取深度格式。 *@return 深度格式。 */ __getset(0,__proto,'depthStencilFormat',function(){ return this._depthStencilFormat; }); /** *获取RenderTarget数据源,如果alreadyResolved等于false,则返回null。 *@return RenderTarget数据源。 */ __getset(0,__proto,'source',function(){ if (this._alreadyResolved) return _super.prototype._$get_source.call(this); else return null; }); __getset(0,__proto,'depthStencilBuffer',function(){ return this._depthStencilBuffer; }); __getset(0,__proto,'frameBuffer',function(){ return this._frameBuffer; }); RenderTexture._currentRenderTarget=null return RenderTexture; })(BaseTexture) /** *SolidColorTexture2D 二维纯色纹理。 */ //class laya.d3.resource.SolidColorTexture2D extends laya.d3.resource.BaseTexture var SolidColorTexture2D=(function(_super){ function SolidColorTexture2D(color){ this._color=null; this._pixels=null; SolidColorTexture2D.__super.call(this); this._width=1; this._height=1; this._size=new Size(this.width,this.height); this._color=color; this._pixels=new Uint8Array([color.x *255,color.y *255,color.z *255,color.w *255]); } __class(SolidColorTexture2D,'laya.d3.resource.SolidColorTexture2D',_super); var __proto=SolidColorTexture2D.prototype; /** *@private */ __proto._createWebGlTexture=function(){ var gl=WebGL.mainContext; var glTex=this._source=gl.createTexture(); var w=this._width; var h=this._height; var preTarget=WebGLContext.curBindTexTarget; var preTexture=WebGLContext.curBindTexValue; WebGLContext.bindTexture(gl,/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,glTex); gl.texImage2D(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,0,/*laya.webgl.WebGLContext.RGBA*/0x1908,w,h,0,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.UNSIGNED_BYTE*/0x1401,this._pixels); var minFifter=this._minFifter; var magFifter=this._magFifter; var repeat=this._repeat ? /*laya.webgl.WebGLContext.REPEAT*/0x2901 :/*laya.webgl.WebGLContext.CLAMP_TO_EDGE*/0x812F; var isPot=Arith.isPOT(w,h); if (isPot){ if (this._mipmap) (minFifter!==-1)|| (minFifter=/*laya.webgl.WebGLContext.LINEAR_MIPMAP_LINEAR*/0x2703); else (minFifter!==-1)|| (minFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); (magFifter!==-1)|| (magFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_MIN_FILTER*/0x2801,minFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_MAG_FILTER*/0x2800,magFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_WRAP_S*/0x2802,repeat); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_WRAP_T*/0x2803,repeat); this._mipmap && gl.generateMipmap(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1); }else { (minFifter!==-1)|| (minFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); (magFifter!==-1)|| (magFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_MIN_FILTER*/0x2801,minFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_MAG_FILTER*/0x2800,magFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_WRAP_S*/0x2802,/*laya.webgl.WebGLContext.CLAMP_TO_EDGE*/0x812F); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_WRAP_T*/0x2803,/*laya.webgl.WebGLContext.CLAMP_TO_EDGE*/0x812F); } (preTarget && preTexture)&& (WebGLContext.bindTexture(gl,preTarget,preTexture)); if (isPot) this.memorySize=w *h *4 *(1+1 / 3); else this.memorySize=w *h *4; } /** *重新创建资源,如果异步创建中被强制释放再创建,则需等待释放完成后再重新加载创建。 */ __proto.recreateResource=function(){ this.startCreate(); this._createWebGlTexture(); this.completeCreate(); } /** *销毁资源。 */ __proto.detoryResource=function(){ if (this._source){ WebGL.mainContext.deleteTexture(this._source); this._source=null; this.memorySize=0; } } __getset(0,__proto,'source',function(){ return _super.prototype._$get_source.call(this); }); __static(SolidColorTexture2D, ['magentaTexture',function(){return this.magentaTexture=new SolidColorTexture2D(new Vector4(1.0,0.0,1.0,1.0));},'grayTexture',function(){return this.grayTexture=new SolidColorTexture2D(new Vector4(0.5,0.5,0.5,1.0));} ]); return SolidColorTexture2D; })(BaseTexture) /** *Sky 类用于创建天空盒。 */ //class laya.d3.resource.models.SkyBox extends laya.d3.resource.models.Sky var SkyBox=(function(_super){ function SkyBox(){ this._sharderNameID=0; this._shader=null; this._numberVertices=0; this._numberIndices=0; this._vertexBuffer=null; this._indexBuffer=null; this._alphaBlending=1.0; this._colorIntensity=1.0; this._textureCube=null; this._shaderValue=new ValusArray(); SkyBox.__super.call(this); this.name="Skybox-"+SkyBox._nameNumber; SkyBox._nameNumber++; this.loadShaderParams(); this.recreateResource(); } __class(SkyBox,'laya.d3.resource.models.SkyBox',_super); var __proto=SkyBox.prototype; /** *@private */ __proto._getShader=function(state){ var shaderDefs=state.shaderDefines; var preDef=shaderDefs._value; var nameID=shaderDefs._value+this._sharderNameID */*laya.webgl.shader.Shader.SHADERNAME2ID*/0.0002; this._shader=Shader.withCompile(this._sharderNameID,state.shaderDefines.toNameDic(),nameID,null); shaderDefs._value=preDef; return this._shader; } /** *@private */ __proto.recreateResource=function(){ this.startCreate(); this._numberVertices=36; this._numberIndices=36; var indices=new Uint16Array(this._numberIndices); var vertexFloatStride=SkyBox._vertexDeclaration.vertexStride / 4; var vertices=new Float32Array(this._numberVertices *vertexFloatStride); var width=1.0; var height=1.0; var depth=1.0; var halfWidth=width / 2.0; var halfHeight=height / 2.0; var halfDepth=depth / 2.0; var topLeftFront=new Vector3(-halfWidth,halfHeight,halfDepth); var bottomLeftFront=new Vector3(-halfWidth,-halfHeight,halfDepth); var topRightFront=new Vector3(halfWidth,halfHeight,halfDepth); var bottomRightFront=new Vector3(halfWidth,-halfHeight,halfDepth); var topLeftBack=new Vector3(-halfWidth,halfHeight,-halfDepth); var topRightBack=new Vector3(halfWidth,halfHeight,-halfDepth); var bottomLeftBack=new Vector3(-halfWidth,-halfHeight,-halfDepth); var bottomRightBack=new Vector3(halfWidth,-halfHeight,-halfDepth); var vertexCount=0; vertexCount=this._addVertex(vertices,vertexCount,topLeftFront); vertexCount=this._addVertex(vertices,vertexCount,bottomLeftFront); vertexCount=this._addVertex(vertices,vertexCount,topRightFront); vertexCount=this._addVertex(vertices,vertexCount,bottomLeftFront); vertexCount=this._addVertex(vertices,vertexCount,bottomRightFront); vertexCount=this._addVertex(vertices,vertexCount,topRightFront); vertexCount=this._addVertex(vertices,vertexCount,topLeftBack); vertexCount=this._addVertex(vertices,vertexCount,topRightBack); vertexCount=this._addVertex(vertices,vertexCount,bottomLeftBack); vertexCount=this._addVertex(vertices,vertexCount,bottomLeftBack); vertexCount=this._addVertex(vertices,vertexCount,topRightBack); vertexCount=this._addVertex(vertices,vertexCount,bottomRightBack); vertexCount=this._addVertex(vertices,vertexCount,topLeftFront); vertexCount=this._addVertex(vertices,vertexCount,topRightBack); vertexCount=this._addVertex(vertices,vertexCount,topLeftBack); vertexCount=this._addVertex(vertices,vertexCount,topLeftFront); vertexCount=this._addVertex(vertices,vertexCount,topRightFront); vertexCount=this._addVertex(vertices,vertexCount,topRightBack); vertexCount=this._addVertex(vertices,vertexCount,bottomLeftFront); vertexCount=this._addVertex(vertices,vertexCount,bottomLeftBack); vertexCount=this._addVertex(vertices,vertexCount,bottomRightBack); vertexCount=this._addVertex(vertices,vertexCount,bottomLeftFront); vertexCount=this._addVertex(vertices,vertexCount,bottomRightBack); vertexCount=this._addVertex(vertices,vertexCount,bottomRightFront); vertexCount=this._addVertex(vertices,vertexCount,topLeftFront); vertexCount=this._addVertex(vertices,vertexCount,bottomLeftBack); vertexCount=this._addVertex(vertices,vertexCount,bottomLeftFront); vertexCount=this._addVertex(vertices,vertexCount,topLeftBack); vertexCount=this._addVertex(vertices,vertexCount,bottomLeftBack); vertexCount=this._addVertex(vertices,vertexCount,topLeftFront); vertexCount=this._addVertex(vertices,vertexCount,topRightFront); vertexCount=this._addVertex(vertices,vertexCount,bottomRightFront); vertexCount=this._addVertex(vertices,vertexCount,bottomRightBack); vertexCount=this._addVertex(vertices,vertexCount,topRightBack); vertexCount=this._addVertex(vertices,vertexCount,topRightFront); vertexCount=this._addVertex(vertices,vertexCount,bottomRightBack); for (var i=0;i < 36;i++) indices[i]=i; this._vertexBuffer=new VertexBuffer3D(SkyBox._vertexDeclaration,this._numberVertices,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4,true); this._indexBuffer=new IndexBuffer3D(/*laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort",this._numberIndices,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4,true); this._vertexBuffer.setData(vertices); this._indexBuffer.setData(indices); this.memorySize=(this._vertexBuffer.byteLength+this._indexBuffer.byteLength)*2; this.completeCreate(); } /** *@private */ __proto._addVertex=function(vertices,index,position){ var posE=position.elements; vertices[index+0]=posE[0]; vertices[index+1]=posE[1]; vertices[index+2]=posE[2]; return index+3; } /** *@private */ __proto.loadShaderParams=function(){ this._sharderNameID=Shader.nameKey.get("SkyBox"); this._shaderValue.pushValue(/*laya.d3.resource.models.Sky.DIFFUSETEXTURE*/"DIFFUSETEXTURE",null); } __proto._render=function(state){ if (this._textureCube && this._textureCube.loaded){ this._vertexBuffer._bind(); this._indexBuffer._bind(); this._shader=this._getShader(state); var presz=this._shaderValue.length; this._shaderValue.pushArray(state.shaderValue); this._shaderValue.pushArray(this._vertexBuffer.vertexDeclaration.shaderValues); state.camera.transform.worldMatrix.cloneTo(SkyBox._tempMatrix4x40); SkyBox._tempMatrix4x40.transpose(); Matrix4x4.multiply(state.projectionMatrix,SkyBox._tempMatrix4x40,SkyBox._tempMatrix4x41); this._shaderValue.pushValue(/*laya.d3.resource.models.Sky.MVPMATRIX*/"MVPMATRIX",SkyBox._tempMatrix4x41.elements); this._shaderValue.pushValue(/*laya.d3.resource.models.Sky.INTENSITY*/"INTENSITY",this._colorIntensity); this._shaderValue.pushValue(/*laya.d3.resource.models.Sky.ALPHABLENDING*/"ALPHABLENDING",this.alphaBlending); this._shaderValue.data[1]=this.textureCube.source; this._shader.uploadArray(this._shaderValue.data,this._shaderValue.length,null); this._shaderValue.length=presz; WebGL.mainContext.drawElements(/*laya.webgl.WebGLContext.TRIANGLES*/0x0004,36,/*laya.webgl.WebGLContext.UNSIGNED_SHORT*/0x1403,0); Stat.trianglesFaces+=12; Stat.drawCall++; } } /** *设置透明混合度。 *@param value 透明混合度。 */ /** *获取透明混合度。 *@return 透明混合度。 */ __getset(0,__proto,'alphaBlending',function(){ return this._alphaBlending; },function(value){ this._alphaBlending=value; if (this._alphaBlending < 0) this._alphaBlending=0; if (this._alphaBlending > 1) this._alphaBlending=1; }); /** *设置天空立方体纹理。 *@param value 天空立方体纹理。 */ /** *获取天空立方体纹理。 *@return 天空立方体纹理。 */ __getset(0,__proto,'textureCube',function(){ return this._textureCube; },function(value){ this._textureCube=value; }); /** *设置颜色强度。 *@param value 颜色强度。 */ /** *获取颜色强度。 *@return 颜色强度。 */ __getset(0,__proto,'colorIntensity',function(){ return this._colorIntensity; },function(value){ this._colorIntensity=value; if (this._colorIntensity < 0) this._colorIntensity=0; }); SkyBox._nameNumber=1; __static(SkyBox, ['_tempMatrix4x40',function(){return this._tempMatrix4x40=new Matrix4x4();},'_tempMatrix4x41',function(){return this._tempMatrix4x41=new Matrix4x4();},'_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(12,[new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION")]);} ]); return SkyBox; })(Sky) /** *Sky 类用于创建天空盒。 */ //class laya.d3.resource.models.SkyDome extends laya.d3.resource.models.Sky var SkyDome=(function(_super){ function SkyDome(){ this._sharderNameID=0; this._shader=null; this._numberVertices=0; this._numberIndices=0; this._vertexBuffer=null; this._indexBuffer=null; this._alphaBlending=1.0; this._colorIntensity=1.0; this._texture=null; this._stacks=16; this._slices=16; this._radius=1; this._shaderValue=new ValusArray(); SkyDome.__super.call(this); this.name="SkyDome-"+SkyDome._nameNumber; SkyDome._nameNumber++; this.loadShaderParams(); this.recreateResource(); } __class(SkyDome,'laya.d3.resource.models.SkyDome',_super); var __proto=SkyDome.prototype; /** *@private */ __proto._getShader=function(state){ var shaderDefs=state.shaderDefines; var preDef=shaderDefs._value; var nameID=shaderDefs._value+this._sharderNameID */*laya.webgl.shader.Shader.SHADERNAME2ID*/0.0002; this._shader=Shader.withCompile(this._sharderNameID,state.shaderDefines.toNameDic(),nameID,null); shaderDefs._value=preDef; return this._shader; } /** *@private */ __proto.recreateResource=function(){ this.startCreate(); this._numberVertices=(this._stacks+1)*(this._slices+1); this._numberIndices=(3 *this._stacks *(this._slices+1))*2; var indices=new Uint16Array(this._numberIndices); var vertexFloatStride=SkyDome._vertexDeclaration.vertexStride / 4; var vertices=new Float32Array(this._numberVertices *vertexFloatStride); var stackAngle=Math.PI / this._stacks; var sliceAngle=(Math.PI *2.0)/ this._slices; var vertexIndex=0; var vertexCount=0; var indexCount=0; for (var stack=0;stack < (this._stacks+1);stack++){ var r=Math.sin(stack *stackAngle); var y=Math.cos(stack *stackAngle); for (var slice=0;slice < (this._slices+1);slice++){ var x=r *Math.sin(slice *sliceAngle); var z=r *Math.cos(slice *sliceAngle); vertices[vertexCount+0]=x *this._radius; vertices[vertexCount+1]=y *this._radius; vertices[vertexCount+2]=z *this._radius; vertices[vertexCount+3]=slice / this._slices; vertices[vertexCount+4]=stack / this._stacks; vertexCount+=vertexFloatStride; if (stack !=(this._stacks-1)){ indices[indexCount++]=vertexIndex+1; indices[indexCount++]=vertexIndex; indices[indexCount++]=vertexIndex+(this._slices+1); indices[indexCount++]=vertexIndex+(this._slices+1); indices[indexCount++]=vertexIndex; indices[indexCount++]=vertexIndex+(this._slices); vertexIndex++; } } } this._vertexBuffer=new VertexBuffer3D(SkyDome._vertexDeclaration,this._numberVertices,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4); this._indexBuffer=new IndexBuffer3D(/*laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort",this._numberIndices,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4); this._vertexBuffer.setData(vertices); this._indexBuffer.setData(indices); this.memorySize=(this._vertexBuffer.byteLength+this._indexBuffer.byteLength)*2; this.completeCreate(); } /** *@private */ __proto.loadShaderParams=function(){ this._sharderNameID=Shader.nameKey.get("SkyDome"); this._shaderValue.pushValue(/*laya.d3.resource.models.Sky.DIFFUSETEXTURE*/"DIFFUSETEXTURE",null); } __proto._render=function(state){ if (this._texture && this._texture.loaded){ this._vertexBuffer._bind(); this._indexBuffer._bind(); this._shader=this._getShader(state); var presz=this._shaderValue.length; this._shaderValue.pushArray(state.shaderValue); this._shaderValue.pushArray(this._vertexBuffer.vertexDeclaration.shaderValues); state.camera.transform.worldMatrix.cloneTo(SkyDome._tempMatrix4x40); SkyDome._tempMatrix4x40.transpose(); Matrix4x4.multiply(state.projectionMatrix,SkyDome._tempMatrix4x40,SkyDome._tempMatrix4x41); this._shaderValue.pushValue(/*laya.d3.resource.models.Sky.MVPMATRIX*/"MVPMATRIX",SkyDome._tempMatrix4x41.elements); this._shaderValue.pushValue(/*laya.d3.resource.models.Sky.INTENSITY*/"INTENSITY",this._colorIntensity); this._shaderValue.pushValue(/*laya.d3.resource.models.Sky.ALPHABLENDING*/"ALPHABLENDING",this.alphaBlending); this._shaderValue.data[1]=this.texture.source; this._shader.uploadArray(this._shaderValue.data,this._shaderValue.length,null); this._shaderValue.length=presz; WebGL.mainContext.drawElements(/*laya.webgl.WebGLContext.TRIANGLES*/0x0004,this._indexBuffer.indexCount,/*laya.webgl.WebGLContext.UNSIGNED_SHORT*/0x1403,0); Stat.trianglesFaces+=this._numberIndices / 3; Stat.drawCall++; } } /** *设置透明混合度。 *@param value 透明混合度。 */ /** *获取透明混合度。 *@return 透明混合度。 */ __getset(0,__proto,'alphaBlending',function(){ return this._alphaBlending; },function(value){ this._alphaBlending=value; if (this._alphaBlending < 0) this._alphaBlending=0; if (this._alphaBlending > 1) this._alphaBlending=1; }); /** *设置颜色强度。 *@param value 颜色强度。 */ /** *获取颜色强度。 *@return 颜色强度。 */ __getset(0,__proto,'colorIntensity',function(){ return this._colorIntensity; },function(value){ this._colorIntensity=value; if (this._colorIntensity < 0) this._colorIntensity=0; }); /** *设置天空立方体纹理。 *@param value 天空立方体纹理。 */ /** *获取天空立方体纹理。 *@return 天空立方体纹理。 */ __getset(0,__proto,'texture',function(){ return this._texture; },function(value){ this._texture=value; }); SkyDome._nameNumber=1; __static(SkyDome, ['_tempMatrix4x40',function(){return this._tempMatrix4x40=new Matrix4x4();},'_tempMatrix4x41',function(){return this._tempMatrix4x41=new Matrix4x4();},'_vertexDeclaration',function(){return this._vertexDeclaration=new VertexDeclaration(20,[new VertexElement(0,/*laya.d3.graphics.VertexElementFormat.Vector3*/"vector3",/*laya.d3.graphics.VertexElementUsage.POSITION0*/"POSITION"),new VertexElement(12,/*laya.d3.graphics.VertexElementFormat.Vector2*/"vector2",/*laya.d3.graphics.VertexElementUsage.TEXTURECOORDINATE0*/"UV")]);} ]); return SkyDome; })(Sky) /** *Texture2D 二维纹理。 */ //class laya.d3.resource.Texture2D extends laya.d3.resource.BaseTexture var Texture2D=(function(_super){ function Texture2D(){ this._src=null; this._image=null; this._recreateLock=false; this._needReleaseAgain=false; Texture2D.__super.call(this); } __class(Texture2D,'laya.d3.resource.Texture2D',_super); var __proto=Texture2D.prototype; /** *@private */ __proto._onTextureLoaded=function(img){ this._image=img; var w=img.width; var h=img.height; this._width=w; this._height=h; this._size=new Size(w,h); } /** *@private */ __proto._createWebGlTexture=function(){ if (!this._image){ throw "create GLTextur err:no data:"+this._image; }; var gl=WebGL.mainContext; var glTex=this._source=gl.createTexture(); var w=this._width; var h=this._height; var preTarget=WebGLContext.curBindTexTarget; var preTexture=WebGLContext.curBindTexValue; WebGLContext.bindTexture(gl,/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,glTex); gl.texImage2D(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,0,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.UNSIGNED_BYTE*/0x1401,this._image); var minFifter=this._minFifter; var magFifter=this._magFifter; var repeat=this._repeat ? /*laya.webgl.WebGLContext.REPEAT*/0x2901 :/*laya.webgl.WebGLContext.CLAMP_TO_EDGE*/0x812F; var isPot=Arith.isPOT(w,h); if (isPot){ if (this._mipmap) (minFifter!==-1)|| (minFifter=/*laya.webgl.WebGLContext.LINEAR_MIPMAP_LINEAR*/0x2703); else (minFifter!==-1)|| (minFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); (magFifter!==-1)|| (magFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_MIN_FILTER*/0x2801,minFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_MAG_FILTER*/0x2800,magFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_WRAP_S*/0x2802,repeat); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_WRAP_T*/0x2803,repeat); this._mipmap && gl.generateMipmap(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1); }else { (minFifter!==-1)|| (minFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); (magFifter!==-1)|| (magFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_MIN_FILTER*/0x2801,minFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_MAG_FILTER*/0x2800,magFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_WRAP_S*/0x2802,/*laya.webgl.WebGLContext.CLAMP_TO_EDGE*/0x812F); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_2D*/0x0DE1,/*laya.webgl.WebGLContext.TEXTURE_WRAP_T*/0x2803,/*laya.webgl.WebGLContext.CLAMP_TO_EDGE*/0x812F); } (preTarget && preTexture)&& (WebGLContext.bindTexture(gl,preTarget,preTexture)); this._image.onload=null; this._image=null; if (isPot) this.memorySize=w *h *4 *(1+1 / 3); else this.memorySize=w *h *4; this._recreateLock=false; } /** *重新创建资源,如果异步创建中被强制释放再创建,则需等待释放完成后再重新加载创建。 */ __proto.recreateResource=function(){ if (this._src==null || this._src==="") return; this._needReleaseAgain=false; if (!this._image){ this._recreateLock=true; this.startCreate(); var _this=this; this._image=new Browser.window.Image(); this._image.crossOrigin=""; this._image.onload=function (){ if (_this._needReleaseAgain){ _this._needReleaseAgain=false; _this._image.onload=null; _this._image=null; return; } _this._createWebGlTexture(); _this.completeCreate(); }; this._image.src=this._src; }else { if (this._recreateLock){ return; } this.startCreate(); this._createWebGlTexture(); this.completeCreate(); } } /** *@private */ __proto.onAsynLoaded=function(url,data){ this._src=url; this._onTextureLoaded(data); this.activeResource(); this._loaded=true; this.event(/*laya.events.Event.LOADED*/"loaded",this); } /** *销毁资源。 */ __proto.detoryResource=function(){ if (this._recreateLock){ this._needReleaseAgain=true; } if (this._source){ WebGL.mainContext.deleteTexture(this._source); this._source=null; this._image=null; this.memorySize=0; } } /** *获取文件路径全名。 */ __getset(0,__proto,'src',function(){ return this._src; }); Texture2D.load=function(url){ return Laya.loader.create(url,null,null,Texture2D); } return Texture2D; })(BaseTexture) //class laya.d3.resource.TextureCube extends laya.d3.resource.BaseTexture var TextureCube=(function(_super){ function TextureCube(){ this._texCount=6; //this._images=null; //this._srcs=null; this._recreateLock=false; this._needReleaseAgain=false; TextureCube.__super.call(this); } __class(TextureCube,'laya.d3.resource.TextureCube',_super); var __proto=TextureCube.prototype; /** *@private */ __proto._onTextureLoaded=function(images){ this._images=images; var minWidth=2147483647; var minHeight=2147483647; for (var i=0;i < 6;i++){ var image=images[i]; minWidth=Math.min(minWidth,image.width); minHeight=Math.min(minHeight,image.height); } this._width=minWidth; this._height=minHeight; this._size=new Size(minWidth,minHeight); } __proto._createWebGlTexture=function(){ var i=0; for (i=0;i < this._texCount;i++){ if (!this._images[i]){ throw "create GLTextur err:no data:"+this._images[i]; } }; var gl=WebGL.mainContext; var glTex=this._source=gl.createTexture(); var w=this._width; var h=this._height; var preTarget=WebGLContext.curBindTexTarget; var preTexture=WebGLContext.curBindTexValue; WebGLContext.bindTexture(gl,/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP*/0x8513,glTex); gl.texImage2D(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP_POSITIVE_X*/0x8515,0,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.UNSIGNED_BYTE*/0x1401,this._images[0]); gl.texImage2D(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP_NEGATIVE_X*/0x8516,0,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.UNSIGNED_BYTE*/0x1401,this._images[1]); gl.texImage2D(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP_POSITIVE_Y*/0x8517,0,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.UNSIGNED_BYTE*/0x1401,this._images[2]); gl.texImage2D(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP_NEGATIVE_Y*/0x8518,0,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.UNSIGNED_BYTE*/0x1401,this._images[3]); gl.texImage2D(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP_POSITIVE_Z*/0x8519,0,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.UNSIGNED_BYTE*/0x1401,this._images[4]); gl.texImage2D(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP_NEGATIVE_Z*/0x851A,0,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.RGBA*/0x1908,/*laya.webgl.WebGLContext.UNSIGNED_BYTE*/0x1401,this._images[5]); var minFifter=this.minFifter; var magFifter=this.magFifter; var repeat=this.repeat ? /*laya.webgl.WebGLContext.REPEAT*/0x2901 :/*laya.webgl.WebGLContext.CLAMP_TO_EDGE*/0x812F; var isPOT=Arith.isPOT(w,h); if (isPOT){ if (this.mipmap) (minFifter!==-1)|| (minFifter=/*laya.webgl.WebGLContext.LINEAR_MIPMAP_LINEAR*/0x2703); else (minFifter!==-1)|| (minFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); (magFifter!==-1)|| (magFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP*/0x8513,/*laya.webgl.WebGLContext.TEXTURE_MIN_FILTER*/0x2801,minFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP*/0x8513,/*laya.webgl.WebGLContext.TEXTURE_MAG_FILTER*/0x2800,magFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP*/0x8513,/*laya.webgl.WebGLContext.TEXTURE_WRAP_S*/0x2802,repeat); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP*/0x8513,/*laya.webgl.WebGLContext.TEXTURE_WRAP_T*/0x2803,repeat); this.mipmap && gl.generateMipmap(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP*/0x8513); }else { (minFifter!==-1)|| (minFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); (magFifter!==-1)|| (magFifter=/*laya.webgl.WebGLContext.LINEAR*/0x2601); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP*/0x8513,/*laya.webgl.WebGLContext.TEXTURE_MIN_FILTER*/0x2801,minFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP*/0x8513,/*laya.webgl.WebGLContext.TEXTURE_MAG_FILTER*/0x2800,magFifter); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP*/0x8513,/*laya.webgl.WebGLContext.TEXTURE_WRAP_S*/0x2802,/*laya.webgl.WebGLContext.CLAMP_TO_EDGE*/0x812F); gl.texParameteri(/*laya.webgl.WebGLContext.TEXTURE_CUBE_MAP*/0x8513,/*laya.webgl.WebGLContext.TEXTURE_WRAP_T*/0x2803,/*laya.webgl.WebGLContext.CLAMP_TO_EDGE*/0x812F); } (preTarget && preTexture)&& (WebGLContext.bindTexture(gl,preTarget,preTexture)); for (i=0;i < 6;i++){ this._images[i].onload=null; this._images[i]=null; } if (isPOT) this.memorySize=w *h *4 *(1+1 / 3)*this._texCount; else this.memorySize=w *h *4 *this._texCount; this._recreateLock=false; } __proto.recreateResource=function(){ var _$this=this; if (this._srcs==null) return; this._needReleaseAgain=false; if (!this._images[0]){ this._recreateLock=true; this.startCreate(); var _this=this; for (var i=0;i < this._texCount;i++){ this._images[i]=new Browser.window.Image(); this._images[i].crossOrigin=""; var index=i; this._images[index].onload=function (){ var j=0; if (_this._needReleaseAgain){ for (j=0;j < _$this._texCount;j++) if (!_this._images[j].complete) return; _this._needReleaseAgain=false; for (j=0;j < _$this._texCount;j++){ _this._images[j].onload=null; _this._images[j]=null; } return; } for (j=0;j < _$this._texCount;j++) if (!_this._images[j].complete) return; _this._createWebGlTexture(); _this.completeCreate(); }; this._images[i].src=this._srcs[i]; } }else { if (this._recreateLock){ return; } this.startCreate(); this._createWebGlTexture(); this.completeCreate(); } } /** *@private */ __proto.onAsynLoaded=function(url,data){ this._srcs=url; this._onTextureLoaded(data); this.activeResource(); this._loaded=true; this.event(/*laya.events.Event.LOADED*/"loaded",this); } __proto.detoryResource=function(){ if (this._recreateLock){ this._needReleaseAgain=true; } if (this._source){ WebGL.mainContext.deleteTexture(this._source); this._source=null; this.memorySize=0; } } /** *文件路径全名。 */ __getset(0,__proto,'srcs',function(){ return this._srcs; }); TextureCube.load=function(url){ return Laya.loader.create(url,null,null,TextureCube); } return TextureCube; })(BaseTexture) /** *Scene 类用于实现普通场景。 */ //class laya.d3.core.scene.Scene extends laya.d3.core.scene.BaseScene var Scene=(function(_super){ /** *创建一个 Scene 实例。 */ function Scene(){ Scene.__super.call(this); } __class(Scene,'laya.d3.core.scene.Scene',_super); var __proto=Scene.prototype; __proto._renderCamera=function(gl,state,camera){ this._prepareRenderToRenderState(camera,state); this.beforeRender(state); var renderTarget=camera.renderTarget; if (renderTarget){ renderTarget.start(); Matrix4x4.multiply(this._invertYScaleMatrix,camera.projectionMatrix,this._invertYProjectionMatrix); Matrix4x4.multiply(this._invertYScaleMatrix,camera.projectionViewMatrix,this._invertYProjectionViewMatrix); state.projectionMatrix=this._invertYProjectionMatrix; state.projectionViewMatrix=this._invertYProjectionViewMatrix; }else { state.projectionMatrix=camera.projectionMatrix; state.projectionViewMatrix=camera.projectionViewMatrix; } state.viewMatrix=camera.viewMatrix; state.viewport=camera.viewport; this._preRenderScene(gl,state); this._clear(gl,state); this._renderScene(gl,state); this.lateRender(state); this._endRenderToRenderState(state); (renderTarget)&& (renderTarget.end()); } /** *@private */ __proto.renderSubmit=function(){ var gl=WebGL.mainContext; this._set3DRenderConfig(gl); for (var i=0,n=this._cameraPool.length;i < n;i++){ var camera=this._cameraPool [i]; (camera.enable)&& (this._renderCamera(gl,this._renderState,camera)); } this._set2DRenderConfig(gl); return 1; } return Scene; })(BaseScene) /** *VRScene 类用于实现VR场景。 */ //class laya.d3.core.scene.VRScene extends laya.d3.core.scene.BaseScene var VRScene=(function(_super){ /** *创建一个 VRScene 实例。 */ function VRScene(){ VRScene.__super.call(this); } __class(VRScene,'laya.d3.core.scene.VRScene',_super); var __proto=VRScene.prototype; __proto.renderCamera=function(gl,state,cameraVR){ this._prepareRenderToRenderState(cameraVR,state); state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.VR*/0x40); this.beforeRender(state); var renderTarget=cameraVR.renderTarget; if (renderTarget){ renderTarget.start(); Matrix4x4.multiply(this._invertYScaleMatrix,cameraVR.leftProjectionMatrix,this._invertYProjectionMatrix); Matrix4x4.multiply(this._invertYScaleMatrix,cameraVR.leftProjectionViewMatrix,this._invertYProjectionViewMatrix); state.projectionMatrix=this._invertYProjectionMatrix; state.projectionViewMatrix=this._invertYProjectionViewMatrix; }else { state.projectionMatrix=cameraVR.leftProjectionMatrix; state.projectionViewMatrix=cameraVR.leftProjectionViewMatrix; } state.viewMatrix=cameraVR.leftViewMatrix; state.viewport=cameraVR.leftViewport; this._preRenderScene(gl,state); this._clear(gl,state); this._renderScene(gl,state); if (renderTarget){ renderTarget.start(); Matrix4x4.multiply(this._invertYScaleMatrix,cameraVR.rightProjectionMatrix,this._invertYProjectionMatrix); Matrix4x4.multiply(this._invertYScaleMatrix,cameraVR.rightProjectionViewMatrix,this._invertYProjectionViewMatrix); state.projectionMatrix=this._invertYProjectionMatrix; state.projectionViewMatrix=this._invertYProjectionViewMatrix; }else { state.projectionMatrix=cameraVR.rightProjectionMatrix; state.projectionViewMatrix=cameraVR.rightProjectionViewMatrix; } state.viewMatrix=cameraVR.rightViewMatrix; state.viewport=cameraVR.rightViewport; this._preRenderScene(gl,state); this._clear(gl,state); this._renderScene(gl,state); this.lateRender(state); (renderTarget)&& (renderTarget.end()); } /** *@private */ __proto.renderSubmit=function(){ var gl=WebGL.mainContext; var state=this._renderState; this._set3DRenderConfig(gl); for (var i=0,n=this._cameraPool.length;i < n;i++){ var cameraVR=this._cameraPool [i]; if (cameraVR.enable) this.renderCamera(gl,state,cameraVR); } this._set2DRenderConfig(gl); return 1; } return VRScene; })(BaseScene) /** *Camera 类用于创建摄像机。 */ //class laya.d3.core.Camera extends laya.d3.core.BaseCamera var Camera=(function(_super){ function Camera(aspectRatio,nearPlane,farPlane){ //this._aspectRatio=NaN; //this._viewport=null; //this._normalizedViewport=null; //this._viewMatrix=null; //this._projectionMatrix=null; //this._projectionViewMatrix=null; (aspectRatio===void 0)&& (aspectRatio=0); (nearPlane===void 0)&& (nearPlane=0.1); (farPlane===void 0)&& (farPlane=1000); this._viewMatrix=new Matrix4x4(); this._projectionMatrix=new Matrix4x4(); this._projectionViewMatrix=new Matrix4x4(); this._viewport=new Viewport(0,0,0,0); this._normalizedViewport=new Viewport(0,0,1,1); this._aspectRatio=aspectRatio; Camera.__super.call(this,nearPlane,farPlane); } __class(Camera,'laya.d3.core.Camera',_super); var __proto=Camera.prototype; /** *@private *计算投影矩阵。 */ __proto._calculateProjectionMatrix=function(){ if (!this._useUserProjectionMatrix){ if (this.orthographicProjection){ var halfWidth=this.orthographicVerticalSize *this.aspectRatio *0.5; var halfHeight=this.orthographicVerticalSize *0.5; Matrix4x4.createOrthogonal(-halfWidth,halfWidth,-halfHeight,halfHeight,this.nearPlane,this.farPlane,this._projectionMatrix); }else { Matrix4x4.createPerspective(3.1416 *this.fieldOfView / 180.0,this.aspectRatio,this.nearPlane,this.farPlane,this._projectionMatrix); } } this._projectionMatrixModifyID+=0.01 / this.id; } /** *计算从屏幕空间生成的射线。 *@param point 屏幕空间的位置位置。 *@return out 输出射线。 */ __proto.viewportPointToRay=function(point,out){ Picker.calculateCursorRay(point,this.viewport,this._projectionMatrix,this.viewMatrix,null,out); } /** *计算从裁切空间生成的射线。 *@param point 裁切空间的位置。。 *@return out 输出射线。 */ __proto.normalizedViewportPointToRay=function(point,out){ var finalPoint=Camera._tempVector2; var vp=this.viewport; var nVpPosE=point.elements; var vpPosE=finalPoint.elements; vpPosE[0]=nVpPosE[0] *vp.width; vpPosE[1]=nVpPosE[1] *vp.height; Picker.calculateCursorRay(finalPoint,this.viewport,this._projectionMatrix,this.viewMatrix,null,out); } /** *计算从世界空间准换三维坐标到屏幕空间。 *@param position 世界空间的位置。 *@return out 输出位置。 */ __proto.worldToViewportPoint=function(position,out){ Matrix4x4.multiply(this._projectionMatrix,this._viewMatrix,this._projectionViewMatrix); this.viewport.project(position,this._projectionViewMatrix,out); if (out.z < 0.0 || out.z > 1.0){ var outE=out.elements; outE[0]=outE[1]=outE[2]=NaN; } } /** *计算从世界空间准换三维坐标到裁切空间。 *@param position 世界空间的位置。 *@return out 输出位置。 */ __proto.worldToNormalizedViewportPoint=function(position,out){ Matrix4x4.multiply(this._projectionMatrix,this._viewMatrix,this._projectionViewMatrix); this.normalizedViewport.project(position,this._projectionViewMatrix,out); if (out.z < 0.0 || out.z > 1.0){ var outE=out.elements; outE[0]=outE[1]=outE[2]=NaN; } } /** *获取视图投影矩阵。 *@return 视图投影矩阵。 */ __getset(0,__proto,'projectionViewMatrix',function(){ Matrix4x4.multiply(this.projectionMatrix,this.viewMatrix,this._projectionViewMatrix); return this._projectionViewMatrix; }); /** *设置横纵比。 *@param value 横纵比。 */ /** *获取横纵比。 *@return 横纵比。 */ __getset(0,__proto,'aspectRatio',function(){ if (this._aspectRatio===0){ var vp=this.viewport; return vp.width / vp.height; } return this._aspectRatio; },function(value){ if (value < 0) throw new Error("Camera: the aspect ratio has to be a positive real number."); this._aspectRatio=value; this._calculateProjectionMatrix(); }); __getset(0,__proto,'needViewport',function(){ var nVp=this.normalizedViewport; return nVp.x===0 && nVp.y===0 && nVp.width===1 && nVp.height===1; }); /** *设置屏幕空间的视口。 *@param 屏幕空间的视口。 */ /** *获取屏幕空间的视口。 *@return 屏幕空间的视口。 */ __getset(0,__proto,'viewport',function(){ if (this._viewportExpressedInClipSpace){ var nVp=this._normalizedViewport; var size=this.renderTargetSize; var sizeW=size.width; var sizeH=size.height; this._viewport.x=nVp.x *sizeW; this._viewport.y=nVp.y *sizeH; this._viewport.width=nVp.width *sizeW; this._viewport.height=nVp.height *sizeH; } return this._viewport; },function(value){ if (this.renderTarget !=null && (value.x < 0 || value.y < 0 || value.width==0 || value.height==0)) throw new Error("Camera: viewport size invalid.","value"); this._viewportExpressedInClipSpace=false; this._viewport=value; this._calculateProjectionMatrix(); }); /** *设置裁剪空间的视口。 *@return 裁剪空间的视口。 */ /** *获取裁剪空间的视口。 *@return 裁剪空间的视口。 */ __getset(0,__proto,'normalizedViewport',function(){ if (!this._viewportExpressedInClipSpace){ var vp=this._viewport; var size=this.renderTargetSize; var sizeW=size.width; var sizeH=size.height; this._normalizedViewport.x=vp.x / sizeW; this._normalizedViewport.y=vp.y / sizeH; this._normalizedViewport.width=vp.width / sizeW; this._normalizedViewport.height=vp.height / sizeH; } return this._normalizedViewport; },function(value){ if (value.x < 0 || value.y < 0 || (value.x+value.width)> 1 || (value.x+value.height)> 1) throw new Error("Camera: viewport size invalid.","value"); this._viewportExpressedInClipSpace=true; this._normalizedViewport=value; this._calculateProjectionMatrix(); }); /**设置投影矩阵。*/ /**获取投影矩阵。*/ __getset(0,__proto,'projectionMatrix',function(){ return this._projectionMatrix; },function(value){ this._projectionMatrix=value; this._useUserProjectionMatrix=true; }); /** *获取视图矩阵。 *@return 视图矩阵。 */ __getset(0,__proto,'viewMatrix',function(){ this.transform.worldMatrix.invert(this._viewMatrix); return this._viewMatrix; }); __static(Camera, ['_tempVector2',function(){return this._tempVector2=new Vector2();} ]); return Camera; })(BaseCamera) /** *DirectionLight 类用于创建平行光。 */ //class laya.d3.core.light.DirectionLight extends laya.d3.core.light.LightSprite var DirectionLight=(function(_super){ function DirectionLight(){ this._direction=null; DirectionLight.__super.call(this); this._diffuseColor=new Vector3(1.0,1.0,1.0); this._ambientColor=new Vector3(0.6,0.6,0.6); this._specularColor=new Vector3(1.0,1.0,1.0); this._reflectColor=new Vector3(1.0,1.0,1.0); this._direction=new Vector3(0.0,-0.5,-1.0); } __class(DirectionLight,'laya.d3.core.light.DirectionLight',_super); var __proto=DirectionLight.prototype; /** *更新平行光相关渲染状态参数。 *@param state 渲染状态参数。 */ __proto.updateToWorldState=function(state){ if (state.scene.enableLight){ var shaderValue=state.shaderValue; state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.DIRECTIONLIGHT*/0x1000); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.LIGHTDIRDIFFUSE*/"LIGHTDIRDIFFUSE",this.diffuseColor.elements); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.LIGHTDIRAMBIENT*/"LIGHTDIRAMBIENT",this.ambientColor.elements); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.LIGHTDIRSPECULAR*/"LIGHTDIRSPECULAR",this.specularColor.elements); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.LIGHTDIRECTION*/"LIGHTDIRECTION",this.direction.elements); } } /** *设置平行光的方向。 *@param value 平行光的方向。 */ /** *获取平行光的方向。 *@return 平行光的方向。 */ __getset(0,__proto,'direction',function(){ return this._direction; },function(value){ this._direction=value; }); /** *获取平行光的类型。 *@return 平行光的类型。 */ __getset(0,__proto,'lightType',function(){ return 1; }); return DirectionLight; })(LightSprite) /** *PointLight 类用于创建点光。 */ //class laya.d3.core.light.PointLight extends laya.d3.core.light.LightSprite var PointLight=(function(_super){ function PointLight(){ this._attenuation=null; this._range=NaN; PointLight.__super.call(this); this._diffuseColor=new Vector3(1.0,1.0,1.0); this._ambientColor=new Vector3(0.2,0.2,0.2); this._specularColor=new Vector3(1.0,0.0,0.0); this._reflectColor=new Vector3(1.0,1.0,1.0); this.transform.position=new Vector3(0.0,0.0,0.0); this._range=6.0; this._attenuation=new Vector3(0.6,0.6,0.6); } __class(PointLight,'laya.d3.core.light.PointLight',_super); var __proto=PointLight.prototype; /** *更新点光相关渲染状态参数。 *@param state 渲染状态参数。 */ __proto.updateToWorldState=function(state){ if (state.scene.enableLight){ var shaderValue=state.shaderValue; state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.POINTLIGHT*/0x2000); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.POINTLIGHTDIFFUSE*/"POINTLIGHTDIFFUSE",this.diffuseColor.elements); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.POINTLIGHTAMBIENT*/"POINTLIGHTAMBIENT",this.ambientColor.elements); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.POINTLIGHTSPECULAR*/"POINTLIGHTSPECULAR",this.specularColor.elements); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.POINTLIGHTPOS*/"POINTLIGHTPOS",this.transform.position.elements); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.POINTLIGHTRANGE*/"POINTLIGHTRANGE",this.range); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.POINTLIGHTATTENUATION*/"POINTLIGHTATTENUATION",this.attenuation.elements); } } /** *设置点光的范围。 *@param value 点光的范围。 */ /** *获取点光的范围。 *@return 点光的范围。 */ __getset(0,__proto,'range',function(){ return this._range; },function(value){ this._range=value; }); /** *获取点光的类型。 *@return 点光的类型。 */ __getset(0,__proto,'lightType',function(){ return 2; }); /** *设置点光的衰减。 *@param value 点光的衰减。 */ /** *获取点光的衰减。 *@return 点光的衰减。 */ __getset(0,__proto,'attenuation',function(){ return this._attenuation; },function(value){ this._attenuation=value; }); return PointLight; })(LightSprite) /** *SpotLight 类用于创建聚光。 */ //class laya.d3.core.light.SpotLight extends laya.d3.core.light.LightSprite var SpotLight=(function(_super){ function SpotLight(){ this._direction=null; this._attenuation=null; this._spot=NaN; this._range=NaN; SpotLight.__super.call(this); this._diffuseColor=new Vector3(1.0,1.0,1.0); this._ambientColor=new Vector3(0.2,0.2,0.2); this._specularColor=new Vector3(1.0,1.0,1.0); this._reflectColor=new Vector3(1.0,1.0,1.0); this.transform.position=new Vector3(0.0,1.0,1.0); this._direction=new Vector3(0.0,-1.0,-1.0); this._attenuation=new Vector3(0.6,0.6,0.6); this._spot=96.0; this._range=6.0; } __class(SpotLight,'laya.d3.core.light.SpotLight',_super); var __proto=SpotLight.prototype; /** *更新聚光相关渲染状态参数。 *@param state 渲染状态参数。 */ __proto.updateToWorldState=function(state){ if (state.scene.enableLight){ var shaderValue=state.shaderValue; state.shaderDefines.add(/*laya.d3.shader.ShaderDefines3D.SPOTLIGHT*/0x4000); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.SPOTLIGHTDIFFUSE*/"SPOTLIGHTDIFFUSE",this.diffuseColor.elements); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.SPOTLIGHTAMBIENT*/"SPOTLIGHTAMBIENT",this.ambientColor.elements); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.SPOTLIGHTSPECULAR*/"SPOTLIGHTSPECULAR",this.specularColor.elements); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.SPOTLIGHTPOS*/"SPOTLIGHTPOS",this.transform.position.elements); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.SPOTLIGHTDIRECTION*/"SPOTLIGHTDIRECTION",this.direction.elements); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.SPOTLIGHTRANGE*/"SPOTLIGHTRANGE",this.range); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.SPOTLIGHTSPOT*/"SPOTLIGHTSPOT",this.spot); shaderValue.pushValue(/*laya.d3.core.scene.BaseScene.SPOTLIGHTATTENUATION*/"SPOTLIGHTATTENUATION",this.attenuation.elements); } } /** *设置聚光的范围。 *@param value 聚光的范围值。 */ /** *获取聚光的范围。 *@return 聚光的范围值。 */ __getset(0,__proto,'range',function(){ return this._range; },function(value){ this._range=value; }); /** *设置聚光的方向。 *@param value 聚光的方向。 */ /** *获取聚光的方向。 *@return 聚光的方向。 */ __getset(0,__proto,'direction',function(){ return this._direction; },function(value){ this._direction=value; }); /** *获取聚光的类型。 *@return 聚光的类型。 */ __getset(0,__proto,'lightType',function(){ return 3; }); /** *设置聚光的衰减。 *@param value 聚光的衰减。 */ /** *获取聚光的衰减。 *@return 聚光的衰减。 */ __getset(0,__proto,'attenuation',function(){ return this._attenuation; },function(value){ this._attenuation=value; }); /** *设置聚光的聚光值。 *@param value 聚光的聚光值。 */ /** *获取聚光的聚光值。 *@return 聚光的聚光值。 */ __getset(0,__proto,'spot',function(){ return this._spot; },function(value){ this._spot=value; }); return SpotLight; })(LightSprite) /** *TerrainMeshSprite3D 类用于创建网格。 */ //class laya.d3.core.MeshTerrainSprite3D extends laya.d3.core.MeshSprite3D var MeshTerrainSprite3D=(function(_super){ function MeshTerrainSprite3D(mesh,heightMap,name){ this._minX=NaN; this._minZ=NaN; this._cellSize=null; this._heightMap=null; MeshTerrainSprite3D.__super.call(this,mesh,name); this._heightMap=heightMap; this._cellSize=new Vector2(); } __class(MeshTerrainSprite3D,'laya.d3.core.MeshTerrainSprite3D',_super); var __proto=MeshTerrainSprite3D.prototype; /** *@private */ __proto._disableRotation=function(){ var rotation=this.transform.rotation; rotation.elements[0]=0; rotation.elements[1]=0; rotation.elements[2]=0; rotation.elements[3]=1; this.transform.rotation=rotation; } /** *@private */ __proto._getScaleX=function(){ var worldMat=this.transform.worldMatrix; var worldMatE=worldMat.elements; var m11=worldMatE[0]; var m12=worldMatE[1]; var m13=worldMatE[2]; return Math.sqrt((m11 *m11)+(m12 *m12)+(m13 *m13)); } /** *@private */ __proto._getScaleZ=function(){ var worldMat=this.transform.worldMatrix; var worldMatE=worldMat.elements; var m31=worldMatE[8]; var m32=worldMatE[9]; var m33=worldMatE[10]; return Math.sqrt((m31 *m31)+(m32 *m32)+(m33 *m33)); } /** *@private */ __proto._initCreateFromMesh=function(heightMapWidth,heightMapHeight){ this._heightMap=HeightMap.creatFromMesh(this.meshFilter.sharedMesh,heightMapWidth,heightMapHeight,this._cellSize); var boundingBox=this.meshFilter.sharedMesh.boundingBox; var min=boundingBox.min; var max=boundingBox.max; this._minX=min.x; this._minZ=min.z; } /** *@private */ __proto._createFromMeshAndHeightMapMeshLoaded=function(sender,texture,minHeight,maxHeight){ this._initCreateFromMeshHeightMap(texture,minHeight,maxHeight); } /** *@private */ __proto._initCreateFromMeshHeightMap=function(texture,minHeight,maxHeight){ var _$this=this; var boundingBox=this.meshFilter.sharedMesh.boundingBox; if (texture.loaded){ this._heightMap=HeightMap.createFromImage(texture,minHeight,maxHeight); this._computeCellSize(boundingBox); }else { texture.once(/*laya.events.Event.LOADED*/"loaded",null,function(){ _$this._heightMap=HeightMap.createFromImage(texture,minHeight,maxHeight); _$this._computeCellSize(boundingBox); }); }; var min=boundingBox.min; var max=boundingBox.max; this._minX=min.x; this._minZ=min.z; } /** *@private */ __proto._computeCellSize=function(boundingBox){ var min=boundingBox.min; var max=boundingBox.max; var minX=min.x; var minZ=min.z; var maxX=max.x; var maxZ=max.z; var widthSize=maxX-minX; var heightSize=maxZ-minZ; this._cellSize.elements[0]=widthSize / (this._heightMap.width-1); this._cellSize.elements[1]=heightSize / (this._heightMap.height-1); } /** *@private */ __proto._update=function(state){ this._disableRotation(); _super.prototype._update.call(this,state); } /** *获取地形高度。 *@param x X轴坐标。 *@param z Z轴坐标。 */ __proto.getHeight=function(x,z){ MeshTerrainSprite3D._tempVector3.elements[0]=x; MeshTerrainSprite3D._tempVector3.elements[1]=0; MeshTerrainSprite3D._tempVector3.elements[2]=z; this._disableRotation(); var worldMat=this.transform.worldMatrix; worldMat.invert(MeshTerrainSprite3D._tempMatrix4x4); Vector3.transformCoordinate(MeshTerrainSprite3D._tempVector3,MeshTerrainSprite3D._tempMatrix4x4,MeshTerrainSprite3D._tempVector3); x=MeshTerrainSprite3D._tempVector3.elements[0]; z=MeshTerrainSprite3D._tempVector3.elements[2]; var c=(x-this._minX)/ this._cellSize.x; var d=(z-this._minZ)/ this._cellSize.y; var row=Math.floor(d); var col=Math.floor(c); var s=c-col; var t=d-row; var uy=NaN; var vy=NaN; var worldMatE=worldMat.elements; var m21=worldMatE[4]; var m22=worldMatE[5]; var m23=worldMatE[6]; var scaleY=Math.sqrt((m21 *m21)+(m22 *m22)+(m23 *m23)); var translateY=worldMatE[13]; var h01=this._heightMap.getHeight(row,col+1); var h10=this._heightMap.getHeight((row+1),col); if (isNaN(h01)|| isNaN(h10)) return NaN; if (s+t <=1.0){ var h00=this._heightMap.getHeight(row,col); if (isNaN(h00)) return NaN; uy=h01-h00; vy=h10-h00; return (h00+s *uy+t *vy)*scaleY+translateY; }else { var h11=this._heightMap.getHeight((row+1),col+1); if (isNaN(h11)) return NaN; uy=h10-h11; vy=h01-h11; return (h11+(1.0-s)*uy+(1.0-t)*vy)*scaleY+translateY; } } /** *获取地形X轴最小位置。 *@return 地形X轴最小位置。 */ __getset(0,__proto,'minX',function(){ var worldMat=this.transform.worldMatrix; var worldMatE=worldMat.elements; return this._minX *this._getScaleX()+worldMatE[12]; }); /** *获取地形X轴长度。 *@return 地形X轴长度。 */ __getset(0,__proto,'width',function(){ return (this._heightMap.width-1)*this._cellSize.x *this._getScaleX(); }); /** *获取地形Z轴最小位置。 *@return 地形X轴最小位置。 */ __getset(0,__proto,'minZ',function(){ var worldMat=this.transform.worldMatrix; var worldMatE=worldMat.elements; return this._minZ *this._getScaleZ()+worldMatE[14]; }); /** *获取地形Z轴长度。 *@return 地形Z轴长度。 */ __getset(0,__proto,'depth',function(){ return (this._heightMap.height-1)*this._cellSize.y *this._getScaleZ(); }); MeshTerrainSprite3D.createFromMesh=function(mesh,heightMapWidth,heightMapHeight,name){ var meshTerrainSprite3D=new MeshTerrainSprite3D(mesh,null,name); if (mesh.loaded) meshTerrainSprite3D._initCreateFromMesh(heightMapWidth,heightMapHeight); else mesh.once(/*laya.events.Event.LOADED*/"loaded",meshTerrainSprite3D,meshTerrainSprite3D._initCreateFromMesh,[heightMapWidth,heightMapHeight]); return meshTerrainSprite3D; } MeshTerrainSprite3D.createFromMeshAndHeightMap=function(mesh,texture,minHeight,maxHeight,name){ var meshTerrainSprite3D=new MeshTerrainSprite3D(mesh,null,name); if (mesh.loaded) meshTerrainSprite3D._initCreateFromMeshHeightMap(texture,minHeight,maxHeight); else mesh.once(/*laya.events.Event.LOADED*/"loaded",meshTerrainSprite3D,meshTerrainSprite3D._createFromMeshAndHeightMapMeshLoaded,[texture,maxHeight]); return meshTerrainSprite3D; } __static(MeshTerrainSprite3D, ['_tempVector3',function(){return this._tempVector3=new Vector3();},'_tempMatrix4x4',function(){return this._tempMatrix4x4=new Matrix4x4();} ]); return MeshTerrainSprite3D; })(MeshSprite3D) /** *Camera 类用于创建VR摄像机。 */ //class laya.d3.core.VRCamera extends laya.d3.core.BaseCamera var VRCamera=(function(_super){ function VRCamera(pupilDistande,leftAspectRatio,rightAspectRatio,nearPlane,farPlane){ //this._tempMatrix=null; //this._leftAspectRatio=NaN; //this._leftViewport=null; //this._leftNormalizedViewport=null; //this._leftViewMatrix=null; //this._leftProjectionMatrix=null; //this._leftProjectionViewMatrix=null; //this._rightAspectRatio=NaN; //this._rightViewport=null; //this._rightNormalizedViewport=null; //this._rightViewMatrix=null; //this._rightProjectionMatrix=null; //this._rightProjectionViewMatrix=null; //this._pupilDistande=0; (pupilDistande===void 0)&& (pupilDistande=0.1); (leftAspectRatio===void 0)&& (leftAspectRatio=0); (rightAspectRatio===void 0)&& (rightAspectRatio=0); (nearPlane===void 0)&& (nearPlane=0.1); (farPlane===void 0)&& (farPlane=1000); this._tempMatrix=new Matrix4x4(); this._leftViewMatrix=new Matrix4x4(); this._leftProjectionMatrix=new Matrix4x4(); this._leftProjectionViewMatrix=new Matrix4x4(); this._leftViewport=new Viewport(0,0,0,0); this._leftNormalizedViewport=new Viewport(0,0,0.5,1); this._leftAspectRatio=leftAspectRatio; this._rightViewMatrix=new Matrix4x4(); this._rightProjectionMatrix=new Matrix4x4(); this._rightProjectionViewMatrix=new Matrix4x4(); this._rightViewport=new Viewport(0,0,0,0); this._rightNormalizedViewport=new Viewport(0.5,0,0.5,1); this._rightAspectRatio=rightAspectRatio; this._pupilDistande=pupilDistande; VRCamera.__super.call(this,nearPlane,farPlane); } __class(VRCamera,'laya.d3.core.VRCamera',_super); var __proto=VRCamera.prototype; /** *@private *计算瞳距。 */ __proto._calculatePupilOffset=function(){ var offset=this._tempVector3; Vector3.scale(this.right,this._pupilDistande / 2,offset); return offset.elements; } /** *@private *计算左投影矩阵。 */ __proto._calculateLeftProjectionMatrix=function(){ if (!this._useUserProjectionMatrix){ if (this.orthographicProjection){ var leftHalfWidth=this.orthographicVerticalSize *this.leftAspectRatio *0.5; var leftHalfHeight=this.orthographicVerticalSize *0.5; Matrix4x4.createOrthogonal(-leftHalfWidth,leftHalfWidth,-leftHalfHeight,leftHalfHeight,this.nearPlane,this.farPlane,this._leftProjectionMatrix); }else { Matrix4x4.createPerspective(3.1416 *this.fieldOfView / 180.0,this.leftAspectRatio,this.nearPlane,this.farPlane,this._rightProjectionMatrix); } } this._projectionMatrixModifyID+=0.01 / this.id; } /** *@private *计算右投影矩阵。 */ __proto._calculateRightProjectionMatrix=function(){ if (!this._useUserProjectionMatrix){ if (this.orthographicProjection){ var rightHalfWidth=this.orthographicVerticalSize *this.rightAspectRatio *0.5; var rightHalfHeight=this.orthographicVerticalSize *0.5; Matrix4x4.createOrthogonal(-rightHalfWidth,rightHalfWidth,rightHalfHeight,rightHalfHeight,this.nearPlane,this.farPlane,this._rightProjectionMatrix); }else { Matrix4x4.createPerspective(3.1416 *this.fieldOfView / 180.0,this.rightAspectRatio,this.nearPlane,this.farPlane,this._rightProjectionMatrix); } } this._projectionMatrixModifyID+=0.01 / this.id; } /** *@private *计算投影矩阵。 */ __proto._calculateProjectionMatrix=function(){ if (!this._useUserProjectionMatrix){ if (this.orthographicProjection){ var leftHalfWidth=this.orthographicVerticalSize *this.leftAspectRatio *0.5; var leftHalfHeight=this.orthographicVerticalSize *0.5; var rightHalfWidth=this.orthographicVerticalSize *this.rightAspectRatio *0.5; var rightHalfHeight=this.orthographicVerticalSize *0.5; Matrix4x4.createOrthogonal(-leftHalfWidth,leftHalfWidth,-leftHalfHeight,leftHalfHeight,this.nearPlane,this.farPlane,this._leftProjectionMatrix); Matrix4x4.createOrthogonal(-rightHalfWidth,rightHalfWidth,rightHalfHeight,rightHalfHeight,this.nearPlane,this.farPlane,this._rightProjectionMatrix); }else { Matrix4x4.createPerspective(3.1416 *this.fieldOfView / 180.0,this.leftAspectRatio,this.nearPlane,this.farPlane,this._leftProjectionMatrix); Matrix4x4.createPerspective(3.1416 *this.fieldOfView / 180.0,this.rightAspectRatio,this.nearPlane,this.farPlane,this._rightProjectionMatrix); } } this._projectionMatrixModifyID+=0.01 / this.id; } /** *获取裁剪空间的左视口。 *@return 裁剪空间的左视口。 */ __getset(0,__proto,'leftNormalizedViewport',function(){ if (!this._viewportExpressedInClipSpace){ var vp=this._leftViewport; var size=this.renderTargetSize; var sizeW=size.width; var sizeH=size.height; this._leftNormalizedViewport.x=vp.x / sizeW; this._leftNormalizedViewport.y=vp.y / sizeH; this._leftNormalizedViewport.width=vp.width / sizeW; this._leftNormalizedViewport.height=vp.height / sizeH; } return this._leftNormalizedViewport; }); /** *获取屏幕空间的右视口。 *@return 屏幕空间的右视口。 */ __getset(0,__proto,'rightViewport',function(){ if (this._viewportExpressedInClipSpace){ var nVp=this._rightNormalizedViewport; var size=this.renderTargetSize; var sizeW=size.width; var sizeH=size.height; this._rightViewport.x=nVp.x *sizeW; this._rightViewport.y=nVp.y *sizeH; this._rightViewport.width=nVp.width *sizeW; this._rightViewport.height=nVp.height *sizeH; } return this._rightViewport; }); /** *设置屏幕空间的视口。 *@param 屏幕空间的视口。 */ __getset(0,__proto,'viewport',null,function(value){ if (this.renderTarget !=null && (value.x < 0 || value.y < 0 || value.width==0 || value.height==0)) throw new Error("VRCamera: viewport size invalid.","value"); this._viewportExpressedInClipSpace=false; this._leftViewport=new Viewport(0,0,value.width / 2,value.height); this._rightViewport=new Viewport(value.width / 2,0,value.width / 2,value.height); this._calculateProjectionMatrix(); }); /** *获取左横纵比。 *@return 左横纵比。 */ __getset(0,__proto,'leftAspectRatio',function(){ if (this._leftAspectRatio===0){ var lVp=this.leftViewport; return lVp.width / lVp.height; } return this._leftAspectRatio; }); /** *获取右横纵比。 *@return 右横纵比。 */ __getset(0,__proto,'rightAspectRatio',function(){ if (this._rightAspectRatio===0){ var rVp=this.rightViewport; return rVp.width / rVp.height; } return this._rightAspectRatio; }); /** *设置横纵比。 *@param value 横纵比。 */ __getset(0,__proto,'aspectRatio',null,function(value){ if (value < 0) throw new Error("VRCamera: the aspect ratio has to be a positive real number."); this._leftAspectRatio=value; this._rightAspectRatio=value; this._calculateRightProjectionMatrix(); }); /** *获取裁剪空间的右视口。 *@return 裁剪空间的右视口。 */ __getset(0,__proto,'rightNormalizedViewport',function(){ if (!this._viewportExpressedInClipSpace){ var vp=this._rightViewport; var size=this.renderTargetSize; var sizeW=size.width; var sizeH=size.height; this._rightNormalizedViewport.x=vp.x / sizeW; this._rightNormalizedViewport.y=vp.y / sizeH; this._rightNormalizedViewport.width=vp.width / sizeW; this._rightNormalizedViewport.height=vp.height / sizeH; } return this._rightNormalizedViewport; }); /** *设置裁剪空间的视口。 *@return 裁剪空间的视口。 */ __getset(0,__proto,'normalizedViewport',null,function(value){ if (value.x < 0 || value.y < 0 || (value.x+value.width)> 1 || (value.x+value.height)> 1) throw new Error("VRCamera: viewport size invalid.","value"); this._viewportExpressedInClipSpace=true; this._leftNormalizedViewport=new Viewport(0,0,value.width / 2,value.height); this._rightNormalizedViewport=new Viewport(value.width / 2,0,value.width / 2,value.height); this._calculateProjectionMatrix(); }); /** *获取屏幕空间的左视口。 *@return 屏幕空间的左视口。 */ __getset(0,__proto,'leftViewport',function(){ if (this._viewportExpressedInClipSpace){ var nVp=this._leftNormalizedViewport; var size=this.renderTargetSize; var sizeW=size.width; var sizeH=size.height; this._leftViewport.x=nVp.x *sizeW; this._leftViewport.y=nVp.y *sizeH; this._leftViewport.width=nVp.width *sizeW; this._leftViewport.height=nVp.height *sizeH; } return this._leftViewport; }); __getset(0,__proto,'needLeftViewport',function(){ var nVp=this.leftNormalizedViewport; return nVp.x===0 && nVp.y===0 && nVp.width===1 && nVp.height===1; }); __getset(0,__proto,'needRightViewport',function(){ var nVp=this.rightNormalizedViewport; return nVp.x===0 && nVp.y===0 && nVp.width===1 && nVp.height===1; }); /** *获取左视图矩阵。 *@return 左视图矩阵。 */ __getset(0,__proto,'leftViewMatrix',function(){ var offsetE=this._calculatePupilOffset(); var tempWorldMat=this._tempMatrix; this.transform.worldMatrix.cloneTo(tempWorldMat); var worldMatE=tempWorldMat.elements; worldMatE[12]-=offsetE[0]; worldMatE[13]-=offsetE[1]; worldMatE[14]-=offsetE[2]; tempWorldMat.invert(this._leftViewMatrix); return this._leftViewMatrix; }); /** *获取右视图矩阵。 *@return 右视图矩阵。 */ __getset(0,__proto,'rightViewMatrix',function(){ var offsetE=this._calculatePupilOffset(); var tempWorldMat=this._tempMatrix; this.transform.worldMatrix.cloneTo(tempWorldMat); var worldMatE=tempWorldMat.elements; worldMatE[12]+=offsetE[0]; worldMatE[13]+=offsetE[1]; worldMatE[14]+=offsetE[2]; tempWorldMat.invert(this._rightViewMatrix); return this._rightViewMatrix; }); /** *获取左投影矩阵。 *@return 左投影矩阵。 */ __getset(0,__proto,'leftProjectionMatrix',function(){ return this._leftProjectionMatrix; }); /** *获取左投影视图矩阵。 *@return 左投影视图矩阵。 */ __getset(0,__proto,'leftProjectionViewMatrix',function(){ Matrix4x4.multiply(this.leftProjectionMatrix,this.leftViewMatrix,this._leftProjectionViewMatrix); return this._leftProjectionViewMatrix; }); /** *获取右投影矩阵。 *@return 右投影矩阵。 */ __getset(0,__proto,'rightProjectionMatrix',function(){ return this._rightProjectionMatrix; }); /** *获取右投影视图矩阵。 *@return 右投影视图矩阵。 */ __getset(0,__proto,'rightProjectionViewMatrix',function(){ Matrix4x4.multiply(this.rightProjectionMatrix,this.rightViewMatrix,this._rightProjectionViewMatrix); return this._rightProjectionViewMatrix; }); return VRCamera; })(BaseCamera) /** *Sphere 类用于创建球体。 */ //class laya.d3.resource.models.BoxMesh extends laya.d3.resource.models.PrimitiveMesh var BoxMesh=(function(_super){ function BoxMesh(long,width,height){ this._long=NaN; this._width=NaN; this._height=NaN; (long===void 0)&& (long=1); (width===void 0)&& (width=1); (height===void 0)&& (height=1); BoxMesh.__super.call(this); this._long=long; this._width=width; this._height=height; this.recreateResource(); this._loaded=true; var pos=this.positions; this._boundingBox=new BoundBox(new Vector3(),new Vector3()); BoundBox.createfromPoints(pos,this._boundingBox); this._boundingSphere=new BoundSphere(new Vector3(),0); BoundSphere.createfromPoints(pos,this._boundingSphere); } __class(BoxMesh,'laya.d3.resource.models.BoxMesh',_super); var __proto=BoxMesh.prototype; __proto.recreateResource=function(){ this.startCreate(); this._numberVertices=24; this._numberIndices=36; var indices=new Uint16Array(this._numberIndices); var vertexDeclaration=VertexPositionNormalTexture.vertexDeclaration; var vertexFloatStride=vertexDeclaration.vertexStride / 4; var vertices=new Float32Array(this._numberVertices*vertexFloatStride); var halfLong=this._long / 2; var halfWidth=this._width / 2; var nPointNum=0; vertices[nPointNum+0]=-halfLong;vertices[nPointNum+1]=this._height;vertices[nPointNum+2]=-halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=1;vertices[nPointNum+5]=0; vertices[nPointNum+6]=0;vertices[nPointNum+7]=0;nPointNum+=8; vertices[nPointNum+0]=halfLong;vertices[nPointNum+1]=this._height;vertices[nPointNum+2]=-halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=1;vertices[nPointNum+5]=0; vertices[nPointNum+6]=1;vertices[nPointNum+7]=0;nPointNum+=8; vertices[nPointNum+0]=halfLong;vertices[nPointNum+1]=this._height;vertices[nPointNum+2]=halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=1;vertices[nPointNum+5]=0; vertices[nPointNum+6]=1;vertices[nPointNum+7]=1;nPointNum+=8; vertices[nPointNum+0]=-halfLong;vertices[nPointNum+1]=this._height;vertices[nPointNum+2]=halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=1;vertices[nPointNum+5]=0; vertices[nPointNum+6]=0;vertices[nPointNum+7]=1;nPointNum+=8; vertices[nPointNum+0]=-halfLong;vertices[nPointNum+1]=0;vertices[nPointNum+2]=-halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=-1;vertices[nPointNum+5]=0; vertices[nPointNum+6]=1;vertices[nPointNum+7]=0;nPointNum+=8; vertices[nPointNum+0]=halfLong;vertices[nPointNum+1]=0;vertices[nPointNum+2]=-halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=-1;vertices[nPointNum+5]=0; vertices[nPointNum+6]=0;vertices[nPointNum+7]=0;nPointNum+=8; vertices[nPointNum+0]=halfLong;vertices[nPointNum+1]=0;vertices[nPointNum+2]=halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=-1;vertices[nPointNum+5]=0; vertices[nPointNum+6]=0;vertices[nPointNum+7]=1;nPointNum+=8; vertices[nPointNum+0]=-halfLong;vertices[nPointNum+1]=0;vertices[nPointNum+2]=halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=-1;vertices[nPointNum+5]=0; vertices[nPointNum+6]=1;vertices[nPointNum+7]=1;nPointNum+=8; vertices[nPointNum+0]=-halfLong;vertices[nPointNum+1]=this._height;vertices[nPointNum+2]=-halfWidth; vertices[nPointNum+3]=-1;vertices[nPointNum+4]=0;vertices[nPointNum+5]=0; vertices[nPointNum+6]=0;vertices[nPointNum+7]=0;nPointNum+=8; vertices[nPointNum+0]=-halfLong;vertices[nPointNum+1]=this._height;vertices[nPointNum+2]=halfWidth; vertices[nPointNum+3]=-1;vertices[nPointNum+4]=0;vertices[nPointNum+5]=0; vertices[nPointNum+6]=1;vertices[nPointNum+7]=0;nPointNum+=8; vertices[nPointNum+0]=-halfLong;vertices[nPointNum+1]=0;vertices[nPointNum+2]=halfWidth; vertices[nPointNum+3]=-1;vertices[nPointNum+4]=0;vertices[nPointNum+5]=0; vertices[nPointNum+6]=1;vertices[nPointNum+7]=1;nPointNum+=8; vertices[nPointNum+0]=-halfLong;vertices[nPointNum+1]=0;vertices[nPointNum+2]=-halfWidth; vertices[nPointNum+3]=-1;vertices[nPointNum+4]=0;vertices[nPointNum+5]=0; vertices[nPointNum+6]=0;vertices[nPointNum+7]=1;nPointNum+=8; vertices[nPointNum+0]=halfLong;vertices[nPointNum+1]=this._height;vertices[nPointNum+2]=-halfWidth; vertices[nPointNum+3]=1;vertices[nPointNum+4]=0;vertices[nPointNum+5]=0; vertices[nPointNum+6]=1;vertices[nPointNum+7]=0;nPointNum+=8; vertices[nPointNum+0]=halfLong;vertices[nPointNum+1]=this._height;vertices[nPointNum+2]=halfWidth; vertices[nPointNum+3]=1;vertices[nPointNum+4]=0;vertices[nPointNum+5]=0; vertices[nPointNum+6]=0;vertices[nPointNum+7]=0;nPointNum+=8; vertices[nPointNum+0]=halfLong;vertices[nPointNum+1]=0;vertices[nPointNum+2]=halfWidth; vertices[nPointNum+3]=1;vertices[nPointNum+4]=0;vertices[nPointNum+5]=0; vertices[nPointNum+6]=0;vertices[nPointNum+7]=1;nPointNum+=8; vertices[nPointNum+0]=halfLong;vertices[nPointNum+1]=0;vertices[nPointNum+2]=-halfWidth; vertices[nPointNum+3]=1;vertices[nPointNum+4]=0;vertices[nPointNum+5]=0; vertices[nPointNum+6]=1;vertices[nPointNum+7]=1;nPointNum+=8; vertices[nPointNum+0]=-halfLong;vertices[nPointNum+1]=this._height;vertices[nPointNum+2]=halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=0;vertices[nPointNum+5]=1; vertices[nPointNum+6]=0;vertices[nPointNum+7]=0;nPointNum+=8; vertices[nPointNum+0]=halfLong;vertices[nPointNum+1]=this._height;vertices[nPointNum+2]=halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=0;vertices[nPointNum+5]=1; vertices[nPointNum+6]=1;vertices[nPointNum+7]=0;nPointNum+=8; vertices[nPointNum+0]=halfLong;vertices[nPointNum+1]=0;vertices[nPointNum+2]=halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=0;vertices[nPointNum+5]=1; vertices[nPointNum+6]=1;vertices[nPointNum+7]=1;nPointNum+=8; vertices[nPointNum+0]=-halfLong;vertices[nPointNum+1]=0;vertices[nPointNum+2]=halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=0;vertices[nPointNum+5]=1; vertices[nPointNum+6]=0;vertices[nPointNum+7]=1;nPointNum+=8; vertices[nPointNum+0]=-halfLong;vertices[nPointNum+1]=this._height;vertices[nPointNum+2]=-halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=0;vertices[nPointNum+5]=-1; vertices[nPointNum+6]=1;vertices[nPointNum+7]=0;nPointNum+=8; vertices[nPointNum+0]=halfLong;vertices[nPointNum+1]=this._height;vertices[nPointNum+2]=-halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=0;vertices[nPointNum+5]=-1; vertices[nPointNum+6]=0;vertices[nPointNum+7]=0;nPointNum+=8; vertices[nPointNum+0]=halfLong;vertices[nPointNum+1]=0;vertices[nPointNum+2]=-halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=0;vertices[nPointNum+5]=-1; vertices[nPointNum+6]=0;vertices[nPointNum+7]=1;nPointNum+=8; vertices[nPointNum+0]=-halfLong;vertices[nPointNum+1]=0;vertices[nPointNum+2]=-halfWidth; vertices[nPointNum+3]=0;vertices[nPointNum+4]=0;vertices[nPointNum+5]=-1; vertices[nPointNum+6]=1;vertices[nPointNum+7]=1; var nFaceNum=0; indices[nFaceNum+0]=0;indices[nFaceNum+1]=1;indices[nFaceNum+2]=2;nFaceNum+=3; indices[nFaceNum+0]=2;indices[nFaceNum+1]=3;indices[nFaceNum+2]=0;nFaceNum+=3; indices[nFaceNum+0]=4;indices[nFaceNum+1]=7;indices[nFaceNum+2]=6;nFaceNum+=3; indices[nFaceNum+0]=6;indices[nFaceNum+1]=5;indices[nFaceNum+2]=4;nFaceNum+=3; indices[nFaceNum+0]=8;indices[nFaceNum+1]=9;indices[nFaceNum+2]=10;nFaceNum+=3; indices[nFaceNum+0]=10;indices[nFaceNum+1]=11;indices[nFaceNum+2]=8;nFaceNum+=3; indices[nFaceNum+0]=12;indices[nFaceNum+1]=15;indices[nFaceNum+2]=14;nFaceNum+=3; indices[nFaceNum+0]=14;indices[nFaceNum+1]=13;indices[nFaceNum+2]=12;nFaceNum+=3; indices[nFaceNum+0]=16;indices[nFaceNum+1]=17;indices[nFaceNum+2]=18;nFaceNum+=3; indices[nFaceNum+0]=18;indices[nFaceNum+1]=19;indices[nFaceNum+2]=16;nFaceNum+=3; indices[nFaceNum+0]=20;indices[nFaceNum+1]=23;indices[nFaceNum+2]=22;nFaceNum+=3; indices[nFaceNum+0]=22;indices[nFaceNum+1]=21;indices[nFaceNum+2]=20; this._vertexBuffer=new VertexBuffer3D(vertexDeclaration,this._numberVertices,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4,true); this._indexBuffer=new IndexBuffer3D(/*laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort",this._numberIndices,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4,true); this._vertexBuffer.setData(vertices); this._indexBuffer.setData(indices); this.memorySize=(this._vertexBuffer.byteLength+this._indexBuffer.byteLength)*2; this.completeCreate(); } /** *设置长度(改变此属性会重新生成顶点和索引) *@param value 长度 */ /** *返回长度 *@return 长 */ __getset(0,__proto,'long',function(){ return this._long; },function(value){ this._long=value; this.recreateResource(); }); /** *设置宽度(改变此属性会重新生成顶点和索引) *@param value 宽度 */ /** *返回宽度 *@return 宽 */ __getset(0,__proto,'width',function(){ return this._width; },function(value){ this._width=value; this.recreateResource(); }); /** *设置高度(改变此属性会重新生成顶点和索引) *@param value 高度 */ /** *返回高度 *@return 高 */ __getset(0,__proto,'height',function(){ return this._height; },function(value){ this._height=value; this.recreateResource(); }); return BoxMesh; })(PrimitiveMesh) /** *MeshCylinder 类用于创建圆柱。 */ //class laya.d3.resource.models.CylinderMesh extends laya.d3.resource.models.PrimitiveMesh var CylinderMesh=(function(_super){ function CylinderMesh(radius,height,stacks,slices){ this._radius=NaN; this._height=NaN; this._slices=0; this._stacks=0; (radius===void 0)&& (radius=10); (height===void 0)&& (height=10); (stacks===void 0)&& (stacks=8); (slices===void 0)&& (slices=8); CylinderMesh.__super.call(this); this._radius=radius; this._height=height; this._stacks=stacks; this._slices=slices; this.recreateResource(); this._loaded=true; var pos=this.positions; this._boundingBox=new BoundBox(new Vector3(),new Vector3()); BoundBox.createfromPoints(pos,this._boundingBox); this._boundingSphere=new BoundSphere(new Vector3(),0); BoundSphere.createfromPoints(pos,this._boundingSphere); } __class(CylinderMesh,'laya.d3.resource.models.CylinderMesh',_super); var __proto=CylinderMesh.prototype; __proto.recreateResource=function(){ this.startCreate(); this._numberVertices=(this._stacks+1+2)*(this._slices+1); this._numberIndices=(this._slices-1+this._stacks*this._slices)*2*3; var indices=new Uint16Array(this._numberIndices); var vertexDeclaration=VertexPositionNormalTexture.vertexDeclaration; var vertexFloatStride=vertexDeclaration.vertexStride / 4; var vertices=new Float32Array(this._numberVertices *vertexFloatStride); var sliceAngle=(Math.PI *2.0)/ this._slices; var cAng=0; var buttomUVCenterX=0.5; var buttomUVCenterY=0.5; var buttomUVR=0.5; var capUVCenterX=0.5; var capUVCenterY=0.5; var wallUVLeft=0; var wallUVTop=0; var wallUVRight=1; var wallUVBottom=1; var indexCount=0; var vertexIndex=0; var vertexCount=0; var cv=0; for (var slice=0;slice < (this._slices+1);slice++){ var x=Math.cos(cAng); var y=Math.sin(cAng); cAng+=sliceAngle; vertices[cv++]=this._radius *x;vertices[cv++]=this._radius *y;vertices[cv++]=0; vertices[cv++]=0;vertices[cv++]=0;vertices[cv++]=-1; vertices[cv++]=buttomUVR *x+buttomUVCenterX;vertices[cv++]=buttomUVR *y+buttomUVCenterY; } for (slice=2;slice < (this._slices+1);slice++){ indices[indexCount++]=0; indices[indexCount++]=slice-1; indices[indexCount++]=slice; } vertexCount+=(this._slices+1); var hdist=this._height / this._stacks; var cz=0; for (var h=0;h < this._stacks+1;h++){ for (slice=0;slice < (this._slices+1);slice++){ var tx=vertices[ slice*vertexFloatStride]; var ty=vertices[ slice*vertexFloatStride+1]; vertices[cv++]=tx;vertices[cv++]=ty;vertices[cv++]=cz; vertices[cv++]=tx;vertices[cv++]=ty;vertices[cv++]=0; vertices[cv++]=wallUVLeft+slice *(wallUVRight-wallUVLeft)/ this._slices; vertices[cv++]=wallUVBottom+h *(wallUVTop-wallUVBottom)/ this._stacks; if (h > 0 && slice > 0){ var v1=vertexCount-1; var v2=vertexCount; var v3=vertexCount-(this._slices+1); var v4=vertexCount-(this._slices+1)-1; indices[indexCount++]=v4;indices[indexCount++]=v1;indices[indexCount++]=v2; indices[indexCount++]=v4;indices[indexCount++]=v2;indices[indexCount++]=v3; } vertexCount++; } cz+=hdist; } for (slice=0;slice < (this._slices+1);slice++){ tx=vertices[ slice*vertexFloatStride]; ty=vertices[ slice*vertexFloatStride+1]; vertices[cv++]=tx;vertices[cv++]=ty;vertices[cv++]=this._height; vertices[cv++]=0;vertices[cv++]=0;vertices[cv++]=1; vertices[cv++]=buttomUVR*tx/this._radius+capUVCenterX;vertices[cv++]=buttomUVR*ty/this._radius+capUVCenterY; } for (slice=2;slice < (this._slices+1);slice++){ indices[indexCount++]=vertexCount; indices[indexCount++]=vertexCount+slice; indices[indexCount++]=vertexCount+slice-1; } vertexCount+=(this._slices+1); this._vertexBuffer=new VertexBuffer3D(vertexDeclaration,this._numberVertices,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4,true); this._indexBuffer=new IndexBuffer3D(/*laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort",this._numberIndices,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4,true); this._vertexBuffer.setData(vertices); this._indexBuffer.setData(indices); this.memorySize=(this._vertexBuffer.byteLength+this._indexBuffer.byteLength)*2; this.completeCreate(); } /** *设置半径(改变此属性会重新生成顶点和索引) *@param value 半径 */ /** *返回半径 *@return 半径 */ __getset(0,__proto,'radius',function(){ return this._radius; },function(value){ this._radius=value; this.recreateResource(); }); /** *设置宽度分段(改变此属性会重新生成顶点和索引) *@param value 宽度分段 */ /** *获取宽度分段 *@return 宽度分段 */ __getset(0,__proto,'slices',function(){ return this._slices; },function(value){ this._slices=value; this.recreateResource(); }); /** *设置高度分段(改变此属性会重新生成顶点和索引) *@param value高度分段 */ /** *获取高度分段 *@return 高度分段 */ __getset(0,__proto,'stacks',function(){ return this._stacks; },function(value){ this._stacks=value; this.recreateResource(); }); return CylinderMesh; })(PrimitiveMesh) /** *Sphere 类用于创建球体。 */ //class laya.d3.resource.models.SphereMesh extends laya.d3.resource.models.PrimitiveMesh var SphereMesh=(function(_super){ function SphereMesh(radius,stacks,slices){ this._radius=NaN; this._slices=0; this._stacks=0; (radius===void 0)&& (radius=10); (stacks===void 0)&& (stacks=8); (slices===void 0)&& (slices=8); SphereMesh.__super.call(this); this._radius=radius; this._stacks=stacks; this._slices=slices; this.recreateResource(); this._loaded=true; var pos=this.positions; this._boundingBox=new BoundBox(new Vector3(),new Vector3()); BoundBox.createfromPoints(pos,this._boundingBox); this._boundingSphere=new BoundSphere(new Vector3(),0); BoundSphere.createfromPoints(pos,this._boundingSphere); } __class(SphereMesh,'laya.d3.resource.models.SphereMesh',_super); var __proto=SphereMesh.prototype; __proto.recreateResource=function(){ this.startCreate(); this._numberVertices=(this._stacks+1)*(this._slices+1); this._numberIndices=(3 *this._stacks *(this._slices+1))*2; var indices=new Uint16Array(this._numberIndices); var vertexDeclaration=VertexPositionNormalTexture.vertexDeclaration; var vertexFloatStride=vertexDeclaration.vertexStride / 4; var vertices=new Float32Array(this._numberVertices *vertexFloatStride); var stackAngle=Math.PI / this._stacks; var sliceAngle=(Math.PI *2.0)/ this._slices; var vertexIndex=0; var vertexCount=0; var indexCount=0; for (var stack=0;stack < (this._stacks+1);stack++){ var r=Math.sin(stack *stackAngle); var y=Math.cos(stack *stackAngle); for (var slice=0;slice < (this._slices+1);slice++){ var x=r *Math.sin(slice *sliceAngle); var z=r *Math.cos(slice *sliceAngle); vertices[vertexCount+0]=x *this._radius; vertices[vertexCount+1]=y *this._radius; vertices[vertexCount+2]=z *this._radius; vertices[vertexCount+3]=x; vertices[vertexCount+4]=y; vertices[vertexCount+5]=z; vertices[vertexCount+6]=slice / this._slices; vertices[vertexCount+7]=stack / this._stacks; vertexCount+=vertexFloatStride; if (stack !=(this._stacks-1)){ indices[indexCount++]=vertexIndex+(this._slices+1); indices[indexCount++]=vertexIndex; indices[indexCount++]=vertexIndex+1; indices[indexCount++]=vertexIndex+(this._slices); indices[indexCount++]=vertexIndex; indices[indexCount++]=vertexIndex+(this._slices+1); vertexIndex++; } } } this._vertexBuffer=new VertexBuffer3D(vertexDeclaration,this._numberVertices,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4,true); this._indexBuffer=new IndexBuffer3D(/*laya.d3.graphics.IndexBuffer3D.INDEXTYPE_USHORT*/"ushort",this._numberIndices,/*laya.webgl.WebGLContext.STATIC_DRAW*/0x88E4,true); this._vertexBuffer.setData(vertices); this._indexBuffer.setData(indices); this.memorySize=(this._vertexBuffer.byteLength+this._indexBuffer.byteLength)*2; this.completeCreate(); } /** *设置半径(改变此属性会重新生成顶点和索引) *@param value 半径 */ /** *返回半径 *@return 半径 */ __getset(0,__proto,'radius',function(){ return this._radius; },function(value){ this._radius=value; this.recreateResource(); }); /** *设置宽度分段(改变此属性会重新生成顶点和索引) *@param value 宽度分段 */ /** *获取宽度分段 *@return 宽度分段 */ __getset(0,__proto,'slices',function(){ return this._slices; },function(value){ this._slices=value; this.recreateResource(); }); /** *设置高度分段(改变此属性会重新生成顶点和索引) *@param value高度分段 */ /** *获取高度分段 *@return 高度分段 */ __getset(0,__proto,'stacks',function(){ return this._stacks; },function(value){ this._stacks=value; this.recreateResource(); }); return SphereMesh; })(PrimitiveMesh) })(window,document,Laya);