Exemplo n.º 1
0
        internal EffectConstantBuffer(string name, int size, EffectParameterDescription[] paramDescription)
            : base(size)
        {
            _device = GraphicManager.Device;

            Name = name;
            Size = size;
            _hashCode = GetHashCode(name, size, paramDescription);

            if (paramDescription != null)
            {
                Parameters = new Dictionary<string, EffectParameter>(paramDescription.Length);

                for (int i = 0; i < paramDescription.Length; i++)
                {
                    EffectParameter parameter = new EffectParameter(paramDescription[i], this);
                    Parameters.Add(parameter.Name, parameter);
                }
            }

            Clear();

            _nativeBuffer = Buffer.NewConstantBuffer(size);

            IsDirty = true;

        }
Exemplo n.º 2
0
 int GetHashCode(string name, int size, EffectParameterDescription[] paramDescription)
 {
     return 0;
 }
        EffectConstantBuffer CreateCBuffer(XmlNode node)
        {
            string name = node.Attributes["name"].Value;

            List<EffectParameterDescription> descriptions = new List<EffectParameterDescription>();

            int currentOffset = 0;

            foreach (XmlNode child in node)
            {
                EffectParameterDescription description = new EffectParameterDescription();
                int attributeSize;

                description.Name = child.Attributes["name"].Value;
                description.Offset = currentOffset;
                
                switch (child.Attributes["type"].Value.ToLower())
                {
                    case "matrix":
                        description.Class = ParamClass.MatrixRows;
                        description.Type = ParamType.Float;
                        description.RowCount = 4;
                        description.ColumnCount = 4;
                        description.ElementCount = 16;
                        description.ElementSize = Utilities.SizeOf<float>();
                        attributeSize = Utilities.SizeOf<Matrix>();
                        descriptions.Add(description);
                        break;
                    case "struct":
                        description.Class = ParamClass.Struct;
                        description.ElementCount = 1;
                        description.ElementSize = Convert.ToInt32(child.Attributes["size"].Value);
                        attributeSize = Convert.ToInt32(child.Attributes["size"].Value);;
                        descriptions.Add(description);
                        break;
                    case "vector3":
                        description.Class = ParamClass.Vector;
                        description.Type = ParamType.Float;
                        description.RowCount = 1;
                        description.ColumnCount = 3;
                        description.ElementCount = 3;
                        description.ElementSize = Utilities.SizeOf<float>();
                        attributeSize = Utilities.SizeOf<Vector3>();
                        descriptions.Add(description);
                        break;
                    case "vector4":
                        description.Class = ParamClass.Vector;
                        description.Type = ParamType.Float;
                        description.RowCount = 1;
                        description.ColumnCount = 4;
                        description.ElementCount = 4;
                        description.ElementSize = Utilities.SizeOf<float>();
                        attributeSize = Utilities.SizeOf<Vector4>();
                        descriptions.Add(description);
                        break;
                    default:
                        throw new Exception("Uknown type for CBuffer Attribute");
                }

                currentOffset += attributeSize;
            }


            // El tamaño del cbuffer tiene que ser multiplo de 16
            int size = (currentOffset % 16) != 0 ? ((currentOffset / 16) + 1) * 16 : currentOffset;

            EffectConstantBuffer cb = new EffectConstantBuffer(name, size, descriptions.ToArray());
            return cb;
        }