private void LoadGroupTableGTFile(string sFileName) { m_pGroupTable = new CGroupTable(); byte[] data = File.ReadAllBytes(sFileName); m_pGroupTable.FillWithByte(sFileName, data); Debug.Log(m_pGroupTable.GetGroupTableDesc()); GroupTableTitle.text = "Group Table:\n" + sFileName; m_pCalcs[(int)m_eCalcType].SetGroupTable(m_pGroupTable); }
private void LoadGroupTableLua(string sFileName) { m_pGroupTable = CUtility.BuildGroupTable(sFileName); if (null != m_pGroupTable) { GroupTableTitle.text = "Group Table:\n" + sFileName; Debug.Log(m_pGroupTable.GetGroupTableDesc()); m_pCalcs[(int)m_eCalcType].SetGroupTable(m_pGroupTable); } }
public static CGroupTable BuildGroupTable(string sLuaFileName) { string sLuaCode = File.ReadAllText(sLuaFileName); LuaScriptMgr mgr = new LuaScriptMgr(); mgr.DoString(sLuaCode); LuaFunction func1 = mgr.GetLuaFunction("GetGroupElementNumber"); if (null == func1) { CManager.ShowMessage("GetGroupElementNumber function cannot been found."); mgr.Destroy(); return(null); } object[] r1 = func1.Call(); if (2 != r1.Length || !(r1[0] is double && r1[1] is double)) { string sRetInfo = r1.Length + " values:"; for (int i = 0; i < r1.Length; ++i) { sRetInfo += (null == r1[i] ? "null" : r1[i].GetType().Name) + ","; } CManager.ShowMessage("GetGroupElementNumber must return two integers, now return is " + sRetInfo); mgr.Destroy(); return(null); } int m = Mathf.RoundToInt((float)(double)r1[0]); int n = Mathf.RoundToInt((float)(double)r1[1]); Debug.Log(string.Format("table m:{0} and n:{1}", m, n)); if (m + n - 1 >= 4096) { CManager.ShowMessage(string.Format("mus thave m + n - 1 < 4096, but now m={0}, n={1}", m, n)); mgr.Destroy(); return(null); } LuaFunction func2 = mgr.GetLuaFunction("GetIGTableNumber"); if (null == func2) { CManager.ShowMessage("GetIGTableNumber function cannot been found."); mgr.Destroy(); return(null); } object[] r2 = func2.Call(); if (1 != r2.Length || !(r2[0] is double)) { string sRetInfo = r2.Length + " values:"; for (int i = 0; i < r2.Length; ++i) { sRetInfo += (null == r2[i] ? "null" : r2[i].GetType().Name) + ","; } CManager.ShowMessage("GetIGTableNumber must return one integer, now return is " + sRetInfo); mgr.Destroy(); return(null); } int ig = Mathf.RoundToInt((float)(double)r2[0]); CGroupTable gt = new CGroupTable { m_sFileName = "", m_eType = CGroupTable.GroupTableType.Lua, m_iM = (short)m, m_iN = (short)n, m_MI = new short[m + n - 1, m + n - 1], m_EI = new float[m], m_IG = new short[ig], }; //Fill MT LuaFunction func3 = mgr.GetLuaFunction("GetMTTable"); if (null == func3) { CManager.ShowMessage("GetMTTable function cannot been found."); mgr.Destroy(); return(null); } for (int i = 0; i < m + n - 1; ++i) { for (int j = 0; j < m + n - 1; ++j) { object[] r3 = func3.Call2(i + 1, j + 1); if (1 != r3.Length || !(r3[0] is double)) { string sRetInfo = r3.Length + " values:"; for (int k = 0; k < r3.Length; ++i) { sRetInfo += (null == r3[k] ? "null" : r3[k].GetType().Name) + ","; } CManager.ShowMessage("GetMTTable must return one integer, now return is " + sRetInfo); mgr.Destroy(); return(null); } gt.m_MI[i, j] = (short)(Mathf.RoundToInt((float)(double)r3[0]) - 1); } } //Fill EI LuaFunction func4 = mgr.GetLuaFunction("GetETTable"); if (null == func4) { CManager.ShowMessage("GetETTable function cannot been found."); mgr.Destroy(); return(null); } for (int i = 0; i < m; ++i) { object[] r4 = func4.Call(i + 1); if (1 != r4.Length || !(r4[0] is double)) { string sRetInfo = r4.Length + " values:"; for (int k = 0; k < r4.Length; ++i) { sRetInfo += (null == r4[k] ? "null" : r4[k].GetType().Name) + ","; } CManager.ShowMessage("GetETTable must return one float, now return is " + sRetInfo); mgr.Destroy(); return(null); } gt.m_EI[i] = (float)(double)r4[0]; } //Fill IG LuaFunction func5 = mgr.GetLuaFunction("GetIGTable"); if (null == func5) { CManager.ShowMessage("GetIGTable function cannot been found."); mgr.Destroy(); return(null); } for (int i = 0; i < ig; ++i) { object[] r5 = func5.Call(i + 1); if (1 != r5.Length || !(r5[0] is double)) { string sRetInfo = r5.Length + " values:"; for (int k = 0; k < r5.Length; ++i) { sRetInfo += (null == r5[k] ? "null" : r5[k].GetType().Name) + ","; } CManager.ShowMessage("GetIGTable must return one integer, now return is " + sRetInfo); mgr.Destroy(); return(null); } gt.m_IG[i] = (short)(Mathf.RoundToInt((float)(double)r5[0]) - 1); } mgr.Destroy(); return(gt); }
public void SetGroupTable(CGroupTable gt) { if (null == gt) { return; } m_sGroupName = gt.m_sFileName; m_pIntBuffer = new ComputeBuffer((gt.m_iM + gt.m_iN - 1) * (gt.m_iM + gt.m_iN - 1) + gt.m_IG.Length, 4); m_pFloatBuffer = new ComputeBuffer(gt.m_iM, 4); uint[] intData = new uint[(gt.m_iM + gt.m_iN - 1) * (gt.m_iM + gt.m_iN - 1) + gt.m_IG.Length]; for (int i = 0; i < gt.m_iM + gt.m_iN - 1; ++i) { for (int j = 0; j < gt.m_iM + gt.m_iN - 1; ++j) { intData[i * (gt.m_iM + gt.m_iN - 1) + j] = (uint)gt.m_MI[i, j]; } } for (int i = 0; i < gt.m_IG.Length; ++i) { intData[(gt.m_iM + gt.m_iN - 1) * (gt.m_iM + gt.m_iN - 1) + i] = (uint)gt.m_IG[i]; } m_pIntBuffer.SetData(intData); float[] floatData = new float[gt.m_iM]; for (int i = 0; i < gt.m_iM; ++i) { floatData[i] = gt.m_EI[i]; } m_pFloatBuffer.SetData(floatData); CmpShader.SetInt("iM", gt.m_iM); CmpShader.SetInt("iN", gt.m_iN); CmpShader.SetInt("iIG", gt.m_IG.Length); //Debug.Log(string.Format("im = {0}, in = {1}, ig = {2}", gt.m_iM, gt.m_iN, gt.m_IG.Length)); int[] iMTTextureSize = CUtility.GetUpperTwoExp(gt.m_iM + gt.m_iN - 1); int[] iEITextureSize = CUtility.GetUpperTwoExp(gt.m_iM); int[] iIGTextureSize = CUtility.GetUpperTwoExp(gt.m_IG.Length); m_pMT = new RenderTexture(iMTTextureSize[1], iMTTextureSize[1], 1, RenderTextureFormat.RInt); m_pMT.enableRandomWrite = true; m_pMT.Create(); m_pEI = new RenderTexture(iEITextureSize[1], 1, 1, RenderTextureFormat.RFloat); m_pEI.enableRandomWrite = true; m_pEI.Create(); m_pIG = new RenderTexture(iIGTextureSize[1], 1, 1, RenderTextureFormat.RInt); m_pIG.enableRandomWrite = true; m_pIG.Create(); CmpShader.SetTexture(m_iKernelSetGroupData, "MT", m_pMT); CmpShader.SetTexture(m_iKernelSetGroupData, "EI", m_pEI); CmpShader.SetTexture(m_iKernelSetGroupData, "IG", m_pIG); CmpShader.SetTexture(m_iKernelCalcUsing, "MT", m_pMT); CmpShader.SetTexture(m_iKernelCalcUsing, "EI", m_pEI); CmpShader.SetTexture(m_iKernelCalcUsing, "IG", m_pIG); CmpShader.SetTexture(m_iKernelEnergyUsing, "MT", m_pMT); CmpShader.SetTexture(m_iKernelEnergyUsing, "EI", m_pEI); CmpShader.SetBuffer(m_iKernelSetGroupData, "IntDataBuffer", m_pIntBuffer); CmpShader.SetBuffer(m_iKernelSetGroupData, "FloatDataBuffer", m_pFloatBuffer); CmpShader.Dispatch(m_iKernelSetGroupData, 4, 4, 1); CmpShader.Dispatch(m_iKernelGenerateConstants, 1, 1, 1); m_pIntBuffer.Release(); m_pIntBuffer = null; m_pFloatBuffer.Release(); m_pFloatBuffer = null; //Group table reset, need to reset configuration SetWhiteConfigure(); }