//////////////////////////////////////////////////////////////////////
//
//                             Pixie
//
// Copyright © 1999 - 2003, Okan Arikan
//
// Contact: okan@cs.berkeley.edu
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
// 
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// General Public License for more details.
// 
// You should have received a copy of the GNU General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
//
//  File				:	sdr.h
//  Classes				:	-
//  Description			:	The shader library interface
//
////////////////////////////////////////////////////////////////////////
#ifndef SDR_H
#define SDR_H

#ifdef WIN32
#define	LIB_EXPORT				__declspec(dllexport)
#else
#define	LIB_EXPORT				extern
#endif


typedef enum {
	TYPE_FLOAT,
	TYPE_VECTOR,
	TYPE_NORMAL,
	TYPE_POINT,
	TYPE_COLOR,
	TYPE_MATRIX,
	TYPE_STRING
} ESdrType;

typedef enum {
	SHADER_SURFACE,
	SHADER_DISPLACEMENT,
	SHADER_VOLUME,
	SHADER_LIGHT,
	SHADER_IMAGER
} ESdrShaderType;

typedef enum {
	CONTAINER_CONSTANT,
	CONTAINER_UNIFORM,
	CONTAINER_VARYING,
	CONTAINER_VERTEX
} ESdrContainer;

typedef union {
	float	*matrix;
	float	*vector;
	float	scalar;
	char	*string;
} UDefaultVal;

typedef struct TSdrParameter {
	char					*name;					// Name of the parameter
	ESdrType				type;					// Type of the parameter
	ESdrContainer			container;				// COntainer class of the parameter
	int						numItems;				// Number of items (the number of items if an array, 1 otherwise)
	char					*space;					// The space that the default value is expressed in
	UDefaultVal				defaultValue;			// The default value
	struct TSdrParameter	*next;					// The next parameter
	
} TSdrParameter;

typedef struct TSdrShader {
	char					*name;					// Name of the shader
	ESdrShaderType			type;					// Type of the shader
	struct TSdrParameter	*parameters;			// A linked list of parameters to the shader
} TSdrShader;


#ifdef __cplusplus
extern "C" {
#endif

	LIB_EXPORT	TSdrShader		*sdrGet(const char *,const char *);	// Query a shader
	LIB_EXPORT	void			sdrDelete(TSdrShader *);			// Delete a shader

#ifdef __cplusplus
}
#endif


#endif



