// Start is called before the first frame update void Start() { List <TextureUVAnimation> anims = new List <TextureUVAnimation>(); anims.Add(MakeGPUTextureAnim(this.RunBack)); anims.Add(MakeGPUTextureAnim(this.RunForward)); anims.Add(MakeGPUTextureAnim(this.RunLeft)); anims.Add(MakeGPUTextureAnim(this.RunRight)); var tlib = new TextureAnimationLibrary(anims); // make texture animation library object.. This will just combine all the above lists into a single buffer this.m = new MeshInstancer(); // create & initialize mesh instancer this.m.Initialize(override_mesh: BaseMeshLibrary.CreatePlane2Sides(), override_material: this.material, pathCount: 4); // override default cube with a two-sided plane that uses uv cutout shader this.m.SetAllTextureAnimations(tlib); // set all texture animations on GPU // initialize paths that the instances will follow this.p = new PathArrayHelper(this.m); // Create instances for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { // specify instance data var random_anim_id = anims[Random.Range(0, anims.Count)].animation_id; InstanceData <InstanceProperties> dat = new InstanceData <InstanceProperties>(this.m.Default); dat.position = new Vector3(i, 0, j); dat.rotation = Quaternion.Euler(-90, 0, 0); dat.props_IsTextureAnimation = true; dat.props_animationID = random_anim_id; dat.props_AnimationSpeed = Random.Range(0.5f, 2.0f); dat.props_AnimationSeconds = Random.Range(0, 1.0f); // create & assign path Path path = new Path(path_length: 4, m: this.m, use_constants: true); this.p.InitializePath(ref path); this.p.SetPathConstants(path, new Vector3(0, 0, Random.Range(-10.0f, 10.0f)), new Vector3(Random.Range(-1.0f, 1.0f), 0, Random.Range(-1.0f, 1.0f)), dat.rotation, dat.position); this.p.UpdatePath(ref path); dat.SetPath(path, this.m); // Initialize & send instance to gpu this.m.Initialize(ref dat); this.m.Append(ref dat); // Make a unity gameobject follow the first instance.. Just for testing CPU instance transform approximation if (i == 0 && j == 0) { this.follow_obj = GameObject.CreatePrimitive(PrimitiveType.Cube); this.follow_obj.name = "Calculated Object Transform"; this.follow_obj.transform.localScale = Vector3.one * 0.25f; this.follow_obj.transform.position = dat.position; this.follow_obj.transform.rotation = dat.rotation; this.follow_instance = dat; this.follow_path = path; } } } }
// Start is called before the first frame update void Start() { List <TextureUVAnimation> anims = new List <TextureUVAnimation>(); anims.Add(MakeGPUTextureAnim(this.Explosion)); this.m = new MeshInstancer(); this.m.Initialize(max_parent_depth: 1, pathCount: 2, override_mesh: BaseMeshLibrary.CreatePlane()); this.p = new PathArrayHelper(this.m); var tlib = new TextureAnimationLibrary(anims); this.m.SetAllTextureAnimations(tlib); this.m.FrustumCamera = this.FrustumCamera; var explosion_mesh_type = this.m.AddNewMeshType(this.m.Default.shared_mesh, Instantiate(this.ExplosionMaterial)); float f = 80.0f; for (int i = 0; i < N; i++) { this.instances[i] = new InstanceData <InstanceProperties>(explosion_mesh_type); this.instances[i].position = new Vector3(Random.Range(-f, f), Random.Range(-f, f), Random.Range(-f, f)); this.instances[i].props_animationID = tlib.Animations[0].animation_id; this.instances[i].props_IsTextureAnimation = true; this.instances[i].props_AnimationSeconds = Random.Range(0, 1.0f); this.instances[i].props_AnimationSpeed = 2.0f; var path = new Path(2, this.m, look_at_camera: true); // instruct instance to look at camera via path API this.p.InitializePath(ref path); this.p.SetPathStaticPosition(path, this.instances[i].position, Vector3.up); // just set a not-moving path this.p.UpdatePath(ref path); this.instances[i].SetPath(path, this.m); this.paths[i] = path; this.m.Initialize(ref this.instances[i]); this.m.Append(ref this.instances[i]); } }