Как вы можете получить доступ к элементам из фиксированного буфера в структуре? - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь это сделать, однако кажется, что ничто никогда не назначается на 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;
    }
}

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

То, что у вас есть, в общем, хорошо (лично я бы сделал фиксированные поля буфера 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 { }
0 голосов
/ 05 апреля 2020

Использовать технику маршала

        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[];
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...