/*
 * $Id$
 *
 * $Date$
 * $Revision$
 *
 * (C) 1999 by Hyperion
 * All rights reserved
 *
 * This file is part of the MiniGL library project
 * See the file Licence.txt for more details
 *
 */
	
	
#ifdef _IS_ENABLED_ONLY
GLboolean GET_FUNCNAME()(struct GLContextIFace *Self, GLenum value)
{
	GLboolean result;
	GLboolean *data = &result;
#else	
void GET_FUNCNAME()(struct GLContextIFace *Self, GLenum value, GET_TYPE *data)
{
#endif

	GLcontext context = GET_INSTANCE(Self);
	uint32 tmu = context->texture.ActiveTexture;
	uint32 ctmu = context->vertex_array.ClientActiveTexture;
	Matrix *m;
	
	switch (value)
	{
		case GL_CURRENT_COLOR:
			*data ++ = FROM_COLOR(context->current.CurrentColor.r);
			*data ++ = FROM_COLOR(context->current.CurrentColor.g);
			*data ++ = FROM_COLOR(context->current.CurrentColor.b);
			*data ++ = FROM_COLOR(context->current.CurrentColor.a);
			break;
		
		case GL_CURRENT_SECONDARY_COLOR:
			break;				/* FIXME */
			
		case GL_CURRENT_INDEX:
			break;				/* FIXME */
			
		case GL_CURRENT_TEXTURE_COORDS:
			*data ++ = FROM_FLOAT(context->current.CurTexS[tmu]);
			*data ++ = FROM_FLOAT(context->current.CurTexT[tmu]);
			*data ++ = FROM_FLOAT(0.0);			/* Always 0 */
			if (context->current.CurTexQValid[tmu])
				*data ++ = FROM_FLOAT(context->current.CurTexQ[tmu]);
			else
				*data ++ = FROM_FLOAT(1.0);
			break;
			
		case GL_CURRENT_NORMAL:
			*data ++ = FROM_FLOAT(context->current.CurrentNormal.x);
			*data ++ = FROM_FLOAT(context->current.CurrentNormal.y);
			*data ++ = FROM_FLOAT(context->current.CurrentNormal.z);
			break;
			
		case GL_CURRENT_FOG_COORD:
			*data ++ = FROM_FLOAT(context->current.CurrentFogDepth);
			break;
			
		case GL_CURRENT_RASTER_POSITION:
			*data ++ = FROM_FLOAT(context->current.RasterPos.x);
			*data ++ = FROM_FLOAT(context->current.RasterPos.y);
			*data ++ = FROM_FLOAT(context->current.RasterPos.z);
			*data ++ = FROM_FLOAT(context->current.RasterPos.w);
			break;
		
		case GL_CURRENT_RASTER_DISTANCE:
			*data ++ = FROM_FLOAT(context->current.RasterDistance);
			break;
			
		case GL_CURRENT_RASTER_COLOR:
			*data ++ = FROM_COLOR(context->current.RasterColor.r);
			*data ++ = FROM_COLOR(context->current.RasterColor.g);
			*data ++ = FROM_COLOR(context->current.RasterColor.b);
			*data ++ = FROM_COLOR(context->current.RasterColor.a);
			break;
		
		case GL_CURRENT_RASTER_INDEX:
			break;			/* FIXME */
			
		case GL_CURRENT_RASTER_TEXTURE_COORDS:
			*data ++ = FROM_FLOAT(context->current.RasterTexCoords[tmu].u);
			*data ++ = FROM_FLOAT(context->current.RasterTexCoords[tmu].v);
			*data ++ = FROM_FLOAT(0.0);			/* Always 0 */
			*data ++ = FROM_FLOAT(context->current.RasterTexCoords[tmu].w);
			break;
		
		case GL_CURRENT_RASTER_POSITION_VALID:
			*data ++ = FROM_BOOL(context->current.RasterPosValid);
			break;
		
		case GL_EDGE_FLAG:
			break;			/* FIXME */
		
		case GL_CLIENT_ACTIVE_TEXTURE:
			*data ++ = FROM_INT(context->vertex_array.ClientActiveTexture);
			break;
			
		case GL_VERTEX_ARRAY:
			*data ++ = FROM_BOOL(context->vertex_array.ClientState & GLCS_VERTEX 
						? GL_TRUE : GL_FALSE);
			break;
			
		case GL_VERTEX_ARRAY_SIZE:
			*data ++ = FROM_INT(context->vertex_array.VertexArray.size);
			break;
			
		case GL_VERTEX_ARRAY_TYPE:
			*data ++ = FROM_INT(context->vertex_array.VertexArray.type);
			break;
			
		case GL_VERTEX_ARRAY_STRIDE:
			*data ++ = FROM_INT(context->vertex_array.VertexArray.stride);
			break;
			
		case GL_VERTEX_ARRAY_POINTER:
			*data ++ = FROM_INT((GLint)context->vertex_array.VertexArray.pointer);
			break;
			
		case GL_NORMAL_ARRAY:
			*data ++ = FROM_BOOL(context->vertex_array.ClientState & GLCS_NORMAL 
						? GL_TRUE : GL_FALSE);
			break;

		case GL_NORMAL_ARRAY_TYPE:
			*data ++ = FROM_INT(context->vertex_array.NormalArray.type);
			break;
			
		case GL_NORMAL_ARRAY_STRIDE:
			*data ++ = FROM_INT(context->vertex_array.NormalArray.stride);
			break;
			
		case GL_NORMAL_ARRAY_POINTER:
			*data ++ = FROM_INT((GLint)context->vertex_array.NormalArray.pointer);
			break;
			
		case GL_FOG_COORD_ARRAY:
		case GL_FOG_COORD_ARRAY_TYPE:
		case GL_FOG_COORD_ARRAY_STRIDE:
		case GL_FOG_COORD_ARRAY_POINTER:
			*data ++ = FROM_BOOL(GL_FALSE);
			break;			/* FIXME */
					
		case GL_COLOR_ARRAY:
			*data ++ = FROM_BOOL(context->vertex_array.ClientState & GLCS_COLOR 
						? GL_TRUE : GL_FALSE);
			break;
			
		case GL_COLOR_ARRAY_SIZE:
			*data ++ = FROM_INT(context->vertex_array.ColorArray.size);
			break;
			
		case GL_COLOR_ARRAY_TYPE:
			*data ++ = FROM_INT(context->vertex_array.ColorArray.type);
			break;
			
		case GL_COLOR_ARRAY_STRIDE:
			*data ++ = FROM_INT(context->vertex_array.ColorArray.stride);
			break;
			
		case GL_COLOR_ARRAY_POINTER:
			*data ++ = FROM_INT((GLint)context->vertex_array.ColorArray.pointer);
			break;
			
		case GL_SECONDARY_COLOR_ARRAY:
		case GL_SECONDARY_COLOR_ARRAY_SIZE:
		case GL_SECONDARY_COLOR_ARRAY_TYPE:
		case GL_SECONDARY_COLOR_ARRAY_STRIDE:
		case GL_SECONDARY_COLOR_ARRAY_POINTER:
			*data ++ = FROM_BOOL(GL_FALSE);
			break;				/* FIXME */
			
		case GL_INDEX_ARRAY:
		case GL_INDEX_ARRAY_TYPE:
		case GL_INDEX_ARRAY_STRIDE:
		case GL_INDEX_ARRAY_POINTER:
			*data ++ = FROM_BOOL(GL_FALSE);
			break;				/* FIXME */
			
		case GL_TEXTURE_COORD_ARRAY:
			*data ++ = FROM_BOOL((context->vertex_array.ClientState 
								& client_texture_state[ctmu]) 
							? GL_TRUE : GL_FALSE);
			break;
		
		case GL_TEXTURE_COORD_ARRAY_SIZE:
			*data ++ = FROM_INT(context->vertex_array.TexCoordArray[tmu].size);
			break;
		
		case GL_TEXTURE_COORD_ARRAY_TYPE:
			*data ++ = FROM_INT(context->vertex_array.TexCoordArray[tmu].type);
			break;
			
		case GL_TEXTURE_COORD_ARRAY_STRIDE:
			*data ++ = FROM_INT(context->vertex_array.TexCoordArray[tmu].stride);
			break;
		
		case GL_TEXTURE_COORD_ARRAY_POINTER:
			*data ++ = FROM_INT((GLint)context->vertex_array.TexCoordArray[tmu].pointer);
			break;
			
		case GL_EDGE_FLAG_ARRAY:
		case GL_EDGE_FLAG_ARRAY_STRIDE:
		case GL_EDGE_FLAG_ARRAY_POINTER:
			*data ++ = FROM_BOOL(GL_FALSE);
			break;				/* FIXME */
			
		case GL_MODELVIEW_MATRIX:
			m = &context->ModelViewStack[context->ModelViewStackPointer];
			*data ++ = FROM_FLOAT(m->v[OF_11]);
			*data ++ = FROM_FLOAT(m->v[OF_21]);
			*data ++ = FROM_FLOAT(m->v[OF_31]);
			*data ++ = FROM_FLOAT(m->v[OF_41]);
			*data ++ = FROM_FLOAT(m->v[OF_12]);
			*data ++ = FROM_FLOAT(m->v[OF_22]);
			*data ++ = FROM_FLOAT(m->v[OF_23]);
			*data ++ = FROM_FLOAT(m->v[OF_24]);
			*data ++ = FROM_FLOAT(m->v[OF_31]);
			*data ++ = FROM_FLOAT(m->v[OF_32]);
			*data ++ = FROM_FLOAT(m->v[OF_33]);
			*data ++ = FROM_FLOAT(m->v[OF_34]);
			*data ++ = FROM_FLOAT(m->v[OF_41]);
			*data ++ = FROM_FLOAT(m->v[OF_42]);
			*data ++ = FROM_FLOAT(m->v[OF_43]);
			*data ++ = FROM_FLOAT(m->v[OF_44]);
			break;
			
		case GL_TRANSPOSE_MODELVIEW_MATRIX:
			m = &context->ModelViewStack[context->ModelViewStackPointer];
			*data ++ = FROM_FLOAT(m->v[OF_11]);
			*data ++ = FROM_FLOAT(m->v[OF_12]);
			*data ++ = FROM_FLOAT(m->v[OF_13]);
			*data ++ = FROM_FLOAT(m->v[OF_14]);
			*data ++ = FROM_FLOAT(m->v[OF_21]);
			*data ++ = FROM_FLOAT(m->v[OF_22]);
			*data ++ = FROM_FLOAT(m->v[OF_32]);
			*data ++ = FROM_FLOAT(m->v[OF_42]);
			*data ++ = FROM_FLOAT(m->v[OF_13]);
			*data ++ = FROM_FLOAT(m->v[OF_23]);
			*data ++ = FROM_FLOAT(m->v[OF_33]);
			*data ++ = FROM_FLOAT(m->v[OF_43]);
			*data ++ = FROM_FLOAT(m->v[OF_14]);
			*data ++ = FROM_FLOAT(m->v[OF_24]);
			*data ++ = FROM_FLOAT(m->v[OF_34]);
			*data ++ = FROM_FLOAT(m->v[OF_44]);
			break;	
			
		case GL_PROJECTION_MATRIX:
			m = &context->ProjectionStack[context->ProjectionStackPointer];
			*data ++ = FROM_FLOAT(m->v[OF_11]);
			*data ++ = FROM_FLOAT(m->v[OF_21]);
			*data ++ = FROM_FLOAT(m->v[OF_31]);
			*data ++ = FROM_FLOAT(m->v[OF_41]);
			*data ++ = FROM_FLOAT(m->v[OF_12]);
			*data ++ = FROM_FLOAT(m->v[OF_22]);
			*data ++ = FROM_FLOAT(m->v[OF_23]);
			*data ++ = FROM_FLOAT(m->v[OF_24]);
			*data ++ = FROM_FLOAT(m->v[OF_31]);
			*data ++ = FROM_FLOAT(m->v[OF_32]);
			*data ++ = FROM_FLOAT(m->v[OF_33]);
			*data ++ = FROM_FLOAT(m->v[OF_34]);
			*data ++ = FROM_FLOAT(m->v[OF_41]);
			*data ++ = FROM_FLOAT(m->v[OF_42]);
			*data ++ = FROM_FLOAT(m->v[OF_43]);
			*data ++ = FROM_FLOAT(m->v[OF_44]);
			break;
			
		case GL_TRANSPOSE_PROJECTION_MATRIX:
			m = &context->ProjectionStack[context->ProjectionStackPointer];
			*data ++ = FROM_FLOAT(m->v[OF_11]);
			*data ++ = FROM_FLOAT(m->v[OF_12]);
			*data ++ = FROM_FLOAT(m->v[OF_13]);
			*data ++ = FROM_FLOAT(m->v[OF_14]);
			*data ++ = FROM_FLOAT(m->v[OF_21]);
			*data ++ = FROM_FLOAT(m->v[OF_22]);
			*data ++ = FROM_FLOAT(m->v[OF_32]);
			*data ++ = FROM_FLOAT(m->v[OF_42]);
			*data ++ = FROM_FLOAT(m->v[OF_13]);
			*data ++ = FROM_FLOAT(m->v[OF_23]);
			*data ++ = FROM_FLOAT(m->v[OF_33]);
			*data ++ = FROM_FLOAT(m->v[OF_43]);
			*data ++ = FROM_FLOAT(m->v[OF_14]);
			*data ++ = FROM_FLOAT(m->v[OF_24]);
			*data ++ = FROM_FLOAT(m->v[OF_34]);
			*data ++ = FROM_FLOAT(m->v[OF_44]);
			break;
			
		case GL_TEXTURE_MATRIX:
			m = &context->TextureStack[context->TextureStackPointer[tmu]][tmu];
			*data ++ = FROM_FLOAT(m->v[OF_11]);
			*data ++ = FROM_FLOAT(m->v[OF_21]);
			*data ++ = FROM_FLOAT(m->v[OF_31]);
			*data ++ = FROM_FLOAT(m->v[OF_41]);
			*data ++ = FROM_FLOAT(m->v[OF_12]);
			*data ++ = FROM_FLOAT(m->v[OF_22]);
			*data ++ = FROM_FLOAT(m->v[OF_23]);
			*data ++ = FROM_FLOAT(m->v[OF_24]);
			*data ++ = FROM_FLOAT(m->v[OF_31]);
			*data ++ = FROM_FLOAT(m->v[OF_32]);
			*data ++ = FROM_FLOAT(m->v[OF_33]);
			*data ++ = FROM_FLOAT(m->v[OF_34]);
			*data ++ = FROM_FLOAT(m->v[OF_41]);
			*data ++ = FROM_FLOAT(m->v[OF_42]);
			*data ++ = FROM_FLOAT(m->v[OF_43]);
			*data ++ = FROM_FLOAT(m->v[OF_44]);
			break;
			
		case GL_TRANSPOSE_TEXTURE_MATRIX:
			m = &context->TextureStack[context->TextureStackPointer[tmu]][tmu];
			*data ++ = FROM_FLOAT(m->v[OF_11]);
			*data ++ = FROM_FLOAT(m->v[OF_12]);
			*data ++ = FROM_FLOAT(m->v[OF_13]);
			*data ++ = FROM_FLOAT(m->v[OF_14]);
			*data ++ = FROM_FLOAT(m->v[OF_21]);
			*data ++ = FROM_FLOAT(m->v[OF_22]);
			*data ++ = FROM_FLOAT(m->v[OF_32]);
			*data ++ = FROM_FLOAT(m->v[OF_42]);
			*data ++ = FROM_FLOAT(m->v[OF_13]);
			*data ++ = FROM_FLOAT(m->v[OF_23]);
			*data ++ = FROM_FLOAT(m->v[OF_33]);
			*data ++ = FROM_FLOAT(m->v[OF_43]);
			*data ++ = FROM_FLOAT(m->v[OF_14]);
			*data ++ = FROM_FLOAT(m->v[OF_24]);
			*data ++ = FROM_FLOAT(m->v[OF_34]);
			*data ++ = FROM_FLOAT(m->v[OF_44]);
			break;
		
		case GL_VIEWPORT:
			*data ++ = FROM_INT(context->viewport.x);
			*data ++ = FROM_INT(context->viewport.y);
			*data ++ = FROM_INT(context->viewport.w);
			*data ++ = FROM_INT(context->viewport.h);
			break;
		
		case GL_DEPTH_RANGE:
			*data ++ = FROM_FLOAT(context->viewport.near);
			*data ++ = FROM_FLOAT(context->viewport.far);
			break;
			
		case GL_MODELVIEW_STACK_DEPTH:
			*data ++ = FROM_INT(context->ModelViewStackPointer);
			break;
			
		case GL_PROJECTION_STACK_DEPTH:
			*data ++ = FROM_INT(context->ProjectionStackPointer);
			break;
			
		case GL_TEXTURE_STACK_DEPTH:
			*data ++ = FROM_INT(context->TextureStackPointer[tmu]);
			break;

		case GL_MATRIX_MODE:
			*data ++ = FROM_INT(context->transform.CurrentMatrixMode);
			break;
		
		case GL_NORMALIZE:
			*data ++ = FROM_BOOL(GL_FALSE);
			break;			/* FIXME */
		
		case GL_RESCALE_NORMAL:
			*data ++ = FROM_BOOL(GL_FALSE);
			break;			/* FIXME */
			
		case GL_CLIP_PLANE0:
		case GL_CLIP_PLANE1:
		case GL_CLIP_PLANE2:
		case GL_CLIP_PLANE3:
		case GL_CLIP_PLANE4:
		case GL_CLIP_PLANE5:
			*data ++ = FROM_BOOL(context->enable.ClipPlane[value-GL_CLIP_PLANE0]);
			break;

		case GL_FOG_COLOR:
			*data ++ = FROM_COLOR(context->fog.FogColor.r);
			*data ++ = FROM_COLOR(context->fog.FogColor.g);
			*data ++ = FROM_COLOR(context->fog.FogColor.b);
			*data ++ = FROM_COLOR(context->fog.FogColor.a);
			break;
			
		case GL_FOG_INDEX:
			break;			/* No index mode */
		
		case GL_FOG_DENSITY:
			*data ++ = FROM_FLOAT(context->fog.FogDensity);
			break;
			
		case GL_FOG_START:
			*data ++ = FROM_FLOAT(context->fog.FogStart);
			break;
			
		case GL_FOG_END:
			*data ++ = FROM_FLOAT(context->fog.FogEnd);
			break;
			
		case GL_FOG_MODE:
			*data ++ = FROM_FLOAT(context->fog.FogMode);
			break;
		
		case GL_FOG:
			*data ++ = FROM_BOOL(context->enable.Fog);
			break;
			
		case GL_COLOR_SUM:
			break;			/* FIXME */
			
		case GL_SHADE_MODEL:
			*data ++ = FROM_INT(context->lighting.ShadeModel);
			break;
		
		case GL_LIGHTING:
			*data ++ = FROM_BOOL(context->enable.Lighting);
			break;
		
		case GL_COLOR_MATERIAL:
			*data ++ = FROM_BOOL(context->enable.ColorMaterial);
			break;
		
		case GL_COLOR_MATERIAL_PARAMETER:
			*data ++ = FROM_INT(context->lighting.ColorMaterialParameter);
			break;
			
		case GL_COLOR_MATERIAL_FACE:
			*data ++ = FROM_INT(context->lighting.ColorMaterialFace);
			break;
		
		case GL_LIGHT_MODEL_AMBIENT:
			*data ++ = FROM_COLOR(context->lighting.LightModelAmbient.r);
			*data ++ = FROM_COLOR(context->lighting.LightModelAmbient.g);
			*data ++ = FROM_COLOR(context->lighting.LightModelAmbient.b);
			*data ++ = FROM_COLOR(context->lighting.LightModelAmbient.a);
			break;
		
		case GL_LIGHT_MODEL_LOCAL_VIEWER:
			*data ++ = FROM_BOOL(context->lighting.LightModelLocalViewer);
			break;
			
		case GL_LIGHT_MODEL_TWO_SIDE:
			*data ++ = FROM_BOOL(context->lighting.LightModelTwoSide);
			break;
			
		case GL_LIGHT_MODEL_COLOR_CONTROL:
			*data ++ = FROM_INT(context->lighting.LightModelColorControl);
			break;
			
		case GL_LIGHT0:
		case GL_LIGHT1:
		case GL_LIGHT2:
		case GL_LIGHT3:
		case GL_LIGHT4:
		case GL_LIGHT5:
		case GL_LIGHT6:
		case GL_LIGHT7:
			*data ++ = FROM_BOOL(context->enable.Light[value-GL_LIGHT0]);
			break;
		
		case GL_POINT_SIZE:
			*data ++ = FROM_FLOAT(context->point.PointSize);
			break;
			
		case GL_POINT_SMOOTH:
			*data ++ = FROM_BOOL(context->enable.PointSmooth);
			break;
		
		case GL_POINT_SIZE_MIN:
			*data ++ = FROM_FLOAT(0.0);
			break;				/* FIXME */
			
		case GL_POINT_SIZE_MAX:
			*data ++ = FROM_FLOAT(8.0);
			break;				/* FIXME */
/* -------------- ONLY ENABLES BEYOND THIS POINT ---------------------- */
/* FIXME: Add other state not required for second milestone */

		case GL_MAX_TEXTURE_UNITS:
			*data ++ = FROM_INT(context->NumTextureUnits);
			break;
		
		case GL_MAX_TEXTURE_SIZE:
			*data ++ = FROM_INT(IWarp3D->W3D_Query(context->w3dContext, W3D_Q_MAXTEXWIDTH, 0));
			break;

		case GL_LINE_SMOOTH:
			*data ++ = FROM_BOOL(context->enable.LineSmooth);
			break;
		
		case GL_LINE_STIPPLE:
			*data ++ = FROM_BOOL(context->enable.LineStipple);
			break;
			
		case GL_CULL_FACE:
			*data ++ = FROM_BOOL(context->enable.CullFace);
			break;
		
		case GL_POLYGON_SMOOTH:
			*data ++ = FROM_BOOL(context->enable.PolygonSmooth);
			break;
			
		case GL_POLYGON_OFFSET_LINE:
			*data ++ = FROM_BOOL(GL_FALSE);
			break;			/* FIXME */
		
		case GL_POLYGON_OFFSET_POINT:
			*data ++ = FROM_BOOL(GL_FALSE);
			break;
			
		case GL_POLYGON_OFFSET_FILL:
			*data ++ = FROM_BOOL(context->enable.PolygonOffsetFill);
			break;
		
		case GL_POLYGON_STIPPLE:
			*data ++ = FROM_BOOL(context->enable.PolygonStipple);
			break;
		
		case GL_TEXTURE_2D:
			*data ++ = FROM_BOOL(context->enable.Texture2D[tmu]);
			break;
		
		case GL_TEXTURE_CUBE_MAP:
			*data ++ = FROM_BOOL(GL_FALSE);
			break; 			/* FIXME */
		
		case GL_TEXTURE_GEN_S:
			*data ++ = FROM_BOOL(context->enable.TexGenS[tmu]);
			break;
		
		case GL_TEXTURE_GEN_T:
			*data ++ = FROM_BOOL(context->enable.TexGenT[tmu]);
			break;
		
		case GL_TEXTURE_GEN_R:
		case GL_TEXTURE_GEN_Q:
			*data ++ = FROM_BOOL(GL_FALSE);
			break;			/* FIXME */
			
		case GL_SCISSOR_TEST:
			*data ++ = FROM_BOOL(context->enable.ScissorTest);
			break;
		
		case GL_ALPHA_TEST:
			*data ++ = FROM_BOOL(context->enable.AlphaTest);
			break;
		
		case GL_STENCIL_TEST:
			*data ++ = FROM_BOOL(context->enable.StencilTest);
			break;
		
		case GL_DEPTH_TEST:
			*data ++ = FROM_BOOL(context->enable.DepthTest);
			break;
			
		case GL_BLEND:
			*data ++ = FROM_BOOL(context->enable.Blend);
			break;
			
		case GL_DITHER:
			*data ++ = FROM_BOOL(context->enable.Dither);
			break;
			
	}

#ifdef _IS_ENABLED_ONLY
	return result;
#endif
}
