Пример #1
0
        /// <summary>
        /// デフォーマーごとの使用頂点設定
        /// 使用頂点に対して AddUseVertex() / RemoveUseVertex() を実行する
        /// </summary>
        /// <param name="sw"></param>
        /// <param name="deformer"></param>
        /// <param name="deformerIndex"></param>
        protected override void SetDeformerUseVertex(bool sw, BaseMeshDeformer deformer, int deformerIndex)
        {
            var cdata = ClothData;

            for (int i = 0; i < cdata.VertexUseCount; i++)
            {
                // 未使用頂点は除く
                if (ClothData.IsInvalidVertex(i))
                {
                    continue;
                }

                int  vindex = cdata.useVertexList[i];
                bool fix    = !ClothData.IsMoveVertex(i);

                if (sw)
                {
                    deformer.AddUseVertex(vindex, fix);
                }
                else
                {
                    deformer.RemoveUseVertex(vindex, fix);
                }
            }
        }
Пример #2
0
        /// <summary>
        /// デフォーマーごとの使用頂点設定
        /// 使用頂点に対して AddUseVertex() / RemoveUseVertex() を実行する
        /// </summary>
        /// <param name="sw"></param>
        /// <param name="deformer"></param>
        /// <param name="deformerIndex"></param>
        protected override void SetDeformerUseVertex(bool sw, BaseMeshDeformer deformer, int deformerIndex)
        {
            var data = GetDeformerData();

            int vcnt = data.UseVertexCount;

            for (int j = 0; j < vcnt; j++)
            {
                int vindex = data.useVertexIndexList[j];
                if (sw)
                {
                    deformer.AddUseVertex(vindex, false);
                }
                else
                {
                    deformer.RemoveUseVertex(vindex, false);
                }
            }
        }
Пример #3
0
        /// <summary>
        /// デフォーマとの状態を連動
        /// ※デフォーマが接続するCoreComponentのStatusとリンクすることに注意!
        /// </summary>
        /// <param name="deformer"></param>
        /// <param name="sw"></param>
        private void LinkDeformerStatus(BaseMeshDeformer deformer, bool sw)
        {
            var core = deformer.Parent.GetComponent <CoreComponent>();

            if (core)
            {
                // デフォーマが親、クロスコンポーネントが子として接続するので注意!(v1.5.1)
                if (sw)
                {
                    Status.AddParentStatus(core.Status);
                    core.Status.AddChildStatus(Status);
                    //Status.AddChildStatus(core.Status);
                    //core.Status.AddParentStatus(Status);
                }
                else
                {
                    Status.RemoveParentStatus(core.Status);
                    core.Status.RemoveChildStatus(Status);
                    //Status.RemoveChildStatus(core.Status);
                    //core.Status.RemoveParentStatus(Status);
                }
            }
        }
Пример #4
0
 /// <summary>
 /// デフォーマーごとの使用頂点設定
 /// 使用頂点に対して AddUseVertex() / RemoveUseVertex() を実行する
 /// </summary>
 /// <param name="sw"></param>
 /// <param name="deformer"></param>
 /// <param name="deformerIndex"></param>
 protected override void SetDeformerUseVertex(bool sw, BaseMeshDeformer deformer, int deformerIndex)
 {
     // BoneClothには不要
 }
Пример #5
0
 /// <summary>
 /// デフォーマーごとの使用頂点設定
 /// 使用頂点に対して AddUseVertex() / RemoveUseVertex() を実行する
 /// </summary>
 /// <param name="sw"></param>
 /// <param name="deformer"></param>
 /// <param name="deformerIndex"></param>
 protected abstract void SetDeformerUseVertex(bool sw, BaseMeshDeformer deformer, int deformerIndex);
        void CreateClothData(MagicaMeshSpring scr, SpringData sdata, BaseMeshDeformer deformer)
        {
            SpringData.DeformerData data = new SpringData.DeformerData();

            // 中心位置と方向
            var spos = scr.CenterTransform.position;
            var sdir = scr.CenterTransformDirection;
            var srot = scr.CenterTransform.rotation;
            var sscl = scr.Params.SpringRadiusScale;

            // 半径
            float sradius = scr.Params.SpringRadius;

            // マトリックス
            var mat  = Matrix4x4.TRS(spos, srot, sscl);
            var imat = mat.inverse;

            // メッシュデータ
            List <Vector3> wposList;
            List <Vector3> wnorList;
            List <Vector3> wtanList;
            int            vcnt = deformer.GetEditorPositionNormalTangent(out wposList, out wnorList, out wtanList);

            // 使用頂点とウエイト
            List <int>   selectionList      = Enumerable.Repeat(SelectionData.Invalid, vcnt).ToList(); // 仮のセレクションデータ
            List <int>   useVertexIndexList = new List <int>();
            List <float> weightList         = new List <float>();

            for (int i = 0; i < vcnt; i++)
            {
                // 範囲チェック
                var lpos = imat.MultiplyPoint(wposList[i]);
                var dist = lpos.magnitude;
                if (dist <= sradius)
                {
                    // 距離割合
                    var dratio = Mathf.InverseLerp(0.0f, sradius, dist);
                    var dpower = scr.Params.GetSpringDistanceAtten(dratio);

                    // 方向割合
                    var dir    = wposList[i] - spos;
                    var ang    = Vector3.Angle(sdir, dir);
                    var aratio = Mathf.InverseLerp(0.0f, 180.0f, ang);
                    var apower = scr.Params.GetSpringDirectionAtten(aratio);

                    // ウエイト算出
                    float weight = Mathf.Clamp01(dpower * apower * scr.Params.SpringIntensity);

                    // 登録
                    useVertexIndexList.Add(i);
                    weightList.Add(weight);

                    selectionList[i] = SelectionData.Move;
                }
            }

            // 利用頂点とトライアングル接続する頂点をウエイト0でマークする
            // クロスデータ用にセレクションデータを拡張する
            // (1)無効頂点の隣接が移動/固定頂点なら拡張に変更する
            selectionList = deformer.MeshData.ExtendSelection(selectionList, true, false);
            // 拡張となった頂点を固定としてウエイト0でマークする
            for (int i = 0; i < vcnt; i++)
            {
                if (selectionList[i] == SelectionData.Extend)
                {
                    useVertexIndexList.Add(i);
                    weightList.Add(0.0f);
                }
            }

            // デフォーマーデータ登録
            data.deformerDataHash   = deformer.GetDataHash();
            data.vertexCount        = deformer.MeshData.VertexCount;
            data.useVertexIndexList = useVertexIndexList.ToArray();
            data.weightList         = weightList.ToArray();

            sdata.deformerData = data;

            // 設計時スケール
            Transform influenceTarget = scr.Params.GetInfluenceTarget() ? scr.Params.GetInfluenceTarget() : scr.transform;

            sdata.initScale = influenceTarget.lossyScale;
        }