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); } }
// 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"); } } }
private Program getFreshProgram(bool disableChecks, bool inline) { return(GVUtil.GetFreshProgram(this.FileNames, disableChecks, inline)); }