public void CopyGenomeFromTemplate(EnvironmentGenome templateGenome) { //Debug.Log("CopyGenomeFromTemplate BEFORE startPosCount: " + templateGenome.agentStartPositionsList.Count.ToString()); // This method creates a clone of the provided ScriptableObject Genome - should have no shared references!!! this.challengeType = templateGenome.challengeType; arenaBounds = new Vector3(templateGenome.arenaBounds.x, templateGenome.arenaBounds.y, templateGenome.arenaBounds.z); agentStartPositionsList = new List <StartPositionGenome>(); for (int i = 0; i < templateGenome.agentStartPositionsList.Count; i++) { //Debug.Log("CopyGenomeFromTemplate DURING i: " + i.ToString()); StartPositionGenome genomeCopy = new StartPositionGenome(templateGenome.agentStartPositionsList[i]); agentStartPositionsList.Add(genomeCopy); } //Debug.Log("CopyGenomeFromTemplate AFTER startPosCount: " + agentStartPositionsList.Count.ToString()); useTerrain = templateGenome.useTerrain; if (useTerrain) { terrainGenome = new TerrainGenome(templateGenome.terrainGenome); //terrainGenome.InitializeRandomGenome(); } useBasicObstacles = templateGenome.useBasicObstacles; if (useBasicObstacles) { basicObstaclesGenome = new BasicObstaclesGenome(templateGenome.basicObstaclesGenome, this); //basicObstaclesGenome.InitializeRandomGenome(); } useTargetColumn = templateGenome.useTargetColumn; if (useTargetColumn) { targetColumnGenome = new TargetColumnGenome(); //targetColumnGenome.InitializeRandomGenome(); } useAtmosphere = templateGenome.useAtmosphere; if (useAtmosphere) { atmosphereGenome = new AtmosphereGenome(templateGenome.atmosphereGenome); //basicObstaclesGenome.InitializeRandomGenome(); } useMeteorites = templateGenome.useMeteorites; if (useMeteorites) { meteoritesGenome = new MeteoritesGenome(templateGenome.meteoritesGenome); //basicObstaclesGenome.InitializeRandomGenome(); } // For now this is fine -- but eventually might want to copy brainGenome from saved asset! //brainGenome = new BrainGenome(); // creates neuron and axonLists //InitializeRandomBrainGenome(); }
public EnvironmentGenome BirthNewGenome(EnvironmentGenome parentGenome, int index, Challenge.Type challengeType, float mutationRate, float mutationDriftAmount) { EnvironmentGenome newGenome = new EnvironmentGenome(index); newGenome.challengeType = parentGenome.challengeType; newGenome.arenaBounds = new Vector3(parentGenome.arenaBounds.x, parentGenome.arenaBounds.y, parentGenome.arenaBounds.z); newGenome.useTerrain = parentGenome.useTerrain; if (parentGenome.useTerrain) { newGenome.terrainGenome = TerrainGenome.BirthNewGenome(parentGenome.terrainGenome, mutationRate, mutationDriftAmount); } newGenome.useBasicObstacles = parentGenome.useBasicObstacles; if (parentGenome.useBasicObstacles) { newGenome.basicObstaclesGenome = BasicObstaclesGenome.BirthNewGenome(parentGenome.basicObstaclesGenome, mutationRate, mutationDriftAmount, this); } newGenome.useTargetColumn = parentGenome.useTargetColumn; if (parentGenome.useTargetColumn) { newGenome.targetColumnGenome = TargetColumnGenome.BirthNewGenome(parentGenome.targetColumnGenome, mutationRate, mutationDriftAmount); } newGenome.useAtmosphere = parentGenome.useAtmosphere; if (parentGenome.useAtmosphere) { newGenome.atmosphereGenome = AtmosphereGenome.BirthNewGenome(parentGenome.atmosphereGenome, mutationRate, mutationDriftAmount); } newGenome.useMeteorites = parentGenome.useMeteorites; if (parentGenome.useMeteorites) { newGenome.meteoritesGenome = MeteoritesGenome.BirthNewGenome(parentGenome.meteoritesGenome, mutationRate, mutationDriftAmount); } // StartPositions: // HACKY! DOES NOT SUPPORT EVOLVING START POSITIONS! ALL THE SAME!!!! newGenome.agentStartPositionsList = parentGenome.agentStartPositionsList; /*newGenome.agentStartPositionsList = new List<Vector3>(); * //Debug.Log("(parentGenome.agentStartPositionsList.Count" + parentGenome.agentStartPositionsList.Count.ToString()); * for (int i = 0; i < parentGenome.agentStartPositionsList.Count; i++) { * newGenome.agentStartPositionsList.Add(new Vector3(parentGenome.agentStartPositionsList[i].x, parentGenome.agentStartPositionsList[i].y, parentGenome.agentStartPositionsList[i].z)); * } * newGenome.agentStartRotationsList = new List<Quaternion>(); * for (int i = 0; i < parentGenome.agentStartRotationsList.Count; i++) { * newGenome.agentStartRotationsList.Add(new Quaternion(parentGenome.agentStartRotationsList[i].x, parentGenome.agentStartRotationsList[i].y, parentGenome.agentStartRotationsList[i].z, parentGenome.agentStartRotationsList[i].w)); * }*/ return(newGenome); }
public static TerrainGenome BirthNewGenome(TerrainGenome parentGenome, float mutationRate, float mutationDriftAmount) { TerrainGenome newGenome = new TerrainGenome(); newGenome.primaryHueRock = parentGenome.primaryHueRock; MutateVector3Color(ref newGenome.primaryHueRock, mutationRate, mutationDriftAmount); newGenome.secondaryHueRock = parentGenome.secondaryHueRock; MutateVector3Color(ref newGenome.secondaryHueRock, mutationRate, mutationDriftAmount); newGenome.primaryHueSediment = parentGenome.primaryHueSediment; MutateVector3Color(ref newGenome.primaryHueSediment, mutationRate, mutationDriftAmount); newGenome.secondaryHueSediment = parentGenome.secondaryHueSediment; MutateVector3Color(ref newGenome.secondaryHueSediment, mutationRate, mutationDriftAmount); newGenome.primaryHueSnow = parentGenome.primaryHueSnow; MutateVector3Color(ref newGenome.primaryHueSnow, mutationRate, mutationDriftAmount); newGenome.secondaryHueSnow = parentGenome.secondaryHueSnow; MutateVector3Color(ref newGenome.secondaryHueSnow, mutationRate, mutationDriftAmount); float baseMaxAmplitude = 100f; float baseMinAmplitude = 0f; float baseMaxFrequency = 8f; float baseMinFrequency = 0.01f; // ROCK!!! &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& #region GLOBAL ROCK PASSES: // GLOBAL ROCK PASSES: if (parentGenome.terrainGlobalRockPasses != null) { newGenome.terrainGlobalRockPasses = new List <GlobalRockPass>(); for (int i = 0; i < parentGenome.terrainGlobalRockPasses.Count; i++) { float maxAmplitude = baseMaxAmplitude / Mathf.Pow(2, i); float minAmplitude = baseMinAmplitude / Mathf.Pow(2, i); float maxFrequency = baseMaxFrequency * Mathf.Pow(2, i); float minFrequency = baseMinFrequency * Mathf.Pow(2, i); float maxAmpToFreqRatio = 1f; // Start with copy of Parent: GlobalRockPass globalRockPass = new GlobalRockPass(); globalRockPass = parentGenome.terrainGlobalRockPasses[i]; // MAKE SURE THIS IS VALUE-TYPED !!!!!! MutateIntBasic(ref globalRockPass.heightOperation, 0, 3, mutationRate, mutationDriftAmount); // MUTATION: // Height NOISE: MutateIntBasic(ref globalRockPass.numNoiseOctavesHeight, 4, 8, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.heightFlowAmount, -1f, 1f, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref globalRockPass.heightSampleData.amplitude, maxAmpToFreqRatio, minAmplitude, maxAmplitude, mutationRate, mutationDriftAmount); MutateFrequency(ref globalRockPass.heightSampleData.frequency, minFrequency, maxFrequency, mutationRate, mutationDriftAmount); MutateVector3Basic(ref globalRockPass.heightSampleData.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref globalRockPass.heightSampleData.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.heightSampleData.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); // LEVELS!!! MutateFloatBasic(ref globalRockPass.heightLevelsAdjust.x, 0f, globalRockPass.heightLevelsAdjust.y, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.heightLevelsAdjust.y, globalRockPass.heightLevelsAdjust.x, 1f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.heightLevelsAdjust.z, 0f, globalRockPass.heightLevelsAdjust.w, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.heightLevelsAdjust.w, globalRockPass.heightLevelsAdjust.z, 1f, mutationRate, mutationDriftAmount); // MASK1 !!!!! MutateIntBasic(ref globalRockPass.numNoiseOctavesHeight, 4, 8, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.mask1FlowAmount, -1f, 1f, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref globalRockPass.mask1SampleData.amplitude, maxAmpToFreqRatio, 0f, 5f, mutationRate, mutationDriftAmount); MutateFrequency(ref globalRockPass.mask1SampleData.frequency, minFrequency, maxFrequency, mutationRate, mutationDriftAmount); MutateVector3Basic(ref globalRockPass.mask1SampleData.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref globalRockPass.mask1SampleData.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.mask1SampleData.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); // LEVELS!!! MutateFloatBasic(ref globalRockPass.mask1LevelsAdjust.x, 0f, globalRockPass.mask1LevelsAdjust.y, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.mask1LevelsAdjust.y, globalRockPass.mask1LevelsAdjust.x, 1f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.mask1LevelsAdjust.z, 0f, globalRockPass.mask1LevelsAdjust.w, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.mask1LevelsAdjust.w, globalRockPass.mask1LevelsAdjust.z, 1f, mutationRate, mutationDriftAmount); // MASK2 !!!!! MutateIntBasic(ref globalRockPass.numNoiseOctavesHeight, 4, 8, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.mask2FlowAmount, -1f, 1f, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref globalRockPass.mask2SampleData.amplitude, maxAmpToFreqRatio, 0f, 5f, mutationRate, mutationDriftAmount); MutateFrequency(ref globalRockPass.mask2SampleData.frequency, minFrequency, maxFrequency, mutationRate, mutationDriftAmount); MutateVector3Basic(ref globalRockPass.mask2SampleData.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref globalRockPass.mask2SampleData.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.mask2SampleData.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); // LEVELS!!! MutateFloatBasic(ref globalRockPass.mask2LevelsAdjust.x, 0f, globalRockPass.mask2LevelsAdjust.y, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.mask2LevelsAdjust.y, globalRockPass.mask2LevelsAdjust.x, 1f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.mask2LevelsAdjust.z, 0f, globalRockPass.mask2LevelsAdjust.w, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.mask2LevelsAdjust.w, globalRockPass.mask2LevelsAdjust.z, 1f, mutationRate, mutationDriftAmount); // FLOW !!!!! MutateIntBasic(ref globalRockPass.numNoiseOctavesHeight, 4, 8, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref globalRockPass.flowSampleData.amplitude, maxAmpToFreqRatio, -1f, 1f, mutationRate, mutationDriftAmount); MutateFrequency(ref globalRockPass.flowSampleData.frequency, minFrequency, maxFrequency * 0.33f, mutationRate, mutationDriftAmount); MutateVector3Basic(ref globalRockPass.flowSampleData.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref globalRockPass.flowSampleData.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalRockPass.flowSampleData.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); newGenome.terrainGlobalRockPasses.Add(globalRockPass); } } #endregion // SEDIMENT!!! &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& #region Sediment // GLOBAL SEDIMENT PASSES: if (parentGenome.terrainGlobalSedimentPasses != null) { newGenome.terrainGlobalSedimentPasses = new List <GlobalSedimentPass>(); for (int i = 0; i < parentGenome.terrainGlobalSedimentPasses.Count; i++) { float maxAmplitude = baseMaxAmplitude / Mathf.Pow(2, i); float minAmplitude = baseMinAmplitude / Mathf.Pow(2, i); float maxFrequency = baseMaxFrequency * Mathf.Pow(2, i); float minFrequency = baseMinFrequency * Mathf.Pow(2, i); float maxAmpToFreqRatio = 10f; // Start with copy of Parent: GlobalSedimentPass globalSedimentPass = new GlobalSedimentPass(); globalSedimentPass = parentGenome.terrainGlobalSedimentPasses[i]; // MAKE SURE THIS IS VALUE-TYPED !!!!!! //globalSedimentPass.maxAltitudeSedimentDrape = parentGenome.terrainGlobalSedimentPasses[i].maxAltitudeSedimentDrape; // is this necessary? //globalSedimentPass.sedimentDrapeMagnitude = parentGenome.terrainGlobalSedimentPasses[i].sedimentDrapeMagnitude; //globalSedimentPass.talusAngle = parentGenome.terrainGlobalSedimentPasses[i].talusAngle; //globalSedimentPass.uniformSedimentHeight = parentGenome.terrainGlobalSedimentPasses[i].uniformSedimentHeight; MutateFloatBasic(ref globalSedimentPass.maxAltitudeSedimentDrape, 0f, 1f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.sedimentDrapeMagnitude, 0f, 1f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.talusAngle, 0f, 1f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.uniformSedimentHeight, 0f, 5f, mutationRate, mutationDriftAmount); // MUTATION: // SEDIMENT HEIGHT NOISE: MutateIntBasic(ref globalSedimentPass.numNoiseOctavesHeight, 1, 8, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.heightFlowAmount, -1f, 1f, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref globalSedimentPass.heightSampleData.amplitude, maxAmpToFreqRatio, minAmplitude, maxAmplitude, mutationRate, mutationDriftAmount); MutateFrequency(ref globalSedimentPass.heightSampleData.frequency, minFrequency, maxFrequency, mutationRate, mutationDriftAmount); MutateVector3Basic(ref globalSedimentPass.heightSampleData.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref globalSedimentPass.heightSampleData.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.heightSampleData.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); // LEVELS!!! MutateFloatBasic(ref globalSedimentPass.heightLevelsAdjust.x, 0f, globalSedimentPass.heightLevelsAdjust.y, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.heightLevelsAdjust.y, globalSedimentPass.heightLevelsAdjust.x, 1f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.heightLevelsAdjust.z, 0f, globalSedimentPass.heightLevelsAdjust.w, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.heightLevelsAdjust.w, globalSedimentPass.heightLevelsAdjust.z, 1f, mutationRate, mutationDriftAmount); // MASK1 !!!!! MutateIntBasic(ref globalSedimentPass.numNoiseOctavesHeight, 1, 8, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.mask1FlowAmount, -1f, 1f, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref globalSedimentPass.mask1SampleData.amplitude, maxAmpToFreqRatio, 0f, 5f, mutationRate, mutationDriftAmount); MutateFrequency(ref globalSedimentPass.mask1SampleData.frequency, minFrequency, maxFrequency, mutationRate, mutationDriftAmount); MutateVector3Basic(ref globalSedimentPass.mask1SampleData.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref globalSedimentPass.mask1SampleData.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.mask1SampleData.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); // LEVELS!!! MutateFloatBasic(ref globalSedimentPass.mask1LevelsAdjust.x, 0f, globalSedimentPass.mask1LevelsAdjust.y, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.mask1LevelsAdjust.y, globalSedimentPass.mask1LevelsAdjust.x, 1f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.mask1LevelsAdjust.z, 0f, globalSedimentPass.mask1LevelsAdjust.w, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.mask1LevelsAdjust.w, globalSedimentPass.mask1LevelsAdjust.z, 1f, mutationRate, mutationDriftAmount); // MASK2 !!!!! MutateIntBasic(ref globalSedimentPass.numNoiseOctavesHeight, 1, 8, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.mask2FlowAmount, -1f, 1f, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref globalSedimentPass.mask2SampleData.amplitude, maxAmpToFreqRatio, 0f, 5f, mutationRate, mutationDriftAmount); MutateFrequency(ref globalSedimentPass.mask2SampleData.frequency, minFrequency, maxFrequency, mutationRate, mutationDriftAmount); MutateVector3Basic(ref globalSedimentPass.mask2SampleData.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref globalSedimentPass.mask2SampleData.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.mask2SampleData.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); // LEVELS!!! MutateFloatBasic(ref globalSedimentPass.mask2LevelsAdjust.x, 0f, globalSedimentPass.mask2LevelsAdjust.y, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.mask2LevelsAdjust.y, globalSedimentPass.mask2LevelsAdjust.x, 1f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.mask2LevelsAdjust.z, 0f, globalSedimentPass.mask2LevelsAdjust.w, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.mask2LevelsAdjust.w, globalSedimentPass.mask2LevelsAdjust.z, 1f, mutationRate, mutationDriftAmount); // FLOW !!!!! MutateIntBasic(ref globalSedimentPass.numNoiseOctavesHeight, 1, 8, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref globalSedimentPass.flowSampleData.amplitude, maxAmpToFreqRatio, -1f, 1f, mutationRate, mutationDriftAmount); MutateFrequency(ref globalSedimentPass.flowSampleData.frequency, minFrequency, maxFrequency, mutationRate, mutationDriftAmount); MutateVector3Basic(ref globalSedimentPass.flowSampleData.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref globalSedimentPass.flowSampleData.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSedimentPass.flowSampleData.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); newGenome.terrainGlobalSedimentPasses.Add(globalSedimentPass); } } #endregion // SNOW!!! &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& #region SNOW // GLOBAL SNOW PASSES: if (parentGenome.terrainGlobalSnowPasses != null) { newGenome.terrainGlobalSnowPasses = new List <GlobalSnowPass>(); for (int i = 0; i < parentGenome.terrainGlobalSnowPasses.Count; i++) { float maxAmplitude = baseMaxAmplitude / Mathf.Pow(2, i); float minAmplitude = baseMinAmplitude / Mathf.Pow(2, i); float maxFrequency = baseMaxFrequency * Mathf.Pow(2, i); float minFrequency = baseMinFrequency * Mathf.Pow(2, i); float maxAmpToFreqRatio = 10f; // Start with copy of Parent: GlobalSnowPass globalSnowPass = new GlobalSnowPass(); globalSnowPass = parentGenome.terrainGlobalSnowPasses[i]; // MAKE SURE THIS IS VALUE-TYPED !!!!!! //globalSnowPass.snowLineStart = parentGenome.terrainGlobalSnowPasses[i].snowLineStart; //globalSnowPass.snowLineEnd = parentGenome.terrainGlobalSnowPasses[i].snowLineEnd; //globalSnowPass.snowAmount = parentGenome.terrainGlobalSnowPasses[i].snowAmount; //globalSnowPass.snowDirection = parentGenome.terrainGlobalSnowPasses[i].snowDirection; MutateFloatBasic(ref globalSnowPass.snowLineStart, 0f, globalSnowPass.snowLineEnd, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.snowLineEnd, globalSnowPass.snowLineStart, 1f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.snowAmount, 0f, 4f, mutationRate, mutationDriftAmount); float mutationCheck = UnityEngine.Random.Range(0f, 1f); if (mutationCheck < mutationRate) { Vector2 newSnowDirection = new Vector2(UnityEngine.Random.Range(-1f, 1f), UnityEngine.Random.Range(-1f, 1f)).normalized; globalSnowPass.snowDirection = Vector2.Lerp(globalSnowPass.snowDirection, newSnowDirection, mutationDriftAmount).normalized; } // MUTATION: // Height NOISE: MutateIntBasic(ref globalSnowPass.numNoiseOctavesHeight, 1, 8, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.heightFlowAmount, -1f, 1f, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref globalSnowPass.heightSampleData.amplitude, maxAmpToFreqRatio, minAmplitude, maxAmplitude, mutationRate, mutationDriftAmount); MutateFrequency(ref globalSnowPass.heightSampleData.frequency, minFrequency, maxFrequency, mutationRate, mutationDriftAmount); MutateVector3Basic(ref globalSnowPass.heightSampleData.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref globalSnowPass.heightSampleData.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.heightSampleData.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); // LEVELS!!! MutateFloatBasic(ref globalSnowPass.heightLevelsAdjust.x, 0f, globalSnowPass.heightLevelsAdjust.y, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.heightLevelsAdjust.y, globalSnowPass.heightLevelsAdjust.x, 1f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.heightLevelsAdjust.z, 0f, globalSnowPass.heightLevelsAdjust.w, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.heightLevelsAdjust.w, globalSnowPass.heightLevelsAdjust.z, 1f, mutationRate, mutationDriftAmount); // MASK1 !!!!! MutateIntBasic(ref globalSnowPass.numNoiseOctavesHeight, 1, 8, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.mask1FlowAmount, -1f, 1f, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref globalSnowPass.mask1SampleData.amplitude, maxAmpToFreqRatio, 0f, 5f, mutationRate, mutationDriftAmount); MutateFrequency(ref globalSnowPass.mask1SampleData.frequency, minFrequency, maxFrequency, mutationRate, mutationDriftAmount); MutateVector3Basic(ref globalSnowPass.mask1SampleData.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref globalSnowPass.mask1SampleData.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.mask1SampleData.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); // LEVELS!!! MutateFloatBasic(ref globalSnowPass.mask1LevelsAdjust.x, 0f, globalSnowPass.mask1LevelsAdjust.y, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.mask1LevelsAdjust.y, globalSnowPass.mask1LevelsAdjust.x, 1f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.mask1LevelsAdjust.z, 0f, globalSnowPass.mask1LevelsAdjust.w, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.mask1LevelsAdjust.w, globalSnowPass.mask1LevelsAdjust.z, 1f, mutationRate, mutationDriftAmount); // MASK2 !!!!! MutateIntBasic(ref globalSnowPass.numNoiseOctavesHeight, 1, 8, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.mask2FlowAmount, -1f, 1f, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref globalSnowPass.mask2SampleData.amplitude, maxAmpToFreqRatio, 0f, 5f, mutationRate, mutationDriftAmount); MutateFrequency(ref globalSnowPass.mask2SampleData.frequency, minFrequency, maxFrequency, mutationRate, mutationDriftAmount); MutateVector3Basic(ref globalSnowPass.mask2SampleData.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref globalSnowPass.mask2SampleData.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.mask2SampleData.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); // LEVELS!!! MutateFloatBasic(ref globalSnowPass.mask2LevelsAdjust.x, 0f, globalSnowPass.mask2LevelsAdjust.y, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.mask2LevelsAdjust.y, globalSnowPass.mask2LevelsAdjust.x, 1f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.mask2LevelsAdjust.z, 0f, globalSnowPass.mask2LevelsAdjust.w, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.mask2LevelsAdjust.w, globalSnowPass.mask2LevelsAdjust.z, 1f, mutationRate, mutationDriftAmount); // FLOW !!!!! MutateIntBasic(ref globalSnowPass.numNoiseOctavesHeight, 1, 8, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref globalSnowPass.flowSampleData.amplitude, maxAmpToFreqRatio, -1f, 1f, mutationRate, mutationDriftAmount); MutateFrequency(ref globalSnowPass.flowSampleData.frequency, minFrequency, maxFrequency, mutationRate, mutationDriftAmount); MutateVector3Basic(ref globalSnowPass.flowSampleData.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref globalSnowPass.flowSampleData.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref globalSnowPass.flowSampleData.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); newGenome.terrainGlobalSnowPasses.Add(globalSnowPass); //Debug.Log("inside loop: " + newGenome.terrainGlobalSedimentPasses[0].numNoiseOctavesHeight.ToString()); } //Debug.Log(newGenome.terrainGlobalSedimentPasses[0].numNoiseOctavesHeight.ToString()); } #endregion // HEIGHT STAMPS (HILLS): if (parentGenome.heightStampHills != null) { newGenome.heightStampHills = new List <HeightStampData>(); for (int i = 0; i < parentGenome.heightStampHills.Count; i++) { float maxAmplitude = baseMaxAmplitude / Mathf.Pow(2, i); float minAmplitude = baseMinAmplitude / Mathf.Pow(2, i); float maxFrequency = baseMaxFrequency * Mathf.Pow(2, i); float minFrequency = baseMinFrequency * Mathf.Pow(2, i); float maxAmpToFreqRatio = 10f; HeightStampData data = new HeightStampData(); data = parentGenome.heightStampHills[i]; MutateFloatBasic(ref data.radiusStartFade, 0f, data.radiusEndFade - epsilon, mutationRate, mutationDriftAmount); MutateFloatBasic(ref data.radiusEndFade, data.radiusStartFade + epsilon, 0.36f, mutationRate, mutationDriftAmount); MutateVector4Basic(ref data.stampPivot, -1f, 1f, mutationRate, mutationDriftAmount); data.heightOperation = 0; // Hills default to additive heights for now... MutateFloatBasic(ref data.maskNoiseFreq, 0.1f, 20f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref data.altitudeOffset, 0f, 20f, mutationRate, mutationDriftAmount); MutateIntBasic(ref data.numOctaves, 1, 8, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref data.amplitude, maxAmpToFreqRatio, minAmplitude, maxAmplitude, mutationRate, mutationDriftAmount); MutateFrequency(ref data.frequency, minFrequency, maxFrequency, mutationRate, mutationDriftAmount); MutateVector3Basic(ref data.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref data.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref data.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); newGenome.heightStampHills.Add(data); } } // HEIGHT STAMPS ( CRATERS!!! ): if (parentGenome.heightStampCraters != null) { newGenome.heightStampCraters = new List <HeightStampData>(); for (int i = 0; i < parentGenome.heightStampCraters.Count; i++) { float maxAmplitude = baseMaxAmplitude / Mathf.Pow(2, i); float minAmplitude = baseMinAmplitude / Mathf.Pow(2, i); float maxFrequency = baseMaxFrequency * Mathf.Pow(2, i); float minFrequency = baseMinFrequency * Mathf.Pow(2, i); float maxAmpToFreqRatio = 10f; HeightStampData data = new HeightStampData(); data = parentGenome.heightStampCraters[i]; MutateFloatBasic(ref data.radiusStartFade, 0f, data.radiusEndFade - epsilon, mutationRate, mutationDriftAmount); MutateFloatBasic(ref data.radiusEndFade, data.radiusStartFade + epsilon, 0.36f, mutationRate, mutationDriftAmount); MutateVector4Basic(ref data.stampPivot, -1f, 1f, mutationRate, mutationDriftAmount); data.heightOperation = 0; // Hills default to additive heights for now... MutateFloatBasic(ref data.maskNoiseFreq, 0.1f, 20f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref data.altitudeOffset, 0f, 20f, mutationRate, mutationDriftAmount); MutateIntBasic(ref data.numOctaves, 1, 8, mutationRate, mutationDriftAmount); // AmpFreqOff MutateAmplitude(ref data.amplitude, maxAmpToFreqRatio, minAmplitude, maxAmplitude, mutationRate, mutationDriftAmount); MutateFrequency(ref data.frequency, minFrequency, maxFrequency, mutationRate, mutationDriftAmount); MutateVector3Basic(ref data.offset, -1000f, 1000f, 1f, 0.25f, mutationRate, mutationDriftAmount); // Rotation & ridgeNoise MutateFloatBasic(ref data.rotation, -6.28f, 6.28f, mutationRate, mutationDriftAmount); MutateFloatBasic(ref data.ridgeNoise, 0f, 1f, mutationRate, mutationDriftAmount); newGenome.heightStampCraters.Add(data); } } // OLD OLD OLD OLD v v v // NEED TO COPY ALL ATTRIBUTES HERE unless I switch mutation process to go: full-copy, then re-traverse and mutate on a second sweep... newGenome.useAltitude = parentGenome.useAltitude; newGenome.numOctaves = parentGenome.numOctaves; newGenome.color = parentGenome.color; float rand = UnityEngine.Random.Range(0f, 1f); if (rand < mutationRate) { float r = UnityEngine.Random.Range(0.4f, 1f); newGenome.color = new Vector3(Mathf.Lerp(newGenome.color.x, r, mutationDriftAmount), Mathf.Lerp(newGenome.color.y, r, mutationDriftAmount), Mathf.Lerp(newGenome.color.z, r, mutationDriftAmount)); } // TERRAIN: newGenome.terrainWaves = new Vector3[newGenome.numOctaves]; if (parentGenome.useAltitude) { //Debug.Log("Mutate EnvTerrain Altitude "); for (int i = 0; i < newGenome.terrainWaves.Length; i++) { newGenome.terrainWaves[i] = new Vector3(parentGenome.terrainWaves[i].x, parentGenome.terrainWaves[i].y, parentGenome.terrainWaves[i].z); rand = UnityEngine.Random.Range(0f, 1f); if (rand < mutationRate) { float newFreq = UnityEngine.Random.Range(0.001f, 0.005f); newGenome.terrainWaves[i].x = Mathf.Lerp(newGenome.terrainWaves[i].x, newFreq, mutationDriftAmount); } rand = UnityEngine.Random.Range(0f, 1f); if (rand < mutationRate) { float newAmp = UnityEngine.Random.Range(0f, 1f); newGenome.terrainWaves[i].y = Mathf.Lerp(newGenome.terrainWaves[i].y, newAmp, mutationDriftAmount); //Debug.Log("Mutate EnvTerrain Altitude " + newGenome.terrainWaves[i].y.ToString()); } rand = UnityEngine.Random.Range(0f, 1f); if (rand < mutationRate) { float newOff = UnityEngine.Random.Range(-100f, 100f); newGenome.terrainWaves[i].z = Mathf.Lerp(newGenome.terrainWaves[i].z, newOff, mutationDriftAmount); } } } return(newGenome); }
public TerrainGenome(TerrainGenome templateGenome) { primaryHueRock = templateGenome.primaryHueRock; secondaryHueRock = templateGenome.secondaryHueRock; primaryHueSediment = templateGenome.primaryHueSediment; secondaryHueSediment = templateGenome.secondaryHueSediment; primaryHueSnow = templateGenome.primaryHueSnow; secondaryHueSnow = templateGenome.secondaryHueSnow; if (templateGenome.terrainGlobalRockPasses != null) { terrainGlobalRockPasses = new List <GlobalRockPass>(); for (int i = 0; i < templateGenome.terrainGlobalRockPasses.Count; i++) { GlobalRockPass globalRockPass = new GlobalRockPass(); globalRockPass = templateGenome.terrainGlobalRockPasses[i]; // MAKE SURE THIS IS VALUE-TYPED !!!!!! terrainGlobalRockPasses.Add(globalRockPass); } //Debug.Log(terrainGlobalRockPasses[0].heightLevelsAdjust.y.ToString()); } if (templateGenome.terrainGlobalSedimentPasses != null) { terrainGlobalSedimentPasses = new List <GlobalSedimentPass>(); for (int i = 0; i < templateGenome.terrainGlobalSedimentPasses.Count; i++) { GlobalSedimentPass globalSedimentPass = new GlobalSedimentPass(); globalSedimentPass = templateGenome.terrainGlobalSedimentPasses[i]; // MAKE SURE THIS IS VALUE-TYPED !!!!!! terrainGlobalSedimentPasses.Add(globalSedimentPass); } //Debug.Log(terrainGlobalRockPasses[0].heightLevelsAdjust.y.ToString()); } if (templateGenome.terrainGlobalSnowPasses != null) { terrainGlobalSnowPasses = new List <GlobalSnowPass>(); for (int i = 0; i < templateGenome.terrainGlobalSnowPasses.Count; i++) { GlobalSnowPass globalSnowPass = new GlobalSnowPass(); globalSnowPass = templateGenome.terrainGlobalSnowPasses[i]; // MAKE SURE THIS IS VALUE-TYPED !!!!!! terrainGlobalSnowPasses.Add(globalSnowPass); } } // Height Stamp Hills: if (templateGenome.heightStampHills != null) { heightStampHills = new List <HeightStampData>(); for (int i = 0; i < templateGenome.heightStampHills.Count; i++) { HeightStampData data = new HeightStampData(); data = templateGenome.heightStampHills[i]; heightStampHills.Add(data); } } // Height Stamp Craters: if (templateGenome.heightStampCraters != null) { heightStampCraters = new List <HeightStampData>(); for (int i = 0; i < templateGenome.heightStampCraters.Count; i++) { HeightStampData data = new HeightStampData(); data = templateGenome.heightStampCraters[i]; heightStampCraters.Add(data); } } // OLD::::: //altitude = templateGenome.altitude; useAltitude = templateGenome.useAltitude; numOctaves = templateGenome.numOctaves; color = new Vector3(templateGenome.color.x, templateGenome.color.y, templateGenome.color.z); terrainWaves = new Vector3[templateGenome.numOctaves]; if (useAltitude) { for (int i = 0; i < terrainWaves.Length; i++) { if (i < templateGenome.terrainWaves.Length) // when changing numOctaves, doesn't immediately change parentgenome terrainWaves array { terrainWaves[i] = new Vector3(templateGenome.terrainWaves[i].x, templateGenome.terrainWaves[i].y, templateGenome.terrainWaves[i].z); //Debug.Log("Copy Terrain Genome: " + terrainWaves[i].ToString()); } else { terrainWaves[i] = new Vector3(0.001f, 0f, 0f); // new entry } } } }