Show More
Commit Description:
Various UI improvements.
Commit Description:
Various UI improvements.
References:
File last commit:
Show/Diff file:
Action:
FNA/src/Graphics/Effect/EffectParameter.cs
1067 lines | 22.0 KiB | text/x-csharp | CSharpLexer
1067 lines | 22.0 KiB | text/x-csharp | CSharpLexer
r0 | #region License | |||
/* FNA - XNA4 Reimplementation for Desktop Platforms | ||||
* Copyright 2009-2020 Ethan Lee and the MonoGame Team | ||||
* | ||||
* Released under the Microsoft Public License. | ||||
* See LICENSE for details. | ||||
*/ | ||||
#endregion | ||||
#region Using Statements | ||||
using System; | ||||
using System.Collections.Generic; | ||||
using System.Runtime.InteropServices; | ||||
#endregion | ||||
namespace Microsoft.Xna.Framework.Graphics | ||||
{ | ||||
public sealed class EffectParameter | ||||
{ | ||||
#region Public Properties | ||||
public string Name | ||||
{ | ||||
get; | ||||
private set; | ||||
} | ||||
public string Semantic | ||||
{ | ||||
get; | ||||
private set; | ||||
} | ||||
public int RowCount | ||||
{ | ||||
get; | ||||
private set; | ||||
} | ||||
public int ColumnCount | ||||
{ | ||||
get; | ||||
private set; | ||||
} | ||||
public EffectParameterClass ParameterClass | ||||
{ | ||||
get; | ||||
private set; | ||||
} | ||||
public EffectParameterType ParameterType | ||||
{ | ||||
get; | ||||
private set; | ||||
} | ||||
public EffectParameterCollection Elements | ||||
{ | ||||
get; | ||||
private set; | ||||
} | ||||
public EffectParameterCollection StructureMembers | ||||
{ | ||||
get; | ||||
private set; | ||||
} | ||||
public EffectAnnotationCollection Annotations | ||||
{ | ||||
get; | ||||
private set; | ||||
} | ||||
#endregion | ||||
#region Internal Variables | ||||
internal Texture texture; | ||||
internal IntPtr values; | ||||
internal uint valuesSizeBytes; | ||||
#endregion | ||||
#region Internal Constructor | ||||
internal EffectParameter( | ||||
string name, | ||||
string semantic, | ||||
int rowCount, | ||||
int columnCount, | ||||
int elementCount, | ||||
EffectParameterClass parameterClass, | ||||
EffectParameterType parameterType, | ||||
EffectParameterCollection structureMembers, | ||||
EffectAnnotationCollection annotations, | ||||
IntPtr data, | ||||
uint dataSizeBytes | ||||
) { | ||||
if (data == IntPtr.Zero) | ||||
{ | ||||
throw new ArgumentNullException("data"); | ||||
} | ||||
Name = name; | ||||
Semantic = semantic ?? string.Empty; | ||||
RowCount = rowCount; | ||||
ColumnCount = columnCount; | ||||
if (elementCount > 0) | ||||
{ | ||||
int curOffset = 0; | ||||
List<EffectParameter> elements = new List<EffectParameter>(elementCount); | ||||
for (int i = 0; i < elementCount; i += 1) | ||||
{ | ||||
EffectParameterCollection elementMembers = null; | ||||
if (structureMembers != null) | ||||
{ | ||||
List<EffectParameter> memList = new List<EffectParameter>(); | ||||
for (int j = 0; j < structureMembers.Count; j += 1) | ||||
{ | ||||
int memElems = 0; | ||||
if (structureMembers[j].Elements != null) | ||||
{ | ||||
memElems = structureMembers[j].Elements.Count; | ||||
} | ||||
int memSize = structureMembers[j].RowCount * 4; | ||||
if (memElems > 0) | ||||
{ | ||||
memSize *= memElems; | ||||
} | ||||
memList.Add(new EffectParameter( | ||||
structureMembers[j].Name, | ||||
structureMembers[j].Semantic, | ||||
structureMembers[j].RowCount, | ||||
structureMembers[j].ColumnCount, | ||||
memElems, | ||||
structureMembers[j].ParameterClass, | ||||
structureMembers[j].ParameterType, | ||||
null, // FIXME: Nested structs! -flibit | ||||
structureMembers[j].Annotations, | ||||
new IntPtr(data.ToInt64() + curOffset), | ||||
(uint) memSize * 4 | ||||
)); | ||||
curOffset += memSize * 4; | ||||
} | ||||
elementMembers = new EffectParameterCollection(memList); | ||||
} | ||||
// FIXME: Probably incomplete? -flibit | ||||
elements.Add(new EffectParameter( | ||||
null, | ||||
null, | ||||
rowCount, | ||||
columnCount, | ||||
0, | ||||
ParameterClass, | ||||
parameterType, | ||||
elementMembers, | ||||
null, | ||||
new IntPtr( | ||||
data.ToInt64() + (i * rowCount * 16) | ||||
), | ||||
// FIXME: Not obvious to me how to compute this -kg | ||||
0 | ||||
)); | ||||
} | ||||
Elements = new EffectParameterCollection(elements); | ||||
} | ||||
ParameterClass = parameterClass; | ||||
ParameterType = parameterType; | ||||
StructureMembers = structureMembers; | ||||
Annotations = annotations; | ||||
values = data; | ||||
valuesSizeBytes = dataSizeBytes; | ||||
} | ||||
#endregion | ||||
#region Public Get Methods | ||||
public bool GetValueBoolean() | ||||
{ | ||||
unsafe | ||||
{ | ||||
// Values are always 4 bytes, so we get to do this. -flibit | ||||
int* resPtr = (int*) values; | ||||
return *resPtr != 0; | ||||
} | ||||
} | ||||
public bool[] GetValueBooleanArray(int count) | ||||
{ | ||||
bool[] result = new bool[count]; | ||||
unsafe | ||||
{ | ||||
int* resPtr = (int*) values; | ||||
for (int i = 0; i < result.Length; resPtr += 4) | ||||
{ | ||||
for (int j = 0; j < ColumnCount; j += 1, i += 1) | ||||
{ | ||||
result[i] = *(resPtr + j) != 0; | ||||
} | ||||
} | ||||
} | ||||
return result; | ||||
} | ||||
public int GetValueInt32() | ||||
{ | ||||
unsafe | ||||
{ | ||||
int* resPtr = (int*) values; | ||||
return *resPtr; | ||||
} | ||||
} | ||||
public int[] GetValueInt32Array(int count) | ||||
{ | ||||
int[] result = new int[count]; | ||||
for (int i = 0, j = 0; i < result.Length; i += ColumnCount, j += 16) | ||||
{ | ||||
Marshal.Copy(values + j, result, i, ColumnCount); | ||||
} | ||||
return result; | ||||
} | ||||
public Matrix GetValueMatrixTranspose() | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* resPtr = (float*) values; | ||||
return new Matrix( | ||||
resPtr[0], | ||||
resPtr[1], | ||||
resPtr[2], | ||||
resPtr[3], | ||||
resPtr[4], | ||||
resPtr[5], | ||||
resPtr[6], | ||||
resPtr[7], | ||||
resPtr[8], | ||||
resPtr[9], | ||||
resPtr[10], | ||||
resPtr[11], | ||||
resPtr[12], | ||||
resPtr[13], | ||||
resPtr[14], | ||||
resPtr[15] | ||||
); | ||||
} | ||||
} | ||||
public Matrix[] GetValueMatrixTransposeArray(int count) | ||||
{ | ||||
Matrix[] result = new Matrix[count]; | ||||
unsafe | ||||
{ | ||||
float* resPtr = (float*) values; | ||||
for (int i = 0; i < count; i += 1, resPtr += 16) | ||||
{ | ||||
result[i] = new Matrix( | ||||
resPtr[0], | ||||
resPtr[1], | ||||
resPtr[2], | ||||
resPtr[3], | ||||
resPtr[4], | ||||
resPtr[5], | ||||
resPtr[6], | ||||
resPtr[7], | ||||
resPtr[8], | ||||
resPtr[9], | ||||
resPtr[10], | ||||
resPtr[11], | ||||
resPtr[12], | ||||
resPtr[13], | ||||
resPtr[14], | ||||
resPtr[15] | ||||
); | ||||
} | ||||
} | ||||
return result; | ||||
} | ||||
public Matrix GetValueMatrix() | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* resPtr = (float*) values; | ||||
return new Matrix( | ||||
resPtr[0], | ||||
resPtr[4], | ||||
resPtr[8], | ||||
resPtr[12], | ||||
resPtr[1], | ||||
resPtr[5], | ||||
resPtr[9], | ||||
resPtr[13], | ||||
resPtr[2], | ||||
resPtr[6], | ||||
resPtr[10], | ||||
resPtr[14], | ||||
resPtr[3], | ||||
resPtr[7], | ||||
resPtr[11], | ||||
resPtr[15] | ||||
); | ||||
} | ||||
} | ||||
public Matrix[] GetValueMatrixArray(int count) | ||||
{ | ||||
Matrix[] result = new Matrix[count]; | ||||
unsafe | ||||
{ | ||||
float* resPtr = (float*) values; | ||||
for (int i = 0; i < count; i += 1, resPtr += 16) | ||||
{ | ||||
result[i] = new Matrix( | ||||
resPtr[0], | ||||
resPtr[4], | ||||
resPtr[8], | ||||
resPtr[12], | ||||
resPtr[1], | ||||
resPtr[5], | ||||
resPtr[9], | ||||
resPtr[13], | ||||
resPtr[2], | ||||
resPtr[6], | ||||
resPtr[10], | ||||
resPtr[14], | ||||
resPtr[3], | ||||
resPtr[7], | ||||
resPtr[11], | ||||
resPtr[15] | ||||
); | ||||
} | ||||
} | ||||
return result; | ||||
} | ||||
public Quaternion GetValueQuaternion() | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* resPtr = (float*) values; | ||||
return new Quaternion( | ||||
resPtr[0], | ||||
resPtr[1], | ||||
resPtr[2], | ||||
resPtr[3] | ||||
); | ||||
} | ||||
} | ||||
public Quaternion[] GetValueQuaternionArray(int count) | ||||
{ | ||||
Quaternion[] result = new Quaternion[count]; | ||||
unsafe | ||||
{ | ||||
float* resPtr = (float*) values; | ||||
for (int i = 0; i < count; i += 1, resPtr += 4) | ||||
{ | ||||
result[i] = new Quaternion( | ||||
resPtr[0], | ||||
resPtr[1], | ||||
resPtr[2], | ||||
resPtr[3] | ||||
); | ||||
} | ||||
} | ||||
return result; | ||||
} | ||||
public float GetValueSingle() | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* resPtr = (float*) values; | ||||
return *resPtr; | ||||
} | ||||
} | ||||
public float[] GetValueSingleArray(int count) | ||||
{ | ||||
float[] result = new float[count]; | ||||
for (int i = 0, j = 0; i < result.Length; i += ColumnCount, j += 16) | ||||
{ | ||||
Marshal.Copy(values + j, result, i, ColumnCount); | ||||
} | ||||
return result; | ||||
} | ||||
public string GetValueString() | ||||
{ | ||||
/* FIXME: This requires digging into the effect->objects list. | ||||
* We've got the data, we just need to hook it up to FNA. | ||||
* -flibit | ||||
*/ | ||||
throw new NotImplementedException("effect->objects[?]"); | ||||
} | ||||
public Texture2D GetValueTexture2D() | ||||
{ | ||||
return (Texture2D) texture; | ||||
} | ||||
public Texture3D GetValueTexture3D() | ||||
{ | ||||
return (Texture3D) texture; | ||||
} | ||||
public TextureCube GetValueTextureCube() | ||||
{ | ||||
return (TextureCube) texture; | ||||
} | ||||
public Vector2 GetValueVector2() | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* resPtr = (float*) values; | ||||
return new Vector2(resPtr[0], resPtr[1]); | ||||
} | ||||
} | ||||
public Vector2[] GetValueVector2Array(int count) | ||||
{ | ||||
Vector2[] result = new Vector2[count]; | ||||
unsafe | ||||
{ | ||||
float* resPtr = (float*) values; | ||||
for (int i = 0; i < count; i += 1, resPtr += 4) | ||||
{ | ||||
result[i] = new Vector2( | ||||
resPtr[0], | ||||
resPtr[1] | ||||
); | ||||
} | ||||
} | ||||
return result; | ||||
} | ||||
public Vector3 GetValueVector3() | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* resPtr = (float*) values; | ||||
return new Vector3(resPtr[0], resPtr[1], resPtr[2]); | ||||
} | ||||
} | ||||
public Vector3[] GetValueVector3Array(int count) | ||||
{ | ||||
Vector3[] result = new Vector3[count]; | ||||
unsafe | ||||
{ | ||||
float* resPtr = (float*) values; | ||||
for (int i = 0; i < count; i += 1, resPtr += 4) | ||||
{ | ||||
result[i] = new Vector3( | ||||
resPtr[0], | ||||
resPtr[1], | ||||
resPtr[2] | ||||
); | ||||
} | ||||
} | ||||
return result; | ||||
} | ||||
public Vector4 GetValueVector4() | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* resPtr = (float*) values; | ||||
return new Vector4( | ||||
resPtr[0], | ||||
resPtr[1], | ||||
resPtr[2], | ||||
resPtr[3] | ||||
); | ||||
} | ||||
} | ||||
public Vector4[] GetValueVector4Array(int count) | ||||
{ | ||||
Vector4[] result = new Vector4[count]; | ||||
unsafe | ||||
{ | ||||
float* resPtr = (float*) values; | ||||
for (int i = 0; i < count; i += 1, resPtr += 4) | ||||
{ | ||||
result[i] = new Vector4( | ||||
resPtr[0], | ||||
resPtr[1], | ||||
resPtr[2], | ||||
resPtr[3] | ||||
); | ||||
} | ||||
} | ||||
return result; | ||||
} | ||||
#endregion | ||||
#region Public Set Methods | ||||
public void SetValue(bool value) | ||||
{ | ||||
unsafe | ||||
{ | ||||
int* dstPtr = (int*) values; | ||||
// Ugh, this branch, stupid C#. | ||||
*dstPtr = value ? 1 : 0; | ||||
} | ||||
} | ||||
public void SetValue(bool[] value) | ||||
{ | ||||
unsafe | ||||
{ | ||||
int* dstPtr = (int*) values; | ||||
for (int i = 0; i < value.Length; dstPtr += 4) | ||||
{ | ||||
for (int j = 0; j < ColumnCount; j += 1, i += 1) | ||||
{ | ||||
// Ugh, this branch, stupid C#. | ||||
*(dstPtr + j) = value[i] ? 1 : 0; | ||||
} | ||||
} | ||||
} | ||||
} | ||||
public void SetValue(int value) | ||||
{ | ||||
if (ParameterType == EffectParameterType.Single) | ||||
{ | ||||
unsafe | ||||
{ | ||||
float *dstPtr = (float*) values; | ||||
*dstPtr = (float) value; | ||||
} | ||||
} | ||||
else | ||||
{ | ||||
unsafe | ||||
{ | ||||
int* dstPtr = (int*) values; | ||||
*dstPtr = value; | ||||
} | ||||
} | ||||
} | ||||
public void SetValue(int[] value) | ||||
{ | ||||
for (int i = 0, j = 0; i < value.Length; i += ColumnCount, j += 16) | ||||
{ | ||||
Marshal.Copy(value, i, values + j, ColumnCount); | ||||
} | ||||
} | ||||
public void SetValueTranspose(Matrix value) | ||||
{ | ||||
// FIXME: All Matrix sizes... this will get ugly. -flibit | ||||
unsafe | ||||
{ | ||||
float* dstPtr = (float*) values; | ||||
if (ColumnCount == 4 && RowCount == 4) | ||||
{ | ||||
dstPtr[0] = value.M11; | ||||
dstPtr[1] = value.M12; | ||||
dstPtr[2] = value.M13; | ||||
dstPtr[3] = value.M14; | ||||
dstPtr[4] = value.M21; | ||||
dstPtr[5] = value.M22; | ||||
dstPtr[6] = value.M23; | ||||
dstPtr[7] = value.M24; | ||||
dstPtr[8] = value.M31; | ||||
dstPtr[9] = value.M32; | ||||
dstPtr[10] = value.M33; | ||||
dstPtr[11] = value.M34; | ||||
dstPtr[12] = value.M41; | ||||
dstPtr[13] = value.M42; | ||||
dstPtr[14] = value.M43; | ||||
dstPtr[15] = value.M44; | ||||
} | ||||
else if (ColumnCount == 3 && RowCount == 3) | ||||
{ | ||||
dstPtr[0] = value.M11; | ||||
dstPtr[1] = value.M12; | ||||
dstPtr[2] = value.M13; | ||||
dstPtr[4] = value.M21; | ||||
dstPtr[5] = value.M22; | ||||
dstPtr[6] = value.M23; | ||||
dstPtr[8] = value.M31; | ||||
dstPtr[9] = value.M32; | ||||
dstPtr[10] = value.M33; | ||||
} | ||||
else if (ColumnCount == 4 && RowCount == 3) | ||||
{ | ||||
dstPtr[0] = value.M11; | ||||
dstPtr[1] = value.M12; | ||||
dstPtr[2] = value.M13; | ||||
dstPtr[4] = value.M21; | ||||
dstPtr[5] = value.M22; | ||||
dstPtr[6] = value.M23; | ||||
dstPtr[8] = value.M31; | ||||
dstPtr[9] = value.M32; | ||||
dstPtr[10] = value.M33; | ||||
dstPtr[12] = value.M41; | ||||
dstPtr[13] = value.M42; | ||||
dstPtr[14] = value.M43; | ||||
} | ||||
else if (ColumnCount == 3 && RowCount == 4) | ||||
{ | ||||
dstPtr[0] = value.M11; | ||||
dstPtr[1] = value.M12; | ||||
dstPtr[2] = value.M13; | ||||
dstPtr[3] = value.M14; | ||||
dstPtr[4] = value.M21; | ||||
dstPtr[5] = value.M22; | ||||
dstPtr[6] = value.M23; | ||||
dstPtr[7] = value.M24; | ||||
dstPtr[8] = value.M31; | ||||
dstPtr[9] = value.M32; | ||||
dstPtr[10] = value.M33; | ||||
dstPtr[11] = value.M34; | ||||
} | ||||
else if (ColumnCount == 2 && RowCount == 2) | ||||
{ | ||||
dstPtr[0] = value.M11; | ||||
dstPtr[1] = value.M12; | ||||
dstPtr[4] = value.M21; | ||||
dstPtr[5] = value.M22; | ||||
} | ||||
else | ||||
{ | ||||
throw new NotImplementedException( | ||||
"Matrix Size: " + | ||||
RowCount.ToString() + " " + | ||||
ColumnCount.ToString() | ||||
); | ||||
} | ||||
} | ||||
} | ||||
public void SetValueTranspose(Matrix[] value) | ||||
{ | ||||
// FIXME: All Matrix sizes... this will get ugly. -flibit | ||||
unsafe | ||||
{ | ||||
float* dstPtr = (float*) values; | ||||
if (ColumnCount == 4 && RowCount == 4) | ||||
{ | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 16) | ||||
{ | ||||
dstPtr[0] = value[i].M11; | ||||
dstPtr[1] = value[i].M12; | ||||
dstPtr[2] = value[i].M13; | ||||
dstPtr[3] = value[i].M14; | ||||
dstPtr[4] = value[i].M21; | ||||
dstPtr[5] = value[i].M22; | ||||
dstPtr[6] = value[i].M23; | ||||
dstPtr[7] = value[i].M24; | ||||
dstPtr[8] = value[i].M31; | ||||
dstPtr[9] = value[i].M32; | ||||
dstPtr[10] = value[i].M33; | ||||
dstPtr[11] = value[i].M34; | ||||
dstPtr[12] = value[i].M41; | ||||
dstPtr[13] = value[i].M42; | ||||
dstPtr[14] = value[i].M43; | ||||
dstPtr[15] = value[i].M44; | ||||
} | ||||
} | ||||
else if (ColumnCount == 3 && RowCount == 3) | ||||
{ | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 12) | ||||
{ | ||||
dstPtr[0] = value[i].M11; | ||||
dstPtr[1] = value[i].M12; | ||||
dstPtr[2] = value[i].M13; | ||||
dstPtr[4] = value[i].M21; | ||||
dstPtr[5] = value[i].M22; | ||||
dstPtr[6] = value[i].M23; | ||||
dstPtr[8] = value[i].M31; | ||||
dstPtr[9] = value[i].M32; | ||||
dstPtr[10] = value[i].M33; | ||||
} | ||||
} | ||||
else if (ColumnCount == 4 && RowCount == 3) | ||||
{ | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 16) | ||||
{ | ||||
dstPtr[0] = value[i].M11; | ||||
dstPtr[1] = value[i].M12; | ||||
dstPtr[2] = value[i].M13; | ||||
dstPtr[4] = value[i].M21; | ||||
dstPtr[5] = value[i].M22; | ||||
dstPtr[6] = value[i].M23; | ||||
dstPtr[8] = value[i].M31; | ||||
dstPtr[9] = value[i].M32; | ||||
dstPtr[10] = value[i].M33; | ||||
dstPtr[12] = value[i].M41; | ||||
dstPtr[13] = value[i].M42; | ||||
dstPtr[14] = value[i].M43; | ||||
} | ||||
} | ||||
else if (ColumnCount == 3 && RowCount == 4) | ||||
{ | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 12) | ||||
{ | ||||
dstPtr[0] = value[i].M11; | ||||
dstPtr[1] = value[i].M12; | ||||
dstPtr[2] = value[i].M13; | ||||
dstPtr[3] = value[i].M14; | ||||
dstPtr[4] = value[i].M21; | ||||
dstPtr[5] = value[i].M22; | ||||
dstPtr[6] = value[i].M23; | ||||
dstPtr[7] = value[i].M24; | ||||
dstPtr[8] = value[i].M31; | ||||
dstPtr[9] = value[i].M32; | ||||
dstPtr[10] = value[i].M33; | ||||
dstPtr[11] = value[i].M34; | ||||
} | ||||
} | ||||
else if (ColumnCount == 2 && RowCount == 2) | ||||
{ | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 8) | ||||
{ | ||||
dstPtr[0] = value[i].M11; | ||||
dstPtr[1] = value[i].M12; | ||||
dstPtr[4] = value[i].M21; | ||||
dstPtr[5] = value[i].M22; | ||||
} | ||||
} | ||||
else | ||||
{ | ||||
throw new NotImplementedException( | ||||
"Matrix Size: " + | ||||
RowCount.ToString() + " " + | ||||
ColumnCount.ToString() | ||||
); | ||||
} | ||||
} | ||||
} | ||||
public void SetValue(Matrix value) | ||||
{ | ||||
// FIXME: All Matrix sizes... this will get ugly. -flibit | ||||
unsafe | ||||
{ | ||||
float* dstPtr = (float*) values; | ||||
if (ColumnCount == 4 && RowCount == 4) | ||||
{ | ||||
dstPtr[0] = value.M11; | ||||
dstPtr[1] = value.M21; | ||||
dstPtr[2] = value.M31; | ||||
dstPtr[3] = value.M41; | ||||
dstPtr[4] = value.M12; | ||||
dstPtr[5] = value.M22; | ||||
dstPtr[6] = value.M32; | ||||
dstPtr[7] = value.M42; | ||||
dstPtr[8] = value.M13; | ||||
dstPtr[9] = value.M23; | ||||
dstPtr[10] = value.M33; | ||||
dstPtr[11] = value.M43; | ||||
dstPtr[12] = value.M14; | ||||
dstPtr[13] = value.M24; | ||||
dstPtr[14] = value.M34; | ||||
dstPtr[15] = value.M44; | ||||
} | ||||
else if (ColumnCount == 3 && RowCount == 3) | ||||
{ | ||||
dstPtr[0] = value.M11; | ||||
dstPtr[1] = value.M21; | ||||
dstPtr[2] = value.M31; | ||||
dstPtr[4] = value.M12; | ||||
dstPtr[5] = value.M22; | ||||
dstPtr[6] = value.M32; | ||||
dstPtr[8] = value.M13; | ||||
dstPtr[9] = value.M23; | ||||
dstPtr[10] = value.M33; | ||||
} | ||||
else if (ColumnCount == 4 && RowCount == 3) | ||||
{ | ||||
dstPtr[0] = value.M11; | ||||
dstPtr[1] = value.M21; | ||||
dstPtr[2] = value.M31; | ||||
dstPtr[3] = value.M41; | ||||
dstPtr[4] = value.M12; | ||||
dstPtr[5] = value.M22; | ||||
dstPtr[6] = value.M32; | ||||
dstPtr[7] = value.M42; | ||||
dstPtr[8] = value.M13; | ||||
dstPtr[9] = value.M23; | ||||
dstPtr[10] = value.M33; | ||||
dstPtr[11] = value.M43; | ||||
} | ||||
else if (ColumnCount == 3 && RowCount == 4) | ||||
{ | ||||
dstPtr[0] = value.M11; | ||||
dstPtr[1] = value.M21; | ||||
dstPtr[2] = value.M31; | ||||
dstPtr[4] = value.M12; | ||||
dstPtr[5] = value.M22; | ||||
dstPtr[6] = value.M32; | ||||
dstPtr[8] = value.M13; | ||||
dstPtr[9] = value.M23; | ||||
dstPtr[10] = value.M33; | ||||
dstPtr[12] = value.M14; | ||||
dstPtr[13] = value.M24; | ||||
dstPtr[14] = value.M34; | ||||
} | ||||
else if (ColumnCount == 2 && RowCount == 2) | ||||
{ | ||||
dstPtr[0] = value.M11; | ||||
dstPtr[1] = value.M21; | ||||
dstPtr[4] = value.M12; | ||||
dstPtr[5] = value.M22; | ||||
} | ||||
else | ||||
{ | ||||
throw new NotImplementedException( | ||||
"Matrix Size: " + | ||||
RowCount.ToString() + " " + | ||||
ColumnCount.ToString() | ||||
); | ||||
} | ||||
} | ||||
} | ||||
public void SetValue(Matrix[] value) | ||||
{ | ||||
// FIXME: All Matrix sizes... this will get ugly. -flibit | ||||
unsafe | ||||
{ | ||||
float* dstPtr = (float*) values; | ||||
if (ColumnCount == 4 && RowCount == 4) | ||||
{ | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 16) | ||||
{ | ||||
dstPtr[0] = value[i].M11; | ||||
dstPtr[1] = value[i].M21; | ||||
dstPtr[2] = value[i].M31; | ||||
dstPtr[3] = value[i].M41; | ||||
dstPtr[4] = value[i].M12; | ||||
dstPtr[5] = value[i].M22; | ||||
dstPtr[6] = value[i].M32; | ||||
dstPtr[7] = value[i].M42; | ||||
dstPtr[8] = value[i].M13; | ||||
dstPtr[9] = value[i].M23; | ||||
dstPtr[10] = value[i].M33; | ||||
dstPtr[11] = value[i].M43; | ||||
dstPtr[12] = value[i].M14; | ||||
dstPtr[13] = value[i].M24; | ||||
dstPtr[14] = value[i].M34; | ||||
dstPtr[15] = value[i].M44; | ||||
} | ||||
} | ||||
else if (ColumnCount == 3 && RowCount == 3) | ||||
{ | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 12) | ||||
{ | ||||
dstPtr[0] = value[i].M11; | ||||
dstPtr[1] = value[i].M21; | ||||
dstPtr[2] = value[i].M31; | ||||
dstPtr[4] = value[i].M12; | ||||
dstPtr[5] = value[i].M22; | ||||
dstPtr[6] = value[i].M32; | ||||
dstPtr[8] = value[i].M13; | ||||
dstPtr[9] = value[i].M23; | ||||
dstPtr[10] = value[i].M33; | ||||
} | ||||
} | ||||
else if (ColumnCount == 4 && RowCount == 3) | ||||
{ | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 12) | ||||
{ | ||||
dstPtr[0] = value[i].M11; | ||||
dstPtr[1] = value[i].M21; | ||||
dstPtr[2] = value[i].M31; | ||||
dstPtr[3] = value[i].M41; | ||||
dstPtr[4] = value[i].M12; | ||||
dstPtr[5] = value[i].M22; | ||||
dstPtr[6] = value[i].M32; | ||||
dstPtr[7] = value[i].M42; | ||||
dstPtr[8] = value[i].M13; | ||||
dstPtr[9] = value[i].M23; | ||||
dstPtr[10] = value[i].M33; | ||||
dstPtr[11] = value[i].M43; | ||||
} | ||||
} | ||||
else if (ColumnCount == 3 && RowCount == 4) | ||||
{ | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 16) | ||||
{ | ||||
dstPtr[0] = value[i].M11; | ||||
dstPtr[1] = value[i].M21; | ||||
dstPtr[2] = value[i].M31; | ||||
dstPtr[4] = value[i].M12; | ||||
dstPtr[5] = value[i].M22; | ||||
dstPtr[6] = value[i].M32; | ||||
dstPtr[8] = value[i].M13; | ||||
dstPtr[9] = value[i].M23; | ||||
dstPtr[10] = value[i].M33; | ||||
dstPtr[12] = value[i].M14; | ||||
dstPtr[13] = value[i].M24; | ||||
dstPtr[14] = value[i].M34; | ||||
} | ||||
} | ||||
else if (ColumnCount == 2 && RowCount == 2) | ||||
{ | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 8) | ||||
{ | ||||
dstPtr[0] = value[i].M11; | ||||
dstPtr[1] = value[i].M21; | ||||
dstPtr[4] = value[i].M12; | ||||
dstPtr[5] = value[i].M22; | ||||
} | ||||
} | ||||
else | ||||
{ | ||||
throw new NotImplementedException( | ||||
"Matrix Size: " + | ||||
RowCount.ToString() + " " + | ||||
ColumnCount.ToString() | ||||
); | ||||
} | ||||
} | ||||
} | ||||
public void SetValue(Quaternion value) | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* dstPtr = (float*) values; | ||||
dstPtr[0] = value.X; | ||||
dstPtr[1] = value.Y; | ||||
dstPtr[2] = value.Z; | ||||
dstPtr[3] = value.W; | ||||
} | ||||
} | ||||
public void SetValue(Quaternion[] value) | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* dstPtr = (float*) values; | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 4) | ||||
{ | ||||
dstPtr[0] = value[i].X; | ||||
dstPtr[1] = value[i].Y; | ||||
dstPtr[2] = value[i].Z; | ||||
dstPtr[3] = value[i].W; | ||||
} | ||||
} | ||||
} | ||||
public void SetValue(float value) | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* dstPtr = (float*) values; | ||||
*dstPtr = value; | ||||
} | ||||
} | ||||
public void SetValue(float[] value) | ||||
{ | ||||
for (int i = 0, j = 0; i < value.Length; i += ColumnCount, j += 16) | ||||
{ | ||||
Marshal.Copy(value, i, values + j, ColumnCount); | ||||
} | ||||
} | ||||
public void SetValue(string value) | ||||
{ | ||||
/* FIXME: This requires digging into the effect->objects list. | ||||
* We've got the data, we just need to hook it up to FNA. | ||||
* -flibit | ||||
*/ | ||||
throw new NotImplementedException("effect->objects[?]"); | ||||
} | ||||
public void SetValue(Texture value) | ||||
{ | ||||
texture = value; | ||||
} | ||||
public void SetValue(Vector2 value) | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* dstPtr = (float*) values; | ||||
dstPtr[0] = value.X; | ||||
dstPtr[1] = value.Y; | ||||
} | ||||
} | ||||
public void SetValue(Vector2[] value) | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* dstPtr = (float*) values; | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 4) | ||||
{ | ||||
dstPtr[0] = value[i].X; | ||||
dstPtr[1] = value[i].Y; | ||||
} | ||||
} | ||||
} | ||||
public void SetValue(Vector3 value) | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* dstPtr = (float*) values; | ||||
dstPtr[0] = value.X; | ||||
dstPtr[1] = value.Y; | ||||
dstPtr[2] = value.Z; | ||||
} | ||||
} | ||||
public void SetValue(Vector3[] value) | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* dstPtr = (float*) values; | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 4) | ||||
{ | ||||
dstPtr[0] = value[i].X; | ||||
dstPtr[1] = value[i].Y; | ||||
dstPtr[2] = value[i].Z; | ||||
} | ||||
} | ||||
} | ||||
public void SetValue(Vector4 value) | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* dstPtr = (float*) values; | ||||
dstPtr[0] = value.X; | ||||
dstPtr[1] = value.Y; | ||||
dstPtr[2] = value.Z; | ||||
dstPtr[3] = value.W; | ||||
} | ||||
} | ||||
public void SetValue(Vector4[] value) | ||||
{ | ||||
unsafe | ||||
{ | ||||
float* dstPtr = (float*) values; | ||||
for (int i = 0; i < value.Length; i += 1, dstPtr += 4) | ||||
{ | ||||
dstPtr[0] = value[i].X; | ||||
dstPtr[1] = value[i].Y; | ||||
dstPtr[2] = value[i].Z; | ||||
dstPtr[3] = value[i].W; | ||||
} | ||||
} | ||||
} | ||||
#endregion | ||||
} | ||||
} | ||||