123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840 |
- //
- // The graphics engine GLXEngine. The unit of GXScene for Delphi
- //
- unit GXS.XOpenGL;
- (*
- "Alternate" OpenGL functions to handle multi-texturing.
- Using this functions allows specifying none/one/multiple ARB multi-texture
- coordinates with standard texture specification call.
- Before using any of the xglTexCoordXxxx functions, call one of the
- xglMapTexCoordToXxxx functions to establish the redirectors.
- This unit is Open-Source under MPL
- The history is logged in a former GLS version of the unit.
- *)
- interface
- {.$I GLScene.Defines.inc}
- uses
- Winapi.OpenGL,
- Winapi.OpenGLext;
- type
- TMapTexCoordMode = (mtcmUndefined, mtcmNull, mtcmMain, mtcmDual, mtcmSecond, mtcmArbitrary);
- // TexCoord functions will be ignored.
- procedure xglMapTexCoordToNull;
- // TexCoord functions will define the main texture coordinates.
- procedure xglMapTexCoordToMain;
- // TexCoord functions will define the second texture unit coordinates.
- procedure xglMapTexCoordToSecond;
- // TexCoord functions will define the two first texture units coordinates.
- procedure xglMapTexCoordToDual;
- // TexCoord functions will define the specified texture units coordinates.
- procedure xglMapTexCoordToArbitrary(const units: array of Cardinal); overload;
- procedure xglMapTexCoordToArbitrary(const bitWiseUnits: Cardinal); overload;
- procedure xglMapTexCoordToArbitraryAdd(const bitWiseUnits: Cardinal);
- // Defers xglMap calls execution until xglEndUpdate is met. Calls to Begin/EndUpdate may be nested.
- procedure xglBeginUpdate;
- // Applies xglMap calls if there were any since xglBeginUpdate was invoked. Calls to Begin/EndUpdate may be nested.
- procedure xglEndUpdate;
- // Saves State on the stack.
- procedure xglPushState;
- // Restores State from the stack.
- procedure xglPopState;
- (* Whenever called, 2nd texture units changes will be forbidden to .
- Use this function when you're using the 2nd texture unit for your own
- purposes and don't want to alter it. *)
- procedure xglForbidSecondTextureUnit;
- // Allow to use the second texture unit again.
- procedure xglAllowSecondTextureUnit;
- // Returns the complex mapping in bitwise form.
- function xglGetBitWiseMapping: Cardinal;
- {$IFDEF MULTITHREADOPENGL}
- threadvar
- {$ELSE}
- var
- {$ENDIF}
- xglMapTexCoordMode: TMapTexCoordMode;
- vSecondTextureUnitForbidden: Boolean;
- // Explicit texture coordinates specification
- xglTexCoord2f: procedure(s, t: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- xglTexCoord2fv: procedure(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- xglTexCoord3f: procedure(s, t, r: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- xglTexCoord3fv: procedure(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- xglTexCoord4f: procedure(s, t, r, q: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- xglTexCoord4fv: procedure(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- // TexGen texture coordinates specification
- xglTexGenf: procedure(coord, pname: Cardinal; param: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- xglTexGenfv: procedure(coord, pname: Cardinal; params: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- xglTexGeni: procedure(coord, pname: Cardinal; param: GLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- xglTexGeniv: procedure(coord, pname: Cardinal; params: PGLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- // Vertex Arrays texture coordinates specification
- xglTexCoordPointer: procedure(size: GLint; atype: GLEnum; stride: GLsizei; data: pointer); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- xglEnableClientState: procedure(aarray: Cardinal); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- xglDisableClientState: procedure(aarray: Cardinal); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- // Misc
- xglEnable: procedure(cap: Cardinal); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- xglDisable: procedure(cap: Cardinal); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- //===================================================================
- implementation
- //===================================================================
- var
- vUpdCount: Integer;
- vUpdNewMode: TMapTexCoordMode;
- vStateStack: array of TMapTexCoordMode;
- vComplexMapping: array of Cardinal;
- vComplexMappingN: Integer;
- // ------------------------------------------------------------------
- // Multitexturing coordinates duplication functions
- // ------------------------------------------------------------------
- // --------- Complex (arbitrary) mapping
- procedure glTexCoord2f_Arbitrary(s, t: Single); {$IFDEF MSWINDOWS} stdcall {$ELSE} cdecl {$ENDIF};
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- glMultiTexCoord2f(vComplexMapping[i], s, t);
- end;
- procedure glTexCoord2fv_Arbitrary(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall {$ELSE} cdecl {$ENDIF};
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- glMultiTexCoord2fv(vComplexMapping[i], v);
- end;
- procedure glTexCoord3f_Arbitrary(s, t, r: Single); {$IFDEF MSWINDOWS} stdcall {$ELSE} cdecl {$ENDIF};
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- glMultiTexCoord3f(vComplexMapping[i], s, t, r);
- end;
- procedure glTexCoord3fv_Arbitrary(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall {$ELSE} cdecl {$ENDIF};
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- glMultiTexCoord3fv(vComplexMapping[i], v);
- end;
- procedure glTexCoord4f_Arbitrary(s, t, r, q: Single); {$IFDEF MSWINDOWS} stdcall {$ELSE} cdecl {$ENDIF};
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- glMultiTexCoord4f(vComplexMapping[i], s, t, r, q);
- end;
- procedure glTexCoord4fv_Arbitrary(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall {$ELSE} cdecl {$ENDIF};
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- glMultiTexCoord4fv(vComplexMapping[i], v);
- end;
- procedure glTexGenf_Arbitrary(coord, pname: GLEnum; param: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- begin
- glActiveTexture(vComplexMapping[i]);
- glTexGenf(coord, pname, param);
- end;
- glActiveTexture(GL_TEXTURE0_ARB);
- end;
- procedure glTexGenfv_Arbitrary(coord, pname: GLEnum; params: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- begin
- glActiveTexture(vComplexMapping[i]);
- glTexGenfv(coord, pname, params);
- end;
- glActiveTexture(GL_TEXTURE0_ARB);
- end;
- procedure glTexGeni_Arbitrary(coord, pname: GLEnum; param: GLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- begin
- glActiveTexture(vComplexMapping[i]);
- glTexGeni(coord, pname, param);
- end;
- glActiveTexture(GL_TEXTURE0_ARB);
- end;
- procedure glTexGeniv_Arbitrary(coord, pname: GLEnum; params: PGLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- begin
- glActiveTexture(vComplexMapping[i]);
- glTexGeniv(coord, pname, params);
- end;
- glActiveTexture(GL_TEXTURE0_ARB);
- end;
- procedure glEnable_Arbitrary(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- begin
- glActiveTexture(vComplexMapping[i]);
- glEnable(cap);
- end;
- glActiveTextureARB(GL_TEXTURE0_ARB);
- end;
- procedure glDisable_Arbitrary(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- begin
- glActiveTexture(vComplexMapping[i]);
- glDisable(cap);
- end;
- glActiveTextureARB(GL_TEXTURE0_ARB);
- end;
- procedure xglTexCoordPointer_Arbitrary(size: GLint; atype: GLEnum; stride: GLsizei; data: pointer); {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl; {$ENDIF}
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- begin
- glClientActiveTexture(vComplexMapping[i]);
- glTexCoordPointer(size, atype, stride, data);
- end;
- glActiveTextureARB(GL_TEXTURE0_ARB);
- end;
- procedure xglEnableClientState_Arbitrary(aarray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- begin
- glClientActiveTexture(vComplexMapping[i]);
- glEnableClientState(aarray);
- end;
- glActiveTextureARB(GL_TEXTURE0_ARB);
- end;
- procedure xglDisableClientState_Arbitrary(aarray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- var
- i: Integer;
- begin
- for i := 0 to vComplexMappingN do
- begin
- glClientActiveTexture(vComplexMapping[i]);
- glDisableClientState(aarray);
- end;
- glActiveTextureARB(GL_TEXTURE0_ARB);
- end;
- // --------- Second unit Texturing
- procedure glTexCoord2f_Second(s, t: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glMultiTexCoord2f(GL_TEXTURE1, s, t);
- end;
- procedure glTexCoord2fv_Second(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glMultiTexCoord2fv(GL_TEXTURE1, v);
- end;
- procedure glTexCoord3f_Second(s, t, r: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glMultiTexCoord3f(GL_TEXTURE1, s, t, r);
- end;
- procedure glTexCoord3fv_Second(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glMultiTexCoord3fv(GL_TEXTURE1, v);
- end;
- procedure glTexCoord4f_Second(s, t, r, q: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glMultiTexCoord4f(GL_TEXTURE1, s, t, r, q);
- end;
- procedure glTexCoord4fv_Second(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glMultiTexCoord4fv(GL_TEXTURE1, v);
- end;
- procedure glTexGenf_Second(coord, pname: GLEnum; param: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glActiveTexture(GL_TEXTURE1);
- glTexGenf(coord, pname, param);
- glActiveTexture(GL_TEXTURE0);
- end;
- procedure glTexGenfv_Second(coord, pname: GLEnum; params: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glActiveTexture(GL_TEXTURE1);
- glTexGenfv(coord, pname, params);
- glActiveTexture(GL_TEXTURE0);
- end;
- procedure glTexGeni_Second(coord, pname: GLEnum; param: GLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glActiveTextureARB(GL_TEXTURE1_ARB);
- glTexGeni(coord, pname, param);
- glActiveTextureARB(GL_TEXTURE0_ARB);
- end;
- procedure glTexGeniv_Second(coord, pname: GLEnum; params: PGLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glActiveTexture(GL_TEXTURE1_ARB);
- glTexGeniv(coord, pname, params);
- glActiveTexture(GL_TEXTURE0_ARB);
- end;
- procedure glEnable_Second(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glActiveTexture(GL_TEXTURE1_ARB);
- glEnable(cap);
- glActiveTexture(GL_TEXTURE0_ARB);
- end;
- procedure glDisable_Second(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glActiveTexture(GL_TEXTURE1_ARB);
- glDisable(cap);
- glActiveTexture(GL_TEXTURE0_ARB);
- end;
- procedure xglTexCoordPointer_Second(size: GLint; atype: GLEnum; stride: GLsizei; data: pointer); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glClientActiveTexture(GL_TEXTURE1);
- glTexCoordPointer(size, atype, stride, data);
- glClientActiveTexture(GL_TEXTURE0);
- end;
- procedure xglEnableClientState_Second(aArray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glClientActiveTexture(GL_TEXTURE1);
- glEnableClientState(aarray);
- glClientActiveTexture(GL_TEXTURE0);
- end;
- procedure xglDisableClientState_Second(aArray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glClientActiveTexture(GL_TEXTURE1);
- glDisableClientState(aArray);
- glClientActiveTexture(GL_TEXTURE0);
- end;
- // --------- Dual Texturing
- procedure glTexCoord2f_Dual(s, t: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glTexCoord2f(s, t);
- glMultiTexCoord2f(GL_TEXTURE1, s, t);
- end;
- procedure glTexCoord2fv_Dual(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glTexCoord2fv(v);
- glMultiTexCoord2fv(GL_TEXTURE1, v);
- end;
- procedure glTexCoord3f_Dual(s, t, r: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glTexCoord3f(s, t, r);
- glMultiTexCoord3f(GL_TEXTURE1, s, t, r);
- end;
- procedure glTexCoord3fv_Dual(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glTexCoord3fv(v);
- glMultiTexCoord3fv(GL_TEXTURE1, v);
- end;
- procedure glTexCoord4f_Dual(s, t, r, q: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glTexCoord4f(s, t, r, q);
- glMultiTexCoord4f(GL_TEXTURE1, s, t, r, q);
- end;
- procedure glTexCoord4fv_Dual(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glTexCoord4fv(v);
- glMultiTexCoord4fv(GL_TEXTURE1, v);
- end;
- procedure glTexGenf_Dual(coord, pname: GLEnum; param: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glTexGenf(coord, pname, param);
- glActiveTexture(GL_TEXTURE1_ARB);
- glTexGenf(coord, pname, param);
- glActiveTexture(GL_TEXTURE0_ARB);
- end;
- procedure glTexGenfv_Dual(coord, pname: GLEnum; params: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glTexGenfv(coord, pname, params);
- glActiveTexture(GL_TEXTURE1_ARB);
- glTexGenfv(coord, pname, params);
- glActiveTexture(GL_TEXTURE0_ARB);
- end;
- procedure glTexGeni_Dual(coord, pname: GLEnum; param: GLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glTexGeni(coord, pname, param);
- glActiveTexture(GL_TEXTURE1_ARB);
- glTexGeni(coord, pname, param);
- glActiveTexture(GL_TEXTURE0_ARB);
- end;
- procedure glTexGeniv_Dual(coord, pname: GLEnum; params: PGLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glTexGeniv(coord, pname, params);
- glActiveTexture(GL_TEXTURE1_ARB);
- glTexGeniv(coord, pname, params);
- glActiveTexture(GL_TEXTURE0_ARB);
- end;
- procedure glEnable_Dual(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glEnable(cap);
- glActiveTexture(GL_TEXTURE1_ARB);
- glEnable(cap);
- glActiveTexture(GL_TEXTURE0_ARB);
- end;
- procedure glDisable_Dual(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glDisable(cap);
- glActiveTexture(GL_TEXTURE1);
- glDisable(cap);
- glActiveTexture(GL_TEXTURE0);
- end;
- procedure xglTexCoordPointer_Dual(size: GLint; atype: GLEnum; stride: GLsizei; data: pointer); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glTexCoordPointer(size, atype, stride, data);
- glClientActiveTexture(GL_TEXTURE1);
- glTexCoordPointer(size, atype, stride, data);
- glClientActiveTexture(GL_TEXTURE0);
- end;
- procedure xglEnableClientState_Dual(aarray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glEnableClientState(aarray);
- glClientActiveTexture(GL_TEXTURE1);
- glEnableClientState(aarray);
- glClientActiveTexture(GL_TEXTURE0);
- end;
- procedure xglDisableClientState_Dual(aArray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- glDisableClientState(aArray);
- glClientActiveTexture(GL_TEXTURE1);
- glDisableClientState(aArray);
- glClientActiveTexture(GL_TEXTURE0);
- end;
- // --------- Null Texturing
- procedure glTexCoord2f_Null(s, t: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure glTexCoord2fv_Null(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure glTexCoord3f_Null(s, t, r: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure glTexCoord3fv_Null(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure glTexCoord4f_Null(s, t, r, q: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure glTexCoord4fv_Null(v: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure glTexGenf_Null(coord, pname: GLEnum; param: Single); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure glTexGenfv_Null(coord, pname: GLEnum; params: PGLfloat); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure glTexGeni_Null(coord, pname: GLEnum; param: GLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure glTexGeniv_Null(coord, pname: GLEnum; params: PGLint); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure glEnable_Null(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure glDisable_Null(cap: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure xglTexCoordPointer_Null(size: GLint; atype: GLEnum; stride: GLsizei; data: pointer); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure xglEnableClientState_Null(aArray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- procedure xglDisableClientState_Null(aArray: GLEnum); {$IFDEF MSWINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- begin
- end;
- // ------------------------------------------------------------------
- // Redirections management functions
- // ------------------------------------------------------------------
- procedure xglBeginUpdate;
- begin
- if vUpdCount = 0 then
- begin
- vUpdCount := 1;
- vUpdNewMode := xglMapTexCoordMode;
- end
- else
- Inc(vUpdCount);
- end;
- procedure xglEndUpdate;
- begin
- Dec(vUpdCount);
- if (vUpdCount = 0) and (vUpdNewMode <> xglMapTexCoordMode) then
- begin
- case vUpdNewMode of
- mtcmNull: xglMapTexCoordToNull;
- mtcmMain: xglMapTexCoordToMain;
- mtcmDual: xglMapTexCoordToDual;
- mtcmSecond: xglMapTexCoordToSecond;
- mtcmArbitrary: xglMapTexCoordToArbitrary(vComplexMapping);
- else
- Assert(False);
- end;
- end;
- end;
- procedure xglPushState;
- var
- i: Integer;
- begin
- Assert(vUpdCount = 0);
- i := Length(vStateStack);
- SetLength(vStateStack, i + 1);
- vStateStack[i] := xglMapTexCoordMode;
- end;
- procedure xglPopState;
- var
- i: Integer;
- begin
- Assert(vUpdCount = 0);
- i := Length(vStateStack) - 1;
- Assert(i >= 0);
- case vStateStack[i] of
- mtcmNull:
- xglMapTexCoordToNull;
- mtcmMain:
- xglMapTexCoordToMain;
- mtcmDual:
- xglMapTexCoordToDual;
- mtcmSecond:
- xglMapTexCoordToSecond;
- mtcmArbitrary:
- xglMapTexCoordToArbitrary(vComplexMapping);
- else
- Assert(False);
- end;
- SetLength(vStateStack, i);
- end;
- procedure xglForbidSecondTextureUnit;
- begin
- vSecondTextureUnitForbidden := True;
- end;
- procedure xglAllowSecondTextureUnit;
- begin
- vSecondTextureUnitForbidden := False;
- end;
- procedure xglMapTexCoordToNull;
- begin
- if vUpdCount <> 0 then
- vUpdNewMode := mtcmNull
- else if xglMapTexCoordMode <> mtcmNull then
- begin
- xglMapTexCoordMode := mtcmNull;
- xglTexCoord2f := glTexCoord2f_Null;
- xglTexCoord2fv := glTexCoord2fv_Null;
- xglTexCoord3f := glTexCoord3f_Null;
- xglTexCoord3fv := glTexCoord3fv_Null;
- xglTexCoord4f := glTexCoord4f_Null;
- xglTexCoord4fv := glTexCoord4fv_Null;
- xglTexGenf := glTexGenf_Null;
- xglTexGenfv := glTexGenfv_Null;
- xglTexGeni := glTexGeni_Null;
- xglTexGeniv := glTexGeniv_Null;
- xglTexCoordPointer := xglTexCoordPointer_Null;
- xglEnableClientState := xglEnableClientState_Null;
- xglDisableClientState := xglDisableClientState_Null;
- xglEnable := glEnable_Null;
- xglDisable := glDisable_Null;
- end;
- end;
- procedure xglMapTexCoordToMain;
- begin
- if vUpdCount <> 0 then
- vUpdNewMode := mtcmMain
- else if xglMapTexCoordMode <> mtcmMain then
- begin
- xglMapTexCoordMode := mtcmMain;
- xglTexCoord2f := glTexCoord2f;
- xglTexCoord2fv := glTexCoord2fv;
- xglTexCoord3f := glTexCoord3f;
- xglTexCoord3fv := glTexCoord3fv;
- xglTexCoord4f := glTexCoord4f;
- xglTexCoord4fv := glTexCoord4fv;
- xglTexGenf := glTexGenf;
- xglTexGenfv := glTexGenfv;
- xglTexGeni := glTexGeni;
- xglTexGeniv := glTexGeniv;
- xglTexCoordPointer := glTexCoordPointer;
- xglEnableClientState := glEnableClientState;
- xglDisableClientState := glDisableClientState;
- xglEnable := glEnable;
- xglDisable := glDisable;
- end;
- end;
- procedure xglMapTexCoordToSecond;
- begin
- if vSecondTextureUnitForbidden then
- begin
- xglMapTexCoordToNull;
- Exit;
- end;
- if vUpdCount <> 0 then
- vUpdNewMode := mtcmSecond
- else if xglMapTexCoordMode <> mtcmSecond then
- begin
- xglMapTexCoordMode := mtcmSecond;
- Assert(True, 'GL_ARB_multitexture');
- xglTexCoord2f := glTexCoord2f_Second;
- xglTexCoord2fv := glTexCoord2fv_Second;
- xglTexCoord3f := glTexCoord3f_Second;
- xglTexCoord3fv := glTexCoord3fv_Second;
- xglTexCoord4f := glTexCoord4f_Second;
- xglTexCoord4fv := glTexCoord4fv_Second;
- xglTexGenf := glTexGenf_Second;
- xglTexGenfv := glTexGenfv_Second;
- xglTexGeni := glTexGeni_Second;
- xglTexGeniv := glTexGeniv_Second;
- xglTexCoordPointer := xglTexCoordPointer_Second;
- xglEnableClientState := xglEnableClientState_Second;
- xglDisableClientState := xglDisableClientState_Second;
- xglEnable := glEnable_Second;
- xglDisable := glDisable_Second;
- end;
- end;
- procedure xglMapTexCoordToDual;
- begin
- if vSecondTextureUnitForbidden then
- begin
- xglMapTexCoordToMain;
- Exit;
- end;
- if vUpdCount <> 0 then
- vUpdNewMode := mtcmDual
- else if xglMapTexCoordMode <> mtcmDual then
- begin
- xglMapTexCoordMode := mtcmDual;
- Assert(True, 'GL_ARB_multitexture');
- xglTexCoord2f := glTexCoord2f_Dual;
- xglTexCoord2fv := glTexCoord2fv_Dual;
- xglTexCoord3f := glTexCoord3f_Dual;
- xglTexCoord3fv := glTexCoord3fv_Dual;
- xglTexCoord4f := glTexCoord4f_Dual;
- xglTexCoord4fv := glTexCoord4fv_Dual;
- xglTexGenf := glTexGenf_Dual;
- xglTexGenfv := glTexGenfv_Dual;
- xglTexGeni := glTexGeni_Dual;
- xglTexGeniv := glTexGeniv_Dual;
- xglTexCoordPointer := xglTexCoordPointer_Dual;
- xglEnableClientState := xglEnableClientState_Dual;
- xglDisableClientState := xglDisableClientState_Dual;
- xglEnable := glEnable_Dual;
- xglDisable := glDisable_Dual;
- end;
- end;
- procedure xglMapTexCoordToArbitrary(const units: array of Cardinal);
- var
- i, j, n: Integer;
- begin
- n := Length(units);
- SetLength(vComplexMapping, n);
- j := 0;
- vComplexMappingN := n - 1;
- for i := 0 to vComplexMappingN do
- begin
- if (not vSecondTextureUnitForbidden) or (units[i] <> GL_TEXTURE1) then
- begin
- vComplexMapping[j] := units[i];
- Inc(j);
- end;
- end;
- if vUpdCount <> 0 then
- vUpdNewMode := mtcmArbitrary
- else if xglMapTexCoordMode <> mtcmArbitrary then
- begin
- xglMapTexCoordMode := mtcmArbitrary;
- Assert(True, 'ARB_multitexture');
- xglTexCoord2f := glTexCoord2f_Arbitrary;
- xglTexCoord2fv := glTexCoord2fv_Arbitrary;
- xglTexCoord3f := glTexCoord3f_Arbitrary;
- xglTexCoord3fv := glTexCoord3fv_Arbitrary;
- xglTexCoord4f := glTexCoord4f_Arbitrary;
- xglTexCoord4fv := glTexCoord4fv_Arbitrary;
- xglTexGenf := glTexGenf_Arbitrary;
- xglTexGenfv := glTexGenfv_Arbitrary;
- xglTexGeni := glTexGeni_Arbitrary;
- xglTexGeniv := glTexGeniv_Arbitrary;
- xglTexCoordPointer := xglTexCoordPointer_Arbitrary;
- xglEnableClientState := xglEnableClientState_Arbitrary;
- xglDisableClientState := xglDisableClientState_Arbitrary;
- xglEnable := glEnable_Arbitrary;
- xglDisable := glDisable_Arbitrary;
- end;
- end;
- procedure xglMapTexCoordToArbitrary(const bitWiseUnits: Cardinal);
- var
- i, n: Integer;
- units: array of Cardinal;
- begin
- n := 0;
- for i := 0 to 7 do
- begin
- if (bitWiseUnits and (1 shl i)) <> 0 then
- Inc(n);
- end;
- SetLength(units, n);
- n := 0;
- for i := 0 to 7 do
- begin
- if (bitWiseUnits and (1 shl i)) <> 0 then
- begin
- units[n] := GL_TEXTURE0 + i;
- Inc(n);
- end;
- end;
- xglMapTexCoordToArbitrary(units);
- end;
- procedure xglMapTexCoordToArbitraryAdd(const bitWiseUnits: Cardinal);
- var
- n: Cardinal;
- begin
- n := xglGetBitWiseMapping;
- xglMapTexCoordToArbitrary(n or bitWiseUnits);
- end;
- function xglGetBitWiseMapping: Cardinal;
- var
- i, n: Cardinal;
- mode: TMapTexCoordMode;
- begin
- if vUpdCount > 0 then
- mode := vUpdNewMode
- else
- mode := xglMapTexCoordMode;
- n := 0;
- case mode of
- mtcmMain: n := 1;
- mtcmDual: n := 3;
- mtcmSecond: n := 2;
- mtcmArbitrary:
- begin
- for i := 0 to vComplexMappingN do
- n := n or (1 shl (vComplexMapping[i] - GL_TEXTURE0));
- end;
- else
- Assert(False);
- end;
- Result := n;
- end;
- // ------------------------------------------------------------------------
- initialization
- // ------------------------------------------------------------------------
- xglMapTexCoordMode := mtcmUndefined;
- xglMapTexCoordToNull;
- end.
|