예제 #1
0
        protected override void CaptureInternal(Terrain terrain, Bounds bounds)
        {
            SplatData.Clear();
            var min = terrain.WorldToSplatCoord(bounds.min);
            var max = terrain.WorldToSplatCoord(bounds.max);

            int width  = max.x - min.x;
            int height = max.z - min.z;

            var prototypes = terrain.terrainData.splatPrototypes;
            var wrappers   = MMTerrainLayerUtilities.ResolvePrototypes(prototypes);

            var sampleSplats = terrain.terrainData.GetAlphamaps(min.x, min.z, width, height);

            for (var i = 0; i < prototypes.Length; ++i)
            {
                SplatPrototypeWrapper wrapper;
                wrappers.TryGetValue(prototypes[i], out wrapper);

                /*if (IgnoredSplats.Contains(wrapper))
                 * {
                 *  continue;
                 * }*/
                var   data = new byte[width, height];
                float sum  = 0;
                for (var dx = 0; dx < width; ++dx)
                {
                    for (var dz = 0; dz < height; ++dz)
                    {
                        var val = sampleSplats[dz, dx, i];
                        data[dx, dz] = (byte)Mathf.Clamp(val * 255f, 0, 255);
                        sum         += val;
                    }
                }
                if (sum < 0.01f)
                {
                    Debug.Log(string.Format("WorldStamp Splat Capture: Ignored splat layer {0} as it appeared to be empty.", wrapper != null ? wrapper.name : "Unresolved Splat"));
                    continue;
                }

                SplatData.Add(new CompressedSplatData {
                    Wrapper = wrapper, Data = new Serializable2DByteArray(data)
                });
            }
        }
예제 #2
0
        protected override void CaptureInternal(Terrain terrain, Bounds bounds)
        {
            DetailData.Clear();

            var min = terrain.WorldToDetailCoord(bounds.min);
            var max = terrain.WorldToDetailCoord(bounds.max);

            int width  = max.x - min.x;
            int height = max.z - min.z;

            var prototypes = terrain.terrainData.detailPrototypes;
            var wrappers   = MMTerrainLayerUtilities.ResolvePrototypes(prototypes);

            for (var i = 0; i < prototypes.Length; ++i)
            {
                DetailPrototypeWrapper wrapper;
                wrappers.TryGetValue(prototypes[i], out wrapper);
                var sample = terrain.terrainData.GetDetailLayer(min.x, min.z, width, height, i);
                var data   = new byte[width, height];
                int sum    = 0;
                for (var dx = 0; dx < width; ++dx)
                {
                    for (var dz = 0; dz < height; ++dz)
                    {
                        var sampleData = sample[dz, dx];
                        data[dx, dz] = (byte)sampleData;
                        sum         += sampleData;
                    }
                }
                if (sum < 0.01f)
                {
                    Debug.Log(string.Format("WorldStamp Splat Capture: Ignored splat layer {0} as it appeared to be empty.", wrapper != null ? wrapper.name : "Unresolved Splat"));
                    continue;
                }

                DetailData.Add(new CompressedDetailData {
                    Wrapper = wrapper, Data = new Serializable2DByteArray(data)
                });
            }
        }