private void AddUniformCycleData(Material mat)
        {
            var szecsiCycleGen = new SzecsiCyclesGenerator(2, 2);

            var cycle = szecsiCycleGen.GenerateCycle(123);

            var uniformCycle = szecsiCycleGen.GenerateUniformFromCycle(cycle);

            var uniformGroup       = szecsiCycleGen.GenerateUniformGroupFromCycle(cycle, 2);
            var uniformCyclesGroup = uniformGroup.Select(c => (uint)c).ToList();

            var xCycle = uniformCyclesGroup[0];
            var yCycle = uniformCyclesGroup[1];

            mat.SetInt("_UniformCycleX", (int)uniformCyclesGroup[0]);
            mat.SetInt("_UniformCycleY", (int)uniformCyclesGroup[1]);

            var buf = new ComputeBuffer(3, sizeof(int));

            buf.SetData(new List <uint>()
            {
                uniformCycle, xCycle, yCycle
            });
            mat.SetBuffer("_UniformCyclesBuf", buf);

            mat.SetTexture("_SeedPositionTex", GenerateSeedPositionTexture2D(uniformGroup));
        }
        private Texture2D GenerateSeedPositionTexture2D(ulong[] uniformGroup)
        {
            var positionsWithBits = SzecsiCyclesGenerator.GeneratePointsFromUniformGroup(uniformGroup, 2, 16);

            var tex = new Texture2D(4, 4, TextureFormat.ARGB32, false)
            {
                wrapMode = TextureWrapMode.Clamp, filterMode = FilterMode.Point
            };

            for (int i = 0; i < 16; i++)
            {
                var pos = positionsWithBits.Positions[i];

                var seedBlockCoord = new IntVector2(
                    Mathf.FloorToInt(pos[0] * 4),
                    Mathf.FloorToInt(pos[1] * 4)
                    );

                Vector2 seedOffset = new Vector2(
                    pos[0] * 4 - seedBlockCoord.X,
                    pos[1] * 4 - seedBlockCoord.Y
                    );

                var     bits          = positionsWithBits.LastCycleBits[i];
                Vector2 cycleLastBits = new Vector2(bits[0], bits[1]);

                tex.SetPixel(seedBlockCoord.X, seedBlockCoord.Y, new Color(seedOffset.x, seedOffset.y, cycleLastBits.x, cycleLastBits.y));
            }
            tex.Apply();
            return(tex);
        }
Example #3
0
        public PointsWithLastBits FindBestPointsDistributionBasedOn2D()
        {
            int dimension = 2;
            int k = 2;
            int cycleLength = (int) Mathf.Pow(k * 2, dimension);
            var distributionsTriesCount = 20;

            var szecsiCycleGen = new SzecsiCyclesGenerator(dimension, k);

            var startSeed = 626;
            Vector2 distanceMultipliers = new Vector3(1,6);

            var distributions = Enumerable.Range(0, distributionsTriesCount).Select(c =>
            {
                var seed = startSeed + c;
                var p = GenerateRandomPointsDistribution(seed, szecsiCycleGen, dimension, cycleLength);
                var rating = RateDistribution2D(p.Positions, distanceMultipliers);
                return new
                {
                    points = p,
                    rating,
                    seed 
                };
            }).ToList();
            var bestDistributionObj = distributions.OrderByDescending(c => c.rating).First();
            Debug.Log(bestDistributionObj.rating+"  "+bestDistributionObj.seed);
            var bestDistribution = bestDistributionObj.points;

            List<List<float>> positions = new List<List<float>>();
            List<List<int>> lastCycleBits = new List<List<int>>();
            for (int j = 0; j < bestDistribution.Positions.Count; j++)
            {
                for (int layerIndex = 0; layerIndex < 4; layerIndex++)
                {
                    var pos = bestDistribution.Positions[j];
                    float x = pos[0];
                    float y = pos[1];

                    var lastBits = bestDistribution.LastCycleBits[j];

                    positions.Add(new List<float>
                    {
                        x, y, ((float) layerIndex) / 4.0f + 1 / 8.0f
                    });
                    lastCycleBits.Add(new List<int>() {lastBits[0], lastBits[1], 0});
                }
            }

            var pointsWithLastBitsIn3D = new PointsWithLastBits()
            {
                Positions = positions,
                LastCycleBits = lastCycleBits
            };

            return pointsWithLastBitsIn3D;
        }
Example #4
0
 private static PointsWithLastBits GenerateRandomPointsDistribution(int seed, SzecsiCyclesGenerator szecsiCycleGen, int dimension, int cycleLength)
 {
     var cycle = szecsiCycleGen.GenerateCycle(seed);
     var uniformGroup = szecsiCycleGen.GenerateUniformGroupFromCycle(cycle, (uint) dimension);
     return SzecsiCyclesGenerator.GeneratePointsFromUniformGroup(uniformGroup, dimension, cycleLength);
 }