public List <GameObject> Generate(GrassEntitiesWithMaterials grassEntitiesWithMaterials)
        {
            var gameObjects = new List <GameObject>();

            foreach (var aGrass in grassEntitiesWithMaterials.Entities)
            {
                var grassInstance = new GameObject("grassInstance");
                grassInstance.AddComponent <MeshFilter>().mesh = grassEntitiesWithMaterials.Mesh;
                grassInstance.transform.localPosition          = aGrass.Position;
                grassInstance.transform.localEulerAngles       = MyMathUtils.RadToDeg(aGrass.Rotation);
                grassInstance.transform.localScale             = aGrass.Scale;
                var rend = grassInstance.AddComponent <MeshRenderer>();
                rend.material = grassEntitiesWithMaterials.Material;

                foreach (var uniform in aGrass.GetFloatUniforms())
                {
                    rend.material.SetFloat(uniform.Name, uniform.Get());
                }
                foreach (var uniform in aGrass.GetVector4Uniforms())
                {
                    rend.material.SetVector(uniform.Name, uniform.Get());
                }

                gameObjects.Add(grassInstance);
            }

            return(gameObjects);
        }
        public void SetPosition(GrassEntitiesSet aGrass, MapAreaPosition globalPosition)
        {
            var randomNormalized = new Vector3(UnityEngine.Random.value, 0, UnityEngine.Random.value);

            aGrass.Position = MyMathUtils.MultiplyMembers(randomNormalized,
                                                          new Vector3(globalPosition.Size.x, 1, globalPosition.Size.y)) +
                              globalPosition.DownLeft;
        }
        private GrassEntity GenerateOnePlantSegment(float yEulerAngle, float xScale, float xPos,
                                                    float zPos, float minUv, float maxUv, float randSeed)
        {
            var obj = new GrassEntity
            {
                Rotation = MyMathUtils.DegToRad(new Vector3(0, yEulerAngle, 0)),
                Scale    = new Vector3(xScale, 1, 1),
                Position = new Vector3(xPos, 0, zPos)
            };

            obj.AddUniform(GrassShaderUniformName._MinUv, minUv);
            obj.AddUniform(GrassShaderUniformName._MaxUv, maxUv);
            obj.AddUniform(GrassShaderUniformName._RandSeed, randSeed);
            return(obj);
        }
        public GrassEntitiesSet GenerateStarTuft(int elementsInTuftCount = 3)
        {
            var entities = new List <GrassEntity>();

            for (int i = 0; i < elementsInTuftCount; i++)
            {
                var obj = new GrassEntity {
                    Rotation = MyMathUtils.DegToRad(new Vector3(0, 0, ((float)i) / elementsInTuftCount * 180))
                };
                obj.AddUniform(GrassShaderUniformName._MinUv, 0);
                obj.AddUniform(GrassShaderUniformName._MaxUv, 1);
                obj.AddUniform(GrassShaderUniformName._RandSeed, UnityEngine.Random.value);
                entities.Add(obj);
            }
            return(new GrassEntitiesSet(entities));
        }
        public GrassEntitiesWithMaterials GenerateUniformRectangeBillboardGrass(Material material, IGrassPlacer placer, int lodLevel)
        {
            List <GrassEntity> createdEntities = new List <GrassEntity>();
            var billboardGenerator             = new GrassBillboardGenerator();

            var meshGenerator = new GrassMeshGenerator();
            var mesh          = meshGenerator.GetGrassBillboardMesh(0, 1);

            for (int i = 0; i < 75; i++)
            {
                var triangleTurf = billboardGenerator.GenerateTriangleTurf(); //todo : use grass entities set and rotate
                triangleTurf.Rotation = (MyMathUtils.DegToRad(new Vector3(0, UnityEngine.Random.Range(0, 360), 0)));
                placer.Set(triangleTurf);
                createdEntities.AddRange(triangleTurf.EntitiesAfterTransform);
            }

            return(null); // new GrassEntitiesWithMaterials(createdEntities, material, mesh);
        }
        private float ComputeCoverage(TAMImageDiagram diagram, TAMMipmapLevel mipmapLevel)
        {
            var areaSum = 0.0;

            for (int i = 0; i < diagram.Strokes.Count; i++)
            {
                var currentStroke = diagram.Strokes[i];
                var baseArea      = Mathf.PI * Mathf.Pow(currentStroke.Length, 2) * 0.2; //todo

                for (int k = 0; k < i; k++)
                {
                    var otherStroke      = diagram.Strokes[k];
                    var intersectionArea =
                        MyMathUtils.IntersectionAreaOfTwoCircles(currentStroke.Length, currentStroke.Center, otherStroke.Length, otherStroke.Center);
                    baseArea -= intersectionArea;
                }

                areaSum += Math.Max(0.001f, baseArea); //todo what to do with other mipmapLevels
            }
            return((float)areaSum);
        }
        private RankedPossibleStroke RankStroke(TAMStroke newStroke, TAMImageDiagram diagram)
        {
            // rank the bigger, the better
            var distanceSum      = 0f;
            var intersectionArea = 0f;

            foreach (var stroke in diagram.Strokes)
            {
                var intersection = MyMathUtils.IntersectionAreaOfTwoCircles(newStroke.Length, newStroke.Center, stroke.Length, stroke.Center);
                intersectionArea += intersection;
                distanceSum      += Vector2.Distance(newStroke.Center, stroke.Center);
            }

            var intersectionPercent = intersectionArea / (Math.PI * Math.Pow(newStroke.Length, 2));

            var rank = Mathf.Pow(distanceSum, (float)(2 - intersectionPercent));

            return(new RankedPossibleStroke()
            {
                Rank = rank,
                Stroke = newStroke
            });
        }
Exemplo n.º 8
0
 public ModuloPosition(IntVector2 slotMapSize, IntVector2 position)
 {
     _slotMapSize     = slotMapSize;
     _moduledPosition = new IntVector2(MyMathUtils.Mod(position.X, _slotMapSize.X), MyMathUtils.Mod(position.Y, _slotMapSize.Y));
 }