То, что у вас есть, в общем, хорошо (лично я бы сделал фиксированные поля буфера private
и добавил бы некоторые проверки диапазона на i
). Я сильно подозреваю , что здесь вы на самом деле боретесь с семантикой передачи по значению, в которой вы работаете с изолированной копией значения. Вот полностью запускаемая демонстрация с вашим типом «как есть» (без изменений), которая показывает, что все работает нормально:
using System;
static class Program
{
static void Main()
{
VertexBoneData data = new VertexBoneData();
data.SetBoneID(3, 42F);
Console.WriteLine(data.GetBoneID(3)); // writes 42
// here's what I *suspect* you're doing
SomePassByValueMethod(data);
Console.WriteLine(data.GetBoneID(3)); // still writes 42, not 16
// here's one way to fix that
SomePassByReferenceMethod(ref data);
Console.WriteLine(data.GetBoneID(3)); // writes 122
}
static void SomePassByValueMethod(VertexBoneData data)
{
data.SetBoneID(3, 16F);
}
static void SomePassByReferenceMethod(ref VertexBoneData data)
{
data.SetBoneID(3, 122F);
}
}
public unsafe struct VertexBoneData
{
public Vector3 Position;
public Vector3 Normal;
public Vector2 TexCoord;
public fixed float BoneIDs[Bone.MaxBoneCount];
public fixed float BoneWeights[Bone.MaxBoneCount];
public float GetBoneID(int i)
{
return BoneIDs[i];
}
public void SetBoneID(int i, float value)
{
BoneIDs[i] = value;
}
public float GetBoneWeight(int i)
{
return BoneWeights[i];
}
public void SetBoneWeight(int i, float value)
{
BoneWeights[i] = value;
}
}
static class Bone
{
public const int MaxBoneCount = 4; // whatever
}
// just avoiding a dependency here, since I'm in a console exe
public readonly struct Vector3 { }
public readonly struct Vector2 { }