示例#1
0
    public void BuildChunk(EnvironmentGenome genome, Vector2 position, Vector2 scale, Material mat)
    {
        GameObject chunkGO = new GameObject("chunkMesh");

        /*Debug.Log("BuildChunk position: " + position.ToString() + ", scale: " + scale.ToString()
         + ", west: " + thisWest.ToString()
         + ", north: " + thisNorth.ToString()
         + ", east: " + thisEast.ToString()
         + ", south: " + thisSouth.ToString());*/
        //TerrainConstructorGPU constructor = new TerrainConstructorGPU();
        Mesh groundMesh = TerrainConstructorGPU.GetTerrainMesh(this.resolutionX, this.resolutionZ, position.x, position.y, scale.x * 2f, scale.y * 2);

        chunkGO.AddComponent <MeshFilter>().sharedMesh = groundMesh;
        this.mesh = groundMesh;
        chunkGO.AddComponent <MeshRenderer>().material = mat;
        chunkGO.transform.parent        = gameObject.transform;
        chunkGO.transform.localPosition = new Vector3(0f, 0f, 0f);
    }
示例#2
0
    /*public Mesh DeformMesh(Mesh mesh) {
     *  Mesh deformedMesh = new Mesh();
     *
     *  List<Vector3> verts = new List<Vector3>();
     *  for(int i = 0; i < mesh.vertices.Length; i++) {
     *      float randomExtrude = UnityEngine.Random.Range(-1f, 1f) * 0.05f;
     *      verts.Add(mesh.vertices[i] + mesh.normals[i] * randomExtrude);
     *  }
     *  deformedMesh.SetVertices(verts);
     *  deformedMesh.triangles = mesh.triangles;
     *  deformedMesh.normals = mesh.normals;
     *  deformedMesh.RecalculateNormals();
     *  return deformedMesh;
     * }*/

    public void CreateCollisionAndGameplayContent(EnvironmentGenome genome)
    {
        GameObject environmentGameplayGO = new GameObject("environmentGameplay");

        environmentGameplay = environmentGameplayGO.AddComponent <EnvironmentGameplay>();
        environmentGameplay.transform.parent        = gameObject.transform;
        environmentGameplay.transform.localPosition = new Vector3(0f, 0f, 0f);

        // Construct Ground Physics Material:
        PhysicMaterial noFriction = new PhysicMaterial();

        noFriction.dynamicFriction = 0f;
        noFriction.staticFriction  = 0f;
        noFriction.frictionCombine = PhysicMaterialCombine.Minimum;

        if (genome.useTerrain)
        {
            environmentGameplay.groundCollision = new GameObject("ground");

            //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
            // Need to set Terrain RenderTextureCascade and some other data before getting Collision Mesh:
            //TerrainConstructorGPU.GenerateTerrainTexturesFromGenome();
            // INITIALIZE TERRAIN-COMPUTE::
            //TerrainConstructorGPU.terrainDisplayMaterial = mat;
            TerrainConstructorGPU.GenerateTerrainTexturesFromGenome(genome, false);

            Mesh topology = TerrainConstructorGPU.GetTerrainMesh(32, 32, 0f, 0f, Challenge.GetChallengeArenaBounds(genome.challengeType).x, Challenge.GetChallengeArenaBounds(genome.challengeType).z);
            //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

            //Mesh topology = TerrainConstructor.GetTerrainMesh(genome, 32, 32, 0f, 0f, Challenge.GetChallengeArenaBounds(genome.challengeType).x, Challenge.GetChallengeArenaBounds(genome.challengeType).z);
            environmentGameplay.groundCollision.AddComponent <MeshCollider>().sharedMesh = topology;
            environmentGameplay.groundCollision.transform.parent        = environmentGameplay.gameObject.transform;
            environmentGameplay.groundCollision.transform.localPosition = new Vector3(0f, 0f, 0f);
            //ground.GetComponent<Collider>().material = noFriction;
        }

        //=============WALLS===========
        environmentGameplay.arenaWalls = new List <GameObject>();

        GameObject northWall = GameObject.CreatePrimitive(PrimitiveType.Quad);

        northWall.transform.parent        = environmentGameplay.gameObject.transform;
        northWall.transform.localPosition = new Vector3(0f, 0f, genome.arenaBounds.z * 0.5f);
        northWall.transform.localScale    = new Vector3(genome.arenaBounds.x, genome.arenaBounds.y, genome.arenaBounds.z);
        northWall.GetComponent <MeshRenderer>().enabled = false;
        northWall.GetComponent <Collider>().material    = noFriction;
        northWall.tag = "hazard";
        environmentGameplay.arenaWalls.Add(northWall);

        GameObject southWall = GameObject.CreatePrimitive(PrimitiveType.Quad);

        southWall.transform.parent        = environmentGameplay.gameObject.transform;
        southWall.transform.localPosition = new Vector3(0f, 0f, -genome.arenaBounds.z * 0.5f);
        southWall.transform.localScale    = new Vector3(genome.arenaBounds.x, genome.arenaBounds.y, genome.arenaBounds.z);
        southWall.transform.rotation      = Quaternion.Euler(0f, 180f, 0f);
        southWall.GetComponent <MeshRenderer>().enabled = false;
        southWall.GetComponent <Collider>().material    = noFriction;
        southWall.tag = "hazard";
        environmentGameplay.arenaWalls.Add(southWall);

        GameObject eastWall = GameObject.CreatePrimitive(PrimitiveType.Quad);

        eastWall.transform.parent        = environmentGameplay.gameObject.transform;
        eastWall.transform.localPosition = new Vector3(genome.arenaBounds.x * 0.5f, 0f, 0f);
        eastWall.transform.localScale    = new Vector3(genome.arenaBounds.z, genome.arenaBounds.y, genome.arenaBounds.z);
        eastWall.transform.rotation      = Quaternion.Euler(0f, 90f, 0f);
        eastWall.GetComponent <MeshRenderer>().enabled = false;
        eastWall.GetComponent <Collider>().material    = noFriction;
        eastWall.tag = "hazard";
        environmentGameplay.arenaWalls.Add(eastWall);

        GameObject westWall = GameObject.CreatePrimitive(PrimitiveType.Quad);

        westWall.transform.parent        = environmentGameplay.gameObject.transform;
        westWall.transform.localPosition = new Vector3(-genome.arenaBounds.x * 0.5f, 0f, 0f);
        westWall.transform.localScale    = new Vector3(genome.arenaBounds.z, genome.arenaBounds.y, genome.arenaBounds.z);
        westWall.transform.rotation      = Quaternion.Euler(0f, -90f, 0f);
        westWall.GetComponent <MeshRenderer>().enabled = false;
        westWall.GetComponent <Collider>().material    = noFriction;
        westWall.tag = "hazard";
        environmentGameplay.arenaWalls.Add(westWall);

        GameObject ceiling = GameObject.CreatePrimitive(PrimitiveType.Quad);

        ceiling.transform.parent        = environmentGameplay.gameObject.transform;
        ceiling.transform.localPosition = new Vector3(0f, genome.arenaBounds.y * 0.5f, 0f);
        ceiling.transform.localScale    = new Vector3(genome.arenaBounds.z, genome.arenaBounds.y, 1f);
        ceiling.transform.rotation      = Quaternion.Euler(-90f, 0f, 0f);
        ceiling.GetComponent <MeshRenderer>().enabled = false;
        ceiling.GetComponent <Collider>().material    = noFriction;
        ceiling.tag = "hazard";
        environmentGameplay.arenaWalls.Add(ceiling);

        // ======================================================================

        // Game-Required Modules:
        // Target !!!
        if (genome.useTargetColumn)
        {
            GameObject targetColumnGO = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
            targetColumnGO.transform.parent  = environmentGameplay.gameObject.transform;
            environmentGameplay.targetColumn = targetColumnGO.AddComponent <TargetColumn>();
            environmentGameplay.targetColumn.GetComponent <MeshRenderer>().enabled = false; // hide
            environmentGameplay.targetColumn.Initialize(genome.targetColumnGenome, genome);
        }

        // Obstacles:
        if (genome.useBasicObstacles)
        {
            environmentGameplay.obstacles = new List <GameObject>();
            for (int i = 0; i < genome.basicObstaclesGenome.obstaclePositions.Length; i++)
            {
                GameObject obstacle = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
                obstacle.transform.parent = environmentGameplay.gameObject.transform;
                //float x = genome.basicObstaclesGenome.obstaclePositions[i].x * genome.arenaBounds.x - genome.arenaBounds.x * 0.5f;
                //float z = genome.basicObstaclesGenome.obstaclePositions[i].y * genome.arenaBounds.z - genome.arenaBounds.z * 0.5f;
                float x = genome.basicObstaclesGenome.obstaclePositions[i].x * genome.arenaBounds.x - genome.arenaBounds.x * 0.5f;
                float z = genome.basicObstaclesGenome.obstaclePositions[i].y * genome.arenaBounds.z - genome.arenaBounds.z * 0.5f;
                if (genome.useTargetColumn)
                {
                    float distToTarget = (new Vector2(environmentGameplay.targetColumn.transform.localPosition.x, environmentGameplay.targetColumn.transform.localPosition.z) - new Vector2(x, z)).magnitude;
                    if (distToTarget < genome.basicObstaclesGenome.obstacleScales[i] * 0.6f)
                    {
                        obstacle.SetActive(false);
                    }
                }

                float y = TerrainConstructorGPU.GetAltitude(x, z);// + 0.5f;
                obstacle.transform.localScale               = new Vector3(genome.basicObstaclesGenome.obstacleScales[i], genome.basicObstaclesGenome.obstacleScales[i], genome.basicObstaclesGenome.obstacleScales[i]);
                obstacle.transform.localPosition            = new Vector3(x, y, z);
                obstacle.GetComponent <Collider>().material = noFriction;
                obstacle.tag = "hazard";
                obstacle.GetComponent <MeshRenderer>().enabled = false; // hide
                environmentGameplay.obstacles.Add(obstacle);
            }
        }

        // Atmosphere (WIND) !!!
        if (genome.useAtmosphere)
        {
            environmentGameplay.atmosphere = new Atmosphere();
            environmentGameplay.atmosphere.Initialize(genome.atmosphereGenome);
        }

        // Set Genome's prefab environment:
        genome.gameplayPrefab = environmentGameplay;
    }
示例#3
0
    public void AddRenderableContent(EnvironmentGenome genome)
    {
        // Wrappe Object:
        GameObject environmentRenderableGO = new GameObject("environmentRenderable");

        environmentRenderable = environmentRenderableGO.AddComponent <EnvironmentRenderable>();
        environmentRenderable.transform.parent        = gameObject.transform;
        environmentRenderable.transform.localPosition = new Vector3(0f, 0f, 0f);

        Material mat = Resources.Load("Materials/Environments/terrainC", typeof(Material)) as Material;  //new Material(Shader.Find("Standard"));

        mat.color = new Color(genome.terrainGenome.color.x, genome.terrainGenome.color.y, genome.terrainGenome.color.z);
        mat.SetTexture("_MainTex", TerrainConstructorGPU.customHeightRT);
        mat.SetColor("_PriHueRock", new Color(genome.terrainGenome.primaryHueRock.x, genome.terrainGenome.primaryHueRock.y, genome.terrainGenome.primaryHueRock.z));
        mat.SetColor("_SecHueRock", new Color(genome.terrainGenome.secondaryHueRock.x, genome.terrainGenome.secondaryHueRock.y, genome.terrainGenome.secondaryHueRock.z));
        mat.SetColor("_PriHueSedi", new Color(genome.terrainGenome.primaryHueSediment.x, genome.terrainGenome.primaryHueSediment.y, genome.terrainGenome.primaryHueSediment.z));
        mat.SetColor("_SecHueSedi", new Color(genome.terrainGenome.secondaryHueSediment.x, genome.terrainGenome.secondaryHueSediment.y, genome.terrainGenome.secondaryHueSediment.z));
        mat.SetColor("_PriHueSnow", new Color(genome.terrainGenome.primaryHueSnow.x, genome.terrainGenome.primaryHueSnow.y, genome.terrainGenome.primaryHueSnow.z));
        mat.SetColor("_SecHueSnow", new Color(genome.terrainGenome.secondaryHueSnow.x, genome.terrainGenome.secondaryHueSnow.y, genome.terrainGenome.secondaryHueSnow.z));


        GameObject terrainManagerGO = new GameObject("terrainManager");

        terrainManagerGO.transform.parent        = environmentRenderable.transform;
        terrainManagerGO.transform.localPosition = Vector3.zero;
        TerrainManager terrainManager = terrainManagerGO.AddComponent <TerrainManager>();

        Debug.Log("TERRAIN AddRenderableContent!");



        // Set Data on Constructor:
        //TerrainConstructorGPU.terrainConstructorGPUCompute = this.terrainConstructorGPUCompute; // set in GameManager Start()
        // Set Cascade Height Textures:
        //TerrainConstructorGPU.heightMapCascadeTextures = heightMapCascadeTextures;
        //TerrainConstructorGPU.terrainDisplayMaterial = mat;
        //TerrainConstructorGPU.ClearCustomHeightRT();
        TerrainConstructorGPU.RestoreCameraClearMode();
        TerrainConstructorGPU.GenerateTerrainTexturesFromGenome(genome, true);
        terrainManager.Initialize(terrainManagerGO, genome, mat, new Vector2(gameObject.transform.position.x, gameObject.transform.position.z), new Vector2(Challenge.GetChallengeArenaBounds(genome.challengeType).x * 17f, Challenge.GetChallengeArenaBounds(genome.challengeType).z * 17f), 6);

        // FOOTSTEPS!!! ::::
        CollisionHitEffects hitFX = environmentGameplay.groundCollision.AddComponent <CollisionHitEffects>();

        hitFX.active           = true;
        hitFX.partCustomHeight = GameManager.customHeightParticleStatic.GetComponent <ParticleSystem>(); // super hacky, f*****g hate this
        hitFX.partCustomHeight.Clear();
        hitFX.partImpactDust = GameManager.impactDustParticleStatic.GetComponent <ParticleSystem>();
        hitFX.partImpactDust.Clear();
        hitFX.partImpactPebbles = GameManager.impactPebblesParticleStatic.GetComponent <ParticleSystem>();
        hitFX.partImpactPebbles.Clear();

        // Grab Material detail textures from TerrainConstructorGPU, then:
        mat.SetTexture("_RockHeightDetailTex", TerrainConstructorGPU.detailTexRock);
        mat.SetTexture("_SediHeightDetailTex", TerrainConstructorGPU.detailTexSedi);
        mat.SetTexture("_SnowHeightDetailTex", TerrainConstructorGPU.detailTexSnow);

        // Grab Debug Mesh ( Eventually Grab 3DMC mesh from GPUConstructor)
        Material pebbleMat = Resources.Load("Materials/Environments/indirectInstancePebbleMat", typeof(Material)) as Material;

        pebbleMat.SetPass(0);
        pebbleMat.SetColor("_BaseColorPrimary", new Color(genome.terrainGenome.primaryHueSediment.x, genome.terrainGenome.primaryHueSediment.y, genome.terrainGenome.primaryHueSediment.z));
        pebbleMat.SetColor("_BaseColorSecondary", new Color(genome.terrainGenome.secondaryHueSediment.x, genome.terrainGenome.secondaryHueSediment.y, genome.terrainGenome.secondaryHueSediment.z));
        Material rockMat = Resources.Load("Materials/Environments/indirectInstanceRockMat", typeof(Material)) as Material;

        rockMat.SetPass(0);
        rockMat.SetColor("_PriHueRock", new Color(genome.terrainGenome.primaryHueRock.x, genome.terrainGenome.primaryHueRock.y, genome.terrainGenome.primaryHueRock.z));
        rockMat.SetColor("_SecHueRock", new Color(genome.terrainGenome.secondaryHueRock.x, genome.terrainGenome.secondaryHueRock.y, genome.terrainGenome.secondaryHueRock.z));
        rockMat.SetColor("_PriHueSedi", new Color(genome.terrainGenome.primaryHueSediment.x, genome.terrainGenome.primaryHueSediment.y, genome.terrainGenome.primaryHueSediment.z));
        rockMat.SetColor("_SecHueSedi", new Color(genome.terrainGenome.secondaryHueSediment.x, genome.terrainGenome.secondaryHueSediment.y, genome.terrainGenome.secondaryHueSediment.z));
        rockMat.SetColor("_PriHueSnow", new Color(genome.terrainGenome.primaryHueSnow.x, genome.terrainGenome.primaryHueSnow.y, genome.terrainGenome.primaryHueSnow.z));
        rockMat.SetColor("_SecHueSnow", new Color(genome.terrainGenome.secondaryHueSnow.x, genome.terrainGenome.secondaryHueSnow.y, genome.terrainGenome.secondaryHueSnow.z));
        rockMat.SetTexture("_HeightTex", TerrainConstructorGPU.heightMapCascadeTexturesRender[0]);
        rockMat.SetTexture("_RockHeightDetailTex", TerrainConstructorGPU.detailTexRock);
        rockMat.SetTexture("_SediHeightDetailTex", TerrainConstructorGPU.detailTexSedi);
        rockMat.SetTexture("_SnowHeightDetailTex", TerrainConstructorGPU.detailTexSnow);

        // Need to create a new material or it all goes t**s up
        //Material rockReliefArenaMat = new Material(Shader.Find("Instanced/indirectInstanceRockMat"));
        //Material rockReliefArenaMat = Resources.Load("Materials/Environments/indirectInstanceRockMat", typeof(Material)) as Material;
        Material rockReliefArenaMat = Resources.Load("Materials/Environments/indirectInstanceRockReliefArenaMat", typeof(Material)) as Material;

        rockReliefArenaMat.SetPass(0);
        rockReliefArenaMat.SetColor("_PriHueRock", new Color(genome.terrainGenome.primaryHueRock.x, genome.terrainGenome.primaryHueRock.y, genome.terrainGenome.primaryHueRock.z));
        rockReliefArenaMat.SetColor("_SecHueRock", new Color(genome.terrainGenome.secondaryHueRock.x, genome.terrainGenome.secondaryHueRock.y, genome.terrainGenome.secondaryHueRock.z));
        rockReliefArenaMat.SetColor("_PriHueSedi", new Color(genome.terrainGenome.primaryHueSediment.x, genome.terrainGenome.primaryHueSediment.y, genome.terrainGenome.primaryHueSediment.z));
        rockReliefArenaMat.SetColor("_SecHueSedi", new Color(genome.terrainGenome.secondaryHueSediment.x, genome.terrainGenome.secondaryHueSediment.y, genome.terrainGenome.secondaryHueSediment.z));
        rockReliefArenaMat.SetColor("_PriHueSnow", new Color(genome.terrainGenome.primaryHueSnow.x, genome.terrainGenome.primaryHueSnow.y, genome.terrainGenome.primaryHueSnow.z));
        rockReliefArenaMat.SetColor("_SecHueSnow", new Color(genome.terrainGenome.secondaryHueSnow.x, genome.terrainGenome.secondaryHueSnow.y, genome.terrainGenome.secondaryHueSnow.z));
        rockReliefArenaMat.SetTexture("_HeightTex", TerrainConstructorGPU.heightMapCascadeTexturesRender[0]);
        rockReliefArenaMat.SetTexture("_RockHeightDetailTex", TerrainConstructorGPU.detailTexRock);
        rockReliefArenaMat.SetTexture("_SediHeightDetailTex", TerrainConstructorGPU.detailTexSedi);
        rockReliefArenaMat.SetTexture("_SnowHeightDetailTex", TerrainConstructorGPU.detailTexSnow);

        Material rockCliffsMat = Resources.Load("Materials/Environments/indirectInstanceRockCliffsMat", typeof(Material)) as Material;

        rockCliffsMat.SetPass(0);
        rockCliffsMat.SetColor("_PriHueRock", new Color(genome.terrainGenome.primaryHueRock.x, genome.terrainGenome.primaryHueRock.y, genome.terrainGenome.primaryHueRock.z));
        rockCliffsMat.SetColor("_SecHueRock", new Color(genome.terrainGenome.secondaryHueRock.x, genome.terrainGenome.secondaryHueRock.y, genome.terrainGenome.secondaryHueRock.z));
        rockCliffsMat.SetColor("_PriHueSedi", new Color(genome.terrainGenome.primaryHueSediment.x, genome.terrainGenome.primaryHueSediment.y, genome.terrainGenome.primaryHueSediment.z));
        rockCliffsMat.SetColor("_SecHueSedi", new Color(genome.terrainGenome.secondaryHueSediment.x, genome.terrainGenome.secondaryHueSediment.y, genome.terrainGenome.secondaryHueSediment.z));
        rockCliffsMat.SetColor("_PriHueSnow", new Color(genome.terrainGenome.primaryHueSnow.x, genome.terrainGenome.primaryHueSnow.y, genome.terrainGenome.primaryHueSnow.z));
        rockCliffsMat.SetColor("_SecHueSnow", new Color(genome.terrainGenome.secondaryHueSnow.x, genome.terrainGenome.secondaryHueSnow.y, genome.terrainGenome.secondaryHueSnow.z));
        rockCliffsMat.SetTexture("_HeightTex", TerrainConstructorGPU.heightMapCascadeTexturesRender[0]);
        rockCliffsMat.SetTexture("_RockHeightDetailTex", TerrainConstructorGPU.detailTexRock);
        rockCliffsMat.SetTexture("_SediHeightDetailTex", TerrainConstructorGPU.detailTexSedi);
        rockCliffsMat.SetTexture("_SnowHeightDetailTex", TerrainConstructorGPU.detailTexSnow);

        // CLUSTERS:::::
        Material vistaRockClusterMat = Resources.Load("Materials/Environments/indirectInstanceVistaRockClusterMat", typeof(Material)) as Material;

        vistaRockClusterMat.SetPass(0);
        vistaRockClusterMat.SetColor("_PriHueRock", new Color(genome.terrainGenome.primaryHueRock.x, genome.terrainGenome.primaryHueRock.y, genome.terrainGenome.primaryHueRock.z));
        vistaRockClusterMat.SetColor("_SecHueRock", new Color(genome.terrainGenome.secondaryHueRock.x, genome.terrainGenome.secondaryHueRock.y, genome.terrainGenome.secondaryHueRock.z));
        vistaRockClusterMat.SetColor("_PriHueSedi", new Color(genome.terrainGenome.primaryHueSediment.x, genome.terrainGenome.primaryHueSediment.y, genome.terrainGenome.primaryHueSediment.z));
        vistaRockClusterMat.SetColor("_SecHueSedi", new Color(genome.terrainGenome.secondaryHueSediment.x, genome.terrainGenome.secondaryHueSediment.y, genome.terrainGenome.secondaryHueSediment.z));
        vistaRockClusterMat.SetColor("_PriHueSnow", new Color(genome.terrainGenome.primaryHueSnow.x, genome.terrainGenome.primaryHueSnow.y, genome.terrainGenome.primaryHueSnow.z));
        vistaRockClusterMat.SetColor("_SecHueSnow", new Color(genome.terrainGenome.secondaryHueSnow.x, genome.terrainGenome.secondaryHueSnow.y, genome.terrainGenome.secondaryHueSnow.z));
        vistaRockClusterMat.SetTexture("_HeightTex", TerrainConstructorGPU.heightMapCascadeTexturesRender[0]);
        vistaRockClusterMat.SetTexture("_RockHeightDetailTex", TerrainConstructorGPU.detailTexRock);
        vistaRockClusterMat.SetTexture("_SediHeightDetailTex", TerrainConstructorGPU.detailTexSedi);
        vistaRockClusterMat.SetTexture("_SnowHeightDetailTex", TerrainConstructorGPU.detailTexSnow);

        // OBSTACLES:::::
        Material obstacleRockMat = Resources.Load("Materials/Environments/indirectInstanceObstacleRockMat", typeof(Material)) as Material;

        obstacleRockMat.SetPass(0);
        obstacleRockMat.SetColor("_PriHueRock", new Color(genome.terrainGenome.primaryHueRock.x, genome.terrainGenome.primaryHueRock.y, genome.terrainGenome.primaryHueRock.z));
        obstacleRockMat.SetColor("_SecHueRock", new Color(genome.terrainGenome.secondaryHueRock.x, genome.terrainGenome.secondaryHueRock.y, genome.terrainGenome.secondaryHueRock.z));
        obstacleRockMat.SetColor("_PriHueSedi", new Color(genome.terrainGenome.primaryHueSediment.x, genome.terrainGenome.primaryHueSediment.y, genome.terrainGenome.primaryHueSediment.z));
        obstacleRockMat.SetColor("_SecHueSedi", new Color(genome.terrainGenome.secondaryHueSediment.x, genome.terrainGenome.secondaryHueSediment.y, genome.terrainGenome.secondaryHueSediment.z));
        obstacleRockMat.SetColor("_PriHueSnow", new Color(genome.terrainGenome.primaryHueSnow.x, genome.terrainGenome.primaryHueSnow.y, genome.terrainGenome.primaryHueSnow.z));
        obstacleRockMat.SetColor("_SecHueSnow", new Color(genome.terrainGenome.secondaryHueSnow.x, genome.terrainGenome.secondaryHueSnow.y, genome.terrainGenome.secondaryHueSnow.z));
        obstacleRockMat.SetTexture("_HeightTex", TerrainConstructorGPU.heightMapCascadeTexturesRender[0]);
        obstacleRockMat.SetTexture("_RockHeightDetailTex", TerrainConstructorGPU.detailTexRock);
        obstacleRockMat.SetTexture("_SediHeightDetailTex", TerrainConstructorGPU.detailTexSedi);
        obstacleRockMat.SetTexture("_SnowHeightDetailTex", TerrainConstructorGPU.detailTexSnow);

        // Grab reference to ComputeShader set on TerrainConstructorGPU (by gameManager through inspector)
        environmentRenderable.InitializeInstancedGeometry(genome, TerrainConstructorGPU.rockAMesh2, pebbleMat, TerrainConstructorGPU.rockAMesh1, rockMat, TerrainConstructorGPU.rockAMesh1, rockReliefArenaMat, TerrainConstructorGPU.rockAMesh1, rockCliffsMat, TerrainConstructorGPU.rockAMesh0, vistaRockClusterMat, TerrainConstructorGPU.rockAMesh0, obstacleRockMat, TerrainConstructorGPU.terrainInstanceCompute);


        /*environmentRenderable.groundRenderable = new GameObject("groundRenderable");
         * Mesh topology = GetTerrainMesh(genome, 100, 100, Challenge.GetChallengeArenaBounds(genome.challengeType).x, Challenge.GetChallengeArenaBounds(genome.challengeType).z);
         * environmentRenderable.groundRenderable.AddComponent<MeshFilter>().sharedMesh = topology;
         * environmentRenderable.groundRenderable.AddComponent<MeshRenderer>().material = mat;
         * environmentRenderable.groundRenderable.transform.parent = environmentRenderable.gameObject.transform;
         * environmentRenderable.groundRenderable.transform.localPosition = new Vector3(0f, 0f, 0f); */

        // Target !!!
        if (genome.useTargetColumn)
        {
            GameObject targetColumn = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/targetLocation")) as GameObject;
            targetColumn.transform.parent        = environmentRenderable.gameObject.transform;
            targetColumn.transform.localPosition = environmentGameplay.targetColumn.gameObject.transform.localPosition;
            //environmentGameplay.targetColumn.GetComponent<MeshRenderer>().enabled = true; // hide
        }

        // Obstacles:
        if (genome.useBasicObstacles)
        {
            for (int i = 0; i < environmentGameplay.obstacles.Count; i++)
            {
                GameObject obstacle;
                UnityEngine.Random.InitState(genome.basicObstaclesGenome.randomSeed + i);  // Set Seed from Genome (experimental)

                int meshID = Mathf.RoundToInt(UnityEngine.Random.Range(0f, 2f));

                if (meshID == 0)
                {
                    obstacle = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/obstacleBoulder00")) as GameObject;
                }
                else if (meshID == 1)
                {
                    obstacle = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/obstacleBoulder01")) as GameObject;
                }
                else
                {
                    obstacle = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/obstacleBoulder02")) as GameObject;
                }
                //obstacle.GetComponent<MeshFilter>().sharedMesh = boulderMesh;
                obstacle.transform.parent        = environmentRenderable.gameObject.transform;
                obstacle.transform.localPosition = environmentGameplay.obstacles[i].gameObject.transform.localPosition - new Vector3(0f, UnityEngine.Random.Range(0f, 1f), 0f);
                obstacle.transform.rotation      = Quaternion.Euler(UnityEngine.Random.Range(-10f, 10f), UnityEngine.Random.Range(-180f, 180f), UnityEngine.Random.Range(-10f, 10f));
                obstacle.transform.localScale    = environmentGameplay.obstacles[i].gameObject.transform.localScale + new Vector3(0f, UnityEngine.Random.Range(0f, 1f), 0f);
                obstacle.GetComponent <MeshRenderer>().material = obstacleRockMat;

                /*
                 * obstacle.transform.parent = environmentGameplay.gameObject.transform;
                 * //float x = genome.basicObstaclesGenome.obstaclePositions[i].x * genome.arenaBounds.x - genome.arenaBounds.x * 0.5f;
                 * //float z = genome.basicObstaclesGenome.obstaclePositions[i].y * genome.arenaBounds.z - genome.arenaBounds.z * 0.5f;
                 * float x = genome.basicObstaclesGenome.obstaclePositions[i].x * genome.arenaBounds.x - genome.arenaBounds.x * 0.5f;
                 * float z = genome.basicObstaclesGenome.obstaclePositions[i].y * genome.arenaBounds.z - genome.arenaBounds.z * 0.5f;
                 * if (genome.useTargetColumn) {
                 *  float distToTarget = (new Vector2(environmentGameplay.targetColumn.transform.localPosition.x, environmentGameplay.targetColumn.transform.localPosition.z) - new Vector2(x, z)).magnitude;
                 *  if(distToTarget < genome.basicObstaclesGenome.obstacleScales[i] * 0.6f) {
                 *      obstacle.SetActive(false);
                 *  }
                 * }
                 * float y = TerrainConstructor.GetAltitude(genome, x, z) + 0.5f;
                 * obstacle.transform.localScale = new Vector3(genome.basicObstaclesGenome.obstacleScales[i], 1f, genome.basicObstaclesGenome.obstacleScales[i]);
                 * obstacle.transform.localPosition = new Vector3(x, y, z);
                 */

                /*
                 *
                 * //  SUB-BOULDERS!!!
                 * int numSubBoulders = Mathf.RoundToInt(UnityEngine.Random.Range(2f, 4f));
                 * for (int j = 0; j < numSubBoulders; j++) {
                 *  GameObject subBoulder;
                 *  int boulderID = Mathf.RoundToInt(UnityEngine.Random.Range(0f, 2f));
                 *  if (boulderID == 0) {
                 *      subBoulder = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/obstacleBoulder00")) as GameObject;
                 *  }
                 *  else if (boulderID == 1) {
                 *      subBoulder = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/obstacleBoulder01")) as GameObject;
                 *  }
                 *  else {
                 *      subBoulder = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/obstacleBoulder02")) as GameObject;
                 *  }
                 *  float randScale = UnityEngine.Random.Range(0.2f, 0.6f);
                 *  //float randScaleY = UnityEngine.Random.Range(0.2f, 0.6f);
                 *  //float randScaleZ = UnityEngine.Random.Range(0.2f, 0.6f);
                 *  subBoulder.transform.parent = environmentRenderable.gameObject.transform;
                 *
                 *  float radius = UnityEngine.Random.Range(environmentGameplay.obstacles[i].gameObject.transform.localScale.x * 0.5f, environmentGameplay.obstacles[i].gameObject.transform.localScale.x * 0.95f);
                 *  float randAngle = UnityEngine.Random.Range(-Mathf.PI, Mathf.PI);
                 *  float xPos = Mathf.Sin(randAngle) * radius;
                 *  float zPos = Mathf.Cos(randAngle) * radius;
                 *  float yPos = TerrainConstructor.GetAltitude(genome, xPos + environmentGameplay.obstacles[i].gameObject.transform.localPosition.x, zPos + environmentGameplay.obstacles[i].gameObject.transform.localPosition.z);
                 *  Vector3 pos = new Vector3(Mathf.Sin(randAngle) * radius + environmentGameplay.obstacles[i].gameObject.transform.localPosition.x, yPos - UnityEngine.Random.Range(randScale * 0.05f, randScale * 0.2f) * environmentGameplay.obstacles[i].gameObject.transform.localScale.y, Mathf.Cos(randAngle) + environmentGameplay.obstacles[i].gameObject.transform.localPosition.z);
                 *
                 *  subBoulder.transform.localPosition = pos;
                 *  subBoulder.transform.rotation = Quaternion.Euler(UnityEngine.Random.Range(-180f, 180f), UnityEngine.Random.Range(-180f, 180f), UnityEngine.Random.Range(-180f, 180f));
                 *  Vector3 scale = new Vector3(environmentGameplay.obstacles[i].gameObject.transform.localScale.x * randScale, environmentGameplay.obstacles[i].gameObject.transform.localScale.y * randScale, environmentGameplay.obstacles[i].gameObject.transform.localScale.z * randScale);
                 *  subBoulder.transform.localScale = scale;
                 *  subBoulder.GetComponent<MeshRenderer>().material = mat;
                 * }
                 *
                 * //  PEBBLES!!!
                 * int numPebbles = Mathf.RoundToInt(UnityEngine.Random.Range(5f, 20f));
                 * for (int k = 0; k < numPebbles; k++) {
                 *  GameObject pebble;
                 *  int boulderID = Mathf.RoundToInt(UnityEngine.Random.Range(0f, 2f));
                 *  if (boulderID == 0) {
                 *      pebble = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/obstacleBoulder00")) as GameObject;
                 *  }
                 *  else if (boulderID == 1) {
                 *      pebble = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/obstacleBoulder01")) as GameObject;
                 *  }
                 *  else {
                 *      pebble = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/obstacleBoulder02")) as GameObject;
                 *  }
                 *  float randScale = UnityEngine.Random.Range(0.05f, 0.25f);
                 *  //float randScaleY = UnityEngine.Random.Range(0.05f, 0.25f);
                 *  //float randScaleZ = UnityEngine.Random.Range(0.05f, 0.25f);
                 *  pebble.transform.parent = environmentRenderable.gameObject.transform;
                 *
                 *  float radius = UnityEngine.Random.Range(environmentGameplay.obstacles[i].gameObject.transform.localScale.x * 0.5f, environmentGameplay.obstacles[i].gameObject.transform.localScale.x * 5f);
                 *  float randAngle = UnityEngine.Random.Range(-Mathf.PI, Mathf.PI);
                 *  float xPos = Mathf.Sin(randAngle) * radius;
                 *  float zPos = Mathf.Cos(randAngle) * radius;
                 *  float yPos = TerrainConstructor.GetAltitude(genome, xPos + environmentGameplay.obstacles[i].gameObject.transform.localPosition.x, zPos + environmentGameplay.obstacles[i].gameObject.transform.localPosition.z);
                 *  Vector3 pos = new Vector3(Mathf.Sin(randAngle) * radius + environmentGameplay.obstacles[i].gameObject.transform.localPosition.x, yPos - UnityEngine.Random.Range(randScale * 0.05f, randScale * 0.2f) * environmentGameplay.obstacles[i].gameObject.transform.localScale.y, Mathf.Cos(randAngle) * radius + environmentGameplay.obstacles[i].gameObject.transform.localPosition.z);
                 *  pebble.transform.localPosition = pos;
                 *  pebble.transform.rotation = Quaternion.Euler(UnityEngine.Random.Range(-180f, 180f), UnityEngine.Random.Range(-180f, 180f), UnityEngine.Random.Range(-180f, 180f));
                 *  Vector3 scale = new Vector3(environmentGameplay.obstacles[i].gameObject.transform.localScale.x * randScale, environmentGameplay.obstacles[i].gameObject.transform.localScale.y * randScale, environmentGameplay.obstacles[i].gameObject.transform.localScale.z * randScale);
                 *  pebble.transform.localScale = scale;
                 *  pebble.GetComponent<MeshRenderer>().material = mat;
                 * }
                 *
                 * // Exterior Boulders!!!
                 * //  PEBBLES!!!
                 * int numVistaRocks = Mathf.RoundToInt(UnityEngine.Random.Range(20f, 40f));
                 * for (int m = 0; m < numVistaRocks; m++) {
                 *  GameObject vistaRock;
                 *  int boulderID = Mathf.RoundToInt(UnityEngine.Random.Range(0f, 2f));
                 *  if (boulderID == 0) {
                 *      vistaRock = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/obstacleBoulder00")) as GameObject;
                 *  }
                 *  else if (boulderID == 1) {
                 *      vistaRock = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/obstacleBoulder01")) as GameObject;
                 *  }
                 *  else {
                 *      vistaRock = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/obstacleBoulder02")) as GameObject;
                 *  }
                 *  float randScale = UnityEngine.Random.Range(0.5f, 3.6f);
                 *  //float randScaleY = UnityEngine.Random.Range(0.05f, 0.25f);
                 *  //float randScaleZ = UnityEngine.Random.Range(0.05f, 0.25f);
                 *  vistaRock.transform.parent = environmentRenderable.gameObject.transform;
                 *
                 *  float radius = UnityEngine.Random.Range(Challenge.GetChallengeArenaBounds(Challenge.Type.Test).x * 1.33f, Challenge.GetChallengeArenaBounds(Challenge.Type.Test).x * 4f);
                 *  float randAngle = UnityEngine.Random.Range(-Mathf.PI, Mathf.PI);
                 *  float xPos = Mathf.Sin(randAngle) * radius;
                 *  float zPos = Mathf.Cos(randAngle) * radius;
                 *  float yPos = TerrainConstructor.GetAltitude(genome, xPos + environmentGameplay.obstacles[i].gameObject.transform.localPosition.x, zPos + environmentGameplay.obstacles[i].gameObject.transform.localPosition.z);
                 *  Vector3 pos = new Vector3(xPos, yPos - UnityEngine.Random.Range(randScale * 0.05f, randScale * 0.2f), zPos);
                 *  vistaRock.transform.localPosition = pos;
                 *  vistaRock.transform.rotation = Quaternion.Euler(UnityEngine.Random.Range(-180f, 180f), UnityEngine.Random.Range(-180f, 180f), UnityEngine.Random.Range(-180f, 180f));
                 *  Vector3 scale = new Vector3(environmentGameplay.obstacles[i].gameObject.transform.localScale.x * randScale, environmentGameplay.obstacles[i].gameObject.transform.localScale.y * randScale, environmentGameplay.obstacles[i].gameObject.transform.localScale.z * randScale);
                 *  vistaRock.transform.localScale = scale;
                 *  vistaRock.GetComponent<MeshRenderer>().material = mat;
                 * }
                 */
            }
            // PArticle Pebbles!

            /*
             * GameObject particlePebbles = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/obstacleParticles")) as GameObject;
             * particlePebbles.transform.parent = environmentRenderable.transform;
             * ParticleSystem.ShapeModule emitterShape = particlePebbles.GetComponent<ParticleSystem>().shape;
             * emitterShape.mesh = environmentGameplay.groundCollision.GetComponent<MeshCollider>().sharedMesh;
             * Debug.Log(emitterShape.mesh.ToString());
             * ParticleSystem.EmissionModule emission = particlePebbles.GetComponent<ParticleSystem>().emission;
             * emission.enabled = true;
             */
        }

        // WALLS:
        GameObject northWall = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/arenaWall")) as GameObject; // GameObject.CreatePrimitive(PrimitiveType.Quad);

        northWall.transform.parent        = environmentRenderable.gameObject.transform;
        northWall.transform.localPosition = new Vector3(0f, 0f, genome.arenaBounds.z * 0.5f);
        northWall.transform.localScale    = new Vector3(genome.arenaBounds.x, genome.arenaBounds.y, genome.arenaBounds.z);

        GameObject southWall = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/arenaWall")) as GameObject;

        southWall.transform.parent        = environmentRenderable.gameObject.transform;
        southWall.transform.localPosition = new Vector3(0f, 0f, -genome.arenaBounds.z * 0.5f);
        southWall.transform.localScale    = new Vector3(genome.arenaBounds.x, genome.arenaBounds.y, genome.arenaBounds.z);
        southWall.transform.rotation      = Quaternion.Euler(0f, 180f, 0f);

        GameObject eastWall = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/arenaWall")) as GameObject;

        eastWall.transform.parent        = environmentRenderable.gameObject.transform;
        eastWall.transform.localPosition = new Vector3(genome.arenaBounds.x * 0.5f, 0f, 0f);
        eastWall.transform.localScale    = new Vector3(genome.arenaBounds.z, genome.arenaBounds.y, genome.arenaBounds.z);
        eastWall.transform.rotation      = Quaternion.Euler(0f, 90f, 0f);

        GameObject westWall = Instantiate(Resources.Load("Prefabs/ObjectPrefabs/arenaWall")) as GameObject;

        westWall.transform.parent        = environmentRenderable.gameObject.transform;
        westWall.transform.localPosition = new Vector3(-genome.arenaBounds.x * 0.5f, 0f, 0f);
        westWall.transform.localScale    = new Vector3(genome.arenaBounds.z, genome.arenaBounds.y, genome.arenaBounds.z);
        westWall.transform.rotation      = Quaternion.Euler(0f, -90f, 0f);
    }