//========================================================================================= #if false /// <summary> /// エディタ状態でのベーススキニング表示 /// </summary> /// <param name="team"></param> /// <param name="clothData"></param> /// <param name="posList"></param> /// <param name="selList"></param> static void DrawBaseSkinningClothData( PhysicsTeam team, ClothData clothData, List <Vector3> posList, List <int> selList ) { if (ClothMonitorMenu.Monitor.UI.DrawClothBaseSkinning == false) { return; } if (clothData.baseSkinningDataList == null) { return; } //var boneList = team.TeamData.SkinningBoneList; var boneList = team.TeamData.ColliderList; //Gizmos.color = GizmoUtility.ColorPenetration; for (int i = 0; i < clothData.VertexUseCount; i++) { int vindex = clothData.useVertexList[i]; if (vindex >= posList.Count) { continue; } if (IsMove(vindex, selList) == false) { continue; } Vector3 pos = posList[vindex]; for (int j = 0; j < Define.Compute.BaseSkinningWeightCount; j++) { int dindex = i * Define.Compute.BaseSkinningWeightCount + j; if (dindex >= clothData.baseSkinningDataList.Length) { return; } var data = clothData.baseSkinningDataList[dindex]; if (data.IsValid() == false) { continue; } int bindex = data.boneIndex; if (bindex >= boneList.Count) { continue; } var bone = boneList[bindex]; if (bone == null) { continue; } //Gizmos.color = j == 0 ? Color.red : Color.yellow; Gizmos.color = Color.gray; #if true Vector3 p, dir, d; bone.CalcNearPoint(pos, out p, out dir, out d, true); Gizmos.DrawLine(pos, p); #else //var cp = bone.TransformPoint(data.localPos); Vector3 cp; MeshUtility.ClosestPtBoneLine(pos, bone, 0.03f, out cp); Gizmos.DrawLine(pos, cp); #endif } } }
/// <summary> /// クロスメッシュ用に頂点セレクションデータを拡張する /// </summary> /// <param name="originalSelection"></param> /// <param name="extendNext">無効頂点の隣接が移動/固定頂点なら拡張に変更する</param> /// <param name="extendWeight">移動/固定頂点に影響する子頂点に接続する無効頂点は拡張に変更する</param> /// <returns></returns> public List <int> ExtendSelection(List <int> originalSelection, bool extendNext, bool extendWeight) { var selection = new List <int>(originalSelection); // (1)無効頂点の隣接が移動/固定頂点なら拡張に変更する if (extendNext) { // ライン/トライアングル情報を分解して各頂点ごとの接続頂点をリスト化 List <HashSet <int> > vlink = MeshUtility.GetTriangleToVertexLinkList(vertexCount, new List <int>(lineList), new List <int>(triangleList)); // 無効頂点の隣接が移動/固定頂点なら拡張に変更する List <int> changeIndexList = new List <int>(); for (int i = 0; i < vertexCount; i++) { if (selection[i] == SelectionData.Invalid) { // 隣接を調べる var vset = vlink[i]; foreach (var vindex in vset) { if (selection[vindex] == SelectionData.Move || selection[vindex] == SelectionData.Fixed) { // 拡張に変更する selection[i] = SelectionData.Extend; } } } } } // (2)移動/固定頂点に影響する子頂点に接続する無効頂点は拡張に変更する if (extendWeight) { var extendSet = new HashSet <int>(); foreach (var cdata in childDataList) { for (int i = 0; i < cdata.VertexCount; i++) { // 頂点のウエイト数とウエイト開始インデックス uint pack = cdata.vertexInfoList[i]; int wcnt = DataUtility.Unpack4_28Hi(pack); int wstart = DataUtility.Unpack4_28Low(pack); bool link = false; for (int j = 0; j < wcnt; j++) { int sindex = wstart + j; var vw = cdata.vertexWeightList[sindex]; // この子頂点が移動/固定頂点に接続しているか判定する if (vw.weight > 0.0f && (selection[vw.parentIndex] == SelectionData.Move || selection[vw.parentIndex] == SelectionData.Fixed)) { link = true; } } if (link) { for (int j = 0; j < wcnt; j++) { int sindex = wstart + j; var vw = cdata.vertexWeightList[sindex]; // この子頂点が接続する頂点がInvalidの場合はExtendに変更する if (vw.weight > 0.0f && selection[vw.parentIndex] == SelectionData.Invalid) { extendSet.Add(vw.parentIndex); } } } } } foreach (var vindex in extendSet) { selection[vindex] = SelectionData.Extend; } } return(selection); }