
/*
 * Macros used in this file:
 * NAME(x) 	Name of the function
 * TYPE 	Type to use
 * TYPEIDX 	Type constant (FLAG_BYTE, FLAG_UBYTE, etc)
 */

#define thisvertex context->VertexBuffer[context->VertexBufferPointer]

static void NAME(vertex_element_2)(GLcontext context, struct GLarray_t *array, GLuint i, GLuint unit)
{
	TYPE *cur = (TYPE *)((uint8 *)array->pointer + array->stride * i);

	context->Self->GLVertex4f((GLfloat)cur[0], (GLfloat)cur[1], 0.0, 1.0);
};

static void NAME(vertex_element_3)(GLcontext context, struct GLarray_t *array, GLuint i, GLuint unit)
{
	TYPE *cur = (TYPE *)((uint8 *)array->pointer + array->stride * i);

	context->Self->GLVertex4f((GLfloat)cur[0], (GLfloat)cur[1], (GLfloat)cur[2], 1.0);
};

static void NAME(vertex_element_4)(GLcontext context, struct GLarray_t *array, GLuint i, GLuint unit)
{
	TYPE *cur = (TYPE *)((uint8 *)array->pointer + array->stride * i);

	context->Self->GLVertex4f((GLfloat)cur[0], (GLfloat)cur[1], (GLfloat)cur[2], (GLfloat)cur[3]);
};

static void NAME(vertex_fetch_2)(GLcontext context, struct GLarray_t *array, GLvoid *pos, GLuint unit)
{
 	TYPE *cur = (TYPE *)pos;

 	thisvertex.object.x = (GLfloat)cur[0];
 	thisvertex.object.y = (GLfloat)cur[1];
 	thisvertex.object.z = 0.0;
 	thisvertex.object.w = 1.0;
}

static void NAME(vertex_fetch_3)(GLcontext context, struct GLarray_t *array, GLvoid *pos, GLuint unit)
{
	TYPE *cur = (TYPE *)pos;
	
	thisvertex.object.x = (GLfloat)cur[0];
	thisvertex.object.y = (GLfloat)cur[1];
	thisvertex.object.z = (GLfloat)cur[2];
	thisvertex.object.w = 1.0;
}

static void NAME(vertex_fetch_4)(GLcontext context, struct GLarray_t *array, GLvoid *pos, GLuint unit)
{
	TYPE *cur = (TYPE *)pos;
	
	thisvertex.object.x = (GLfloat)cur[0];
	thisvertex.object.y = (GLfloat)cur[1];
	thisvertex.object.z = (GLfloat)cur[2];
	thisvertex.object.w = (GLfloat)cur[3];
}

static void NAME(vertex_fetch_idx_2)(GLcontext context, struct GLarray_t *array, GLuint i, GLuint unit)
{
 	TYPE *cur = (TYPE *)((uint8 *)array->pointer + array->stride * i);

 	thisvertex.object.x = (GLfloat)cur[0];
 	thisvertex.object.y = (GLfloat)cur[1];
	thisvertex.object.z = 0.0;
	thisvertex.object.w = 1.0;
}

static void NAME(vertex_fetch_idx_3)(GLcontext context, struct GLarray_t *array, GLuint i, GLuint unit)
{
	TYPE *cur = (TYPE *)((uint8 *)array->pointer + array->stride * i);
	
	thisvertex.object.x = (GLfloat)cur[0];
	thisvertex.object.y = (GLfloat)cur[1];
	thisvertex.object.z = (GLfloat)cur[2];
	thisvertex.object.w = 1.0;
}

static void NAME(vertex_fetch_idx_4)(GLcontext context, struct GLarray_t *array, GLuint i, GLuint unit)
{
	TYPE *cur = (TYPE *)((uint8 *)array->pointer + array->stride * i);
	
	thisvertex.object.x = (GLfloat)cur[0];
	thisvertex.object.y = (GLfloat)cur[1];
	thisvertex.object.z = (GLfloat)cur[2];
	thisvertex.object.w = (GLfloat)cur[3];
}

static void NAME(vertex_init)(void)
{
    vertex_fetchElement[TYPEIDX|FLAG_2] = NAME(vertex_element_2);
	vertex_fetchElement[TYPEIDX|FLAG_3] = NAME(vertex_element_3);
	vertex_fetchElement[TYPEIDX|FLAG_4] = NAME(vertex_element_4);
    vertex_fetch[TYPEIDX|FLAG_2] = NAME(vertex_fetch_2);
	vertex_fetch[TYPEIDX|FLAG_3] = NAME(vertex_fetch_3);
	vertex_fetch[TYPEIDX|FLAG_4] = NAME(vertex_fetch_4);
    vertex_fetchIdx[TYPEIDX|FLAG_2] = NAME(vertex_fetch_idx_2);
	vertex_fetchIdx[TYPEIDX|FLAG_3] = NAME(vertex_fetch_idx_3);
	vertex_fetchIdx[TYPEIDX|FLAG_4] = NAME(vertex_fetch_idx_4);
}


#undef NAME
#undef TYPE
#undef TYPEIDX
#undef thisvertex
