//=========================================================================================
#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
                }
            }
        }
Esempio n. 2
0
        /// <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);
        }