Exemplo n.º 1
0
        public override RefStructure Build(Matrix4x4 toWorld)
        {
            var s = RefStructure.CreateNew();

            var stepSize = Mathf.PI * 2f / _resolution;

            //パーティクルを配置
            var p = new RefParticle[_resolution];

            for (var i = 0; i < _resolution; ++i)
            {
                var t = stepSize * i;
                var x = Mathf.Cos(t) * _radius;
                var y = Mathf.Sin(t) * _radius;

                p[i] = _particleBuilder.Add(s, new Vector2(x, y));
            }

            // エッジを配置
            for (var i = 0; i < _resolution; ++i)
            {
                _edgeBuilder.Add(s, p[i], p[(i + 1) % _resolution]);

                for (var j = 0; j < _supportIntervals.Length; ++j)
                {
                    _supportEdgeBuilder.Add(s, p[i], p[(i + _supportIntervals[j]) % _resolution]);
                }
            }

            s.TranslateParticles(toWorld);

            return(s);
        }
Exemplo n.º 2
0
        public override RefStructure Build(Matrix4x4 toWorld)
        {
            _s = RefStructure.CreateNew();
            var origin = _branchParticleBuilder.Add(_s, Vector2.zero, 0f);

            var maxDepth = _branchMaxDepth.randomInt;

            // 枝の作成
            MakeBranch(0, maxDepth, origin, 90f * Mathf.Deg2Rad);

            // 支持枝の作成
            var count = _s.GetParticleCount();

            for (int i = 0, n = _supportEdgeInterval.Length; i < n; ++i)
            {
                var interval = _supportEdgeInterval[i];
                for (int j = interval, n2 = count; j < n2; ++j)
                {
                    _branchEdgeBuilder.Add(_s, j - interval, j, 0f);
                }
            }

            _s.TranslateParticles(toWorld);

            return(_s);
        }
Exemplo n.º 3
0
        public override RefStructure Build(Matrix4x4 toWorld)
        {
            var s = RefStructure.CreateNew();

            var origin = s.AddParticle(Vector2.zero, _branchJointSize, RandomGradient(_leafColor), _branchJointMaterialID);

            /*var next = */
            MakeBranch(s, _maxBranchDepth, origin, 90f, _basebranchLength);

            s.TranslateParticles(toWorld);

            return(s);
        }
        public override RefStructure Build(Matrix4x4 toWorld)
        {
            var s = RefStructure.CreateNew();

            var origin = _branchParticleBuilder.Add(s, Vector2.zero);

            _tempBaseBranchLength = _baseBranchLength.random;

            MakeBranch(s, _maxDepth.randomInt, origin, 90f, _tempBaseBranchLength);

            s.TranslateParticles(toWorld);

            return(s);
        }
Exemplo n.º 5
0
        private void Start()
        {
            if (!_structure)
            {
                _structure = RefStructure.CreateNew();
            }

            _editHistory = new List <string>();

            LinkUIInputHandlers();

            // 初期状態を編集履歴に追加
            AddEditHistory();
        }
Exemplo n.º 6
0
        /// <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);
        }