logo

Perlin_Controller

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
//------------------------------------------------------------------------
//Perlin Noise Agents v1.0 - Controller Class
//--Controller Class is the main controller and organizer of the data, most other classes will be accessed by the controller and vice versa
//Mode Lab - Written by Luis Quinones
//------------------------------------------------------------------------
public class Controller : MonoBehaviour {
    //Variables Assignment
    public GameObject mapGeo,spawnGeo,reboot,agentSet;
    public Vector3 spawnValues;
    public int AgentCount = 1000;
    public float lifetime = 5.0f;
    public float sWidth = 1.0f;
    public float eWidth = 0.1f;
    public float mP = 1.0f;
    public float dimensionBarValue,physicsBarValue,agentDisplay,agentDynamicSpawnState;
    public int sceneAgentCount,runTimesCheck;
    private float RSliderValue, GSliderValue, BSliderValue, spawnBarValue;
    //-----------------------------------------------------
    public Slider strengthSlider,scaleSlider,speedSlider,agentCountSlider,trailTimeSlider,trailStartWSlider,trailEndWSlider,multiplierSlider;
    //-----------------------------------------------------
    public Slider RSlider,GSlider,BSlider;
    //-----------------------------------------------------
    public Button resetButton, runImageButton, colorEnableButton, colorDisableButton, runSpawnImageButton;
    //-----------------------------------------------------
    public Canvas mainCanvas, visualCanvas, optCanvas;
    //-----------------------------------------------------
    public Scrollbar spawnScrollBar,dimensionScrollBar,physicsScrollBar,agentHeadBar,dynamicAgentSpawnScrollBar, gradientTextureScrollBar;
    //-----------------------------------------------------
    public Toggle strengthToggle, scaleToggle, speedToggle, trailSWToggle, trailEWToggle;
    //-----------------------------------------------------
    public Camera flatCamera,dimensionCamera;
    //-----------------------------------------------------
    public GameObject cube;
    //-----------------------------------------------------
    public Gradient newGradient;
    //-----------------------------------------------------
    private bool hideCanvas,showCanvas,hideVisualCanvas,showVisualCanvas,isOutside, runButtonOn, showOptCanvas, runSpawnButton, pause, pauseHold, reload;
    private bool testThis;
    public bool sTenaled { get; set; }
    public bool scTenaled { get; set; }
    public bool speedTenaled { get; set; }
    public bool trailSW { get; set; }
    public bool trailEW { get; set; }
    public bool colorEnable { get; set; }
    public bool colorDisable { get; set; }    
    //-----------------------------------------------------
    void Start()
    {
        flatCamera.enabled = true; //2d Camera
        dimensionCamera.enabled = false; //3d Camera
        cube.GetComponent<MeshRenderer>().enabled = false; //Physics Cube Renderer Disabled
        //-----------------------------------------------------
        //This is where we check for the Spawn Map Enable Button
        //if its pressed we kill the existing agents and call the SpawnMapAgents Funct.
        //-----------------------------------------------------
        runSpawnButton = false; 
        runSpawnImageButton.onClick.AddListener(delegate{
            runSpawnButton = true;
            if (!runSpawnButton) {
                SpawnAgents (); 
            } else if (runSpawnButton) {
                GameObject[] Instances = GameObject.FindGameObjectsWithTag("AGENTDUDE");
                foreach(GameObject t in Instances){
                    Destroy(t);
                }
                SpawnMapAgents();
            }
        });
        //-----------------------------------------------------
        if (!runSpawnButton) {
            SpawnAgents(); //if our SpawnButton Isnt enabled just run the regular spawn protocol
        }
        //-----------------------------------------------------
        mainCanvas.enabled = true;
        visualCanvas.enabled = true;
        isOutside = false;
        runButtonOn = false;    
        optCanvas.enabled = false;
        //-----------------------------------------------------
        agentCountSlider.onValueChanged.AddListener (delegate {
            AgentCount = Mathf.RoundToInt(agentCountSlider.value);
            if(Mathf.RoundToInt(agentDynamicSpawnState) == 1){
                if(sceneAgentCount < 1500){
                    SpawnAgents ();
                }else{
                    Debug.Log ("REACHED MAX AGENT COUNT, RESET SIM"); //Set Max Approx Agent Count
                }
            }
        });
        dynamicAgentSpawnScrollBar.onValueChanged.AddListener (delegate {
            agentDynamicSpawnState = dynamicAgentSpawnScrollBar.value; //Update the dAS Scrollbar value when its changed
        });
        trailTimeSlider.onValueChanged.AddListener (delegate {
            lifetime = trailTimeSlider.value; //Update the trail time scrollbar value when its changed
        });
        trailStartWSlider.onValueChanged.AddListener (delegate {
            sWidth = trailStartWSlider.value; //Update the trail start width value when its changed
        });
        trailEndWSlider.onValueChanged.AddListener (delegate {
            eWidth = trailEndWSlider.value; //Update the trail end width value when its changed
        });
        multiplierSlider.onValueChanged.AddListener (delegate {
            mP = multiplierSlider.value; //Update the mutiplier slider value when its changed
        });
        spawnScrollBar.onValueChanged.AddListener (delegate {
            spawnBarValue = spawnScrollBar.value; //Update the spawn value scrollbar when its changed
        });
        dimensionScrollBar.onValueChanged.AddListener (delegate {
            dimensionBarValue = dimensionScrollBar.value; //Update the 2d/3d scrollbar value when its changed
        });
        physicsScrollBar.onValueChanged.AddListener (delegate {
            physicsBarValue = physicsScrollBar.value; //Update the physics scrollbar value when its changed
        });
        agentHeadBar.onValueChanged.AddListener (delegate {
            agentDisplay = agentHeadBar.value; //Update the display agent head value when its changed
        });
        //-----------------------------------------------------
        RSlider.onValueChanged.AddListener (delegate {
            RSliderValue = RSlider.value; //Update the R color Slider value when its changed
        });
        GSlider.onValueChanged.AddListener (delegate {
            GSliderValue = GSlider.value; //Update the G color slider value when its changed
        });
        BSlider.onValueChanged.AddListener (delegate {
            BSliderValue = BSlider.value; //Update the B color slider value when its changed
        });
        //-----------------------------------------------------
        runImageButton.onClick.AddListener(delegate{
            runButtonOn = true; //Ensures the Behavior Map is activated when the Enable button is pressed
            optCanvas.enabled = true; //Turns on the components canvas for behavioral map
        });
    }
    void SpawnAgents()
    {
        for (int i = 0; i < AgentCount; i++)
        {
            Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, 161), 0, Random.Range(-spawnValues.z, spawnValues.z)); //Set random pos to spawn
            Quaternion spawnRotation = Quaternion.identity;
            Instantiate(agentSet, spawnPosition, spawnRotation); //create instance of the agent
        }
    }
    void SpawnMapAgents(){
        //Function to Spawn Agents when using the spawnMap
        for (int i = 0; i < AgentCount; i++)
        {
            Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, 161), 0, Random.Range(-spawnValues.z, spawnValues.z));
            Quaternion spawnRotation = Quaternion.identity;
            float lumCast = spawnCastHit(spawnPosition); //Call the castHit Function to retreive the pixel color value from the spawned pos
            if(lumCast < 0.5){
                i -=1 ;
            }else{
                Instantiate(agentSet, spawnPosition, spawnRotation); //Create instance only if the grayscale value is > than specified value above
            }
        }
    }
    public float behaviorCastHit(Vector3 pos){
        Color c;
        Vector3 currentpos = pos; //current passed position
        RaycastHit hit;
        var hitPoint = currentpos;
        Physics.Raycast (hitPoint,Vector3.down, out hit,Mathf.Infinity);
        Renderer rend = hit.transform.GetComponent<Renderer>(); //Retreive the rendered component from the hit object
        Texture2D test = mapGeo.GetComponent<MapBehavior> ().texture; //if we are using the behavior map retrieve the code component from the inherited geo then retreive texture
        c = test.GetPixelBilinear(hit.textureCoord2.x,hit.textureCoord2.y); //Get the color info at the hit coordinates
        float gScale = c.grayscale; //set grayscale
        return gScale;
    }
    public float spawnCastHit(Vector3 pos){
        Color c;
        Vector3 currentpos = pos; //current passed position
        RaycastHit hit;
        var hitPoint = currentpos;
        Physics.Raycast (hitPoint,Vector3.down, out hit,Mathf.Infinity);
        Renderer rend = hit.transform.GetComponent<Renderer>(); //Retreive the rendered component from the hit object
        Texture2D test = spawnGeo.GetComponent<SpawnBehavior>().text; //if we are using the behavior map retrieve the code component from the inherited geo then retreive texture
        c = test.GetPixelBilinear(hit.textureCoord2.x,hit.textureCoord2.y); //Get the color info at the hit coordinates
        float gScale = c.grayscale; //set grayscale
        return gScale;
    }
    void OnGUI(){
        //Behavior Canvas
        if (!hideCanvas) {
            mainCanvas.enabled = true;
        } else {
            mainCanvas.enabled = false;
        }
        //VisualCanvas Canvas
        if (!hideVisualCanvas) {
            visualCanvas.enabled = true;
        } else {
            visualCanvas.enabled = false;
        }
    }
    void Update(){
        //----------------------------------
        //Pause the Simulation using the P Key
        if(Input.GetKeyDown("p")){
            pause = !pause;
            if (pause){
                pauseHold = true;
            }else if(!pause){
                pauseHold = false;
            }
        }
        //R key will reload the application with the default values
        if (Input.GetKey ("r")) {
            reload = true;
        }
        if (reload) {
            reload = false;
            Application.LoadLevel (Application.loadedLevel);
        } 
        //----------------------------------
        //Toggles the Component Canvas by pressing space bar
        if(Input.GetKeyDown("space")){
            showOptCanvas = !showOptCanvas;
            if (showOptCanvas)
                optCanvas.enabled = true;
            else if(!showOptCanvas)
                optCanvas.enabled = false;
        }
        //----------------------------------
        //Behavior Canvas 
        if(Input.GetKeyDown("c")){
            hideCanvas = !hideCanvas;
            if (hideCanvas)
                showCanvas = true;
            else if(!hideCanvas)
                showCanvas = false;
        }
        if (Input.GetKeyDown ("w")) {
            mainCanvas.enabled = false;
            visualCanvas.enabled = false;
            optCanvas.enabled = false;
        }
        //----------------------------------
        //Visual Canvas
        if(Input.GetKeyDown("v")){
            hideVisualCanvas = !hideVisualCanvas;
            if (hideVisualCanvas)
                hideVisualCanvas = true;
            else if(!hideVisualCanvas)
                hideVisualCanvas = false;
        }
        //----------------------------------
        //Checks if we are resetting if not then proceed normally.
        if (reboot.GetComponent<DataPreserve>().fireUp == true ) { //Checks referenced class and components for trigger to reset
            Start ();
            reboot.GetComponent<DataPreserve>().restart = false; //restores that classes values for next run
            reboot.GetComponent<DataPreserve>().fireUp = false;
        }else {
            GameObject[] test = GameObject.FindGameObjectsWithTag ("AGENTDUDE"); //Get All objects with same tag
            sceneAgentCount = test.Length;
            foreach (GameObject t in test) { //Go Through each instance
                if (t == null) {
                    Debug.Log ("Cant Find Instance");
                } else {
                    if (Mathf.RoundToInt(agentDisplay) == 1) {
                        t.GetComponentInChildren<MeshRenderer>().enabled = false; //turns on or off agent head inherits value from scrollbar listener
                    } else if (Mathf.RoundToInt(agentDisplay) == 0) {
                        t.GetComponentInChildren<MeshRenderer>().enabled = true;
                    }
                    //----------------------------------
                    //Only if physics is enabled in the scrollbar
                    if(t.GetComponent<Rigidbody>()){
                        if(Mathf.RoundToInt(physicsBarValue) == 0){                    
                            t.GetComponent<Rigidbody>().mass = 0.01f;
                            t.GetComponent<BoxCollider>().enabled = false;                        
                        }else if(Mathf.RoundToInt(physicsBarValue) == 1){                        
                            cube.GetComponent<MeshRenderer>().enabled = true;
                            t.GetComponent<Rigidbody>().mass = 1f;
                            t.GetComponent<BoxCollider>().enabled = true;
                        }
                    }
                    if(Mathf.RoundToInt(dimensionBarValue) == 0){ //IF we set scrollbar to 3d we swap cameras and pass flag to the PerlinNoise Class
                        flatCamera.enabled = true;
                        dimensionCamera.enabled = false;
                        t.GetComponent<PerlinNoiseMovement>().dimension = true;
                    }else if(Mathf.RoundToInt(dimensionBarValue) == 1){
                        flatCamera.enabled = false;
                        dimensionCamera.enabled = true;
                        t.GetComponent<PerlinNoiseMovement>().dimension = false;
                    }
                    if (pauseHold) {
                        t.GetComponent<PerlinNoiseMovement>().proceed = false; //if key is pressed pass flag to perlin noise class to freeze agents.
                    }else if(!pauseHold){
                        t.GetComponent<PerlinNoiseMovement>().proceed = true; //if key is pressed pass flag to perlin noise class to freeze agents.
                    }
                    if(runButtonOn){ //if the Behavior Map Enable button is on
                        float lumValue = behaviorCastHit(t.transform.position); //call cast ray function to get color pixel value
                        if(sTenaled){ //if Strength Checkbox is enabled for map then use the grayscale value as multiplier to current settings for strength
                            t.GetComponent<PerlinNoiseMovement> ().noiseStrength = strengthSlider.value * mP * lumValue ; 
                        }else{
                            t.GetComponent<PerlinNoiseMovement> ().noiseStrength = strengthSlider.value * mP;
                        }
                        //---------------------------------------------------------------------------------------------
                        if(scTenaled){//if scale Checkbox is enabled for map then use the grayscale value as multiplier to current settings for scale
                            float lumAdjusted;
                            if(lumValue == 0.0f){
                                lumAdjusted = 0.1f;
                            }else{
                                lumAdjusted = lumValue;
                            }
                            t.GetComponent<PerlinNoiseMovement> ().noiseScale = scaleSlider.value * mP * lumAdjusted  ;
                        }else{
                            t.GetComponent<PerlinNoiseMovement> ().noiseScale = scaleSlider.value * mP   ;
                        }
                        //---------------------------------------------------------------------------------------------
                        if(speedTenaled){ //if speed Checkbox is enabled for map then use the grayscale value as multiplier to current settings for speed
                            t.GetComponent<PerlinNoiseMovement> ().minSpeed = speedSlider.value * lumValue;            
                        }else{
                            t.GetComponent<PerlinNoiseMovement> ().minSpeed = speedSlider.value;
                        }
                        //---------------------------------------------------------------------------------------------
                        if(trailSW){ //if trail Start Width Checkbox is enabled for map then use the grayscale value as multiplier to current settings             
                            t.GetComponent<TrailRenderer>().startWidth = sWidth * lumValue;
                        }else{
                            t.GetComponent<TrailRenderer>().startWidth = sWidth ;
                        }                
                        //---------------------------------------------------------------------------------------------
                        if(trailEW){ //if trail End Width Checkbox is enabled for map then use the grayscale value as multiplier to current settings     
                            t.GetComponent<TrailRenderer>().endWidth = eWidth * lumValue;
                        }else{
                            t.GetComponent<TrailRenderer>().endWidth = eWidth;
                        }
                        t.GetComponent<TrailRenderer>().time = lifetime; //for each instance grab the trail component and set the trail time to the current slider value
                        if(colorEnable && !colorDisable){ //If color enable button is pressed then adjust the tint of the trail
                            Color nColor = new Color(RSliderValue,GSliderValue,BSliderValue);
                            Material trail = t.GetComponent<TrailRenderer>().material;
                            trail.SetColor("_TintColor",nColor);
                        }    
                    }else if(!runButtonOn){ //If we are not using an image to drive values then run below
                    
                        t.GetComponent<PerlinNoiseMovement> ().noiseStrength = strengthSlider.value * mP;//For each instance we go into the Perlin Noise Class and set its variables to our slider values
                        t.GetComponent<PerlinNoiseMovement> ().noiseScale = scaleSlider.value * mP;//For each instance we go into the Perlin Noise Class and set its variables to our slider values
                        t.GetComponent<PerlinNoiseMovement> ().minSpeed = speedSlider.value;//For each instance we go into the Perlin Noise Class and set its variables to our slider values
                        
                        t.GetComponent<TrailRenderer>().startWidth = sWidth;//For each instance we go into the Perlin Noise Class and set its variables to our slider values
                        t.GetComponent<TrailRenderer>().endWidth = eWidth;//For each instance we go into the Perlin Noise Class and set its variables to our slider values
                        t.GetComponent<TrailRenderer>().time = lifetime;//For each instance we go into the Perlin Noise Class and set its variables to our slider values
                
                        if(colorEnable && !colorDisable){ //If color enable button is pressed then adjust the tint of the trail 
                            Color nColor = new Color(RSliderValue,GSliderValue,BSliderValue);
                            Material trail = t.GetComponent<TrailRenderer>().material;
                            trail.SetColor("_TintColor",nColor);
                        }
                    }
                    if(t.transform.position.x < -spawnValues.x || t.transform.position.x > 161 || t.transform.position.y < -spawnValues.y || t.transform.position.y > spawnValues.y || t.transform.position.z < -spawnValues.z || t.transform.position.z > spawnValues.z){
                        isOutside = true; //if agent position is outside the bounds we set the flag to pass along
                    }else{
                        isOutside = false;
                    }
                    if(isOutside){ //if its outside the bounds kill it and respawn a new one randomly inside the bounds
                        if(Mathf.RoundToInt(spawnBarValue) == 0){ //Value for constant spawn, here they will keep spawning as they go off frame
                            Destroy(t);
                            Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, 161), 0, Random.Range(-spawnValues.z, spawnValues.z));
                            Quaternion spawnRotation = Quaternion.identity;
                            Instantiate(agentSet, spawnPosition, spawnRotation);
                        }else if(Mathf.RoundToInt(spawnBarValue) == 1){ //value for die off, here they will stop moving once they are outside the bounds and will die once their trail time expires
                            t.GetComponent<PerlinNoiseMovement>().proceed = false;
                            Destroy(t,lifetime);
                        }
                    }                
                }
            }
        }
    }
}
  • Share