Пример #1
0
    // Use this for initialization
    public void StartBranch(int time, int old, Seed_Node nodeOrigine, List <Seed_Node> nodes, Seed set_seed)
    {
        //init
        NodeOrigine = nodeOrigine;
        Nodes       = nodes;
        seed        = set_seed;
        Time        = time + 1;
        ActualTime  = time;
        id_node     = 0;
        float size = seed.Size_Base;

        if (nodes[0].is_secondaire)
        {
            size = seed.Size_Branch;
        }

        //set line
        gameObject.AddComponent <LineRenderer>();
        gameObject.GetComponent <LineRenderer>().SetPosition(0, NodeOrigine.Center);
        gameObject.GetComponent <LineRenderer>().SetPosition(1, NodeOrigine.Center);
        gameObject.GetComponent <LineRenderer>().material =
            Resources.Load("Materials/TreeBase", typeof(Material)) as Material;
        SizeBranch = new AnimationCurve(
            new Keyframe(0, size), new Keyframe((seed.Old - seed.Maturate) / seed.Old, size), new Keyframe(1, 0.2f));
        gameObject.GetComponent <LineRenderer>().widthCurve = SizeBranch;



        //invoke
        UpdateForTime = (speed / 0.01f) - 1;
        InvokeRepeating("UpdateBranch", speed, 0.01f);
        InvokeRepeating("UpdateTime", speed * 2, speed);
    }
Пример #2
0
 /// <summary>
 /// Initializes a new node in a tree. /> class.
 /// </summary>
 public Seed_Node(int old, Vector3 center, Vector3 angle, Seed_Node parent, int branch, bool is_new_branch = false)
 {
     Old          = old;
     Center       = center;
     Angle        = angle;
     Parent       = parent;
     Branch       = branch;
     is_newBranch = is_new_branch;
 }
Пример #3
0
    void UpdateBranch()
    {
        if (ActualTime == Time) //suivi du node actuel
        {
            grown += 1 / UpdateForTime;
            // set position/rotation
            Vector3 pos = Vector3.Lerp(gameObject.GetComponent <LineRenderer>().GetPosition(id_node - 1),
                                       NextNode.Center, grown);
            Quaternion rot = Quaternion.LookRotation(
                NextNode.Center, gameObject.GetComponent <LineRenderer>().GetPosition(id_node - 1));
            // update position?forme de la branche
            gameObject.GetComponent <LineRenderer>().SetPosition(id_node, pos);
            // rajout feuille
            if (!is_Fondamental & Random.Range(0, 99) < seed.Density_Leaf.Evaluate(grown) * seed.Frequence_Leaf)
            {
                //gen
                GameObject leaf = Instantiate(Resources.Load("Prefabs/Leaf_tree", typeof(GameObject)) as GameObject,
                                              pos, rot, transform);
                leaf.transform.localScale    = new Vector3(seed.Size_Leaf, seed.Size_Leaf, seed.Size_Leaf);
                leaf.transform.localRotation = rot;
                int sens = 0;
                if (Random.Range(0, 99) < 50)
                {
                    sens = 180;
                }
                leaf.transform.Rotate(new Vector3(0, sens, 0));
            }
        }
        else //suivi du prochain node
        {
            grown = 0;
            ActualTime++;
            foreach (Seed_Node node in Nodes)
            {
                if (node.Old == ActualTime)
                {
                    NextNode = node;                         //set le prochain node de la branch
                }
            }
            id_node++;
            gameObject.GetComponent <LineRenderer>().positionCount = id_node + 1;                                                    //set une nouvelle ligne
            gameObject.GetComponent <LineRenderer>().SetPosition(id_node,
                                                                 gameObject.GetComponent <LineRenderer>().GetPosition(id_node - 1)); //set le nouveau point au niveau du precedent


            // embranchement
            if (NextNode.is_newBranch)
            {
                transform.parent.parent.GetComponent <BuilderTree>().GenBranch(NextNode, seed, NextNode.newBranch_id);
            }
        }
        if (Time > Old & gameObject.GetComponent <LineRenderer>().GetPosition(id_node - 1) == NextNode.Center & clean)
        {
            Destroy(this);  // clean script
            CancelInvoke(); // fin de pousse de la branche
        }
    }
Пример #4
0
 public void GenTree()
 {
     if (seed != null)
     {
         tree = new GameObject("tree");
         tree.transform.SetParent(transform);
         Seed_Node first_node = new Seed_Node(new Vector3(0, 0, 0));
         foreach (Seed_Node node in seed.nodes)
         {
             if (node.Old == 0)
             {
                 first_node = node;
             }
         }
         GenBranch(first_node, seed, 1);
     }
     else if (is_debug)
     {
         Debug.Log("generate the seed for generate the tree");
     }
 }
Пример #5
0
    public void GenBranch(Seed_Node parent, Seed seed, int id_branch)
    {
        GameObject branch = new GameObject("branch");

        branch.transform.SetParent(tree.transform);
        branch.AddComponent <GenBranch>();
        //set list node
        List <Seed_Node> nodes = new List <Seed_Node>();

        foreach (Seed_Node node in seed.nodes)
        {
            if (node.Branch == id_branch)
            {
                nodes.Add(node);
            }
        }
        if (is_debug)
        {
            foreach (Seed_Node node in nodes)
            {
                Debug.Log("add node time " + node.Old);
            }
        }
        //
        if (nodes[0].is_secondaire)
        {
            branch.GetComponent <GenBranch>().is_Fondamental = false;
        }
        else
        {
            branch.GetComponent <GenBranch>().is_Fondamental = true;
        }
        if (DontCleanScript)
        {
            branch.GetComponent <GenBranch>().clean = false;
        }
        branch.GetComponent <GenBranch>().StartBranch(parent.Old, seed.Old, parent, nodes, seed); // start gen
    }
Пример #6
0
    public void GenSeed() // generate the seed
    {
        if (is_debug)
        {
            Debug.Log("generate seed BEGIN");
        }

        // instanciate the seed
        seed = new Seed(Old, Maturate, Size_Base, Size_Branch, Angle_Branch, First_Branch, Frequence_Branch,
                        Frequence_Branch_Secondaire, Old_Secondaire, Max_nbr_Fondamental, MaxRank_Fondamental, Angle_Branch_Secondaire,
                        Frequence_Leaf, Size_Leaf);
        seed.Density_Leaf = Density_Leaf;
        int time = 0;   // Set the time of growning

        total_branch = 1;

        /*BEGIN creating the seed*/
        List <Seed_Node> nodes_parent = new List <Seed_Node>();;        // initiate list of parent's node

        while (time < Old)                                              // generate Old% node in the seed
        {
            Seed_Node        node;                                      // initiate the node
            List <Seed_Node> nodes_parentNew = new List <Seed_Node>();; //reset parent's node


            if (is_debug)
            {
                Debug.Log("Seed: step " + time);
            }

            /*BEGIN creating the node*/
            if (time == 0) // first node
            {
                //Define angle
                Vector3 angle;
                angle = RotatePointAroundPivot(new Vector3(0, Distance_nodes, 0), new Vector3(0, 0, 0),
                                               new Vector3(courbure.x + courbure_Secondaire.x, courbure_Secondaire.y, courbure.y + courbure_Secondaire.z));
                //Create node
                node = new Seed_Node(angle);
                seed.nodes.Add(node);
                nodes_parentNew.Add(node);
                if (is_debug)
                {
                    Debug.Log("Seed: add node in " + node.Center);
                }
            }
            else
            {
                foreach (Seed_Node parent in nodes_parent) //boucle chaque node créé à la boucle préscedente
                {
                    if (parent.is_secondaire == false ||
                        time - parent.BornOld_Branch < seed.Old__Branch_Secondaire)
                    {
                        node = gen_node(parent);
                        seed.nodes.Add(node);
                        nodes_parentNew.Add(node);

                        bool is_branch = false;
                        bool is_secondaire;

                        /* determine si embranchement et secondaire ou fondamental*/
                        int frequence = seed.Frequence_Branch;

                        if (seed.Nbr_Branch_Fondamental <= seed.MaxNbr_Branch_Fondamental & parent.Branch_rank < seed.MaxRank_Branch_Fondamental)
                        {
                            is_secondaire = false;
                        }
                        else
                        {
                            is_secondaire = true;
                        }

                        if (is_secondaire)
                        {
                            frequence = seed.Frequence_Branch_Secondaire;
                        }

                        if (time == seed.First_Branch || time > seed.First_Branch & frequence > Random.Range(0, 99))
                        {
                            is_branch = true;
                        }
                        /**/

                        if (is_branch)
                        {
                            if (!is_secondaire)
                            {
                                seed.Nbr_Branch_Fondamental++;
                            }
                            Debug.Log(seed.Nbr_Branch_Fondamental);
                            seed.Nbr_Branch++;

                            node = gen_node(parent, true, is_secondaire);
                            seed.nodes.Add(node);
                            nodes_parentNew.Add(node);
                        }
                    }
                }
            }
            /*ENDING creating the node*/

            nodes_parent = nodes_parentNew; //set parent
            time++;
        }
        /*ENDING creating the seed*/

        GetComponent <BuilderTree>().seed = seed;
        if (is_debug)
        {
            Debug.Log("add seed to genTree");
        }
        if (is_generate)
        {
            GetComponent <BuilderTree>().GenTree();             // grown the tree with the seed created
        }
    }
Пример #7
0
    public Seed_Node gen_node(Seed_Node parent, bool is_newBranch = false, bool is_secondaire_embranchement = false)
    {
        Seed_Node node;

        Vector3 center = parent.Angle;

        if (is_newBranch)
        {
            center = parent.Angle + (parent.Angle - parent.Parent.Center);
            center = RotatePointAroundPivot(center, parent.Parent.Center,
                                            new Vector3(-courbure.x, 0, -courbure.y));
            if (is_secondaire_embranchement)
            {
                center = RotatePointAroundPivot(center, parent.Parent.Center,
                                                new Vector3(Random.Range(-seed.Angle_Branch_Secondaire, seed.Angle_Branch_Secondaire), 0,
                                                            Random.Range(-seed.Angle_Branch_Secondaire, seed.Angle_Branch_Secondaire)));
            }
            else
            {
                center = RotatePointAroundPivot(center, parent.Parent.Center,
                                                new Vector3(Random.Range(-seed.Angle_Branch, seed.Angle_Branch), 0, Random.Range(-seed.Angle_Branch, seed.Angle_Branch)));
            }
        }

        /*Correction emplacement nextNode*/
        float distance = Vector3.Distance(center, parent.Center);

        center = Vector3.Lerp(parent.Center, center, Distance_nodes / distance);
        /**/

        Vector3 angle = center + (center - parent.Center);

        angle = RotatePointAroundPivot(angle, parent.Center, new Vector3(courbure.x, 0, courbure.y));

        if (is_newBranch)
        {
            parent.is_newBranch = true;               //si le début d'une nouvelle branche
        }
        int branch = parent.Branch;

        if (parent.is_newBranch)
        {
            branch = total_branch;
            parent.newBranch_id = total_branch;
            total_branch++;
        }



        node = new Seed_Node(parent.Old + 1, center, angle, parent, branch);

        if (parent.is_newBranch)
        {
            node.BornOld_Branch = parent.Old;
            node.Branch_rank    = parent.Branch_rank + 1;
            if (is_secondaire_embranchement)
            {
                node.is_secondaire = true;
            }
            else
            {
                node.is_secondaire = false;
            }
        }
        else
        {
            node.is_secondaire  = parent.is_secondaire;
            node.Branch_rank    = parent.Branch_rank;
            node.BornOld_Branch = parent.BornOld_Branch;
        }


        if (is_debug)
        {
            Debug.Log("Seed: add node in " + node.Center);
        }
        return(node);
    }