|
- unit uengShaderPartParameter;
-
- {$mode objfpc}{$H+}
- {$I uengShaderFile.inc}
-
- interface
-
- uses
- Classes, SysUtils,
- uengShaderPart, uengShaderCodePart, uengShaderFileParser, uengShaderGeneratorArgs;
-
- type
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TengShaderPartParameter = class(TengShaderCodePart)
- { Code Loading & Storage }
- private
- fName: String;
- fType: String;
- protected
- function GetText: String; override;
- function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
-
- { Code Generation }
- public
- procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
-
- { General }
- public
- property Name: String read fName;
- property Typ: String read fType;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TengShaderPartVar = class(TengShaderPartParameter)
- { Code Loading & Storage }
- private
- fDefaultValue: String;
- protected
- function GetText: String; override;
- function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
-
- { Code Generation }
- public
- procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
-
- { General }
- public
- property DefaultValue: String read fDefaultValue;
-
- { Class Methods }
- public
- class function GetTokenName: String; override;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TengShaderPartVarying = class(TengShaderPartParameter)
- { Code Generation }
- public
- procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
- { Class Methods }
- public
- class function GetTokenName: String; override;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TengShaderPartUniform = class(TengShaderPartParameter)
- { Code Generation }
- public
- procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
-
- { Class Methods }
- public
- class function GetTokenName: String; override;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TengShaderPartConst = class(TengShaderPartParameter)
- { Code Loading & Storage }
- private
- fValue: String;
- protected
- function GetText: String; override;
- function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
-
- { Code Generation }
- public
- procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
-
- { General }
- public
- property Value: String read fValue;
-
- { Class Methods }
- public
- class function GetTokenName: String; override;
- end;
-
- implementation
-
- uses
- uengShaderFileConstants, uengShaderFileTypes;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TengShaderPartParameter///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderPartParameter.GetText: String;
- begin
- result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' +
- TOKEN_CHAR_QUOTE + fType + TOKEN_CHAR_QUOTE + ' ' +
- TOKEN_CHAR_QUOTE + fName + TOKEN_CHAR_QUOTE +
- TOKEN_CHAR_END;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderPartParameter.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
- begin
- if (aParams[0].Name <> GetTokenName) then with aParams[0] do
- raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename, self);
- if (aParams.Count <> 3) then
- raise EengInvalidParamterCount.Create(GetTokenName, 3, self);
-
- result := '';
- fType := aParams[1].Name;
- fName := aParams[2].Name;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- procedure TengShaderPartParameter.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
- begin
- if (gfAddParameterItem in aArgs.Flags) then begin
- inherited GenerateCodeIntern(aArgs);
- aArgs.AddParameter(self);
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TengShaderPartVar/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderPartVar.GetText: String;
- begin
- result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' +
- TOKEN_CHAR_QUOTE + fType + TOKEN_CHAR_QUOTE + ' ' +
- TOKEN_CHAR_QUOTE + fName + TOKEN_CHAR_QUOTE;
- if (fDefaultValue <> '') then
- result := result + ' ' + TOKEN_CHAR_QUOTE + fDefaultValue + TOKEN_CHAR_QUOTE;
- result := result + TOKEN_CHAR_END;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderPartVar.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
- begin
- if (aParams[0].Name <> GetTokenName) then with aParams[0] do
- raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename, self);
- if (aParams.Count < 3) or (aParams.Count > 4) then
- raise EengInvalidParamterCount.Create(GetTokenName, 3, 4, self);
-
- result := '';
- fType := aParams[1].Name;
- fName := aParams[2].Name;
- if (aParams.Count >= 4) then
- fDefaultValue := aParams[3].Name
- else
- fDefaultValue := '';
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- procedure TengShaderPartVar.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
- begin
- inherited GenerateCodeIntern(aArgs);
- if (gfGenerateParameterCode in aArgs.Flags) then begin
- aArgs.AddText(format('%-*s %s', [aArgs.MaxParameterLength, fType, fName]));
- if (fDefaultValue <> '') then
- aArgs.AddText(' = ' + fDefaultValue);
- aArgs.AddCommandEnd(';');
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- class function TengShaderPartVar.GetTokenName: String;
- begin
- result := TOKEN_VAR;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TengShaderPartVarying/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- procedure TengShaderPartVarying.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
- begin
- inherited GenerateCodeIntern(aArgs);
- if (gfGenerateParameterCode in aArgs.Flags) then
- aArgs.AddText(Format('varying %-*s %s;', [aArgs.MaxParameterLength, fType, fName]));
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- class function TengShaderPartVarying.GetTokenName: String;
- begin
- result := TOKEN_VARYING;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TengShaderPartUniform/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- procedure TengShaderPartUniform.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
- begin
- inherited GenerateCodeIntern(aArgs);
- if (gfGenerateParameterCode in aArgs.Flags) then
- aArgs.AddText(Format('uniform %-*s %s;', [aArgs.MaxParameterLength, fType, fName]));
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- class function TengShaderPartUniform.GetTokenName: String;
- begin
- result := TOKEN_UNIFORM;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TengShaderPartConst///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderPartConst.GetText: String;
- begin
- result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' +
- TOKEN_CHAR_QUOTE + fType + TOKEN_CHAR_QUOTE + ' ' +
- TOKEN_CHAR_QUOTE + fName + TOKEN_CHAR_QUOTE + ' ' +
- TOKEN_CHAR_QUOTE + fValue + TOKEN_CHAR_QUOTE +
- TOKEN_CHAR_END;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderPartConst.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
- begin
- if (aParams[0].Name <> GetTokenName) then with aParams[0] do
- raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename, self);
- if (aParams.Count <> 4) then
- raise EengInvalidParamterCount.Create(GetTokenName, 4, self);
-
- result := '';
- fType := aParams[1].Name;
- fName := aParams[2].Name;
- fValue := aParams[3].Name
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- procedure TengShaderPartConst.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
- begin
- inherited GenerateCodeIntern(aArgs);
- if (gfGenerateParameterCode in aArgs.Flags) then
- aArgs.AddText(Format('const %*s %s;', [aArgs.MaxParameterLength, fType, fName]));
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- class function TengShaderPartConst.GetTokenName: String;
- begin
- result := TOKEN_CONST;
- end;
-
- end.
|