326 lines
9.0 KiB
C++
326 lines
9.0 KiB
C++
//**************************************************************
|
|
//* OpenGLide - Glide to OpenGL Wrapper
|
|
//* http://openglide.sourceforge.net
|
|
//*
|
|
//* Other Functions
|
|
//*
|
|
//* OpenGLide is OpenSource under LGPL license
|
|
//* Originaly made by Fabio Barros
|
|
//* Modified by Paul for Glidos (http://www.glidos.net)
|
|
//* Mac version and additional features by Jens-Olaf Hemprich
|
|
//**************************************************************
|
|
|
|
#include "Glide.h"
|
|
#include "GLRender.h"
|
|
#include "GLRenderUpdateState.h"
|
|
|
|
// Error Function variable
|
|
GLIDEERRORFUNCTION ExternErrorFunction;
|
|
|
|
//*************************************************
|
|
//* Sets the External Error Function to call if
|
|
//* Glides Generates and Error
|
|
//*************************************************
|
|
FX_ENTRY void FX_CALL
|
|
grErrorSetCallback( void (*function)(const char *string, FxBool fatal) )
|
|
{
|
|
#ifdef OGL_DONE
|
|
GlideMsg( "grErrorSetCallback( --- )\n" );
|
|
#endif
|
|
|
|
ExternErrorFunction = function;
|
|
}
|
|
|
|
//*************************************************
|
|
//* Sets the Cull Mode
|
|
//*************************************************
|
|
FX_ENTRY void FX_CALL
|
|
grCullMode( GrCullMode_t mode )
|
|
{
|
|
#ifdef OGL_DONE
|
|
GlideMsg( "grCullMode( %d )\n", mode );
|
|
#endif
|
|
|
|
glReportErrors("grCullMode");
|
|
|
|
RenderDrawTriangles( );
|
|
|
|
Glide.State.CullMode = mode;
|
|
|
|
switch ( Glide.State.CullMode )
|
|
{
|
|
case GR_CULL_DISABLE:
|
|
glDisable( GL_CULL_FACE );
|
|
glCullFace( GL_BACK ); // This will be called in initialization
|
|
break;
|
|
case GR_CULL_NEGATIVE:
|
|
glEnable( GL_CULL_FACE );
|
|
if ( Glide.State.OriginInformation == GR_ORIGIN_LOWER_LEFT )
|
|
{
|
|
glFrontFace( GL_CCW );
|
|
}
|
|
else
|
|
{
|
|
glFrontFace( GL_CW );
|
|
}
|
|
break;
|
|
case GR_CULL_POSITIVE:
|
|
glEnable( GL_CULL_FACE );
|
|
if ( Glide.State.OriginInformation == GR_ORIGIN_LOWER_LEFT )
|
|
{
|
|
glFrontFace( GL_CW );
|
|
}
|
|
else
|
|
{
|
|
glFrontFace( GL_CCW );
|
|
}
|
|
break;
|
|
}
|
|
glReportError();
|
|
}
|
|
|
|
//*************************************************
|
|
//* Set the size and location of the hardware clipping window
|
|
//*************************************************
|
|
FX_ENTRY void FX_CALL
|
|
grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy )
|
|
{
|
|
CHECK_STATE_CHANGED(Glide.State.ClipMinX == minx
|
|
&& Glide.State.ClipMinY == miny
|
|
&& Glide.State.ClipMaxX == maxx
|
|
&& Glide.State.ClipMaxY == maxy);
|
|
|
|
#ifdef OGL_PARTDONE
|
|
GlideMsg( "grClipWindow( %d, %d, %d, %d )\n", minx, miny, maxx, maxy );
|
|
#endif
|
|
|
|
RenderDrawTriangles( );
|
|
s_Framebuffer.OnClipWindow();
|
|
// Store the Glide clipping coords
|
|
Glide.State.ClipMinX = minx;
|
|
Glide.State.ClipMaxX = maxx;
|
|
Glide.State.ClipMinY = miny;
|
|
Glide.State.ClipMaxY = maxy;
|
|
// calculate the corresponding OpenGL coords
|
|
// (the multiplication has to come first because the values are integers)
|
|
OpenGL.ClipMinX = OpenGL.WindowWidth * minx / Glide.WindowWidth;
|
|
OpenGL.ClipMaxX = OpenGL.WindowWidth * maxx / Glide.WindowWidth;
|
|
OpenGL.ClipMinY = OpenGL.WindowHeight * miny / Glide.WindowHeight;
|
|
OpenGL.ClipMaxY = OpenGL.WindowHeight * maxy / Glide.WindowHeight;
|
|
bool clip = ((Glide.State.ClipMinX != 0) ||
|
|
(Glide.State.ClipMinY != 0) ||
|
|
(Glide.State.ClipMaxX != Glide.WindowWidth) ||
|
|
(Glide.State.ClipMaxY != Glide.WindowHeight));
|
|
OpenGL.Clipping = clip;
|
|
SetClipVerticesState(clip);
|
|
|
|
glMatrixMode( GL_PROJECTION );
|
|
glLoadIdentity();
|
|
if ( Glide.State.OriginInformation == GR_ORIGIN_LOWER_LEFT )
|
|
{
|
|
// Used for geometry clipping
|
|
glOrtho(Glide.State.ClipMinX, Glide.State.ClipMaxX,
|
|
Glide.State.ClipMinY, Glide.State.ClipMaxY,
|
|
OpenGL.ZNear, OpenGL.ZFar);
|
|
glViewport(OpenGL.OriginX + OpenGL.ClipMinX,
|
|
OpenGL.OriginY + OpenGL.ClipMinY,
|
|
OpenGL.ClipMaxX - OpenGL.ClipMinX,
|
|
OpenGL.ClipMaxY - OpenGL.ClipMinY);
|
|
// Used for the buffer clearing
|
|
glScissor(OpenGL.OriginX + OpenGL.ClipMinX,
|
|
OpenGL.OriginY + OpenGL.ClipMinY,
|
|
OpenGL.ClipMaxX - OpenGL.ClipMinX,
|
|
OpenGL.ClipMaxY - OpenGL.ClipMinY);
|
|
}
|
|
else
|
|
{
|
|
// Used for geometry clipping
|
|
glOrtho(Glide.State.ClipMinX, Glide.State.ClipMaxX,
|
|
Glide.State.ClipMaxY, Glide.State.ClipMinY,
|
|
OpenGL.ZNear, OpenGL.ZFar );
|
|
glViewport(OpenGL.OriginX + OpenGL.ClipMinX,
|
|
OpenGL.OriginY + OpenGL.WindowHeight - OpenGL.ClipMaxY,
|
|
OpenGL.ClipMaxX - OpenGL.ClipMinX,
|
|
OpenGL.ClipMaxY - OpenGL.ClipMinY);
|
|
// Used for the buffer clearing
|
|
glScissor(OpenGL.OriginX + OpenGL.ClipMinX,
|
|
OpenGL.OriginY + OpenGL.WindowHeight - OpenGL.ClipMaxY,
|
|
OpenGL.ClipMaxX - OpenGL.ClipMinX,
|
|
OpenGL.ClipMaxY - OpenGL.ClipMinY);
|
|
}
|
|
glMatrixMode( GL_MODELVIEW );
|
|
}
|
|
|
|
//*************************************************
|
|
FX_ENTRY void FX_CALL
|
|
grDisableAllEffects( void )
|
|
{
|
|
#ifdef OGL_PARTDONE
|
|
GlideMsg( "grDisableAllEffects( )\n" );
|
|
#endif
|
|
|
|
grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ONE, GR_BLEND_ZERO );
|
|
grAlphaTestFunction( GR_CMP_ALWAYS );
|
|
grChromakeyMode( GR_CHROMAKEY_DISABLE );
|
|
grDepthBufferMode( GR_DEPTHBUFFER_DISABLE );
|
|
grFogMode( GR_FOG_DISABLE );
|
|
}
|
|
|
|
//*************************************************
|
|
FX_ENTRY void FX_CALL
|
|
grResetTriStats( void )
|
|
{
|
|
#ifdef OGL_NOTDONE
|
|
GlideMsg( "grResetTriStats( )\n" );
|
|
#endif
|
|
}
|
|
|
|
//*************************************************
|
|
FX_ENTRY void FX_CALL
|
|
grTriStats( FxU32 *trisProcessed, FxU32 *trisDrawn )
|
|
{
|
|
#ifdef OGL_NOTDONE
|
|
GlideMsg( "grTriStats( )\n" );
|
|
#endif
|
|
}
|
|
|
|
//*************************************************
|
|
FX_ENTRY void FX_CALL
|
|
grHints( GrHint_t hintType, FxU32 hintMask )
|
|
{
|
|
switch( hintType )
|
|
{
|
|
case GR_HINT_STWHINT:
|
|
CHECK_STATE_CHANGED(Glide.State.STWHint == hintMask);
|
|
#ifdef OGL_PARTDONE
|
|
GlideMsg("grHints( %d, %d )\n", hintType, hintMask);
|
|
#endif
|
|
RenderDrawTriangles();
|
|
Glide.State.STWHint = hintMask;
|
|
break;
|
|
default:
|
|
#ifdef OGL_NOTDONE
|
|
GlideMsg("grHints( %d, %d )\n", hintType, hintMask);
|
|
#endif
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*
|
|
//*************************************************
|
|
FX_ENTRY void FX_CALL
|
|
grSplash( float x, float y, float width, float height, FxU32 frame )
|
|
{
|
|
#ifdef OGL_NOTDONE
|
|
GlideMsg( "grSplash( %-4.2f, %-4.2f, %-4.2f, %-4.2f, %lu )\n",
|
|
x, y, width, height, frame );
|
|
#endif
|
|
}
|
|
*/
|
|
|
|
//*************************************************
|
|
FX_ENTRY void FX_CALL
|
|
ConvertAndDownloadRle( GrChipID_t tmu,
|
|
FxU32 startAddress,
|
|
GrLOD_t thisLod,
|
|
GrLOD_t largeLod,
|
|
GrAspectRatio_t aspectRatio,
|
|
GrTextureFormat_t format,
|
|
FxU32 evenOdd,
|
|
FxU8 *bm_data,
|
|
long bm_h,
|
|
FxU32 u0,
|
|
FxU32 v0,
|
|
FxU32 width,
|
|
FxU32 height,
|
|
FxU32 dest_width,
|
|
FxU32 dest_height,
|
|
FxU16 *tlut )
|
|
{
|
|
#ifdef OGL_NOTDONE
|
|
GlideMsg( "ConvertAndDownloadRle( %d, %lu, %d, %d, %d, %d, %d, ---, %l, %lu, %lu, %lu, %lu, %lu, %lu, --- )\n",
|
|
tmu, startAddress, thisLod, largeLod, aspectRatio, format, evenOdd, bm_h, u0, v0, width, height,
|
|
dest_width, dest_height );
|
|
#endif
|
|
}
|
|
|
|
//*************************************************
|
|
FX_ENTRY void FX_CALL
|
|
grCheckForRoom( FxI32 n )
|
|
{
|
|
#ifdef OGL_NOTDONE
|
|
GlideMsg( "grCheckForRoom( %l )\n", n );
|
|
#endif
|
|
}
|
|
|
|
//*************************************************
|
|
FX_ENTRY void FX_CALL
|
|
grParameterData( FxU32 param, FxU32 components, FxU32 type, FxI32 offset )
|
|
{
|
|
#ifdef OGL_NOTDONE
|
|
GlideMsg( "grParameterData( %lu, %lu, %lu, %l )\n",
|
|
param, components, type, offset );
|
|
#endif
|
|
}
|
|
|
|
//*************************************************
|
|
FX_ENTRY int FX_CALL
|
|
guEncodeRLE16( void *dst,
|
|
void *src,
|
|
FxU32 width,
|
|
FxU32 height )
|
|
{
|
|
#ifdef OGL_NOTDONE
|
|
GlideMsg( "guEncodeRLE16( ---, ---, %lu, %lu ) = 1\n", width, height );
|
|
#endif
|
|
|
|
return 1;
|
|
}
|
|
|
|
//*************************************************
|
|
FX_ENTRY FxU32 FX_CALL
|
|
guEndianSwapFxU16s( FxU32 value )
|
|
{
|
|
#ifdef OGL_DONE
|
|
GlideMsg( "guEndianSwapFxU16s( %lu )\n", value );
|
|
#endif
|
|
|
|
return ( value << 16 ) | ( value >> 16 );
|
|
}
|
|
|
|
//*************************************************
|
|
FX_ENTRY FxU16 FX_CALL
|
|
guEndianSwapBytes( FxU16 value )
|
|
{
|
|
#ifdef OGL_DONE
|
|
GlideMsg( "guEndianSwapBytes( %u )\n", value );
|
|
#endif
|
|
|
|
return ( value << 8 ) | ( value >> 8 );
|
|
}
|
|
|
|
FX_ENTRY void FX_CALL
|
|
guMovieStart( void )
|
|
{
|
|
#ifdef OGL_NOTDONE
|
|
GlideMsg( "guMovieStart( ) - Not Supported\n" );
|
|
#endif
|
|
}
|
|
|
|
FX_ENTRY void FX_CALL
|
|
guMovieStop( void )
|
|
{
|
|
#ifdef OGL_NOTDONE
|
|
GlideMsg( "guMovieStop( ) - Not Supported\n" );
|
|
#endif
|
|
}
|
|
|
|
FX_ENTRY void FX_CALL
|
|
guMovieSetName( const char *name )
|
|
{
|
|
#ifdef OGL_NOTDONE
|
|
GlideMsg( "guMovieSetName( ) - Not Supported\n" );
|
|
#endif
|
|
}
|
|
|