22using System . Collections . Generic ;
33using UnityEngine ;
44
5- public class BoidManager : MonoBehaviour {
5+ public class BoidManager : MonoBehaviour
6+ {
67
78 const int threadGroupSize = 1024 ;
89
10+ public bool running = true ;
911 public BoidSettings settings ;
1012 public ComputeShader compute ;
1113 Boid [ ] boids ;
1214
13- void Start ( ) {
14- boids = FindObjectsOfType < Boid > ( ) ;
15- foreach ( Boid b in boids ) {
16- b . Initialize ( settings , null ) ;
15+ void Start ( )
16+ {
17+ boids = FindObjectsOfType < Boid > ( ) ;
18+ foreach ( Boid b in boids )
19+ {
20+ b . Initialize ( settings , null ) ;
1721 }
1822
1923 }
2024
21- void Update ( ) {
22- if ( boids != null ) {
25+ void Update ( )
26+ {
27+ if ( boids != null & running )
28+ {
2329
2430 int numBoids = boids . Length ;
2531 var boidData = new BoidData [ numBoids ] ;
2632
27- for ( int i = 0 ; i < boids . Length ; i ++ ) {
33+ for ( int i = 0 ; i < boids . Length ; i ++ )
34+ {
2835 boidData [ i ] . position = boids [ i ] . position ;
2936 boidData [ i ] . direction = boids [ i ] . forward ;
3037 }
3138
32- var boidBuffer = new ComputeBuffer ( numBoids , BoidData . Size ) ;
33- boidBuffer . SetData ( boidData ) ;
39+ var boidBuffer = new ComputeBuffer ( numBoids , BoidData . Size ) ;
40+ boidBuffer . SetData ( boidData ) ;
3441
35- compute . SetBuffer ( 0 , "boids" , boidBuffer ) ;
36- compute . SetInt ( "numBoids" , boids . Length ) ;
37- compute . SetFloat ( "viewRadius" , settings . perceptionRadius ) ;
38- compute . SetFloat ( "avoidRadius" , settings . avoidanceRadius ) ;
42+ compute . SetBuffer ( 0 , "boids" , boidBuffer ) ;
43+ compute . SetInt ( "numBoids" , boids . Length ) ;
44+ compute . SetFloat ( "viewRadius" , settings . perceptionRadius ) ;
45+ compute . SetFloat ( "avoidRadius" , settings . avoidanceRadius ) ;
3946
40- int threadGroups = Mathf . CeilToInt ( numBoids / ( float ) threadGroupSize ) ;
41- compute . Dispatch ( 0 , threadGroups , 1 , 1 ) ;
47+ int threadGroups = Mathf . CeilToInt ( numBoids / ( float ) threadGroupSize ) ;
48+ compute . Dispatch ( 0 , threadGroups , 1 , 1 ) ;
4249
43- boidBuffer . GetData ( boidData ) ;
50+ boidBuffer . GetData ( boidData ) ;
4451
45- for ( int i = 0 ; i < boids . Length ; i ++ ) {
52+ for ( int i = 0 ; i < boids . Length ; i ++ )
53+ {
4654 boids [ i ] . avgFlockHeading = boidData [ i ] . flockHeading ;
4755 boids [ i ] . centreOfFlockmates = boidData [ i ] . flockCentre ;
4856 boids [ i ] . avgAvoidanceHeading = boidData [ i ] . avoidanceHeading ;
4957 boids [ i ] . numPerceivedFlockmates = boidData [ i ] . numFlockmates ;
5058
51- boids [ i ] . UpdateBoid ( ) ;
59+ boids [ i ] . UpdateBoid ( ) ;
5260 }
5361
54- boidBuffer . Release ( ) ;
62+ boidBuffer . Release ( ) ;
63+ }
64+
65+ if ( Input . GetKeyDown ( KeyCode . Space ) )
66+ {
67+ running = ! running ;
5568 }
5669 }
5770
58- public struct BoidData {
71+ public struct BoidData
72+ {
5973 public Vector3 position ;
6074 public Vector3 direction ;
6175
@@ -64,9 +78,11 @@ public struct BoidData {
6478 public Vector3 avoidanceHeading ;
6579 public int numFlockmates ;
6680
67- public static int Size {
68- get {
69- return sizeof ( float ) * 3 * 5 + sizeof ( int ) ;
81+ public static int Size
82+ {
83+ get
84+ {
85+ return sizeof ( float ) * 3 * 5 + sizeof ( int ) ;
7086 }
7187 }
7288 }
0 commit comments