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; }
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; }