Пример #1
0
 public void Initialize(float maxLength, float width, Vector3 rotation, float growthSpeed, Color colour, bool instantGrowth)
 {
     lineRenderer            = GetComponent <LineRenderer>();
     lineRenderer.startColor = colour;
     lineRenderer.endColor   = colour;
     lineRenderer.startWidth = width;
     lineRenderer.endWidth   = width;
     grown          = false;
     currLength     = 0;
     this.maxLength = maxLength;
     this.width     = width;
     this.rotation  = rotation;
     collider.transform.eulerAngles = rotation;
     this.growthSpeed = growthSpeed;
     worldEndPos      = PlantGenerator.RotatePointAroundPivot(transform.position + Vector3.up * maxLength, transform.position, rotation);
     if (instantGrowth)
     {
         lineRenderer.enabled = true;
         lineRenderer.SetPositions(new Vector3[] { transform.position, worldEndPos });
         collider.enabled = true;
         // Place collider in centre of branch and with proper length
         collider.transform.localPosition = worldEndPos - transform.position;
         collider.size = new Vector2(Mathf.Max(width, 0.01f), maxLength);
         grown         = true;
     }
     else
     {
         collider.size = new Vector2(Mathf.Max(width, 0.01f), 0);
         lineRenderer.SetPositions(new Vector3[] { transform.position, transform.position });
     }
 }
 public Segment(Node node, PlantGenerator plantGenerator)
 {
     this.nodes = new List <Node>();
     nodes.Add(node);
     segMesh             = new Mesh();
     this.plantGenerator = plantGenerator;
 }
    /// <summary>
    /// OnGeneratorStart calculate the positions of the terrain tops based on the terraingenerator settings
    /// </summary>
    /// <param name="plantGenerator"></param>
    public override void OnGeneratorStart(PlantGenerator plantGenerator)
    {
        terrainGenerator = plantGenerator.gameObject.GetComponent <TerrainGenerator>();
        possibleXValues  = new List <float>();


        //float period = sinePeriod * x;
        //float sine = (sin(period) * halfSineAmplitude) + halfSineAmplitude;

        period = (Mathf.PI * 2f) / terrainGenerator.sinPeriod;

        Vector3 fieldCenter = plantGenerator.gameObject.transform.position;

        float halfWidth = terrainGenerator.terrainWidth / 2f;
        float minOffset = Mathf.Repeat(halfWidth - (period * 0.75f), period);
        float minXValue = (fieldCenter.x - terrainGenerator.terrainWidth / 2) + minOffset;
        float maxXValue = (fieldCenter.x + terrainGenerator.terrainWidth / 2);



        string log = "";

        for (float i = minXValue; i <= maxXValue; i += period)
        {
            possibleXValues.Add(i);
            log += " " + i.ToString();
        }

        Debug.Log(log);
    }
Пример #4
0
 void Awake()
 {
     AddRule('X', "F-[[X]+X]+F[+FX]-X");
     AddRule('X', "F+[[X]-X]-F[-FX]+X");
     AddRule('F', "FF");
     generator = GetComponent <PlantGenerator>();
 }
    public override void OnInspectorGUI()
    {
        PlantGenerator plantGenerator = (PlantGenerator)target;

        serializedObject.Update();

        EditorGUILayout.PropertyField(_plantSpawnSettings);

        foreach (PlantSpawnSettings spawnSetting in plantGenerator.plantSpawnSettings)
        {
            AbstractPlacementStrategy placementStrategy;
            if (spawnSetting.placementStrategy.GetClass().IsSubclassOf(typeof(AbstractPlacementStrategy)))
            {
                placementStrategy = Activator.CreateInstance(spawnSetting.placementStrategy.GetClass()) as AbstractPlacementStrategy;
            }
            else
            {
                throw new Exception($"[PlantGenerator] The Random Placement script on plant #{plantGenerator.plantSpawnSettings.IndexOf(spawnSetting)} does not extend from AbstractPlacementStrategy!");
            }
            placementStrategy.OnInspectorGUI(plantGenerator);
        }


        //EditorGUILayout.PropertyField(_xMinVal, new GUIContent("Minimum X bound"));
        //EditorGUILayout.PropertyField(_xMaxVal, new GUIContent("Maximum X bound"));

        //EditorGUILayout.PropertyField(_zMinVal, new GUIContent("Minimum Z bound"));
        //EditorGUILayout.PropertyField(_zMaxVal, new GUIContent("Maximum Z bound"));

        //EditorGUILayout.PropertyField(_amountOfPlantsToSpawn, new GUIContent("Amount of plants to spawn"));

        serializedObject.ApplyModifiedProperties();
    }
Пример #6
0
    void Start()
    {
        pg = PlantGenerator.Instance;
        cg = CreatureGenerator.Instance;

        Camera.main.orthographicSize = (float)height / 2;
        back.transform.localScale    = new Vector3(width, height, 0f);
    }
Пример #7
0
    // Renders any editable points in the plant generator
    void OnSceneGUI()
    {
        PlantGenerator generator = target as PlantGenerator;

        for (int i = 0; i < generator.editablePoints.Length; i++)
        {
            // Render each piont with a purple handle
            Handles.color = new Color(1.0f, 0.0f, 1.0f, 0.1f);
            generator.editablePoints[i] = generator.transform.InverseTransformPoint(Handles.DoPositionHandle(generator.transform.TransformPoint(generator.editablePoints[i]), Quaternion.identity));
        }
    }
 public Bud(Vector3 pos, Vector3 dir, int age, int order, PlantGenerator plantGenerator)
 {
     this.pos            = pos;
     this.direction      = dir;
     this.die_prob       = plantGenerator.dieProbability;
     this.pause_prob     = plantGenerator.pauseProbability;
     this.age            = age;
     this.order          = order;
     this.isDead         = false;
     this.plantGenerator = plantGenerator;
 }
    /// <summary>
    /// Inspector spot for a maxRowOffset where a plant can be a little offset on a row top.
    /// TODO: fix the variable storage problem here
    /// </summary>
    /// <param name="plantGenerator"></param>
    public override void OnInspectorGUI(PlantGenerator plantGenerator)
    {
        //float maxRowOffset = plantGenerator.getVarFromPlacementVarStorage<float>("maxRowOffset");

        //float offset = EditorGUILayout.FloatField(new GUIContent("Maximum offset"), maxRowOffset);

        //if (offset != maxRowOffset)
        //{
        //    plantGenerator.placementStrategyVars["maxRowOffset"] = offset;
        //}
    }
Пример #10
0
    /// <summary>
    /// Randomizes position of a plant on the targeted chunk.
    /// </summary>
    /// <param name="plantGenerator"></param>
    /// <param name="chunk"></param>
    /// <param name="xmin"></param>
    /// <param name="xmax"></param>
    /// <param name="zmin"></param>
    /// <param name="zmax"></param>
    /// <returns>Vector3 with randomized position</returns>
    public override Vector3 RandomizePosition(PlantGenerator plantGenerator, TerrainChunk chunk, float xmin, float xmax, float zmin, float zmax)
    {
        float randomXOffset = Random.Range(xmin, xmax);
        float randomZOffset = Random.Range(zmin, zmax);

        Vector3 position            = new Vector3(randomXOffset, plantGenerator.transform.position.y, randomZOffset);
        Vector2 mappedPlantPosition = new Vector2(position.x, position.z);

        position.y = chunk.GetHeightFromPosition(mappedPlantPosition);

        return(position);
    }
    public override Vector3 RandomizePosition(PlantGenerator plantGenerator, TerrainChunk chunk, float xmin, float xmax, float zmin, float zmax)
    {
        List <float> possibleXValuesForThisChunk = possibleXValues.Where(x => x >= (chunk.gridXPos - chunk.size.x / 2f) && x <= (chunk.gridXPos + chunk.size.x / 2f)).ToList();
        int          randomRowIndex = Random.Range(0, possibleXValuesForThisChunk.Count);
        float        randomZOffset  = Random.Range(zmin, zmax);

        Vector3 position            = new Vector3(possibleXValuesForThisChunk[randomRowIndex], plantGenerator.transform.position.y, randomZOffset);
        Vector2 mappedPlantPosition = new Vector2(position.x, position.z);

        position.y = chunk.GetHeightFromPosition(mappedPlantPosition);


        return(position);
    }
Пример #12
0
    void Start()
    {
        pg       = GameObject.FindWithTag("Logic").GetComponent <PlantGenerator>();
        ui       = GameObject.FindWithTag("Logic").GetComponent <myUI>();
        timer    = Time.time;
        lastTime = timer;
        nextTime = Random.Range(pg.minNextTime, pg.maxNextTime);

        int s = Mathf.RoundToInt(pg.initSize);

        if (s < pg.maxSize)
        {
            size = s;
        }
        else
        {
            size = pg.maxSize;
        }
    }
Пример #13
0
 void Start()
 {
     ui  = myUI.Instance;
     pg  = PlantGenerator.Instance;
     txt = GetComponent <Text>();
 }
Пример #14
0
 /// <summary>
 /// Gets called after all plants have been generated.
 /// </summary>
 /// <param name="plantGenerator"></param>
 public abstract void OnGeneratorFinish(PlantGenerator plantGenerator);
Пример #15
0
 /// <summary>
 /// Exposed Inspector GUI capability
 /// </summary>
 /// <param name="plantGenerator"></param>
 public abstract void OnInspectorGUI(PlantGenerator plantGenerator);
Пример #16
0
 /// <summary>
 /// Gets called before plants are gnerated.
 /// </summary>
 /// <param name="plantGenerator"></param>
 public abstract void OnGeneratorStart(PlantGenerator plantGenerator);
Пример #17
0
 /// <summary>
 /// Gets called for each plant to randomize their position based on this current placement strategy.
 /// </summary>
 /// <param name="plantGenerator"></param>
 /// <param name="chunk"></param>
 /// <param name="xmin"></param>
 /// <param name="xmax"></param>
 /// <param name="zmin"></param>
 /// <param name="zmax"></param>
 /// <returns></returns>
 public abstract Vector3 RandomizePosition(PlantGenerator plantGenerator, TerrainChunk chunk, float xmin, float xmax, float zmin, float zmax);
Пример #18
0
 public override void OnInspectorGUI(PlantGenerator plantGenerator)
 {
 }
Пример #19
0
 public override void OnGeneratorFinish(PlantGenerator plantGenerator)
 {
 }
 /// <summary>
 /// OnGeneratorFinish reset the positions that plants can be placed on
 /// </summary>
 /// <param name="plantGenerator"></param>
 public override void OnGeneratorFinish(PlantGenerator plantGenerator)
 {
     possibleXValues = null;
 }
Пример #21
0
 public override void OnGeneratorStart(PlantGenerator plantGenerator)
 {
 }
Пример #22
0
    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        TerrainUtility   terrainUtility   = (TerrainUtility)target;
        TerrainGenerator terrainGenerator = terrainUtility.GetComponent <TerrainGenerator>();

        PlantGenerator plantGenerator = terrainUtility.GetComponent <PlantGenerator>();

        //Terrain
        GUILayout.Label("Terrain generation");


        terrainGenerator.terrainWidth = EditorGUILayout.FloatField(new GUIContent("Terrain size X"), terrainGenerator.terrainWidth);

        plantGenerator.xMinVal = -(terrainGenerator.terrainWidth / 2);
        plantGenerator.xMaxVal = terrainGenerator.terrainWidth / 2;
        plantGenerator.zMinVal = -(terrainGenerator.terrainLength / 2);
        plantGenerator.zMaxVal = terrainGenerator.terrainLength / 2;


        terrainGenerator.terrainLength = EditorGUILayout.FloatField(new GUIContent("Terrain size Z"), terrainGenerator.terrainLength);

        EditorGUILayout.PropertyField(_chunksPerFrame);

        GUILayout.BeginHorizontal();
        if (GUILayout.Button("Create terrain"))
        {
            TerrainGenerator.instance = terrainGenerator;
            terrainGenerator.buildTerrain(_chunksPerFrame.intValue);
        }

        if (GUILayout.Button("Delete terrain"))
        {
            TerrainGenerator.instance = terrainGenerator;
            terrainGenerator.deleteTerrain();
            EditorSceneManager.MarkAllScenesDirty();
            System.GC.Collect();
            Resources.UnloadUnusedAssets();
        }

        GUILayout.EndHorizontal();


        //Plants
        GUILayout.Label("Plant generation");

        EditorGUILayout.PropertyField(_plantsPerUnit);

        plantsToSpawn = (int)Math.Round(_plantsPerUnit.floatValue * terrainGenerator.terrainLength * terrainGenerator.terrainWidth);
        GUILayout.Label($"This will spawn {plantsToSpawn} plants");
        plantGenerator.amountOfPlantsToSpawn = plantsToSpawn;

        EditorGUILayout.PropertyField(_plantsPerFrame);


        GUILayout.BeginHorizontal();

        if (GUILayout.Button("Generate plants"))
        {
            //Old logic ->
            //plantGenerator.StartCoroutine(plantGenerator.spawnPlantsInXZRange());

            //New logic ->
            plantGenerator.StartCoroutine(plantGenerator.SpawnPlantsOnChunks(terrainGenerator, _plantsPerFrame.intValue));
        }

        if (GUILayout.Button("Delete plants"))
        {
            plantGenerator.deleteAllPlants(terrainGenerator);
            EditorSceneManager.MarkAllScenesDirty();
            System.GC.Collect();
            Resources.UnloadUnusedAssets();
        }

        GUILayout.EndHorizontal();

        serializedObject.ApplyModifiedProperties();
    }
Пример #23
0
    override public void OnInspectorGUI()
    {
        PlantGenerator generator = target as PlantGenerator;

        base.OnInspectorGUI();
    }
Пример #24
0
 private void Awake()
 {
     instance = this;
 }