/// <summary>
        /// 枝を作成する
        /// </summary>
        /// <returns></returns>
        RefParticle MakeBranch(RefStructure s, int depth, RefParticle parent, float angle, float length)
        {
            var t = 1f - ((float)depth / _maxBranchDepth);

            if (depth > 0)
            {
                depth--;
                var position = parent.position + Utilities.Angle2Vector(angle * Mathf.Deg2Rad) * length;
                var current  = s.AddParticle(position, _branchJointSize, RandomGradient(_leafColor), _branchJointMaterialID);

                // 次の枝へ
                var deltaAngle = _branchAngleDeltaFactor * _branchAngleDeltaMultiplierCurve.Evaluate(t);
                MakeBranch(s, depth, current, angle + deltaAngle, length * _branchDamping);

                s.AddEdge(parent, current, _branchWidth, RandomGradient(_branchColor), _branchMaterialID);

                if (Random.Range(0f, 1f) > 0.5f)
                {
                    MakeBranch(s, depth, current, angle + Random.Range(-60f, 60f), length * _branchDamping);
                }

                return(current);
            }
            else
            {
                var position = parent.position + Utilities.Angle2Vector(angle * Mathf.Deg2Rad) * _leafSize.y;
                var current  = s.AddParticle(position, 0f, RandomGradient(_branchJointColor), _branchJointMaterialID);

                // 本当の葉っぱ
                s.AddEdge(parent, current, _leafSize.x, RandomGradient(_leafColor), _leafMaterialID);

                return(null);
            }
        }
        /// <summary>
        /// 指定した構造体にエッジを追加する。エッジの追加には対応するUIDからIdxへのマッピング辞書が必要。
        /// </summary>
        /// <param name="s"></param>
        /// <param name="targets"></param>
        /// <param name="uid2IdxDict"></param>
        /// <param name="idxOffset"></param>
        static void AddEdges(RefStructure s, RefEdge[] targets, Dictionary <uint, int> uid2IdxDict, int idxOffset = 0)
        {
            Assert.IsNotNull(s);
            Assert.IsNotNull(targets);
            Assert.IsNotNull(uid2IdxDict);

            for (var i = 0; i < targets.Length; ++i)
            {
                var t    = targets[i];
                var aIdx = uid2IdxDict[t.aUID] + idxOffset;
                var bIdx = uid2IdxDict[t.bUID] + idxOffset;
                s.AddEdge(aIdx, bIdx, t.width, t.color, t.materialID);
            }
        }
Exemple #3
0
 public override RefEdge Add(RefStructure s, int aIdx, int bIdx)
 {
     return(s.AddEdge(aIdx, bIdx, _width.random, _color.E_Random(), _materialID));
 }
Exemple #4
0
 public override RefEdge Add(RefStructure s, RefParticle a, RefParticle b)
 {
     return(s.AddEdge(a, b, _width.random, _color.E_Random(), _materialID));
 }
Exemple #5
0
 public override RefEdge Add(RefStructure s, RefParticle a, RefParticle b, float t)
 {
     return(s.AddEdge(a, b, _width.Lerp(t), _color.Evaluate(t), _materialID));
 }
Exemple #6
0
 public override RefEdge Add(RefStructure s, int aIdx, int bIdx, float t)
 {
     return(s.AddEdge(aIdx, bIdx, _width.Lerp(t), _color.Evaluate(t), _materialID));
 }