Esempio n. 1
0
    void CreateThreadActions(int raceTime)
    {
        object args = raceTime;

        for (int i = 0; i < MyThreadPool.workers.Length; i++)
        {
            WaitCallback callback = new WaitCallback(ThreadedRace);
            MyThreadPool.AddActionToQueue(callback, args);
        }
    }
    IEnumerator AnimateTrees()
    {
        tasks = new Task[threads.Length];

        while (true)
        {
            if (TerrainController.thisTerrainController == null || !TerrainController.thisTerrainController.levelLoaded)
            {
                yield return(null);

                continue;
            }

            if (!initialized)
            {
                Initialize();
                initialized = true;
            }

            for (int i = 0; i < threads.Length; i++)
            {
                if ((tasks[i] == null || tasks[i].isDone) && treeObjects.Count != 0)
                {
                    tasks[i] = MyThreadPool.AddActionToQueue(AnimatePart, i, TaskPriority.low);
                }
            }

            while (!runAnimation)
            {
                yield return(null);
            }

            yield return(null);

            for (int i = 0; i < meshVertices.Count; i++)
            {
                if (treeObjects[i].isEnabled)
                {
                    treeObjects[i].GetComponent <MeshFilter>().mesh.vertices = updatedMeshVertices[i];
                }
            }
        }
    }
Esempio n. 3
0
    public IEnumerator RemoveObject()
    {
        List <Task> tasks = new List <Task>();

        count = 0;
        while (true)
        {
            while (currentVertices == null || removeList.Count == 0)
            {
                yield return(null);
            }

            while (removeList.Count > 0)
            {
                object args = removeList[0];

                tasks.Add(MyThreadPool.AddActionToQueue(MoveMesh, args, TaskPriority.medium));
                removeList.RemoveAt(0);
            }

            for (int i = 0; i < tasks.Count; i++)
            {
                while (!tasks[i].isDone)
                {
                    yield return(null);
                }
            }

            if (thisAnimationParameters == null && currentVertices != null && updateCurrentVertices)
            {
                GetComponent <MeshFilter>().mesh.vertices = currentVertices;
                updateCurrentVertices = false;
            }


            if (count++ > 1)
            {
                yield return(null);

                count = 0;
            }
        }
    }
Esempio n. 4
0
    IEnumerator _VisualizeWind()
    {
        TreeAnimationController.instance.runAnimation = false;
        CreateChunks(true);
        tasks = new Task[chunkThreads.Length];
        int curCount = 0;

        startTime = Time.realtimeSinceStartup;
        isFirst   = true;
        curUvs    = true;
        doneFirst = false;


        while (true)
        {
            yield return(null);

            bool alldone = true;

            for (int i = 0; i < chunkThreads.Length; i++)
            {
                if (tasks[i] != null && !tasks[i].isDone)
                {
                    alldone = false;
                }
            }

            if (alldone)
            {
                curUvs   = !curUvs;
                curCount = 0;

                if (isFirst)
                {
                    curCount = intpSteps - 1;
                }
                if (doneFirst)
                {
                    isFirst = false;
                }
                calcTime  = Time.realtimeSinceStartup - startTime;
                startTime = Time.realtimeSinceStartup;
            }


            for (int i = 0; i < chunkThreads.Length; i++)
            {
                if (tasks[i] == null || tasks[i].isDone && (alldone))
                {
                    object[] args = new object[2];
                    args[0] = i;
                    args[1] = WindController.time;
                    object argsIn = args;
                    tasks[i] = MyThreadPool.AddActionToQueue(CalculateChunk, argsIn);
                }
            }

            for (int i = 0; i < windSpeedChunkActive.Count; i++)
            {
                windSpeedChunkActive[i] = windSpeedChunks[i].gameObject.activeSelf;
            }


            if ((Time.realtimeSinceStartup - startTime) - calcTime * ((float)(curCount + 1) / intpSteps) >= 0)
            {
                while ((Time.realtimeSinceStartup - startTime) - calcTime * ((float)(curCount + 1) / intpSteps) >= 0)
                {
                    curCount++;
                }

                curCount--;

                if (curCount > intpSteps - 1)
                {
                    curCount = intpSteps - 1;
                }

                for (int i = 0; i < windSpeedChunks.Count; i++)
                {
                    if (uvs[i] == null)
                    {
                        continue;
                    }

                    if (!isFirst)
                    {
                        if (curUvs)
                        {
                            windSpeedChunks[i].meshFilter.mesh.uv = buffereduvs[i][curCount];
                        }
                        else
                        {
                            windSpeedChunks[i].meshFilter.mesh.uv = uvs[i][curCount];
                        }
                    }
                    else
                    {
                        windSpeedChunks[i].GetComponent <MeshRenderer>().enabled = true;
                        windSpeedChunks[i].meshFilter.mesh.uv = buffereduvs[i][uvs[i].Length - 1];
                        doneFirst = true;
                    }
                }
                curCount++;

                if (curCount > intpSteps - 1)
                {
                    curCount = intpSteps - 1;
                }
            }
        }
    }