我正在尝试执行此操作,但是似乎没有任何内容分配给BoneIDs
或BoneWeights
,在C#中执行此操作的正确方法是什么?
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;
}
}
从广义上讲,您所拥有的很好(我个人将固定缓冲区设置为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 { }
const int MaxBoneCount = 10;
public struct VertexBoneData
{
public Vector3 Position;
public Vector3 Normal;
public Vector2 TexCoord;
[MarshalAs(UnmanagedType.I4, SizeConst = MaxBoneCount)]
public float BoneIDs[];
[MarshalAs(UnmanagedType.I4, SizeConst = MaxBoneCount)]
public float BoneWeights[];
}