| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022 |
- /**
- * The MIT License (MIT)
- *
- * Copyright (c) 2012-2017 DragonBones team and other contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
- /**
- * The MIT License (MIT)
- *
- * Copyright (c) 2012-2017 DragonBones team and other contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
- using UnityEngine;
- using System.Collections.Generic;
- namespace DragonBones
- {
- /**
- * @language zh_CN
- * Unity 插槽。
- * @version DragonBones 3.0
- */
- public class UnitySlot : Slot
- {
- internal const float Z_OFFSET = 0.001f;
- private static readonly int[] TRIANGLES = { 0, 1, 2, 0, 2, 3 };
- private static Vector3 _helpVector3 = new Vector3();
- internal GameObject _renderDisplay;
- internal UnityUGUIDisplay _uiDisplay = null;
- internal MeshBuffer _meshBuffer;
- internal MeshRenderer _meshRenderer = null;
- internal MeshFilter _meshFilter = null;
- //combineMesh
- internal bool _isIgnoreCombineMesh;
- internal bool _isCombineMesh;
- internal int _sumMeshIndex = -1;
- internal int _verticeOrder = -1;
- internal int _verticeOffset = -1;
- internal UnityCombineMeshs _combineMesh = null;
- internal bool _isActive = false;
- private bool _skewed;
- private UnityArmatureComponent _proxy;
- private BlendMode _currentBlendMode;
- /**
- * @private
- */
- public UnitySlot()
- {
- }
- /**
- * @private
- */
- protected override void _OnClear()
- {
- base._OnClear();
- if (this._meshBuffer != null)
- {
- this._meshBuffer.Dispose();
- }
- this._skewed = false;
- this._proxy = null;
- this._renderDisplay = null;
- this._uiDisplay = null;
- this._meshBuffer = null;
- this._meshRenderer = null;
- this._meshFilter = null;
- this._isIgnoreCombineMesh = false;
- this._isCombineMesh = false;
- this._sumMeshIndex = -1;
- this._verticeOrder = -1;
- this._verticeOffset = -1;
- this._combineMesh = null;
- this._currentBlendMode = BlendMode.Normal;
- this._isActive = false;
- }
- /**
- * @private
- */
- protected override void _InitDisplay(object value, bool isRetain)
- {
- }
- /**
- * @private
- */
- protected override void _DisposeDisplay(object value, bool isRelease)
- {
- if (!isRelease)
- {
- UnityFactoryHelper.DestroyUnityObject(value as GameObject);
- }
- }
- /**
- * @private
- */
- protected override void _OnUpdateDisplay()
- {
- _renderDisplay = (_display != null ? _display : _rawDisplay) as GameObject;
- //
- _proxy = _armature.proxy as UnityArmatureComponent;
- if (_proxy.isUGUI)
- {
- _uiDisplay = _renderDisplay.GetComponent<UnityUGUIDisplay>();
- if (_uiDisplay == null)
- {
- _uiDisplay = _renderDisplay.AddComponent<UnityUGUIDisplay>();
- _uiDisplay.raycastTarget = false;
- }
- }
- else
- {
- _meshRenderer = _renderDisplay.GetComponent<MeshRenderer>();
- if (_meshRenderer == null)
- {
- _meshRenderer = _renderDisplay.AddComponent<MeshRenderer>();
- }
- //
- _meshFilter = _renderDisplay.GetComponent<MeshFilter>();
- if (_meshFilter == null && _renderDisplay.GetComponent<TextMesh>() == null)
- {
- _meshFilter = _renderDisplay.AddComponent<MeshFilter>();
- }
- }
- //init mesh
- if (this._meshBuffer == null)
- {
- this._meshBuffer = new MeshBuffer();
- this._meshBuffer.sharedMesh = MeshBuffer.GenerateMesh();
- this._meshBuffer.sharedMesh.name = this.name;
- }
- }
- /**
- * @private
- */
- protected override void _AddDisplay()
- {
- _proxy = _armature.proxy as UnityArmatureComponent;
- var container = _proxy;
- if (_renderDisplay.transform.parent != container.transform)
- {
- _renderDisplay.transform.SetParent(container.transform);
- _helpVector3.Set(0.0f, 0.0f, 0.0f);
- _SetZorder(_helpVector3);
- }
- }
- /**
- * @private
- */
- protected override void _ReplaceDisplay(object value)
- {
- var container = _proxy;
- var prevDisplay = value as GameObject;
- int index = prevDisplay.transform.GetSiblingIndex();
- prevDisplay.SetActive(false);
- _renderDisplay.hideFlags = HideFlags.None;
- _renderDisplay.transform.SetParent(container.transform);
- _renderDisplay.SetActive(true);
- _renderDisplay.transform.SetSiblingIndex(index);
- _SetZorder(prevDisplay.transform.localPosition);
- }
- /**
- * @private
- */
- protected override void _RemoveDisplay()
- {
- _renderDisplay.transform.parent = null;
- }
- /**
- * @private
- */
- protected override void _UpdateZOrder()
- {
- _SetZorder(this._renderDisplay.transform.localPosition);
- //
- if (this._childArmature != null || !this._isActive)
- {
- this._CombineMesh();
- }
- }
- /**
- * @internal
- */
- internal void _SetZorder(Vector3 zorderPos)
- {
- if (this._isCombineMesh)
- {
- var meshBuffer = this._combineMesh.meshBuffers[this._sumMeshIndex];
- meshBuffer.zorderDirty = true;
- }
- {
- zorderPos.z = -this._zOrder * (this._proxy._zSpace + Z_OFFSET);
- if (_renderDisplay != null)
- {
- _renderDisplay.transform.localPosition = zorderPos;
- _renderDisplay.transform.SetSiblingIndex(_zOrder);
- if (_proxy.isUGUI)
- {
- return;
- }
- if (_childArmature == null)
- {
- _meshRenderer.sortingLayerName = _proxy.sortingLayerName;
- if (_proxy.sortingMode == SortingMode.SortByOrder)
- {
- _meshRenderer.sortingOrder = _zOrder * UnityArmatureComponent.ORDER_SPACE;
- }
- else
- {
- _meshRenderer.sortingOrder = _proxy.sortingOrder;
- }
- }
- else
- {
- var childArmatureComp = childArmature.proxy as UnityArmatureComponent;
- childArmatureComp._sortingMode = _proxy._sortingMode;
- childArmatureComp._sortingLayerName = _proxy._sortingLayerName;
- if (_proxy._sortingMode == SortingMode.SortByOrder)
- {
- childArmatureComp.sortingOrder = _zOrder * UnityArmatureComponent.ORDER_SPACE;
- }
- else
- {
- childArmatureComp.sortingOrder = _proxy._sortingOrder;
- }
- }
- }
- }
- }
- public void DisallowCombineMesh()
- {
- this.CancelCombineMesh();
- this._isIgnoreCombineMesh = true;
- }
- internal void CancelCombineMesh()
- {
- if (this._isCombineMesh)
- {
- this._isCombineMesh = false;
- if (this._meshFilter != null)
- {
- this._meshFilter.sharedMesh = this._meshBuffer.sharedMesh;
- var isSkinnedMesh = this._deformVertices != null && this._deformVertices.verticesData != null && this._deformVertices.verticesData.weight != null;
- if (!isSkinnedMesh)
- {
- this._meshBuffer.rawVertextBuffers.CopyTo(this._meshBuffer.vertexBuffers, 0);
- }
- //
- this._meshBuffer.UpdateVertices();
- this._meshBuffer.UpdateColors();
- if (isSkinnedMesh)
- {
- this._UpdateMesh();
- this._IdentityTransform();
- }
- else
- {
- this._UpdateTransform();
- }
- }
- this._meshBuffer.enabled = true;
- }
- if (this._renderDisplay != null)
- {
- if (this._childArmature != null)
- {
- this._renderDisplay.SetActive(true);
- }
- else
- {
- this._renderDisplay.SetActive(this._isActive);
- }
- //
- this._renderDisplay.hideFlags = HideFlags.None;
- }
- //
- this._isCombineMesh = false;
- this._sumMeshIndex = -1;
- this._verticeOrder = -1;
- this._verticeOffset = -1;
- // this._combineMesh = null;
- }
- //
- private void _CombineMesh()
- {
- //引起合并的条件,Display改变,混合模式改变,Visible改变,Zorder改变
- //已经关闭合并,不再考虑
- if (this._isIgnoreCombineMesh || this._proxy.isUGUI)
- {
- return;
- }
- //已经合并过了,又触发合并,那么打断合并,用自己的网格数据还原
- if (this._isCombineMesh)
- {
- //已经合并过,除非满足一下情况,否则都不能再合并, TODO
- this.CancelCombineMesh();
- this._isIgnoreCombineMesh = true;
- }
- var combineMeshComp = this._proxy.GetComponent<UnityCombineMeshs>();
- //从来没有合并过,触发合并,那么尝试合并
- if (combineMeshComp != null)
- {
- combineMeshComp.dirty = true;
- }
- }
- /**
- * @private
- */
- internal override void _UpdateVisible()
- {
- this._renderDisplay.SetActive(this._parent.visible);
- if (this._isCombineMesh && !this._parent.visible)
- {
- this._CombineMesh();
- }
- }
- /**
- * @private
- */
- internal override void _UpdateBlendMode()
- {
- if (this._currentBlendMode == this._blendMode)
- {
- return;
- }
- if (this._childArmature == null)
- {
- if (this._uiDisplay != null)
- {
- this._uiDisplay.material = (this._textureData as UnityTextureData).GetMaterial(this._blendMode, true);
- }
- else
- {
- this._meshRenderer.sharedMaterial = (this._textureData as UnityTextureData).GetMaterial(this._blendMode);
- }
- this._meshBuffer.name = this._uiDisplay != null ? this._uiDisplay.material.name : this._meshRenderer.sharedMaterial.name;
- }
- else
- {
- foreach (var slot in _childArmature.GetSlots())
- {
- slot._blendMode = this._blendMode;
- slot._UpdateBlendMode();
- }
- }
- this._currentBlendMode = this._blendMode;
- this._CombineMesh();
- }
- /**
- * @private
- */
- protected override void _UpdateColor()
- {
- if (this._childArmature == null)
- {
- var proxyTrans = _proxy._colorTransform;
- if (this._isCombineMesh)
- {
- var meshBuffer = this._combineMesh.meshBuffers[this._sumMeshIndex];
- for (var i = 0; i < this._meshBuffer.vertexBuffers.Length; i++)
- {
- var index = this._verticeOffset + i;
- this._meshBuffer.color32Buffers[i].r = (byte)(_colorTransform.redMultiplier * proxyTrans.redMultiplier * 255);
- this._meshBuffer.color32Buffers[i].g = (byte)(_colorTransform.greenMultiplier * proxyTrans.greenMultiplier * 255);
- this._meshBuffer.color32Buffers[i].b = (byte)(_colorTransform.blueMultiplier * proxyTrans.blueMultiplier * 255);
- this._meshBuffer.color32Buffers[i].a = (byte)(_colorTransform.alphaMultiplier * proxyTrans.alphaMultiplier * 255);
- //
- meshBuffer.color32Buffers[index] = this._meshBuffer.color32Buffers[i];
- }
- meshBuffer.UpdateColors();
- }
- else if (this._meshBuffer.sharedMesh != null)
- {
- for (int i = 0, l = this._meshBuffer.sharedMesh.vertexCount; i < l; ++i)
- {
- this._meshBuffer.color32Buffers[i].r = (byte)(_colorTransform.redMultiplier * proxyTrans.redMultiplier * 255);
- this._meshBuffer.color32Buffers[i].g = (byte)(_colorTransform.greenMultiplier * proxyTrans.greenMultiplier * 255);
- this._meshBuffer.color32Buffers[i].b = (byte)(_colorTransform.blueMultiplier * proxyTrans.blueMultiplier * 255);
- this._meshBuffer.color32Buffers[i].a = (byte)(_colorTransform.alphaMultiplier * proxyTrans.alphaMultiplier * 255);
- }
- //
- this._meshBuffer.UpdateColors();
- }
- }
- else
- {
- //Set all childArmature color dirty
- (this._childArmature.proxy as UnityArmatureComponent).color = _colorTransform;
- }
- }
- /**
- * @private
- */
- protected override void _UpdateFrame()
- {
- var currentVerticesData = (this._deformVertices != null && this._display == this._meshDisplay) ? this._deformVertices.verticesData : null;
- var currentTextureData = this._textureData as UnityTextureData;
- this._meshBuffer.Clear();
- this._isActive = false;
- if (this._displayIndex >= 0 && this._display != null && currentTextureData != null)
- {
- var currentTextureAtlas = _proxy.isUGUI ? currentTextureAtlasData.uiTexture : currentTextureAtlasData.texture;
- if (currentTextureAtlas != null)
- {
- this._isActive = true;
- //
- var textureAtlasWidth = currentTextureAtlasData.width > 0.0f ? (int)currentTextureAtlasData.width : currentTextureAtlas.mainTexture.width;
- var textureAtlasHeight = currentTextureAtlasData.height > 0.0f ? (int)currentTextureAtlasData.height : currentTextureAtlas.mainTexture.height;
- var textureScale = _armature.armatureData.scale * currentTextureData.parent.scale;
- var sourceX = currentTextureData.region.x;
- var sourceY = currentTextureData.region.y;
- var sourceWidth = currentTextureData.region.width;
- var sourceHeight = currentTextureData.region.height;
- if (currentVerticesData != null)
- {
- var data = currentVerticesData.data;
- var meshOffset = currentVerticesData.offset;
- var intArray = data.intArray;
- var floatArray = data.floatArray;
- var vertexCount = intArray[meshOffset + (int)BinaryOffset.MeshVertexCount];
- var triangleCount = intArray[meshOffset + (int)BinaryOffset.MeshTriangleCount];
- int vertexOffset = intArray[meshOffset + (int)BinaryOffset.MeshFloatOffset];
- if (vertexOffset < 0)
- {
- vertexOffset += 65536; // Fixed out of bouds bug.
- }
- var uvOffset = vertexOffset + vertexCount * 2;
- if (this._meshBuffer.uvBuffers == null || this._meshBuffer.uvBuffers.Length != vertexCount)
- {
- this._meshBuffer.uvBuffers = new Vector2[vertexCount];
- }
- if (this._meshBuffer.rawVertextBuffers == null || this._meshBuffer.rawVertextBuffers.Length != vertexCount)
- {
- this._meshBuffer.rawVertextBuffers = new Vector3[vertexCount];
- this._meshBuffer.vertexBuffers = new Vector3[vertexCount];
- }
- this._meshBuffer.triangleBuffers = new int[triangleCount * 3];
- for (int i = 0, iV = vertexOffset, iU = uvOffset, l = vertexCount; i < l; ++i)
- {
- this._meshBuffer.uvBuffers[i].x = (sourceX + floatArray[iU++] * sourceWidth) / textureAtlasWidth;
- this._meshBuffer.uvBuffers[i].y = 1.0f - (sourceY + floatArray[iU++] * sourceHeight) / textureAtlasHeight;
- this._meshBuffer.rawVertextBuffers[i].x = floatArray[iV++] * textureScale;
- this._meshBuffer.rawVertextBuffers[i].y = floatArray[iV++] * textureScale;
- this._meshBuffer.vertexBuffers[i].x = this._meshBuffer.rawVertextBuffers[i].x;
- this._meshBuffer.vertexBuffers[i].y = this._meshBuffer.rawVertextBuffers[i].y;
- }
- for (int i = 0; i < triangleCount * 3; ++i)
- {
- this._meshBuffer.triangleBuffers[i] = intArray[meshOffset + (int)BinaryOffset.MeshVertexIndices + i];
- }
- var isSkinned = currentVerticesData.weight != null;
- if (isSkinned)
- {
- this._IdentityTransform();
- }
- }
- else
- {
- if (this._meshBuffer.rawVertextBuffers == null || this._meshBuffer.rawVertextBuffers.Length != 4)
- {
- this._meshBuffer.rawVertextBuffers = new Vector3[4];
- this._meshBuffer.vertexBuffers = new Vector3[4];
- }
- if (this._meshBuffer.uvBuffers == null || this._meshBuffer.uvBuffers.Length != this._meshBuffer.rawVertextBuffers.Length)
- {
- this._meshBuffer.uvBuffers = new Vector2[this._meshBuffer.rawVertextBuffers.Length];
- }
- // Normal texture.
- for (int i = 0, l = 4; i < l; ++i)
- {
- var u = 0.0f;
- var v = 0.0f;
- switch (i)
- {
- case 0:
- break;
- case 1:
- u = 1.0f;
- break;
- case 2:
- u = 1.0f;
- v = 1.0f;
- break;
- case 3:
- v = 1.0f;
- break;
- default:
- break;
- }
- var scaleWidth = sourceWidth * textureScale;
- var scaleHeight = sourceHeight * textureScale;
- var pivotX = _pivotX;
- var pivotY = _pivotY;
- if (currentTextureData.rotated)
- {
- var temp = scaleWidth;
- scaleWidth = scaleHeight;
- scaleHeight = temp;
- pivotX = scaleWidth - _pivotX;
- pivotY = scaleHeight - _pivotY;
- //uv
- this._meshBuffer.uvBuffers[i].x = (sourceX + (1.0f - v) * sourceWidth) / textureAtlasWidth;
- this._meshBuffer.uvBuffers[i].y = 1.0f - (sourceY + u * sourceHeight) / textureAtlasHeight;
- }
- else
- {
- //uv
- this._meshBuffer.uvBuffers[i].x = (sourceX + u * sourceWidth) / textureAtlasWidth;
- this._meshBuffer.uvBuffers[i].y = 1.0f - (sourceY + v * sourceHeight) / textureAtlasHeight;
- }
- //vertices
- this._meshBuffer.rawVertextBuffers[i].x = u * scaleWidth - pivotX;
- this._meshBuffer.rawVertextBuffers[i].y = (1.0f - v) * scaleHeight - pivotY;
- this._meshBuffer.vertexBuffers[i].x = this._meshBuffer.rawVertextBuffers[i].x;
- this._meshBuffer.vertexBuffers[i].y = this._meshBuffer.rawVertextBuffers[i].y;
- }
- this._meshBuffer.triangleBuffers = TRIANGLES;
- }
- if (_proxy.isUGUI)
- {
- this._uiDisplay.material = currentTextureAtlas;
- this._uiDisplay.texture = currentTextureAtlas.mainTexture;
- this._uiDisplay.sharedMesh = this._meshBuffer.sharedMesh;
- }
- else
- {
- this._meshFilter.sharedMesh = this._meshBuffer.sharedMesh;
- this._meshRenderer.sharedMaterial = currentTextureAtlas;
- }
- this._meshBuffer.name = currentTextureAtlas.name;
- this._meshBuffer.InitMesh();
- this._currentBlendMode = BlendMode.Normal;
- this._blendModeDirty = true;
- this._colorDirty = true;// Relpace texture will override blendMode and color.
- this._visibleDirty = true;
- this._CombineMesh();
- return;
- }
- }
- this._renderDisplay.SetActive(this._isActive);
- if (_proxy.isUGUI)
- {
- this._uiDisplay.material = null;
- this._uiDisplay.texture = null;
- this._uiDisplay.sharedMesh = null;
- }
- else
- {
- this._meshFilter.sharedMesh = null;
- this._meshRenderer.sharedMaterial = null;
- }
- _helpVector3.x = 0.0f;
- _helpVector3.y = 0.0f;
- _helpVector3.z = this._renderDisplay.transform.localPosition.z;
- this._renderDisplay.transform.localPosition = _helpVector3;
- if (this._isCombineMesh)
- {
- this._CombineMesh();
- }
- }
- protected override void _IdentityTransform()
- {
- var transform = this._renderDisplay.transform;
- transform.localPosition = new Vector3(0.0f, 0.0f, transform.localPosition.z);
- transform.localEulerAngles = Vector3.zero;
- transform.localScale = Vector3.one;
- }
- protected override void _UpdateMesh()
- {
- if (this._meshBuffer.sharedMesh == null || this._deformVertices == null)
- {
- return;
- }
-
- var scale = this._armature.armatureData.scale;
- var deformVertices = this._deformVertices.vertices;
- var bones = this._deformVertices.bones;
- var hasDeform = deformVertices.Count > 0;
- var verticesData = this._deformVertices.verticesData;
- var weightData = verticesData.weight;
- var data = verticesData.data;
- var intArray = data.intArray;
- var floatArray = data.floatArray;
- var vertextCount = intArray[verticesData.offset + (int)BinaryOffset.MeshVertexCount];
- if (weightData != null)
- {
- int weightFloatOffset = intArray[weightData.offset + 1/*(int)BinaryOffset.MeshWeightOffset*/];
- if (weightFloatOffset < 0)
- {
- weightFloatOffset += 65536; // Fixed out of bouds bug.
- }
- MeshBuffer meshBuffer = null;
- if (this._isCombineMesh)
- {
- meshBuffer = this._combineMesh.meshBuffers[this._sumMeshIndex];
- }
- int iB = weightData.offset + (int)BinaryOffset.WeigthBoneIndices + weightData.bones.Count, iV = weightFloatOffset, iF = 0;
- for (int i = 0; i < vertextCount; ++i)
- {
- var boneCount = intArray[iB++];
- float xG = 0.0f, yG = 0.0f;
- for (var j = 0; j < boneCount; ++j)
- {
- var boneIndex = intArray[iB++];
- var bone = bones[boneIndex];
- if (bone != null)
- {
- var matrix = bone.globalTransformMatrix;
- var weight = floatArray[iV++];
- var xL = floatArray[iV++] * scale;
- var yL = floatArray[iV++] * scale;
- if (hasDeform)
- {
- xL += deformVertices[iF++];
- yL += deformVertices[iF++];
- }
- xG += (matrix.a * xL + matrix.c * yL + matrix.tx) * weight;
- yG += (matrix.b * xL + matrix.d * yL + matrix.ty) * weight;
- }
- }
- this._meshBuffer.vertexBuffers[i].x = xG;
- this._meshBuffer.vertexBuffers[i].y = yG;
- if (meshBuffer != null)
- {
- meshBuffer.vertexBuffers[i + this._verticeOffset].x = xG;
- meshBuffer.vertexBuffers[i + this._verticeOffset].y = yG;
- }
- }
- if (meshBuffer != null)
- {
- meshBuffer.vertexDirty = true;
- }
- else
- {
- // if (this._meshRenderer && this._meshRenderer.enabled)
- {
- this._meshBuffer.UpdateVertices();
- }
- }
- }
- else if (deformVertices.Count > 0)
- {
- int vertexOffset = data.intArray[verticesData.offset + (int)BinaryOffset.MeshFloatOffset];
- if (vertexOffset < 0)
- {
- vertexOffset += 65536; // Fixed out of bouds bug.
- }
- //
- var a = globalTransformMatrix.a;
- var b = globalTransformMatrix.b;
- var c = globalTransformMatrix.c;
- var d = globalTransformMatrix.d;
- var tx = globalTransformMatrix.tx;
- var ty = globalTransformMatrix.ty;
- var index = 0;
- var rx = 0.0f;
- var ry = 0.0f;
- var vx = 0.0f;
- var vy = 0.0f;
- MeshBuffer meshBuffer = null;
- if (this._isCombineMesh)
- {
- meshBuffer = this._combineMesh.meshBuffers[this._sumMeshIndex];
- }
- for (int i = 0, iV = 0, iF = 0, l = vertextCount; i < l; ++i)
- {
- rx = (data.floatArray[vertexOffset + (iV++)] * scale + deformVertices[iF++]);
- ry = (data.floatArray[vertexOffset + (iV++)] * scale + deformVertices[iF++]);
- this._meshBuffer.rawVertextBuffers[i].x = rx;
- this._meshBuffer.rawVertextBuffers[i].y = -ry;
- this._meshBuffer.vertexBuffers[i].x = rx;
- this._meshBuffer.vertexBuffers[i].y = -ry;
- if (meshBuffer != null)
- {
- index = i + this._verticeOffset;
- vx = (rx * a + ry * c + tx);
- vy = (rx * b + ry * d + ty);
- meshBuffer.vertexBuffers[index].x = vx;
- meshBuffer.vertexBuffers[index].y = vy;
- }
- }
- if (meshBuffer != null)
- {
- meshBuffer.vertexDirty = true;
- }
- // else if (this._meshRenderer && this._meshRenderer.enabled)
- else
- {
- this._meshBuffer.UpdateVertices();
- }
- }
- }
- protected override void _UpdateTransform()
- {
- if (this._isCombineMesh)
- {
- var a = globalTransformMatrix.a;
- var b = globalTransformMatrix.b;
- var c = globalTransformMatrix.c;
- var d = globalTransformMatrix.d;
- var tx = globalTransformMatrix.tx;
- var ty = globalTransformMatrix.ty;
- var index = 0;
- var rx = 0.0f;
- var ry = 0.0f;
- var vx = 0.0f;
- var vy = 0.0f;
- var meshBuffer = this._combineMesh.meshBuffers[this._sumMeshIndex];
- for (int i = 0, l = this._meshBuffer.vertexBuffers.Length; i < l; i++)
- {
- index = i + this._verticeOffset;
- //vertices
- rx = this._meshBuffer.rawVertextBuffers[i].x;
- ry = -this._meshBuffer.rawVertextBuffers[i].y;
- vx = rx * a + ry * c + tx;
- vy = rx * b + ry * d + ty;
- this._meshBuffer.vertexBuffers[i].x = vx;
- this._meshBuffer.vertexBuffers[i].y = vy;
- meshBuffer.vertexBuffers[index].x = vx;
- meshBuffer.vertexBuffers[index].y = vy;
- }
- //
- meshBuffer.vertexDirty = true;
- }
- else
- {
- this.UpdateGlobalTransform(); // Update transform.
- //localPosition
- var flipX = _armature.flipX;
- var flipY = _armature.flipY;
- var transform = _renderDisplay.transform;
- _helpVector3.x = global.x;
- _helpVector3.y = global.y;
- _helpVector3.z = transform.localPosition.z;
- transform.localPosition = _helpVector3;
- //localEulerAngles
- if (_childArmature == null)
- {
- _helpVector3.x = flipY ? 180.0f : 0.0f;
- _helpVector3.y = flipX ? 180.0f : 0.0f;
- _helpVector3.z = global.rotation * TransformDB.RAD_DEG;
- }
- else
- {
- //If the childArmature is not null,
- //X, Y axis can not flip in the container of the childArmature container,
- //because after the flip, the Z value of the child slot is reversed,
- //showing the order is wrong, only in the child slot to deal with X, Y axis flip
- _helpVector3.x = 0.0f;
- _helpVector3.y = 0.0f;
- _helpVector3.z = global.rotation * TransformDB.RAD_DEG;
- //这里这样处理,是因为子骨架的插槽也要处理z值,那就在容器中反一下,子插槽再正过来
- if (flipX != flipY)
- {
- _helpVector3.z = -_helpVector3.z;
- }
- }
- if (flipX || flipY)
- {
- if (flipX && flipY)
- {
- _helpVector3.z += 180.0f;
- }
- else
- {
- if (flipX)
- {
- _helpVector3.z = 180.0f - _helpVector3.z;
- }
- else
- {
- _helpVector3.z = -_helpVector3.z;
- }
- }
- }
- transform.localEulerAngles = _helpVector3;
- //Modify mesh skew. // TODO child armature skew.
- if ((this._display == this._rawDisplay || this._display == this._meshDisplay) && this._meshBuffer.sharedMesh != null)
- {
- var skew = global.skew;
- var dSkew = skew;
- if (flipX && flipY)
- {
- dSkew = -skew + TransformDB.PI;
- }
- else if (!flipX && !flipY)
- {
- dSkew = -skew - TransformDB.PI;
- }
- var skewed = dSkew < -0.01f || 0.01f < dSkew;
- if (_skewed || skewed)
- {
- _skewed = skewed;
- var isPositive = global.scaleX >= 0.0f;
- var cos = Mathf.Cos(dSkew);
- var sin = Mathf.Sin(dSkew);
- var x = 0.0f;
- var y = 0.0f;
- for (int i = 0, l = this._meshBuffer.vertexBuffers.Length; i < l; ++i)
- {
- x = this._meshBuffer.rawVertextBuffers[i].x;
- y = this._meshBuffer.rawVertextBuffers[i].y;
- if (isPositive)
- {
- this._meshBuffer.vertexBuffers[i].x = x + y * sin;
- }
- else
- {
- this._meshBuffer.vertexBuffers[i].x = -x + y * sin;
- }
- this._meshBuffer.vertexBuffers[i].y = y * cos;
- }
- // if (this._meshRenderer && this._meshRenderer.enabled)
- {
- this._meshBuffer.UpdateVertices();
- }
- }
- }
- //localScale
- _helpVector3.x = global.scaleX;
- _helpVector3.y = global.scaleY;
- _helpVector3.z = 1.0f;
- transform.localScale = _helpVector3;
- }
- if (_childArmature != null)
- {
- _childArmature.flipX = _armature.flipX;
- _childArmature.flipY = _armature.flipY;
- }
- }
- public Mesh mesh
- {
- get
- {
- if (this._meshBuffer == null)
- {
- return null;
- }
- return this._meshBuffer.sharedMesh;
- }
- }
- public MeshRenderer meshRenderer
- {
- get { return this._meshRenderer; }
- }
- public UnityTextureAtlasData currentTextureAtlasData
- {
- get
- {
- if (this._textureData == null || this._textureData.parent == null)
- {
- return null;
- }
- return this._textureData.parent as UnityTextureAtlasData;
- }
- }
- public GameObject renderDisplay
- {
- get { return this._renderDisplay; }
- }
- public UnityArmatureComponent proxy
- {
- get { return this._proxy; }
- }
- public bool isIgnoreCombineMesh
- {
- get { return this._isIgnoreCombineMesh; }
- }
- }
- }
|