2
// This unit is part of the GLScene Engine https://github.com/glscene
5
TGLAsmShader is a wrapper for all ARB shaders
6
This component is only a template and has to be replaced with a
7
proper version by someone who uses ARB shaders more then me.
10
23/08/10 - Yar - Upgraded program hadles
11
04/06/10 - Yar - Replace OpenGL functons to OpenGLAdapter
12
28/07/09 - DaStr - Added GeomertyShader support (thanks YarUnderoaker)
13
24/07/09 - DaStr - TGLShader.DoInitialize() now passes rci
14
(BugTracker ID = 2826217)
15
20/03/07 - DaStr - TGLCustomAsmShader now generates its own events
16
All outside stuff moved back to TGLPhongShader
17
22/02/07 - DaStr - Initial version (contributed to GLScene)
19
Previous version history:
20
v1.0 12 March '2005 Creation
21
v1.1 31 October '2006 TGLCustomAsmShader.DoUnApply() Fix
22
TGLAsmShader has more stuff in the published section
34
GLVectorGeometry, GLVectorTypes, GLTexture, OpenGLTokens, GLContext,
35
GLCustomShader, GLRenderContextInfo;
38
TGLCustomAsmShader = class;
39
TGLAsmShaderEvent = procedure(Shader: TGLCustomAsmShader) of object;
40
TGLAsmShaderUnUplyEvent = procedure(Shader: TGLCustomAsmShader; var ThereAreMorePasses: Boolean) of object;
42
TGLAsmShaderParameter = class(TGLCustomShaderParameter)
48
function GetAsVector1f: Single; override;
49
function GetAsVector1i: Integer; override;
50
function GetAsVector2f: TVector2f; override;
51
function GetAsVector2i: TVector2i; override;
52
function GetAsVector3f: TVector3f; override;
53
function GetAsVector3i: TVector3i; override;
54
function GetAsVector4f: TVector; override;
55
function GetAsVector4i: TVector4i; override;
57
procedure SetAsVector1f(const Value: Single); override;
58
procedure SetAsVector1i(const Value: Integer); override;
59
procedure SetAsVector2i(const Value: TVector2i); override;
60
procedure SetAsVector3i(const Value: TVector3i); override;
61
procedure SetAsVector4i(const Value: TVector4i); override;
62
procedure SetAsVector2f(const Value: TVector2f); override;
63
procedure SetAsVector3f(const Value: TVector3f); override;
64
procedure SetAsVector4f(const Value: TVector4f); override;
66
function GetAsMatrix2f: TMatrix2f; override;
67
function GetAsMatrix3f: TMatrix3f; override;
68
function GetAsMatrix4f: TMatrix4f; override;
69
procedure SetAsMatrix2f(const Value: TMatrix2f); override;
70
procedure SetAsMatrix3f(const Value: TMatrix3f); override;
71
procedure SetAsMatrix4f(const Value: TMatrix4f); override;
73
procedure SetAsTexture1D(const TextureIndex: Integer;
74
const Value: TGLTexture);
75
procedure SetAsTexture2D(const TextureIndex: Integer;
76
const Value: TGLTexture);
77
procedure SetAsTexture3D(const TextureIndex: Integer;
78
const Value: TGLTexture);
79
procedure SetAsTextureCube(const TextureIndex: Integer;
80
const Value: TGLTexture);
81
procedure SetAsTextureRect(const TextureIndex: Integer;
82
const Value: TGLTexture);
84
function GetAsCustomTexture(const TextureIndex: Integer;
85
const TextureTarget: Word): Cardinal; override;
86
procedure SetAsCustomTexture(const TextureIndex: Integer;
87
const TextureTarget: Word; const Value: Cardinal); override;
91
TGLCustomAsmShader = class(TGLCustomShader)
94
FVPHandle: TGLARBVertexProgramHandle;
95
FFPHandle: TGLARBFragmentProgramHandle;
96
FGPHandle: TGLARBGeometryProgramHandle;
98
FOnInitialize: TGLAsmShaderEvent;
99
FOnApply: TGLAsmShaderEvent;
100
FOnUnApply: TGLAsmShaderUnUplyEvent;
103
procedure ApplyShaderPrograms;
104
procedure UnApplyShaderPrograms;
105
procedure DestroyARBPrograms; virtual;
107
property OnApply: TGLAsmShaderEvent read FOnApply write FOnApply;
108
property OnUnApply: TGLAsmShaderUnUplyEvent read FOnUnApply write FOnUnApply;
109
property OnInitialize: TGLAsmShaderEvent read FOnInitialize write FOnInitialize;
111
procedure DoInitialize(var rci: TGLRenderContextInfo; Sender: TObject); override;
112
procedure DoApply(var rci: TGLRenderContextInfo; Sender: TObject); override;
113
function DoUnApply(var rci: TGLRenderContextInfo): Boolean; override;
114
procedure DoFinalize; override;
117
constructor Create(AOwner: TComponent); override;
118
destructor Destroy; override;
119
procedure Assign(Source: TPersistent); override;
121
function ShaderSupported: Boolean; override;
124
TGLAsmShader = class(TGLCustomAsmShader)
126
property FragmentProgram;
127
property VertexProgram;
128
property GeometryProgram;
132
property OnInitialize;
134
property ShaderStyle;
135
property FailedInitAction;
140
{ TGLCustomAsmShader }
142
procedure TGLCustomAsmShader.DoFinalize;
148
procedure TGLCustomAsmShader.Assign(Source: TPersistent);
150
inherited Assign(Source);
152
if Source is TGLCustomAsmShader then
154
// Nothing here ...yet
158
constructor TGLCustomAsmShader.Create(AOwner: TComponent);
160
inherited Create(AOwner);
163
destructor TGLCustomAsmShader.Destroy;
170
procedure TGLCustomAsmShader.DestroyARBPrograms;
180
procedure TGLCustomAsmShader.DoApply(var rci: TGLRenderContextInfo; Sender: TObject);
182
ApplyShaderPrograms();
184
if Assigned(FOnApply) then
188
procedure TGLCustomAsmShader.DoInitialize(var rci: TGLRenderContextInfo; Sender: TObject);
190
if not ShaderSupported then
193
HandleFailedInitialization;
197
if VertexProgram.Enabled then
199
if not Assigned(FVPHandle) then
200
FVPHandle := TGLARBVertexProgramHandle.CreateAndAllocate;
201
FVPHandle.LoadARBProgram(VertexProgram.Code.Text);
202
VertexProgram.Enabled := FVPHandle.Ready;
205
if FragmentProgram.Enabled then
207
if not Assigned(FFPHandle) then
208
FFPHandle := TGLARBFragmentProgramHandle.CreateAndAllocate;
209
FFPHandle.LoadARBProgram(FragmentProgram.Code.Text);
210
FragmentProgram.Enabled := FFPHandle.Ready;
213
if GeometryProgram.Enabled then
215
if not Assigned(FGPHandle) then
216
FGPHandle := TGLARBGeometryProgramHandle.CreateAndAllocate;
217
FGPHandle.LoadARBProgram(GeometryProgram.Code.Text);
218
GeometryProgram.Enabled := FGPHandle.Ready;
221
Enabled := (FragmentProgram.Enabled or VertexProgram.Enabled or GeometryProgram.Enabled);
225
if Assigned(FOnInitialize) then
231
function TGLCustomAsmShader.DoUnApply(var rci: TGLRenderContextInfo): Boolean;
233
if Assigned(FOnUnApply) then
234
FOnUnApply(Self, Result)
238
UnApplyShaderPrograms();
241
function TGLCustomAsmShader.ShaderSupported: Boolean;
244
(VertexProgram.Enabled and TGLARBVertexProgramHandle.IsSupported) or
245
(FragmentProgram.Enabled and TGLARBFragmentProgramHandle.IsSupported) or
246
(GeometryProgram.Enabled and TGLARBGeometryProgramHandle.IsSupported);
249
procedure TGLCustomAsmShader.ApplyShaderPrograms;
251
if VertexProgram.Enabled then
256
if FragmentProgram.Enabled then
261
if GeometryProgram.Enabled then
268
procedure TGLCustomAsmShader.UnApplyShaderPrograms;
270
if VertexProgram.Enabled then
272
if FragmentProgram.Enabled then
274
if GeometryProgram.Enabled then
279
RegisterClasses([TGLCustomAsmShader, TGLAsmShader]);