private void SetCallback(IntPtr pointer, IntPtr clientData)
{
float[] data = new float[4]; /* X, Y, Z, W */
Marshal.Copy(pointer, data, 0, data.Length);
if (IsValid(data[0], data[1], data[2], data[3]))
{
bool changed = (data[0] != x)
|| (data[1] != y)
|| (data[2] != z)
|| (data[3] != w);
x = data[0];
y = data[1];
z = data[2];
w = data[3];
if (changed) {
OnChanged(EventArgs.Empty);
}
}
}