Mesh BuildPoints(GPUVoxelData data, out int[] vIndices)
        {
            var voxels      = data.GetData();
            var vertices    = new List <Vector3>();
            var indices     = new List <int>();
            var vIndicesTmp = new List <int>();

            var count = 0;

            for (int i = 0, n = voxels.Length; i < n; i++)
            {
                var v = voxels[i];
                if (v.flag)
                {
                    vertices.Add(v.position);
                    indices.Add(count++);
                    vIndicesTmp.Add(i);
                }
            }

            vIndices = vIndicesTmp.ToArray();

            var mesh = new Mesh();

            mesh.indexFormat = IndexFormat.UInt32;
            mesh.vertices    = vertices.ToArray();
            mesh.SetIndices(indices.ToArray(), MeshTopology.Points, 0);
            mesh.RecalculateBounds();
            return(mesh);
        }
        void ApplyImpulse(float dt, float amount, ComputeBuffer[] buffer)
        {
            //Set voxels
            var impulseKernel = new Kernel(m_applyImpulse, "GaussImpulse");

            foreach (Spawn spawn in this.mediator.spawns)
            {
                GPUVoxelData voxelData = spawn.GetGPUVoxelData();
                if (voxelData == null)
                {
                    continue;
                }

                m_applyImpulse.SetVector("_Size", m_size);
                m_applyImpulse.SetFloat("_NoisePercent", m_noisePercent);
                m_applyImpulse.SetFloat("_Amount", amount);
                m_applyImpulse.SetFloat("_DeltaTime", dt);
                m_applyImpulse.SetFloat("_Radius", spawn.GetObjectRadius());
                m_applyImpulse.SetVector("_ObjectPosition", spawn.GetObjectCenter());
                //m_applyImpulse.SetFloat("_Radius", 0.04f);
                //m_applyImpulse.SetVector("_ObjectPosition", new Vector4(0.5f,0.1f,0.5f,0.0f));
                m_applyImpulse.SetBuffer(impulseKernel.Index, "_VoxelBuffer", voxelData.Buffer);
                m_applyImpulse.SetBuffer(impulseKernel.Index, "_Read", buffer[READ]);
                m_applyImpulse.SetBuffer(impulseKernel.Index, "_Write", buffer[WRITE]);
                m_applyImpulse.Dispatch(impulseKernel.Index,
                                        (int)m_size.x / NUM_THREADS, (int)m_size.y / NUM_THREADS, (int)m_size.z / NUM_THREADS);
            }

            Swap(buffer);
        }
        void ApplyExtinguishmentImpulse(float dt, float amount, ComputeBuffer[] buffer)
        {
            var extinguishmentKernel = new Kernel(m_applyImpulse, "ExtinguishmentImpluse");

            foreach (Spawn spawn in this.mediator.spawns)
            {
                GPUVoxelData voxelData = spawn.GetGPUVoxelData();
                if (voxelData == null)
                {
                    continue;
                }

                m_applyImpulse.SetVector("_Size", m_size);
                m_applyImpulse.SetFloat("_Amount", amount);
                m_applyImpulse.SetFloat("_DeltaTime", dt);
                m_applyImpulse.SetVector("_ObjectPosition", spawn.GetObjectCenter());
                m_applyImpulse.SetFloat("_Radius", spawn.GetObjectRadius());
                m_applyImpulse.SetFloat("_Extinguishment", m_reactionExtinguishment);
                m_applyImpulse.SetBuffer(extinguishmentKernel.Index, "_Read", buffer[READ]);
                m_applyImpulse.SetBuffer(extinguishmentKernel.Index, "_Write", buffer[WRITE]);
                m_applyImpulse.SetBuffer(extinguishmentKernel.Index, "_Reaction", m_reaction[READ]);
                m_applyImpulse.Dispatch(extinguishmentKernel.Index,
                                        (int)m_size.x / NUM_THREADS, (int)m_size.y / NUM_THREADS, (int)m_size.z / NUM_THREADS);
            }

            Swap(buffer);
        }
        void ComputeObstacles()
        {
            var obstacleResetKernel = new Kernel(m_computeObstacles, "ResetObstacle");

            m_computeObstacles.SetBuffer(obstacleResetKernel.Index, "_Write", m_obstacles);
            m_computeObstacles.Dispatch(obstacleResetKernel.Index, (int)m_size.x / NUM_THREADS, (int)m_size.y / NUM_THREADS, (int)m_size.z / NUM_THREADS);

            var obstacleUpdateKernel = new Kernel(m_computeObstacles, "UpdatObstacle");

            foreach (Obstacle obstacle in this.mediator.obstacles)
            {
                GPUVoxelData voxelData = obstacle.GetGPUVoxelData();
                m_computeObstacles.SetVector("_Size", m_size);
                m_computeObstacles.SetFloat("_Radius", obstacle.GetObjectRadius());
                m_computeObstacles.SetVector("_ObjectPosition", obstacle.GetObjectCenter());
                m_computeObstacles.SetBool("_WallLeft", m_wallLeft);
                m_computeObstacles.SetBool("_WallRight", m_wallRight);
                m_computeObstacles.SetBool("_WallUp", m_wallUp);
                m_computeObstacles.SetBool("_WallDown", m_wallDown);
                m_computeObstacles.SetBool("_WallFront", m_wallFront);
                m_computeObstacles.SetBool("_WallBack", m_wallBack);

                m_computeObstacles.SetBuffer(obstacleUpdateKernel.Index, "_VoxelBuffer", voxelData.Buffer);
                m_computeObstacles.SetBuffer(obstacleUpdateKernel.Index, "_Write", m_obstacles);
                m_computeObstacles.Dispatch(obstacleUpdateKernel.Index, (int)m_size.x / NUM_THREADS, (int)m_size.y / NUM_THREADS, (int)m_size.z / NUM_THREADS);
            }
        }
Exemple #5
0
        protected void ReleaseBuffers()
        {
            if (data != null)
            {
                data.Dispose();
                data = null;
            }

            if (particleBuffer != null)
            {
                particleBuffer.Release();
                particleBuffer = null;
            }

            var filter = GetComponent <MeshFilter>();

            if (filter.sharedMesh != null)
            {
                Destroy(filter.sharedMesh);
            }

            if (gradient != null)
            {
                Destroy(gradient);
            }
        }
Exemple #6
0
    public void UpdateVertexBuffer(GPUVoxelData voxels)
    {
        int kernel;

        switch (renderType)
        {
        case RenderType.Flat:
            kernel = marchingCubesShader.FindKernel("MarchingCubesFlat");
            break;

        case RenderType.Smooth:
            kernel = marchingCubesShader.FindKernel("MarchingCubesSmooth");
            break;

        default:
            throw new ArgumentException("Unknown render type");
        }
        VertexBuffer.SetCounterValue(0);
        marchingCubesShader.SetBuffer(kernel, "points", voxels.VoxelBuffer);
        marchingCubesShader.SetBuffer(kernel, "colors", voxels.ColorBuffer);
        marchingCubesShader.SetBuffer(kernel, "triangles", vertexBuffer);
        marchingCubesShader.SetInt("numPointsPerAxis", voxels.Resolution);
        marchingCubesShader.SetFloat("isoLevel", isoLevel);
        marchingCubesShader.SetFloat("chunkSize", voxels.Size);
        marchingCubesShader.Dispatch(kernel, voxels.Resolution / 8, voxels.Resolution / 8, voxels.Resolution / 8);
        ComputeBuffer.CopyCount(VertexBuffer, drawArgs, sizeof(int));
    }
Exemple #7
0
        public void UpdateMeshVoxelizer()
        {
            if (this.voxelsInBounds == null)
            {
                return;
            }

            /*if (type == MeshVisualType.Mesh) {
             *  //this.spawnObj.GetComponent<MeshFilter>().sharedMesh = defaultMesh;
             * } else if (type == MeshVisualType.Voxel) {
             *  //this.spawnObj.GetComponent<MeshFilter>().sharedMesh = null;
             * } else if (type == MeshVisualType.None) {
             *  //this.spawnObj.GetComponent<MeshFilter>().sharedMesh = null;
             * }*/

            this.SetObjectCenter();
            this.SetObjectRadius();

            var mesh = SampleMesh();

            if (mesh == null)
            {
                return;
            }
            this.voxelsInBounds = gpuVoxelizer.Voxelize(voxelizer, mesh, this.spawnObj.transform, true);

            //Debug.LogFormat("Num of triangles: {0}", mesh.triangles.Length);
        }
Exemple #8
0
        private void CreatePreview()
        {
            GPUVoxelData data = GPUVoxelizer.Voxelize(shader, selectedMesh, resolution, false, false);

            previewMesh       = VoxelMesh.Build(data.GetData(), data.UnitLength, true);
            selectedVoxelInfo = BuildVoxInfo(data.GetData(), data.UnitLength);
            CreatePreviewPalette();
        }
        void Setup(GPUVoxelData data)
        {
            particleUpdate.SetBuffer(setupKernel.Index, kVoxelBufferKey, data.Buffer);
            particleUpdate.SetBuffer(setupKernel.Index, kParticleBufferKey, particleBuffer);
            particleUpdate.SetInt(kParticleCountKey, particleBuffer.count);
            particleUpdate.SetFloat(kUnitLengthKey, data.UnitLength);

            particleUpdate.Dispatch(setupKernel.Index, particleBuffer.count / (int)setupKernel.ThreadX + 1, (int)setupKernel.ThreadY, (int)setupKernel.ThreadZ);
        }
        void Compute(Kernel kernel, GPUVoxelData data, float dt)
        {
            particleUpdate.SetBuffer(kernel.Index, kVoxelBufferKey, data.Buffer);
            particleUpdate.SetFloat(kUnitLengthKey, data.UnitLength);

            particleUpdate.SetBuffer(kernel.Index, kParticleBufferKey, particleBuffer);
            particleUpdate.SetInt(kParticleCountKey, particleBuffer.count);

            particleUpdate.Dispatch(kernel.Index, particleBuffer.count / (int)kernel.ThreadX + 1, (int)kernel.ThreadY, (int)kernel.ThreadZ);
        }
Exemple #11
0
        public void Voxelize(Mesh mesh, Bounds bounds)
        {
            if (data != null)
            {
                data.Dispose();
                data = null;
            }

            // data = GPUVoxelizer.Voxelize(voxelizer, mesh, mesh.bounds, resolution, true, false);
            data = GPUVoxelizer.Voxelize(voxelizer, mesh, Mathf.Max(10, resolution) >> level, true, false);
        }
Exemple #12
0
        void Setup(GPUVoxelData data)
        {
            particleUpdate.SetBuffer(setupKernel.Index, kVoxelBufferKey, data.Buffer);
            particleUpdate.SetBuffer(setupKernel.Index, kParticleBufferKey, particleBuffer);
            particleUpdate.SetInt(kParticleCountKey, particleBuffer.count);
            particleUpdate.SetInt(kWidthKey, data.Width);
            particleUpdate.SetInt(kHeightKey, data.Height);
            particleUpdate.SetInt(kDepthKey, data.Depth);
            particleUpdate.SetVector(kSpeedKey, new Vector2(speedScaleMin, speedScaleMax));
            particleUpdate.SetFloat(kUnitLengthKey, data.UnitLength);

            particleUpdate.Dispatch(setupKernel.Index, particleBuffer.count / (int)setupKernel.ThreadX + 1, (int)setupKernel.ThreadY, (int)setupKernel.ThreadZ);
        }
        protected void ReleaseBuffers()
        {
            if (data != null)
            {
                data.Dispose();
                data = null;
            }

            if (particleBuffer != null)
            {
                particleBuffer.Release();
                particleBuffer = null;
            }
        }
        void OnDestroy()
        {
            if (particleBuffer != null)
            {
                particleBuffer.Release();
                particleBuffer = null;
            }

            if (data != null)
            {
                data.Dispose();
                data = null;
            }
        }
Exemple #15
0
        protected void Sample()
        {
            skinned.BakeMesh(mesh);

            // expand bounds to contain all bounds of animated meshes
            bounds.Encapsulate(mesh.bounds.min);
            bounds.Encapsulate(mesh.bounds.max);

            if (data != null)
            {
                data.Dispose();
                data = null;
            }
            data = GPUVoxelizer.Voxelize(voxelizer, bounds, mesh, resolution);
        }
        void Update()
        {
            if (data == null)
            {
                return;
            }

            data.Dispose();

            var mesh = Sample();

            data = GPUVoxelizer.Voxelize(voxelizer, mesh, count, (type == MeshType.Volume));

            Compute(updateKernel, data, Time.deltaTime);
        }
Exemple #17
0
        Mesh BuildPoints(GPUVoxelData data)
        {
            var count = data.Width * data.Height * data.Depth;
            var mesh  = new Mesh();

            mesh.indexFormat = IndexFormat.UInt32;
            mesh.vertices    = new Vector3[count];
            var indices = new int[count];

            for (int i = 0; i < count; i++)
            {
                indices[i] = i;
            }
            mesh.SetIndices(indices, MeshTopology.Points, 0);
            mesh.RecalculateBounds();
            return(mesh);
        }
        void Update()
        {
            if (data == null)
            {
                return;
            }

            data.Dispose();

            var mesh = Sample();

            data = GPUVoxelizer.Voxelize(voxelizer, mesh, count, (type == MeshType.Volume));

            Compute(updateKernel, data, Time.deltaTime);
            block.SetBuffer(kParticleBufferKey, particleBuffer);
            _renderer.SetPropertyBlock(block);
        }
Exemple #19
0
    // Start is called before the first frame update
    public void Voxelize()
    {
        var          mesh = GetComponent <MeshFilter>().mesh;
        GPUVoxelData data = GPUVoxelizer.Voxelize(
            voxelizer, // ComputeShader (Voxelizer.compute)
            mesh,      // a target mesh
            transform.worldToLocalMatrix,
            1.0f
            );

        gridData = data.VoxeltoGridVoxel(transform.localToWorldMatrix);
        WorldDataManager.Instance.ActiveWorld.CreateNewObjectFromGridData(gridData, new Voxel());

        // need to release a voxel buffer
        data.Dispose();
        Destroy(gameObject);
    }
        void Start()
        {
            var mesh = Sample();

            data = GPUVoxelizer.Voxelize(voxelizer, mesh, count, (type == MeshType.Volume));
            var pointMesh = BuildPoints(data);

            particleBuffer = new ComputeBuffer(pointMesh.vertexCount, Marshal.SizeOf(typeof(VParticle_t)));

            GetComponent <MeshFilter>().sharedMesh = pointMesh;

            block     = new MaterialPropertyBlock();
            _renderer = GetComponent <Renderer>();
            _renderer.GetPropertyBlock(block);

            setupKernel  = new Kernel(particleUpdate, kSetupKernelKey);
            updateKernel = new Kernel(particleUpdate, kUpdateKernelKey);

            Setup(data);
        }
Exemple #21
0
        public void InitMeshVoxelizer()
        {
            var mesh = SampleMesh();

            if (mesh == null)
            {
                return;
            }
            //defaultMesh = mesh;
            //defaultMaterial =this.spawnObj.GetComponent<MeshRenderer>().sharedMaterial;

            Bounds fireBounds  = this.mediator.bounds;
            Bounds spawnBounds = this.spawnObj.GetComponent <Renderer>().bounds;

            //Debug.Log("box min: " + this.mediator.bounds.min);
            //Debug.Log("box center: " + this.mediator.bounds.center);
            //Debug.Log("box size: " + this.mediator.bounds.size);
            //Debug.Log("spawn box center: " + spawnBounds.center);
            //Debug.Log("spawn box min: " + spawnBounds.min);
            //Debug.Log("spawn box max: " + spawnBounds.max);
            //Debug.Log("spawn box extends: " + spawnBounds.extents);
            //Debug.Log("spawn box size: " + spawnBounds.size);
            //Debug.Log("spawn mesh box center: " + mesh.bounds.center);
            //Debug.Log("spawn mesh box size: " + mesh.bounds.size);

            this.SetObjectCenter();
            this.SetObjectRadius();

            numOfVoxels = Mathf.ClosestPowerOfTwo(this.mediator.fluidSimulator3D.m_width);

            this.gpuVoxelizer = new GPUVoxelizer();
            this.gpuVoxelizer.InitVoxelization(mesh, this.mediator.bounds, numOfVoxels);
            this.voxelsInBounds = gpuVoxelizer.Voxelize(voxelizer, mesh, this.spawnObj.transform, true);

            this.GetComponent <MeshFilter>().sharedMesh = VoxelMesh.Build(this.voxelsInBounds.GetData(), this.voxelsInBounds.UnitLength, true);

            //Debug.LogFormat("!!!!!!!!!!!!!!!!!!!!! Num of triangles: {0}", mesh.triangles.Length);
        }
        void Start()
        {
            data = GPUVoxelizer.Voxelize(voxelizer, mesh, count);

            int[] indices;
            var   pointMesh = BuildPoints(data, out indices);

            particleBuffer = new ComputeBuffer(pointMesh.vertexCount, Marshal.SizeOf(typeof(VParticle_t)));
            indexBuffer    = new ComputeBuffer(pointMesh.vertexCount, Marshal.SizeOf(typeof(int)));
            indexBuffer.SetData(indices);

            GetComponent <MeshFilter>().sharedMesh = pointMesh;

            block    = new MaterialPropertyBlock();
            renderer = GetComponent <Renderer>();
            renderer.GetPropertyBlock(block);
            bounds = mesh.bounds;

            setupKernel  = new Kernel(particleUpdate, kSetupKernelKey);
            updateKernel = new Kernel(particleUpdate, kUpdateKernelKey);

            Setup();
        }
Exemple #23
0
 public void Init()
 {
     voxels  = new GPUVoxelData(resolution, size);
     gpuMesh = new GPUMesh(voxels.Volume * 5);
 }