private void ApplySlippage() { for (int i = 0; i < TERRAIN_LAYERS; i++) { if (m_talusAngle[i] < 90.0f) { float talusAngle = (Mathf.PI * m_talusAngle[i]) / 180.0f; float maxHeightDif = Mathf.Tan(talusAngle) * CELL_LENGTH; m_slippageHeightMat.SetFloat("_TexSize", (float)TEX_SIZE); m_slippageHeightMat.SetFloat("_Layers", (float)(i + 1)); m_slippageHeightMat.SetFloat("_MaxHeightDif", maxHeightDif); m_slippageHeightMat.SetTexture("_TerrainField", m_terrainField[READ]); Graphics.Blit(null, m_slippageHeight, m_slippageHeightMat); m_slippageOutflowMat.SetFloat("_TexSize", (float)TEX_SIZE); m_slippageOutflowMat.SetFloat("_Layers", (float)(i + 1)); m_slippageOutflowMat.SetFloat("T", TIME_STEP); m_slippageOutflowMat.SetTexture("_MaxSlippageHeights", m_slippageHeight); m_slippageOutflowMat.SetTexture("_TerrainField", m_terrainField[READ]); Graphics.Blit(null, m_slippageOutflow, m_slippageOutflowMat); m_slippageUpdateMat.SetFloat("T", TIME_STEP); m_slippageUpdateMat.SetFloat("_TexSize", (float)TEX_SIZE); m_slippageUpdateMat.SetFloat("_Layers", (float)(i + 1)); m_slippageUpdateMat.SetTexture("_SlippageOutflow", m_slippageOutflow); Graphics.Blit(m_terrainField[READ], m_terrainField[WRITE], m_slippageUpdateMat); RTUtility.Swap(m_terrainField); } } }
private void ErosionAndDeposition() { m_tiltAngleMat.SetFloat("_TexSize", (float)TEX_SIZE); m_tiltAngleMat.SetFloat("_Layers", TERRAIN_LAYERS); m_tiltAngleMat.SetTexture("_TerrainField", m_terrainField[READ]); Graphics.Blit(null, m_tiltAngle, m_tiltAngleMat); m_erosionAndDepositionMat.SetTexture("_TerrainField", m_terrainField[READ]); m_erosionAndDepositionMat.SetTexture("_SedimentField", m_sedimentField[READ]); m_erosionAndDepositionMat.SetTexture("_VelocityField", m_waterVelocity[READ]); m_erosionAndDepositionMat.SetTexture("_TiltAngle", m_tiltAngle); m_erosionAndDepositionMat.SetFloat("_MinTiltAngle", m_minTiltAngle); m_erosionAndDepositionMat.SetFloat("_SedimentCapacity", m_sedimentCapacity); m_erosionAndDepositionMat.SetVector("_DissolvingConstant", m_dissolvingConstant); m_erosionAndDepositionMat.SetFloat("_DepositionConstant", m_depositionConstant); m_erosionAndDepositionMat.SetFloat("_Layers", (float)TERRAIN_LAYERS); RenderTexture[] terrainAndSediment = new RenderTexture[2] { m_terrainField[WRITE], m_sedimentField[WRITE] }; RTUtility.MultiTargetBlit(terrainAndSediment, m_erosionAndDepositionMat); RTUtility.Swap(m_terrainField); RTUtility.Swap(m_sedimentField); }
private void ApplyFreeSlip(RenderTexture[] field) { float u = 1.0f / (float)TEX_SIZE; Vector2 offset; Graphics.Blit(field[READ], field[WRITE]); offset = new Vector2(u, 0.0f); m_applyFreeSlipMat.SetVector("_Offset", offset); RTUtility.Blit(field[READ], field[WRITE], m_applyFreeSlipMat, m_rectLeft, 0, false); offset = new Vector2(0.0f, u); m_applyFreeSlipMat.SetVector("_Offset", offset); RTUtility.Blit(field[READ], field[WRITE], m_applyFreeSlipMat, m_rectBottom, 0, false); offset = new Vector2(-u, 0.0f); m_applyFreeSlipMat.SetVector("_Offset", offset); RTUtility.Blit(field[READ], field[WRITE], m_applyFreeSlipMat, m_rectRight, 0, false); offset = new Vector2(0.0f, -u); m_applyFreeSlipMat.SetVector("_Offset", offset); RTUtility.Blit(field[READ], field[WRITE], m_applyFreeSlipMat, m_rectTop, 0, false); RTUtility.Swap(field); }
private void DisintegrateAndDeposit() { m_disintegrateAndDepositMat.SetFloat("_Layers", (float)TERRAIN_LAYERS); m_disintegrateAndDepositMat.SetTexture("_TerrainField", m_terrainField[READ]); m_disintegrateAndDepositMat.SetTexture("_WaterField", m_waterField[READ]); m_disintegrateAndDepositMat.SetTexture("_RegolithField", m_regolithField[READ]); m_disintegrateAndDepositMat.SetFloat("_MaxRegolith", m_maxRegolith); RenderTexture[] terrainAndRegolith = new RenderTexture[2] { m_terrainField[WRITE], m_regolithField[WRITE] }; RTUtility.MultiTargetBlit(terrainAndRegolith, m_disintegrateAndDepositMat); RTUtility.Swap(m_terrainField); RTUtility.Swap(m_regolithField); }
private void AdvectSediment() { m_advectSedimentMat.SetFloat("_TexSize", (float)TEX_SIZE); m_advectSedimentMat.SetFloat("T", TIME_STEP); m_advectSedimentMat.SetFloat("_VelocityFactor", 1.0f); m_advectSedimentMat.SetTexture("_VelocityField", m_waterVelocity[READ]); Graphics.Blit(m_sedimentField[READ], m_advectSediment[0], m_advectSedimentMat); m_advectSedimentMat.SetFloat("_VelocityFactor", -1.0f); Graphics.Blit(m_advectSediment[0], m_advectSediment[1], m_advectSedimentMat); m_processMacCormackMat.SetFloat("_TexSize", (float)TEX_SIZE); m_processMacCormackMat.SetFloat("T", TIME_STEP); m_processMacCormackMat.SetTexture("_VelocityField", m_waterVelocity[READ]); m_processMacCormackMat.SetTexture("_InterField1", m_advectSediment[0]); m_processMacCormackMat.SetTexture("_InterField2", m_advectSediment[1]); Graphics.Blit(m_sedimentField[READ], m_sedimentField[WRITE], m_processMacCormackMat); RTUtility.Swap(m_sedimentField); }
private void WaterInput() { if (Input.GetKey(KeyCode.DownArrow)) { m_waterInputPoint.y -= m_waterInputSpeed * Time.deltaTime; } if (Input.GetKey(KeyCode.UpArrow)) { m_waterInputPoint.y += m_waterInputSpeed * Time.deltaTime; } if (Input.GetKey(KeyCode.LeftArrow)) { m_waterInputPoint.x -= m_waterInputSpeed * Time.deltaTime; } if (Input.GetKey(KeyCode.RightArrow)) { m_waterInputPoint.x += m_waterInputSpeed * Time.deltaTime; } if (m_waterInputAmount > 0.0f) { m_waterInputMat.SetVector("_Point", m_waterInputPoint); m_waterInputMat.SetFloat("_Radius", m_waterInputRadius); m_waterInputMat.SetFloat("_Amount", m_waterInputAmount); Graphics.Blit(m_waterField[READ], m_waterField[WRITE], m_waterInputMat); RTUtility.Swap(m_waterField); } if (m_evaporationConstant > 0.0f) { m_evaprationMat.SetFloat("_EvaporationConstant", m_evaporationConstant); Graphics.Blit(m_waterField[READ], m_waterField[WRITE], m_evaprationMat); RTUtility.Swap(m_waterField); } }
private void WaterVelocity() { m_waterVelocityMat.SetFloat("_TexSize", (float)TEX_SIZE); m_waterVelocityMat.SetFloat("L", CELL_LENGTH); m_waterVelocityMat.SetTexture("_WaterField", m_waterField[READ]); m_waterVelocityMat.SetTexture("_WaterFieldOld", m_waterField[WRITE]); m_waterVelocityMat.SetTexture("_OutFlowField", m_waterOutFlow[READ]); Graphics.Blit(null, m_waterVelocity[READ], m_waterVelocityMat); const float viscosity = 10.5f; const int iterations = 2; m_diffuseVelocityMat.SetFloat("_TexSize", (float)TEX_SIZE); m_diffuseVelocityMat.SetFloat("_Alpha", CELL_AREA / (viscosity * TIME_STEP)); for (int i = 0; i < iterations; i++) { Graphics.Blit(m_waterVelocity[READ], m_waterVelocity[WRITE], m_diffuseVelocityMat); RTUtility.Swap(m_waterVelocity); } }
private void OutFlow(RenderTexture[] field, RenderTexture[] outFlow, float damping) { m_outFlowMat.SetFloat("_TexSize", (float)TEX_SIZE); m_outFlowMat.SetFloat("T", TIME_STEP); m_outFlowMat.SetFloat("L", PIPE_LENGTH); m_outFlowMat.SetFloat("A", CELL_AREA); m_outFlowMat.SetFloat("G", GRAVITY); m_outFlowMat.SetFloat("_Layers", TERRAIN_LAYERS); m_outFlowMat.SetFloat("_Damping", 1.0f - damping); m_outFlowMat.SetTexture("_TerrainField", m_terrainField[READ]); m_outFlowMat.SetTexture("_Field", field[READ]); Graphics.Blit(outFlow[READ], outFlow[WRITE], m_outFlowMat); RTUtility.Swap(outFlow); m_fieldUpdateMat.SetFloat("_TexSize", (float)TEX_SIZE); m_fieldUpdateMat.SetFloat("T", TIME_STEP); m_fieldUpdateMat.SetFloat("L", PIPE_LENGTH); m_fieldUpdateMat.SetTexture("_OutFlowField", outFlow[READ]); Graphics.Blit(field[READ], field[WRITE], m_fieldUpdateMat); RTUtility.Swap(field); }
private void InitMaps() { RTUtility.ClearColor(m_terrainField); RTUtility.ClearColor(m_waterOutFlow); RTUtility.ClearColor(m_waterVelocity); RTUtility.ClearColor(m_advectSediment); RTUtility.ClearColor(m_waterField); RTUtility.ClearColor(m_sedimentField); RTUtility.ClearColor(m_regolithField); RTUtility.ClearColor(m_regolithOutFlow); RenderTexture[] noiseTex = new RenderTexture[2]; noiseTex[0] = new RenderTexture(TEX_SIZE, TEX_SIZE, 0, RenderTextureFormat.RFloat); noiseTex[0].wrapMode = TextureWrapMode.Clamp; noiseTex[0].filterMode = FilterMode.Bilinear; noiseTex[1] = new RenderTexture(TEX_SIZE, TEX_SIZE, 0, RenderTextureFormat.RFloat); noiseTex[1].wrapMode = TextureWrapMode.Clamp; noiseTex[1].filterMode = FilterMode.Bilinear; GPUPerlinNoise perlin = new GPUPerlinNoise(m_seed); perlin.LoadResourcesFor2DNoise(); m_noiseMat.SetTexture("_PermTable1D", perlin.PermutationTable1D); m_noiseMat.SetTexture("_Gradient2D", perlin.Gradient2D); for (int j = 0; j < TERRAIN_LAYERS; j++) { m_noiseMat.SetFloat("_Offset", m_offset[j]); float amp = 0.5f; float freq = m_frequency[j]; //Must clear noise from last pass RTUtility.ClearColor(noiseTex); //write noise into texture with the settings for this layer for (int i = 0; i < m_octaves[j]; i++) { m_noiseMat.SetFloat("_Frequency", freq); m_noiseMat.SetFloat("_Amp", amp); m_noiseMat.SetFloat("_Pass", (float)i); Graphics.Blit(noiseTex[READ], noiseTex[WRITE], m_noiseMat, (int)m_layerStyle[j]); RTUtility.Swap(noiseTex); freq *= m_lacunarity[j]; amp *= m_gain[j]; } float useAbs = 0.0f; if (m_finalNosieIsAbs[j]) { useAbs = 1.0f; } //Mask the layers that we dont want to write into Vector4 mask = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); mask[j] = 1.0f; m_initTerrainMat.SetFloat("_Amp", m_amp[j]); m_initTerrainMat.SetFloat("_UseAbs", useAbs); m_initTerrainMat.SetVector("_Mask", mask); m_initTerrainMat.SetTexture("_NoiseTex", noiseTex[READ]); m_initTerrainMat.SetFloat("_Height", TERRAIN_HEIGHT); //Apply the noise for this layer to the terrain field Graphics.Blit(m_terrainField[READ], m_terrainField[WRITE], m_initTerrainMat); RTUtility.Swap(m_terrainField); } //dont need this tex anymore noiseTex[0] = null; noiseTex[1] = null; }