Ejemplo n.º 1
0
        public override void fromMessage(KPMessage msg)
        {
            Utils.assert(msg.Length >= 4 * 2);
            clearData();

            MyBinStream stream = new MyBinStream(msg.Data);

            m_id     = stream.readUInt();
            m_type   = stream.readUInt();
            m_source = stream.readString();
            stream.close();
        }
Ejemplo n.º 2
0
        public void fromStream(MyBinStream stream)
        {
            m_id   = stream.readUInt();
            m_vsId = stream.readUInt();
            m_fsId = stream.readUInt();

            //
            m_attributesCount = stream.readInt();
            for (int i = 0; i < m_attributesCount; i++)
            {
                Var var = m_attributes[i];

                var.Location = stream.readInt();
                var.Size     = stream.readInt();
                var.Type     = stream.readUInt();

                int strLen = stream.readInt();
                var.Name = stream.readString(strLen);
            }

            //
            m_uniformsCount = stream.readInt();

            for (int i = 0; i < m_uniformsCount; i++)
            {
                Var var = m_uniforms[i];

                var.Location = stream.readInt();
                var.Size     = stream.readInt();
                var.Type     = stream.readUInt();

                int strLen = stream.readInt();
                var.Name = stream.readString(strLen);

                int    dataLen = stream.readInt();
                string res     = "";

                if (dataLen > 0)
                {
                    switch (var.Type)
                    {
                        #region FLOAT
                    case gl.GL_FLOAT:
                    {
                        Utils.assert(dataLen % 4 == 0);
                        int count = dataLen / 4;
                        for (int j = 0; j < count; j++)
                        {
                            res += stream.readFloat();
                            if (j < count - 1)
                            {
                                res += ", ";
                            }
                        }
                        break;
                    }

                    case gl.GL_FLOAT_VEC2:
                    {
                        Utils.assert(dataLen % 8 == 0);
                        int count = dataLen / 8;
                        for (int j = 0; j < count; j++)
                        {
                            res += string.Format("({0}, {1})", stream.readFloat(), stream.readFloat());
                            if (j < count - 1)
                            {
                                res += ", ";
                            }
                        }
                        break;
                    }

                    case gl.GL_FLOAT_VEC3:
                    {
                        Utils.assert(dataLen % 12 == 0);
                        int count = dataLen / 12;
                        for (int j = 0; j < count; j++)
                        {
                            res += string.Format("({0}, {1}, {2})", stream.readFloat(), stream.readFloat(), stream.readFloat());
                            if (j < count - 1)
                            {
                                res += ", ";
                            }
                        }
                        break;
                    }

                    case gl.GL_FLOAT_VEC4:
                    {
                        Utils.assert(dataLen % 16 == 0);
                        int count = dataLen / 16;
                        for (int j = 0; j < count; j++)
                        {
                            res += string.Format("({0}, {1}, {2}, {3})", stream.readFloat(), stream.readFloat(), stream.readFloat(), stream.readFloat());
                            if (j < count - 1)
                            {
                                res += ", ";
                            }
                        }
                        break;
                    }
                        #endregion

                        #region INT, BOOL, SAMPLER
                    case gl.GL_INT:
                    case gl.GL_SAMPLER_2D:
                    case gl.GL_SAMPLER_3D:
                    case gl.GL_SAMPLER_CUBE:
                    case gl.GL_BOOL:
                    {
                        Utils.assert(dataLen % 4 == 0);
                        int count = dataLen / 4;
                        for (int j = 0; j < count; j++)
                        {
                            res += stream.readInt();
                            if (j < count - 1)
                            {
                                res += ", ";
                            }
                        }
                        break;
                    }

                    case gl.GL_INT_VEC2:
                    case gl.GL_BOOL_VEC2:
                    {
                        Utils.assert(dataLen % 8 == 0);
                        int count = dataLen / 8;
                        for (int j = 0; j < count; j++)
                        {
                            res += string.Format("({0}, {1})", stream.readInt(), stream.readInt());
                            if (j < count - 1)
                            {
                                res += ", ";
                            }
                        }
                        break;
                    }

                    case gl.GL_INT_VEC3:
                    case gl.GL_BOOL_VEC3:
                    {
                        Utils.assert(dataLen % 12 == 0);
                        int count = dataLen / 12;
                        for (int j = 0; j < count; j++)
                        {
                            res += string.Format("({0}, {1}, {2})", stream.readInt(), stream.readInt(), stream.readInt());
                            if (j < count - 1)
                            {
                                res += ", ";
                            }
                        }
                        break;
                    }

                    case gl.GL_INT_VEC4:
                    case gl.GL_BOOL_VEC4:
                    {
                        Utils.assert(dataLen % 16 == 0);
                        int count = dataLen / 16;
                        for (int j = 0; j < count; j++)
                        {
                            res += string.Format("({0}, {1}, {2}, {3})", stream.readInt(), stream.readInt(), stream.readInt(), stream.readInt());
                            if (j < count - 1)
                            {
                                res += ", ";
                            }
                        }
                        break;
                    }
                        #endregion

                        #region MATRIX
                    case gl.GL_FLOAT_MAT2:
                    case gl.GL_FLOAT_MAT3:
                    case gl.GL_FLOAT_MAT4:
                    {
                        int size  = (var.Type == gl.GL_FLOAT_MAT2) ? 2 : (var.Type == gl.GL_FLOAT_MAT3 ? 3 : 4);
                        int bytes = size * size * 4;
                        Utils.assert(dataLen % bytes == 0);
                        int count = dataLen / bytes;
                        res = Utils.makeMatrixString(stream, count, size);
                        break;
                    }
                        #endregion

                    default:
                    {
                        Utils.assert(false);
                        break;
                    }
                    }                     // switch (var.Type)
                }

                var.Value = res;
            }
        }