public void seedobstacle()
    {
        if (probabnotadded == false)
        {
            if (useCustomPoints == false)
            {
                verts   = mesh.vertices;
                indices = mesh.triangles;
            }

            poolManager = GameObject.FindGameObjectWithTag("PoolManager").GetComponent <PropPoolManager>();

            temp = new GameObject();
            temp.transform.parent = transform;
            probabnotadded        = true;
            for (int i = 0; i < obstacles.Count; ++i)          //Probabilities are variables hence need to be added evrytime
            {
                probabs.Add(obstacles[i].probability);
                if (obstacles[i].ZingVariableObject)  //If it is a variable object then add its index so that next time when seedobstacle is called Probabilities are updated
                {
                    updatableIndexes.Add(i);
                }
            }
        }

        if (useCustomPoints == false)
        {
            if (Worktodo == false)
            {
                Worktodo   = true;
                currentMin = 0;
                AddValue   = mesh.triangles.Length / FramesMod;
                currentMax = mesh.triangles.Length / FramesMod;
            }
            if (currentMax > mesh.triangles.Length)
            {
                Worktodo = false;
                return;
            }
        }
        else
        {
            if (Worktodo == false)
            {
                Worktodo   = true;
                currentMin = 0;
                AddValue   = points.Count;
                currentMax = points.Count;
            }
            if (currentMax > points.Count)
            {
                Worktodo = false;
                return;
            }
        }


        for (int i = 0; i < currentMax;)
        {
            Vector3 pos, rot;
            if (useCustomPoints == false)
            {
                Vector3 P1 = verts[indices[i++]];

                Vector3 P2 = verts[indices[i++]];

                Vector3 P3 = verts[indices[i++]];

                pos = gam.transform.TransformPoint((P1 + P2 + P3) / 3);
                Vector3 n1 = verts[indices[i++]];

                Vector3 n2 = verts[indices[i++]];

                Vector3 n3 = verts[indices[i++]];
                rot = gam.transform.TransformDirection((n1 + n2 + n3) / 3);
            }
            else
            {
                pos = points[currentMin + i].position;
                rot = points[currentMin + i].position;
                i++;
            }
            int Randtrack = Probability(probabs, probabs.Count);
            if (Randtrack == -1)
            {
                Worktodo = false;
                return;
            }
            bool      b     = true;
            transenum trans = obstacles[Randtrack].trans;
            float     value = Random.value;



            temp.transform.position = pos;
            if (useCustomPoints == true)
            {
                temp.transform.rotation = points[currentMin + i - 1].rotation;
            }
            else
            {
                temp.transform.localRotation = Quaternion.identity;
            }


            switch (trans)
            {
            case transenum.X:
                temp.transform.localPosition = new Vector3(0, temp.transform.localPosition.y, temp.transform.localPosition.z);
                break;

            case transenum.Y:
                temp.transform.localPosition = new Vector3(temp.transform.localPosition.x, 0, temp.transform.localPosition.z);
                break;

            case transenum.Z:
                temp.transform.localPosition = new Vector3(temp.transform.localPosition.x, temp.transform.localPosition.y, 0);
                break;

            case transenum.None:

                break;

            default:
                break;
            }
            for (int x = 0; x < obstacles[Randtrack].procedures.Count; ++x)
            {
                doProcedure(obstacles[Randtrack].procedures[x], temp, rot);
            }
            int j = previouspoint.Count - 10;
            if (j < 0)
            {
                j = 0;
            }
            for (j = 0; j < previouspoint.Count; ++j)
            {
                bool contains    = false;
                bool canContinue = true;
                for (int x = 0; x < obstacles[Randtrack].SpecificSeperation.Count; x++)
                {
                    if (obstacles[Randtrack].SpecificSeperation[x].index == obstacleIndex[j])
                    {
                        contains = true;
                        if (Vector3.Distance(temp.transform.position, previouspoint[j]) < obstacles[Randtrack].SpecificSeperation[x].sepDist)
                        {
                            b           = false;
                            canContinue = false;
                            break;
                        }
                    }
                }
                if (contains == false && Vector3.Distance(temp.transform.position, previouspoint[j]) < obstacles[Randtrack].sepdist)
                {
                    b = false;
                    break;
                }
                if (!canContinue)
                {
                    break;
                }
            }
            if (b == true)
            {
                if (value < mainprobab)
                {
                    GameObject temp2 = CheckPool(Randtrack);
                    temp2.transform.position = temp.transform.position;
                    temp2.transform.rotation = temp.transform.rotation;
                    previouspoint.Add(temp2.transform.position);
                    obstacleIndex.Add(Randtrack);
                    temp2.SetActive(true);
                    temp2.transform.parent = transform;
                    obstacles[Randtrack].poolTrack.Add(temp2);
                }
                else
                {
                    //temp.transform.parent=GameObject.FindGameObjectWithTag("PoolManager").transform;
                    //temp.SetActive(false);
                }
            }
            else
            {
                //temp.transform.parent=GameObject.FindGameObjectWithTag("PoolManager").transform;
                //temp.SetActive(false);
            }
        }
        if (useCustomPoints == false)
        {
            currentMin += AddValue;
            if (currentMax == mesh.triangles.Length)
            {
                currentMax += 1;
            }
            else if (currentMax + AddValue > mesh.triangles.Length)
            {
                currentMax = mesh.triangles.Length;
            }
            else
            {
                currentMax += AddValue;
            }
        }
        else
        {
            Worktodo = false;
            return;
        }
    }
Пример #2
0
    public void seedobstacle()
    {
        List <float> probabs = new List <float>();

        for (int i = 0; i < obstacles.Count; ++i)
        {
            probabs.Add(obstacles[i].probability);
        }
        Vector3[] verts = mesh.vertices;

        int[] indices = mesh.triangles;

        for (int i = 0; i < mesh.triangles.Length;)

        {
            Vector3 P1 = verts[indices[i++]];
            Vector3 P2 = verts[indices[i++]];
            Vector3 P3 = verts[indices[i++]];

            Vector3 pos = gam.transform.TransformPoint((P1 + P2 + P3) / 3);

            Vector3 n1 = verts[indices[i++]];
            Vector3 n2 = verts[indices[i++]];
            Vector3 n3 = verts[indices[i++]];

            Vector3 rot = gam.transform.TransformDirection((n1 + n2 + n3) / 3);

            int       Randtrack = Probability(probabs, obstacles.Count);
            transenum trans     = obstacles[Randtrack].trans;

            bool b = true;
            for (int j = 0; j < previouspoint.Count; j++)
            {
                if (Vector3.Distance(pos, previouspoint[j]) < obstacles[Randtrack].sepdist)
                {
                    b = false;
                    break;
                }
            }

            if (b == true)
            {
                if (Random.value < mainprobab)
                {
                    GameObject temp = CheckPool(Randtrack);

                    temp.transform.parent        = transform;
                    temp.transform.position      = pos;
                    temp.transform.localRotation = Quaternion.identity;

                    switch (trans)
                    {
                    case transenum.X:
                        temp.transform.localPosition = new Vector3(0, temp.transform.localPosition.y, temp.transform.localPosition.z);
                        break;

                    case transenum.Y:
                        temp.transform.localPosition = new Vector3(temp.transform.localPosition.x, 0, temp.transform.localPosition.z);
                        break;

                    case transenum.Z:
                        temp.transform.localPosition = new Vector3(temp.transform.localPosition.x, temp.transform.localPosition.y, 0);
                        break;

                    case transenum.None:

                        break;

                    default:
                        break;
                    }

                    for (int j = 0; j < obstacles[Randtrack].procedures.Count; ++j)
                    {
                        doProcedure(obstacles[Randtrack].procedures[j], temp, rot);
                    }

                    previouspoint.Add(temp.transform.position);
                    temp.SetActive(true);
                }
            }
        }
    }