On Monday, 31 August 2015 at 05:38:54 UTC, Jonathan M Davis wrote:
So, you're going to need to pass it a Chameleon!(float, purpose.POSITIONAL) and a Chameleon!(float, purpose.COLOR_ONLY color), not 6 doubles - either that, or you're going to need to declare a constructor for VertexData which takes 6 doubles or floats and converts them to what's require to assign to its member variables.

- Jonathan M Davis

Or turn Chameleon into a mixin template.

enum Purpose { POSITIONAL, COLOR_ONLY, COLOR_AND_ALPHA, GENERIC_TRIPLE, GENERIC_QUAD }
Purpose purpose;

mixin template Chameleon(T, Purpose p) // mixin template
{
static if (p == Purpose.POSITIONAL) { // <-- NOT is expression
        T  x, y, z;
    } else static if (p == Purpose.COLOR_ONLY) {
        T  r, g, b;
    } else static if (p == Purpose.COLOR_AND_ALPHA) {
        T  r, g, b, a;
    }  else static if (p == Purpose.GENERIC_TRIPLE) {
        T  a, b, c;
    } else static if (p == Purpose.GENERIC_QUAD) {
        T  a, b, c, d;
    }
};

struct VertexData
{
  mixin Chameleon!(float, purpose.POSITIONAL) position;
  mixin Chameleon!(float, purpose.COLOR_ONLY) color;
}

alias Vert = VertexData;

VertexData[] vertices =
[
    Vert(1.0f, 1.0f, 1.0f, 0.0, 0.0, 0.0),
];

void main()
{}

Reply via email to