void Update()
        {
            if (!_isInit)
            {
                if (_clothSim == null)
                {
                    _clothSim = GetComponent <GPUClothSimulation>();
                }

                if (_clothSim != null && _clothSim.IsInit)
                {
                    var gridList                  = new List <SpringIds>();
                    var gridDiagonalList          = new List <SpringIds>();
                    var gridDiagonalAlternateList = new List <SpringIds>();

                    var res = _clothSim.GetClothResolution();
                    for (var y = 0; y < res.y; y++)
                    {
                        for (var x = 0; x < res.x; x++)
                        {
                            gridList.Add(new SpringIds(new Vector2Int(x, y), new Vector2Int(x, y + 1)));
                            gridList.Add(new SpringIds(new Vector2Int(x, y), new Vector2Int(x + 1, y)));

                            if (x < res.x - 1 && y < res.y - 1)
                            {
                                gridDiagonalList.Add(new SpringIds(new Vector2Int(x, y), new Vector2Int(x + 1, y + 1)));
                                gridDiagonalList.Add(new SpringIds(new Vector2Int(x + 1, y), new Vector2Int(x, y + 1)));
                            }

                            if (x < res.x - 2 && y < res.y - 2)
                            {
                                gridDiagonalAlternateList.Add(new SpringIds(new Vector2Int(x, y), new Vector2Int(x + 2, y + 2)));
                            }
                            if (x >= 2 && y < res.y - 2)
                            {
                                gridDiagonalAlternateList.Add(new SpringIds(new Vector2Int(x, y), new Vector2Int(x - 2, y + 2)));
                            }
                        }
                    }

                    _gridBuffer = new ComputeBuffer(gridList.Count, Marshal.SizeOf(typeof(SpringIds)));
                    _gridBuffer.SetData(gridList.ToArray());

                    _gridDiagonalBuffer = new ComputeBuffer(gridDiagonalList.Count, Marshal.SizeOf(typeof(SpringIds)));
                    _gridDiagonalBuffer.SetData(gridDiagonalList.ToArray());

                    _gridDiagonalAlternateBuffer = new ComputeBuffer(gridDiagonalAlternateList.Count, Marshal.SizeOf(typeof(SpringIds)));
                    _gridDiagonalAlternateBuffer.SetData(gridDiagonalAlternateList.ToArray());

                    gridList                  = null;
                    gridDiagonalList          = null;
                    gridDiagonalAlternateList = null;

                    _isInit = true;
                }
            }
        }
Exemple #2
0
        // メッシュを生成
        void GenerateMesh()
        {
            // メッシュの解像度を計算
            Vector2Int clothResolution = _clothSim.GetClothResolution();
            int        gridWidth       = clothResolution.x - 1;
            int        gridHeight      = clothResolution.y - 1;

            // MeshRendererを取得, または作成
            if (!GetComponent <MeshRenderer>())
            {
                _meshRenderer = gameObject.AddComponent <MeshRenderer>();
            }
            else
            {
                _meshRenderer = GetComponent <MeshRenderer>();
            }

            _meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
            _meshRenderer.receiveShadows    = false;

            // MeshFilterを作成
            MeshFilter meshFilter;

            if (!GetComponent <MeshFilter>())
            {
                meshFilter = gameObject.AddComponent <MeshFilter>();
            }
            else
            {
                meshFilter = GetComponent <MeshFilter>();
            }

            // Meshを作成
            var mesh = new Mesh();

            meshFilter.mesh = mesh;

            // グリッドの間隔
            var tileSizeX = 1.0f / gridWidth;
            var tileSizeY = 1.0f / gridHeight;

            // 頂点データを作成
            var vertices  = new List <Vector3>(); // 頂点
            var triangles = new List <int>();     // 頂点インデックス
            var normals   = new List <Vector3>(); // 法線
            var uvs       = new List <Vector2>(); // UV

            var index = 0;

            for (var y = 0; y < gridHeight; y++)
            {
                for (var x = 0; x < gridWidth; x++)
                {
                    // 頂点を追加
                    vertices.Add(new Vector3(x * tileSizeX, y * tileSizeY, 0));
                    vertices.Add(new Vector3((x + 1) * tileSizeX, y * tileSizeY, 0));
                    vertices.Add(new Vector3((x + 1) * tileSizeX, (y + 1) * tileSizeY, 0));
                    vertices.Add(new Vector3(x * tileSizeX, (y + 1) * tileSizeY, 0));
                    // 頂点インデックスを追加
                    triangles.Add(index + 2);
                    triangles.Add(index + 1);
                    triangles.Add(index);
                    triangles.Add(index);
                    triangles.Add(index + 3);
                    triangles.Add(index + 2);
                    index += 4;
                    // 法線を追加
                    normals.Add(Vector3.forward);
                    normals.Add(Vector3.forward);
                    normals.Add(Vector3.forward);
                    normals.Add(Vector3.forward);
                    // UVを追加
                    uvs.Add(new Vector2((x + 0) * tileSizeX, (y + 0) * tileSizeY));
                    uvs.Add(new Vector2((x + 1) * tileSizeX, (y + 0) * tileSizeY));
                    uvs.Add(new Vector2((x + 1) * tileSizeX, (y + 1) * tileSizeY));
                    uvs.Add(new Vector2((x + 0) * tileSizeX, (y + 1) * tileSizeY));
                }
            }
            // 頂点の最大数(通常は65535個に制限されている)を上げる
            mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
            // 頂点データを代入
            mesh.vertices  = vertices.ToArray();
            mesh.normals   = normals.ToArray();
            mesh.triangles = triangles.ToArray();
            mesh.uv        = uvs.ToArray();

            mesh.bounds = new Bounds(transform.position, Vector3.one * 1000.0f);
            mesh.RecalculateNormals();
            mesh.RecalculateTangents();
            mesh.MarkDynamic();
            mesh.name = "Grid_" + gridWidth.ToString() + "_" + gridHeight.ToString();
        }