Пример #1
0
    private void OnDrawGizmos()
    {
        GVStar star = GVUtil.GetNearStar(transform.position);

        if (star != null)
        {
            Gizmos.DrawLine(transform.position, transform.position + _direction);
            Gizmos.DrawLine(transform.position, transform.position + _upDir);
            Vector3 dirG = star.GetGravityDirection(transform.position);
//            Gizmos.DrawLine(transform.position, transform.position + dirG*5f);
        }
    }
Пример #2
0
    // Update is called once per frame
    void Update()
    {
        GVStar  star  = GVUtil.GetNearStar(transform.position);
        Vector3 dirG  = star.GetGravityDirection(transform.position);
        Vector3 dirUp = Vector3.Lerp(_upDir, -dirG, Time.deltaTime * 10f);

        _upDir     = dirUp;
        _direction = (_direction - dirG * Vector3.Dot(_direction, dirG)).normalized;
        transform.LookAt(transform.position + _direction, _upDir);

        float jumpVel = Vector3.Dot(dirUp, _velocity);

        jumpVel = Mathf.Clamp(jumpVel - Time.deltaTime * 30f, -10f, 20f);
        if (_isGround && Input.GetButtonDown("Jump"))
        {
            jumpVel = 20f;
        }
        _velocity = dirUp * jumpVel;

        // move
        Vector3 moveDir = Vector3.zero;

        moveDir = _cam.transform.up * Input.GetAxis("Vertical")
                  + _cam.transform.right * Input.GetAxis("Horizontal");

        Vector3 pos         = transform.position;
        float   inverseMove = 0f;

        if (moveDir.magnitude > 0f)
        {
            moveDir    = (moveDir - dirG * Vector3.Dot(moveDir, dirG)).normalized;
            _direction = Vector3.Lerp(_direction, moveDir, Time.deltaTime * 10f);
            Vector3 prevPos = pos;
            float   moveLen = Time.deltaTime * _speed;
            move(ref pos, moveDir, Time.deltaTime * _speed, true);
//            inverseMove = -Mathf.Min(0f,Vector3.Dot(dirG,pos - prevPos));
            inverseMove = _isGround?moveLen:0f;
        }

        // move jump
        if (move(ref pos, dirG, (-jumpVel * Time.deltaTime) + inverseMove, false))
        {
            _isGround = true;
        }
        else
        {
            _isGround = false;
        }

        trace(pos);
        transform.position = pos;
    }
        public override void GenerateCandidates(Implementation Impl, IRegion region)
        {
            HashSet <Variable> modset = LoopInvariantGenerator.GetModifiedVariables(region);

            foreach (Variable v in Impl.LocVars)
            {
                string basicName = GVUtil.StripThreadIdentifier(v.Name);
                if (verifier.mayBePowerOfTwoAnalyser.MayBePowerOfTwo(Impl.Name, basicName))
                {
                    if (verifier.ContainsNamedVariable(modset, basicName))
                    {
                        var bitwiseInv = Expr.Or(
                            Expr.Eq(new IdentifierExpr(v.tok, v), verifier.Zero(32)),
                            Expr.Eq(verifier.IntRep.MakeAnd(
                                        new IdentifierExpr(v.tok, v),
                                        verifier.IntRep.MakeSub(new IdentifierExpr(v.tok, v), verifier.IntRep.GetLiteral(1, 32))
                                        ), verifier.Zero(32)));
                        verifier.AddCandidateInvariant(region, bitwiseInv, "pow2");

                        verifier.AddCandidateInvariant(region,
                                                       Expr.Neq(new IdentifierExpr(v.tok, v),
                                                                verifier.Zero(32)),
                                                       "pow2NotZero");
                    }
                }
            }

            // Relational Power Of Two
            var incs = modset.Where(v => verifier.relationalPowerOfTwoAnalyser.IsInc(Impl.Name, v.Name));
            var decs = modset.Where(v => verifier.relationalPowerOfTwoAnalyser.IsDec(Impl.Name, v.Name));

            if (incs.ToList().Count() == 1 && decs.ToList().Count() == 1)
            {
                var inc = incs.Single();
                var dec = decs.Single();
                for (int i = (1 << 15); i > 0; i >>= 1)
                {
                    var mulInv = Expr.Eq(verifier.IntRep.MakeMul(new IdentifierExpr(inc.tok, inc), new IdentifierExpr(dec.tok, dec)), verifier.IntRep.GetLiteral(i, 32));
                    verifier.AddCandidateInvariant(region, mulInv, "relationalPow2");
                    var disjInv = Expr.Or(
                        Expr.And(Expr.Eq(new IdentifierExpr(dec.tok, dec), verifier.Zero(32)),
                                 Expr.Eq(new IdentifierExpr(inc.tok, inc), verifier.IntRep.GetLiteral(2 * i, 32))),
                        mulInv);
                    verifier.AddCandidateInvariant(region, disjInv, "relationalPow2");
                }
            }
        }
Пример #4
0
 private Program getFreshProgram(bool disableChecks, bool inline)
 {
     return(GVUtil.GetFreshProgram(this.FileNames, disableChecks, inline));
 }