
/*
 * 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(color_element_3)(GLcontext context, struct GLarray_t *array, GLuint i, GLuint unit)
{
	TYPE *cur = (TYPE *)((uint8 *)array->pointer + array->stride * i);
#ifdef DIVIDE
	float oneoverdiv = 1.0/DIVIDE;
	context->current.CurrentColor.r = (GLfloat)cur[0] * oneoverdiv;
	context->current.CurrentColor.g = (GLfloat)cur[1] * oneoverdiv;
	context->current.CurrentColor.b = (GLfloat)cur[2] * oneoverdiv;
	context->current.CurrentColor.a = 1.0;
#else
	context->current.CurrentColor.r = (GLfloat)cur[0];
	context->current.CurrentColor.g = (GLfloat)cur[1];
	context->current.CurrentColor.b = (GLfloat)cur[2];
	context->current.CurrentColor.a = 1.0;
#endif
#ifdef MGL_USE_LIGHTING
	if (context->enable.ColorMaterial)
		light_UpdateColorMaterial(context);
#endif	
};

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

#ifdef DIVIDE
	float oneoverdiv = 1.0/DIVIDE;
	context->current.CurrentColor.r = (GLfloat)cur[0] * oneoverdiv;
	context->current.CurrentColor.g = (GLfloat)cur[1] * oneoverdiv;
	context->current.CurrentColor.b = (GLfloat)cur[2] * oneoverdiv;
	context->current.CurrentColor.a = (GLfloat)cur[3] * oneoverdiv;
#else
	context->current.CurrentColor.r = (GLfloat)cur[0];
	context->current.CurrentColor.g = (GLfloat)cur[1];
	context->current.CurrentColor.b = (GLfloat)cur[2];
	context->current.CurrentColor.a = (GLfloat)cur[3];
#endif
#ifdef MGL_USE_LIGHTING
	if (context->enable.ColorMaterial)
		light_UpdateColorMaterial(context);
#endif	
};

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

#ifdef DIVIDE	
	float oneoverdiv = 1.0/DIVIDE;
	thisvertex.r = (GLfloat)cur[0] * oneoverdiv;
	thisvertex.g = (GLfloat)cur[1] * oneoverdiv;
	thisvertex.b = (GLfloat)cur[2] * oneoverdiv;
	thisvertex.a = 1.0;
#else
	thisvertex.r = (GLfloat)cur[0];
	thisvertex.g = (GLfloat)cur[1];
	thisvertex.b = (GLfloat)cur[2];
	thisvertex.a = 1.0;
#endif
#ifdef MGL_USE_LIGHTING
	if (context->enable.ColorMaterial)
		light_UpdateColorMaterialVertex(context);
#endif	
}

static void NAME(color_fetch_4)(GLcontext context, struct GLarray_t *array, GLvoid *pos, GLuint unit)
{
	TYPE *cur = (TYPE *)pos;
	
#ifdef DIVIDE
	float oneoverdiv = 1.0/DIVIDE;
	thisvertex.r = (GLfloat)cur[0] * oneoverdiv;
	thisvertex.g = (GLfloat)cur[1] * oneoverdiv;
	thisvertex.b = (GLfloat)cur[2] * oneoverdiv;
	thisvertex.a = (GLfloat)cur[3] * oneoverdiv;
#else
	thisvertex.r = (GLfloat)cur[0];
	thisvertex.g = (GLfloat)cur[1];
	thisvertex.b = (GLfloat)cur[2];
	thisvertex.a = (GLfloat)cur[3];
#endif
#ifdef MGL_USE_LIGHTING
	if (context->enable.ColorMaterial)
		light_UpdateColorMaterialVertex(context);
#endif	
}

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

#ifdef DIVIDE
	float oneoverdiv = 1.0/DIVIDE;
	thisvertex.r = (GLfloat)cur[0] * oneoverdiv;
	thisvertex.g = (GLfloat)cur[1] * oneoverdiv;
	thisvertex.b = (GLfloat)cur[2] * oneoverdiv;
	thisvertex.a = 1.0;
#else
	thisvertex.r = (GLfloat)cur[0];
	thisvertex.g = (GLfloat)cur[1];
	thisvertex.b = (GLfloat)cur[2];
	thisvertex.a = 1.0;
#endif
#ifdef MGL_USE_LIGHTING
	if (context->enable.ColorMaterial)
		light_UpdateColorMaterialVertex(context);
#endif	
}
	
static void NAME(color_fetch_idx_4)(GLcontext context, struct GLarray_t *array, GLuint i, GLuint unit)
{
	TYPE *cur = (TYPE *)((uint8 *)array->pointer + array->stride * i);
	
#ifdef DIVIDE
	float oneoverdiv = 1.0/DIVIDE;
	thisvertex.r = (GLfloat)cur[0] * oneoverdiv;
	thisvertex.g = (GLfloat)cur[1] * oneoverdiv;
	thisvertex.b = (GLfloat)cur[2] * oneoverdiv;
	thisvertex.a = (GLfloat)cur[3] * oneoverdiv;
#else
	thisvertex.r = (GLfloat)cur[0];
	thisvertex.g = (GLfloat)cur[1];
	thisvertex.b = (GLfloat)cur[2];
	thisvertex.a = (GLfloat)cur[3];
#endif
#ifdef MGL_USE_LIGHTING
	if (context->enable.ColorMaterial)
		light_UpdateColorMaterialVertex(context);
#endif	
}

static void NAME(color_init)(void)
{
	color_fetchElement[TYPEIDX|FLAG_3] = NAME(color_element_3);
	color_fetchElement[TYPEIDX|FLAG_4] = NAME(color_element_4);
	color_fetch[TYPEIDX|FLAG_3] = NAME(color_fetch_3);
	color_fetch[TYPEIDX|FLAG_4] = NAME(color_fetch_4);
	color_fetchIdx[TYPEIDX|FLAG_3] = NAME(color_fetch_idx_3);
	color_fetchIdx[TYPEIDX|FLAG_4] = NAME(color_fetch_idx_4);
}


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