Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
 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);
     }
 }
Ejemplo n.º 3
0
    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();
    }