public TAMImageDiagram Generate(TAMImageDiagram baseDiagram, TAMTone tone, TAMMipmapLevel mipmapLevel, int seed)
        {
            _strokesGenerator.ResetSeed(seed);
            _random = new System.Random(seed);

            var   diagram         = baseDiagram.Copy();
            float currentCoverage = ComputeCoverage(diagram, mipmapLevel);
            float targetCoverage  = _generationConfiguration.TargetCoverages[tone];

            while (targetCoverage > currentCoverage)
            {
                List <RankedPossibleStroke> possibleStrokes = new List <RankedPossibleStroke>();
                for (int i = 0; i < _generationConfiguration.TriesCount[mipmapLevel]; i++)
                {
                    TAMStroke            newStroke       = _strokesGenerator.CreateRandomStroke(new Vector2(_random.Next(), _random.Next()), tone);
                    RankedPossibleStroke rankedNewStroke = RankStroke(newStroke, diagram);
                    possibleStrokes.Add(rankedNewStroke);
                }

                var bestStroke = possibleStrokes.OrderBy(p => p.Rank).First();
                diagram.AddStroke(bestStroke.Stroke);
                currentCoverage = ComputeCoverage(diagram, mipmapLevel);
            }

            return(diagram);
        }
Beispiel #2
0
        public TAMStroke CreateRandomStroke(Vector2 center, TAMTone tone)
        {
            var size   = (float)_random.Next();
            var length = Mathf.Lerp(_generationConfiguration.StrokeLengthRange.x, _generationConfiguration.StrokeLengthRange.y, size);

            length += (float)_random.NextBetween(_generationConfiguration.StrokeHeightJitterRange.x, _generationConfiguration.StrokeLengthJitterRange.y);
            var height = Mathf.Lerp(_generationConfiguration.StrokeHeightRange.x, _generationConfiguration.StrokeHeightRange.y, size);

            height += (float)_random.NextBetween(_generationConfiguration.StrokeHeightJitterRange.x, _generationConfiguration.StrokeHeightJitterRange.y);

            float rotation;

            if (tone.StrokeOrientation == TAMStrokeOrientation.Horizontal)
            {
                rotation = (float)_random.NextBetween(-1, 1) * _generationConfiguration.MaxRotationJitter;
            }
            else if (tone.StrokeOrientation == TAMStrokeOrientation.Vertical)
            { // strokes vertical
                rotation = (float)_random.NextBetween(-1, 1) * _generationConfiguration.MaxRotationJitter + Mathf.PI / 2;
            }
            else
            {
                if (_random.NextBoolean())
                {
                    rotation = (float)_random.NextBetween(-1, 1) * _generationConfiguration.MaxRotationJitter;
                }
                else
                {
                    rotation = (float)_random.NextBetween(-1, 1) * _generationConfiguration.MaxRotationJitter + Mathf.PI / 2;
                }
            }
            return(new TAMStroke(center, height, length, rotation, _lastId++));
        }
Beispiel #3
0
        public void Start0()
        {
            var tonesCount  = 5;
            var levelsCount = 5;

            TaskUtils.SetGlobalMultithreading(false);
            var tones = TAMTone.CreateList(tonesCount, new Dictionary <int, TAMStrokeOrientation>()
            {
                { 0, TAMStrokeOrientation.Horizontal },
                { 3, TAMStrokeOrientation.Vertical },
                { 5, TAMStrokeOrientation.Both }
            });
            var levels = TAMMipmapLevel.CreateList(levelsCount);

            var fileManager    = new TAMPackFileManager();
            var soleImagesPack = fileManager.Load(@"C:\mgr\tmp\tam1\", tones, levels);

            var generator  = new TAMArrayGenerator();
            var tex2DArray = generator.Generate(soleImagesPack, tones, levels);

            var go       = GameObject.CreatePrimitive(PrimitiveType.Plane);
            var material = new Material(Shader.Find("Custom/Debug/TextureArrayLod"));

            material.SetTexture("_MainTex", tex2DArray);
            go.GetComponent <MeshRenderer>().material = material;
            MyAssetDatabase.CreateAndSaveAsset(tex2DArray, "Assets/Generated/TAM1.asset");
        }
        public TAMImageDiagram Generate(TAMImageDiagram diagram, TAMTone tone, TAMMipmapLevel mipmapLevel, int seed)
        {
            List <Vector2> currentPoints = diagram.Strokes.Select(c => c.Center).ToList();
            var            newPoints     = _sampler.Generate(_configuration.GenerationCount, _configuration.ExclusionZoneValues[tone][mipmapLevel],
                                                             seed, currentPoints);

            return(new TAMImageDiagram(diagram.Strokes.Union(newPoints.Select(c => _strokesGenerator.CreateRandomStroke(c, tone))).ToList()));
        }
Beispiel #5
0
 private TAMImageDiagram GetPreviousToneImageDiagram(TAMTone tone, TAMMipmapLevel mipmapLevel)
 {
     if (tone.IsLowestTone)
     {
         return(TAMImageDiagram.CreateEmpty());
     }
     else
     {
         return(_columns[tone.LowerTone][mipmapLevel]);
     }
 }
Beispiel #6
0
        public static List <TAMTone> CreateList(int count, Dictionary <int, TAMStrokeOrientation> orientationByToneIndex)
        {
            var     outList  = new List <TAMTone>();
            TAMTone lastTone = null;

            for (int i = 0; i < count; i++)
            {
                var orientation = orientationByToneIndex.OrderByDescending(c => c.Key).First(c => c.Key <= i).Value;

                var newTone = new TAMTone(orientation, lastTone);
                outList.Add(newTone);
                lastTone = newTone;
            }

            return(outList);
        }
Beispiel #7
0
        public void StartDiagram()
        {
            var tonesCount  = 4;
            var levelsCount = 4;

            TaskUtils.SetGlobalMultithreading(false);

            var tones  = TAMTone.GenerateList(tonesCount, 3, 4);
            var levels = TAMMipmapLevel.CreateList(levelsCount);

            var tamPackGenerator = new TAMPackGenerator();
            var msw = new MyStopWatch();

            msw.StartSegment("Gen");
            var pack = tamPackGenerator.GenerateTamPack(GenerateDiagramConfiguration(tones, levels, 0.7f), true, Object.FindObjectOfType <ComputeShaderContainerGameObject>());

            Debug.Log(msw.CollectResults());
            var fileManager = new TAMPackFileManager();

            fileManager.Save(@"C:\mgr\tmp\tam2\", tones, levels, pack);
        }
Beispiel #8
0
 public TAMTone(TAMStrokeOrientation strokeOrientation, TAMTone lowerTone = null)
 {
     _strokeOrientation = strokeOrientation;
     _lowerTone         = lowerTone;
 }
Beispiel #9
0
 private void AddNewImageDiagram(TAMImageDiagram template, TAMTone tone, TAMMipmapLevel mipmapLevel)
 {
     _columns[tone][mipmapLevel] = template;
 }
Beispiel #10
0
 private TAMImageDiagram GenerateNewImageDiagram(TAMImageDiagram baseImageDiagram, TAMTone tone, TAMMipmapLevel mipmapLevel, int seed)
 {
     return(_imageDiagramGenerator.Generate(baseImageDiagram, tone, mipmapLevel, seed));
 }