/// <summary> /// Edge Material Slot 2が変化したとき /// </summary> /// <param name="v"></param> void HandleChangedEdgeMaterialSlot2(bool v) { if (v) { _edgeBuilder = _edgeBuilders[1]; } }
/// <summary> /// 特定のパーティクルの距離によるミックスを行う。多分これが一番シンプルな方法何じゃないかな? /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <param name="dist"></param> /// <param name="edgeBuilder"></param> /// <returns></returns> public static RefStructure Mix(RefStructure a, RefStructure b, float dist, BaseEdgeBuilder edgeBuilder) { Assert.IsNotNull(a); Assert.IsNotNull(b); Assert.IsNotNull(edgeBuilder); var dst = RefStructure.CreateNew(); // それぞれの構造体の中から一定の距離感にある。パーティクル同士をエッジでつなげる。 var aParticles = a.GetParticles(); var bParticles = b.GetParticles(); var pairDict = new Dictionary <RefParticle, int[]>(); for (var i = 0; i < aParticles.Length; ++i) { var t = aParticles[i]; var neighbours = FindParticles(t, dist, bParticles); pairDict.Add(t, neighbours); } // とりあえずペアを見つけ出したので、つないでみる。 // ここで注意なのがパーティクルがaとbのどちらに属しているのかということ。 // それらを意識しながら、接続関係をまとめていく。 var aCount = aParticles.Length; // 一旦すべてのパーティクルとエッジを追加する AddParticles(dst, aParticles); AddParticles(dst, bParticles); // エッジの追加にはパーティクルのUIDからIdxへのマッピング辞書が必要。 var aEdges = a.GetEdges(); var bEdges = b.GetEdges(); var uid2IdxDictA = CreateUID2IdxDictionary(aParticles); var uid2IdxDictB = CreateUID2IdxDictionary(bParticles); // Debug.Log(uid2IdxDictA.Count); AddEdges(dst, aEdges, uid2IdxDictA, 0); AddEdges(dst, bEdges, uid2IdxDictB, aCount); // ここから新しい接続用のエッジを追加していく。 foreach (var pair in pairDict) { if (pair.Value.Length == 0) { continue; } var idx = uid2IdxDictA[pair.Key.uid]; for (var i = 0; i < pair.Value.Length; ++i) { var tIdx = pair.Value[i] + aCount; // 2つのインデックスが揃ったのでエッジを作る edgeBuilder.Add(dst, idx, tIdx); } } return(dst); }