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 }); }
public ModuloPosition(IntVector2 slotMapSize, IntVector2 position) { _slotMapSize = slotMapSize; _moduledPosition = new IntVector2(MyMathUtils.Mod(position.X, _slotMapSize.X), MyMathUtils.Mod(position.Y, _slotMapSize.Y)); }