
/*
 * 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(texture_element_1)(GLcontext context, struct GLarray_t *array, GLuint i, GLuint unit)
{
	TYPE *cur = (TYPE *)((uint8 *)array->pointer + array->stride * i);

	context->current.CurTexS[unit] 		= (GLfloat)cur[0];
	context->current.CurTexT[unit] 		= 0.0;
	context->current.CurTexQ[unit] 		= 1.0;
	context->current.CurTexQValid[unit]	= GL_FALSE;
};

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

	context->current.CurTexS[unit] 		= (GLfloat)cur[0];
	context->current.CurTexT[unit] 		= (GLfloat)cur[1];
	context->current.CurTexQ[unit] 		= 1.0;
	context->current.CurTexQValid[unit]	= GL_FALSE;
};

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

	/* r coordinate is ignored */
	context->current.CurTexS[unit] 		= (GLfloat)cur[0];
	context->current.CurTexT[unit] 		= (GLfloat)cur[1];
	context->current.CurTexQ[unit] 		= 1.0;
	context->current.CurTexQValid[unit]	= GL_FALSE;
};

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

	/* r coordinate is ignored */
	context->current.CurTexS[unit] 		= (GLfloat)cur[0];
	context->current.CurTexT[unit] 		= (GLfloat)cur[1];
	context->current.CurTexQ[unit] 		= (GLfloat)cur[3];
	context->current.CurTexQValid[unit]	= GL_TRUE;
};

static void NAME(texture_fetch_1)(GLcontext context, struct GLarray_t *array, GLvoid *pos, GLuint unit)
{
	TYPE *cur = (TYPE *)pos;			
			
	if (context->enable.Texture2D[unit] == GL_TRUE || context->enable.Texture1D[unit] == GL_TRUE )
	{
		thisvertex.uvw[unit].u = (GLfloat)cur[0];
		thisvertex.uvw[unit].v = 0.0;
		thisvertex.uvw[unit].w = 1.0;
		thisvertex.rhw_valid[unit] = GL_FALSE;
	}
}

static void NAME(texture_fetch_2)(GLcontext context, struct GLarray_t *array, GLvoid *pos, GLuint unit)
{
	TYPE *cur = (TYPE *)pos;			
			
	if (context->enable.Texture2D[unit] == GL_TRUE || context->enable.Texture1D[unit] == GL_TRUE )
	{
		thisvertex.uvw[unit].u = (GLfloat)cur[0];
		thisvertex.uvw[unit].v = (GLfloat)cur[1];
		thisvertex.uvw[unit].w = 1.0;
		thisvertex.rhw_valid[unit] = GL_FALSE;
	}
}

static void NAME(texture_fetch_3)(GLcontext context, struct GLarray_t *array, GLvoid *pos, GLuint unit)
{
	TYPE *cur = (TYPE *)pos;			
			
	if (context->enable.Texture2D[unit] == GL_TRUE || context->enable.Texture1D[unit] == GL_TRUE )
	{
		thisvertex.uvw[unit].u = (GLfloat)cur[0];
		thisvertex.uvw[unit].v = (GLfloat)cur[1];
		thisvertex.uvw[unit].w = 1.0;
		thisvertex.rhw_valid[unit] = GL_FALSE;
	}
}

static void NAME(texture_fetch_4)(GLcontext context, struct GLarray_t *array, GLvoid *pos, GLuint unit)
{
	TYPE *cur = (TYPE *)pos;			
			
	if (context->enable.Texture2D[unit] == GL_TRUE || context->enable.Texture1D[unit] == GL_TRUE )
	{
		thisvertex.uvw[unit].u = (GLfloat)cur[0]/(GLfloat)cur[3];
		thisvertex.uvw[unit].v = (GLfloat)cur[1]/(GLfloat)cur[3];
		thisvertex.uvw[unit].w = (GLfloat)cur[3];
		thisvertex.rhw_valid[unit] = GL_TRUE;
	}
}

static void NAME(texture_fetch_idx_1)(GLcontext context, struct GLarray_t *array, GLuint i, GLuint unit)
{
	TYPE *cur = (TYPE *)((uint8 *)array->pointer + array->stride * i);
	
	if (context->enable.Texture2D[unit] == GL_TRUE || context->enable.Texture1D[unit] == GL_TRUE )
	{
		thisvertex.uvw[unit].u = (GLfloat)cur[0];
		thisvertex.uvw[unit].v = 0.0;
		thisvertex.uvw[unit].w = 1.0;
		thisvertex.rhw_valid[unit] = GL_FALSE;
	}
}

static void NAME(texture_fetch_idx_2)(GLcontext context, struct GLarray_t *array, GLuint i, GLuint unit)
{
	TYPE *cur = (TYPE *)((uint8 *)array->pointer + array->stride * i);
	
	if (context->enable.Texture2D[unit] == GL_TRUE || context->enable.Texture1D[unit] == GL_TRUE )
	{
		thisvertex.uvw[unit].u = (GLfloat)cur[0];
		thisvertex.uvw[unit].v = (GLfloat)cur[1];
		thisvertex.uvw[unit].w = 1.0;
		thisvertex.rhw_valid[unit] = GL_FALSE;
	}
}

static void NAME(texture_fetch_idx_3)(GLcontext context, struct GLarray_t *array, GLuint i, GLuint unit)
{
	TYPE *cur = (TYPE *)((uint8 *)array->pointer + array->stride * i);
	
	if (context->enable.Texture2D[unit] == GL_TRUE || context->enable.Texture1D[unit] == GL_TRUE )
	{
		thisvertex.uvw[unit].u = (GLfloat)cur[0];
		thisvertex.uvw[unit].v = (GLfloat)cur[1];
		thisvertex.uvw[unit].w = 1.0;
		thisvertex.rhw_valid[unit] = GL_FALSE;
	}
}

static void NAME(texture_fetch_idx_4)(GLcontext context, struct GLarray_t *array, GLuint i, GLuint unit)
{
	TYPE *cur = (TYPE *)((uint8 *)array->pointer + array->stride * i);
			
	if (context->enable.Texture2D[unit] == GL_TRUE || context->enable.Texture1D[unit] == GL_TRUE )
	{
		thisvertex.uvw[unit].u = (GLfloat)cur[0]/(GLfloat)cur[3];
		thisvertex.uvw[unit].v = (GLfloat)cur[1]/(GLfloat)cur[3];
		thisvertex.uvw[unit].w = (GLfloat)cur[3];
		thisvertex.rhw_valid[unit] = GL_TRUE;
	}
}

static void NAME(texture_init)(void)
{
	texture_fetchElement[TYPEIDX|FLAG_1] = NAME(texture_element_1);
	texture_fetchElement[TYPEIDX|FLAG_2] = NAME(texture_element_2);
	texture_fetchElement[TYPEIDX|FLAG_3] = NAME(texture_element_3);
	texture_fetchElement[TYPEIDX|FLAG_4] = NAME(texture_element_4);
	texture_fetch[TYPEIDX|FLAG_1] = NAME(texture_fetch_1);
	texture_fetch[TYPEIDX|FLAG_2] = NAME(texture_fetch_2);
	texture_fetch[TYPEIDX|FLAG_3] = NAME(texture_fetch_3);
	texture_fetch[TYPEIDX|FLAG_4] = NAME(texture_fetch_4);
	texture_fetchIdx[TYPEIDX|FLAG_1] = NAME(texture_fetch_idx_1);
	texture_fetchIdx[TYPEIDX|FLAG_2] = NAME(texture_fetch_idx_2);
	texture_fetchIdx[TYPEIDX|FLAG_3] = NAME(texture_fetch_idx_3);
	texture_fetchIdx[TYPEIDX|FLAG_4] = NAME(texture_fetch_idx_4);
}


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