/// <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); } }
public override RefEdge Add(RefStructure s, int aIdx, int bIdx) { return(s.AddEdge(aIdx, bIdx, _width.random, _color.E_Random(), _materialID)); }
public override RefEdge Add(RefStructure s, RefParticle a, RefParticle b) { return(s.AddEdge(a, b, _width.random, _color.E_Random(), _materialID)); }
public override RefEdge Add(RefStructure s, RefParticle a, RefParticle b, float t) { return(s.AddEdge(a, b, _width.Lerp(t), _color.Evaluate(t), _materialID)); }
public override RefEdge Add(RefStructure s, int aIdx, int bIdx, float t) { return(s.AddEdge(aIdx, bIdx, _width.Lerp(t), _color.Evaluate(t), _materialID)); }