コード例 #1
0
ファイル: enemy.cs プロジェクト: jam0824/dp_scr
    //**********************************************************
    //初期化
    public void initEnemy(FormationDataBean d)
    {
        data = d;
                Vector2 vec;
                switch(data.movement){

                case "Vector":
                        //1番目のx,yのセットをベクトルの方向としてセット
                        vec = new Vector2 (data.bezierParam[0], data.bezierParam[1]).normalized;	//単位ベクトル
                        this.GetComponent<Rigidbody2D>().AddForce(vec * data.speed);
                        //2番目のx,yのyをストップ座標としてセットする。
                        if(data.bezierParam[3] != 0){
                                //viewport座標で指定
                                Vector3 tmpPos = common.getWorldPosFromViewPos (new Vector3(0f,data.bezierParam [3] / 100, 0f));
                                stopY = tmpPos.y;
                        }
                        break;
                case "GravityRandom":
                        Vector3 pos = transform.position;
                        pos.x = (Random.value * 5) - 2.5f;
                        this.transform.position = pos;
                        break;
                case "Bezier":
                        myBezier = new Bezier(new Vector3 (this.transform.position.x, this.transform.position.y, this.transform.position.z),
                                common.getWorldPosFromViewPos (new Vector3 (data.bezierParam [0] / 100, data.bezierParam [1] / 100, 0f)),
                                common.getWorldPosFromViewPos (new Vector3 (data.bezierParam [2] / 100, data.bezierParam [3] / 100, 0f)),
                                common.getWorldPosFromViewPos (new Vector3 (data.bezierParam [4] / 100, data.bezierParam [5] / 100, 0f))
                        );

                        break;

                }
    }
コード例 #2
0
ファイル: OSGrenade.cs プロジェクト: cupsster/openstash
	public void Aim ( Vector3 pos, Vector3 dir ) {
		if ( thrown ) { return; }

		RaycastHit hit = new RaycastHit ();

		if ( Physics.Raycast ( pos, dir, out hit, range ) ) {
			endNormal = hit.normal;
			bezier = new Bezier ( this.transform.position, dir, Vector3.up, hit.point );
		
		} else if ( Physics.Raycast ( pos + dir * range, Vector3.down, out hit, Mathf.Infinity ) ) {
			endNormal = hit.normal;
			bezier = new Bezier ( this.transform.position, dir, Vector3.up, hit.point );
		
		}

		if ( lineRenderer  != null && bezier != null ) {
			lineRenderer.SetVertexCount ( 32 );
			
			for ( int i = 0; i < 32; i++ ) {
				float time = ( i * 1.0f ) * ( 1.0f / 32f );

				lineRenderer.SetPosition ( i, bezier.GetPointAtTime ( time ) );
			}
		}

		distance = Vector3.Distance ( pos, hit.point ); 
	}
コード例 #3
0
 void addPoint(BezierPath path, BezierPath.PathPoint point)
 {
     Undo.RegisterUndo(path, "create bezier point");
     // if lsat point, add new. if middle point, add point inbetween
     if(path.points.Count - 1 == path.points.IndexOf(point))
     {
         // add at end
         BezierPath.PathPoint p = new BezierPath.PathPoint();
         if(point.h1.magnitude < Mathf.Epsilon)
             p.p1 = point.p1 + (Vector3.right) * 2;
         else
             p.p1 = point.p1 + (point.h1).normalized * 2;
         p.h1 = point.h1;
         path.points.Add(p);
         selectedPoint = p;
     }
     else
     {
         // add in middle
         BezierPath.PathPoint point2 = path.points[path.points.IndexOf(point) + 1];
         Bezier b = new Bezier(point.p1, point.h1, -point2.h1, point2.p1);
         BezierPath.PathPoint p = new BezierPath.PathPoint();
         p.p1 = b.GetPointAtTime(0.5f);
         p.h1 = b.GetPointAtTime(0.6f) - p.p1;
         path.points.Insert(path.points.IndexOf(point) + 1, p);
     }
 }
コード例 #4
0
ファイル: DrawLine.cs プロジェクト: uweenukr/SplineDemo
    // Use this for initialization
    void Start()
    {
        _lineRenderer = this.GetComponent<LineRenderer>();

        MyBezier = new Bezier(Point1.position, Point2.position, Point3.position, Point4.position);

        GenerateSpline();
    }
コード例 #5
0
ファイル: ItemBox.cs プロジェクト: yakolla/MarineVsAlien
 void SetTarget(Creature target)
 {
     m_target = target;
     Vector3 handle1 = transform.position;
     handle1 += (transform.forward+transform.up)*(Vector3.Distance(transform.position, target.transform.position)*0.5f);
     Vector3 handle2 = target.transform.position;
     handle2.y = 3f;
     m_bezier = new Bezier(gameObject, target.gameObject, handle1, handle2, 0.06f);
 }
コード例 #6
0
    public Vector2[] CalculateEvenlySpacedPoints(float spacing, float resolution = 1)
    {
        List <Vector2> evenlySpacedPoints = new List <Vector2>();

        evenlySpacedPoints.Add(points[0]);
        Vector2 previousPoint         = points[0];
        float   dstSinceLastEvenPoint = 0;

        for (int segmentIndex = 0; segmentIndex < NumSegment; segmentIndex++)
        {
            Vector2[] p = GetPointsInSegment(segmentIndex);
            float     controlNetLength     = Vector2.Distance(p[0], p[1]) + Vector2.Distance(p[1], p[2]) + Vector2.Distance(p[2], p[3]);
            float     estimatedCurveLength = Vector2.Distance(p[0], p[3]) + controlNetLength / 2f;
            int       divisions            = Mathf.CeilToInt(estimatedCurveLength * resolution * 10);
            float     t = 0;
            while (t <= 1)
            {
                t += 1f / divisions;
                Vector2 pointOnCurve = Bezier.EvaluateCubic(p[0], p[1], p[2], p[3], t);
                dstSinceLastEvenPoint += Vector2.Distance(previousPoint, pointOnCurve);

                while (dstSinceLastEvenPoint >= spacing)
                {
                    float   overshootDst         = dstSinceLastEvenPoint - spacing;
                    Vector2 newEvenlySpacedPoint = pointOnCurve + (previousPoint - pointOnCurve).normalized * overshootDst;
                    evenlySpacedPoints.Add(newEvenlySpacedPoint);
                    dstSinceLastEvenPoint = overshootDst;
                    previousPoint         = newEvenlySpacedPoint;
                }

                previousPoint = pointOnCurve;
            }
        }

        return(evenlySpacedPoints.ToArray());
    }
コード例 #7
0
ファイル: Magnet.cs プロジェクト: romuloScripts/AIProject
 void Update()
 {
     Collider[] col = Physics.OverlapSphere(transform.position, radius);
     foreach (var item in col)
     {
         item.transform.LookAt(transform);
         float delay = Mathf.Lerp(2, magnetDelay, Mathf.InverseLerp(5, 0, Vector3.Distance(transform.position, item.transform.position)));
         Destroy(item, delay);
     }
     u = Mathf.MoveTowards(u, uTarget, vel * Time.deltaTime);
     transform.position = bezier.calcBezier(u);
     if (u == uTarget)
     {
         if (bezier.dir)
         {
             bezier = bezier.dir as Bezier;
             u      = uIni;
         }
         else
         {
             enabled = false;
         }
     }
 }
コード例 #8
0
        public BezierChart(ChartView BaseChart)
        {
            bezier = new Bezier();
            var    = new Variables.Variables();

            BaseChart.Chart.Title.Text = "Bezier series";

            bezier.FillSampleValues(10);


            bezier.LinePen.Visible      = true;
            bezier.LinePen.Transparency = 0;
            bezier.LinePen.Width        = 2;
            bezier.LinePen.Color        = var.GetPaletteBasic[0].AddLuminosity(-0.1);


            bezier.Smoothed = true;

            BaseChart.Chart.Series.Add(bezier);

            BaseChart.Chart.Axes.Left.Visible   = true;
            BaseChart.Chart.Axes.Bottom.Visible = true;

            BaseChart.Chart.Axes.Left.Increment          = 20;
            BaseChart.Chart.Axes.Left.AxisPen.Visible    = true;
            BaseChart.Chart.Legend.Visible               = false;
            BaseChart.Chart.Axes.Left.Visible            = true;
            BaseChart.Chart.Axes.Left.AxisPen.Visible    = true;
            BaseChart.Chart.Axes.Left.Ticks.Transparency = 100;
            BaseChart.Chart.Axes.Bottom.Visible          = true;
            BaseChart.Chart.Axes.Bottom.AxisPen.Visible  = true;
            BaseChart.Chart.Axes.Left.Grid.Visible       = true;

            BaseChart.Chart.Axes.Left.SetMinMax(BaseChart.Chart.Axes.Left.MinYValue, BaseChart.Chart.Axes.Left.MaxYValue);
            BaseChart.Chart.Axes.Bottom.SetMinMax(0, BaseChart.Chart.Axes.Bottom.MaxXValue);
        }
コード例 #9
0
 //makes velocity vector's magnitude equal to one, so just shows the direction of the velocity
 public Vector3 GetDirection(float t)
 {
     return((transform.TransformPoint(Bezier.GetFirstDerivative(points[0], points[1], points[2], points[3], t)) - transform.position).normalized);
 }
コード例 #10
0
 public static Vector3 GetPointPosition(Vector3 start, Vector3 end, Vector3 helper, float t)
 {
     return(Bezier.Calculate(start, helper, end, t));
 }
コード例 #11
0
 //Function called externally from BezierCurveInspector.cs to access a specific handle point on our curve
 public Vector3 GetPoint(float t_)
 {
     return(this.transform.TransformPoint(Bezier.GetPoint(this.points[0], this.points[1], this.points[2], this.points[3], t_)));
 }
コード例 #12
0
ファイル: Enemy.cs プロジェクト: RegalStranger/shootingGame
    void Move()
    {
        if (enemy2) {
            if (enemyAi[aiIndex].MovePattern == 2 || enemyAi[aiIndex].MovePattern == 5 || enemyAi[aiIndex].MovePattern == 7) {
                this.gameObject.GetComponent<Animator>().SetBool("Right", true);
            }
            else if (enemyAi[aiIndex].MovePattern == 3 || enemyAi[aiIndex].MovePattern == 4 || enemyAi[aiIndex].MovePattern == 6) {
                this.gameObject.GetComponent<Animator>().SetBool("Left", true);
            }
            else {
                this.gameObject.GetComponent<Animator>().SetBool("Right", false);
                this.gameObject.GetComponent<Animator>().SetBool("Left", false);
            }
        }

        if (circle) {
            Vector3 bezPos = bezier.GetPointAtTime(bezTimer);
            this.transform.position = new Vector3(bezPos.x, bezPos.y, 0);
            if (bezTimer <= DirectionData.bezierDirectionData[enemyAi[aiIndex].BezId].bezTime) {
                bezTimer += 0.001f;
            }
            else {
                circle = false;
            }
        }
        else {
            GetComponent<Rigidbody2D>().velocity = EnemyMoveDirection[enemyAi[aiIndex].MovePattern] * enemyAi[aiIndex].Speed;
            if (bezInit) {
                if (bezWarmUpTimer >= DirectionData.bezierDirectionData[enemyAi[aiIndex].BezId].bezWarmTime) {
                    DirectionData.BezierBase bezData = DirectionData.bezierDirectionData[enemyAi[aiIndex].BezId];
                    bezier = new Bezier(this.transform.localPosition, bezData.CtlPoint1, bezData.CtlPoint2, bezData.endPoint);
                    circle = true;
                }
                bezWarmUpTimer += Time.deltaTime;
            }
        }
    }
コード例 #13
0
 public Vector3 GetLocalVelocity(float t)
 {
     return(Bezier.GetFirstDerivative(Vector3.zero, points[0], points[1], points[2], t));
 }
コード例 #14
0
 public Bezier_Curve(List <Vector3> p_)
 {
     bezier = new Bezier(p_);
 }
コード例 #15
0
            public void Execute(ArchetypeChunk chunk, int index, int entityOffset)
            {
                var localToParentAcessor = chunk.GetNativeArray(localToParentType);
                var animationAcessor     = chunk.GetNativeArray(splineAnimationType);
                var justSpawnedAcessor   = default(NativeArray <JustSpawned>);

                if (chunk.Has(justSpawnedType))
                {
                    justSpawnedAcessor = chunk.GetNativeArray(justSpawnedType);
                }

                for (int i = 0; i < chunk.Count; i++)
                {
                    SplineAnimationSpeed anim = animationAcessor[i];
                    var elements = elementAcessor[anim.spline];
                    var segments = segmentAcessor[anim.spline];
                    if (anim.index >= elements.Length)
                    {
                        continue;
                    }

                    float move = anim.speed * deltaTime;
                    if (justSpawnedAcessor.IsCreated)
                    {
                        move = anim.speed * justSpawnedAcessor[i].deltaTime;
                    }
                    float         left;
                    SplineSegment segment = segments[anim.segIndex];
                    while (move >= (left = (segment.end - anim.t) / (segment.end - segment.start) * segment.length))
                    {
                        move -= left;
                        if (++anim.segIndex >= segments.Length || segments[anim.segIndex].start == 0)
                        {
                            if (anim.isLoop)
                            {
                                if (++anim.index >= elements.Length)
                                {
                                    anim.index    = 0;
                                    anim.segIndex = 0;
                                }
                            }
                            else
                            {
                                if (++anim.index >= elements.Length - 1)
                                {
                                    anim.index    = elements.Length;
                                    anim.segIndex = 0;
                                    anim.t        = 0;
                                    break;
                                }
                            }
                        }
                        segment = segments[anim.segIndex];
                        anim.t  = segment.start;
                    }

                    if (anim.index >= elements.Length)
                    {
                        SplineElement last = elements[elements.Length - 1];
                        localToParentAcessor[i] = new LocalToParent {
                            Value = math.float4x4(last.rotation, last.point)
                        };
                    }
                    else
                    {
                        anim.t += (move / segment.length) * (segment.end - segment.start);
                        SplineElement start    = elements[anim.index];
                        SplineElement end      = anim.index < elements.Length - 1 ? elements[anim.index + 1] : elements[0];
                        float3        position = Bezier.GetPoint(start.point, start.point + start.forward, end.point + end.backward, end.point, anim.t);
                        quaternion    rotation = math.nlerp(start.rotation, end.rotation, anim.t);
                        localToParentAcessor[i] = new LocalToParent {
                            Value = math.float4x4(rotation, position)
                        };
                    }
                    animationAcessor[i] = anim;
                }
            }
コード例 #16
0
	void Update () {
        //reset array transform
        if (TestNullReferenceTransform()) {
            pointsTransform = ReCalculateArrayTransform();
        }
        if (pointsTransform.Length < 2 && previewCountPointsTransform != pointsTransform.Length)
        {
            points = new Vector3[0];
            lineRenderer.SetVertexCount(0);
        }
        previewCountPointsTransform = pointsTransform.Length;
            
        //inherit points for array transform
        if (pointsTransform.Length > 1 ) {
            points = new Vector3[pointsTransform.Length];
            for (int i = 0; i < pointsTransform.Length; i++)
                points[i] = pointsTransform[i].position;
        }
        //exit if not met the basic conditions
        if (points.Length < 2)
            return;

        //create lights
        if (points.Length != previewCountPoints && onLight || onLight && lights == null)
        {
            DestroyLights();
            lights = new Light[points.Length - 1];
            for (int i = 0; i < points.Length - 1; i++)
            {
                Vector3 midPoint = Vector3.Lerp(points[i], points[i + 1], 0.5f);
                GameObject go = new GameObject("light " + i.ToString());
                go.transform.position = midPoint;
                go.transform.parent = gameObject.transform;
                lights[i] = go.AddComponent<Light>();
            }
        }
        previewCountPoints = points.Length;
        //Destroy lights
        if (!onLight && lights != null)
            DestroyLights();

        if (Time.time > lastTimeChangePosition + delayChangedPosition)
        {
            lastTimeChangePosition = Time.time;
            //save prewiev state line
            if (listSmoothingPointsPatch.Count > 0)
            {
                previewListSmoothingPointsPatch.Clear();
                previewListSmoothingPointsPatch.AddRange(listSmoothingPointsPatch);
            }
            listSmoothingPointsPatch.Clear();
            listBasePointsPatch.Clear();
            AnimationCurve curveTurbulent = new AnimationCurve(new Keyframe(0, peripheryAmplititude * scale), new Keyframe(1, centralAmplitude * scale), new Keyframe(2, peripheryAmplititude * scale));
            for (int i = 0; i < points.Length - 1; i++)
            {
                //create point for line electricity
                List<Vector3> listBasePoints = new List<Vector3>();
                Vector3 directionToPoint2 = points[i + 1] - points[i];
                float fullDistance = Vector3.Distance(points[i], points[i + 1]);
                int countPoints = (int)(fullDistance / minDistanceBeetwenPoints) + 1;
                float currentDistance = (fullDistance / countPoints);
                for (int g = 0; g < countPoints + 1; g++)
                {
                    Vector3 newPointPosition = points[i] + (directionToPoint2.normalized * (currentDistance * g));
                    float coeffEvolute = ((float)g / (float)(countPoints )) * 2;
                    Vector3 axisRandom = Quaternion.AngleAxis(Random.Range(-180, 180), directionToPoint2) * new Vector3(directionToPoint2.y, directionToPoint2.x * -1, 0) ;
                    newPointPosition = newPointPosition + (axisRandom.normalized * (Random.Range(-curveTurbulent.Evaluate(coeffEvolute), curveTurbulent.Evaluate(coeffEvolute))));
                    listBasePoints.Add(newPointPosition);
                }
                listBasePointsPatch.AddRange(listBasePoints);
                //Move lights to midle points line electricity
                if (onLight)
                    lights[i].transform.position = Vector3.Lerp(points[i], points[i + 1], 0.5f);
                //create points smoothing
                Bezier bezier = new Bezier(listBasePoints.ToArray());
                int countSmoothingPoints = (int)(fullDistance / minDistanceBeetwenSmoothingPoints);
                listSmoothingPointsPatch.AddRange(bezier.GetSmoothingPoints(countSmoothingPoints));

            }
        }
        //apply light setting
        if (onLight)
            foreach (Light l in lights)
            {
                l.color = color;
                l.intensity = (Random.Range(centralAmplitude, centralAmplitude * 0.8f) * lightIntesity) *scale;
            }

        // lerp prewiev state to next state
        List<Vector3> mixedListSmoothingPointsPatch = new List<Vector3>();
        if (previewListSmoothingPointsPatch.Count > 0)
        {
            float mixCoefficient = (Time.time - lastTimeChangePosition) / delayChangedPosition;
            for (int i = 0; i < Mathf.Min(previewListSmoothingPointsPatch.Count, listSmoothingPointsPatch.Count); i++)
                mixedListSmoothingPointsPatch.Add(Vector3.Lerp(previewListSmoothingPointsPatch[i], listSmoothingPointsPatch[i], mixCoefficient));
        }
        else
            mixedListSmoothingPointsPatch.AddRange(listSmoothingPointsPatch);

        //set parametrs to lineRenderer
        lineRenderer.SetVertexCount(mixedListSmoothingPointsPatch.Count);
        for (int p = 0; p < mixedListSmoothingPointsPatch.Count; p++)
            lineRenderer.SetPosition(p, mixedListSmoothingPointsPatch[p]);

        lineRenderer.SetWidth(Width, Width);
        lineRenderer.SetColors(color, color);

	}
コード例 #17
0
ファイル: Bezier curve.cs プロジェクト: ryohalon/PantuMan
 void Start()
 {
     myBezier = new Bezier( new Vector3( -1f, 1f, -1f ), Random.insideUnitSphere * 2f, Random.insideUnitSphere * 2f, new Vector3( 3f, 1f, 3f ) );
 }
コード例 #18
0
ファイル: BaseMoveType.cs プロジェクト: Kuvo/Primary
    /// <summary>
    /// ベジェ曲線計算用のパラメータを設定
    /// </summary>
    private void ConputeNextBezierCurve()
    {
        if (nextControlPointIndex == -1)
        {
            return;
        }

        Vector3 prevHandle;
        Vector3 nextHandle;

        if (!isReverse)
        {
            prevHandle = GetNextControlPoint().prevHandle;
            nextHandle = GetCurrentControlPoint().nextHandle;
        }
        else
        {
            prevHandle = GetNextControlPoint().nextHandle;
            nextHandle = GetCurrentControlPoint().prevHandle;
        }

        if (nextHandle != GetCurrentControlPoint().position || prevHandle != GetNextControlPoint().position)
        {
            bezier = new Bezier();
            bezier.p0 = GetCurrentControlPoint().position;
            bezier.p1 = nextHandle;
            bezier.p2 = prevHandle;
            bezier.p3 = GetNextControlPoint().position;
        }
        else
        {
            bezier = null;
        }
    }
コード例 #19
0
    // Update is called once per frame
    void Update()
    {
        Vector3 currentHumanPos = transform.position;
        tick += SpeedScale;

        if (calculateMovement) {
            moveDirection = movePath.GetPointAtTime(Mathf.Lerp(0, 1, tick));
        } else if (!reachedTarget && !calculateMovement)
        {
            Building closestBuilding = GetClosestBuilding(currentHumanPos);

            var randomOtherBuildings = from build in Buildings where build != closestBuilding && build != targetBuilding select build;
            Building rndBuilding1 = randomOtherBuildings.ElementAt(Random.Range(0, randomOtherBuildings.Count()));
            Building rndBuilding2 = randomOtherBuildings.ElementAt(Random.Range(0, randomOtherBuildings.Count()));

            movePath = new Bezier(currentHumanPos, rndBuilding1.transform.position, rndBuilding2.transform.position, targetBuilding.transform.position);
            calculateMovement = true;
        } else
        {
            Building closestBuilding = GetClosestBuilding(currentHumanPos);

            var randomOtherBuildings = from build in Buildings where build != closestBuilding && build != targetBuilding select build;
            Building rndBuilding1 = randomOtherBuildings.ElementAt(Random.Range(0, randomOtherBuildings.Count()));
            Building rndBuilding2 = randomOtherBuildings.ElementAt(Random.Range(0, randomOtherBuildings.Count()));

            movePath = new Bezier(currentHumanPos, rndBuilding1.transform.position, rndBuilding2.transform.position, targetBuilding.transform.position);
            calculateMovement = true;
            /*
            Vector3 targetPos = targetBuilding.transform.position;
            //Rect duempelArea = new Rect(targetPos.x - duempelOffset, targetPos.y - duempelOffset, duempelOffset, duempelOffset);
            tangentPos = currentHumanPos + (movePath.p3 - movePath.p2);
            Random.seed += 200;
            movePath = new Bezier(currentHumanPos,
                                new Vector3(targetPos.x + Random.Range(-0.2f, 0.2f), targetPos.y + Random.Range(-0.2f, 0.2f), 0),
                                new Vector3(targetPos.x + Random.Range(-1.0f, 1.0f), targetPos.y + Random.Range(-1.0f, 1.0f), 0),
                                new Vector3(targetPos.x + Random.Range(-0.2f, 0.2f), targetPos.y + Random.Range(-0.2f, 0.2f), 0));
            calculateMovement = true;
            tangentPos = movePath.p1;
            duempeln = true;
            */
        }

        if (duempeln)
        {
            duempelTimer++;
        }
        if (duempeln && (duempelTimer > duempelTimerMax))
        {
            duempelTimer = 0;
            tick = 0;

            calculateMovement = false;
        }

        if ((Vector3.Distance(currentHumanPos, targetBuilding.transform.position) < visitedRange) && newTargetSet)
        {
            tick = 0;

            reachedTarget = true;
            duempeln = true;
            newTargetSet = false;
            calculateMovement = false;
        }

        transform.position = moveDirection;
    }
コード例 #20
0
 protected override void UpdateAction(float elapse)
 {
     bool flag = true;
     for (int i = 0; i < this.missileInsts.Count; i++)
     {
         this.missileInsts[i].timeStamp += elapse;
         if (this.missileInsts[i].status == 0)
         {
             flag = false;
             if (this.missileInsts[i].timeStamp >= this.missileOffests[i].delayTime)
             {
                 this.missileInsts[i].status = 1;
                 if (base.variables.skillTarget != null)
                 {
                     if (this.Spine && base.variables.skillTarget.SpineTransform != null)
                     {
                         this.missileInsts[i].target = base.variables.skillTarget.SpineTransform.gameObject;
                         this.missileInsts[i].startPos = this.missileInsts[i].target.transform.position;
                     }
                     else
                     {
                         this.missileInsts[i].target = base.variables.skillTarget.gameObject;
                         this.missileInsts[i].startPos = this.missileInsts[i].target.transform.position;
                     }
                 }
                 if (base.variables.skillCaster != null)
                 {
                     this.missileInsts[i].targetPos = base.variables.skillCaster.transform.position;
                     this.missileInsts[i].targetPos += base.variables.skillCaster.transform.forward * this.ForwardOffset;
                     ArcaneMissilesAction.MissileInstance expr_1DC_cp_0 = this.missileInsts[i];
                     expr_1DC_cp_0.targetPos.y = expr_1DC_cp_0.targetPos.y + this.YOffset;
                 }
                 float num = Vector3.Distance(this.missileInsts[i].startPos, this.missileInsts[i].targetPos);
                 Transform transform = PoolMgr.SpawnParticleSystem(this.MissilePrefab.transform, this.missileInsts[i].startPos, Quaternion.identity, 1f);
                 if (transform == null)
                 {
                     global::Debug.LogError(new object[]
                     {
                         "Instantiate MissilePrefab object error!"
                     });
                 }
                 this.missileInsts[i].go = transform.gameObject;
                 this.missileInsts[i].duration = Mathf.Max(this.missileOffests[i].DurationMin, num / this.missileOffests[i].speed);
                 this.missileInsts[i].timeStamp = 0f;
                 if (this.missileOffests[i].DoDamage)
                 {
                     this.missileInsts[i].damage = (long)this.DoEffect(base.variables.skillInfo, base.variables.skillCaster, base.variables.skillTarget);
                 }
             }
         }
         else if (this.missileInsts[i].go != null)
         {
             flag = false;
             if (this.missileInsts[i].timeStamp >= this.missileInsts[i].duration)
             {
                 this.OnReachTarget(this.missileInsts[i]);
             }
             else
             {
                 float num2 = this.missileInsts[i].timeStamp / this.missileInsts[i].duration;
                 num2 *= num2;
                 Vector3 vector = base.variables.skillCaster.transform.position;
                 vector.y += this.YOffset;
                 vector += base.variables.skillCaster.transform.forward * this.ForwardOffset;
                 Bezier bezier = new Bezier(this.missileInsts[i].startPos, base.variables.skillCaster.transform.right * this.missileOffests[i].offest.x + Vector3.up * this.missileOffests[i].offest.y - base.variables.skillCaster.transform.forward * this.missileOffests[i].offest.z, Vector3.zero, vector);
                 Vector3 pointAtTime = bezier.GetPointAtTime(Mathf.Clamp01(num2));
                 this.missileInsts[i].go.transform.position = pointAtTime;
                 Vector3 forward = this.missileInsts[i].startPos - pointAtTime;
                 if (forward.sqrMagnitude > 0.1f)
                 {
                     Quaternion to = Quaternion.LookRotation(forward);
                     this.missileInsts[i].go.transform.rotation = Quaternion.Slerp(this.missileInsts[i].go.transform.rotation, to, Time.deltaTime * 10f);
                 }
             }
         }
     }
     if (flag)
     {
         base.Finish();
     }
 }
コード例 #21
0
        public static void SingleStateLinkField( Rect position, GUIContent label, SerializedProperty property )
        {
            StateBehaviour behaviour = property.serializedObject.targetObject as StateBehaviour;

            if( behaviour == null || behaviour.stateID == 0 || behaviour.stateMachine == null || property.isArray )
            {
                EditorGUI.HelpBox( position,"This is Arbor Editor only.",MessageType.Error );

                return;
            }

            int controlID = EditorGUIUtility.GetControlID( s_StateLinkHash,EditorGUIUtility.native,position );

            Event currentEvent = Event.current;

            EventType eventType = currentEvent.GetTypeForControl( controlID );

            ArborFSMInternal stateMachine = behaviour.stateMachine;
            State state = stateMachine.GetStateFromID( behaviour.stateID );

            SerializedProperty stateIDProperty = property.FindPropertyRelative( "stateID" );
            SerializedProperty lineEnableProperty = property.FindPropertyRelative( "lineEnable" );
            SerializedProperty lineStartProperty = property.FindPropertyRelative( "lineStart" );
            SerializedProperty lineStartTangentProperty = property.FindPropertyRelative( "lineStartTangent" );
            SerializedProperty lineEndProperty = property.FindPropertyRelative( "lineEnd" );
            SerializedProperty lineEndTangentProperty = property.FindPropertyRelative( "lineEndTangent" );
            SerializedProperty lineColorProperty = property.FindPropertyRelative( "lineColor" );
            SerializedProperty lineColorChangedProperty = property.FindPropertyRelative( "lineColorChanged" );

            ArborEditorWindow window = ArborEditorWindow.GetCurrent();

            State linkState = stateMachine.GetStateFromID( stateIDProperty.intValue );

            bool dragging = ( GUIUtility.hotControl == controlID && currentEvent.button == 0 );

            State targetState = dragging? _DragTargetState : linkState;

            Vector2 nowPos = currentEvent.mousePosition;

            Vector2 leftPos = new Vector2( position.x+8,position.center.y );
            Vector2 rightPos = new Vector2( position.x+position.width-8,position.center.y );

            Bezier bezier = new Bezier();
            if( targetState != null )
            {
                bezier = GetTargetBezier( state,targetState,leftPos,rightPos );
            }
            else if( dragging )
            {
                bezier = GetTargetBezier( state,nowPos,leftPos,rightPos );
            }
            else
            {
                bezier.startPos = rightPos;
            }

            Rect boxRect = new Rect( bezier.startPos.x-8,position.y,16,position.height );

            Vector2 statePosition = new Vector2( state.position.x,state.position.y );

            bezier.startPos += statePosition;
            bezier.startTangent += statePosition;
            bezier.endPos += statePosition;
            bezier.endTangent += statePosition;

            Rect colorRect = position;

            colorRect.x += colorRect.width - 32 - 16;
            colorRect.width = 32;

            Color lineColor = Color.white;

            if( lineColorChangedProperty.boolValue )
            {
                lineColor = lineColorProperty.colorValue;
            }

            switch( eventType )
            {
            case EventType.MouseDown:
                if( position.Contains( nowPos ) && !colorRect.Contains( nowPos ) )
                {
                    if( currentEvent.button == 0 )
                    {
                        GUIUtility.hotControl = GUIUtility.keyboardControl = controlID;

                        _DragTargetState = null;

                        if( window != null )
                        {
                            window.DragBranchEnable( true );
                            window.DragBranchBezie( bezier.startPos,bezier.startTangent,bezier.endPos,bezier.endTangent );
                            window.DragBranchHoverStateID( 0 );
                        }

                        lineEnableProperty.boolValue = false;

                        currentEvent.Use ();
                    }
                }
                break;
            case EventType.MouseDrag:
                if( GUIUtility.hotControl == controlID && currentEvent.button == 0 )
                {
                    DragAndDrop.PrepareStartDrag();

                    State nextState = GetStateFromPosition( stateMachine, nowPos+statePosition );

                    if( nextState != null && nextState != state )
                    {
                        if( window )
                        {
                            window.DragBranchHoverStateID( nextState.stateID );
                        }

                        _DragTargetState = nextState;
                    }
                    else
                    {
                        if( window )
                        {
                            window.DragBranchHoverStateID( 0 );
                        }
                        _DragTargetState = null;
                    }

                    currentEvent.Use ();
                }
                break;
            case EventType.MouseUp:
                if( GUIUtility.hotControl == controlID )
                {
                    if( currentEvent.button == 0 )
                    {
                        GUIUtility.hotControl = 0;

                        if( _DragTargetState != linkState )
                        {
                            Undo.RecordObject( behaviour,"Link State" );

                            if( _DragTargetState != null )
                            {
                                stateIDProperty.intValue = _DragTargetState.stateID;
                            }
                            else
                            {
                                stateIDProperty.intValue = 0;
                            }

                            lineEnableProperty.boolValue = stateIDProperty.intValue != 0;
                            lineStartProperty.vector2Value = bezier.startPos;
                            lineStartTangentProperty.vector2Value = bezier.startTangent;
                            lineEndProperty.vector2Value = bezier.endPos;
                            lineEndTangentProperty.vector2Value = bezier.endTangent;

                            //EditorUtility.SetDirty( behaviour );
                        }

                        if( window != null )
                        {
                            window.DragBranchEnable(false);
                            window.DragBranchHoverStateID( 0 );
                            window.Repaint();
                        }

                        _DragTargetState = null;

                        currentEvent.Use ();
                    }
                }
                break;
            case EventType.Repaint:
                if( GUIUtility.hotControl == controlID && currentEvent.button == 0 )
                {
                    if( window )
                    {
                        window.DragBranchBezie( bezier.startPos,bezier.startTangent,bezier.endPos,bezier.endTangent );
                    }
                }
                else if( linkState != null )
                {
                    lineEnableProperty.boolValue = true;
                    lineStartProperty.vector2Value = bezier.startPos;
                    lineStartTangentProperty.vector2Value = bezier.startTangent;
                    lineEndProperty.vector2Value = bezier.endPos;
                    lineEndTangentProperty.vector2Value = bezier.endTangent;
                }

                bool on = GUIUtility.hotControl == controlID && currentEvent.button == 0 || linkState != null;

                Color savedColor = GUI.backgroundColor;

                GUI.backgroundColor = new Color( lineColor.r,lineColor.g,lineColor.b );
                EditorStyles.miniButton.Draw( position,label,controlID,on );

                GUI.backgroundColor = savedColor;

                EditorStyles.radioButton.Draw( boxRect,GUIContent.none,controlID,on );
                break;
            }

            EditorGUI.BeginChangeCheck();
            lineColor = EditorGUI.ColorField( colorRect,lineColor );
            if( EditorGUI.EndChangeCheck() )
            {
                lineColorProperty.colorValue = new Color( lineColor.r,lineColor.g,lineColor.b );
                lineColorChangedProperty.boolValue = true;
            }
        }
コード例 #22
0
        static Bezier GetTargetBezier( State state,State target,Vector2 leftPos,Vector2 rightPos)
        {
            bool right = true;

            Bezier bezier = new Bezier();

            if( target != null )
            {
                Rect targetRect = target.position;
                targetRect.x -= state.position.x;
                targetRect.y -= state.position.y;

                Pivot findPivot = null;

                List<Pivot> pivots = new List<Pivot>();

                pivots.Add( new Pivot( new Vector2( targetRect.xMin,targetRect.yMin + 32.0f ),-Vector2.right ) );
                pivots.Add( new Pivot( new Vector2( targetRect.xMax,targetRect.yMin + 32.0f ),Vector2.right ) );

                if( targetRect.x == 0.0f )
                {
                    if( targetRect.y > 0.0f )
                    {
                        findPivot = pivots[0];
                        right = false;
                    }
                    else
                    {
                        findPivot = pivots[1];
                        right = true;
                    }
                }
                else
                {
                    float findDistance = 0.0f;

                    foreach( Pivot pivot in pivots )
                    {
                        Vector2 vl = leftPos-pivot.position;
                        Vector2 vr = rightPos-pivot.position;

                        float leftDistance = vl.magnitude;
                        float rightDistance = vr.magnitude;

                        float distance = 0.0f;
                        bool checkRight = false;

                        if( leftDistance > rightDistance )
                        {
                            distance = rightDistance;
                            checkRight = true;
                        }
                        else
                        {
                            distance = leftDistance;
                            checkRight = false;
                        }

                        if( findPivot == null || distance < findDistance )
                        {
                            findPivot = pivot;
                            findDistance = distance;
                            right = checkRight;
                        }
                    }
                }

                if( right )
                {
                    bezier.startPos = rightPos;
                    bezier.startTangent = rightPos + new Vector2( 100.0f,0.0f );
                }
                else
                {
                    bezier.startPos = leftPos;
                    bezier.startTangent = leftPos - new Vector2( 100.0f,0.0f );
                }

                bezier.endPos = findPivot.position;
                bezier.endTangent = bezier.endPos + findPivot.normal * 100;
            }

            return bezier;
        }
コード例 #23
0
        static Bezier GetTargetBezier( State state,Vector2 targetPos,Vector2 leftPos,Vector2 rightPos )
        {
            Bezier bezier = new Bezier();

            bezier.endPos = targetPos;

            bool right = (targetPos-leftPos).magnitude > (targetPos-rightPos).magnitude;

            if( right )
            {
                bezier.startPos = rightPos;
                bezier.startTangent = rightPos + new Vector2( 100.0f,0.0f );
            }
            else
            {
                bezier.startPos = leftPos;
                bezier.startTangent = leftPos - new Vector2( 100.0f,0.0f );
            }

            bezier.endTangent = bezier.startTangent;

            return bezier;
        }
コード例 #24
0
ファイル: Directives.cs プロジェクト: CrossTyreck/MJNAir
 void AlignmentSwitch(Vector3 startPoint, Vector3 endPoint)
 {
     Bezier b = new Bezier(Vector3.zero, Vector3.zero, Vector3.zero, Vector3.zero);
     Vector3 dif = new Vector3((startPoint.x - endPoint.x) / 2, (startPoint.y - endPoint.y) / 2, (startPoint.z - endPoint.z) / 2);
     switch (Alignment)
     {
         case ArcAlignment.Straight:
             for (int i = 0; i < Points.Count; i++)
             {
                 float n = (float)(i) / (float)(Points.Count - 1);
                 Points[i] = Vector3.Lerp(Position, endPoint, n);
                 Line.SetPosition(i, Points[i]);
             }
             break;
         case ArcAlignment.YZCurve:
             dif.x = 0;
             b = new Bezier(startPoint, -dif, dif, endPoint);
             for (int i = 0; i < Points.Count; i++)
             {
                 float n = (float)(i) / (float)(Points.Count - 1);
                 Vector3 newPoint = new Vector3(Points[i].x, b.GetPointAtTime(n).y, b.GetPointAtTime(n).z);
                 Points[i] = newPoint;
                 Line.SetPosition(i, Points[i]);
             }
             break;
         case ArcAlignment.XZCurve:
             dif.y = 0;
             b = new Bezier(startPoint, -dif, dif, endPoint);
             for (int i = 0; i < Points.Count; i++)
             {
                 float n = (float)(i) / (float)(Points.Count - 1);
                 Vector3 newPoint = new Vector3(b.GetPointAtTime(n).x, Points[i].y, b.GetPointAtTime(n).z);
                 Points[i] = newPoint;
                 Line.SetPosition(i, Points[i]);
             }
             break;
         case ArcAlignment.XCurve:
             dif.y = 0; dif.z = 0;
             b = new Bezier(startPoint, -dif, dif, endPoint);
             for (int i = 0; i < Points.Count; i++)
             {
                 float n = (float)(i) / (float)(Points.Count - 1);
                 Vector3 newPoint = new Vector3(b.GetPointAtTime(n).x, Points[i].y, Points[i].z);
                 Points[i] = b.GetPointAtTime(n);;
                 Line.SetPosition(i, Points[i]);
             }
             break;
         case ArcAlignment.YCurve:
             dif.x = 0; dif.z = 0;
             b = new Bezier(startPoint, -dif, dif, endPoint);
             for (int i = 0; i < Points.Count; i++)
             {
                 float n = (float)(i) / (float)(Points.Count - 1);
                 Vector3 newPoint = new Vector3(Points[i].x, b.GetPointAtTime(n).y, Points[i].z);
                 Points[i] = newPoint;
                 Line.SetPosition(i, Points[i]);
             }
             break;
         case ArcAlignment.ZCurve:
             dif.x = 0; dif.y = 0;
             b = new Bezier(startPoint, -dif, dif, endPoint);
             for (int i = 0; i < Points.Count; i++)
             {
                 float n = (float)(i) / (float)(Points.Count - 1);
                 Vector3 newPoint = new Vector3(Points[i].x, Points[i].y, b.GetPointAtTime(n).z);
                 Points[i] = newPoint;
                 Line.SetPosition(i, Points[i]);
             }
             break;
         default:
             break;
     }
     FindDistanceToNextDirective();
 }
コード例 #25
0
 protected override void UpdateAction(float elapse)
 {
     if (this.missileInstances.Count == 0)
     {
         base.Finish();
         return;
     }
     this.timer += elapse;
     if (this.timer > this.durationMax)
     {
         this.OnReachTarget();
         return;
     }
     if (this.target != null && !base.variables.skillTarget.IsDead)
     {
         this.targetPosition = this.target.transform.position;
         this.targetPosition.y = this.targetPosition.y + this.YOffset;
         if (this.moveType == MultiBezierMissilesAction.MoveType.TargetToStart)
         {
             this.targetPosition += this.target.transform.forward * this.ForwardOffset;
             this.targetPosition += this.target.transform.right * this.RightOffset;
         }
     }
     for (int i = 0; i < this.missileInstances.Count; i++)
     {
         GameObject gameObject = this.missileInstances[i];
         if (!(gameObject == null))
         {
             if (this.timer > this.missileDuration[i])
             {
                 PoolMgr.spawnPool.Despawn(gameObject.transform, this.MissileDeleteDelay);
                 this.missileInstances[i] = null;
             }
             float num = this.timer / this.missileDuration[i];
             num *= num;
             if (this.moveType == MultiBezierMissilesAction.MoveType.StartToTarget || this.target == null)
             {
                 Bezier bezier = new Bezier(this.startPosition, base.variables.skillCaster.transform.right * this.missileOffests[i].offest.x + Vector3.up * this.missileOffests[i].offest.y + base.variables.skillCaster.transform.forward * this.missileOffests[i].offest.z, Vector3.zero, this.targetPosition);
                 Vector3 pointAtTime = bezier.GetPointAtTime(Mathf.Clamp01(num));
                 gameObject.transform.position = pointAtTime;
                 Vector3 forward = this.targetPosition - pointAtTime;
                 if (forward.sqrMagnitude > 0.1f)
                 {
                     Quaternion to = Quaternion.LookRotation(forward);
                     gameObject.transform.rotation = Quaternion.Slerp(gameObject.transform.rotation, to, Time.deltaTime * 10f);
                 }
             }
             else
             {
                 Vector3 position = base.variables.skillCaster.transform.position;
                 position.y += this.YOffset;
                 Bezier bezier2 = new Bezier(this.targetPosition, base.variables.skillCaster.transform.right * this.missileOffests[i].offest.x + Vector3.up * this.missileOffests[i].offest.y - base.variables.skillCaster.transform.forward * this.missileOffests[i].offest.z, Vector3.zero, position);
                 Vector3 pointAtTime2 = bezier2.GetPointAtTime(Mathf.Clamp01(num));
                 gameObject.transform.position = pointAtTime2;
                 Vector3 forward2 = this.startPosition - pointAtTime2;
                 if (forward2.sqrMagnitude > 0.1f)
                 {
                     Quaternion to2 = Quaternion.LookRotation(forward2);
                     gameObject.transform.rotation = Quaternion.Slerp(gameObject.transform.rotation, to2, Time.deltaTime * 10f);
                 }
             }
         }
     }
 }
コード例 #26
0
ファイル: SplineBall.cs プロジェクト: uweenukr/SplineDemo
    void Start()
    {
        _splinePointDict = new Dictionary<Vector3, float>();

        MyBezier = new Bezier(Point1.position, Point2.position, Point3.position, Point4.position);
    }
コード例 #27
0
    // Update is called once per frame
    void Update()
    {
        if (m_isDestroying == true)
            return;

        if (m_selfDestoryTime < Time.time)
        {
            if (m_weapon != null)
                m_weapon.OnDestroyBullet();
            Bomb();
            return;
        }

        if (m_target == null && m_lastSearchTime <= Time.time)
        {
            m_lastSearchTime = Time.time + m_searchCoolTime;

            Creature[] searchedTargets = Bullet.SearchTarget(transform.position, m_ownerCreature.GetMyEnemyType(), m_searchRange);
            if (searchedTargets != null)
            {
                m_target = searchedTargets[Random.Range(0, searchedTargets.Length)];
                Vector3 handle1 = transform.position;
                handle1 += (transform.forward+transform.up)*(Vector3.Distance(transform.position, m_target.transform.position)*0.5f);
                Vector3 handle2 = m_target.transform.position;
                handle2.y = 3f;
                m_bezier = new Bezier(gameObject, m_target.gameObject, handle1, handle2, m_speed*0.01f);
            }

        }

        if (m_bezier != null)
        {
            if (m_bezier.Update() == false)
            {
                if (m_weapon != null)
                    m_weapon.OnDestroyBullet();
                Bomb();
                m_bezier = null;
            }
        }
        /*
        float destAngle = transform.eulerAngles.y;
        if (m_target != null)
        {
            destAngle = Mathf.Atan2(m_target.transform.position.z-transform.position.z, m_target.transform.position.x-transform.position.x) * Mathf.Rad2Deg;
        }
        transform.eulerAngles = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(new Vector3(0, -destAngle, 0)), 300f*Time.deltaTime).eulerAngles;

        transform.Translate(Mathf.Clamp(m_accel, 0, 0.2f), 0, 0, transform);
        m_accel += Time.fixedDeltaTime*Time.fixedDeltaTime*m_speed;
        */
    }
コード例 #28
0
    void OnDrawGizmos()
    {
        if (transform.childCount == 0)
        {
            return;
        }

        Gizmos.color = Color.red;

        int index = 0;
        const float radius = 0.2f;

        const int n = 50; // 頂点数
        Bezier bezier = new Bezier(n);

        if (Application.isPlaying)
        {
            Gizmos.color = Color.blue;
            Gizmos.DrawSphere(controlPoints[index].position + transform.position, radius);
            while (index < controlPoints.Length - 1)
            {
                bezier.p0 = controlPoints[index + 0].position + transform.position;
                bezier.p1 = controlPoints[index + 0].nextHandle + transform.position;
                bezier.p2 = controlPoints[index + 1].prevHandle + transform.position;
                bezier.p3 = controlPoints[index + 1].position + transform.position;

                // ベジェ曲線による移動ルートを書く
                if (bezier.CheckBezier())
                {
                    Vector3[] bezierPositions = bezier.GetAllPoint();

                    Gizmos.color = Color.red;
                    for (int i = 0; i < bezierPositions.Length - 1; i++)
                    {
                        Gizmos.DrawLine(bezierPositions[i], bezierPositions[i + 1]);
                    }
                }
                else
                {
                    // 直線による移動ルートを書く
                    Gizmos.color = Color.red;
                    Gizmos.DrawLine(bezier.p0, bezier.p3);
                }
                index++;
            }
        }
        else
        {
            Gizmos.color = Color.blue;
            Gizmos.DrawSphere(transform.GetChild(0).position, radius);
            while (index < transform.childCount - 1)
            {
                // ベジェ曲線による移動ルートを書く
                if (transform.GetChild(index + 0).GetComponent<CurveNode>() != null)
                {
                    bezier.p0 = transform.GetChild(index + 0).position;
                    bezier.p1 = transform.GetChild(index + 1).position;
                    bezier.p2 = transform.GetChild(index + 2).position;
                    bezier.p3 = transform.GetChild(index + 3).position;
                    Vector3[] bezierPositions = bezier.GetAllPoint();

                    Gizmos.color = Color.red;
                    for (int i = 0; i < bezierPositions.Length - 1; i++)
                    {
                        Gizmos.DrawLine(bezierPositions[i], bezierPositions[i + 1]);
                    }

                    Gizmos.color = Color.blue;
                    Gizmos.DrawLine(bezier.p0, bezier.p1);
                    Gizmos.DrawLine(bezier.p3, bezier.p2);
                    index += 3;
                }
                else
                {
                    Gizmos.color = Color.red;
                    Gizmos.DrawLine(transform.GetChild(index + 0).position, transform.GetChild(index + 1).position);
                    index++;
                }
            }
        }
    }
コード例 #29
0
        private static void DrawConnection(EventCall ev, Bezier b)
        {
            const float tangentSize = 50;

            float diff = b.end.x - b.start.x;

            diff = Mathf.Sign(diff) * Mathf.Min(Mathf.Abs(diff), tangentSize);

            var p1 = b.start;
            var p2 = b.end;
            var p3 = p1;
            var p4 = p2;

            if (b.startTangent == Bezier.Tangent.Auto)
            {
                p3 += new Vector2(diff, 0);
            }
            else if (b.startTangent == Bezier.Tangent.Negative)
            {
                p3 -= new Vector2(Math.Abs(diff), 0);
            }
            else if (b.startTangent == Bezier.Tangent.Positive)
            {
                p3 += new Vector2(Math.Abs(diff), 0);
            }
            else if (b.startTangent == Bezier.Tangent.NegativeUnscaled)
            {
                p3 -= new Vector2(tangentSize, 0);
            }
            else if (b.startTangent == Bezier.Tangent.PositiveUnscaled)
            {
                p3 += new Vector2(tangentSize, 0);
            }

            if (b.endTangent == Bezier.Tangent.Auto)
            {
                p4 -= new Vector2(diff, 0);
            }
            else if (b.endTangent == Bezier.Tangent.Negative)
            {
                p4 -= new Vector2(Math.Abs(diff), 0);
            }
            else if (b.endTangent == Bezier.Tangent.Positive)
            {
                p4 += new Vector2(Math.Abs(diff), 0);
            }
            else if (b.endTangent == Bezier.Tangent.NegativeUnscaled)
            {
                p4 -= new Vector2(tangentSize, 0);
            }
            else if (b.endTangent == Bezier.Tangent.PositiveUnscaled)
            {
                p4 += new Vector2(tangentSize, 0);
            }

            Color c         = ev.color;
            Color prevColor = Handles.color;

            Handles.color = c;
            Handles.DrawBezier(p1, p2, p3, p4, c, (Texture2D)UnityEditor.Graphs.Styles.selectedConnectionTexture.image, EdgeGUI.kEdgeWidth);
            foreach (var trigger in EdgeTriggersTracker.GetTimings(ev))
            {
                Vector3 pos = EdgeGUI.CalculateBezierPoint(trigger, p1, p3, p4, p2);
                Handles.DrawSolidArc(pos, Vector3.back, pos + Vector3.up, 360, EdgeGUI.kEdgeWidth);
            }
            Handles.color = prevColor;
        }
コード例 #30
0
ファイル: HexUnit.cs プロジェクト: JCly-rikiu/Treasure-Hunter
    IEnumerator TravelPath()
    {
        isTraveling = true;
        anim.SetBool("Run", true);
        Walk.Play(0);

        Vector3 a, b, c = pathToTravel[0].Position;

        yield return(LookAt(pathToTravel[1].Position));

        if (Owned)
        {
            Grid.DecreaseVisibility(currentTravelLocation ? currentTravelLocation : pathToTravel[0], VisionRange);
        }

        float t = Time.deltaTime * travelSpeed;

        for (int i = 1; i < pathToTravel.Count; i++)
        {
            currentTravelLocation = pathToTravel[i];
            a = c;
            b = pathToTravel[i - 1].Position;
            c = (b + currentTravelLocation.Position) * 0.5f;

            if (Owned)
            {
                Grid.IncreaseVisibility(currentTravelLocation, VisionRange);
                if (currentTravelLocation.Item)
                {
                    currentTravelLocation.Item.Effect(this);
                    Grid.SendRemoveItem(currentTravelLocation.Item);
                }
            }
            else
            {
                unitRenderer.enabled = currentTravelLocation.IsVisible;
            }

            for (; t < 1f; t += Time.deltaTime * travelSpeed)
            {
                transform.localPosition = Bezier.GetPoint(a, b, c, t);
                Vector3 d = Bezier.GetDerivative(a, b, c, t);
                d.y = 0f;
                transform.localRotation = Quaternion.LookRotation(d);
                yield return(null);
            }

            if (Owned)
            {
                Grid.DecreaseVisibility(currentTravelLocation, VisionRange);
            }

            t -= 1f;
        }
        currentTravelLocation = null;

        a = c;
        b = location.Position;
        c = b;

        if (Owned)
        {
            Grid.IncreaseVisibility(location, VisionRange);
        }

        for (; t < 1f; t += Time.deltaTime * travelSpeed)
        {
            transform.localPosition = Bezier.GetPoint(a, b, c, t);
            Vector3 d = Bezier.GetDerivative(a, b, c, t);
            d.y = 0f;
            transform.localRotation = Quaternion.LookRotation(d);
            yield return(null);
        }

        transform.localPosition = location.Position;
        orientation             = transform.localRotation.eulerAngles.y;

        ListPool <HexCell> .Add(pathToTravel);

        pathToTravel = null;

        isTraveling = false;
        anim.SetBool("Run", false);
        Walk.Stop();
    }
コード例 #31
0
 public Vector3 GetLocalPoint(float t)
 {
     return(Bezier.GetPoint(Vector3.zero, points[0], points[1], points[2], t));
 }
コード例 #32
0
 public void visitBezier(Bezier curve)
 {
     pointsOfCurvs.Add(curve.P0);
 }
コード例 #33
0
    public static Vector3 GetPointPosition(Vector3 start, Vector3 end, float t, float multiply)
    {
        Vector3 additionalPoint = Bezier.CenterOf(start, end) - new Vector3(0, multiply * Vector3.Distance(start, end) / 2, 0);

        return(Bezier.Calculate(start, additionalPoint, end, t));
    }
コード例 #34
0
        public void ReturnsP2WhenTIsOne()
        {
            var p = Bezier.GetPoint(p0, p1, p2, 1f);

            Assert.That(p, Is.EqualTo(p2));
        }
コード例 #35
0
    IEnumerator FollowPath()
    {
        Vector3 a, b, c = transform.position;

        if (path.Length == 0)
        {
            yield break;
        }
        else if (path.Length == 1)
        {
            yield return(LookAt(path[0].worldPos));

            float ti = Time.deltaTime * moveSpeed;
            for (; ti < 1f; ti += Time.deltaTime * moveSpeed * 2)
            {
                transform.localPosition = Vector3.Lerp(c, path[0].worldPos, ti);
                yield return(null);
            }
            transform.localPosition = path[0].worldPos;
            yield break;
        }

        Node currentNode;

        World.nodes.TryGetValue(new Vector2Int(path[1].Q, path[1].R), out currentNode);

        if (!World.planetNodes.ContainsKey(new Vector2Int(path[1].Q, path[1].R)))
        {
            PathRequestManager.RequestPath(new PathRequest(
                                               World.nodes[World.nodeCoordFromWorldPos(transform.position)],
                                               new List <PlanetNode>()
            {
                World.planetNodes[World.nodeCoordFromWorldPos(target)]
            },
                                               OnPathFound));
            yield break;
        }

        occupyNode(currentNode);

        yield return(LookAt(path[1].worldPos));

        float t = Time.deltaTime * moveSpeed;

        for (; t < 1f; t += Time.deltaTime * moveSpeed * 2)
        {
            transform.localPosition = Vector3.Lerp(c, (path[1].worldPos + c) / 2, t); //Bezier.GetPoint(a, b, c, t);
            yield return(null);
        }
        t -= 1f;

        c = transform.position;

        for (int i = 2; i < path.Length; i++)
        {
            World.nodes.TryGetValue(new Vector2Int(path[i].Q, path[i].R), out currentNode);

            if (!World.planetNodes.ContainsKey(new Vector2Int(path[i].Q, path[i].R)))
            {
                PathRequestManager.RequestPath(new PathRequest(
                                                   World.nodes[World.nodeCoordFromWorldPos(transform.position)],
                                                   new List <PlanetNode>()
                {
                    World.planetNodes[World.nodeCoordFromWorldPos(target)]
                },
                                                   OnPathFound));
                for (; t < 1f; t += Time.deltaTime * moveSpeed)
                {
                    transform.localPosition = c + (path[i - 1].worldPos - c) * t;
                    //we just go forward to the centre so we don't need to change the rotation here
                    yield return(null);
                }
                yield break;
            }

            occupyNode(currentNode);

            a = c;
            b = path[i - 1].worldPos;
            c = (b + path[i].worldPos) * 0.5f;
            for (; t < 1f; t += Time.deltaTime * moveSpeed)
            {
                transform.localPosition = Bezier.GetPoint(a, b, c, t);
                Vector3 d     = Bezier.GetDerivative(a, b, c, t);
                float   angle = Mathf.Atan2(d.y, d.x) * Mathf.Rad2Deg;
                transform.localRotation = Quaternion.AngleAxis(angle - 90, Vector3.forward);
                yield return(null);
            }
            t -= 1f;
        }

        a = c;
        b = path[path.Length - 1].worldPos;
        c = b;
        for (; t < 1f; t += Time.deltaTime * moveSpeed)
        {
            transform.localPosition = Bezier.GetPoint(a, b, c, t);
            Vector3 d     = Bezier.GetDerivative(a, b, c, t);
            float   angle = Mathf.Atan2(d.y, d.x) * Mathf.Rad2Deg;
            transform.localRotation = Quaternion.AngleAxis(angle - 90, Vector3.forward);
            yield return(null);
        }

        transform.localPosition = path[path.Length - 1].worldPos;

        path = null;
    }
コード例 #36
0
 // Use this for initialization
 void Awake()
 {
     oldPos     = transform.localPosition;
     moveBezier = new Bezier(rootPos[0], rootPos[1], rootPos[2], rootPos[3]);
 }
コード例 #37
0
    IEnumerator TravelPath()
    {
        Vector3 a, b, c = pathToTravel[0].Position;

        yield return(LookAt(pathToTravel[1].Position));

        if (!currentTravelLocation)
        {
            currentTravelLocation = pathToTravel[0];
        }
        Grid.DecreaseVisibility(currentTravelLocation, VisionRange);
        int currentColumn = currentTravelLocation.ColumnIndex;


        float t = Time.deltaTime * travelSpeed;

        for (int i = 1; i < pathToTravel.Count; i++)
        {
            currentTravelLocation = pathToTravel[i];
            a = c;
            b = pathToTravel[i - 1].Position;

            int nextColumn = currentTravelLocation.ColumnIndex;
            if (currentColumn != nextColumn)
            {
                if (nextColumn < currentColumn - 1)
                {
                    a.x -= HexMetrics.innerDiameter * HexMetrics.wrapSize;
                    b.x -= HexMetrics.innerDiameter * HexMetrics.wrapSize;
                }
                else if (nextColumn > currentColumn + 1)
                {
                    a.x += HexMetrics.innerDiameter * HexMetrics.wrapSize;
                    b.x += HexMetrics.innerDiameter * HexMetrics.wrapSize;
                }
                Grid.MakeChildOfColumn(transform, nextColumn);
                currentColumn = nextColumn;
            }

            c = (b + currentTravelLocation.Position) * 0.5f;
            Grid.IncreaseVisibility(pathToTravel[i], VisionRange);

            for (; t < 1f; t += Time.deltaTime * travelSpeed)
            {
                transform.localPosition = Bezier.GetPoint(a, b, c, t);
                Vector3 d = Bezier.GetDerivative(a, b, c, t);
                d.y = 0f;
                transform.localRotation = Quaternion.LookRotation(d);
                yield return(null);
            }
            Grid.DecreaseVisibility(pathToTravel[i], VisionRange);
            t -= 1f;
        }
        currentTravelLocation = null;

        a = c;
        b = location.Position;
        c = b;
        Grid.IncreaseVisibility(location, VisionRange);
        for (; t < 1f; t += Time.deltaTime * travelSpeed)
        {
            transform.localPosition = Bezier.GetPoint(a, b, c, t);
            Vector3 d = Bezier.GetDerivative(a, b, c, t);
            d.y = 0f;
            transform.localRotation = Quaternion.LookRotation(d);
            yield return(null);
        }

        transform.localPosition = location.Position;
        orientation             = transform.localRotation.eulerAngles.y;
        ListPool <HexCell> .Add(pathToTravel);

        pathToTravel = null;
    }
コード例 #38
0
 public Vector3 GetVelocity(float t)
 {
     return(transform.TransformPoint(Bezier.GetFirstDerivative(points[0], points[1], points[2], points[3], t)) - transform.position);
 }
コード例 #39
0
    void Start()
    {
        _splinePointDict = new Dictionary <Vector3, float>();

        MyBezier = new Bezier(Point1.position, Point2.position, Point3.position, Point4.position);
    }
コード例 #40
0
 protected override void UpdateAction(float elapse)
 {
     if (this.missile == null)
     {
         base.Finish();
         return;
     }
     if (this.curveType == TargetMissileAction.CurveType.Bezier)
     {
         float num = Time.time - this.timeStamp;
         if (num > this.BezierDutationMin)
         {
             this.OnTouchTarget(this.targetPosition);
             return;
         }
         if (this.target != null && !base.variables.skillTarget.IsDead)
         {
             this.targetPosition = this.target.transform.position;
         }
         Bezier bezier = new Bezier(this.startPosition, base.transform.right * this.BezierOffest.x + Vector3.up * this.BezierOffest.y + base.transform.forward * this.BezierOffest.z, Vector3.zero, this.targetPosition);
         float num2 = num / this.BezierDutationMin;
         num2 *= num2;
         Vector3 pointAtTime = bezier.GetPointAtTime(num2);
         this.missile.transform.position = pointAtTime;
         Vector3 forward = this.targetPosition - pointAtTime;
         if (forward.sqrMagnitude > 0.1f)
         {
             Quaternion to = Quaternion.LookRotation(forward);
             this.damping += 0.9f;
             this.missile.transform.rotation = Quaternion.Slerp(this.missile.transform.rotation, to, Time.deltaTime * this.damping);
         }
     }
     else
     {
         if (this.target != null && !base.variables.skillTarget.IsDead)
         {
             this.targetPosition = this.target.transform.position;
         }
         Vector3 vector = this.Accel * Time.deltaTime;
         this.speed.x = Mathf.Clamp(this.speed.x + vector.x, 1f, this.SpeedMax.x);
         this.speed.y = Mathf.Clamp(this.speed.y + vector.y, 1f, this.SpeedMax.y);
         this.speed.z = Mathf.Clamp(this.speed.z + vector.z, 1f, this.SpeedMax.z);
         if (this.parabolaAngle <= 0f)
         {
             Vector3 vector2 = this.targetPosition - this.missile.transform.position;
             if (vector2 != Vector3.zero)
             {
                 Quaternion to2 = Quaternion.LookRotation(vector2);
                 this.damping += 0.9f;
                 this.missile.transform.rotation = Quaternion.Slerp(this.missile.transform.rotation, to2, Time.deltaTime * this.damping);
             }
             Vector3 vector3 = this.speed * Time.deltaTime;
             this.missile.transform.position += vector2.normalized * vector3.x;
             this.missile.transform.position += vector2.normalized * vector3.y;
             this.missile.transform.position += vector2.normalized * vector3.z;
             if (vector2.magnitude < vector3.magnitude)
             {
                 this.OnTouchTarget(this.targetPosition);
                 return;
             }
         }
         else
         {
             this.missile.transform.LookAt(this.targetPosition);
             float num3 = this.Speed.x * this.Speed.y * this.Speed.z * Time.deltaTime;
             float num4 = CombatHelper.Distance2D(this.missile.transform.position, this.targetPosition);
             float num5 = (this.distanceToTarget > 0f) ? (Mathf.Min(1f, num4 / this.distanceToTarget) * this.parabolaAngle) : 0f;
             num5 = Mathf.Clamp(-num5, -this.parabolaAngle, this.parabolaAngle);
             this.missile.transform.rotation = this.missile.transform.rotation * Quaternion.Euler(num5, 0f, 0f);
             this.missile.transform.Translate(Vector3.forward * num3);
             if (num4 < num3)
             {
                 this.OnTouchTarget(this.targetPosition);
                 return;
             }
         }
     }
 }
コード例 #41
0
ファイル: SmoothTrail.cs プロジェクト: JieX/Mistral-Trail
        protected override void UpdateTrail(TrailGraphics trail, float deltaTime)
        {
            if (!trail.activeSelf)
            {
                return;
            }

            int trailPointIdx = 0;

            for (int i = 0; i < controlPoints.Count; i++)
            {
                trail.points[trailPointIdx].position = controlPoints[i].position;

                trail.points[trailPointIdx].forwardDirection = controlPoints[i].forward;

                trailPointIdx++;
                if (i < controlPoints.Count - 1)
                {
                    Vector3 cp1, cp2;
                    float   distance = Vector3.Distance(controlPoints[i].position, controlPoints[i + 1].position) / 2;
                    if (i == 0)
                    {
                        cp1 = controlPoints[i].position + (controlPoints[i + 1].position - controlPoints[i].position).normalized * distance;
                    }
                    else
                    {
                        cp1 = controlPoints[i].position + (controlPoints[i + 1].position - controlPoints[i - 1].position).normalized * distance;
                    }

                    int nextIdx = i + 1;

                    if (nextIdx == controlPoints.Count - 1)
                    {
                        cp2 = controlPoints[nextIdx].position + (controlPoints[nextIdx - 1].position - controlPoints[nextIdx].position).normalized * distance;
                    }
                    else
                    {
                        cp2 = controlPoints[nextIdx].position + (controlPoints[nextIdx - 1].position - controlPoints[nextIdx + 1].position).normalized * distance;
                    }

                    TrailPoint current = trail.points[trailPointIdx - 1];
                    TrailPoint next    = trail.points[trailPointIdx + pointsInMiddle];

                    for (int j = 0; j < pointsInMiddle; j++)
                    {
                        float t = (((float)j + 1) / ((float)pointsInMiddle + 1));
                        trail.points[trailPointIdx].position  = Bezier.CalculateCubic(t, controlPoints[i].position, cp1, cp2, controlPoints[i + 1].position);
                        trail.points[trailPointIdx].timeSoFar = Mathf.Lerp(current.timeSoFar, next.timeSoFar, t);

                        trail.points[trailPointIdx].forwardDirection = Vector3.Lerp(current.forwardDirection, next.forwardDirection, t);

                        trailPointIdx++;
                    }
                }
            }

            int lastCPIdx   = (pointsInMiddle + 1) * (controlPoints.Count - 1);
            int prevCPIdx   = lastCPIdx - pointsInMiddle - 1;
            int activeCount = lastCPIdx + 1;

            float distance2Src = trail.points[prevCPIdx].distance2Src;

            for (int i = prevCPIdx + 1; i < activeCount; i++)
            {
                distance2Src += Vector3.Distance(trail.points[i - 1].position, trail.points[i].position);
                trail.points[i].distance2Src = distance2Src;
            }
        }
コード例 #42
0
 public BezierLengthDemoControl() : base()
 {
     Bezier = new Bezier(((double)Width * 0.1D), ((double)Height * 0.9D), ((double)Width * 0.2D), ((double)Height * 0.2D), ((double)Width * 0.7D), ((double)Height * 0.8D), ((double)Width * 0.8D), ((double)Height * 0.1D));
 }
コード例 #43
0
        public void ReturnsP0WhenTIsZero()
        {
            var p = Bezier.GetPoint(p0, p1, p2, 0f);

            Assert.That(p, Is.EqualTo(p0));
        }
コード例 #44
0
ファイル: GdiCanvas.cs プロジェクト: zparr/ATF
        private void GenPrimitives()
        {
            SizeF csize = this.ClientSize;
            // since backbuffer size is the same as this.Client size.

            Random r = new Random(7737);
            int    w = (int)csize.Width;
            int    h = (int)csize.Height;

            if (m_sampleDrawing == SampleDrawings.FillSolidRects

                || m_sampleDrawing == SampleDrawings.Draw_Rects)
            {
                int itemCount = 300;
                m_rects.Clear();
                for (int i = 0; i < itemCount; i++)
                {
                    int       cx     = r.Next(-40, w);
                    int       cy     = r.Next(-40, h);
                    int       width  = r.Next(20, 140);
                    int       height = r.Next(20, 140);
                    Rectangle rect   =
                        new Rectangle(cx, cy, width, height);
                    m_rects.Add(rect);
                }

                if (m_sampleDrawing == SampleDrawings.FillSolidRects)
                {
                    m_drawInfo = string.Format("Fill {0} solid rectangles", itemCount);
                }
                else
                {
                    m_drawInfo = string.Format("Draw {0} rectangles", itemCount);
                }
            }

            else if (m_sampleDrawing == SampleDrawings.DrawRandomLines1 ||
                     m_sampleDrawing == SampleDrawings.DrawRandomLines2)
            {
                int itemCount = 2000;
                m_lines.Clear();
                for (int i = 0; i < itemCount; i++)
                {
                    PointF pt1 = new PointF(r.Next(w), r.Next(h));
                    PointF pt2 = new PointF(r.Next(w), r.Next(h));
                    m_lines.Add(new Line(pt1, pt2));
                }

                if (m_sampleDrawing == SampleDrawings.DrawRandomLines1)
                {
                    m_drawInfo = string.Format("Draw {0} lines width = 1", itemCount);
                }
                else
                {
                    m_drawInfo = string.Format("Draw {0} lines width = 2", itemCount);
                }
            }



            else if (m_sampleDrawing == SampleDrawings.DrawBeziers)
            {
                r = new Random(7737);
                int    itemCount = 200;
                Bezier bz        = new Bezier();
                bz.P1 = new PointF(0, 0);
                bz.P2 = new PointF(20, 25);
                bz.P3 = new PointF(40, -25);
                bz.P4 = new PointF(60, 25);

                m_beziers.Clear();
                for (int i = 0; i < itemCount; i++)
                {
                    Bezier b  = new Bezier();
                    SizeF  sz = new SizeF();
                    sz.Width  = r.Next(w);
                    sz.Height = r.Next(h);
                    b.P1      = bz.P1 + sz;
                    b.P2      = bz.P2 + sz;
                    b.P3      = bz.P3 + sz;
                    b.P4      = bz.P4 + sz;
                    m_beziers.Add(b);
                }
                m_drawInfo = string.Format("Draw {0} beziers", itemCount);
            }

            else if (m_sampleDrawing == SampleDrawings.DrawText)
            {
                r = new Random(7737);
                int itemCount = 200;
                m_texts.Clear();
                for (int i = 0; i < itemCount; i++)
                {
                    PointF pt = new PointF(r.Next(w), r.Next(h));
                    m_texts.Add(pt);
                }
                m_drawInfo = string.Format("Draw {0} text", itemCount);
            }
            else if (m_sampleDrawing == SampleDrawings.DrawBitmaps)
            {
                m_drawInfo = "Draw overlapping transparent bitmaps";
            }

            m_fps = 0.0f;
            UpdateInfo();
        }
コード例 #45
0
        public void LoadFromFile(string filename)
        {
            var   p = new XMLSerializer();
            Scene scene;

            try
            {
                scene = p.DeserializeFromFile(filename);
            }
            catch (Exception)
            {
                return;
            }


            ClearScene();

            var catPoints = new List <CatPoint>(scene.Points.Length);

            for (int i = 0; i < scene.Points.Length; i++)
            {
                var pos = scene.Points[i].Position;
                var pt  = CreateCatPoint(new Vector3(pos.X, pos.Y, pos.Z), false);
                pt.Name = scene.Points[i].Name;
                catPoints.Add(pt);
            }


            foreach (var bezierCurveC0 in scene.BezierCurvesC0)
            {
                var curve = new Bezier(bezierCurveC0.Points.Select(x => catPoints[x]), this)
                {
                    Name = bezierCurveC0.Name
                };
                if (bezierCurveC0.DisplayPolygonSpecified)
                {
                    curve.ShowPolygon = bezierCurveC0.DisplayPolygon;
                }
                AddNewModel(curve);
            }

            foreach (var bezierCurveC2 in scene.BezierCurvesC2)
            {
                var curve = new BezierC2(bezierCurveC2.Points.Select(x => catPoints[x]), this)
                {
                    Name = bezierCurveC2.Name
                };
                if (bezierCurveC2.DisplayPolygonSpecified)
                {
                    curve.ShowPolygon = bezierCurveC2.DisplayPolygon;
                }
                AddNewModel(curve);
            }

            foreach (var interpolationBezierCurveC2 in scene.InterpolationBezierCurvesC2)
            {
                var curve = new BsplineInterpolator(interpolationBezierCurveC2.Points.Select(x => catPoints[x]), this)
                {
                    Name = interpolationBezierCurveC2.Name
                };
                if (interpolationBezierCurveC2.DisplayPolygonSpecified)
                {
                    curve.ShowPolygon = interpolationBezierCurveC2.DisplayPolygon;
                }
                AddNewModel(curve);
            }

            foreach (var bezierSurfaceC0 in scene.BezierSurfacesC0)
            {
                var patches = new List <Patch>();
                var ptches  = new Patch[bezierSurfaceC0.PatchesV, bezierSurfaceC0.PatchesU];
                foreach (var bezierSurfaceC0Patch in bezierSurfaceC0.Patches)
                {
                    var pts = new CatPoint[4, 4];
                    for (int i = 0; i < 4; i++)
                    {
                        for (int j = 0; j < 4; j++)
                        {
                            pts[i, j] = catPoints[bezierSurfaceC0Patch.Points[j, i]];
                        }
                    }
                    var patch = new BezierPatch(pts)
                    {
                        ShowPolygon = false,
                        HeightDiv   = bezierSurfaceC0Patch.SurfaceDivisionsV,
                        WidthDiv    = bezierSurfaceC0Patch.SurfaceDivisionsU,
                        Name        = bezierSurfaceC0Patch.Name,
                        VPos        = bezierSurfaceC0Patch.PatchU,
                        UPos        = bezierSurfaceC0Patch.PatchV
                    };
                    AddNewModel(patch);
                    patches.Add(patch);
                    ptches[bezierSurfaceC0Patch.PatchV, bezierSurfaceC0Patch.PatchU] = patch;
                }


                var surfacePoints = patches.SelectMany(x => x.EnumerateCatPoints()).Distinct().ToList();
                var surface       = new Surface(SurfaceType.Bezier, ptches, surfacePoints, this, false, false)
                {
                    Name     = bezierSurfaceC0.Name,
                    PatchesU = bezierSurfaceC0.PatchesU,
                    PatchesV = bezierSurfaceC0.PatchesV,
                };
                AddNewModel(surface);
            }

            foreach (var bezierSurfaceC2 in scene.BezierSurfacesC2)
            {
                var patches = new List <Patch>();
                var ptches  = new Patch[bezierSurfaceC2.PatchesV, bezierSurfaceC2.PatchesU];

                foreach (var bezierSurfaceC2Patch in bezierSurfaceC2.Patches)
                {
                    var pts = new CatPoint[4, 4];
                    for (int i = 0; i < 4; i++)
                    {
                        for (int j = 0; j < 4; j++)
                        {
                            pts[i, j] = catPoints[bezierSurfaceC2Patch.Points[j, i]];
                        }
                    }
                    var patch = new BSplinePatch(pts)
                    {
                        ShowPolygon = false,
                        HeightDiv   = bezierSurfaceC2Patch.SurfaceDivisionsV,
                        WidthDiv    = bezierSurfaceC2Patch.SurfaceDivisionsU,
                        Name        = bezierSurfaceC2Patch.Name,
                        UPos        = bezierSurfaceC2Patch.PatchU,
                        VPos        = bezierSurfaceC2Patch.PatchV
                    };
                    AddNewModel(patch);
                    patches.Add(patch);
                    ptches[bezierSurfaceC2Patch.PatchV, bezierSurfaceC2Patch.PatchU] = patch;
                }
                var loopedV = true;
                var loopedU = true;


                for (int i = 0; i < 3; i++)
                {
                    var pat  = ptches[0, 0].GetCatPoint(i, 0);
                    var pat2 = ptches[0, bezierSurfaceC2.PatchesU - 1].GetCatPoint(i + 1, 0);
                    if (pat != pat2 ||
                        ptches[0, 0].GetCatPoint(i, 1) != ptches[0, bezierSurfaceC2.PatchesU - 1].GetCatPoint(i + 1, 1) ||
                        ptches[0, 0].GetCatPoint(i, 2) != ptches[0, bezierSurfaceC2.PatchesU - 1].GetCatPoint(i + 1, 2))
                    {
                        loopedU = false;
                        break;
                    }
                }

                if (loopedU)
                {
                    for (int i = 0; i < ptches.GetLength(0); i++)
                    {
                        if (ptches[i, 0].GetCatPoint(0, 3) != ptches[i, bezierSurfaceC2.PatchesU - 1].GetCatPoint(1, 3) ||
                            ptches[i, 0].GetCatPoint(1, 3) != ptches[i, bezierSurfaceC2.PatchesU - 1].GetCatPoint(2, 3) ||
                            ptches[i, 0].GetCatPoint(2, 3) != ptches[i, bezierSurfaceC2.PatchesU - 1].GetCatPoint(3, 3))
                        {
                            loopedU = false;
                            break;
                        }
                    }
                }

                for (int i = 0; i < 3; i++)
                {
                    if (ptches[0, 0].GetCatPoint(0, i) != ptches[bezierSurfaceC2.PatchesV - 1, 0].GetCatPoint(0, i + 1) ||
                        ptches[0, 0].GetCatPoint(0, i) != ptches[bezierSurfaceC2.PatchesV - 1, 0].GetCatPoint(0, i + 1) ||
                        ptches[0, 0].GetCatPoint(0, i) != ptches[bezierSurfaceC2.PatchesV - 1, 0].GetCatPoint(0, i + 1))
                    {
                        loopedV = false;
                        break;
                    }
                }

                if (loopedV)
                {
                    for (int i = 0; i < ptches.GetLength(1); i++)
                    {
                        if (ptches[0, i].GetCatPoint(3, 0) != ptches[bezierSurfaceC2.PatchesV - 1, i].GetCatPoint(3, 1) ||
                            ptches[0, i].GetCatPoint(3, 1) != ptches[bezierSurfaceC2.PatchesV - 1, i].GetCatPoint(3, 2) ||
                            ptches[0, i].GetCatPoint(3, 2) != ptches[bezierSurfaceC2.PatchesV - 1, i].GetCatPoint(3, 3))
                        {
                            loopedV = false;
                            break;
                        }
                    }
                }
                if (loopedU == loopedV)
                {
                    Console.WriteLine($"Surf: {bezierSurfaceC2.Name}");
                }

                var surfacePoints = patches.SelectMany(x => x.EnumerateCatPoints()).Distinct().ToList();
                var surface       = new Surface(SurfaceType.BSpline, ptches, surfacePoints, this, loopedU, loopedV)
                {
                    Name     = bezierSurfaceC2.Name,
                    PatchesU = bezierSurfaceC2.PatchesU,
                    PatchesV = bezierSurfaceC2.PatchesV
                };
                AddNewModel(surface);
            }
        }
コード例 #46
0
    public void link_two_maps(MapContainer item)
    {
        //return;

        string ordered_state1;
        string ordered_state2;

        if (string.Compare(this.parentName, item.parentName) < 0)
        {
            ordered_state1 = this.parentName;
            ordered_state2 = item.parentName;
        }
        else
        {
            ordered_state1 = item.parentName;
            ordered_state2 = this.parentName;
        }

        var flows = this.mapController.county_flattened[new Tuple <string, string>(ordered_state1, ordered_state2)];

        Dictionary <String, InteractableMap> lchild1 = new Dictionary <string, InteractableMap>();

        foreach (var ma2p in this.GetComponentsInChildren <InteractableMap>())
        {
            lchild1[ma2p.name] = ma2p;
        }

        Dictionary <String, InteractableMap> lchild2 = new Dictionary <string, InteractableMap>();

        foreach (var ma2p in item.GetComponentsInChildren <InteractableMap>())
        {
            lchild2[ma2p.name] = ma2p;
        }

        foreach (var val in flows.Take(100))
        {
            InteractableMap origin;
            InteractableMap destination;
            Transform       origin_t;
            Transform       dest_t;


            if (val.Item1 == this.parentName)
            {
                origin      = lchild1[val.Item2];
                destination = lchild2[val.Item4];
                origin_t    = this.transform;
                dest_t      = item.transform;
            }
            else
            {
                origin      = lchild2[val.Item2];
                destination = lchild1[val.Item4];
                origin_t    = item.transform;
                dest_t      = this.transform;
            }
            var flowData = val.Item5;

            Bezier b = new Bezier(origin_t, origin, destination, 0.1F * (0.00000199192F * flowData + 0.05F), dest_t);

            this.internalLines.Add(b);
            item.internalLines.Add(b);
        }
    }
コード例 #47
0
 public Vector3 GetPoint(float t)
 {
     return(transform.TransformPoint(Bezier.GetPoint(points[0], points[1], points[2], points[3], t)));
 }
コード例 #48
0
    private void Start()
    {
        this.reportGrabbed = delegate(bool x)
        {
            if (!(this.moved) && (this.level > 0))
            {
                //this.transform.localScale = new Vector3(1F, 1F, 1F);
                this.transform.parent = this.transform.root.GetComponent <MapController>().transform;

                //this.stack_remove(this, 0);
                this.moved = true;
            }
        };

        var mc = this.transform.root.GetComponent <MapController>();

        if (mc != null && this.transform.root.GetComponent <MapController>().startUp)
        {
            //Debug.Log(this.transform.root);
            string file = Application.streamingAssetsPath + "/" + mc.mainMap;
            this.parentName = "America";
            this.level      = 0;

            MapRenderer map = new MapRenderer();
            //GameObject plane = GameObject.CreatePrimitive(PrimitiveType.Plane);
            //plane.transform.rotation = Quaternion.Euler(new Vector3(0, 90, -90));
            //plane.transform.parent = this.gameObject.transform;

            map.drawMultiple(this.gameObject, reportGrabbed, file, 0, this.transform.root.GetComponent <MapController>().haveTooltip, this.transform.root.GetComponent <MapController>().mapScale, parentName);

            this.transform.root.GetComponent <MapController>().startUp = false;

            Dictionary <String, InteractableMap> lchild = new Dictionary <string, InteractableMap>();
            foreach (var ma2p in this.GetComponentsInChildren <InteractableMap>())
            {
                lchild[ma2p.name] = ma2p;
            }


            foreach (var pair in mc.flattenedList["America"].Take(100))
            {
                try
                {
                    var origin      = lchild[pair.Item1];
                    var destination = lchild[pair.Item2];
                    var flowData    = pair.Item3;

                    Bezier b = new Bezier(this.transform, origin, destination, 0.1F * (0.00000199192F * flowData + 0.05F));

                    internalLines.Add(b);
                }
                catch { }

                //b.line.startWidth = 0.1F * (0.00000699192F * flowData + 0.05F);
                //Debug.Log("line width = " + b.line.startWidth.ToString());
                //b.line.endWidth = b.line.startWidth;

                //b.line.material = new Material(Shader.Find("Sprites/Default"));

                //b.line.startColor = Color.green; //new Color(253, 187, 45, 255);
                //b.line.endColor = Color.blue; // new Color(34, 193,195, 255);
            }
        }
    }
コード例 #49
0
 void Update()
 {
     transform.position = Bezier.GetPoint(p0.position, p1.position, p2.position, p3.position, t);
     transform.rotation = Quaternion.LookRotation(Bezier.GetFirstDerivative(p0.position, p1.position, p2.position, p3.position, t));
 }
コード例 #50
0
 private static List <Vector2> intersect(Line b1, Bezier b2, bool filter_self, bool filter_other)
 {
     return(intersect(b2, b1, filter_other, filter_self));
 }