private void ParseScript() { ScriptParser scriptParser = new ScriptParser(); scriptParser.Parse("Weather/Rain.txt", true); for (int i = 0; i < scriptParser.GetKeysCount(); i++) { Key key = scriptParser.GetKey(i); if (key.GetName() == "Rain") { RainData rainData = new RainData(); rainData.m_RainDuration = key.GetVariable(0).FValue; rainData.m_RainInterval = key.GetVariable(1).FValue; this.m_RainData.Add(rainData); } else if (key.GetName() == "RainCollectorFillPerSecondRain") { this.m_RainCollectorFillPerSecondRain = key.GetVariable(0).FValue; } else if (key.GetName() == "RainCollectorFillPerSecondNoRain") { if (GreenHellGame.ROADSHOW_DEMO) { this.m_RainCollectorFillPerSecondNoRain = 10f; } else { this.m_RainCollectorFillPerSecondNoRain = key.GetVariable(0).FValue; } } } }
private static void Dispose(ref RainData data, ref RainRender rend) { Destroy(rend.shadowCamera); Destroy(rend.rainMaterial); Destroy(data.shaderData.shadowTexture); data.shaderData.instancingBuffer.Dispose(); data.shaderData.velocityBuffer.Dispose(); }
private static void Initialize(ref RainData data, ref RainRender rend, Camera cam, Transform box) { data.shaderData.shadowTexture = new RenderTexture(data.settingData.occlusionResolution, data.settingData.occlusionResolution, 16, RenderTextureFormat.RFloat, RenderTextureReadWrite.Linear); data.shaderData.shadowTexture.enableRandomWrite = true; data.shaderData.instancingBuffer = new ComputeBuffer(data.settingData.maxSize, RainPanel.SIZE); data.shaderData.position = box.position; data.shaderData.volume = box.localScale; data.shaderData.forward = box.forward; data.shaderData.up = box.up; data.shaderData.right = box.right; data.shaderData.velocityBuffer = new ComputeBuffer(data.settingData.maxSize, 4); rend.shadowCamera = cam; rend.rainMaterial = new Material(Shader.Find("Unlit/RainningProcedural")); cam.enabled = false; cam.orthographic = true; cam.aspect = data.shaderData.volume.x / data.shaderData.volume.z; cam.targetTexture = data.shaderData.shadowTexture; cam.transform.position = data.shaderData.position + data.shaderData.volume.y / 2 * box.transform.up; cam.transform.forward = -box.transform.up; cam.transform.right = box.transform.right; cam.transform.up = box.transform.forward; cam.farClipPlane = data.shaderData.volume.y; cam.nearClipPlane = 0; cam.SetReplacementShader(Shader.Find("Hidden/OrthographiceDepth"), ""); cam.orthographicSize = data.shaderData.volume.z / 2; cam.renderingPath = RenderingPath.Forward; cam.clearFlags = CameraClearFlags.Color; cam.backgroundColor = Color.white; cam.useOcclusionCulling = false; cam.allowHDR = true; cam.allowMSAA = false; RainPanel[] panels = new RainPanel[data.settingData.maxSize]; for (int i = 0; i < panels.Length; ++i) { panels[i].binormal = Vector3.right; panels[i].normal = Vector3.forward; Vector3 min = data.shaderData.position - data.shaderData.volume * 0.5f; Vector3 max = data.shaderData.position + data.shaderData.volume * 0.5f; panels[i].position = new Vector3(Random.Range(min.x, max.x), Random.Range(min.y, max.y), Random.Range(min.z, max.z)); } data.shaderData.instancingBuffer.SetData(panels); float[] fallDownSpeeds = new float[data.settingData.maxSize]; for (int i = 0; i < fallDownSpeeds.Length; ++i) { fallDownSpeeds[i] = Random.Range(data.settingData.fallDownVeolocity.x, data.settingData.fallDownVeolocity.y); } data.shaderData.velocityBuffer.SetData(fallDownSpeeds); }
public void DrawMonth(int year) { AtomData.Clear(); SoilData.Clear(); SoilData.Add(new PieModel { title = "", value = 0 }); RainData.Clear(); PmData.Clear(); var data = Db.Table <DataModel>().ToList().Where(p => p.Time.Year == year); for (int i = 1; i <= 12; i++) { var temp = data.Where(p => p.Time.Month == i); if (temp.Count() > 0) { AtomData.Add(new GraphModel { Line = temp.Max(p => p.Temp), Line2 = temp.Average(p => p.Temp), Line3 = temp.Min(p => p.Temp) }); } } var count = data.Count(); var soil = (double)data.Count(p => p.Soil == 0) / count; var rain = (double)data.Count(p => p.Rain == 0) / count; var pm = (double)data.Count(p => p.Pm25 == 0) / count; SoilData.Add(new PieModel { title = "干燥", value = soil }); SoilData.Add(new PieModel { title = "湿润", value = 1 - soil }); RainData.Add(new PieModel { title = "有雨", value = 1 - rain }); RainData.Add(new PieModel { title = "无雨", value = rain }); PmData.Add(new PieModel { title = "超标", value = 1 - pm }); PmData.Add(new PieModel { title = "良好", value = pm }); }
public void DrawHour(int year, int month, int day) { SoilData.Clear(); RainData.Clear(); PmData.Clear(); AtomData.Clear(); SoilData.Add(new PieModel { title = "", value = 0 }); var list = Db.Table <DataModel>().ToList(); var data = list.Where(p => p.Time.Year == year && p.Time.Month == month && p.Time.Day == day); for (int i = 0; i < 24; i++) { var temp = data.First(p => p.Time.Hour == i); AtomData.Add(new GraphModel { Line = temp.Temp }); } var count = data.Count(); var soil = (double)data.Count(p => p.Soil == 0) / count; var rain = (double)data.Count(p => p.Rain == 0) / count; var pm = (double)data.Count(p => p.Pm25 == 0) / count; SoilData.Add(new PieModel { title = "干燥", value = soil }); SoilData.Add(new PieModel { title = "湿润", value = 1 - soil }); RainData.Add(new PieModel { title = "有雨", value = 1 - rain }); RainData.Add(new PieModel { title = "无雨", value = rain }); PmData.Add(new PieModel { title = "超标", value = 1 - pm }); PmData.Add(new PieModel { title = "良好", value = pm }); }
private static void SetShaderBuffer(ref RainData data, ref RainRender rend, CommandBuffer buffer) { ComputeShader sd = data.settingData.randomDrawShader; buffer.SetGlobalVector(ShaderIDs._CameraState, new Vector4(-data.shaderData.up.x, -data.shaderData.up.y, -data.shaderData.up.z, rend.shadowCamera.farClipPlane)); sd.SetVector(ShaderIDs._CameraState, new Vector4(-data.shaderData.up.x, -data.shaderData.up.y, -data.shaderData.up.z, rend.shadowCamera.farClipPlane)); buffer.SetGlobalVector(ShaderIDs._CameraPos, rend.shadowCamera.transform.position); buffer.SetGlobalBuffer(ShaderIDs.instancingBuffer, data.shaderData.instancingBuffer); buffer.SetGlobalTexture(ShaderIDs._EnvReflect, data.settingData.reflectionMap); sd.SetVector(ShaderIDs._CameraPos, rend.shadowCamera.transform.position); sd.SetBuffer(0, ShaderIDs.instancingBuffer, data.shaderData.instancingBuffer); directions[0] = data.shaderData.right; directions[1] = data.shaderData.forward; directions[2] = data.shaderData.volume; sd.SetVectorArray(ShaderIDs._Direction, directions); sd.SetFloat(ShaderIDs._RandomNumber, Random.Range(0f, 10f)); sd.SetVector(ShaderIDs._ShadowTextureResolution, new Vector2(data.shaderData.shadowTexture.width, data.shaderData.shadowTexture.height)); sd.SetTexture(0, ShaderIDs._ShadowTexture, data.shaderData.shadowTexture); sd.SetMatrix(ShaderIDs._WorldToShadowMatrix, GL.GetGPUProjectionMatrix(rend.shadowCamera.projectionMatrix, false) * rend.shadowCamera.worldToCameraMatrix); sd.SetFloat(ShaderIDs._FallDownSpeed, Time.deltaTime); sd.SetBuffer(0, ShaderIDs.velocityBuffer, data.shaderData.velocityBuffer); sd.SetVector(ShaderIDs._LookPos, Camera.current.transform.position); sd.SetVector(ShaderIDs._FallDownRange, data.settingData.fallDownVeolocity); }
private static void Draw(ref RainData data, ref RainRender rend, CommandBuffer buffer) { buffer.DrawProcedural(Matrix4x4.identity, rend.rainMaterial, 0, MeshTopology.Quads, 4, data.shaderData.instancingBuffer.count); }
private static void Dispatch(ref RainData data) { ComputeShaderUtility.Dispatch(data.settingData.randomDrawShader, 0, data.shaderData.instancingBuffer.count, THREADGROUPCOUNT); }