@galacean/effects-plugin-model 2.10.0-alpha.1 → 2.10.0-alpha.2

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/index.js CHANGED
@@ -3,7 +3,7 @@
3
3
  * Description: Galacean Effects player model plugin
4
4
  * Author: Ant Group CO., Ltd.
5
5
  * Contributors: 飂兮
6
- * Version: v2.10.0-alpha.1
6
+ * Version: v2.10.0-alpha.2
7
7
  */
8
8
 
9
9
  'use strict';
@@ -1460,16 +1460,15 @@ function GetNum2GLName(ctx) {
1460
1460
  3,
1461
1461
  7
1462
1462
  ]);
1463
+ var _obj;
1463
1464
  return {
1464
- attributes: {
1465
- aPos: {
1466
- type: EFFECTS.glContext.FLOAT,
1467
- size: 1,
1468
- data: data,
1469
- stride: Float32Array.BYTES_PER_ELEMENT,
1470
- offset: 0
1471
- }
1472
- },
1465
+ attributes: (_obj = {}, _obj[EFFECTS.VertexBuffer.PositionKind] = {
1466
+ type: EFFECTS.glContext.FLOAT,
1467
+ size: 1,
1468
+ data: data,
1469
+ stride: Float32Array.BYTES_PER_ELEMENT,
1470
+ offset: 0
1471
+ }, _obj),
1473
1472
  mode: EFFECTS.glContext.LINES,
1474
1473
  indices: {
1475
1474
  data: index
@@ -3157,30 +3156,27 @@ var normal = new Vector3();
3157
3156
  * @returns 几何参数
3158
3157
  */ MeshHelper.getPlaneGeometry = function getPlaneGeometry() {
3159
3158
  var data = MeshHelper.getPlaneVertexArray();
3159
+ var _obj;
3160
3160
  return {
3161
- attributes: {
3162
- aPos: {
3163
- type: EFFECTS.glContext.FLOAT,
3164
- size: 3,
3165
- data: data,
3166
- stride: Float32Array.BYTES_PER_ELEMENT * 8,
3167
- offset: 0
3168
- },
3169
- aUV: {
3170
- type: EFFECTS.glContext.FLOAT,
3171
- size: 2,
3172
- stride: Float32Array.BYTES_PER_ELEMENT * 8,
3173
- offset: Float32Array.BYTES_PER_ELEMENT * 3,
3174
- dataSource: "aPos"
3175
- },
3176
- aNormal: {
3177
- type: EFFECTS.glContext.FLOAT,
3178
- size: 3,
3179
- stride: Float32Array.BYTES_PER_ELEMENT * 8,
3180
- offset: Float32Array.BYTES_PER_ELEMENT * 5,
3181
- dataSource: "aPos"
3182
- }
3183
- },
3161
+ attributes: (_obj = {}, _obj[EFFECTS.VertexBuffer.PositionKind] = {
3162
+ type: EFFECTS.glContext.FLOAT,
3163
+ size: 3,
3164
+ data: data,
3165
+ stride: Float32Array.BYTES_PER_ELEMENT * 8,
3166
+ offset: 0
3167
+ }, _obj[EFFECTS.VertexBuffer.UVKind] = {
3168
+ type: EFFECTS.glContext.FLOAT,
3169
+ size: 2,
3170
+ stride: Float32Array.BYTES_PER_ELEMENT * 8,
3171
+ offset: Float32Array.BYTES_PER_ELEMENT * 3,
3172
+ dataSource: EFFECTS.VertexBuffer.PositionKind
3173
+ }, _obj[EFFECTS.VertexBuffer.NormalKind] = {
3174
+ type: EFFECTS.glContext.FLOAT,
3175
+ size: 3,
3176
+ stride: Float32Array.BYTES_PER_ELEMENT * 8,
3177
+ offset: Float32Array.BYTES_PER_ELEMENT * 5,
3178
+ dataSource: EFFECTS.VertexBuffer.PositionKind
3179
+ }, _obj),
3184
3180
  drawStart: 0,
3185
3181
  drawCount: data.length / 8
3186
3182
  };
@@ -3607,19 +3603,19 @@ var normal = new Vector3();
3607
3603
  */ PluginHelper.getAttributeName = function getAttributeName(name) {
3608
3604
  switch(name){
3609
3605
  case "POSITION":
3610
- return "aPos";
3606
+ return EFFECTS.VertexBuffer.PositionKind;
3611
3607
  case "NORMAL":
3612
- return "aNormal";
3608
+ return EFFECTS.VertexBuffer.NormalKind;
3613
3609
  case "TANGENT":
3614
- return "aTangent";
3610
+ return EFFECTS.VertexBuffer.TangentKind;
3615
3611
  case "TEXCOORD_0":
3616
- return "aUV";
3612
+ return EFFECTS.VertexBuffer.UVKind;
3617
3613
  case "TEXCOORD_1":
3618
- return "aUV2";
3614
+ return EFFECTS.VertexBuffer.UV2Kind;
3619
3615
  case "JOINTS_0":
3620
- return "aJoints";
3616
+ return EFFECTS.VertexBuffer.JointsKind;
3621
3617
  case "WEIGHTS_0":
3622
- return "aWeights";
3618
+ return EFFECTS.VertexBuffer.WeightsKind;
3623
3619
  }
3624
3620
  if (!name.startsWith("a")) {
3625
3621
  // aPos, aNormal, aTangent,
@@ -4011,21 +4007,18 @@ var AttributeArray = /*#__PURE__*/ function() {
4011
4007
  */ _proto.create = function create(geometry, bindMatrices) {
4012
4008
  this.drawStart = 0;
4013
4009
  this.drawCount = Math.abs(geometry.getDrawCount());
4014
- // FIXME: 需要geometry中的attributes数组,GLGeometry有这个数组,其他的没有
4015
- // @ts-expect-error
4016
- var attributes = geometry.attributes;
4017
4010
  //
4018
4011
  this.index = geometry.getIndexData();
4019
- var positionAttrib = attributes["aPos"];
4020
- var positionArray = geometry.getAttributeData("aPos");
4012
+ var positionAttrib = getAttributeLayout(geometry.getVertexBuffer(EFFECTS.VertexBuffer.PositionKind));
4013
+ var positionArray = geometry.getAttributeData(EFFECTS.VertexBuffer.PositionKind);
4021
4014
  this.position = new AttributeArray();
4022
4015
  this.position.create(positionAttrib, positionArray);
4023
4016
  //
4024
- var jointAttrib = attributes["aJoints"];
4025
- var weightAttrib = attributes["aWeights"];
4017
+ var jointAttrib = getAttributeLayout(geometry.getVertexBuffer(EFFECTS.VertexBuffer.JointsKind));
4018
+ var weightAttrib = getAttributeLayout(geometry.getVertexBuffer(EFFECTS.VertexBuffer.WeightsKind));
4026
4019
  if (jointAttrib !== undefined && weightAttrib !== undefined) {
4027
- var jointArray = geometry.getAttributeData("aJoints");
4028
- var weightArray = geometry.getAttributeData("aWeights");
4020
+ var jointArray = geometry.getAttributeData(EFFECTS.VertexBuffer.JointsKind);
4021
+ var weightArray = geometry.getAttributeData(EFFECTS.VertexBuffer.WeightsKind);
4029
4022
  this.joint = new AttributeArray();
4030
4023
  this.joint.create(jointAttrib, jointArray);
4031
4024
  this.weight = new AttributeArray();
@@ -4125,21 +4118,18 @@ var AttributeArray = /*#__PURE__*/ function() {
4125
4118
  */ _proto.create = function create(geometry, doubleSided, bindMatrices) {
4126
4119
  this.drawStart = 0;
4127
4120
  this.drawCount = Math.abs(geometry.getDrawCount());
4128
- // FIXME: 需要geometry中的attributes数组,GLGeometry有这个数组,其他的没有
4129
- // @ts-expect-error
4130
- var attributes = geometry.attributes;
4131
4121
  //
4132
4122
  this.index = geometry.getIndexData();
4133
- var positionAttrib = attributes["aPos"];
4134
- var positionArray = geometry.getAttributeData("aPos");
4123
+ var positionAttrib = getAttributeLayout(geometry.getVertexBuffer(EFFECTS.VertexBuffer.PositionKind));
4124
+ var positionArray = geometry.getAttributeData(EFFECTS.VertexBuffer.PositionKind);
4135
4125
  this.position = new AttributeArray();
4136
4126
  this.position.create(positionAttrib, positionArray);
4137
4127
  //
4138
- var jointAttrib = attributes["aJoints"];
4139
- var weightAttrib = attributes["aWeights"];
4128
+ var jointAttrib = getAttributeLayout(geometry.getVertexBuffer(EFFECTS.VertexBuffer.JointsKind));
4129
+ var weightAttrib = getAttributeLayout(geometry.getVertexBuffer(EFFECTS.VertexBuffer.WeightsKind));
4140
4130
  if (jointAttrib !== undefined && weightAttrib !== undefined) {
4141
- var jointArray = geometry.getAttributeData("aJoints");
4142
- var weightArray = geometry.getAttributeData("aWeights");
4131
+ var jointArray = geometry.getAttributeData(EFFECTS.VertexBuffer.JointsKind);
4132
+ var weightArray = geometry.getAttributeData(EFFECTS.VertexBuffer.WeightsKind);
4143
4133
  this.joint = new AttributeArray();
4144
4134
  this.joint.create(jointAttrib, jointArray);
4145
4135
  this.weight = new AttributeArray();
@@ -4528,8 +4518,7 @@ var AttributeArray = /*#__PURE__*/ function() {
4528
4518
  if (!_instanceof1(v, EFFECTS.Geometry)) {
4529
4519
  console.error("Invalid geometry type " + this.stringify(v) + ".");
4530
4520
  }
4531
- // @ts-expect-error
4532
- if (v.isDestroyed === true) {
4521
+ if (v.isDisposed()) {
4533
4522
  console.error("Geometry object is destroyed.");
4534
4523
  }
4535
4524
  if (!this.checkNonnegative(v.getDrawStart())) {
@@ -4602,12 +4591,7 @@ var AttributeArray = /*#__PURE__*/ function() {
4602
4591
  * @param name - 名称
4603
4592
  * @returns
4604
4593
  */ CheckerHelper.createAttributeArray = function createAttributeArray(v, name) {
4605
- // @ts-expect-error
4606
- var attributes = v.attributes;
4607
- if (attributes === undefined) {
4608
- return;
4609
- }
4610
- var dataAttrib = attributes[name];
4594
+ var dataAttrib = getAttributeLayout(v.getVertexBuffer(name));
4611
4595
  if (dataAttrib === undefined) {
4612
4596
  return;
4613
4597
  }
@@ -5078,6 +5062,18 @@ var AttributeArray = /*#__PURE__*/ function() {
5078
5062
  };
5079
5063
  return CheckerHelper;
5080
5064
  }();
5065
+ function getAttributeLayout(vertexBuffer) {
5066
+ if (!vertexBuffer) {
5067
+ return;
5068
+ }
5069
+ return {
5070
+ type: vertexBuffer.type,
5071
+ size: vertexBuffer.getSize(),
5072
+ offset: vertexBuffer.byteOffset,
5073
+ stride: vertexBuffer.byteStride,
5074
+ normalize: vertexBuffer.normalized
5075
+ };
5076
+ }
5081
5077
  /**
5082
5078
  * 半精度浮点数组类
5083
5079
  */ var Float16ArrayWrapper = /*#__PURE__*/ function() {
@@ -7247,7 +7243,10 @@ exports.PSkyboxType = void 0;
7247
7243
  this.loadSkybox = loadSkybox;
7248
7244
  if (this.brdfLutTexture === undefined || this.brdfLutTexture.isDestroyed) {
7249
7245
  if (CompositionCache.brdfLutTexOptions === undefined) {
7250
- throw new Error("Please load brdfLutTexOptions at first.");
7246
+ // A Composition can be created and played directly without going through
7247
+ // the player's asynchronous asset-loading lifecycle. In that case the
7248
+ // optional BRDF LUT is not ready yet, but non-PBR content can still run.
7249
+ return;
7251
7250
  }
7252
7251
  //
7253
7252
  var brdfLutTextureName = "brdfLutTexture";
@@ -7881,6 +7880,14 @@ function _assert_this_initialized(self) {
7881
7880
  return self;
7882
7881
  }
7883
7882
 
7883
+ var uvKinds = [
7884
+ EFFECTS.VertexBuffer.UVKind,
7885
+ EFFECTS.VertexBuffer.UV2Kind,
7886
+ EFFECTS.VertexBuffer.UV3Kind,
7887
+ EFFECTS.VertexBuffer.UV4Kind,
7888
+ EFFECTS.VertexBuffer.UV5Kind,
7889
+ EFFECTS.VertexBuffer.UV6Kind
7890
+ ];
7884
7891
  /**
7885
7892
  * Mesh 类,负责 Mesh 相关的骨骼动画和 PBR 渲染
7886
7893
  */ var PMesh = /*#__PURE__*/ function(PEntity) {
@@ -8790,7 +8797,7 @@ function _assert_this_initialized(self) {
8790
8797
  * 是否压缩格式
8791
8798
  * @returns
8792
8799
  */ _proto.isCompressed = function isCompressed() {
8793
- var positionAttrib = this.geometry.getAttributeData("aPos");
8800
+ var positionAttrib = this.geometry.getAttributeData(EFFECTS.VertexBuffer.PositionKind);
8794
8801
  if (positionAttrib === undefined) {
8795
8802
  return false;
8796
8803
  }
@@ -8802,48 +8809,45 @@ function _assert_this_initialized(self) {
8802
8809
  * 是否有位置属性
8803
8810
  * @returns
8804
8811
  */ _proto.hasPositions = function hasPositions() {
8805
- return this.hasAttribute("aPos");
8812
+ return this.hasAttribute(EFFECTS.VertexBuffer.PositionKind);
8806
8813
  };
8807
8814
  /**
8808
8815
  * 是否有法线属性
8809
8816
  * @returns
8810
8817
  */ _proto.hasNormals = function hasNormals() {
8811
- return this.hasAttribute("aNormal");
8818
+ return this.hasAttribute(EFFECTS.VertexBuffer.NormalKind);
8812
8819
  };
8813
8820
  /**
8814
8821
  * 是否有切线属性
8815
8822
  * @returns
8816
8823
  */ _proto.hasTangents = function hasTangents() {
8817
- return this.hasAttribute("aTangent");
8824
+ return this.hasAttribute(EFFECTS.VertexBuffer.TangentKind);
8818
8825
  };
8819
8826
  /**
8820
8827
  * 是否有纹理坐标属性
8821
8828
  * @param index - 纹理坐标索引
8822
8829
  * @returns
8823
8830
  */ _proto.hasUVCoords = function hasUVCoords(index) {
8824
- if (index === 1) {
8825
- return this.hasAttribute("aUV");
8826
- } else {
8827
- return this.hasAttribute("aUV" + index);
8828
- }
8831
+ var kind = uvKinds[index - 1];
8832
+ return kind !== undefined && this.hasAttribute(kind);
8829
8833
  };
8830
8834
  /**
8831
8835
  * 是否有颜色属性
8832
8836
  * @returns
8833
8837
  */ _proto.hasColors = function hasColors() {
8834
- return this.hasAttribute("aColor");
8838
+ return this.hasAttribute(EFFECTS.VertexBuffer.ColorKind);
8835
8839
  };
8836
8840
  /**
8837
8841
  * 是否有关节点属性
8838
8842
  * @returns
8839
8843
  */ _proto.hasJoints = function hasJoints() {
8840
- return this.hasAttribute("aJoints");
8844
+ return this.hasAttribute(EFFECTS.VertexBuffer.JointsKind);
8841
8845
  };
8842
8846
  /**
8843
8847
  * 是否有权重属性
8844
8848
  * @returns
8845
8849
  */ _proto.hasWeights = function hasWeights() {
8846
- return this.hasAttribute("aWeights");
8850
+ return this.hasAttribute(EFFECTS.VertexBuffer.WeightsKind);
8847
8851
  };
8848
8852
  return PGeometry;
8849
8853
  }();
@@ -10478,8 +10482,9 @@ var JSONConverter = /*#__PURE__*/ function() {
10478
10482
  var _geomProps_indices;
10479
10483
  var geomProps = deserializeGeometry(prim.geometry, oldScene.bins);
10480
10484
  var material = _this.getMaterialData(prim.material, oldScene);
10481
- if (_instanceof1((_geomProps_indices = geomProps.indices) == null ? void 0 : _geomProps_indices.data, Uint8Array)) {
10482
- var oldIndices = geomProps.indices.data;
10485
+ var indexData = (_geomProps_indices = geomProps.indices) == null ? void 0 : _geomProps_indices.data;
10486
+ if (_instanceof1(indexData, Uint8Array)) {
10487
+ var oldIndices = indexData;
10483
10488
  var newIndices = new Uint16Array(oldIndices.length);
10484
10489
  for(var i = 0; i < oldIndices.length; i++){
10485
10490
  newIndices[i] = oldIndices[i];
@@ -11136,7 +11141,7 @@ function getGeometryDataFromOptions(geomOptions) {
11136
11141
  verticesNormalize = (_attribData_normalize = attribData.normalize) != null ? _attribData_normalize : false;
11137
11142
  var _attribData_type;
11138
11143
  verticesType = EFFECTS.glType2VertexFormatType((_attribData_type = attribData.type) != null ? _attribData_type : EFFECTS.glContext.FLOAT);
11139
- } else if (attrib === "aNormal") {
11144
+ } else if (attrib === EFFECTS.VertexBuffer.NormalKind) {
11140
11145
  // @ts-expect-error
11141
11146
  modelData.normals = attribData.data;
11142
11147
  var _attribData_normalize1;
@@ -11451,45 +11456,10 @@ function mergeTypedArray(array1, array2, offset) {
11451
11456
  return result6;
11452
11457
  }
11453
11458
  }
11454
- var vertexBufferSemanticMap = {
11455
- aPos: "POSITION",
11456
- aUV: "TEXCOORD0",
11457
- aUV2: "TEXCOORD1",
11458
- aNormal: "NORMAL",
11459
- aTangent: "TANGENT",
11460
- aColor: "COLOR",
11461
- aJoints: "JOINTS",
11462
- aWeights: "WEIGHTS",
11463
- //
11464
- a_Position: "POSITION",
11465
- a_UV: "TEXCOORD0",
11466
- a_UV1: "TEXCOORD0",
11467
- a_UV2: "TEXCOORD1",
11468
- a_Normal: "NORMAL",
11469
- a_Tangent: "TANGENT",
11470
- a_Color: "COLOR",
11471
- a_Joints: "JOINTS",
11472
- a_Joint1: "JOINTS",
11473
- a_Weights: "WEIGHTS",
11474
- a_Weight1: "WEIGHTS",
11475
- //
11476
- a_Target_Position0: "POSITION_BS0",
11477
- a_Target_Position1: "POSITION_BS1",
11478
- a_Target_Position2: "POSITION_BS2",
11479
- a_Target_Position3: "POSITION_BS3",
11480
- a_Target_Position4: "POSITION_BS4",
11481
- a_Target_Position5: "POSITION_BS5",
11482
- a_Target_Position6: "POSITION_BS6",
11483
- a_Target_Position7: "POSITION_BS7",
11484
- a_Target_Normal0: "NORMAL_BS0",
11485
- a_Target_Normal1: "NORMAL_BS1",
11486
- a_Target_Normal2: "NORMAL_BS2",
11487
- a_Target_Normal3: "NORMAL_BS3",
11488
- a_Target_Tangent0: "TANGENT_BS0",
11489
- a_Target_Tangent1: "TANGENT_BS1",
11490
- a_Target_Tangent2: "TANGENT_BS2",
11491
- a_Target_Tangent3: "TANGENT_BS3"
11492
- };
11459
+ var _obj;
11460
+ var vertexBufferSemanticMap = (_obj = {}, _obj[EFFECTS.VertexBuffer.PositionKind] = "POSITION", _obj[EFFECTS.VertexBuffer.UVKind] = "TEXCOORD0", _obj[EFFECTS.VertexBuffer.UV2Kind] = "TEXCOORD1", _obj[EFFECTS.VertexBuffer.NormalKind] = "NORMAL", _obj[EFFECTS.VertexBuffer.TangentKind] = "TANGENT", _obj[EFFECTS.VertexBuffer.ColorKind] = "COLOR", _obj[EFFECTS.VertexBuffer.JointsKind] = "JOINTS", _obj[EFFECTS.VertexBuffer.WeightsKind] = "WEIGHTS", //
11461
+ _obj.a_Position = "POSITION", _obj.a_UV = "TEXCOORD0", _obj.a_UV1 = "TEXCOORD0", _obj.a_UV2 = "TEXCOORD1", _obj.a_Normal = "NORMAL", _obj.a_Tangent = "TANGENT", _obj.a_Color = "COLOR", _obj.a_Joints = "JOINTS", _obj.a_Joint1 = "JOINTS", _obj.a_Weights = "WEIGHTS", _obj.a_Weight1 = "WEIGHTS", //
11462
+ _obj.a_Target_Position0 = "POSITION_BS0", _obj.a_Target_Position1 = "POSITION_BS1", _obj.a_Target_Position2 = "POSITION_BS2", _obj.a_Target_Position3 = "POSITION_BS3", _obj.a_Target_Position4 = "POSITION_BS4", _obj.a_Target_Position5 = "POSITION_BS5", _obj.a_Target_Position6 = "POSITION_BS6", _obj.a_Target_Position7 = "POSITION_BS7", _obj.a_Target_Normal0 = "NORMAL_BS0", _obj.a_Target_Normal1 = "NORMAL_BS1", _obj.a_Target_Normal2 = "NORMAL_BS2", _obj.a_Target_Normal3 = "NORMAL_BS3", _obj.a_Target_Tangent0 = "TANGENT_BS0", _obj.a_Target_Tangent1 = "TANGENT_BS1", _obj.a_Target_Tangent2 = "TANGENT_BS2", _obj.a_Target_Tangent3 = "TANGENT_BS3", _obj);
11493
11463
 
11494
11464
  function getDefaultEffectsGLTFLoader(engine, options) {
11495
11465
  if (!defaultGLTFLoader) {
@@ -12374,8 +12344,8 @@ var LoaderImpl = /*#__PURE__*/ function() {
12374
12344
  return false;
12375
12345
  }
12376
12346
  };
12377
- /**
12378
- * for old scene compatibility
12347
+ /**
12348
+ * for old scene compatibility
12379
12349
  */ _proto.processLight = function processLight(lights, fromGLTF) {
12380
12350
  var _this = this;
12381
12351
  lights.forEach(function(l) {
@@ -12749,8 +12719,8 @@ var GeometryProxy = /*#__PURE__*/ function() {
12749
12719
  attributes["a_Weight1"] = this._getBufferAttrib(weightAttrib);
12750
12720
  }
12751
12721
  }
12752
- /**
12753
- * 设置Morph动画需要的Attribute,主要包括Position,Normal和Tangent
12722
+ /**
12723
+ * 设置Morph动画需要的Attribute,主要包括Position,Normal和Tangent
12754
12724
  */ for(var i = 0; i < 8; i++){
12755
12725
  var positionAttrib = this.getTargetPosition(i);
12756
12726
  if (positionAttrib !== undefined) {
@@ -12767,13 +12737,14 @@ var GeometryProxy = /*#__PURE__*/ function() {
12767
12737
  }
12768
12738
  var indexArray = this.indexArray;
12769
12739
  if (indexArray !== undefined) {
12740
+ var indices = _instanceof1(indexArray, Uint8Array) ? new Uint16Array(indexArray) : indexArray;
12770
12741
  return EFFECTS.Geometry.create(this.engine, {
12771
12742
  attributes: attributes,
12772
12743
  indices: {
12773
- data: indexArray
12744
+ data: indices
12774
12745
  },
12775
12746
  drawStart: 0,
12776
- drawCount: indexArray.length,
12747
+ drawCount: indices.length,
12777
12748
  mode: EFFECTS.glContext.TRIANGLES
12778
12749
  });
12779
12750
  } else {
@@ -13215,7 +13186,7 @@ var GLTFHelper = /*#__PURE__*/ function() {
13215
13186
  EFFECTS.registerPlugin("model", ModelPlugin);
13216
13187
  /**
13217
13188
  * 插件版本号
13218
- */ var version = "2.10.0-alpha.1";
13189
+ */ var version = "2.10.0-alpha.2";
13219
13190
  EFFECTS.logger.info("Plugin model version: " + version + ".");
13220
13191
  if (version !== EFFECTS__namespace.version) {
13221
13192
  console.error("注意:请统一 Model 插件与 Player 版本,不统一的版本混用会有不可预知的后果!", "\nAttention: Please ensure the Model plugin is synchronized with the Player version. Mixing and matching incompatible versions may result in unpredictable consequences!");