@galacean/effects-plugin-model 2.0.0-alpha.2 → 2.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/loader.mjs CHANGED
@@ -3,10 +3,10 @@
3
3
  * Description: Galacean Effects player model plugin
4
4
  * Author: Ant Group CO., Ltd.
5
5
  * Contributors: 飂兮
6
- * Version: v2.0.0-alpha.2
6
+ * Version: v2.0.0-alpha.4
7
7
  */
8
8
 
9
- import { math, Transform, spec, PLAYER_OPTIONS_ENV_EDITOR, glContext, TextureSourceType, loadImage, Texture, RenderPassAttachmentStorageType, Material, Mesh, Geometry, DestroyOptions, addItem, removeItem, VFXItem, effectsClass, ItemBehaviour, AbstractPlugin, registerPlugin, logger, RendererComponent, TimelineComponent, HitTestType, Renderer, RenderPass, TextureLoadAction, RenderPassDestroyAttachmentType, getDefaultTextureFactory, Player } from '@galacean/effects';
9
+ import { math, Transform, spec, PLAYER_OPTIONS_ENV_EDITOR, glContext, Material, TextureSourceType, loadImage, Texture, RenderPassAttachmentStorageType, Mesh, Geometry, Shader, GLSLVersion, DestroyOptions, addItem, removeItem, VFXItem, effectsClass, DataType, ItemBehaviour, AbstractPlugin, registerPlugin, logger, RendererComponent, TimelineComponent, HitTestType, Renderer, RenderPass, TextureLoadAction, RenderPassDestroyAttachmentType, getDefaultTextureFactory, Player } from '@galacean/effects';
10
10
 
11
11
  var Vector2 = math.Vector2, Vector3 = math.Vector3, Vector4 = math.Vector4, Matrix3 = math.Matrix3, Matrix4 = math.Matrix4, Euler = math.Euler, EulerOrder = math.EulerOrder, Quaternion = math.Quaternion, Box3 = math.Box3; math.Sphere; math.Ray; var DEG2RAD = math.DEG2RAD;
12
12
 
@@ -914,7 +914,7 @@ var PEntity = /** @class */ (function (_super) {
914
914
 
915
915
  var primitiveVert = "precision highp float;\n#define FEATURES\n#include <webglCompatibility.glsl>\n#include <animation.vert.glsl>\nvsIn vec4 a_Position;vsOut vec3 v_Position;\n#ifdef HAS_NORMALS\nvsIn vec4 a_Normal;\n#endif\n#ifdef HAS_TANGENTS\nvsIn vec4 a_Tangent;\n#endif\n#ifdef HAS_NORMALS\n#ifdef HAS_TANGENTS\nvsOut mat3 v_TBN;\n#else\nvsOut vec3 v_Normal;\n#endif\n#endif\n#ifdef HAS_UV_SET1\nvsIn vec2 a_UV1;\n#endif\n#ifdef HAS_UV_SET2\nvsIn vec2 a_UV2;\n#endif\nvsOut vec2 v_UVCoord1;\n#ifdef HAS_UV_SET2\nvsOut vec2 v_UVCoord2;\n#endif\n#ifdef HAS_VERTEX_COLOR_VEC3\nvsIn vec3 a_Color;vsOut vec3 v_Color;\n#endif\n#ifdef HAS_VERTEX_COLOR_VEC4\nvsIn vec4 a_Color;vsOut vec4 v_Color;\n#endif\nuniform mat4 u_ViewProjectionMatrix;uniform mat4 u_ModelMatrix;uniform mat4 u_NormalMatrix;\n#ifdef EDITOR_TRANSFORM\nuniform vec4 uEditorTransform;\n#endif\n#ifdef USE_SHADOW_MAPPING\nuniform mat4 u_LightViewProjectionMatrix;uniform float u_DeltaSceneSize;vsOut vec4 v_PositionLightSpace;vsOut vec4 v_dPositionLightSpace;\n#endif\nvec4 getPosition(){vec4 pos=vec4(a_Position.xyz,1.0);\n#ifdef USE_MORPHING\npos+=getTargetPosition();\n#endif\n#ifdef USE_SKINNING\npos=getSkinningMatrix()*pos;\n#endif\nreturn pos;}\n#ifdef HAS_NORMALS\nvec4 getNormal(){vec4 normal=a_Normal;\n#ifdef USE_MORPHING\nnormal+=getTargetNormal();\n#endif\n#ifdef USE_SKINNING\nnormal=getSkinningNormalMatrix()*normal;\n#endif\nreturn normalize(normal);}\n#endif\n#ifdef HAS_TANGENTS\nvec4 getTangent(){vec4 tangent=a_Tangent;\n#ifdef USE_MORPHING\ntangent+=getTargetTangent();\n#endif\n#ifdef USE_SKINNING\ntangent=getSkinningMatrix()*tangent;\n#endif\nreturn normalize(tangent);}\n#endif\nvoid main(){vec4 pos=u_ModelMatrix*getPosition();v_Position=vec3(pos.xyz)/pos.w;\n#ifdef HAS_NORMALS\n#ifdef HAS_TANGENTS\nvec4 tangent=getTangent();vec3 normalW=normalize(vec3(u_NormalMatrix*vec4(getNormal().xyz,0.0)));vec3 tangentW=normalize(vec3(u_ModelMatrix*vec4(tangent.xyz,0.0)));vec3 bitangentW=cross(normalW,tangentW)*tangent.w;v_TBN=mat3(tangentW,bitangentW,normalW);\n#else\nv_Normal=normalize(vec3(u_NormalMatrix*vec4(getNormal().xyz,0.0)));\n#endif\n#endif\nv_UVCoord1=vec2(0.0,0.0);\n#ifdef HAS_UV_SET1\nv_UVCoord1=a_UV1;\n#endif\n#ifdef HAS_UV_SET2\nv_UVCoord2=a_UV2;\n#endif\n#if defined(HAS_VERTEX_COLOR_VEC3) || defined(HAS_VERTEX_COLOR_VEC4)\nv_Color=a_Color;\n#endif\n#ifdef USE_SHADOW_MAPPING\nv_PositionLightSpace=u_LightViewProjectionMatrix*pos;vec3 dpos=vec3(u_DeltaSceneSize);v_dPositionLightSpace=u_LightViewProjectionMatrix*(pos+vec4(dpos,0));\n#endif\ngl_Position=u_ViewProjectionMatrix*pos;\n#ifdef EDITOR_TRANSFORM\ngl_Position=vec4(gl_Position.xy*uEditorTransform.xy+uEditorTransform.zw*gl_Position.w,gl_Position.zw);\n#endif\n}";
916
916
 
917
- var metallicRoughnessFrag = "\n#define FEATURES\n#ifndef WEBGL2\n#extension GL_OES_standard_derivatives : enable\n#endif\n#if !defined(WEBGL2) && defined(USE_TEX_LOD)\n#extension GL_EXT_shader_texture_lod : enable\n#endif\n#ifdef USE_HDR\n#extension GL_OES_texture_float : enable\n#extension GL_OES_texture_float_linear : enable\n#endif\n#if !defined(WEBGL2) && defined(USE_WBOIT)\n#extension GL_EXT_draw_buffers: require\n#endif\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n#ifdef WEBGL2\n#ifdef USE_WBOIT\nlayout(location=0)out vec4 outFragColor0;layout(location=1)out vec4 outFragColor1;\n#else\nout vec4 outFragColor;\n#endif\n#else\n#ifdef USE_WBOIT\n#define outFragColor0 gl_FragData[0]\n#define outFragColor1 gl_FragData[1]\n#else\n#define outFragColor gl_FragColor\n#endif\n#endif\n#include <webglCompatibility.glsl>\n#include <extensions.frag.glsl>\n#include <tonemapping.frag.glsl>\n#include <textures.vert.glsl>\n#include <functions.frag.glsl>\n#include <shadowCommon.vert.glsl>\n#include <shadow.frag.glsl>\nstruct Light{vec3 direction;float range;vec3 color;float intensity;vec3 position;float innerConeCos;float outerConeCos;int type;vec2 padding;};const int LightType_Directional=0;const int LightType_Point=1;const int LightType_Spot=2;const int LightType_Ambient=3;\n#ifdef USE_PUNCTUAL\nuniform Light u_Lights[LIGHT_COUNT];\n#endif\n#if defined(MATERIAL_SPECULARGLOSSINESS) || defined(MATERIAL_METALLICROUGHNESS)\nuniform float u_MetallicFactor;uniform float u_RoughnessFactor;uniform vec4 u_BaseColorFactor;\n#endif\n#ifdef MATERIAL_SPECULARGLOSSINESS\nuniform vec3 u_SpecularFactor;uniform vec4 u_DiffuseFactor;uniform float u_GlossinessFactor;\n#endif\n#ifdef ALPHAMODE_MASK\nuniform float u_AlphaCutoff;\n#endif\n#ifdef ADD_FOG\nuniform vec4 u_FogColor;\n#ifdef LINEAR_FOG\nuniform float u_FogNear;uniform float u_FogFar;\n#endif\n#ifdef EXP_FOG\nuniform float u_FogDensity;\n#endif\n#endif\n#ifdef PREVIEW_BORDER\nuniform vec4 uPreviewColor;\n#endif\nuniform vec3 u_Camera;uniform int u_MipCount;struct MaterialInfo{float perceptualRoughness;vec3 reflectance0;float alphaRoughness;vec3 diffuseColor;vec3 reflectance90;vec3 specularColor;};\n#ifdef ADD_FOG\nvec3 getMixFogColor(vec3 baseColor){vec3 distance=u_Camera-v_Position;float fogAmount=0.0;\n#ifdef LINEAR_FOG\nfogAmount=smoothstep(u_FogNear,u_FogFar,distance[2]);\n#endif\n#ifdef EXP_FOG\n#define LOG2 1.442695\nfogAmount=1.-exp2(-u_FogDensity*u_FogDensity*distance[2]*distance[2]*LOG2);fogAmount=clamp(fogAmount,0.,1.);\n#endif\nvec3 mixColor=baseColor.rgb+(vec3(u_FogColor)-baseColor.rgb)*fogAmount;return mixColor;}\n#endif\n#ifdef IRRADIANCE_COEFFICIENTS\nvec3 getIrradiance(vec3 norm,SHCoefficients c){float x=norm.x;float y=norm.y;float z=norm.z;float c1=0.429043;float c2=0.511664;float c3=0.743125;float c4=0.886227;float c5=0.247708;vec3 irradiance=c1*c.l22*(x*x-y*y)+c3*c.l20*(z*z)+c4*c.l00-c5*c.l20+2.0*c1*(c.l2m2*x*y+c.l21*x*z+c.l2m1*y*z)+2.0*c2*(c.l11*x+c.l1m1*y+c.l10*z);return irradiance;}\n#endif\n#ifdef USE_IBL\nvec3 getIBLContribution(MaterialInfo materialInfo,vec3 n,vec3 v){float NdotV=clamp(dot(n,v),0.0,1.0);float lod=clamp(materialInfo.perceptualRoughness*float(u_MipCount),0.0,float(u_MipCount));vec3 reflection=normalize(reflect(-v,n));vec2 brdfSamplePoint=clamp(vec2(NdotV,materialInfo.perceptualRoughness),vec2(0.0,0.0),vec2(1.0,1.0));vec2 brdf=texture2D(u_brdfLUT,brdfSamplePoint).rg;vec4 diffuseColor=vec4(1.0,0.0,0.0,1.0);\n#ifdef IRRADIANCE_COEFFICIENTS\nvec3 irradiance=getIrradiance(n,u_shCoefficients);diffuseColor=vec4(irradiance,1.0);\n#else\ndiffuseColor=textureCube(u_DiffuseEnvSampler,n);\n#endif\n#ifdef USE_TEX_LOD\nvec4 specularSample=_textureCubeLodEXT(u_SpecularEnvSampler,reflection,lod);\n#else\nvec4 specularSample=textureCube(u_SpecularEnvSampler,reflection,lod);\n#endif\n#ifdef USE_HDR\nvec3 diffuseLight=diffuseColor.rgb;vec3 specularLight=specularSample.rgb;\n#else\nvec3 diffuseLight=SRGBtoLINEAR(diffuseColor).rgb;vec3 specularLight=SRGBtoLINEAR(specularSample).rgb;\n#endif\nvec3 diffuse=diffuseLight*materialInfo.diffuseColor;vec3 specular=specularLight*(materialInfo.specularColor*brdf.x+brdf.y);return diffuse*u_IblIntensity[0]+specular*u_IblIntensity[1];}\n#endif\nvec3 diffuse(MaterialInfo materialInfo){return materialInfo.diffuseColor/M_PI;}vec3 specularReflection(MaterialInfo materialInfo,AngularInfo angularInfo){return materialInfo.reflectance0+(materialInfo.reflectance90-materialInfo.reflectance0)*pow(clamp(1.0-angularInfo.VdotH,0.0,1.0),5.0);}float visibilityOcclusion(MaterialInfo materialInfo,AngularInfo angularInfo){float NdotL=angularInfo.NdotL;float NdotV=angularInfo.NdotV;float alphaRoughnessSq=materialInfo.alphaRoughness*materialInfo.alphaRoughness;float GGXV=NdotL*sqrt(NdotV*NdotV*(1.0-alphaRoughnessSq)+alphaRoughnessSq);float GGXL=NdotV*sqrt(NdotL*NdotL*(1.0-alphaRoughnessSq)+alphaRoughnessSq);float GGX=GGXV+GGXL;if(GGX>0.0){return 0.5/GGX;}return 0.0;}float microfacetDistribution(MaterialInfo materialInfo,AngularInfo angularInfo){float alphaRoughnessSq=materialInfo.alphaRoughness*materialInfo.alphaRoughness;float f=(angularInfo.NdotH*alphaRoughnessSq-angularInfo.NdotH)*angularInfo.NdotH+1.0;return alphaRoughnessSq/(M_PI*f*f);}vec3 getPointShade(vec3 pointToLight,MaterialInfo materialInfo,vec3 normal,vec3 view){AngularInfo angularInfo=getAngularInfo(pointToLight,normal,view);if(angularInfo.NdotL>0.0||angularInfo.NdotV>0.0){vec3 F=specularReflection(materialInfo,angularInfo);float Vis=visibilityOcclusion(materialInfo,angularInfo);float D=microfacetDistribution(materialInfo,angularInfo);vec3 diffuseContrib=(1.0-F)*diffuse(materialInfo);vec3 specContrib=F*Vis*D;return angularInfo.NdotL*(diffuseContrib+specContrib);}return vec3(0.0,0.0,0.0);}float getRangeAttenuation(float range,float distance){if(range<=0.0){return 1.0;}return 1.0/(pow(5.0*distance/range,2.0)+1.0);}float getSpotAttenuation(vec3 pointToLight,vec3 spotDirection,float outerConeCos,float innerConeCos){float actualCos=dot(normalize(spotDirection),normalize(-pointToLight));if(actualCos>outerConeCos){if(actualCos<innerConeCos){return smoothstep(outerConeCos,innerConeCos,actualCos);}return 1.0;}return 0.0;}vec3 applyDirectionalLight(Light light,MaterialInfo materialInfo,vec3 normal,vec3 view,float shadow){vec3 pointToLight=-light.direction;vec3 shade=getPointShade(pointToLight,materialInfo,normal,view)*shadow;return light.intensity*light.color*shade;}vec3 applyPointLight(Light light,MaterialInfo materialInfo,vec3 normal,vec3 view){vec3 pointToLight=light.position-v_Position;float distance=length(pointToLight);float attenuation=getRangeAttenuation(light.range,distance);vec3 shade=getPointShade(pointToLight,materialInfo,normal,view);return light.color*shade*attenuation*light.intensity;}vec3 applySpotLight(Light light,MaterialInfo materialInfo,vec3 normal,vec3 view,float shadow){vec3 pointToLight=light.position-v_Position;float distance=length(pointToLight);float rangeAttenuation=getRangeAttenuation(light.range,distance);float spotAttenuation=getSpotAttenuation(pointToLight,light.direction,light.outerConeCos,light.innerConeCos);vec3 shade=getPointShade(pointToLight,materialInfo,normal,view)*shadow;return rangeAttenuation*spotAttenuation*light.intensity*light.color*shade;}vec3 applyAmbientLight(Light light,MaterialInfo materialInfo){return light.intensity*light.color*diffuse(materialInfo);}float weight(float z,float a){return clamp(pow(min(1.0,a*10.0)+0.01,3.0)*1e8*pow(1.0-z*0.9,3.0),1e-2,3e3);}void writeFragmentColor(vec4 fragColor){\n#if !defined(ALPHAMODE_OPAQUE) && defined(USE_WBOIT)\nfloat w=weight(gl_FragCoord.z,fragColor.a);fragColor.rgb*=fragColor.a;outFragColor0=vec4(fragColor.rgb*w,fragColor.a);outFragColor1=vec4(fragColor.a*w);\n#else\noutFragColor=fragColor;\n#endif\n}void main(){float perceptualRoughness=0.0;float metallic=0.0;vec4 baseColor=vec4(0.0,0.0,0.0,1.0);vec3 diffuseColor=vec3(0.0);vec3 specularColor=vec3(0.0);vec3 f0=vec3(0.04);\n#ifdef PREVIEW_BORDER\nwriteFragmentColor(uPreviewColor);return;\n#endif\n#ifdef MATERIAL_SPECULARGLOSSINESS\n#ifdef HAS_SPECULAR_GLOSSINESS_MAP\nvec4 sgSample=SRGBtoLINEAR(texture2D(u_SpecularGlossinessSampler,getSpecularGlossinessUV()));perceptualRoughness=(1.0-sgSample.a*u_GlossinessFactor);f0=sgSample.rgb*u_SpecularFactor;\n#else\nf0=u_SpecularFactor;perceptualRoughness=1.0-u_GlossinessFactor;\n#endif\n#ifdef HAS_DIFFUSE_MAP\nbaseColor=SRGBtoLINEAR(texture2D(u_DiffuseSampler,getDiffuseUV()))*u_DiffuseFactor;\n#else\nbaseColor=SRGBtoLINEAR(u_DiffuseFactor);\n#endif\nbaseColor*=getVertexColor();specularColor=f0;float oneMinusSpecularStrength=1.0-max(max(f0.r,f0.g),f0.b);diffuseColor=baseColor.rgb*oneMinusSpecularStrength;\n#ifdef DEBUG_METALLIC\nmetallic=solveMetallic(baseColor.rgb,specularColor,oneMinusSpecularStrength);\n#endif\n#endif\n#ifdef MATERIAL_METALLICROUGHNESS\n#ifdef HAS_METALLIC_ROUGHNESS_MAP\nvec4 mrSample=texture2D(u_MetallicRoughnessSampler,getMetallicRoughnessUV());perceptualRoughness=mrSample.g*u_RoughnessFactor;metallic=mrSample.b*u_MetallicFactor;\n#else\nmetallic=u_MetallicFactor;perceptualRoughness=u_RoughnessFactor;\n#endif\n#ifdef HAS_BASE_COLOR_MAP\nbaseColor=SRGBtoLINEAR(texture2D(u_BaseColorSampler,getBaseColorUV()))*u_BaseColorFactor;\n#else\nbaseColor=SRGBtoLINEAR(u_BaseColorFactor);\n#endif\nbaseColor*=getVertexColor();diffuseColor=baseColor.rgb*(vec3(1.0)-f0)*(1.0-metallic);specularColor=mix(f0,baseColor.rgb,metallic);\n#endif\n#ifdef ALPHAMODE_MASK\nif(baseColor.a<u_AlphaCutoff){discard;}baseColor.a=1.0;\n#endif\n#ifdef ALPHAMODE_OPAQUE\nbaseColor.a=1.0;\n#endif\n#ifdef MATERIAL_UNLIT\n#ifndef DEBUG_OUTPUT\n#ifdef ADD_FOG\nvec3 mixColor=getMixFogColor(baseColor.rgb);vec4 fragColorUnlit=vec4(LINEARtoSRGB(mixColor)*baseColor.a,baseColor.a);\n#else\nvec4 fragColorUnlit=vec4(LINEARtoSRGB(baseColor.rgb)*baseColor.a,baseColor.a);\n#endif\nwriteFragmentColor(fragColorUnlit);\n#else\n#ifdef DEBUG_UV\noutFragColor.rgb=vec3(getDebugUVColor(getBaseColorUV(),getNormal()));\n#endif\n#ifdef DEBUG_METALLIC\noutFragColor.rgb=vec3(metallic);\n#endif\n#ifdef DEBUG_ROUGHNESS\noutFragColor.rgb=vec3(perceptualRoughness);\n#endif\n#ifdef DEBUG_NORMAL\noutFragColor.rgb=getNormal()*0.5+0.5;\n#endif\n#ifdef DEBUG_BASECOLOR\noutFragColor.rgb=LINEARtoSRGB(baseColor.rgb);\n#endif\n#ifdef DEBUG_OCCLUSION\noutFragColor.rgb=vec3(1.0);\n#endif\n#ifdef DEBUG_EMISSIVE\noutFragColor.rgb=vec3(0.0);\n#endif\n#ifdef DEBUG_ALPHA\noutFragColor.rgb=vec3(baseColor.a);\n#endif\noutFragColor.a=1.0;\n#endif\nreturn;\n#endif\nmetallic=clamp(metallic,0.0,1.0);float alphaRoughness=perceptualRoughness*perceptualRoughness;vec3 normal=getNormal();\n#ifdef USE_SPECULAR_AA\nfloat AARoughnessFactor=getAARoughnessFactor(normal);perceptualRoughness+=AARoughnessFactor;alphaRoughness+=AARoughnessFactor;\n#endif\nperceptualRoughness=clamp(perceptualRoughness,0.04,1.0);alphaRoughness=clamp(alphaRoughness,0.04,1.0);float reflectance=max(max(specularColor.r,specularColor.g),specularColor.b);vec3 specularEnvironmentR0=specularColor.rgb;vec3 specularEnvironmentR90=vec3(clamp(reflectance*50.0,0.0,1.0));MaterialInfo materialInfo=MaterialInfo(perceptualRoughness,specularEnvironmentR0,alphaRoughness,diffuseColor,specularEnvironmentR90,specularColor);vec3 color=vec3(0.0,0.0,0.0);vec3 view=normalize(u_Camera-v_Position);float shadow=1.0;\n#ifdef USE_SHADOW_MAPPING\nshadow=getShadowContribution();\n#endif\n#ifdef USE_PUNCTUAL\nfor(int i=0;i<LIGHT_COUNT;++i){Light light=u_Lights[i];if(light.type==LightType_Directional){color+=applyDirectionalLight(light,materialInfo,normal,view,shadow);}else if(light.type==LightType_Point){color+=applyPointLight(light,materialInfo,normal,view);}else if(light.type==LightType_Spot){color+=applySpotLight(light,materialInfo,normal,view,shadow);}else if(light.type==LightType_Ambient){color+=applyAmbientLight(light,materialInfo);}}\n#endif\n#ifdef USE_IBL\ncolor+=getIBLContribution(materialInfo,normal,view);\n#endif\nfloat ao=1.0;\n#ifdef HAS_OCCLUSION_MAP\nao=texture2D(u_OcclusionSampler,getOcclusionUV()).r;color=mix(color,color*ao,u_OcclusionStrength);\n#endif\nvec3 emissive=vec3(0);\n#ifndef DEBUG_OUTPUT\n#ifdef ADD_FOG\nvec4 toneMapColor=SRGBtoLINEAR(vec4(toneMap(color),baseColor.a));color=getMixFogColor(toneMapColor.rgb);vec4 fragColorOut=vec4(LINEARtoSRGB(color.rgb)*baseColor.a,baseColor.a);\n#else\ncolor=toneMap(color)*baseColor.a;\n#ifdef HAS_EMISSIVE\ncolor+=u_EmissiveFactor;\n#endif\n#ifdef HAS_EMISSIVE_MAP\nemissive=SRGBtoLINEAR(texture2D(u_EmissiveSampler,getEmissiveUV())).rgb*u_EmissiveFactor;color+=emissive;\n#endif\nvec4 fragColorOut=vec4(color,baseColor.a);\n#endif\nwriteFragmentColor(fragColorOut);\n#else\n#ifdef DEBUG_UV\noutFragColor.rgb=vec3(getDebugUVColor(getBaseColorUV(),normal));\n#endif\n#ifdef DEBUG_METALLIC\noutFragColor.rgb=vec3(metallic);\n#endif\n#ifdef DEBUG_ROUGHNESS\noutFragColor.rgb=vec3(perceptualRoughness);\n#endif\n#ifdef DEBUG_NORMAL\noutFragColor.rgb=normal*0.5+0.5;\n#endif\n#ifdef DEBUG_BASECOLOR\noutFragColor.rgb=LINEARtoSRGB(baseColor.rgb);\n#endif\n#ifdef DEBUG_OCCLUSION\n#ifdef HAS_OCCLUSION_MAP\noutFragColor.rgb=vec3(mix(1.0,ao,u_OcclusionStrength));\n#else\noutFragColor.rgb=vec3(1.0);\n#endif\n#endif\n#ifdef DEBUG_EMISSIVE\n#ifdef HAS_EMISSIVE\nemissive=u_EmissiveFactor;\n#endif\n#ifdef HAS_EMISSIVE_MAP\nemissive=SRGBtoLINEAR(texture2D(u_EmissiveSampler,getEmissiveUV())).rgb*u_EmissiveFactor;\n#endif\noutFragColor.rgb=LINEARtoSRGB(emissive);\n#endif\n#ifdef DEBUG_F0\noutFragColor.rgb=vec3(f0);\n#endif\n#ifdef DEBUG_ALPHA\noutFragColor.rgb=vec3(baseColor.a);\n#endif\noutFragColor.a=1.0;\n#endif\n}";
917
+ var metallicRoughnessFrag = "\n#define FEATURES\n#ifndef WEBGL2\n#extension GL_OES_standard_derivatives : enable\n#endif\n#if !defined(WEBGL2) && defined(USE_TEX_LOD)\n#extension GL_EXT_shader_texture_lod : enable\n#endif\n#ifdef USE_HDR\n#extension GL_OES_texture_float : enable\n#extension GL_OES_texture_float_linear : enable\n#endif\n#if !defined(WEBGL2) && defined(USE_WBOIT)\n#extension GL_EXT_draw_buffers: require\n#endif\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n#ifdef WEBGL2\n#ifdef USE_WBOIT\nlayout(location=0)out vec4 outFragColor0;layout(location=1)out vec4 outFragColor1;\n#else\nout vec4 outFragColor;\n#endif\n#else\n#ifdef USE_WBOIT\n#define outFragColor0 gl_FragData[0]\n#define outFragColor1 gl_FragData[1]\n#else\n#define outFragColor gl_FragColor\n#endif\n#endif\n#include <webglCompatibility.glsl>\n#include <extensions.frag.glsl>\n#include <tonemapping.frag.glsl>\n#include <textures.vert.glsl>\n#include <functions.frag.glsl>\n#include <shadowCommon.vert.glsl>\n#include <shadow.frag.glsl>\nstruct Light{vec3 direction;float range;vec3 color;float intensity;vec3 position;float innerConeCos;float outerConeCos;int type;vec2 padding;};const int LightType_Directional=0;const int LightType_Point=1;const int LightType_Spot=2;const int LightType_Ambient=3;\n#ifdef USE_PUNCTUAL\nuniform Light u_Lights[LIGHT_COUNT];\n#endif\n#if defined(MATERIAL_SPECULARGLOSSINESS) || defined(MATERIAL_METALLICROUGHNESS)\nuniform float u_MetallicFactor;uniform float u_RoughnessFactor;uniform vec4 u_BaseColorFactor;\n#endif\n#ifdef MATERIAL_SPECULARGLOSSINESS\nuniform vec3 u_SpecularFactor;uniform vec4 u_DiffuseFactor;uniform float u_GlossinessFactor;\n#endif\n#ifdef ALPHAMODE_MASK\nuniform float u_AlphaCutoff;\n#endif\n#ifdef ADD_FOG\nuniform vec4 u_FogColor;\n#ifdef LINEAR_FOG\nuniform float u_FogNear;uniform float u_FogFar;\n#endif\n#ifdef EXP_FOG\nuniform float u_FogDensity;\n#endif\n#endif\n#ifdef PREVIEW_BORDER\nuniform vec4 uPreviewColor;\n#endif\nuniform vec3 u_Camera;uniform int u_MipCount;struct MaterialInfo{float perceptualRoughness;vec3 reflectance0;float alphaRoughness;vec3 diffuseColor;vec3 reflectance90;vec3 specularColor;};\n#ifdef ADD_FOG\nvec3 getMixFogColor(vec3 baseColor){vec3 distance=u_Camera-v_Position;float fogAmount=0.0;\n#ifdef LINEAR_FOG\nfogAmount=smoothstep(u_FogNear,u_FogFar,distance[2]);\n#endif\n#ifdef EXP_FOG\n#define LOG2 1.442695\nfogAmount=1.-exp2(-u_FogDensity*u_FogDensity*distance[2]*distance[2]*LOG2);fogAmount=clamp(fogAmount,0.,1.);\n#endif\nvec3 mixColor=baseColor.rgb+(vec3(u_FogColor)-baseColor.rgb)*fogAmount;return mixColor;}\n#endif\n#ifdef IRRADIANCE_COEFFICIENTS\nvec3 getIrradiance(vec3 norm,SHCoefficients c){float x=norm.x;float y=norm.y;float z=norm.z;float c1=0.429043;float c2=0.511664;float c3=0.743125;float c4=0.886227;float c5=0.247708;vec3 irradiance=c1*c.l22*(x*x-y*y)+c3*c.l20*(z*z)+c4*c.l00-c5*c.l20+2.0*c1*(c.l2m2*x*y+c.l21*x*z+c.l2m1*y*z)+2.0*c2*(c.l11*x+c.l1m1*y+c.l10*z);return irradiance;}\n#endif\n#ifdef USE_IBL\nvec3 getIBLContribution(MaterialInfo materialInfo,vec3 n,vec3 v){float NdotV=clamp(dot(n,v),0.0,1.0);float lod=clamp(materialInfo.perceptualRoughness*float(u_MipCount),0.0,float(u_MipCount));vec3 reflection=normalize(reflect(-v,n));vec2 brdfSamplePoint=clamp(vec2(NdotV,materialInfo.perceptualRoughness),vec2(0.0,0.0),vec2(1.0,1.0));vec2 brdf=texture2D(u_brdfLUT,brdfSamplePoint).rg;vec4 diffuseColor=vec4(1.0,0.0,0.0,1.0);\n#ifdef IRRADIANCE_COEFFICIENTS\nvec3 irradiance=getIrradiance(n,u_shCoefficients);diffuseColor=vec4(irradiance,1.0);\n#else\ndiffuseColor=textureCube(u_DiffuseEnvSampler,n);\n#endif\n#ifdef USE_TEX_LOD\nvec4 specularSample=_textureCubeLodEXT(u_SpecularEnvSampler,reflection,lod);\n#else\nvec4 specularSample=textureCube(u_SpecularEnvSampler,reflection,lod);\n#endif\n#ifdef USE_HDR\nvec3 diffuseLight=diffuseColor.rgb;vec3 specularLight=specularSample.rgb;\n#else\nvec3 diffuseLight=SRGBtoLINEAR(diffuseColor).rgb;vec3 specularLight=SRGBtoLINEAR(specularSample).rgb;\n#endif\nvec3 diffuse=diffuseLight*materialInfo.diffuseColor;vec3 specular=specularLight*(materialInfo.specularColor*brdf.x+brdf.y);return diffuse*u_IblIntensity[0]+specular*u_IblIntensity[1];}\n#endif\nvec3 diffuse(MaterialInfo materialInfo){return materialInfo.diffuseColor/M_PI;}vec3 specularReflection(MaterialInfo materialInfo,AngularInfo angularInfo){return materialInfo.reflectance0+(materialInfo.reflectance90-materialInfo.reflectance0)*pow(clamp(1.0-angularInfo.VdotH,0.0,1.0),5.0);}float visibilityOcclusion(MaterialInfo materialInfo,AngularInfo angularInfo){float NdotL=angularInfo.NdotL;float NdotV=angularInfo.NdotV;float alphaRoughnessSq=materialInfo.alphaRoughness*materialInfo.alphaRoughness;float GGXV=NdotL*sqrt(NdotV*NdotV*(1.0-alphaRoughnessSq)+alphaRoughnessSq);float GGXL=NdotV*sqrt(NdotL*NdotL*(1.0-alphaRoughnessSq)+alphaRoughnessSq);float GGX=GGXV+GGXL;if(GGX>0.0){return 0.5/GGX;}return 0.0;}float microfacetDistribution(MaterialInfo materialInfo,AngularInfo angularInfo){float alphaRoughnessSq=materialInfo.alphaRoughness*materialInfo.alphaRoughness;float f=(angularInfo.NdotH*alphaRoughnessSq-angularInfo.NdotH)*angularInfo.NdotH+1.0;return alphaRoughnessSq/(M_PI*f*f);}vec3 getPointShade(vec3 pointToLight,MaterialInfo materialInfo,vec3 normal,vec3 view){AngularInfo angularInfo=getAngularInfo(pointToLight,normal,view);if(angularInfo.NdotL>0.0||angularInfo.NdotV>0.0){vec3 F=specularReflection(materialInfo,angularInfo);float Vis=visibilityOcclusion(materialInfo,angularInfo);float D=microfacetDistribution(materialInfo,angularInfo);vec3 diffuseContrib=(1.0-F)*diffuse(materialInfo);vec3 specContrib=F*Vis*D;return angularInfo.NdotL*(diffuseContrib+specContrib);}return vec3(0.0,0.0,0.0);}float getRangeAttenuation(float range,float distance){if(range<=0.0){return 1.0;}return 1.0/(pow(5.0*distance/range,2.0)+1.0);}float getSpotAttenuation(vec3 pointToLight,vec3 spotDirection,float outerConeCos,float innerConeCos){float actualCos=dot(normalize(spotDirection),normalize(-pointToLight));if(actualCos>outerConeCos){if(actualCos<innerConeCos){return smoothstep(outerConeCos,innerConeCos,actualCos);}return 1.0;}return 0.0;}vec3 applyDirectionalLight(Light light,MaterialInfo materialInfo,vec3 normal,vec3 view,float shadow){vec3 pointToLight=-light.direction;vec3 shade=getPointShade(pointToLight,materialInfo,normal,view)*shadow;return light.intensity*light.color*shade;}vec3 applyPointLight(Light light,MaterialInfo materialInfo,vec3 normal,vec3 view){vec3 pointToLight=light.position-v_Position;float distance=length(pointToLight);float attenuation=getRangeAttenuation(light.range,distance);vec3 shade=getPointShade(pointToLight,materialInfo,normal,view);return light.color*shade*attenuation*light.intensity;}vec3 applySpotLight(Light light,MaterialInfo materialInfo,vec3 normal,vec3 view,float shadow){vec3 pointToLight=light.position-v_Position;float distance=length(pointToLight);float rangeAttenuation=getRangeAttenuation(light.range,distance);float spotAttenuation=getSpotAttenuation(pointToLight,light.direction,light.outerConeCos,light.innerConeCos);vec3 shade=getPointShade(pointToLight,materialInfo,normal,view)*shadow;return rangeAttenuation*spotAttenuation*light.intensity*light.color*shade;}vec3 applyAmbientLight(Light light,MaterialInfo materialInfo){return light.intensity*light.color*diffuse(materialInfo);}float weight(float z,float a){return clamp(pow(min(1.0,a*10.0)+0.01,3.0)*1e8*pow(1.0-z*0.9,3.0),1e-2,3e3);}void writeFragmentColor(vec4 fragColor){\n#if !defined(ALPHAMODE_OPAQUE) && defined(USE_WBOIT)\nfloat w=weight(gl_FragCoord.z,fragColor.a);fragColor.rgb*=fragColor.a;outFragColor0=vec4(fragColor.rgb*w,fragColor.a);outFragColor1=vec4(fragColor.a*w);\n#else\noutFragColor=fragColor;\n#endif\n}void main(){float perceptualRoughness=0.0;float metallic=0.0;vec4 baseColor=vec4(0.0,0.0,0.0,1.0);vec3 diffuseColor=vec3(0.0);vec3 specularColor=vec3(0.0);vec3 f0=vec3(0.04);\n#ifdef PREVIEW_BORDER\nwriteFragmentColor(uPreviewColor);return;\n#endif\n#ifdef MATERIAL_SPECULARGLOSSINESS\n#ifdef HAS_SPECULAR_GLOSSINESS_MAP\nvec4 sgSample=SRGBtoLINEAR(texture2D(u_SpecularGlossinessSampler,getSpecularGlossinessUV()));perceptualRoughness=(1.0-sgSample.a*u_GlossinessFactor);f0=sgSample.rgb*u_SpecularFactor;\n#else\nf0=u_SpecularFactor;perceptualRoughness=1.0-u_GlossinessFactor;\n#endif\n#ifdef HAS_DIFFUSE_MAP\nbaseColor=SRGBtoLINEAR(texture2D(u_DiffuseSampler,getDiffuseUV()))*u_DiffuseFactor;\n#else\nbaseColor=SRGBtoLINEAR(u_DiffuseFactor);\n#endif\nbaseColor*=getVertexColor();specularColor=f0;float oneMinusSpecularStrength=1.0-max(max(f0.r,f0.g),f0.b);diffuseColor=baseColor.rgb*oneMinusSpecularStrength;\n#ifdef DEBUG_METALLIC\nmetallic=solveMetallic(baseColor.rgb,specularColor,oneMinusSpecularStrength);\n#endif\n#endif\n#ifdef MATERIAL_METALLICROUGHNESS\n#ifdef HAS_METALLIC_ROUGHNESS_MAP\nvec4 mrSample=texture2D(u_MetallicRoughnessSampler,getMetallicRoughnessUV());perceptualRoughness=mrSample.g*u_RoughnessFactor;metallic=mrSample.b*u_MetallicFactor;\n#else\nmetallic=u_MetallicFactor;perceptualRoughness=u_RoughnessFactor;\n#endif\n#ifdef HAS_BASE_COLOR_MAP\nbaseColor=SRGBtoLINEAR(texture2D(u_BaseColorSampler,getBaseColorUV()))*u_BaseColorFactor;\n#else\nbaseColor=SRGBtoLINEAR(u_BaseColorFactor);\n#endif\nbaseColor*=getVertexColor();diffuseColor=baseColor.rgb*(vec3(1.0)-f0)*(1.0-metallic);specularColor=mix(f0,baseColor.rgb,metallic);\n#endif\n#ifdef ALPHAMODE_MASK\nif(baseColor.a<u_AlphaCutoff){discard;}baseColor.a=1.0;\n#endif\n#ifdef ALPHAMODE_OPAQUE\nbaseColor.a=1.0;\n#endif\n#ifdef MATERIAL_UNLIT\n#ifndef DEBUG_OUTPUT\n#ifdef ADD_FOG\nvec3 mixColor=getMixFogColor(baseColor.rgb);vec4 fragColorUnlit=vec4(LINEARtoSRGB(mixColor)*baseColor.a,baseColor.a);\n#else\nvec4 fragColorUnlit=vec4(LINEARtoSRGB(baseColor.rgb)*baseColor.a,baseColor.a);\n#endif\nwriteFragmentColor(fragColorUnlit);\n#else\n#ifdef DEBUG_UV\noutFragColor.rgb=vec3(getDebugUVColor(getBaseColorUV(),getNormal()));\n#endif\n#ifdef DEBUG_METALLIC\noutFragColor.rgb=vec3(metallic);\n#endif\n#ifdef DEBUG_ROUGHNESS\noutFragColor.rgb=vec3(perceptualRoughness);\n#endif\n#ifdef DEBUG_NORMAL\noutFragColor.rgb=getNormal()*0.5+0.5;\n#endif\n#ifdef DEBUG_BASECOLOR\noutFragColor.rgb=LINEARtoSRGB(baseColor.rgb);\n#endif\n#ifdef DEBUG_OCCLUSION\noutFragColor.rgb=vec3(1.0);\n#endif\n#ifdef DEBUG_EMISSIVE\noutFragColor.rgb=vec3(0.0);\n#endif\n#ifdef DEBUG_ALPHA\noutFragColor.rgb=vec3(baseColor.a);\n#endif\noutFragColor.a=1.0;\n#endif\nreturn;\n#endif\nmetallic=clamp(metallic,0.0,1.0);float alphaRoughness=perceptualRoughness*perceptualRoughness;vec3 normal=getNormal();\n#ifdef USE_SPECULAR_AA\nfloat AARoughnessFactor=getAARoughnessFactor(normal);perceptualRoughness+=AARoughnessFactor;alphaRoughness+=AARoughnessFactor;\n#endif\nperceptualRoughness=clamp(perceptualRoughness,0.04,1.0);alphaRoughness=clamp(alphaRoughness,0.04,1.0);float reflectance=max(max(specularColor.r,specularColor.g),specularColor.b);vec3 specularEnvironmentR0=specularColor.rgb;vec3 specularEnvironmentR90=vec3(clamp(reflectance*50.0,0.0,1.0));MaterialInfo materialInfo=MaterialInfo(perceptualRoughness,specularEnvironmentR0,alphaRoughness,diffuseColor,specularEnvironmentR90,specularColor);vec3 color=vec3(0.0,0.0,0.0);vec3 view=normalize(u_Camera-v_Position);float shadow=1.0;\n#ifdef USE_SHADOW_MAPPING\nshadow=getShadowContribution();\n#endif\n#ifdef USE_PUNCTUAL\nfor(int i=0;i<LIGHT_COUNT;++i){Light light=u_Lights[i];if(light.type==LightType_Directional){color+=applyDirectionalLight(light,materialInfo,normal,view,shadow);}else if(light.type==LightType_Point){color+=applyPointLight(light,materialInfo,normal,view);}else if(light.type==LightType_Spot){color+=applySpotLight(light,materialInfo,normal,view,shadow);}else if(light.type==LightType_Ambient){color+=applyAmbientLight(light,materialInfo);}}\n#endif\n#ifdef USE_IBL\ncolor+=getIBLContribution(materialInfo,normal,view);\n#endif\nfloat ao=1.0;\n#ifdef HAS_OCCLUSION_MAP\nao=texture2D(u_OcclusionSampler,getOcclusionUV()).r;color=mix(color,color*ao,u_OcclusionStrength);\n#endif\nvec3 emissive=vec3(0);\n#ifndef DEBUG_OUTPUT\n#ifdef ADD_FOG\nvec4 toneMapColor=SRGBtoLINEAR(vec4(toneMap(color),baseColor.a));color=getMixFogColor(toneMapColor.rgb);vec4 fragColorOut=vec4(LINEARtoSRGB(color.rgb)*baseColor.a,baseColor.a);\n#else\ncolor=toneMap(color)*baseColor.a;\n#ifdef HAS_EMISSIVE\ncolor+=u_EmissiveFactor.rgb;\n#endif\n#ifdef HAS_EMISSIVE_MAP\nemissive=SRGBtoLINEAR(texture2D(u_EmissiveSampler,getEmissiveUV())).rgb*u_EmissiveFactor.rgb;color+=emissive;\n#endif\nvec4 fragColorOut=vec4(color,baseColor.a);\n#endif\nwriteFragmentColor(fragColorOut);\n#else\n#ifdef DEBUG_UV\noutFragColor.rgb=vec3(getDebugUVColor(getBaseColorUV(),normal));\n#endif\n#ifdef DEBUG_METALLIC\noutFragColor.rgb=vec3(metallic);\n#endif\n#ifdef DEBUG_ROUGHNESS\noutFragColor.rgb=vec3(perceptualRoughness);\n#endif\n#ifdef DEBUG_NORMAL\noutFragColor.rgb=normal*0.5+0.5;\n#endif\n#ifdef DEBUG_BASECOLOR\noutFragColor.rgb=LINEARtoSRGB(baseColor.rgb);\n#endif\n#ifdef DEBUG_OCCLUSION\n#ifdef HAS_OCCLUSION_MAP\noutFragColor.rgb=vec3(mix(1.0,ao,u_OcclusionStrength));\n#else\noutFragColor.rgb=vec3(1.0);\n#endif\n#endif\n#ifdef DEBUG_EMISSIVE\n#ifdef HAS_EMISSIVE\nemissive=u_EmissiveFactor.rgb;\n#endif\n#ifdef HAS_EMISSIVE_MAP\nemissive=SRGBtoLINEAR(texture2D(u_EmissiveSampler,getEmissiveUV())).rgb*u_EmissiveFactor.rgb;\n#endif\noutFragColor.rgb=LINEARtoSRGB(emissive);\n#endif\n#ifdef DEBUG_F0\noutFragColor.rgb=vec3(f0);\n#endif\n#ifdef DEBUG_ALPHA\noutFragColor.rgb=vec3(baseColor.a);\n#endif\noutFragColor.a=1.0;\n#endif\n}";
918
918
 
919
919
  var shadowPassFrag = "#define FEATURES\n#include <shadowCommon.vert.glsl>\n#include <webglCompatibility.glsl>\n#if defined(SHADOWMAP_VSM) && !defined(WEBGL2)\n#extension GL_OES_standard_derivatives : enable\n#endif\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n#ifdef WEBGL2\nout vec4 outFragColor;\n#else\n#define outFragColor gl_FragColor\n#endif\nvec4 CalcMomentVSM(float depth){float dx=0.0;float dy=0.0;\n#if defined(SHADOWMAP_VSM) && (defined(GL_OES_standard_derivatives) || defined(WEBGL2))\ndx=dFdx(depth);dy=dFdy(depth);\n#endif\nfloat moment2=depth*depth+0.25*(dx*dx+dy*dy);return vec4(1.0-depth,1.0-moment2,0.0,1.0);}vec4 CalcMomentEVSM(float depth){float pos=EVSM_FUNC0(depth);float neg=EVSM_FUNC1(depth);return vec4(pos,pos*pos,neg,neg*neg);}void main(){\n#if defined(SHADOWMAP_STANDARD) || defined(SHADOWMAP_VSM)\noutFragColor=CalcMomentVSM(gl_FragCoord.z);\n#else\noutFragColor=CalcMomentEVSM(gl_FragCoord.z);\n#endif\n}";
920
920
 
@@ -928,7 +928,7 @@ var extensionsFragGLSL = "vec3 _dFdx(vec3 coord){\n#if defined(GL_OES_standard_d
928
928
 
929
929
  var tonemappingFragGLSL = "uniform float u_Exposure;const float GAMMA=2.2;const float INV_GAMMA=1.0/GAMMA;vec3 LINEARtoSRGB(vec3 color){return pow(color,vec3(INV_GAMMA));}vec4 SRGBtoLINEAR(vec4 srgbIn){return vec4(pow(srgbIn.xyz,vec3(GAMMA)),srgbIn.w);}vec3 toneMapUncharted2Impl(vec3 color){const float A=0.15;const float B=0.50;const float C=0.10;const float D=0.20;const float E=0.02;const float F=0.30;return((color*(A*color+C*B)+D*E)/(color*(A*color+B)+D*F))-E/F;}vec3 toneMapUncharted(vec3 color){const float W=11.2;color=toneMapUncharted2Impl(color*2.0);vec3 whiteScale=1.0/toneMapUncharted2Impl(vec3(W));return LINEARtoSRGB(color*whiteScale);}vec3 toneMapHejlRichard(vec3 color){color=max(vec3(0.0),color-vec3(0.004));return(color*(6.2*color+.5))/(color*(6.2*color+1.7)+0.06);}vec3 toneMapACES(vec3 color){const float A=2.51;const float B=0.03;const float C=2.43;const float D=0.59;const float E=0.14;return LINEARtoSRGB(clamp((color*(A*color+B))/(color*(C*color+D)+E),0.0,1.0));}vec3 toneMap(vec3 color){color*=u_Exposure;\n#ifdef TONEMAP_UNCHARTED\nreturn toneMapUncharted(color);\n#endif\n#ifdef TONEMAP_HEJLRICHARD\nreturn toneMapHejlRichard(color);\n#endif\n#ifdef TONEMAP_ACES\nreturn toneMapACES(color);\n#endif\nreturn LINEARtoSRGB(color);}";
930
930
 
931
- var texturesVertGLSL = "fsIn vec2 v_UVCoord1;\n#ifdef HAS_UV_SET2\nfsIn vec2 v_UVCoord2;\n#endif\n#ifdef HAS_NORMAL_MAP\nuniform sampler2D u_NormalSampler;uniform float u_NormalScale;uniform int u_NormalUVSet;uniform mat3 u_NormalUVTransform;\n#endif\n#ifdef HAS_EMISSIVE_MAP\nuniform sampler2D u_EmissiveSampler;uniform int u_EmissiveUVSet;uniform vec3 u_EmissiveFactor;uniform mat3 u_EmissiveUVTransform;\n#endif\n#ifdef HAS_EMISSIVE\nuniform vec3 u_EmissiveFactor;\n#endif\n#ifdef HAS_OCCLUSION_MAP\nuniform sampler2D u_OcclusionSampler;uniform int u_OcclusionUVSet;uniform float u_OcclusionStrength;uniform mat3 u_OcclusionUVTransform;\n#endif\n#ifdef HAS_BASE_COLOR_MAP\nuniform sampler2D u_BaseColorSampler;uniform int u_BaseColorUVSet;uniform mat3 u_BaseColorUVTransform;\n#endif\n#ifdef HAS_METALLIC_ROUGHNESS_MAP\nuniform sampler2D u_MetallicRoughnessSampler;uniform int u_MetallicRoughnessUVSet;uniform mat3 u_MetallicRoughnessUVTransform;\n#endif\n#ifdef HAS_DIFFUSE_MAP\nuniform sampler2D u_DiffuseSampler;uniform int u_DiffuseUVSet;uniform mat3 u_DiffuseUVTransform;\n#endif\n#ifdef HAS_SPECULAR_GLOSSINESS_MAP\nuniform sampler2D u_SpecularGlossinessSampler;uniform int u_SpecularGlossinessUVSet;uniform mat3 u_SpecularGlossinessUVTransform;\n#endif\n#ifdef USE_IBL\nuniform samplerCube u_DiffuseEnvSampler;uniform samplerCube u_SpecularEnvSampler;uniform sampler2D u_brdfLUT;uniform vec2 u_IblIntensity;\n#endif\n#ifdef IRRADIANCE_COEFFICIENTS\nstruct SHCoefficients{vec3 l00,l1m1,l10,l11,l2m2,l2m1,l20,l21,l22;};uniform SHCoefficients u_shCoefficients;\n#endif\n#ifdef USE_SHADOW_MAPPING\nuniform sampler2D u_ShadowSampler;\n#endif\nvec2 getNormalUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_NORMAL_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_NormalUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_NORMAL_UV_TRANSFORM\nuv*=u_NormalUVTransform;\n#endif\n#endif\nreturn uv.xy;}vec2 getEmissiveUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_EMISSIVE_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_EmissiveUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_EMISSIVE_UV_TRANSFORM\nuv*=u_EmissiveUVTransform;\n#endif\n#endif\nreturn uv.xy;}vec2 getOcclusionUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_OCCLUSION_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_OcclusionUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_OCCLUSION_UV_TRANSFORM\nuv*=u_OcclusionUVTransform;\n#endif\n#endif\nreturn uv.xy;}vec2 getBaseColorUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_BASE_COLOR_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_BaseColorUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_BASECOLOR_UV_TRANSFORM\nuv*=u_BaseColorUVTransform;\n#endif\n#endif\nreturn uv.xy;}vec2 getMetallicRoughnessUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_METALLIC_ROUGHNESS_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_MetallicRoughnessUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_METALLICROUGHNESS_UV_TRANSFORM\nuv*=u_MetallicRoughnessUVTransform;\n#endif\n#endif\nreturn uv.xy;}vec2 getSpecularGlossinessUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_SPECULAR_GLOSSINESS_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_SpecularGlossinessUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_SPECULARGLOSSINESS_UV_TRANSFORM\nuv*=u_SpecularGlossinessUVTransform;\n#endif\n#endif\nreturn uv.xy;}vec2 getDiffuseUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_DIFFUSE_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_DiffuseUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_DIFFUSE_UV_TRANSFORM\nuv*=u_DiffuseUVTransform;\n#endif\n#endif\nreturn uv.xy;}";
931
+ var texturesVertGLSL = "fsIn vec2 v_UVCoord1;\n#ifdef HAS_UV_SET2\nfsIn vec2 v_UVCoord2;\n#endif\n#ifdef HAS_NORMAL_MAP\nuniform sampler2D u_NormalSampler;uniform float u_NormalScale;uniform int u_NormalUVSet;uniform mat3 u_NormalUVTransform;\n#endif\n#ifdef HAS_EMISSIVE_MAP\nuniform sampler2D u_EmissiveSampler;uniform int u_EmissiveUVSet;uniform vec4 u_EmissiveFactor;uniform mat3 u_EmissiveUVTransform;\n#endif\n#ifdef HAS_EMISSIVE\nuniform vec4 u_EmissiveFactor;\n#endif\n#ifdef HAS_OCCLUSION_MAP\nuniform sampler2D u_OcclusionSampler;uniform int u_OcclusionUVSet;uniform float u_OcclusionStrength;uniform mat3 u_OcclusionUVTransform;\n#endif\n#ifdef HAS_BASE_COLOR_MAP\nuniform sampler2D u_BaseColorSampler;uniform int u_BaseColorUVSet;uniform mat3 u_BaseColorUVTransform;\n#endif\n#ifdef HAS_METALLIC_ROUGHNESS_MAP\nuniform sampler2D u_MetallicRoughnessSampler;uniform int u_MetallicRoughnessUVSet;uniform mat3 u_MetallicRoughnessUVTransform;\n#endif\n#ifdef HAS_DIFFUSE_MAP\nuniform sampler2D u_DiffuseSampler;uniform int u_DiffuseUVSet;uniform mat3 u_DiffuseUVTransform;\n#endif\n#ifdef HAS_SPECULAR_GLOSSINESS_MAP\nuniform sampler2D u_SpecularGlossinessSampler;uniform int u_SpecularGlossinessUVSet;uniform mat3 u_SpecularGlossinessUVTransform;\n#endif\n#ifdef USE_IBL\nuniform samplerCube u_DiffuseEnvSampler;uniform samplerCube u_SpecularEnvSampler;uniform sampler2D u_brdfLUT;uniform vec2 u_IblIntensity;\n#endif\n#ifdef IRRADIANCE_COEFFICIENTS\nstruct SHCoefficients{vec3 l00,l1m1,l10,l11,l2m2,l2m1,l20,l21,l22;};uniform SHCoefficients u_shCoefficients;\n#endif\n#ifdef USE_SHADOW_MAPPING\nuniform sampler2D u_ShadowSampler;\n#endif\nvec2 getNormalUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_NORMAL_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_NormalUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_NORMAL_UV_TRANSFORM\nuv*=u_NormalUVTransform;\n#endif\n#endif\nreturn uv.xy;}vec2 getEmissiveUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_EMISSIVE_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_EmissiveUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_EMISSIVE_UV_TRANSFORM\nuv*=u_EmissiveUVTransform;\n#endif\n#endif\nreturn uv.xy;}vec2 getOcclusionUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_OCCLUSION_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_OcclusionUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_OCCLUSION_UV_TRANSFORM\nuv*=u_OcclusionUVTransform;\n#endif\n#endif\nreturn uv.xy;}vec2 getBaseColorUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_BASE_COLOR_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_BaseColorUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_BASECOLOR_UV_TRANSFORM\nuv*=u_BaseColorUVTransform;\n#endif\n#endif\nreturn uv.xy;}vec2 getMetallicRoughnessUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_METALLIC_ROUGHNESS_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_MetallicRoughnessUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_METALLICROUGHNESS_UV_TRANSFORM\nuv*=u_MetallicRoughnessUVTransform;\n#endif\n#endif\nreturn uv.xy;}vec2 getSpecularGlossinessUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_SPECULAR_GLOSSINESS_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_SpecularGlossinessUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_SPECULARGLOSSINESS_UV_TRANSFORM\nuv*=u_SpecularGlossinessUVTransform;\n#endif\n#endif\nreturn uv.xy;}vec2 getDiffuseUV(){vec3 uv=vec3(v_UVCoord1,1.0);\n#ifdef HAS_DIFFUSE_MAP\n#ifdef HAS_UV_SET2\nuv.xy=u_DiffuseUVSet<1 ? v_UVCoord1 : v_UVCoord2;\n#endif\n#ifdef HAS_DIFFUSE_UV_TRANSFORM\nuv*=u_DiffuseUVTransform;\n#endif\n#endif\nreturn uv.xy;}";
932
932
 
933
933
  var functionsFragGLSL = "const float M_PI=3.141592653589793;const float c_MinReflectance=0.04;fsIn vec3 v_Position;\n#ifdef HAS_NORMALS\n#ifdef HAS_TANGENTS\nfsIn mat3 v_TBN;\n#else\nfsIn vec3 v_Normal;\n#endif\n#endif\n#ifdef HAS_VERTEX_COLOR_VEC3\nfsIn vec3 v_Color;\n#endif\n#ifdef HAS_VERTEX_COLOR_VEC4\nfsIn vec4 v_Color;\n#endif\nstruct AngularInfo{float NdotL;float NdotV;float NdotH;float LdotH;float VdotH;vec3 padding;};vec4 getVertexColor(){vec4 color=vec4(1.0,1.0,1.0,1.0);\n#ifdef HAS_VERTEX_COLOR_VEC3\ncolor.rgb=v_Color;\n#endif\n#ifdef HAS_VERTEX_COLOR_VEC4\ncolor=v_Color;\n#endif\nreturn color;}vec3 getNormal(){vec2 UV=getNormalUV();\n#ifndef HAS_TANGENTS\nvec3 pos_dx=_dFdx(v_Position);vec3 pos_dy=_dFdy(v_Position);vec3 tex_dx=_dFdx(vec3(UV,0.0));vec3 tex_dy=_dFdy(vec3(UV,0.0));vec3 t=(tex_dy.t*pos_dx-tex_dx.t*pos_dy)/(tex_dx.s*tex_dy.t-tex_dy.s*tex_dx.t);\n#ifdef HAS_NORMALS\nvec3 ng=normalize(v_Normal);\n#else\nvec3 ng=cross(pos_dx,pos_dy);\n#endif\nt=normalize(t-ng*dot(ng,t));vec3 b=normalize(cross(ng,t));mat3 tbn=mat3(t,b,ng);\n#else\nmat3 tbn=v_TBN;\n#endif\n#ifdef HAS_NORMAL_MAP\nvec3 n=texture2D(u_NormalSampler,UV).rgb;n=normalize(tbn*((2.0*n-1.0)*vec3(u_NormalScale,u_NormalScale,1.0)));\n#else\nvec3 n=normalize(tbn[2].xyz);\n#endif\n#ifdef DOUBLE_SIDED\nfloat faceDirection=gl_FrontFacing ? 1.0 :-1.0;n=n*faceDirection;\n#endif\nreturn n;}float getPerceivedBrightness(vec3 vector){return sqrt(0.299*vector.r*vector.r+0.587*vector.g*vector.g+0.114*vector.b*vector.b);}float solveMetallic(vec3 diffuse,vec3 specular,float oneMinusSpecularStrength){float specularBrightness=getPerceivedBrightness(specular);if(specularBrightness<c_MinReflectance){return 0.0;}float diffuseBrightness=getPerceivedBrightness(diffuse);float a=c_MinReflectance;float b=diffuseBrightness*oneMinusSpecularStrength/(1.0-c_MinReflectance)+specularBrightness-2.0*c_MinReflectance;float c=c_MinReflectance-specularBrightness;float D=b*b-4.0*a*c;return clamp((-b+sqrt(D))/(2.0*a),0.0,1.0);}AngularInfo getAngularInfo(vec3 pointToLight,vec3 normal,vec3 view){vec3 n=normalize(normal);vec3 v=normalize(view);vec3 l=normalize(pointToLight);vec3 h=normalize(l+v);float NdotL=clamp(dot(n,l),0.0,1.0);float NdotV=clamp(dot(n,v),0.0,1.0);float NdotH=clamp(dot(n,h),0.0,1.0);float LdotH=clamp(dot(l,h),0.0,1.0);float VdotH=clamp(dot(v,h),0.0,1.0);return AngularInfo(NdotL,NdotV,NdotH,LdotH,VdotH,vec3(0,0,0));}float getAARoughnessFactor(vec3 normal){vec3 dxy=max(abs(_dFdx(normal)),abs(_dFdy(normal)));return max(max(dxy.x,dxy.y),dxy.z)*2.0;}\n#ifdef DEBUG_UV\nuniform float u_DebugUVGridSize;float getDebugUVColor(vec2 uv,vec3 n){float s=dot(abs(n),vec3(1,1,1))*0.6;uv=uv/(u_DebugUVGridSize*2.0);uv=uv-floor(uv);uv=uv*2.0-vec2(1.0);return s*(uv.x*uv.y>=0.0 ? 0.2: 1.0);}\n#endif\n";
934
934
 
@@ -1163,6 +1163,7 @@ var PMaterialBase = /** @class */ (function (_super) {
1163
1163
  __extends(PMaterialBase, _super);
1164
1164
  function PMaterialBase() {
1165
1165
  var _this = _super !== null && _super.apply(this, arguments) || this;
1166
+ _this.fromMaterial = false;
1166
1167
  /**
1167
1168
  * 材质类型,主要是 pbr 和 unlit 两类
1168
1169
  */
@@ -1235,6 +1236,19 @@ var PMaterialBase = /** @class */ (function (_super) {
1235
1236
  * @param inFeatureList - 外部特性列表
1236
1237
  */
1237
1238
  PMaterialBase.prototype.build = function (inFeatureList) {
1239
+ var finalFeatureList = this.getFeatureList(inFeatureList);
1240
+ var isWebGL2 = PGlobalState.getInstance().isWebGL2;
1241
+ //
1242
+ var shaderManager = PShaderManager.getInstance();
1243
+ var shaderResult = shaderManager.genShaderCode({
1244
+ material: this,
1245
+ isWebGL2: isWebGL2,
1246
+ featureList: finalFeatureList,
1247
+ });
1248
+ this.vertexShaderCode = shaderResult.vertexShaderCode;
1249
+ this.fragmentShaderCode = shaderResult.fragmentShaderCode;
1250
+ };
1251
+ PMaterialBase.prototype.getFeatureList = function (inFeatureList) {
1238
1252
  var finalFeatureList = this.getShaderFeatures();
1239
1253
  if (inFeatureList !== undefined) {
1240
1254
  finalFeatureList.push.apply(finalFeatureList, __spreadArray([], __read(inFeatureList), false));
@@ -1251,15 +1265,7 @@ var PMaterialBase = /** @class */ (function (_super) {
1251
1265
  finalFeatureList.push('EDITOR_TRANSFORM');
1252
1266
  }
1253
1267
  }
1254
- //
1255
- var shaderManager = PShaderManager.getInstance();
1256
- var shaderResult = shaderManager.genShaderCode({
1257
- material: this,
1258
- isWebGL2: isWebGL2,
1259
- featureList: finalFeatureList,
1260
- });
1261
- this.vertexShaderCode = shaderResult.vertexShaderCode;
1262
- this.fragmentShaderCode = shaderResult.fragmentShaderCode;
1268
+ return finalFeatureList;
1263
1269
  };
1264
1270
  /**
1265
1271
  * 获取混合模式,根据 GE 混合模式
@@ -1571,9 +1577,9 @@ var PMaterialPBR = /** @class */ (function (_super) {
1571
1577
  */
1572
1578
  _this.occlusionTextureStrength = 1;
1573
1579
  /**
1574
- * 自发光颜色值,默认是黑色 Vector3(0, 0, 0)
1580
+ * 自发光颜色值,默认是黑色 Vector4(0, 0, 0, 0)
1575
1581
  */
1576
- _this.emissiveFactor = new Vector3(0, 0, 0);
1582
+ _this.emissiveFactor = new Vector4(0, 0, 0, 0);
1577
1583
  /**
1578
1584
  * 自发光强度
1579
1585
  */
@@ -1629,7 +1635,7 @@ var PMaterialPBR = /** @class */ (function (_super) {
1629
1635
  this.emissiveTextureTrans = PluginHelper.createUVTransform(options.emissiveTextureTransform);
1630
1636
  }
1631
1637
  var emissiveFactor = PluginHelper.toPluginColor4(options.emissiveFactor);
1632
- this.emissiveFactor = Vector3.fromArray(emissiveFactor);
1638
+ this.setEmissiveFactor(Vector3.fromArray(emissiveFactor));
1633
1639
  this.emissiveIntensity = options.emissiveIntensity;
1634
1640
  this.enableShadow = (_d = options.enableShadow) !== null && _d !== void 0 ? _d : false;
1635
1641
  /**
@@ -1645,6 +1651,39 @@ var PMaterialPBR = /** @class */ (function (_super) {
1645
1651
  this.alphaCutOff = (_e = options.alphaCutOff) !== null && _e !== void 0 ? _e : 0;
1646
1652
  this.faceSideMode = this.getFaceSideMode(options.side);
1647
1653
  };
1654
+ PMaterialPBR.prototype.createFromMaterial = function (mat) {
1655
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
1656
+ this.fromMaterial = true;
1657
+ this.material = mat;
1658
+ this.name = mat.name;
1659
+ this.type = PObjectType.material;
1660
+ this.materialType = mat.getInt('shaderType') ? PMaterialType.unlit : PMaterialType.pbr;
1661
+ //
1662
+ this.baseColorTexture = (_a = mat.getTexture('u_BaseColorSampler')) !== null && _a !== void 0 ? _a : undefined;
1663
+ this.baseColorFactor = (_b = mat.getVector4('u_BaseColorFactor')) !== null && _b !== void 0 ? _b : new Vector4(255, 255, 255, 255);
1664
+ this.baseColorFactor.multiply(1 / 255.0);
1665
+ this.metallicRoughnessTexture = (_c = mat.getTexture('u_MetallicRoughnessSampler')) !== null && _c !== void 0 ? _c : undefined;
1666
+ this.useSpecularAA = mat.getInt('useSpecularAA') === 1;
1667
+ this.metallicFactor = (_d = mat.getFloat('u_MetallicFactor')) !== null && _d !== void 0 ? _d : 1;
1668
+ this.roughnessFactor = (_e = mat.getFloat('u_RoughnessFactor')) !== null && _e !== void 0 ? _e : 1;
1669
+ this.normalTexture = (_f = mat.getTexture('u_NormalSampler')) !== null && _f !== void 0 ? _f : undefined;
1670
+ this.normalTextureScale = (_g = mat.getFloat('u_NormalScale')) !== null && _g !== void 0 ? _g : 1;
1671
+ this.occlusionTexture = (_h = mat.getTexture('u_OcclusionSampler')) !== null && _h !== void 0 ? _h : undefined;
1672
+ this.occlusionTextureStrength = (_j = mat.getFloat('u_OcclusionTextureStrength')) !== null && _j !== void 0 ? _j : 1;
1673
+ this.emissiveTexture = (_k = mat.getTexture('u_EmissiveSampler')) !== null && _k !== void 0 ? _k : undefined;
1674
+ this.emissiveFactor = (_l = mat.getVector4('u_EmissiveFactor')) !== null && _l !== void 0 ? _l : new Vector4(0, 0, 0, 0);
1675
+ this.emissiveFactor.multiply(1 / 255.0);
1676
+ this.emissiveIntensity = (_m = mat.getFloat('u_EmissiveIntensity')) !== null && _m !== void 0 ? _m : 1;
1677
+ var emissiveFactor = this.emissiveFactor.clone().multiply(this.emissiveIntensity);
1678
+ mat.setVector4('u_EmissiveFactor', emissiveFactor);
1679
+ this.enableShadow = false;
1680
+ this.depthMask = false;
1681
+ var blending = (_o = mat.getInt('blending')) !== null && _o !== void 0 ? _o : spec.MaterialBlending.opaque;
1682
+ this.blendMode = this.getBlendMode(blending);
1683
+ this.alphaCutOff = (_p = mat.getFloat('u_AlphaCutoff')) !== null && _p !== void 0 ? _p : 0;
1684
+ var side = (_q = mat.getInt('side')) !== null && _q !== void 0 ? _q : spec.SideMode.FRONT;
1685
+ this.faceSideMode = this.getFaceSideMode(side);
1686
+ };
1648
1687
  /**
1649
1688
  * 销毁材质
1650
1689
  */
@@ -1707,6 +1746,35 @@ var PMaterialPBR = /** @class */ (function (_super) {
1707
1746
  */
1708
1747
  PMaterialPBR.prototype.updateUniforms = function (material) {
1709
1748
  _super.prototype.updateUniforms.call(this, material);
1749
+ if (this.fromMaterial) {
1750
+ var uvTransform_1 = new Matrix3().identity();
1751
+ if (this.baseColorTexture !== undefined) {
1752
+ material.setInt('u_BaseColorUVSet', 0);
1753
+ material.setMatrix3('u_BaseColorUVTransform', uvTransform_1);
1754
+ }
1755
+ //
1756
+ if (this.metallicRoughnessTexture !== undefined) {
1757
+ material.setInt('u_MetallicRoughnessUVSet', 0);
1758
+ material.setMatrix3('u_MetallicRoughnessUVTransform', uvTransform_1);
1759
+ }
1760
+ //
1761
+ if (this.normalTexture !== undefined) {
1762
+ material.setInt('u_NormalUVSet', 0);
1763
+ material.setMatrix3('u_NormalUVTransform', uvTransform_1);
1764
+ }
1765
+ //
1766
+ if (this.occlusionTexture !== undefined) {
1767
+ material.setInt('u_OcclusionUVSet', 0);
1768
+ material.setMatrix3('u_OcclusionUVTransform', uvTransform_1);
1769
+ }
1770
+ //
1771
+ if (this.emissiveTexture !== undefined) {
1772
+ material.setInt('u_EmissiveUVSet', 0);
1773
+ material.setMatrix3('u_EmissiveUVTransform', uvTransform_1);
1774
+ }
1775
+ material.setFloat('u_Exposure', 3.0);
1776
+ return;
1777
+ }
1710
1778
  //
1711
1779
  var uvTransform = new Matrix3().identity();
1712
1780
  material.setVector4('u_BaseColorFactor', this.baseColorFactor);
@@ -1765,7 +1833,7 @@ var PMaterialPBR = /** @class */ (function (_super) {
1765
1833
  if (this.emissiveTexture !== undefined) {
1766
1834
  var emissiveFactor = this.getEmissiveFactor();
1767
1835
  material.setTexture('u_EmissiveSampler', this.emissiveTexture);
1768
- material.setVector3('u_EmissiveFactor', emissiveFactor);
1836
+ material.setVector4('u_EmissiveFactor', emissiveFactor);
1769
1837
  material.setInt('u_EmissiveUVSet', 0);
1770
1838
  if (this.emissiveTextureTrans !== undefined) {
1771
1839
  material.setMatrix3('u_EmissiveUVTransform', this.emissiveTextureTrans);
@@ -1777,7 +1845,7 @@ var PMaterialPBR = /** @class */ (function (_super) {
1777
1845
  }
1778
1846
  else if (this.hasEmissiveFactor()) {
1779
1847
  var emissiveFactor = this.getEmissiveFactor();
1780
- material.setVector3('u_EmissiveFactor', emissiveFactor);
1848
+ material.setVector4('u_EmissiveFactor', emissiveFactor);
1781
1849
  }
1782
1850
  material.setFloat('u_Exposure', 3.0);
1783
1851
  };
@@ -1956,11 +2024,17 @@ var PMaterialPBR = /** @class */ (function (_super) {
1956
2024
  PMaterialPBR.prototype.setEmissiveFactor = function (val) {
1957
2025
  if (val instanceof Vector3) {
1958
2026
  // Vector3
1959
- this.emissiveFactor.set(val.x, val.y, val.z);
2027
+ this.emissiveFactor.set(val.x, val.y, val.z, 0);
1960
2028
  }
1961
2029
  else {
1962
2030
  // vec3
1963
- this.emissiveFactor.set(val[0], val[1], val[2]);
2031
+ this.emissiveFactor.set(val[0], val[1], val[2], 0);
2032
+ }
2033
+ };
2034
+ PMaterialPBR.prototype.getTextureFromMaterial = function (mat, texName) {
2035
+ var tex = mat.getTexture(texName);
2036
+ if (tex !== null) {
2037
+ return tex;
1964
2038
  }
1965
2039
  };
1966
2040
  return PMaterialPBR;
@@ -1971,15 +2045,22 @@ var PMaterialPBR = /** @class */ (function (_super) {
1971
2045
  * @returns 材质对象
1972
2046
  */
1973
2047
  function createPluginMaterial(options) {
1974
- if (options.type === spec.MaterialType.pbr) {
2048
+ if (options instanceof Material) {
1975
2049
  var materialPBR = new PMaterialPBR();
1976
- materialPBR.create(options);
2050
+ materialPBR.createFromMaterial(options);
1977
2051
  return materialPBR;
1978
2052
  }
1979
2053
  else {
1980
- var materialUnlit = new PMaterialUnlit();
1981
- materialUnlit.create(options);
1982
- return materialUnlit;
2054
+ if (options.type === spec.MaterialType.pbr) {
2055
+ var materialPBR = new PMaterialPBR();
2056
+ materialPBR.create(options);
2057
+ return materialPBR;
2058
+ }
2059
+ else {
2060
+ var materialUnlit = new PMaterialUnlit();
2061
+ materialUnlit.create(options);
2062
+ return materialUnlit;
2063
+ }
1983
2064
  }
1984
2065
  }
1985
2066
 
@@ -1991,10 +2072,10 @@ var PSkybox = /** @class */ (function (_super) {
1991
2072
  /**
1992
2073
  * 构造函数
1993
2074
  * @param name - 名称
1994
- * @param options - 天空盒参数
2075
+ * @param data - 天空盒参数
1995
2076
  * @param owner - 所属天空盒组件元素
1996
2077
  */
1997
- function PSkybox(name, options, owner) {
2078
+ function PSkybox(name, data, owner) {
1998
2079
  var _a;
1999
2080
  var _this = _super.call(this) || this;
2000
2081
  /**
@@ -2029,14 +2110,27 @@ var PSkybox = /** @class */ (function (_super) {
2029
2110
  _this.type = PObjectType.skybox;
2030
2111
  _this.visible = false;
2031
2112
  _this.owner = owner;
2032
- _this.renderable = options.renderable;
2033
- _this.intensity = options.intensity;
2034
- _this.reflectionsIntensity = options.reflectionsIntensity;
2035
- _this.irradianceCoeffs = options.irradianceCoeffs;
2036
- _this.diffuseImage = options.diffuseImage;
2037
- _this.specularImage = options.specularImage;
2038
- _this.specularImageSize = options.specularImageSize;
2039
- _this.specularMipCount = options.specularMipCount;
2113
+ var irradianceCoeffs = data.irradianceCoeffs;
2114
+ _this.renderable = data.renderable;
2115
+ _this.intensity = data.intensity;
2116
+ _this.reflectionsIntensity = data.reflectionsIntensity;
2117
+ if (irradianceCoeffs) {
2118
+ _this.irradianceCoeffs = [];
2119
+ for (var i = 0; i < irradianceCoeffs.length; i += 3) {
2120
+ _this.irradianceCoeffs.push([
2121
+ irradianceCoeffs[i],
2122
+ irradianceCoeffs[i + 1],
2123
+ irradianceCoeffs[i + 2],
2124
+ ]);
2125
+ }
2126
+ }
2127
+ else {
2128
+ _this.irradianceCoeffs = [];
2129
+ }
2130
+ _this.diffuseImage = data.diffuseImage;
2131
+ _this.specularImage = data.specularImage;
2132
+ _this.specularImageSize = data.specularImageSize;
2133
+ _this.specularMipCount = data.specularMipCount;
2040
2134
  _this.priority = ((_a = owner === null || owner === void 0 ? void 0 : owner.item) === null || _a === void 0 ? void 0 : _a.listIndex) || 0;
2041
2135
  return _this;
2042
2136
  }
@@ -2101,7 +2195,7 @@ var PSkybox = /** @class */ (function (_super) {
2101
2195
  var sceneStates = scene.sceneStates;
2102
2196
  var camera = sceneStates.camera;
2103
2197
  var viewMatrix = sceneStates.viewMatrix;
2104
- var newProjViewMatrix = camera.getNewProjectionMatrix(camera.fovy).multiply(viewMatrix).invert();
2198
+ var newProjViewMatrix = camera.getNewProjectionMatrix(camera.fov).multiply(viewMatrix).invert();
2105
2199
  var material = this.skyboxMesh.material;
2106
2200
  this.skyboxMaterial.updateUniforms(material);
2107
2201
  material.setMatrix('u_InvViewProjectionMatrix', newProjViewMatrix);
@@ -3943,8 +4037,8 @@ var PCamera = /** @class */ (function (_super) {
3943
4037
  * @param height - 画布高度
3944
4038
  * @param owner - 所属的相机组件
3945
4039
  */
3946
- function PCamera(name, width, height, options, owner) {
3947
- var _a;
4040
+ function PCamera(name, width, height, data, owner) {
4041
+ var _a, _b, _c, _d, _e;
3948
4042
  var _this = _super.call(this) || this;
3949
4043
  /**
3950
4044
  * 画布宽度
@@ -3965,7 +4059,7 @@ var PCamera = /** @class */ (function (_super) {
3965
4059
  /**
3966
4060
  * Y 轴上视角
3967
4061
  */
3968
- _this.fovy = 45;
4062
+ _this.fov = 45;
3969
4063
  /**
3970
4064
  * 纵横比
3971
4065
  */
@@ -3989,11 +4083,11 @@ var PCamera = /** @class */ (function (_super) {
3989
4083
  _this.name = name;
3990
4084
  _this.width = width;
3991
4085
  _this.height = height;
3992
- _this.nearPlane = options.near;
3993
- _this.farPlane = options.far;
3994
- _this.fovy = options.fov;
3995
- _this.aspect = (_a = options.aspect) !== null && _a !== void 0 ? _a : (_this.width / _this.height);
3996
- _this.clipMode = options.clipMode;
4086
+ _this.nearPlane = (_a = data.near) !== null && _a !== void 0 ? _a : 0.001;
4087
+ _this.farPlane = (_b = data.far) !== null && _b !== void 0 ? _b : 1000;
4088
+ _this.fov = (_c = data.fov) !== null && _c !== void 0 ? _c : 45;
4089
+ _this.aspect = (_d = data.aspect) !== null && _d !== void 0 ? _d : (_this.width / _this.height);
4090
+ _this.clipMode = (_e = data.clipMode) !== null && _e !== void 0 ? _e : spec.CameraClipMode.landscape;
3997
4091
  _this.update();
3998
4092
  return _this;
3999
4093
  }
@@ -4005,7 +4099,7 @@ var PCamera = /** @class */ (function (_super) {
4005
4099
  this.transform.fromEffectsTransform(this.owner.transform);
4006
4100
  }
4007
4101
  var reverse = this.clipMode === spec.CameraClipMode.portrait;
4008
- this.projectionMatrix.perspective(this.fovy * deg2rad, this.aspect, this.nearPlane, this.farPlane, reverse);
4102
+ this.projectionMatrix.perspective(this.fov * deg2rad, this.aspect, this.nearPlane, this.farPlane, reverse);
4009
4103
  this.viewMatrix = this.matrix.invert();
4010
4104
  };
4011
4105
  /**
@@ -4023,7 +4117,7 @@ var PCamera = /** @class */ (function (_super) {
4023
4117
  * @returns 视角中的包围盒
4024
4118
  */
4025
4119
  PCamera.prototype.computeViewAABB = function (box) {
4026
- var tanTheta = Math.tan(this.fovy * deg2rad * 0.5);
4120
+ var tanTheta = Math.tan(this.fov * deg2rad * 0.5);
4027
4121
  var aspect = this.aspect;
4028
4122
  var yFarCoord = 0;
4029
4123
  var yNearCoord = 0;
@@ -4093,11 +4187,13 @@ var PCameraManager = /** @class */ (function () {
4093
4187
  this.winHeight = 512;
4094
4188
  this.cameraList = [];
4095
4189
  this.defaultCamera = new PCamera('camera', 512, 512, {
4190
+ id: '0',
4191
+ dataType: 'camera',
4096
4192
  fov: 60,
4097
4193
  far: 1000,
4098
4194
  near: 0.001,
4099
- position: [0, 0, -1.5],
4100
4195
  clipMode: spec.CameraClipMode.portrait,
4196
+ item: { id: '0' },
4101
4197
  });
4102
4198
  }
4103
4199
  /**
@@ -4116,12 +4212,13 @@ var PCameraManager = /** @class */ (function () {
4116
4212
  };
4117
4213
  /**
4118
4214
  * 插入相机数据,创建新的相机对象
4119
- * @param inCamera - 相机数据
4120
- * @param owner - 所属的相机组件
4215
+ * @param name - 相机名称
4216
+ * @param data - 相机相关数据
4217
+ * @param owner - 相机所属组件
4121
4218
  * @returns 新的相机对象
4122
4219
  */
4123
- PCameraManager.prototype.insert = function (name, options, owner) {
4124
- var camera = new PCamera(name, this.winWidth, this.winHeight, options, owner);
4220
+ PCameraManager.prototype.insert = function (name, data, owner) {
4221
+ var camera = new PCamera(name, this.winWidth, this.winHeight, data, owner);
4125
4222
  this.cameraList.push(camera);
4126
4223
  return camera;
4127
4224
  };
@@ -4168,7 +4265,7 @@ var PCameraManager = /** @class */ (function () {
4168
4265
  * @param clipMode - 剪裁模式
4169
4266
  */
4170
4267
  PCameraManager.prototype.updateDefaultCamera = function (fovy, aspect, nearPlane, farPlane, position, rotation, clipMode) {
4171
- this.defaultCamera.fovy = fovy;
4268
+ this.defaultCamera.fov = fovy;
4172
4269
  this.defaultCamera.aspect = aspect;
4173
4270
  this.defaultCamera.nearPlane = nearPlane;
4174
4271
  this.defaultCamera.farPlane = farPlane;
@@ -4223,10 +4320,12 @@ var PLight = /** @class */ (function (_super) {
4223
4320
  __extends(PLight, _super);
4224
4321
  /**
4225
4322
  * 创建灯光对象
4226
- * @param light - 灯光参数
4227
- * @param ownerI - 所属灯光组件
4323
+ * @param name - 灯光名称
4324
+ * @param data - 灯光相关数据
4325
+ * @param owner - 所属灯光组件
4228
4326
  */
4229
- function PLight(name, options, owner) {
4327
+ function PLight(name, data, owner) {
4328
+ var _a, _b, _c, _d;
4230
4329
  var _this = _super.call(this) || this;
4231
4330
  /**
4232
4331
  * 方向,仅用于方向光和聚光灯
@@ -4266,20 +4365,20 @@ var PLight = /** @class */ (function (_super) {
4266
4365
  _this.outerConeAngle = 0;
4267
4366
  _this.innerConeAngle = 0;
4268
4367
  //
4269
- var pluginColor = PluginHelper.toPluginColor4(options.color);
4270
- _this.color = new Vector3(pluginColor[0], pluginColor[1], pluginColor[2]);
4271
- _this.intensity = options.intensity;
4272
- if (options.lightType === 'point') {
4368
+ var color = data.color;
4369
+ _this.color = new Vector3(color.r, color.g, color.b);
4370
+ _this.intensity = data.intensity;
4371
+ if (data.lightType === 'point') {
4273
4372
  _this.lightType = PLightType.point;
4274
- _this.range = options.range;
4373
+ _this.range = (_a = data.range) !== null && _a !== void 0 ? _a : -1;
4275
4374
  }
4276
- else if (options.lightType === 'spot') {
4375
+ else if (data.lightType === 'spot') {
4277
4376
  _this.lightType = PLightType.spot;
4278
- _this.range = options.range;
4279
- _this.outerConeAngle = options.outerConeAngle;
4280
- _this.innerConeAngle = options.innerConeAngle;
4377
+ _this.range = (_b = data.range) !== null && _b !== void 0 ? _b : -1;
4378
+ _this.outerConeAngle = (_c = data.outerConeAngle) !== null && _c !== void 0 ? _c : Math.PI;
4379
+ _this.innerConeAngle = (_d = data.innerConeAngle) !== null && _d !== void 0 ? _d : 0;
4281
4380
  }
4282
- else if (options.lightType === 'directional') {
4381
+ else if (data.lightType === 'directional') {
4283
4382
  _this.lightType = PLightType.directional;
4284
4383
  }
4285
4384
  else {
@@ -4595,12 +4694,12 @@ var PMesh = /** @class */ (function (_super) {
4595
4694
  * 构造函数,创建 Mesh 对象,并与所属组件和父元素相关联
4596
4695
  * @param engine - 引擎
4597
4696
  * @param name - 名称
4598
- * @param meshContent - Mesh 参数
4697
+ * @param meshData - Mesh 参数
4599
4698
  * @param owner - 所属的 Mesh 组件
4600
4699
  * @param parentId - 父元素索引
4601
4700
  * @param parent - 父元素
4602
4701
  */
4603
- function PMesh(engine, name, meshContent, owner, parentId, parent) {
4702
+ function PMesh(engine, name, meshData, owner, parentId, parent) {
4604
4703
  var _a;
4605
4704
  var _this = _super.call(this) || this;
4606
4705
  _this.engine = engine;
@@ -4636,7 +4735,7 @@ var PMesh = /** @class */ (function (_super) {
4636
4735
  * 是否销毁
4637
4736
  */
4638
4737
  _this.isDisposed = false;
4639
- var proxy = new EffectsMeshProxy(meshContent, parent);
4738
+ var proxy = new EffectsMeshProxy(meshData, parent);
4640
4739
  _this.name = name;
4641
4740
  _this.type = PObjectType.mesh;
4642
4741
  _this.visible = false;
@@ -4659,7 +4758,7 @@ var PMesh = /** @class */ (function (_super) {
4659
4758
  if (_this.primitives.length <= 0) {
4660
4759
  console.warn("No primitive inside mesh item ".concat(name));
4661
4760
  }
4662
- _this.boundingBox = _this.getItemBoundingBox(meshContent.interaction);
4761
+ _this.boundingBox = _this.getItemBoundingBox(meshData.interaction);
4663
4762
  return _this;
4664
4763
  }
4665
4764
  /**
@@ -4929,15 +5028,15 @@ var PPrimitive = /** @class */ (function () {
4929
5028
  }
4930
5029
  /**
4931
5030
  * 创建 Primitive 对象
4932
- * @param options - Primitive 参数
5031
+ * @param data - Primitive 参数
4933
5032
  * @param parent - 所属 Mesh 对象
4934
5033
  */
4935
- PPrimitive.prototype.create = function (options, parent) {
5034
+ PPrimitive.prototype.create = function (data, parent) {
4936
5035
  this.parent = parent;
4937
5036
  this.skin = parent.skin;
4938
5037
  this.morph = parent.morph;
4939
- this.setGeometry(options.geometry);
4940
- this.setMaterial(options.material);
5038
+ this.setGeometry(data.geometry);
5039
+ this.setMaterial(data.material);
4941
5040
  this.name = parent.name;
4942
5041
  this.effectsPriority = parent.priority;
4943
5042
  this.geometry.setHide(parent.hide);
@@ -4981,15 +5080,36 @@ var PPrimitive = /** @class */ (function () {
4981
5080
  //newSemantics["uView"] = 'VIEWINVERSE';
4982
5081
  newSemantics['u_ModelMatrix'] = 'MODEL';
4983
5082
  newSemantics['uEditorTransform'] = 'EDITOR_TRANSFORM';
4984
- var material = Material.create(this.engine, {
4985
- shader: {
5083
+ var material;
5084
+ var isWebGL2 = PGlobalState.getInstance().isWebGL2;
5085
+ if (this.material.material) {
5086
+ material = this.material.material;
5087
+ // @ts-expect-error
5088
+ material.uniformSemantics = newSemantics;
5089
+ var shader = new Shader(this.engine);
5090
+ shader.fromData({
5091
+ id: '10000000000000000000000000000000',
5092
+ dataType: 'Shader',
4986
5093
  vertex: this.material.vertexShaderCode,
4987
5094
  fragment: this.material.fragmentShaderCode,
4988
- shared: globalState.shaderShared,
4989
- },
4990
- uniformSemantics: newSemantics,
4991
- });
4992
- this.material.setMaterialStates(material);
5095
+ // @ts-expect-error
5096
+ glslVersion: isWebGL2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,
5097
+ });
5098
+ // @ts-expect-error
5099
+ material.shader = shader;
5100
+ this.material.setMaterialStates(material);
5101
+ }
5102
+ else {
5103
+ material = Material.create(this.engine, {
5104
+ shader: {
5105
+ vertex: this.material.vertexShaderCode,
5106
+ fragment: this.material.fragmentShaderCode,
5107
+ shared: globalState.shaderShared,
5108
+ glslVersion: isWebGL2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,
5109
+ },
5110
+ uniformSemantics: newSemantics,
5111
+ });
5112
+ }
4993
5113
  var mesh = Mesh.create(this.engine, {
4994
5114
  name: this.name,
4995
5115
  material: material,
@@ -5000,6 +5120,7 @@ var PPrimitive = /** @class */ (function () {
5000
5120
  this.effectsMesh.dispose();
5001
5121
  }
5002
5122
  this.effectsMesh = mesh;
5123
+ this.material.setMaterialStates(material);
5003
5124
  };
5004
5125
  PPrimitive.prototype.getFeatureList = function (lightCount, pbrPass, skybox) {
5005
5126
  var featureList = [];
@@ -5289,7 +5410,35 @@ var PPrimitive = /** @class */ (function () {
5289
5410
  this.geometry = val;
5290
5411
  }
5291
5412
  else {
5292
- this.geometry = new PGeometry(val);
5413
+ // FIXME: 临时兼容代码,后续要解决掉
5414
+ // @ts-expect-error
5415
+ var aNormal = val.attributes['aNormal'];
5416
+ // @ts-expect-error
5417
+ var aPos = val.attributes['aPos'];
5418
+ // @ts-expect-error
5419
+ var aUV = val.attributes['aUV'];
5420
+ if (aNormal && aPos && aUV) {
5421
+ var aNormalData = val.getAttributeData('aNormal');
5422
+ var aPosData = val.getAttributeData('aPos');
5423
+ var aUVData = val.getAttributeData('aUV');
5424
+ var newGeom = Geometry.create(val.engine, {
5425
+ attributes: {
5426
+ a_Position: __assign(__assign({}, aPos), { data: aPosData }),
5427
+ a_UV1: __assign(__assign({}, aUV), { data: aUVData }),
5428
+ a_Normal: __assign(__assign({}, aNormal), { data: aNormalData }),
5429
+ },
5430
+ // @ts-expect-error
5431
+ indices: { data: val.getIndexData() },
5432
+ // @ts-expect-error
5433
+ mode: val.mode,
5434
+ drawStart: val.getDrawStart(),
5435
+ drawCount: val.getDrawCount(),
5436
+ });
5437
+ this.geometry = new PGeometry(newGeom);
5438
+ }
5439
+ else {
5440
+ this.geometry = new PGeometry(val);
5441
+ }
5293
5442
  }
5294
5443
  };
5295
5444
  /**
@@ -5473,16 +5622,15 @@ var PGeometry = /** @class */ (function () {
5473
5622
  return PGeometry;
5474
5623
  }());
5475
5624
  var EffectsMeshProxy = /** @class */ (function () {
5476
- function EffectsMeshProxy(itemContent, parentItem) {
5477
- this.itemContent = itemContent;
5625
+ function EffectsMeshProxy(itemData, parentItem) {
5626
+ this.itemData = itemData;
5478
5627
  this.parentItem = parentItem;
5479
- this.options = itemContent.options;
5628
+ this.data = itemData;
5480
5629
  // Morph 对象创建,需要为每个 Primitive 中 Geometry 对象创建 Morph
5481
5630
  // 并且要求创建的 Morph 对象状态是相同的,否则就报错
5482
5631
  var isSuccess = true;
5483
5632
  var morphObj = new PMorph();
5484
- var meshOptions = itemContent.options;
5485
- var primitives = meshOptions.primitives;
5633
+ var _a = this.data, primitives = _a.primitives, morph = _a.morph;
5486
5634
  primitives.forEach(function (prim, idx) {
5487
5635
  if (idx === 0) {
5488
5636
  morphObj.create(prim.geometry);
@@ -5502,8 +5650,8 @@ var EffectsMeshProxy = /** @class */ (function () {
5502
5650
  });
5503
5651
  if (isSuccess) {
5504
5652
  // 设置初始权重数组
5505
- if (meshOptions.weights !== undefined) {
5506
- morphObj.initWeights(meshOptions.weights);
5653
+ if ((morph === null || morph === void 0 ? void 0 : morph.weights) !== undefined) {
5654
+ morphObj.initWeights(morph.weights);
5507
5655
  }
5508
5656
  this.morphObj = morphObj;
5509
5657
  }
@@ -5527,7 +5675,7 @@ var EffectsMeshProxy = /** @class */ (function () {
5527
5675
  return this.morphObj;
5528
5676
  };
5529
5677
  EffectsMeshProxy.prototype.isHide = function () {
5530
- return this.options.hide === true;
5678
+ return this.data.hide === true;
5531
5679
  };
5532
5680
  EffectsMeshProxy.prototype.getParentNode = function () {
5533
5681
  var _a;
@@ -5539,20 +5687,23 @@ var EffectsMeshProxy = /** @class */ (function () {
5539
5687
  return undefined;
5540
5688
  };
5541
5689
  EffectsMeshProxy.prototype.getParentIndex = function () {
5542
- var _a;
5543
- return (_a = this.options.parent) !== null && _a !== void 0 ? _a : -1;
5690
+ return -1;
5544
5691
  };
5545
5692
  EffectsMeshProxy.prototype.getPrimitives = function () {
5546
- return this.options.primitives;
5693
+ return this.data.primitives;
5547
5694
  };
5548
5695
  EffectsMeshProxy.prototype.getPrimitiveCount = function () {
5549
- return this.options.primitives.length;
5696
+ return this.data.primitives.length;
5550
5697
  };
5551
5698
  EffectsMeshProxy.prototype.hasSkin = function () {
5552
- return this.options.skin !== undefined;
5699
+ // FIXME: skin
5700
+ //return this.options.skin !== undefined;
5701
+ return false;
5553
5702
  };
5554
5703
  EffectsMeshProxy.prototype.getSkinOpts = function () {
5555
- return this.options.skin;
5704
+ // FIXME: skin
5705
+ //return this.options.skin;
5706
+ return;
5556
5707
  };
5557
5708
  EffectsMeshProxy.prototype.getSkinObj = function (engine) {
5558
5709
  var skin = this.getSkinOpts();
@@ -6019,6 +6170,28 @@ var ModelPlugin = /** @class */ (function (_super) {
6019
6170
  });
6020
6171
  });
6021
6172
  };
6173
+ ModelPlugin.precompile = function (compositions, renderer) {
6174
+ var isWebGL2 = renderer.engine.gpuCapability.level === 2;
6175
+ var context = {
6176
+ // @ts-expect-error
6177
+ material: {
6178
+ materialType: PMaterialType.pbr,
6179
+ },
6180
+ isWebGL2: isWebGL2,
6181
+ featureList: [],
6182
+ };
6183
+ var pbrShader = getPBRPassShaderCode(context);
6184
+ renderer.engine.addEffectsObjectData({
6185
+ // FIXME: 'unlit000000000000000000000000000',
6186
+ id: 'pbr00000000000000000000000000000',
6187
+ dataType: 'Shader',
6188
+ // @ts-expect-error
6189
+ fragment: pbrShader.fragmentShaderCode,
6190
+ vertex: pbrShader.vertexShaderCode,
6191
+ glslVersion: isWebGL2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,
6192
+ });
6193
+ return Promise.resolve();
6194
+ };
6022
6195
  /**
6023
6196
  * 创建 3D 场景管理器和缓存器
6024
6197
  * @param composition - 合成
@@ -6215,14 +6388,14 @@ var ModelPluginComponent = /** @class */ (function (_super) {
6215
6388
  var lightItemCount = 0;
6216
6389
  var items = (_b = (_a = this.item.composition) === null || _a === void 0 ? void 0 : _a.items) !== null && _b !== void 0 ? _b : [];
6217
6390
  items.forEach(function (item) {
6218
- if (item.type === spec.ItemType.light) {
6391
+ if (item.getComponent(ModelLightComponent)) {
6219
6392
  lightItemCount++;
6220
6393
  }
6221
6394
  });
6222
6395
  return lightItemCount;
6223
6396
  };
6224
6397
  ModelPluginComponent = __decorate([
6225
- effectsClass(ModelDataType.ModelPluginComponent)
6398
+ effectsClass(DataType.ModelPluginComponent)
6226
6399
  ], ModelPluginComponent);
6227
6400
  return ModelPluginComponent;
6228
6401
  }(ItemBehaviour));
@@ -6435,7 +6608,7 @@ var ModelTreeComponent = /** @class */ (function (_super) {
6435
6608
  }
6436
6609
  };
6437
6610
  ModelTreeComponent = __decorate([
6438
- effectsClass(ModelDataType.TreeComponent)
6611
+ effectsClass(DataType.TreeComponent)
6439
6612
  ], ModelTreeComponent);
6440
6613
  return ModelTreeComponent;
6441
6614
  }(ItemBehaviour));
@@ -6487,7 +6660,7 @@ var CameraGestureHandlerImp = /** @class */ (function () {
6487
6660
  CameraGestureHandlerImp.prototype.getItem = function () {
6488
6661
  var _this = this;
6489
6662
  var _a;
6490
- return (_a = this.composition.items) === null || _a === void 0 ? void 0 : _a.find(function (item) { return item.id === _this.getCurrentTarget(); });
6663
+ return (_a = this.composition.items) === null || _a === void 0 ? void 0 : _a.find(function (item) { return item.name === _this.getCurrentTarget(); });
6491
6664
  };
6492
6665
  CameraGestureHandlerImp.prototype.getCurrentTarget = function () {
6493
6666
  return this.startParams.target;
@@ -6859,18 +7032,9 @@ var CameraGestureHandlerImp = /** @class */ (function () {
6859
7032
 
6860
7033
  registerPlugin('tree', ModelTreePlugin, VFXItem, true);
6861
7034
  registerPlugin('model', ModelPlugin, VFXItem);
6862
- var version = "2.0.0-alpha.2";
7035
+ var version = "2.0.0-alpha.4";
6863
7036
  logger.info('plugin model version: ' + version);
6864
7037
 
6865
- var ModelDataType;
6866
- (function (ModelDataType) {
6867
- ModelDataType[ModelDataType["MeshComponent"] = 10000] = "MeshComponent";
6868
- ModelDataType[ModelDataType["SkyboxComponent"] = 10001] = "SkyboxComponent";
6869
- ModelDataType[ModelDataType["LightComponent"] = 10002] = "LightComponent";
6870
- ModelDataType[ModelDataType["CameraComponent"] = 10003] = "CameraComponent";
6871
- ModelDataType[ModelDataType["ModelPluginComponent"] = 10004] = "ModelPluginComponent";
6872
- ModelDataType[ModelDataType["TreeComponent"] = 10005] = "TreeComponent";
6873
- })(ModelDataType || (ModelDataType = {}));
6874
7038
  /**
6875
7039
  * 插件 Mesh 组件类,支持 3D Mesh 渲染能力
6876
7040
  * @since 2.0.0
@@ -6881,9 +7045,9 @@ var ModelDataType;
6881
7045
  /**
6882
7046
  * 构造函数,只保存传入参数,不在这里创建内部对象
6883
7047
  * @param engine - 引擎
6884
- * @param options - Mesh 参数
7048
+ * @param data - Mesh 参数
6885
7049
  */
6886
- function ModelMeshComponent(engine, options) {
7050
+ function ModelMeshComponent(engine, data) {
6887
7051
  var _this = _super.call(this, engine) || this;
6888
7052
  /**
6889
7053
  * 获取点击测试参数,根据元素包围盒进行相交测试,Mesh 对象会进行更加精确的点击测试
@@ -6938,8 +7102,8 @@ var ModelDataType;
6938
7102
  }
6939
7103
  }
6940
7104
  };
6941
- if (options) {
6942
- _this.fromData(options);
7105
+ if (data) {
7106
+ _this.fromData(data);
6943
7107
  }
6944
7108
  return _this;
6945
7109
  }
@@ -6991,22 +7155,20 @@ var ModelDataType;
6991
7155
  };
6992
7156
  /**
6993
7157
  * 反序列化,记录传入参数
6994
- * @param options - 组件参数
7158
+ * @param data - 组件参数
6995
7159
  */
6996
- ModelMeshComponent.prototype.fromData = function (options) {
6997
- _super.prototype.fromData.call(this, options);
6998
- this.options = options;
7160
+ ModelMeshComponent.prototype.fromData = function (data) {
7161
+ _super.prototype.fromData.call(this, data);
7162
+ this.data = data;
6999
7163
  };
7000
7164
  /**
7001
7165
  * 创建内部对象
7002
7166
  */
7003
7167
  ModelMeshComponent.prototype.createContent = function () {
7004
- if (this.options) {
7005
- var bounding = this.options.interaction;
7168
+ if (this.data) {
7169
+ var bounding = this.data.interaction;
7006
7170
  this.bounding = bounding && JSON.parse(JSON.stringify(bounding));
7007
- var meshOptions = this.options.options;
7008
- CheckerHelper.assertModelMeshOptions(meshOptions);
7009
- this.content = new PMesh(this.engine, this.item.name, this.options, this, this.item.parentId);
7171
+ this.content = new PMesh(this.engine, this.item.name, this.data, this, this.item.parentId);
7010
7172
  }
7011
7173
  };
7012
7174
  /**
@@ -7048,7 +7210,7 @@ var ModelDataType;
7048
7210
  }
7049
7211
  };
7050
7212
  ModelMeshComponent = __decorate([
7051
- effectsClass(ModelDataType.MeshComponent)
7213
+ effectsClass(DataType.MeshComponent)
7052
7214
  ], ModelMeshComponent);
7053
7215
  return ModelMeshComponent;
7054
7216
  })(RendererComponent));
@@ -7062,12 +7224,12 @@ var ModelDataType;
7062
7224
  /**
7063
7225
  * 构造函数,只保存传入参数,不在这里创建内部对象
7064
7226
  * @param engine - 引擎
7065
- * @param options - Mesh 参数
7227
+ * @param data - Mesh 参数
7066
7228
  */
7067
- function ModelSkyboxComponent(engine, options) {
7229
+ function ModelSkyboxComponent(engine, data) {
7068
7230
  var _this = _super.call(this, engine) || this;
7069
- if (options) {
7070
- _this.fromData(options);
7231
+ if (data) {
7232
+ _this.fromData(data);
7071
7233
  }
7072
7234
  return _this;
7073
7235
  }
@@ -7105,20 +7267,19 @@ var ModelDataType;
7105
7267
  };
7106
7268
  /**
7107
7269
  * 反序列化,记录传入参数
7108
- * @param options - 组件参数
7270
+ * @param data - 组件参数
7109
7271
  */
7110
- ModelSkyboxComponent.prototype.fromData = function (options) {
7111
- _super.prototype.fromData.call(this, options);
7112
- this.options = options;
7272
+ ModelSkyboxComponent.prototype.fromData = function (data) {
7273
+ _super.prototype.fromData.call(this, data);
7274
+ this.data = data;
7113
7275
  };
7114
7276
  /**
7115
7277
  * 创建内部对象
7116
7278
  */
7117
7279
  ModelSkyboxComponent.prototype.createContent = function () {
7118
- if (this.options) {
7119
- var skyboxOptions = this.options.options;
7120
- CheckerHelper.assertModelSkyboxOptions(skyboxOptions);
7121
- this.content = new PSkybox(this.item.name, skyboxOptions, this);
7280
+ if (this.data) {
7281
+ var skyboxData = this.data;
7282
+ this.content = new PSkybox(this.item.name, skyboxData, this);
7122
7283
  }
7123
7284
  };
7124
7285
  /**
@@ -7137,7 +7298,7 @@ var ModelDataType;
7137
7298
  return (_b = (_a = this.content) === null || _a === void 0 ? void 0 : _a.visible) !== null && _b !== void 0 ? _b : false;
7138
7299
  };
7139
7300
  ModelSkyboxComponent = __decorate([
7140
- effectsClass(ModelDataType.SkyboxComponent)
7301
+ effectsClass(DataType.SkyboxComponent)
7141
7302
  ], ModelSkyboxComponent);
7142
7303
  return ModelSkyboxComponent;
7143
7304
  })(RendererComponent));
@@ -7146,17 +7307,17 @@ var ModelDataType;
7146
7307
  * @since 2.0.0
7147
7308
  * @internal
7148
7309
  */
7149
- /** @class */ ((function (_super) {
7310
+ var ModelLightComponent = /** @class */ (function (_super) {
7150
7311
  __extends(ModelLightComponent, _super);
7151
7312
  /**
7152
7313
  * 构造函数,只保存传入参数,不在这里创建内部对象
7153
7314
  * @param engine - 引擎
7154
- * @param options - Mesh 参数
7315
+ * @param data - Mesh 参数
7155
7316
  */
7156
- function ModelLightComponent(engine, options) {
7317
+ function ModelLightComponent(engine, data) {
7157
7318
  var _this = _super.call(this, engine) || this;
7158
- if (options) {
7159
- _this.fromData(options);
7319
+ if (data) {
7320
+ _this.fromData(data);
7160
7321
  }
7161
7322
  return _this;
7162
7323
  }
@@ -7185,20 +7346,19 @@ var ModelDataType;
7185
7346
  };
7186
7347
  /**
7187
7348
  * 反序列化,记录传入参数
7188
- * @param options - 组件参数
7349
+ * @param data - 组件参数
7189
7350
  */
7190
- ModelLightComponent.prototype.fromData = function (options) {
7191
- _super.prototype.fromData.call(this, options);
7192
- this.options = options;
7351
+ ModelLightComponent.prototype.fromData = function (data) {
7352
+ _super.prototype.fromData.call(this, data);
7353
+ this.data = data;
7193
7354
  };
7194
7355
  /**
7195
7356
  * 创建内部对象
7196
7357
  */
7197
7358
  ModelLightComponent.prototype.createContent = function () {
7198
- if (this.options) {
7199
- var lightOptions = this.options.options;
7200
- CheckerHelper.assertModelLightOptions(lightOptions);
7201
- this.content = new PLight(this.item.name, lightOptions, this);
7359
+ if (this.data) {
7360
+ var lightData = this.data;
7361
+ this.content = new PLight(this.item.name, lightData, this);
7202
7362
  }
7203
7363
  };
7204
7364
  /**
@@ -7217,10 +7377,10 @@ var ModelDataType;
7217
7377
  return (_b = (_a = this.content) === null || _a === void 0 ? void 0 : _a.visible) !== null && _b !== void 0 ? _b : false;
7218
7378
  };
7219
7379
  ModelLightComponent = __decorate([
7220
- effectsClass(ModelDataType.LightComponent)
7380
+ effectsClass(DataType.LightComponent)
7221
7381
  ], ModelLightComponent);
7222
7382
  return ModelLightComponent;
7223
- })(ItemBehaviour));
7383
+ }(ItemBehaviour));
7224
7384
  /**
7225
7385
  * 插件相机组件类,支持 3D 相机能力
7226
7386
  * @since 2.0.0
@@ -7231,12 +7391,12 @@ var ModelCameraComponent = /** @class */ (function (_super) {
7231
7391
  /**
7232
7392
  * 构造函数,只保存传入参数,不在这里创建内部对象
7233
7393
  * @param engine - 引擎
7234
- * @param options - Mesh 参数
7394
+ * @param data - Mesh 参数
7235
7395
  */
7236
- function ModelCameraComponent(engine, options) {
7396
+ function ModelCameraComponent(engine, data) {
7237
7397
  var _this = _super.call(this, engine) || this;
7238
- if (options) {
7239
- _this.fromData(options);
7398
+ if (data) {
7399
+ _this.fromData(data);
7240
7400
  }
7241
7401
  return _this;
7242
7402
  }
@@ -7266,22 +7426,21 @@ var ModelCameraComponent = /** @class */ (function (_super) {
7266
7426
  };
7267
7427
  /**
7268
7428
  * 反序列化,记录传入参数
7269
- * @param options - 组件参数
7429
+ * @param data - 组件参数
7270
7430
  */
7271
- ModelCameraComponent.prototype.fromData = function (options) {
7272
- _super.prototype.fromData.call(this, options);
7273
- this.options = options;
7431
+ ModelCameraComponent.prototype.fromData = function (data) {
7432
+ _super.prototype.fromData.call(this, data);
7433
+ this.data = data;
7274
7434
  };
7275
7435
  /**
7276
7436
  * 创建内部对象
7277
7437
  */
7278
7438
  ModelCameraComponent.prototype.createContent = function () {
7279
- if (this.options) {
7280
- var cameraOptions = this.options.options;
7281
- CheckerHelper.assertModelCameraOptions(cameraOptions);
7439
+ if (this.data) {
7440
+ var cameraData = this.data;
7282
7441
  var width = this.engine.renderer.getWidth();
7283
7442
  var height = this.engine.renderer.getHeight();
7284
- this.content = new PCamera(this.item.name, width, height, cameraOptions, this);
7443
+ this.content = new PCamera(this.item.name, width, height, cameraData, this);
7285
7444
  }
7286
7445
  };
7287
7446
  /**
@@ -7295,7 +7454,7 @@ var ModelCameraComponent = /** @class */ (function (_super) {
7295
7454
  composition.camera.setQuat(this.transform.quat);
7296
7455
  composition.camera.near = this.content.nearPlane;
7297
7456
  composition.camera.far = this.content.farPlane;
7298
- composition.camera.fov = this.content.fovy;
7457
+ composition.camera.fov = this.content.fov;
7299
7458
  }
7300
7459
  };
7301
7460
  /**
@@ -7321,7 +7480,7 @@ var ModelCameraComponent = /** @class */ (function (_super) {
7321
7480
  this.updateMainCamera();
7322
7481
  };
7323
7482
  ModelCameraComponent = __decorate([
7324
- effectsClass(ModelDataType.CameraComponent)
7483
+ effectsClass(DataType.CameraComponent)
7325
7484
  ], ModelCameraComponent);
7326
7485
  return ModelCameraComponent;
7327
7486
  }(ItemBehaviour));
@@ -7932,11 +8091,13 @@ var MeshHelper = /** @class */ (function () {
7932
8091
  var vertexShader = material.vertexShaderCode;
7933
8092
  var fragmentShader = material.fragmentShaderCode;
7934
8093
  var geometry = Geometry.create(engine, MeshHelper.getPlaneGeometry());
8094
+ var isWebGL2 = engine.gpuCapability.level === 2;
7935
8095
  var effectsMaterial = Material.create(engine, {
7936
8096
  shader: {
7937
8097
  vertex: vertexShader,
7938
8098
  fragment: fragmentShader,
7939
8099
  shared: globalState.shaderShared,
8100
+ glslVersion: isWebGL2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,
7940
8101
  },
7941
8102
  uniformSemantics: uniformSemantics,
7942
8103
  });
@@ -10643,7 +10804,7 @@ var LoaderImpl = /** @class */ (function () {
10643
10804
  name: 'skybox',
10644
10805
  duration: this.getItemDuration(),
10645
10806
  endBehavior: this.getItemEndBehavior(),
10646
- type: 'skybox',
10807
+ type: spec.ItemType.skybox,
10647
10808
  pluginName: 'model',
10648
10809
  content: {
10649
10810
  options: this._skyboxOptions,