private void GenerateObstacleVOs(Agent.VOBuffer vos) { for (int i = 0; i < this.simulator.obstacles.Count; i++) { ObstacleVertex obstacleVertex = this.simulator.obstacles[i]; ObstacleVertex obstacleVertex2 = obstacleVertex; do { if (obstacleVertex2.ignore || (obstacleVertex2.layer & this.collidesWith) == (RVOLayer)0) { obstacleVertex2 = obstacleVertex2.next; } else { Vector2 vector = Agent.To2D(obstacleVertex2.position); Vector2 vector2 = Agent.To2D(obstacleVertex2.next.position); float num = Agent.VO.SignedDistanceFromLine(vector, obstacleVertex2.dir, this.position); if (num >= -0.01f && num < this.neighbourDist) { float t = Vector2.Dot(this.position - vector, vector2 - vector) / (vector2 - vector).sqrMagnitude; float num2 = Mathf.Lerp(obstacleVertex2.position.y, obstacleVertex2.next.position.y, t); float sqrMagnitude = (Vector2.Lerp(vector, vector2, t) - this.position).sqrMagnitude; if (sqrMagnitude < this.neighbourDist * this.neighbourDist && this.elevationCoordinate <= num2 + obstacleVertex2.height && this.elevationCoordinate + this.height >= num2) { vos.Add(Agent.VO.SegmentObstacle(vector2 - this.position, vector - this.position, Vector2.zero, this.radius * 0.01f, 1f / this.ObstacleTimeHorizon, 1f / this.simulator.DeltaTime)); } } obstacleVertex2 = obstacleVertex2.next; } }while (obstacleVertex2 != obstacleVertex && obstacleVertex2 != null && obstacleVertex2.next != null); } }
private void GenerateNeighbourAgentVOs(Agent.VOBuffer vos) { float num = 1f / this.agentTimeHorizon; Vector2 a = this.currentVelocity; for (int i = 0; i < this.neighbours.Count; i++) { Agent agent = this.neighbours[i]; if (agent != this) { float num2 = Math.Min(this.elevationCoordinate + this.height, agent.elevationCoordinate + agent.height); float num3 = Math.Max(this.elevationCoordinate, agent.elevationCoordinate); if (num2 - num3 >= 0f) { float num4 = this.radius + agent.radius; Vector2 vector = agent.position - this.position; float num5; if (agent.locked || agent.manuallyControlled) { num5 = 1f; } else if (agent.Priority > 1E-05f || this.Priority > 1E-05f) { num5 = agent.Priority / (this.Priority + agent.Priority); } else { num5 = 0.5f; } Vector2 b = Vector2.Lerp(agent.currentVelocity, agent.desiredVelocity, 2f * num5 - 1f); Vector2 vector2 = Vector2.Lerp(a, b, num5); vos.Add(new Agent.VO(vector, vector2, num4, num, 1f / this.simulator.DeltaTime)); if (this.DebugDraw) { Agent.DrawVO(this.position + vector * num + vector2, num4 * num, this.position + vector2); } } } } }
private void GenerateObstacleVOs(Agent.VOBuffer vos) { float num = this.maxSpeed * this.obstacleTimeHorizon; for (int i = 0; i < this.simulator.obstacles.Count; i++) { ObstacleVertex obstacleVertex = this.simulator.obstacles[i]; ObstacleVertex obstacleVertex2 = obstacleVertex; do { if (obstacleVertex2.ignore || (obstacleVertex2.layer & this.collidesWith) == (RVOLayer)0) { obstacleVertex2 = obstacleVertex2.next; } else { float a; Vector2 vector = this.To2D(obstacleVertex2.position, out a); float b; Vector2 vector2 = this.To2D(obstacleVertex2.next.position, out b); Vector2 normalized = (vector2 - vector).normalized; float num2 = Agent.VO.SignedDistanceFromLine(vector, normalized, this.position); if (num2 >= -0.01f && num2 < num) { float t = Vector2.Dot(this.position - vector, vector2 - vector) / (vector2 - vector).sqrMagnitude; float num3 = Mathf.Lerp(a, b, t); float sqrMagnitude = (Vector2.Lerp(vector, vector2, t) - this.position).sqrMagnitude; if (sqrMagnitude < num * num && this.elevationCoordinate <= num3 + obstacleVertex2.height && this.elevationCoordinate + this.height >= num3) { vos.Add(Agent.VO.SegmentObstacle(vector2 - this.position, vector - this.position, Vector2.zero, this.radius * 0.01f, 1f / this.ObstacleTimeHorizon, 1f / this.simulator.DeltaTime)); } } obstacleVertex2 = obstacleVertex2.next; } }while (obstacleVertex2 != obstacleVertex && obstacleVertex2 != null && obstacleVertex2.next != null); } }