private static EffectParameterCollection ReadParameters(BinaryReader reader)
{
var count = (int)reader.ReadByte();
if (count == 0)
return EffectParameterCollection.Empty;
var parameters = new EffectParameter[count];
for (var i = 0; i < count; i++)
{
var class_ = (EffectParameterClass)reader.ReadByte();
var type = (EffectParameterType)reader.ReadByte();
var name = reader.ReadString();
var semantic = reader.ReadString();
var annotations = ReadAnnotations(reader);
var rowCount = (int)reader.ReadByte();
var columnCount = (int)reader.ReadByte();
var elements = ReadParameters(reader);
var structMembers = ReadParameters(reader);
object data = null;
if (elements.Count == 0 && structMembers.Count == 0)
{
switch (type)
{
case EffectParameterType.Bool:
case EffectParameterType.Int32:
#if DIRECTX
// Under DirectX we properly store integers and booleans
// in an integer type.
//
// MojoShader on the otherhand stores everything in float
// types which is why this code is disabled under OpenGL.
{
var buffer = new int[rowCount * columnCount];
for (var j = 0; j < buffer.Length; j++)
buffer[j] = reader.ReadInt32();
data = buffer;
break;
}
#endif
case EffectParameterType.Single:
{
var buffer = new float[rowCount * columnCount];
for (var j = 0; j < buffer.Length; j++)
buffer[j] = reader.ReadSingle();
data = buffer;
break;
}
case EffectParameterType.String:
// TODO: We have not investigated what a string
// type should do in the parameter list. Till then
// throw to let the user know.
throw new NotSupportedException();
default:
// NOTE: We skip over all other types as they
// don't get added to the constant buffer.
break;
}
}
parameters[i] = new EffectParameter(
class_, type, name, rowCount, columnCount, semantic,
annotations, elements, structMembers, data);
}
return new EffectParameterCollection(parameters);
}
#endregion // Effect File Reader