/****************************************************************
** projectIncludes.h                                           **
** -----------------                                           **
**                                                             **
** Once your OpenGL program starts getting split into multiple **
**    source files, you start having #include's that need to   **
**    be repeated in all your soure files.  Plus function      **
**    prototypes are needed to use functions defined from one  **
**    file in another.                                         **
** Having a single #include file to keep all this in one place **
**    ensure consistency between files, so you know what is    **
**    usable.  And if something is missing or out of order, it **
**    can be added or changed in one spot -- this file!        **
**                                                             **
** Chris Wyman (04/06/2012)                                    **
****************************************************************/

#ifndef MY_PROJECT_INCLUDES_H
#define MY_PROJECT_INCLUDES_H


// All IGLU headers are automatically included from "iglu.h"
#include "iglu.h"
using namespace iglu;

// I'm a C developer...  So I still use STDIO and STDLIB
//    These need to come after "iglu.h" (or really after <GL/glew.h>
//    which is included by iglu.h).
#include <stdio.h>
#include <stdlib.h>

// Include our global data structure for this project
#include "glDataStructure.h"

// Function prototypes from uiInteractionCallbacks.cpp
void MouseMotion( int x, int y );
void MouseButton( int button, int state, int x, int y );

// Function prototypes from commonInitialization.cpp
void OpenGLInitialization( void *winPtr );

// Function prototyypes from WidgetVariableCallbacks.cpp
void UpdateLightPosition( IGLUVariable *uiFloat );
void UpdateVSVResolution( void );

// Function prototypes for intermediate rendering steps from varions Mode_*.cpp files
void CreateParaboloidShadowMap( IGLUFramebuffer::Ptr &smap, 
							    const vec4 &esLightPos );
void ReturnMinAndMaxLightAngles( const vec4 &eslightPos, 
								 float *minDistance, 
								 float *maxDistance );
void RectifySMapToEpipolarVoxelBuffer( IGLUFramebuffer::Ptr &voxBuffer, 
									   IGLUShaderProgram::Ptr &rectify, 
									   const vec3 &esLightPos, 
									   float minAngle, float maxAngle );
void DoScanStep( IGLUFramebuffer::Ptr &outFB,   
				 IGLUFramebuffer::Ptr &inFB,    
				 bool isUpStep );
void CreateVSVUsingRectifiedSMap( void );


// Some garbage collection for simple macros
#ifdef min
#undef min
#endif

#ifdef max
#undef max
#endif


#endif