| @@ -0,0 +1,70 @@ | |||
| unit uengShaderCodePart; | |||
| {$mode objfpc}{$H+} | |||
| {$I uengShaderFile.inc} | |||
| interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPart, uengShaderFileParser, uengShaderGeneratorArgs | |||
| {$IFDEF USE_BITSPACE_UTILS} | |||
| , uutlGenerics | |||
| {$ENDIF} | |||
| ; | |||
| type | |||
| TengShaderCodePart = class(TengShaderPart) | |||
| { Code Loading & Storage } | |||
| protected | |||
| function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; virtual; | |||
| public | |||
| function ParseText(const aArgs: TengParseArgs): String; | |||
| { Code Generation } | |||
| public | |||
| procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); virtual; | |||
| end; | |||
| CengShaderCodePart = class of TengShaderCodePart; | |||
| TengShaderCodePartList = specialize TutlSimpleList<TengShaderCodePart>; | |||
| implementation | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderCodePart//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderCodePart.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; | |||
| begin | |||
| result := ''; // DUMMY | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderCodePart.ParseText(const aArgs: TengParseArgs): String; | |||
| var | |||
| params: TengTokenParameterList; | |||
| begin | |||
| params := TengTokenParameterList.Create(Filename); | |||
| try | |||
| fCol := aArgs.Col; | |||
| fLine := aArgs.Line; | |||
| if (GetTokenName <> '') then | |||
| aArgs.ExtractToken(self, params); | |||
| result := ParseIntern(aArgs, params); | |||
| finally | |||
| FreeAndNil(params); | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderCodePart.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| var | |||
| s: String; | |||
| begin | |||
| s := GetTokenName; | |||
| if (s <> '') then | |||
| aArgs.AddToken(s); | |||
| end; | |||
| end. | |||
| @@ -295,7 +295,7 @@ type | |||
| ffInherited, // search in inherited classes (this is not a new recursion level!) | |||
| ffFile, // search in file that belongs to this class (this is not a new recursion level!) | |||
| // file | |||
| // file GenCodeIntern | |||
| ffIgnoreClasses // ignore class parts | |||
| ); | |||
| TengFindMappedPartFlags = set of TengFindMappedPartFlag; | |||
| @@ -12,7 +12,8 @@ interface | |||
| uses | |||
| Classes, sysutils, | |||
| uengShaderPart, uengShaderPartClass, uengShaderCodeGenerator, uengShaderFileParser, uengShaderFileTypes | |||
| uengShaderPart, uengShaderPartClass, uengShaderFileParser, uengShaderFileTypes, | |||
| uengShaderGenerator, uengShaderGeneratorArgs | |||
| {$IFDEF USE_BITSPACE_UTILS} | |||
| , uutlSerialization | |||
| @@ -43,6 +44,10 @@ type | |||
| procedure LoadFromFile(const aFilename: String; const aFileReader: IengShaderFileReader = nil); | |||
| procedure SaveToFile(const aFilename: String; const aFileWriter: IengShaderFileWriter = nil); | |||
| { Code Generation } | |||
| public | |||
| procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; | |||
| { General } | |||
| private | |||
| fOnLog: TengShaderFileLogEvent; | |||
| @@ -62,7 +67,7 @@ type | |||
| implementation | |||
| uses | |||
| uengShaderPartInclude, uengShaderPartKeyValuePair; | |||
| uengShaderPartInclude, uengShaderPartKeyValuePair, uengShaderFileHelper; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderFile//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -111,15 +116,19 @@ procedure TengShaderFile.UpdateClasses; | |||
| var | |||
| sr: TengSearchResults; | |||
| walker: TengSearchWalker; | |||
| p: TengShaderPart; | |||
| begin | |||
| sr := TengSearchResults.Create([TengShaderPartClass]); | |||
| sr := TengSearchResults.Create; | |||
| walker := TengSearchWalker.Create(sr); | |||
| try | |||
| Find([sfSearchChildren], sr); | |||
| walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartClass); | |||
| walker.SearchFlags := [sfSearchChildren]; | |||
| fClasses.Clear; | |||
| for p in sr.GetReverseEnumerator do | |||
| for p in sr do | |||
| AddClass(p as TengShaderPartClass); | |||
| finally | |||
| FreeAndNil(walker); | |||
| FreeAndNil(sr); | |||
| end; | |||
| end; | |||
| @@ -150,25 +159,29 @@ end; | |||
| procedure TengShaderFile.UpdateProperties; | |||
| var | |||
| sr: TengSearchResults; | |||
| walker: TengSearchWalker; | |||
| p: TengShaderPart; | |||
| begin | |||
| inherited UpdateProperties; | |||
| sr := TengSearchResults.Create([TengShaderFile]); | |||
| sr := TengSearchResults.Create; | |||
| walker := TengSearchWalker.Create(sr); | |||
| try | |||
| Find(SEARCH_FLAG_FILE_PROPERTIES, sr); | |||
| for p in sr.GetReverseEnumerator do | |||
| walker.Owner := self; | |||
| walker.SearchFlags := [sfSearchChildren, sfIgnoreOwner]; | |||
| walker.ResultTypes := CengShaderPartArr.Create(TengShaderFile); | |||
| walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderCodeGenerator); | |||
| walker.Run(self); | |||
| for p in sr do | |||
| (p as TengShaderFile).CopyProperties(self); | |||
| finally | |||
| FreeAndNil(sr); | |||
| end; | |||
| sr := TengSearchResults.Create([TengShaderPartProperty]); | |||
| try | |||
| Find(SEARCH_FLAG_FILE_PROPERTIES, sr); | |||
| for p in sr.GetReverseEnumerator do | |||
| walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartProperty); | |||
| sr.Clear; | |||
| walker.Run(self); | |||
| for p in sr do | |||
| AddProperty(p as TengShaderPartProperty); | |||
| finally | |||
| FreeAndNil(walker); | |||
| FreeAndNil(sr); | |||
| end; | |||
| end; | |||
| @@ -203,6 +216,7 @@ begin | |||
| FreeAndNil(args); | |||
| end; | |||
| finally | |||
| FreeAndNil(ms); | |||
| fFileReader := nil; | |||
| end; | |||
| end; | |||
| @@ -210,10 +224,11 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderFile.SaveToFile(const aFilename: String; const aFileWriter: IengShaderFileWriter); | |||
| var | |||
| sr: TengSearchResults; | |||
| i: Integer; | |||
| sr: TengSearchResults; | |||
| sl: TStringList; | |||
| ms: TMemoryStream; | |||
| walker: TengSearchWalker; | |||
| begin | |||
| fFileWriter := aFileWriter; | |||
| if not Assigned(fFileWriter) then | |||
| @@ -221,11 +236,13 @@ begin | |||
| if not Assigned(fFileWriter) then | |||
| fFileWriter := TengShaderFileWriter.Create; | |||
| sr := TengSearchResults.Create([TengShaderPartInclude]); | |||
| sr := TengSearchResults.Create; | |||
| sl := TStringList.Create; | |||
| ms := TMemoryStream.Create; | |||
| walker := TengSearchWalker.Create(sr); | |||
| try | |||
| Find([sfSearchChildren, sfChildrenOnlyFile], sr); | |||
| walker.SearchFlags := [sfSearchChildren]; | |||
| walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartInclude); | |||
| for i := 0 to sr.Count-1 do | |||
| (sr[i] as TengShaderPartInclude).SaveToFile(aFilename, aFileWriter); | |||
| sl.Text := Text; | |||
| @@ -233,6 +250,7 @@ begin | |||
| ms.Position := 0; | |||
| fFileWriter.SaveStream(aFilename, ms); | |||
| finally | |||
| FreeAndNil(walker); | |||
| FreeAndNil(sr); | |||
| FreeAndNil(sl); | |||
| FreeAndNil(ms); | |||
| @@ -240,6 +258,15 @@ begin | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderFile.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| inherited GenerateCodeIntern(aArgs); | |||
| if (aArgs.Root = self) then begin | |||
| // TODO generate main routine code (if exists) | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderFile.LogMsgIntern(const aSender: TengShaderPart; const aLogLevel: TengShaderPartLogLevel; const aMsg: String); | |||
| var | |||
| @@ -271,9 +298,9 @@ end; | |||
| destructor TengShaderFile.Destroy; | |||
| begin | |||
| FreeAndNil(fClasses); | |||
| inherited Destroy; | |||
| fFileReader := nil; | |||
| fFileWriter := nil; | |||
| inherited Destroy; | |||
| end; | |||
| end. | |||
| @@ -54,9 +54,10 @@ const | |||
| TOKEN_ELSE = TOKEN_CHAR_IDENT + 'ELSE'; | |||
| TOKEN_END = TOKEN_CHAR_IDENT + 'END'; | |||
| TOKEN_MESSAGE = TOKEN_CHAR_IDENT + 'MESSAGE'; //{$MESSAGE 'message'} | |||
| TOKEN_INFO = TOKEN_CHAR_IDENT + 'INFO'; //{$INFO 'message'} | |||
| TOKEN_WARNING = TOKEN_CHAR_IDENT + 'WARNING'; //{$WARNING 'message'} | |||
| TOKEN_ERROR = TOKEN_CHAR_IDENT + 'ERROR'; //{$ERROR 'message'} | |||
| TOKEN_THROW = TOKEN_CHAR_IDENT + 'THROW'; //{$THROW 'message'} | |||
| TOKEN_OP_LOGICAL_NOT = TOKEN_CHAR_IDENT + 'NOT'; //{$IF $NOT test} | |||
| TOKEN_OP_LOGICAL_OR = TOKEN_CHAR_IDENT + 'OR'; //{$IF test1 $OR test2} | |||
| @@ -133,7 +133,7 @@ type | |||
| implementation | |||
| uses | |||
| uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper; | |||
| uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper, uengShaderPartScope, uengShaderFile; | |||
| const | |||
| EXPRESSION_UNARY_OPERATIONS: array[TengExpressionUnaryOperator] of String = ( | |||
| @@ -236,7 +236,9 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengExpressionVariable.GetValue: Variant; | |||
| begin | |||
| result := Unassigned; // TODO | |||
| result := Unassigned; | |||
| if Assigned(fPart) then | |||
| result := fPart.Value; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -642,7 +644,8 @@ var | |||
| bOp: TengExpressionBinaryOperator; | |||
| item: TengExpressionItem; | |||
| param: TengTokenParameter; | |||
| sr: TkvpSearchResults; | |||
| sr: TengSearchResults; | |||
| walker: TengKeyValuePairSearchWalker; | |||
| tmp: TengShaderPart; | |||
| begin | |||
| item := nil; | |||
| @@ -686,12 +689,20 @@ begin | |||
| end else if IsValidIdentifier(param.Name) then begin | |||
| if not (exVariable in aExpected) then | |||
| RaiseEx('unexpected variable:', param); | |||
| sr := TkvpSearchResults.Create(param.Name, true, true); | |||
| sr := TengSearchResults.Create; | |||
| walker := TengKeyValuePairSearchWalker.Create(sr); | |||
| try | |||
| fParent.Find(SEARCH_FLAG_CURRENT_SCOPE, sr); | |||
| walker.Name := param.Name; | |||
| walker.SearchFlags := [sfSearchChildrenLazy, sfSearchParents]; | |||
| walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartProperty, TengShaderPartStatic); | |||
| walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartScope); | |||
| walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile); | |||
| walker.ParentsDoNotLeave := CengShaderPartArr.Create(TengShaderFile); | |||
| walker.Run(fParent); | |||
| tmp := ExtractSearchResult(fParent, param.Name, sr, param.Line, param.Col); | |||
| result := TengExpressionVariable.Create(param.Name, (tmp as TengShaderPartKeyValuePair), param.Line, param.Col); | |||
| finally | |||
| FreeAndNil(walker); | |||
| FreeAndNil(sr); | |||
| end; | |||
| @@ -13,13 +13,56 @@ function CheckEndToken(const aArgs: TengParseArgs; const aShaderPart: TengShader | |||
| function ExtractSearchResult(const aSender: TengShaderPart; const aIdent: String; const aList: TengShaderPartList; aLine: Integer = -1; aCol: Integer = -1; aFilename: String = ''): TengShaderPart; | |||
| type | |||
| TkvpSearchResults = class(TengSearchResults) | |||
| TengSearchFlag = ( | |||
| sfSearchChildren, // search in children | |||
| sfSearchChildrenLazy, // set sfSearchChildren in next recursion level | |||
| sfSearchParents, // search in Parents | |||
| sfIgnoreOwner // ignore owner of search walker | |||
| ); | |||
| TengSearchFlags = set of TengSearchFlag; | |||
| TengSearchResults = class(TengShaderPartList) | |||
| public | |||
| constructor Create; | |||
| end; | |||
| TengSearchWalker = class(TengShaderPartWalker) | |||
| private type | |||
| TArgs = packed record | |||
| Flags: TengSearchFlags; | |||
| end; | |||
| PArgs = ^TArgs; | |||
| private | |||
| fOwner: TengShaderPart; | |||
| fResults: TengSearchResults; | |||
| fSearchFlags: TengSearchFlags; | |||
| fResultTypes: CengShaderPartArr; | |||
| fChildrenDoNotLeave: CengShaderPartArr; | |||
| fParentsDoNotLeave: CengShaderPartArr; | |||
| fChildrenForceLeave: CengShaderPartArr; | |||
| fParentsForceLeave: CengShaderPartArr; | |||
| protected | |||
| procedure Visit(const aPart, aSender: TengShaderPart; const aArgs: Pointer); override; | |||
| function Check(const aPart: TengShaderPart): Boolean; virtual; | |||
| public | |||
| property Owner: TengShaderPart read fOwner write fOwner; | |||
| property SearchFlags: TengSearchFlags read fSearchFlags write fSearchFlags; | |||
| property ResultTypes: CengShaderPartArr read fResultTypes write fResultTypes; | |||
| property ChildrenDoNotLeave: CengShaderPartArr read fChildrenDoNotLeave write fChildrenDoNotLeave; | |||
| property ParentsDoNotLeave: CengShaderPartArr read fParentsDoNotLeave write fParentsDoNotLeave; | |||
| property ChildrenForceLeave: CengShaderPartArr read fChildrenForceLeave write fChildrenForceLeave; | |||
| property ParentsForceLeave: CengShaderPartArr read fParentsForceLeave write fParentsForceLeave; | |||
| constructor Create(const aResults: TengSearchResults); | |||
| end; | |||
| TengKeyValuePairSearchWalker = class(TengSearchWalker) | |||
| private | |||
| fName: String; | |||
| protected | |||
| function CheckObj(const aPart: TengShaderPart; var aContinue: Boolean): Boolean; override; | |||
| function Check(const aPart: TengShaderPart): Boolean; override; | |||
| public | |||
| constructor Create(const aName: String; const aSearchDefines, aSearchProperties: Boolean); | |||
| property Name: String read fName write fName; | |||
| end; | |||
| implementation | |||
| @@ -81,41 +124,122 @@ begin | |||
| end; | |||
| if (aList.Count <= 0) then | |||
| raise EengUnknownIdentifier.Create(aIdent, aLine, aCol, aFilename, aSender); | |||
| result := aList[0]; | |||
| result := aList[aList.Count-1]; | |||
| if (aList.Count > 1) and Assigned(aSender) then begin | |||
| s := Format('use of duplicate identifier: %s (%s %d:%d)', [aIdent, aList[0].Filename, aList[0].Line + 1, aList[0].Col]) + sLineBreak + | |||
| s := Format('use of duplicate identifier: %s (%s %d:%d)', [aIdent, result.Filename, result.Line + 1, result.Col]) + sLineBreak + | |||
| 'previously declared here:' + sLineBreak; | |||
| i := 1; | |||
| while (i < aList.Count) do begin | |||
| i := aList.Count - 2; | |||
| while (i >= 0) do begin | |||
| s := s + Format(' %s %d:%d', [aList[i].Filename, aList[i].Line + 1, aList[i].Col]) + sLineBreak; | |||
| inc(i); | |||
| dec(i); | |||
| end; | |||
| aSender.LogMsg(llWarning, s); | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TkvpSearchResults///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengSearchResults///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TkvpSearchResults.CheckObj(const aPart: TengShaderPart; var aContinue: Boolean): Boolean; | |||
| constructor TengSearchResults.Create; | |||
| begin | |||
| result := inherited CheckObj(aPart, aContinue); | |||
| if result then | |||
| result := ((aPart as TengShaderPartKeyValuePair).Name = fName); | |||
| inherited Create(false); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TkvpSearchResults.Create(const aName: String; const aSearchDefines, aSearchProperties: Boolean); | |||
| //TengSearchWalker////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengSearchWalker.Visit(const aPart, aSender: TengShaderPart; const aArgs: Pointer); | |||
| var | |||
| args: TArgs; | |||
| function VisitChild(const aItem: TengShaderPart): Boolean; | |||
| var | |||
| c: CengShaderPart; | |||
| begin | |||
| result := (sfSearchChildren in args.Flags) and Assigned(aItem) and (aItem <> aSender); | |||
| if not result then | |||
| exit; | |||
| for c in fChildrenDoNotLeave do | |||
| if (aItem is c) then | |||
| result := false; | |||
| for c in fChildrenForceLeave do | |||
| if (aItem is c) then | |||
| result := true; | |||
| end; | |||
| function VisitParent: Boolean; | |||
| var | |||
| c: CengShaderPart; | |||
| begin | |||
| result := (sfSearchParents in args.Flags) and Assigned(aPart.Parent) and (aPart.Parent <> aSender); | |||
| if not result then | |||
| exit; | |||
| for c in fParentsDoNotLeave do | |||
| if (aPart is c) then | |||
| result := false; | |||
| for c in fParentsForceLeave do | |||
| if (aPart is c) then | |||
| result := true; | |||
| end; | |||
| var | |||
| c: TengShaderPart; | |||
| nextArgs: TArgs; | |||
| begin | |||
| if aSearchDefines and aSearchProperties then | |||
| inherited Create([TengShaderPartStatic, TengShaderPartProperty]) | |||
| else if aSearchDefines then | |||
| inherited Create([TengShaderPartStatic]) | |||
| else if aSearchProperties then | |||
| inherited Create([TengShaderPartProperty]) | |||
| if not Assigned(aPart) then | |||
| exit; | |||
| if Assigned(aArgs) then | |||
| args := PArgs(aArgs)^ | |||
| else | |||
| inherited Create([]); | |||
| fName := aName; | |||
| args.Flags := fSearchFlags; | |||
| nextArgs := args; | |||
| if (sfSearchChildrenLazy in nextArgs.Flags) then | |||
| nextArgs.Flags := nextArgs.Flags + [sfSearchChildren] - [sfSearchChildrenLazy]; | |||
| if Check(aPart.Parent) then | |||
| fResults.Add(aPart.Parent); | |||
| if VisitParent then | |||
| Visit(aPart.Parent, aPart, @nextArgs); | |||
| if (sfSearchChildren in args.Flags) then begin | |||
| for c in aPart do begin | |||
| if Check(c) then | |||
| fResults.Add(c); | |||
| if VisitChild(c) then | |||
| Visit(c, aPart, @args); | |||
| end; | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengSearchWalker.Check(const aPart: TengShaderPart): Boolean; | |||
| var | |||
| c: CengShaderPart; | |||
| begin | |||
| result := (aPart <> fOwner) or not (sfIgnoreOwner in fSearchFlags); | |||
| if result then | |||
| for c in fResultTypes do | |||
| if (aPart is c) then | |||
| exit; | |||
| result := false; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengSearchWalker.Create(const aResults: TengSearchResults); | |||
| begin | |||
| inherited Create; | |||
| fResults := aResults; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengKeyValuePairSearchWalker////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengKeyValuePairSearchWalker.Check(const aPart: TengShaderPart): Boolean; | |||
| begin | |||
| result := | |||
| inherited Check(aPart) and | |||
| (aPart is TengShaderPartKeyValuePair) and | |||
| ((aPart as TengShaderPartKeyValuePair).Name = fName); | |||
| end; | |||
| end. | |||
| @@ -24,11 +24,18 @@ type | |||
| {$ENDIF} | |||
| TengShaderPartLogLevel = ( | |||
| llDebug, | |||
| llInfo, | |||
| llWarning, | |||
| llError | |||
| llError, | |||
| llThrow | |||
| ); | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderCode = class(TStringList) | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //Exceptions//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -1,4 +1,4 @@ | |||
| unit uengShaderCodeGenerator; | |||
| unit uengShaderGenerator; | |||
| {$mode objfpc}{$H+} | |||
| {$I uengShaderFile.inc} | |||
| @@ -7,28 +7,15 @@ interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPart, uengShaderFileParser, uengShaderPartScope, uengShaderPartKeyValuePair | |||
| {$IFDEF USE_BITSPACE_UTILS} | |||
| , uutlGenerics | |||
| {$ENDIF} | |||
| ; | |||
| uengShaderPart, uengShaderFileTypes, uengShaderFileParser, uengShaderPartScope, | |||
| uengShaderPartKeyValuePair, uengShaderGeneratorArgs; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderCodeGenerator = class(TengShaderPartScope) | |||
| { Code Loading & Storage } | |||
| protected type | |||
| TPropertyList = class(specialize TutlSimpleList<TengShaderPartProperty>) | |||
| private | |||
| fValue: Variant; | |||
| public | |||
| property Value: Variant read fValue write fValue; | |||
| constructor Create; | |||
| end; | |||
| TPropertyMap = specialize TutlMap<string, TPropertyList>; | |||
| private | |||
| fPropertyMap: TPropertyMap; | |||
| fPropertyMap: TengShaderPartPropertyMap; | |||
| function GetPropertyByIndex(const aIndex: Integer): Variant; | |||
| function GetPropertyByName(const aName: String): Variant; | |||
| @@ -48,6 +35,10 @@ type | |||
| property PropertyNames [const aIndex: Integer]: String read GetPropertyNames; | |||
| property PropertyCount: Integer read GetPropertyCount; | |||
| { Generate Shader Code } | |||
| public | |||
| procedure GenerateCode(const aCode: TengShaderCode); | |||
| { General } | |||
| public | |||
| constructor Create(const aParent: TengShaderPart); override; | |||
| @@ -56,17 +47,6 @@ type | |||
| implementation | |||
| uses | |||
| uengShaderFileTypes; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderCodeGenerator.TPropertyList///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengShaderCodeGenerator.TPropertyList.Create; | |||
| begin | |||
| inherited Create(false); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderCodeGenerator/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -78,7 +58,7 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderCodeGenerator.GetPropertyByName(const aName: String): Variant; | |||
| var | |||
| l: TPropertyList; | |||
| l: TengShaderPartPropertyList; | |||
| begin | |||
| l := fPropertyMap[aName]; | |||
| if not Assigned(l) then | |||
| @@ -107,7 +87,7 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderCodeGenerator.SetPropertyByName(const aName: String; aValue: Variant); | |||
| var | |||
| l: TPropertyList; | |||
| l: TengShaderPartPropertyList; | |||
| begin | |||
| l := fPropertyMap[aName]; | |||
| if not Assigned(l) then | |||
| @@ -118,7 +98,7 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderCodeGenerator.AddProperty(const aProp: TengShaderPartProperty; const aShowWarning: Boolean); | |||
| var | |||
| l: TPropertyList; | |||
| l: TengShaderPartPropertyList; | |||
| p: TengShaderPartProperty; | |||
| s: String; | |||
| begin | |||
| @@ -132,7 +112,7 @@ begin | |||
| LogMsg(llWarning, s); | |||
| end; | |||
| end else begin | |||
| l := TPropertyList.Create; | |||
| l := TengShaderPartPropertyList.Create; | |||
| fPropertyMap.Add(aProp.Name, l); | |||
| end; | |||
| l.Add(aProp); | |||
| @@ -143,7 +123,7 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderCodeGenerator.CopyProperties(const aGen: TengShaderCodeGenerator); | |||
| var | |||
| l: TPropertyList; | |||
| l: TengShaderPartPropertyList; | |||
| p: TengShaderPartProperty; | |||
| begin | |||
| for l in fPropertyMap do | |||
| @@ -164,11 +144,25 @@ begin | |||
| UpdateProperties; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderCodeGenerator.GenerateCode(const aCode: TengShaderCode); | |||
| var | |||
| args: TengShaderGeneratorArgs; | |||
| begin | |||
| args := TengShaderGeneratorArgs.Create(self); | |||
| try | |||
| inherited GenerateCodeIntern(args); | |||
| args.GenerateCode(aCode); | |||
| finally | |||
| FreeAndNil(args); | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengShaderCodeGenerator.Create(const aParent: TengShaderPart); | |||
| begin | |||
| inherited Create(aParent); | |||
| fPropertyMap := TPropertyMap.Create(true); | |||
| fPropertyMap := TengShaderPartPropertyMap.Create(true); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -0,0 +1,396 @@ | |||
| unit uengShaderGeneratorArgs; | |||
| {$mode objfpc}{$H+} | |||
| {$I uengShaderFile.inc} | |||
| interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderFileTypes, uengShaderPart | |||
| {$IFDEF USE_BITSPACE_UTILS} | |||
| , uutlGenerics | |||
| {$ENDIF} | |||
| ; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengGenerateFlag = ( | |||
| gfGenerateParameterItemCode, // generate code for parameter items | |||
| gfAddParameterItem // add parameter items to generator args | |||
| ); | |||
| TengGenerateFlags = set of TengGenerateFlag; | |||
| TengShaderGeneratorArgs = class(TObject) | |||
| private type | |||
| TengGeneratorToken = ( | |||
| gtNormal, // normal text | |||
| gtLineBreak, // line break | |||
| gtCommandEnd, // command end (like ';') | |||
| gtBlockBegin, // code block begin (to calculate indent) | |||
| gtBlockEnd, // code block end (to calculate indent) | |||
| gtToken // code token (like '$INCLUDE' or '$IF') | |||
| ); | |||
| TCodePart = class(TObject) | |||
| private | |||
| fText: String; | |||
| fToken: TengGeneratorToken; | |||
| function GetText: String; | |||
| public | |||
| property Text: String read GetText; | |||
| property Token: TengGeneratorToken read fToken; | |||
| constructor Create(const aToken: TengGeneratorToken; const aText: String); | |||
| end; | |||
| TCodePartList = specialize TutlSimpleList<TCodePart>; | |||
| TCodeStackItem = class(TObject) | |||
| private | |||
| fItems: TCodePartList; | |||
| function GetIsEmpty: Boolean; | |||
| public | |||
| property Items: TCodePartList read fItems; | |||
| property IsEmpty: Boolean read GetIsEmpty; | |||
| procedure GenerateCode(const aCode: TengShaderCode); | |||
| constructor Create; | |||
| destructor Destroy; override; | |||
| end; | |||
| TCodeStack = specialize TutlSimpleList<TCodeStackItem>; | |||
| private | |||
| fCode: TCodeStack; | |||
| fRoot: TengShaderPart; | |||
| fFlags: TengGenerateFlags; | |||
| public | |||
| property Root: TengShaderPart read fRoot; | |||
| property Flags: TengGenerateFlags read fFlags; | |||
| procedure PushCode; | |||
| procedure PopCode; | |||
| procedure AddText(const aText: String); | |||
| procedure AddToken(const aToken: String); | |||
| procedure AddCommandEnd(const aToken: String); | |||
| procedure AddLineBreak; | |||
| procedure BeginBlock; | |||
| procedure EndBlock; | |||
| procedure AddMeta(const aMeta: TengShaderPart); | |||
| procedure AddParam(const aParam: TengShaderPart); | |||
| procedure GenerateCode(const aCode: TengShaderCode); | |||
| constructor Create(const aRoot: TengShaderPart); | |||
| destructor Destroy; override; | |||
| end; | |||
| implementation | |||
| uses | |||
| Math; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderGeneratorArgs.TCodePart/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderGeneratorArgs.TCodePart.GetText: String; | |||
| begin | |||
| case fToken of | |||
| gtNormal, | |||
| gtCommandEnd: | |||
| result := fText; | |||
| gtLineBreak: | |||
| result := sLineBreak; | |||
| else | |||
| result := ''; | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengShaderGeneratorArgs.TCodePart.Create(const aToken: TengGeneratorToken; const aText: String); | |||
| begin | |||
| inherited Create; | |||
| fToken := aToken; | |||
| fText := aText; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderGeneratorArgs.TCodeStackItem////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderGeneratorArgs.TCodeStackItem.GetIsEmpty: Boolean; | |||
| begin | |||
| result := (fItems.Count = 0); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderGeneratorArgs.TCodeStackItem.GenerateCode(const aCode: TengShaderCode); | |||
| type | |||
| TGenFlag = ( | |||
| gfToken, // current line has a token in it | |||
| gfTokenOnly, // current line has only a token (or whitespaces) in it | |||
| gfPrevIsEmpty, // previouse line was empty (or whitespaces only) | |||
| gfCodeIsEmpty, // nothing has added to code | |||
| gfAddToPrevLine, // add current line to previous line | |||
| gfAddNextLine // add next line to current line (set gfAddToPrevLine on linebreak) | |||
| ); | |||
| TGenFlags = set of TGenFlag; | |||
| const | |||
| WHITESPACES = [' ', #9]; | |||
| var | |||
| i: Integer; | |||
| f: TGenFlags; | |||
| line: String; | |||
| function GetStrOffset(const aStr: String): Integer; | |||
| var | |||
| len: Integer; | |||
| begin | |||
| result := 0; | |||
| len := Length(aStr); | |||
| while (result < len) and (aStr[result+1] in WHITESPACES) do | |||
| inc(result); | |||
| end; | |||
| function GetOffset(const aCodePart: TCodePart): Integer; | |||
| begin | |||
| result := GetStrOffset(line); | |||
| end; | |||
| function GetMinOffset(aStartIndex: Integer): Integer; | |||
| begin | |||
| if (Trim(line) <> '') | |||
| then result := GetStrOffset(line) | |||
| else result := High(Integer); | |||
| while (aStartIndex < aCode.Count) do begin | |||
| if (Trim(aCode[aStartIndex]) <> '') then | |||
| result := Min(result, GetStrOffset(aCode[aStartIndex])); | |||
| inc(aStartIndex); | |||
| end; | |||
| if (result >= High(Integer)) then | |||
| result := -1; | |||
| end; | |||
| function TrimLeftLen(const aStr: String; aLen: Integer): String; | |||
| var | |||
| i, len: Integer; | |||
| begin | |||
| i := 1; | |||
| len := Length(aStr); | |||
| while (i <= len) and (aStr[i] in WHITESPACES) and (aLen > 0) do begin | |||
| inc(i); | |||
| dec(aLen); | |||
| end; | |||
| result := Copy(aStr, i, len - i + 1); | |||
| end; | |||
| function PrepareStr(const aStr: String; const aOffset: Integer): String; | |||
| begin | |||
| if (aOffset < 0) | |||
| then result := StringOfChar(' ', -aOffset) + aStr | |||
| else result := TrimLeftLen(aStr, aOffset); | |||
| end; | |||
| procedure IndentBlock(aStartIndex: Integer; const aIndent: Integer); | |||
| var | |||
| o: Integer; | |||
| begin | |||
| o := GetMinOffset(aStartIndex) - aIndent; | |||
| if (o <= 0) then | |||
| exit; | |||
| while (aStartIndex < aCode.Count) do begin | |||
| aCode[aStartIndex] := PrepareStr(aCode[aStartIndex], o); | |||
| inc(aStartIndex); | |||
| end; | |||
| line := PrepareStr(line, o); | |||
| end; | |||
| procedure ProgressBlock(const aIndent: Integer); | |||
| var | |||
| s: String; | |||
| cp: TCodePart; | |||
| FirstLineIndex: Integer; | |||
| begin | |||
| FirstLineIndex := aCode.Count; | |||
| while (i < fItems.Count) do begin | |||
| cp := fItems[i]; | |||
| inc(i); | |||
| case cp.Token of | |||
| gtLineBreak: begin | |||
| // line has whitespaces only | |||
| if (Trim(line) = '') then begin | |||
| if (f * [gfToken, gfPrevIsEmpty] = []) then begin | |||
| aCode.Add(line); | |||
| Include(f, gfPrevIsEmpty); | |||
| end; | |||
| if not (gfTokenOnly in f) then | |||
| Exclude(f, gfAddToPrevLine); | |||
| // line has text | |||
| end else begin | |||
| if (gfAddToPrevLine in f) and not (gfCodeIsEmpty in f) then begin | |||
| aCode[aCode.Count-1] := aCode[aCode.Count-1] + TrimLeft(line) | |||
| end else begin | |||
| aCode.Add(line); | |||
| Exclude(f, gfPrevIsEmpty); | |||
| Exclude(f, gfCodeIsEmpty); | |||
| end; | |||
| Exclude(f, gfAddToPrevLine); | |||
| end; | |||
| Exclude(f, gfToken); | |||
| Exclude(f, gfTokenOnly); | |||
| if (gfAddNextLine in f) then begin | |||
| Exclude(f, gfAddNextLine); | |||
| Include(f, gfAddToPrevLine); | |||
| end; | |||
| line := ''; | |||
| end; | |||
| gtToken: begin | |||
| Include(f, gfToken); | |||
| if (Trim(line) = '') then | |||
| Include(f, gfTokenOnly); | |||
| end; | |||
| gtBlockBegin: begin | |||
| if (Trim(line) <> '') then | |||
| Include(f, gfAddNextLine); | |||
| Include(f, gfPrevIsEmpty); | |||
| ProgressBlock(GetOffset(cp)); | |||
| end; | |||
| gtBlockEnd: begin | |||
| if (Trim(line) = '') then | |||
| Include(f, gfAddToPrevLine); | |||
| IndentBlock(FirstLineIndex, aIndent); | |||
| exit; | |||
| end; | |||
| else | |||
| s := cp.GetText; | |||
| if (gfAddNextLine in f) and (Trim(s) <> '') then | |||
| Exclude(f, gfAddNextLine); | |||
| line := line + s; | |||
| end; | |||
| end; | |||
| end; | |||
| begin | |||
| i := 0; | |||
| f := [gfPrevIsEmpty, gfCodeIsEmpty]; | |||
| line := ''; | |||
| ProgressBlock(0); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengShaderGeneratorArgs.TCodeStackItem.Create; | |||
| begin | |||
| inherited Create; | |||
| fItems := TCodePartList.Create(true); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| destructor TengShaderGeneratorArgs.TCodeStackItem.Destroy; | |||
| begin | |||
| FreeAndNil(fItems); | |||
| inherited Destroy; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderGeneratorArgs///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderGeneratorArgs.PushCode; | |||
| begin | |||
| fCode.PushLast(TCodeStackItem.Create); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderGeneratorArgs.PopCode; | |||
| var | |||
| csi: TCodeStackItem; | |||
| begin | |||
| csi := fCode.PopLast(false); | |||
| try | |||
| // TODO merge | |||
| finally | |||
| FreeAndNil(csi); | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderGeneratorArgs.AddText(const aText: String); | |||
| begin | |||
| fCode.Last.Items.Add(TCodePart.Create(gtNormal, aText)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderGeneratorArgs.AddToken(const aToken: String); | |||
| begin | |||
| fCode.Last.Items.Add(TCodePart.Create(gtToken, aToken)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderGeneratorArgs.AddCommandEnd(const aToken: String); | |||
| begin | |||
| fCode.Last.Items.Add(TCodePart.Create(gtCommandEnd, aToken)); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderGeneratorArgs.AddLineBreak; | |||
| begin | |||
| fCode.Last.Items.Add(TCodePart.Create(gtLineBreak, '')); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderGeneratorArgs.BeginBlock; | |||
| begin | |||
| fCode.Last.Items.Add(TCodePart.Create(gtBlockBegin, '')); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderGeneratorArgs.EndBlock; | |||
| begin | |||
| fCode.Last.Items.Add(TCodePart.Create(gtBlockEnd, '')); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderGeneratorArgs.AddMeta(const aMeta: TengShaderPart); | |||
| begin | |||
| // TODO | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderGeneratorArgs.AddParam(const aParam: TengShaderPart); | |||
| begin | |||
| // TODO | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderGeneratorArgs.GenerateCode(const aCode: TengShaderCode); | |||
| begin | |||
| fCode.Last.GenerateCode(aCode); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengShaderGeneratorArgs.Create(const aRoot: TengShaderPart); | |||
| begin | |||
| inherited Create; | |||
| fCode := TCodeStack.Create(true); | |||
| fRoot := aRoot; | |||
| PushCode; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| destructor TengShaderGeneratorArgs.Destroy; | |||
| begin | |||
| FreeAndNil(fCode); | |||
| inherited Destroy; | |||
| end; | |||
| end. | |||
| @@ -17,78 +17,18 @@ uses | |||
| {$ENDIF} | |||
| ; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengSearchFlag = ( | |||
| sfEvaluateIf, // evaluate if statements before search and process with suitable subtree | |||
| sfSearchAllIf, // search in all if sub trees | |||
| sfSearchPrevOnly, // search in previous items only | |||
| sfSearchInherited, // search in inherited | |||
| sfSearchChildren, // search in children | |||
| sfSearchChildrenLazy, // set sfSearchChildren in next recursion level | |||
| sfChildrenOnlyFile, // do not leave current file when searching for children | |||
| sfChildrenOnlyClass, // do not leave current class when searching for children | |||
| sfChildrenOnlyGenerator, // do not leave current generator when searching for children | |||
| sfChildrenOnlyScope, // do not leave current scope when searching for children | |||
| sfChildrenForceFile, // overwrite sfChildrenOnlyXXX flag when item is a file | |||
| sfChildrenForceClass, // overwrite sfChildrenOnlyXXX flag when item is a class | |||
| sfChildrenForceGenerator, // overwrite sfChildrenOnlyXXX flag when item is a generator | |||
| sfChildrenForceScope, // overwrite sfChildrenOnlyXXX flag when item is a scope | |||
| sfSearchParents, // search in Parents | |||
| sfParentsOnlyFile, // do not leave current file when searching in parents | |||
| sfParentsOnlyClass, // do not leave current class when searching in parents | |||
| sfParentsOnlyGenerator, // do not leave current generator when searching in parents | |||
| sfParentsOnlyScope, // do not leave current scope when searching in parents | |||
| sfParentsForceFile, // overwrite sfParentsOnlyXXX flag when item is a file | |||
| sfParentsForceClass, // overwrite sfParentsOnlyXXX flag when item is a class | |||
| sfParentsForceGenerator, // overwrite sfParentsOnlyXXX flag when item is a generator | |||
| sfParentsForceScope // overwrite sfParentsOnlyXXX flag when item is a scope | |||
| ); | |||
| TengSearchFlags = set of TengSearchFlag; | |||
| const | |||
| SEARCH_FLAG_CURRENT_SCOPE = [ | |||
| sfSearchPrevOnly, | |||
| sfSearchInherited, | |||
| sfSearchChildrenLazy, | |||
| sfChildrenOnlyScope, | |||
| sfChildrenForceFile, | |||
| sfSearchParents, | |||
| sfParentsOnlyFile | |||
| ]; | |||
| SEARCH_FLAG_CLASS_PROPERTIES = [ | |||
| sfSearchAllIf, | |||
| sfSearchChildren, | |||
| sfChildrenOnlyGenerator, | |||
| sfChildrenForceFile | |||
| ]; | |||
| SEARCH_FLAG_FILE_PROPERTIES = [ | |||
| sfSearchAllIf, | |||
| sfSearchChildren, | |||
| sfChildrenOnlyGenerator | |||
| ]; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderPart = class; | |||
| CengShaderPart = class of TengShaderPart; | |||
| CengShaderPartArr = array of CengShaderPart; | |||
| TengShaderPartList = specialize TutlSimpleList<TengShaderPart>; | |||
| TengSearchResults = class(specialize TutlList<TengShaderPart>) | |||
| private | |||
| fFirstOnly: Boolean; | |||
| fIgnore: TengShaderPart; | |||
| fTypes: array of CengShaderPart; | |||
| TengShaderPartWalker = class(TObject) | |||
| protected | |||
| function CheckObj(const aPart: TengShaderPart; var aContinue: Boolean): Boolean; virtual; | |||
| procedure Visit(const aPart, aCaller: TengShaderPart; const aArgs: Pointer); virtual; | |||
| public | |||
| property FirstOnly: Boolean read fFirstOnly write fFirstOnly; | |||
| property Ignore: TengShaderPart read fIgnore write fIgnore; | |||
| function Add(const aPart: TengShaderPart): Boolean; reintroduce; | |||
| constructor Create(const aTypes: array of CengShaderPart); | |||
| procedure Run(const aPart: TengShaderPart); | |||
| end; | |||
| TengShaderPart = class(TIntfObjNoRefCount) | |||
| @@ -123,7 +63,6 @@ type | |||
| { General } | |||
| protected | |||
| function FindIntern(aFlags: TengSearchFlags; const aChild: TengShaderPart; const aResults: TengSearchResults): Boolean; virtual; | |||
| procedure LogMsgIntern(const aSender: TengShaderPart; const aLogLevel: TengShaderPartLogLevel; const aMsg: String); virtual; | |||
| public { general methods } | |||
| property Root: TengShaderPart read fRoot; | |||
| @@ -143,7 +82,6 @@ type | |||
| function GetParent(const aType: CengShaderPart; out aPart): Boolean; | |||
| function GetParent(const aType: CengShaderPart): TengShaderPart; | |||
| procedure Find(const aFlags: TengSearchFlags; const aResults: TengSearchResults); | |||
| procedure PrintTrace(const aPrefix: String; const aLines: TStrings); | |||
| procedure LogMsg(const aLogLevel: TengShaderPartLogLevel; const aMsg: String); | |||
| @@ -159,19 +97,10 @@ type | |||
| class procedure Validate(const aArgs: TengParseArgs; const aParent: TengShaderPart); virtual; | |||
| end; | |||
| TengShaderCodePart = class(TengShaderPart) | |||
| { Code Loading & Storage } | |||
| protected | |||
| function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; virtual; | |||
| public | |||
| function ParseText(const aArgs: TengParseArgs): String; | |||
| end; | |||
| CengShaderCodePart = class of TengShaderCodePart; | |||
| implementation | |||
| uses | |||
| uengShaderPartScope, uengShaderCodeGenerator, uengShaderPartClass, uengShaderFile, uengShaderFileConstants; | |||
| uengShaderFileConstants; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPart.TEnumerator//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -208,40 +137,17 @@ begin | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengSearchResults///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartWalker////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengSearchResults.CheckObj(const aPart: TengShaderPart; var aContinue: Boolean): Boolean; | |||
| var | |||
| c: CengShaderPart; | |||
| procedure TengShaderPartWalker.Visit(const aPart, aCaller: TengShaderPart; const aArgs: Pointer); | |||
| begin | |||
| aContinue := not fFirstOnly or (Count = 0);; | |||
| if aContinue then begin | |||
| result := (Length(fTypes) = 0); | |||
| for c in fTypes do | |||
| result := result or (aPart is c); | |||
| result := result and (aPart <> fIgnore); | |||
| end else | |||
| result := false; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengSearchResults.Add(const aPart: TengShaderPart): Boolean; | |||
| begin | |||
| result := true; | |||
| if result and CheckObj(aPart, result) then | |||
| inherited Add(aPart); | |||
| // DUMMY | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengSearchResults.Create(const aTypes: array of CengShaderPart); | |||
| var | |||
| i: Integer; | |||
| procedure TengShaderPartWalker.Run(const aPart: TengShaderPart); | |||
| begin | |||
| inherited Create(false); | |||
| fFirstOnly := false; | |||
| SetLength(fTypes, Length(aTypes)); | |||
| for i := Low(fTypes) to High(fTypes) do | |||
| fTypes[i] := aTypes[i]; | |||
| Visit(aPart, nil, nil); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -288,74 +194,6 @@ begin | |||
| else result := nil; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderPart.FindIntern(aFlags: TengSearchFlags; const aChild: TengShaderPart; const aResults: TengSearchResults): Boolean; | |||
| function VisitChild(const aItem: TengShaderPart): Boolean; | |||
| begin | |||
| result := (sfSearchChildren in aFlags); | |||
| if not result then | |||
| exit; | |||
| result := result and | |||
| Assigned(aItem) and | |||
| (not (sfChildrenOnlyFile in aFlags) or not (aItem is TengShaderFile)) and | |||
| (not (sfChildrenOnlyClass in aFlags) or not (aItem is TengShaderPartClass)) and | |||
| (not (sfChildrenOnlyGenerator in aFlags) or not (aItem is TengShaderCodeGenerator)) and | |||
| (not (sfChildrenOnlyScope in aFlags) or not (aItem is TengShaderPartScope)); | |||
| result := result or | |||
| ((sfChildrenForceFile in aFlags) and (aItem is TengShaderFile)) or | |||
| ((sfChildrenForceClass in aFlags) and (aItem is TengShaderPartClass)) or | |||
| ((sfChildrenForceGenerator in aFlags) and (aItem is TengShaderCodeGenerator)) or | |||
| ((sfChildrenForceScope in aFlags) and (aItem is TengShaderPartScope)); | |||
| end; | |||
| function VisitParent: Boolean; | |||
| begin | |||
| result := (sfSearchParents in aFlags); | |||
| if not result then | |||
| exit; | |||
| result := result and | |||
| (not (sfParentsOnlyFile in aFlags) or not (self is TengShaderFile)) and | |||
| (not (sfParentsOnlyClass in aFlags) or not (self is TengShaderPartClass)) and | |||
| (not (sfParentsOnlyGenerator in aFlags) or not (self is TengShaderCodeGenerator)) and | |||
| (not (sfParentsOnlyScope in aFlags) or not (self is TengShaderPartScope)); | |||
| result := result or | |||
| ((sfParentsForceFile in aFlags) and (self is TengShaderFile)) or | |||
| ((sfParentsForceClass in aFlags) and (self is TengShaderPartClass)) or | |||
| ((sfParentsForceGenerator in aFlags) and (self is TengShaderCodeGenerator)) or | |||
| ((sfParentsForceScope in aFlags) and (self is TengShaderPartScope)); | |||
| end; | |||
| var | |||
| c: TengShaderPart; | |||
| b: Boolean; | |||
| begin | |||
| b := false; | |||
| result := true; | |||
| if (sfSearchChildren in aFlags) then begin | |||
| for c in self.GetReverseEnumerator do begin | |||
| b := b or (c = aChild); | |||
| if (sfSearchPrevOnly in aFlags) and not b then | |||
| continue; | |||
| if (c <> aChild) then begin | |||
| result := result and aResults.Add(c); | |||
| if VisitChild(c) then | |||
| result := result and c.FindIntern(aFlags - [sfSearchParents, sfSearchPrevOnly], nil, aResults); | |||
| end; | |||
| if not result then | |||
| exit; | |||
| end; | |||
| end; | |||
| if (sfSearchChildrenLazy in aFlags) then | |||
| aFlags := aFlags + [sfSearchChildren] - [sfSearchChildrenLazy]; | |||
| if (sfSearchParents in aFlags) and Assigned(Parent) then begin | |||
| if VisitParent then | |||
| result := result and Parent.FindIntern(aFlags, self, aResults); | |||
| result := result and aResults.Add(Parent); | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPart.LogMsgIntern(const aSender: TengShaderPart; const aLogLevel: TengShaderPartLogLevel; const aMsg: String); | |||
| begin | |||
| @@ -391,12 +229,6 @@ begin | |||
| raise EengShaderPartInternal.Create(GetTokenName + ' ha sno parent of type ' + aType.GetTokenName, self); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPart.Find(const aFlags: TengSearchFlags; const aResults: TengSearchResults); | |||
| begin | |||
| FindIntern(aFlags, nil, aResults); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPart.PrintTrace(const aPrefix: String; const aLines: TStrings); | |||
| @@ -464,30 +296,5 @@ begin | |||
| // DUMMY | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderCodePart//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderCodePart.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; | |||
| begin | |||
| result := ''; // DUMMY | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderCodePart.ParseText(const aArgs: TengParseArgs): String; | |||
| var | |||
| params: TengTokenParameterList; | |||
| begin | |||
| params := TengTokenParameterList.Create(Filename); | |||
| try | |||
| fCol := aArgs.Col; | |||
| fLine := aArgs.Line; | |||
| if (GetTokenName <> '') then | |||
| aArgs.ExtractToken(self, params); | |||
| result := ParseIntern(aArgs, params); | |||
| finally | |||
| FreeAndNil(params); | |||
| end; | |||
| end; | |||
| end. | |||
| @@ -7,7 +7,7 @@ interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPart, uengShaderFileParser; | |||
| uengShaderPart, uengShaderCodePart, uengShaderFileParser, uengShaderGeneratorArgs; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -20,6 +20,10 @@ type | |||
| function GetText: String; override; | |||
| function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; | |||
| { Code Generation } | |||
| public | |||
| procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; | |||
| { General } | |||
| private | |||
| function GetParameters: TStrings; | |||
| @@ -89,6 +93,13 @@ begin | |||
| fParameters.AddObject(aParams[i].Name, TObject(PtrInt(aParams[i].Quoted))); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartCall.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| inherited GenerateCodeIntern(aArgs); | |||
| // TODO | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderPartCall.GetParameters: TStrings; | |||
| begin | |||
| @@ -7,7 +7,7 @@ interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPart, uengShaderCodeGenerator, uengShaderFileParser | |||
| uengShaderPart, uengShaderGenerator, uengShaderGeneratorArgs, uengShaderFileParser | |||
| {$IFDEF USE_BITSPACE_UTILS} | |||
| , uutlGenerics | |||
| @@ -32,6 +32,10 @@ type | |||
| function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; | |||
| procedure UpdateProperties; override; | |||
| { Code Generation } | |||
| public | |||
| procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; | |||
| { General } | |||
| public | |||
| property Name: String read fName; | |||
| @@ -50,7 +54,7 @@ type | |||
| implementation | |||
| uses | |||
| uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper, uengShaderPartKeyValuePair; | |||
| uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper, uengShaderPartKeyValuePair, uengShaderPartScope, uengShaderFile; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartClass/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -74,22 +78,35 @@ procedure TengShaderPartClass.UpdateInherited; | |||
| end; | |||
| var | |||
| sr: TengSearchResults; | |||
| res: TengShaderPartList; | |||
| sr, res: TengSearchResults; | |||
| walker: TengSearchWalker; | |||
| s: String; | |||
| begin | |||
| if (fExtends.Count <= 0) then | |||
| exit; | |||
| sr := TengSearchResults.Create([TengShaderPartClass]); | |||
| res := TengShaderPartList.Create(false); | |||
| sr := TengSearchResults.Create; | |||
| res := TengSearchResults.Create; | |||
| walker := TengSearchWalker.Create(sr); | |||
| try | |||
| walker.Owner := self; | |||
| walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartClass); | |||
| walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartScope); | |||
| walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile); | |||
| walker.ParentsDoNotLeave := CengShaderPartArr.Create(TengShaderFile); | |||
| walker.SearchFlags := [ | |||
| sfIgnoreOwner, | |||
| sfSearchChildrenLazy, | |||
| sfSearchChildren, | |||
| sfSearchParents | |||
| ]; | |||
| fInherited.Clear; | |||
| Find(SEARCH_FLAG_CURRENT_SCOPE, sr); | |||
| walker.Run(self); | |||
| for s in fExtends do begin | |||
| FilterResults(s, sr, res); | |||
| fInherited.Add(ExtractSearchResult(self, s, res) as TengShaderPartClass); | |||
| end; | |||
| finally | |||
| FreeAndNil(walker); | |||
| FreeAndNil(res); | |||
| FreeAndNil(sr); | |||
| end; | |||
| @@ -143,6 +160,7 @@ end; | |||
| procedure TengShaderPartClass.UpdateProperties; | |||
| var | |||
| sr: TengSearchResults; | |||
| walker: TengSearchWalker; | |||
| p: TengShaderPart; | |||
| c: TengShaderPartClass; | |||
| begin | |||
| @@ -151,16 +169,35 @@ begin | |||
| for c in fInherited do | |||
| c.CopyProperties(self); | |||
| sr := TengSearchResults.Create([TengShaderPartProperty]); | |||
| sr := TengSearchResults.Create; | |||
| walker := TengSearchWalker.Create(sr); | |||
| try | |||
| Find(SEARCH_FLAG_CLASS_PROPERTIES, sr); | |||
| walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartProperty); | |||
| walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderCodeGenerator); | |||
| walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile); | |||
| walker.Run(self); | |||
| for p in sr.GetReverseEnumerator do | |||
| AddProperty(p as TengShaderPartProperty); | |||
| finally | |||
| FreeAndNil(walker); | |||
| FreeAndNil(sr); | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartClass.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| var | |||
| c: TengShaderPartClass; | |||
| begin | |||
| if (aArgs.Root <> self) then | |||
| exit; | |||
| for c in fInherited do | |||
| c.GenerateCodeIntern(aArgs); | |||
| inherited GenerateCodeIntern(aArgs); | |||
| // TODO generate main routine | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengShaderPartClass.Create(const aParent: TengShaderPart); | |||
| begin | |||
| @@ -7,22 +7,28 @@ interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPart, uengShaderFileParser; | |||
| uengShaderPart, uengShaderCodePart, uengShaderFileParser, uengShaderGeneratorArgs; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderPartCntr = class(TengShaderCodePart) | |||
| { Code Loading & Storage } | |||
| private | |||
| fChildren: TengShaderPartList; | |||
| procedure AddChild(const aChild: TengShaderPart; const aPrepend: Boolean = false); | |||
| fChildren: TengShaderCodePartList; | |||
| procedure AddChild(const aChild: TengShaderCodePart; const aPrepend: Boolean = false); | |||
| function HandleToken(const aToken: String; const aArgs: TengParseArgs): String; | |||
| protected { virtual getter } | |||
| function GetCount: Integer; override; | |||
| function GetChild(const aIndex: Integer): TengShaderPart; override; | |||
| function GetText: String; override; | |||
| function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; | |||
| public { general methods } | |||
| { Code Generation } | |||
| public | |||
| procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; | |||
| { General } | |||
| public | |||
| procedure Clear; virtual; | |||
| constructor Create(const aParent: TengShaderPart); override; | |||
| destructor Destroy; override; | |||
| @@ -33,7 +39,11 @@ implementation | |||
| uses | |||
| uengShaderPartKeyValuePair, uengShaderPartClass, uengShaderPartMessage, uengShaderPartMeta, | |||
| uengShaderPartCall, uengShaderPartProc, uengShaderPartText, uengShaderPartEcho, uengShaderPartIf, | |||
| uengShaderPartInclude, uengShaderPartParameter, uengShaderPartComment; | |||
| uengShaderPartInclude, uengShaderPartParameter, uengShaderPartComment, uengShaderFileConstants | |||
| {$IFDEF DEBUG} | |||
| , uengShaderFileTypes | |||
| {$ENDIF} | |||
| ; | |||
| const | |||
| TOKEN_CLASSES: array[0..21] of CengShaderCodePart = ( | |||
| @@ -51,7 +61,7 @@ const | |||
| TengShaderPartInclude, | |||
| TengShaderPartInherited, | |||
| TengShaderPartFunc, | |||
| TengShaderPartMessage, | |||
| TengShaderPartInfo, | |||
| TengShaderPartMeta, | |||
| TengShaderPartProc, | |||
| TengShaderPartProperty, | |||
| @@ -64,7 +74,7 @@ const | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartCntr//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartCntr.AddChild(const aChild: TengShaderPart; const aPrepend: Boolean); | |||
| procedure TengShaderPartCntr.AddChild(const aChild: TengShaderCodePart; const aPrepend: Boolean); | |||
| begin | |||
| if aPrepend | |||
| then fChildren.PushFirst(aChild) | |||
| @@ -86,6 +96,10 @@ begin | |||
| break; | |||
| end; | |||
| end; | |||
| {$IFDEF DEBUG} | |||
| if Assigned(p) then | |||
| LogMsg(llDebug, 'ParseText: ' + p.ClassName); | |||
| {$ENDIF} | |||
| if Assigned(p) | |||
| then result := p.ParseText(aArgs) | |||
| else result := aToken; | |||
| @@ -136,6 +150,20 @@ begin | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartCntr.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| var | |||
| p: TengShaderCodePart; | |||
| begin | |||
| aArgs.AddToken(GetTokenName); | |||
| try | |||
| for p in fChildren do | |||
| p.GenerateCodeIntern(aArgs); | |||
| finally | |||
| aArgs.AddToken(TOKEN_END); | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartCntr.Clear; | |||
| begin | |||
| @@ -146,7 +174,7 @@ end; | |||
| constructor TengShaderPartCntr.Create(const aParent: TengShaderPart); | |||
| begin | |||
| inherited Create(aParent); | |||
| fChildren := TengShaderPartList.Create(true); | |||
| fChildren := TengShaderCodePartList.Create(true); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -7,7 +7,7 @@ interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPart, uengShaderFileParser; | |||
| uengShaderPart, uengShaderCodePart, uengShaderFileParser; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -7,7 +7,7 @@ interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPart, uengShaderFileParser; | |||
| uengShaderPart, uengShaderCodePart, uengShaderFileParser, uengShaderPartKeyValuePair, uengShaderGeneratorArgs; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -15,10 +15,15 @@ type | |||
| { Code Loading & Storage } | |||
| private | |||
| fName: String; | |||
| fValue: TengShaderPartKeyValuePair; | |||
| 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 | |||
| class function GetTokenName: String; override; | |||
| @@ -27,7 +32,7 @@ type | |||
| implementation | |||
| uses | |||
| uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper; | |||
| uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper, uengShaderPartScope, uengShaderFile; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartEcho//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -39,6 +44,9 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderPartEcho.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; | |||
| var | |||
| sr: TengSearchResults; | |||
| walker: TengKeyValuePairSearchWalker; | |||
| begin | |||
| if (aParams[0].Name <> GetTokenName) then with aParams[0] do | |||
| raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename, self); | |||
| @@ -50,6 +58,32 @@ begin | |||
| raise EengInvalidIdentifier.Create(Name, self); | |||
| fName := Name; | |||
| end; | |||
| sr := TengSearchResults.Create; | |||
| walker := TengKeyValuePairSearchWalker.Create(sr); | |||
| try | |||
| walker.Name := fName; | |||
| walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartProperty, TengShaderPartStatic); | |||
| walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartScope); | |||
| walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile); | |||
| walker.ParentsDoNotLeave := CengShaderPartArr.Create(TengShaderFile); | |||
| walker.SearchFlags := [ | |||
| sfSearchChildrenLazy, | |||
| sfSearchChildren, | |||
| sfSearchParents | |||
| ]; | |||
| walker.Run(self); | |||
| fValue := (ExtractSearchResult(self, fName, sr) as TengShaderPartKeyValuePair); | |||
| finally | |||
| FreeAndNil(walker); | |||
| FreeAndNil(sr); | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartEcho.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| inherited GenerateCodeIntern(aArgs); | |||
| aArgs.AddText(fValue.Value); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -7,16 +7,23 @@ interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPart, uengShaderPartScope, uengShaderFileExpression, uengShaderFileParser; | |||
| uengShaderPart, uengShaderCodePart, uengShaderPartScope, uengShaderFileExpression, | |||
| uengShaderFileParser, uengShaderGeneratorArgs; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderPartIf = class(TengShaderCodePart) | |||
| TengShaderPartIfCntr = class(TengShaderPartScope) | |||
| { Class Methods } | |||
| public | |||
| class function GetTokenName: String; override; | |||
| end; | |||
| TengShaderPartIf = class(TengShaderPartIfCntr) | |||
| { Code Loading & Storage } | |||
| private | |||
| fExpression: TengExpressionItem; | |||
| fIfPart: TengShaderCodePart; | |||
| fElsePart: TengShaderCodePart; | |||
| fIfPart: TengShaderPartScope; | |||
| fElsePart: TengShaderPartScope; | |||
| function HandleToken(const aToken: String; const aArgs: TengParseArgs): String; | |||
| protected | |||
| function HandeEndToken(const aToken: String; const aArgs: TengParseArgs): String; virtual; | |||
| @@ -25,16 +32,17 @@ type | |||
| function GetText: String; override; | |||
| function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; | |||
| { General } | |||
| protected | |||
| function FindIntern(aFlags: TengSearchFlags; const aChild: TengShaderPart; const aResults: TengSearchResults): Boolean; override; | |||
| { Code Generation } | |||
| public | |||
| property Expression: TengExpressionItem read fExpression; | |||
| destructor Destroy; override; | |||
| procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; | |||
| { Class Methods } | |||
| { General } | |||
| public | |||
| class function GetTokenName: String; override; | |||
| property Expression: TengExpressionItem read fExpression; | |||
| property IfPart: TengShaderPartScope read fIfPart; | |||
| property ElsePart: TengShaderPartScope read fElsePart; | |||
| destructor Destroy; override; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -64,17 +72,27 @@ implementation | |||
| uses | |||
| uengShaderFileTypes, uengShaderFileConstants, uengShaderFileHelper; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartIfCntr////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| class function TengShaderPartIfCntr.GetTokenName: String; | |||
| begin | |||
| result := TOKEN_IF; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartIf////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderPartIf.HandleToken(const aToken: String; const aArgs: TengParseArgs): String; | |||
| type | |||
| CengShaderPartScope = class of TengShaderPartScope; | |||
| const | |||
| TOKEN_CLASSES: array[0..1] of CengShaderCodePart = ( | |||
| TOKEN_CLASSES: array[0..1] of CengShaderPartScope = ( | |||
| TengShaderPartElse, | |||
| TengShaderPartElIf | |||
| ); | |||
| var | |||
| c: CengShaderCodePart; | |||
| c: CengShaderPartScope; | |||
| begin | |||
| for c in TOKEN_CLASSES do begin | |||
| if c.CheckToken(aToken) then begin | |||
| @@ -132,27 +150,23 @@ begin | |||
| fExpression := ParseExpression(self, aParams, 1); | |||
| fIfPart := TengShaderPartScope.Create(self); | |||
| fIfPart := TengShaderPartIfCntr.Create(self); | |||
| result := fIfPart.ParseText(aArgs); | |||
| result := HandleToken(result, aArgs); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderPartIf.FindIntern(aFlags: TengSearchFlags; const aChild: TengShaderPart; const aResults: TengSearchResults): Boolean; | |||
| procedure TengShaderPartIf.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| var | |||
| b: Boolean; | |||
| p: TengShaderCodePart; | |||
| begin | |||
| result := true; | |||
| if (sfEvaluateIf in aFlags) and (sfSearchChildren in aFlags) then begin | |||
| if fExpression.GetValue then begin | |||
| if Assigned(fIfPart) then | |||
| fIfPart.Find(aFlags, aResults); | |||
| end else begin | |||
| if Assigned(fElsePart) then | |||
| fElsePart.Find(aFlags, aResults); | |||
| end; | |||
| end; | |||
| if not (sfSearchAllIf in aFlags) and (sfSearchChildren in aFlags) then | |||
| aFlags := aFlags - [sfSearchChildren] + [sfSearchChildrenLazy]; | |||
| result := result and inherited FindIntern(aFlags, aChild, aResults); | |||
| b := fExpression.GetValue; | |||
| if b | |||
| then p := fIfPart | |||
| else p := fElsePart; | |||
| if Assigned(p) then | |||
| p.GenerateCodeIntern(aArgs); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -164,12 +178,6 @@ begin | |||
| inherited Destroy; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| class function TengShaderPartIf.GetTokenName: String; | |||
| begin | |||
| result := TOKEN_IF; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartElIf//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -7,7 +7,8 @@ interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPart, uengShaderFile, uengShaderFileParser, uengShaderFileTypes; | |||
| uengShaderPart, uengShaderCodePart, uengShaderFile, uengShaderFileParser, uengShaderFileTypes, | |||
| uengShaderGeneratorArgs; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -24,6 +25,10 @@ type | |||
| 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 IncludeFile: String read fIncludeFile; | |||
| @@ -89,6 +94,15 @@ begin | |||
| LoadShaderFile; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartInclude.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| LoadShaderFile; | |||
| inherited GenerateCodeIntern(aArgs); | |||
| if Assigned(fShaderFile) then | |||
| fShaderFile.GenerateCodeIntern(aArgs); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartInclude.SaveToFile(const aFilename: String; const aFileWriter: IengShaderFileWriter); | |||
| begin | |||
| @@ -7,7 +7,12 @@ interface | |||
| uses | |||
| Classes, SysUtils, variants, | |||
| uengShaderPart, uengShaderFileParser; | |||
| uengShaderCodePart, uengShaderFileParser | |||
| {$IFDEF USE_BITSPACE_UTILS} | |||
| , uutlGenerics | |||
| {$ENDIF} | |||
| ; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -16,26 +21,47 @@ type | |||
| { Code Loading & Storage } | |||
| private | |||
| fName: String; | |||
| fValue: Variant; | |||
| fValueName: String; | |||
| fDefaultValue: Variant; | |||
| protected | |||
| fValue: Variant; | |||
| function GetText: String; override; | |||
| function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; | |||
| { General } | |||
| public | |||
| property Name: String read fName; | |||
| property Value: Variant read fValue; | |||
| property ValueName: String read fValueName; | |||
| property Name: String read fName; | |||
| property ValueName: String read fValueName; | |||
| property Value: Variant read fValue; | |||
| property DefaultValue: Variant read fDefaultValue; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderPartProperty = class(TengShaderPartKeyValuePair) | |||
| { General } | |||
| public | |||
| property Value: Variant read fValue write fValue; | |||
| { Class Methods } | |||
| public | |||
| class function GetTokenName: String; override; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderPartPropertyList = class(specialize TutlSimpleList<TengShaderPartProperty>) | |||
| private | |||
| fValue: Variant; | |||
| public | |||
| property Value: Variant read fValue write fValue; | |||
| procedure ApplyValue; | |||
| constructor Create; | |||
| end; | |||
| TengShaderPartPropertyMap = class(specialize TutlMap<string, TengShaderPartPropertyList>) | |||
| public | |||
| procedure ApplyValues; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderPartStatic = class(TengShaderPartKeyValuePair) | |||
| { Class Methods } | |||
| @@ -46,7 +72,35 @@ type | |||
| implementation | |||
| uses | |||
| uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper; | |||
| uengShaderPart, uengShaderFile, uengShaderPartScope, uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartPropertyList///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartPropertyList.ApplyValue; | |||
| var | |||
| p: TengShaderPartProperty; | |||
| begin | |||
| for p in self do | |||
| p.Value := fValue; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengShaderPartPropertyList.Create; | |||
| begin | |||
| inherited Create(false); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartPropertyMap///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartPropertyMap.ApplyValues; | |||
| var | |||
| l: TengShaderPartPropertyList; | |||
| begin | |||
| for l in self do | |||
| l.ApplyValue; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartKeyValuePair//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -65,6 +119,7 @@ end; | |||
| function TengShaderPartKeyValuePair.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; | |||
| var | |||
| sr: TengSearchResults; | |||
| walker: TengKeyValuePairSearchWalker; | |||
| begin | |||
| if (aParams[0].Name <> GetTokenName) then with aParams[0] do | |||
| raise EengInvalidToken.Create(ClassName, GetTokenName, Line, Col, Filename, self); | |||
| @@ -77,15 +132,29 @@ begin | |||
| raise EengInvalidIdentifier.Create(fName, Line, Col, Filename, self); | |||
| if (aParams.Count >= 3) then | |||
| if aParams[2].Quoted then begin | |||
| fValue := aParams[2].Name; | |||
| fValueName := ''; | |||
| fDefaultValue := aParams[2].Name; | |||
| fValue := fDefaultValue; | |||
| fValueName := ''; | |||
| end else begin | |||
| fValueName := aParams[2].Name; | |||
| sr := TkvpSearchResults.Create(fValueName, true, false); | |||
| sr := TengSearchResults.Create; | |||
| walker := TengKeyValuePairSearchWalker.Create(sr); | |||
| try | |||
| Find(SEARCH_FLAG_CURRENT_SCOPE, sr); | |||
| fValue := (ExtractSearchResult(self, fValueName, sr) as TengShaderPartStatic).Value; | |||
| walker.Name := fValueName; | |||
| walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartStatic); | |||
| walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartScope); | |||
| walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile); | |||
| walker.ParentsDoNotLeave := CengShaderPartArr.Create(TengShaderFile); | |||
| walker.SearchFlags := [ | |||
| sfSearchChildrenLazy, | |||
| sfSearchChildren, | |||
| sfSearchParents | |||
| ]; | |||
| walker.Run(self); | |||
| fDefaultValue := (ExtractSearchResult(self, fValueName, sr) as TengShaderPartStatic).Value; | |||
| fValue := fDefaultValue; | |||
| finally | |||
| FreeAndNil(walker); | |||
| FreeAndNil(sr); | |||
| end; | |||
| end | |||
| @@ -7,25 +7,158 @@ interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPart; | |||
| uengShaderPart, uengShaderCodePart, uengShaderFileParser, uengShaderFileTypes, uengShaderGeneratorArgs; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderPartMessage = class(TengShaderCodePart) | |||
| TengShaderPartInfo = class(TengShaderCodePart) | |||
| private | |||
| fMessage: String; | |||
| { Code Loading & Storage } | |||
| protected | |||
| fLogLevel: TengShaderPartLogLevel; | |||
| 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 Message: String read fMessage; | |||
| constructor Create(const aParent: TengShaderPart); override; | |||
| { Class Methods } | |||
| public | |||
| class function GetTokenName: String; override; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderPartWarning = class(TengShaderPartMessage) | |||
| TengShaderPartWarning = class(TengShaderPartInfo) | |||
| { General } | |||
| public | |||
| constructor Create(const aParent: TengShaderPart); override; | |||
| { Class Methods } | |||
| public | |||
| class function GetTokenName: String; override; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderPartError = class(TengShaderPartMessage) | |||
| TengShaderPartError = class(TengShaderPartInfo) | |||
| { General } | |||
| public | |||
| constructor Create(const aParent: TengShaderPart); override; | |||
| { Class Methods } | |||
| public | |||
| class function GetTokenName: String; override; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| EengShaderPartThrow = class(EengShaderPart); | |||
| TengShaderPartThrow = class(TengShaderPartInfo) | |||
| { General } | |||
| public | |||
| constructor Create(const aParent: TengShaderPart); override; | |||
| { Class Methods } | |||
| public | |||
| class function GetTokenName: String; override; | |||
| end; | |||
| implementation | |||
| uses | |||
| uengShaderFileConstants; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartInfo///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderPartInfo.GetText: String; | |||
| begin | |||
| result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' + TOKEN_CHAR_QUOTE + fMessage + TOKEN_CHAR_QUOTE + TOKEN_CHAR_END; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| function TengShaderPartInfo.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 <> 2) then | |||
| raise EengInvalidParamterCount.Create(GetTokenName, 2, self); | |||
| fMessage := aParams[1].Name; | |||
| result := inherited ParseIntern(aArgs, aParams); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartInfo.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| inherited GenerateCodeIntern(aArgs); | |||
| if (fLogLevel = llThrow) | |||
| then raise EengShaderPartThrow.Create(fMessage, self) | |||
| else LogMsg(fLogLevel, fMessage); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengShaderPartInfo.Create(const aParent: TengShaderPart); | |||
| begin | |||
| inherited Create(aParent); | |||
| fLogLevel := llInfo; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| class function TengShaderPartInfo.GetTokenName: String; | |||
| begin | |||
| result := TOKEN_INFO; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengShaderPartWarning.Create(const aParent: TengShaderPart); | |||
| begin | |||
| inherited Create(aParent); | |||
| fLogLevel := llWarning; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartWarning///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| class function TengShaderPartWarning.GetTokenName: String; | |||
| begin | |||
| result := TOKEN_WARNING; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengShaderPartError.Create(const aParent: TengShaderPart); | |||
| begin | |||
| inherited Create(aParent); | |||
| fLogLevel := llError; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartError/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| class function TengShaderPartError.GetTokenName: String; | |||
| begin | |||
| result := TOKEN_ERROR; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengShaderPartThrow.Create(const aParent: TengShaderPart); | |||
| begin | |||
| inherited Create(aParent); | |||
| fLogLevel := llThrow; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartThrow/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| class function TengShaderPartThrow.GetTokenName: String; | |||
| begin | |||
| result := TOKEN_THROW; | |||
| end; | |||
| end. | |||
| @@ -7,7 +7,7 @@ interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPart, uengShaderFileParser; | |||
| uengShaderPart, uengShaderCodePart, uengShaderFileParser, uengShaderGeneratorArgs; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -28,6 +28,8 @@ type | |||
| property Name: String read fName; | |||
| property Values: TStrings read GetValues; | |||
| procedure Assign(const aValues: TengMetaData); | |||
| constructor Create(const aName: String; const aType: TengMetaType); | |||
| destructor Destroy; override; | |||
| end; | |||
| @@ -41,6 +43,10 @@ type | |||
| 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 Data: TengMetaData read fData; | |||
| @@ -65,6 +71,15 @@ begin | |||
| result := fValues; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengMetaData.Assign(const aValues: TengMetaData); | |||
| begin | |||
| fName := aValues.Name; | |||
| fMetaType := aValues.MetaType; | |||
| fValues.Clear; | |||
| fValues.AddStrings(aValues.Values); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengMetaData.Create(const aName: String; const aType: TengMetaType); | |||
| begin | |||
| @@ -151,6 +166,13 @@ begin | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartMeta.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| inherited GenerateCodeIntern(aArgs); | |||
| aArgs.AddMeta(self); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TengShaderPartMeta.Create(const aParent: TengShaderPart); | |||
| begin | |||
| @@ -7,7 +7,7 @@ interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPart, uengShaderFileParser; | |||
| uengShaderPart, uengShaderCodePart, uengShaderFileParser, uengShaderGeneratorArgs; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -20,6 +20,10 @@ type | |||
| 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; | |||
| @@ -35,6 +39,10 @@ type | |||
| 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; | |||
| @@ -46,6 +54,9 @@ type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderPartVarying = class(TengShaderPartParameter) | |||
| { Code Generation } | |||
| public | |||
| procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; | |||
| { Class Methods } | |||
| public | |||
| class function GetTokenName: String; override; | |||
| @@ -53,6 +64,10 @@ type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderPartUniform = class(TengShaderPartParameter) | |||
| { Code Generation } | |||
| public | |||
| procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; | |||
| { Class Methods } | |||
| public | |||
| class function GetTokenName: String; override; | |||
| @@ -67,6 +82,10 @@ type | |||
| 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; | |||
| @@ -105,6 +124,15 @@ begin | |||
| fName := aParams[2].Name; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartParameter.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| if (gfAddParameterItem in aArgs.Flags) then begin | |||
| inherited GenerateCodeIntern(aArgs); | |||
| aArgs.AddParam(self); | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartVar///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -135,6 +163,15 @@ begin | |||
| fDefaultValue := ''; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartVar.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| inherited GenerateCodeIntern(aArgs); | |||
| if (gfGenerateParameterItemCode in aArgs.Flags) then begin | |||
| // TODO | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| class function TengShaderPartVar.GetTokenName: String; | |||
| begin | |||
| @@ -143,6 +180,15 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartVarying///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartVarying.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| inherited GenerateCodeIntern(aArgs); | |||
| if (gfGenerateParameterItemCode in aArgs.Flags) then begin | |||
| // TODO | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| class function TengShaderPartVarying.GetTokenName: String; | |||
| begin | |||
| @@ -151,6 +197,15 @@ end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartUniform///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartUniform.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| inherited GenerateCodeIntern(aArgs); | |||
| if (gfGenerateParameterItemCode in aArgs.Flags) then begin | |||
| // TODO | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| class function TengShaderPartUniform.GetTokenName: String; | |||
| begin | |||
| @@ -183,6 +238,15 @@ begin | |||
| fValue := aParams[3].Name | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartConst.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| inherited GenerateCodeIntern(aArgs); | |||
| if (gfGenerateParameterItemCode in aArgs.Flags) then begin | |||
| // TODO | |||
| end; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| class function TengShaderPartConst.GetTokenName: String; | |||
| begin | |||
| @@ -7,15 +7,30 @@ interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPartCntr; | |||
| uengShaderPartCntr, uengShaderGeneratorArgs; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TengShaderPartScope = class(TengShaderPartCntr) | |||
| { Code Generation } | |||
| public | |||
| procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; | |||
| end; | |||
| implementation | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartScope/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartScope.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| aArgs.BeginBlock; | |||
| try | |||
| inherited GenerateCodeIntern(aArgs); | |||
| finally | |||
| aArgs.EndBlock; | |||
| end; | |||
| end; | |||
| end. | |||
| @@ -7,7 +7,7 @@ interface | |||
| uses | |||
| Classes, SysUtils, | |||
| uengShaderPart, uengShaderFileParser; | |||
| uengShaderCodePart, uengShaderFileParser, uengShaderGeneratorArgs; | |||
| type | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -19,6 +19,12 @@ type | |||
| 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 Text: String read fText; | |||
| property IsEmpty: Boolean read GetIsEmpty; | |||
| @@ -31,6 +37,10 @@ type | |||
| function GetText: String; override; | |||
| function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; | |||
| { Code Generation } | |||
| public | |||
| procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; | |||
| { Class Methods } | |||
| public | |||
| class function GetTokenName: String; override; | |||
| @@ -45,6 +55,10 @@ type | |||
| function GetText: String; override; | |||
| function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; | |||
| { Code Generation } | |||
| public | |||
| procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; | |||
| { Class Methods } | |||
| public | |||
| class function CheckToken(const aToken: String): Boolean; override; | |||
| @@ -88,6 +102,12 @@ begin | |||
| result := TOKEN_LINE_BREAK; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartText.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| aArgs.AddText(fText); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TengShaderPartLineBreak/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -105,6 +125,12 @@ begin | |||
| result := ''; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartLineBreak.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| aArgs.AddLineBreak; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| class function TengShaderPartLineBreak.GetTokenName: String; | |||
| begin | |||
| @@ -127,6 +153,12 @@ begin | |||
| aArgs.NextCol; | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TengShaderPartCommandEnd.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||
| begin | |||
| aArgs.AddCommandEnd(fToken); | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| class function TengShaderPartCommandEnd.CheckToken(const aToken: String): Boolean; | |||
| var | |||