Esempio n. 1
0
        private void LateUpdate()
        {
            this.job.Complete();

            var res = this.meshResources;

            res.instancesBuffer.SetData(this.cubeInstances.AsArray());
            res.gridPositionBuffer.SetData(this.gridPositions.AsArray());
            res.nearGridIdBuffer.SetData(this.nearGrids.AsArray());

            var dargs  = res.argsBufferForDispatch;
            var remain = (64 - (this.cubeInstances.Length & 0x3f)) & 0x3f;

            for (var i = 0; i < remain; i++)
            {
                this.cubeInstances.AddNoResize(new CubeInstance {
                    instance = 0
                });
            }
            var dargparams = new IndirectArgumentsForDispatch(this.cubeInstances.Length >> 6, 1, 1);

            dargs.SetData(ref dargparams);
            //this.setGridCubeIdShader.Dispatch( 0, this.cubeInstances.Length >> 6, 1, 1 );

            var mesh  = res.mesh;
            var mat   = this.Material;
            var iargs = res.argsBufferForInstancing;

            var instanceCount = this.cubeInstances.Length;
            var iargparams    = new IndirectArgumentsForInstancing(mesh, instanceCount);

            iargs.SetData(ref iargparams);

            //var bounds = new Bounds() { center = Vector3.zero, size = Vector3.one * 1000.0f };
            //Graphics.DrawMeshInstancedIndirect( mesh, 0, mat, bounds, args );
        }
Esempio n. 2
0
File: mc.cs Progetto: abarabone/mc
        private unsafe void Update()
        {
            //var c = this.cubeGrids[ 5, 1, 3 ];
            //c[ i, 0, 0 ] ^= 1;
            //i = i + 1 & 31;
            this.gridData.Clear();
            this.cubeInstances.Clear();
            Debug.Log($"pre {this.cubeInstances.Length} {this.gridData.Length}");
            this.job = this.cubeGrids.BuildCubeInstanceData(this.gridData, this.cubeInstances);
            //}
            //private unsafe void LateUpdate()
            //{
            this.job.Complete();
            Debug.Log($"aft {this.cubeInstances.Length}/{this.cubeInstances.length} {this.gridData.Length}/{this.gridData.length}");

            var res = this.meshResources;

            res.CubeInstancesBuffer.SetData(this.cubeInstances.AsArray());
            Debug.Log($"CubeInstancesBuffer setdata {this.cubeInstances.Length} {this.gridData.Length}");

            //res.GridBuffer.SetData( this.gridData.AsArray() );
            var grids = new Vector4[this.gridData.Length * 2];

            fixed(Vector4 *pdst = grids)
            {
                var psrc = (Vector4 *)this.gridData.GetUnsafeReadOnlyPtr();

                UnsafeUtility.MemCpy(pdst, psrc, this.gridData.Length * 2 * sizeof(float4));
            }

            this.Material.SetVectorArray("grids", grids);
            Debug.Log($"SetVectorArray {grids.Length}");

            var remain = (64 - (this.cubeInstances.Length & 0x3f)) & 0x3f;

            for (var i = 0; i < remain; i++)
            {
                this.cubeInstances.AddNoResize(new CubeInstance {
                    instance = 1
                });
            }
            var dargparams = new IndirectArgumentsForDispatch(this.cubeInstances.Length >> 6, 1, 1);
            var dargs      = res.ArgsBufferForDispatch;

            dargs.SetData(ref dargparams);
            //this.setGridCubeIdShader.Dispatch( 0, this.cubeInstances.Length >> 6, 1, 1 );//

            var mesh  = res.mesh;
            var mat   = this.Material;
            var iargs = res.ArgsBufferForInstancing;

            var instanceCount = this.cubeInstances.Length;

            Debug.Log($"instanceCount {instanceCount}");
            var iargparams = new IndirectArgumentsForInstancing(mesh, instanceCount);

            iargs.SetData(ref iargparams);

            //var bounds = new Bounds() { center = Vector3.zero, size = Vector3.one * 1000.0f };//
            //Graphics.DrawMeshInstancedIndirect( mesh, 0, mat, bounds, iargs );//
        }