Доступ к данным классов / объединений в формате "колонка-майор" C ++ - PullRequest
0 голосов
/ 07 декабря 2011

Недавно я узнал о спецификаторе хранилища Union для типов данных - особенно для использования матрицы преобразования OpenGL / DirectX, так как я не хочу продолжать использовать устаревшие функции gluLookAt, gluOrtho и различные функции MatrixStack фиксированнойФункциональный конвейер.Это было потрясающе, и недавно мне было очень весело создавать базовый класс матрицы преобразования 4x4, внутренние данные которого упакованы в единое целое, чтобы обеспечить различные способы доступа к данным в матрице.Проблема в том, что я хочу создать способ агрегирования / доступа к данным по их столбцам без необходимости выполнять какие-то странные функции

float* Column(int index);

.Я знаю, что C ++ хранит свои данные в форме строк, так как мне обеспечить доступ к столбцам?Там ???в приведенной ниже матричной декларации данных о том, где я потерялся.

//#define ROW_EFFIN_MAJOR
union {
    struct {
#ifdef ROW_EFFIN_MAJOR
// Eat one of several nasty things, OpenGL :|
        float m11, m12, m13, m14,
                m21, m22, m23, m24,
                m31, m32, m33, m34,
                m41, m42, m43, m44;
#else
        float m11, m21, m31, m41,
                m12, m22, m32, m42,
                m13, m23, m33, m43,
                m14, m24, m34, m44;
#endif
    };
    float m[16];
    // Use at your own risk: m[1] COLUMNMAJOR is not the same as m[1] ROWMAJOR
    // Rows!
    union MatrixRow {
        struct {
            float r1, r2, r3, r4;
        };
        float r[4];
    } row[4];
    // .... Columns...?
    union MatrixColumn {
        // TODO:
        // Set Union
        // Column Access ?
        // ???
        // Profit
    } col[???];
};

Любые советы, советы, рекомендации или даже помощь были бы хорошими.В идеале я хотел бы получить доступ к столбцам по col [0] .c1 или просто по col [0] .c (c - это число с плавающей точкой [4]).Однако, если этот идеал должен быть убит за большую справедливость доступа к столбцам (хотя, склоняясь к не-функции, потому что я могу сделать это с помощью специальной структуры и функции. Это просто менее удобно и немного медленнее, чем доступданные напрямую через члена данных).

Я потратил немало времени, пытаясь связать это с google-fu, но я не могу понять, как создать несмежный союз.

1 Ответ

2 голосов
/ 07 декабря 2011

Как отметил Марсело, C ++ не является ни мажорной строкой, ни мажорной строкой.Это именно то, что вы вкладываете в это.Если вы называете первые четыре значения в массиве float «столбцом», это нормально.Если вы называете это «строкой», это тоже хорошо.

В общем, вы не должны переключаться между соглашениями.Не развивайте структуры, которые могут сделать «оба»;просто выберите сторону и придерживайтесь ее.Если вы сделаете свои матрицы мажорными, то они будут мажорными.Когда вы загружаете их в OpenGL, вы можете либо вручную транспонировать их, либо просто передать GL_TRUE для параметра «transpose» glUniformMatrix.

Подробнее доступны .

...