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); }
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; }
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); }