コード例 #1
0
        // 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;
                    }
                }
            }
        }
コード例 #2
0
        // 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]);
            }
        }