182 lines
4.7 KiB
C
182 lines
4.7 KiB
C
|
#ifndef __glphong_h_
|
||
|
#define __glphong_h_
|
||
|
|
||
|
#include "types.h"
|
||
|
|
||
|
|
||
|
#ifdef GL_WIN_phong_shading
|
||
|
|
||
|
//Definitions for the phong-flag
|
||
|
#define __GL_PHONG_INV_COLOR_VALID 0x00000001
|
||
|
#define __GL_PHONG_NEED_EYE_XPOLATE 0x00000002
|
||
|
#define __GL_PHONG_NEED_COLOR_XPOLATE 0x00000004
|
||
|
|
||
|
#define __GL_PHONG_ALREADY_SORTED 0x00000010
|
||
|
#define __GL_PHONG_USE_FAST_COLOR 0x00000020
|
||
|
#define __GL_PHONG_USE_SLOW_COLOR 0x00000040
|
||
|
|
||
|
|
||
|
/*
|
||
|
** Shader record for iterated objects (lines/triangles). This keeps
|
||
|
** track of all the various deltas needed to rasterize a triangle.
|
||
|
*/
|
||
|
|
||
|
/* NOTES:
|
||
|
* -----
|
||
|
* After expanding the shading equation using Taylor's series
|
||
|
* /=======================================\
|
||
|
* | 2 2 |
|
||
|
* | S(x,y) = ax + by + cxy + dx + ey + f |
|
||
|
* \=======================================/
|
||
|
*
|
||
|
* f = S (0, 0) , e = S (0, 0 )
|
||
|
* y
|
||
|
*
|
||
|
* d = S (0, 0) , c = S (0, 0)
|
||
|
* x xy
|
||
|
*
|
||
|
* b = 0.5 * S (0 , 0) , a = 0.5 * S (0, 0)
|
||
|
* yy xx
|
||
|
*
|
||
|
* Compute these in SetInitialPhongParameters
|
||
|
*/
|
||
|
|
||
|
/* NOTES on Forward differencing:
|
||
|
* -----------------------------
|
||
|
*
|
||
|
* Along the edge interpolation: delta_x = X (dxdy), delta_y = 1
|
||
|
* -------------------------------------------------------------
|
||
|
* Initial S: S (0, 0) = f (compute in SetInitialPhongParameters, for vert A)
|
||
|
* (Sinit_edge)
|
||
|
* 2
|
||
|
* Initial dS : aX + b + cX + dX + e (compute in FillSubTriangle)
|
||
|
* (dS_edge)
|
||
|
* 2
|
||
|
* Initial ddS (constant) : 2aX + 2cX + 2b (compute in FillSubTriangle)
|
||
|
* (ddS_edge)
|
||
|
*
|
||
|
* Every iteration compute Sinit_span (in FillSubTriangle).
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
* Along the span interpolation: delta_x = 1, delta_y = 0
|
||
|
* -------------------------------------------------------------
|
||
|
* Initial S: sEdge (compute in FillSubTriangle)
|
||
|
* (Sinit_span)
|
||
|
*
|
||
|
* Initial dS: a(2x+1) + cy + d (compute once in SpanProc)
|
||
|
* (dS_span)
|
||
|
*
|
||
|
* Initial ddS (constant): 2a (compute in SetInitialPhongParameters)
|
||
|
* (ddS_span)
|
||
|
*
|
||
|
* Every iteration compute Color (in SpanProc).
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
typedef struct __GLphongPerLightDataRec {
|
||
|
|
||
|
/****** Diffuse Part *****/
|
||
|
GLfloat Dcurr; //current dot-product
|
||
|
GLfloat Ddel;
|
||
|
GLfloat Ddel2;
|
||
|
|
||
|
/****** Specular Part *****/
|
||
|
GLfloat Scurr; //current dot-product
|
||
|
GLfloat Sdel;
|
||
|
GLfloat Sdel2;
|
||
|
|
||
|
#ifdef __JUNKED_CODE
|
||
|
/* Along the edge */
|
||
|
GLfloat DdelEdgeLittle;
|
||
|
GLfloat Ddel2EdgeLittle;
|
||
|
GLfloat DdelEdgeBig;
|
||
|
GLfloat Ddel2EdgeBig;
|
||
|
|
||
|
/* Along the span */
|
||
|
GLfloat DdelSpan;
|
||
|
GLfloat DdelSpanEdgeBig, DdelSpanEdgeLittle;
|
||
|
GLfloat Ddel2Span;
|
||
|
|
||
|
/* Temporary storages during span-generation */
|
||
|
GLfloat D_tmp;
|
||
|
GLfloat Ddel_tmp;
|
||
|
|
||
|
/* Polynomial coefficients */
|
||
|
GLfloat D[6];
|
||
|
|
||
|
/****** Specular Part *****/
|
||
|
GLfloat S_curr; //current dot-product
|
||
|
|
||
|
/* Along the edge */
|
||
|
GLfloat SdelEdgeLittle;
|
||
|
GLfloat Sdel2EdgeLittle;
|
||
|
GLfloat SdelEdgeBig;
|
||
|
GLfloat Sdel2EdgeBig;
|
||
|
|
||
|
/* Along the span */
|
||
|
GLfloat SdelSpan;
|
||
|
GLfloat SdelSpanEdgeBig, SdelSpanEdgeLittle;
|
||
|
GLfloat Sdel2Span;
|
||
|
|
||
|
/* Temporary storages during span-generation */
|
||
|
GLfloat S_tmp;
|
||
|
GLfloat Sdel_tmp;
|
||
|
|
||
|
/* Polynomial coefficients */
|
||
|
GLfloat S[6];
|
||
|
|
||
|
/****** Attenuation Part *****/
|
||
|
/****** Spotlight Part *****/
|
||
|
#endif //__JUNKED_CODE
|
||
|
} __GLphongPerLightData;
|
||
|
|
||
|
|
||
|
typedef struct __GLphongShadeRec {
|
||
|
|
||
|
GLuint flags;
|
||
|
|
||
|
GLint numLights;
|
||
|
|
||
|
/* Normals */
|
||
|
__GLcoord dndx, dndy;
|
||
|
__GLcoord nBig, nLittle;
|
||
|
__GLcoord nCur, nTmp;
|
||
|
|
||
|
/* Eye */
|
||
|
__GLcoord dedx, dedy;
|
||
|
__GLcoord eBig, eLittle;
|
||
|
__GLcoord eCur, eTmp;
|
||
|
|
||
|
/* Face: Whether to use the FRONT or the BACK material */
|
||
|
GLint face;
|
||
|
|
||
|
/* Store the invarient color */
|
||
|
__GLcolor invColor;
|
||
|
|
||
|
/* Temporary storage during span-interpolation of color */
|
||
|
__GLcolor tmpColor;
|
||
|
|
||
|
#ifdef __JUNKED_CODE
|
||
|
/* Tracks the current position wrt to the starting vertex */
|
||
|
__GLcoord cur_pos;
|
||
|
__GLcoord tmp_pos;
|
||
|
#endif //__JUNKED_CODE
|
||
|
|
||
|
/* Per-light data array */
|
||
|
__GLphongPerLightData perLight[8]; //update this to WGL_MAX_NUM_LIGHTS
|
||
|
} __GLphongShader;
|
||
|
|
||
|
|
||
|
extern void FASTCALL __glGenericPickPhongProcs(__GLcontext *gc);
|
||
|
extern void ComputePhongInvarientRGBColor (__GLcontext *gc);
|
||
|
#ifdef GL_WIN_specular_fog
|
||
|
extern __GLfloat ComputeSpecValue (__GLcontext *gc, __GLvertex *vx);
|
||
|
#endif //GL_WIN_specular_fog
|
||
|
|
||
|
|
||
|
#endif //GL_WIN_phong_shading
|
||
|
|
||
|
|
||
|
#endif /* __glphong_h_ */
|