@@ -9,7 +9,7 @@ uses | |||||
Classes, SysUtils, | Classes, SysUtils, | ||||
uengShaderPart, uengShaderFileParser, uengShaderGeneratorArgs | uengShaderPart, uengShaderFileParser, uengShaderGeneratorArgs | ||||
{$IFDEF USE_BITSPACE_UTILS} | |||||
{$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} | |||||
, uutlGenerics | , uutlGenerics | ||||
{$ENDIF} | {$ENDIF} | ||||
; | ; | ||||
@@ -1,3 +1,3 @@ | |||||
{.$DEFINE EXPRESSION_ADD_BRACKET} // add brackets to expressions | |||||
{$DEFINE USE_BITSPACE_UTILS} // use bitSpace Utils | |||||
{.$DEFINE DEBUG} // enable debug output | |||||
{.$DEFINE DEBUGEXPRESSION_ADD_BRACKET} // add brackets to expressions | |||||
{$DEFINE SHADER_FILE_USE_BITSPACE_UTILS} // use bitSpace Utils | |||||
{.$DEFINE SHADER_FILE_DEBUG} // enable debug output |
@@ -13,9 +13,9 @@ interface | |||||
uses | uses | ||||
Classes, sysutils, | Classes, sysutils, | ||||
uengShaderPart, uengShaderPartClass, uengShaderFileParser, uengShaderFileTypes, | uengShaderPart, uengShaderPartClass, uengShaderFileParser, uengShaderFileTypes, | ||||
uengShaderGenerator, uengShaderGeneratorArgs | |||||
uengShaderGenerator | |||||
{$IFDEF USE_BITSPACE_UTILS} | |||||
{$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} | |||||
, uutlSerialization | , uutlSerialization | ||||
{$ENDIF} | {$ENDIF} | ||||
; | ; | ||||
@@ -44,10 +44,6 @@ type | |||||
procedure LoadFromFile(const aFilename: String; const aFileReader: IengShaderFileReader = nil); | procedure LoadFromFile(const aFilename: String; const aFileReader: IengShaderFileReader = nil); | ||||
procedure SaveToFile(const aFilename: String; const aFileWriter: IengShaderFileWriter = nil); | procedure SaveToFile(const aFilename: String; const aFileWriter: IengShaderFileWriter = nil); | ||||
{ Code Generation } | |||||
public | |||||
procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; | |||||
{ General } | { General } | ||||
private | private | ||||
fOnLog: TengShaderFileLogEvent; | fOnLog: TengShaderFileLogEvent; | ||||
@@ -68,7 +64,7 @@ type | |||||
implementation | implementation | ||||
uses | uses | ||||
uengShaderPartInclude, uengShaderPartKeyValuePair, uengShaderFileHelper, uengShaderPartProc; | |||||
uengShaderPartInclude, uengShaderPartKeyValuePair, uengShaderFileHelper; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
//TengShaderFile//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TengShaderFile//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
@@ -105,13 +101,13 @@ procedure TengShaderFile.UpdateClasses; | |||||
s: String; | s: String; | ||||
begin | begin | ||||
c := fClasses[aClass.Name]; | c := fClasses[aClass.Name]; | ||||
if Assigned(c) then begin | |||||
if Assigned(c) and (c <> aClass) then begin | |||||
s := Format('use of duplicate identifier: %s (%s %d:%d)', [aClass.Name, aClass.Filename, aClass.Line + 1, aClass.Col]) + sLineBreak + | s := Format('use of duplicate identifier: %s (%s %d:%d)', [aClass.Name, aClass.Filename, aClass.Line + 1, aClass.Col]) + sLineBreak + | ||||
'previously declared here:' + sLineBreak + | 'previously declared here:' + sLineBreak + | ||||
Format(' %s %d:%d', [c.Filename, c.Line + 1, c.Col]) + sLineBreak; | Format(' %s %d:%d', [c.Filename, c.Line + 1, c.Col]) + sLineBreak; | ||||
LogMsg(llWarning, s); | LogMsg(llWarning, s); | ||||
fClasses[aClass.Name] := aClass; | fClasses[aClass.Name] := aClass; | ||||
end else | |||||
end else if (c <> aClass) then | |||||
fClasses.Add(aClass.Name, aClass); | fClasses.Add(aClass.Name, aClass); | ||||
end; | end; | ||||
@@ -260,39 +256,6 @@ begin | |||||
end; | end; | ||||
end; | end; | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
procedure TengShaderFile.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | |||||
var | |||||
sr: TengSearchResults; | |||||
walker: TengSearchWalker; | |||||
main: TengShaderPartMain; | |||||
begin | |||||
inherited GenerateCodeIntern(aArgs); | |||||
if (aArgs.Root = self) then begin | |||||
sr := TengSearchResults.Create; | |||||
walker := TengSearchWalker.Create(sr); | |||||
try | |||||
walker.SearchFlags := [sfSearchChildren, sfEvaluateIf]; | |||||
walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartMain); | |||||
walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderGenerator); | |||||
walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile); | |||||
walker.Run(self); | |||||
main := (ExtractSearchResult(self, TengShaderPartMain.GetTokenName, sr, []) as TengShaderPartMain); | |||||
if Assigned(main) then begin | |||||
aArgs.PushFlags((aArgs.Flags * [gfAddProcedureItem, gfAddParameterItem]) + [gfGenerateProcedureCode]); | |||||
try | |||||
main.GenerateCodeIntern(aArgs); | |||||
finally | |||||
aArgs.PopFlags; | |||||
end; | |||||
end; | |||||
finally | |||||
FreeAndNil(walker); | |||||
FreeAndNil(sr); | |||||
end; | |||||
end; | |||||
end; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
procedure TengShaderFile.LogMsgIntern(const aSender: TengShaderPart; const aLogLevel: TengShaderPartLogLevel; const aMsg: String); | procedure TengShaderFile.LogMsgIntern(const aSender: TengShaderPart; const aLogLevel: TengShaderPartLogLevel; const aMsg: String); | ||||
var | var | ||||
@@ -343,9 +343,9 @@ begin | |||||
if not Assigned(fChild) then | if not Assigned(fChild) then | ||||
EengExpression.Create('no child assigned', self); | EengExpression.Create('no child assigned', self); | ||||
result := | result := | ||||
{$IFDEF EXPRESSION_ADD_BRACKET}TOKEN_OP_GROUP_BEGIN+{$ENDIF} | |||||
{$IFDEF SHADER_FILE_EXPRESSION_ADD_BRACKET}TOKEN_OP_GROUP_BEGIN+{$ENDIF} | |||||
EXPRESSION_UNARY_OPERATIONS[fUnaryOp] + ' ' + fChild.GetText | EXPRESSION_UNARY_OPERATIONS[fUnaryOp] + ' ' + fChild.GetText | ||||
{$IFDEF EXPRESSION_ADD_BRACKET}+TOKEN_OP_GROUP_END{$ENDIF}; | |||||
{$IFDEF SHADER_FILE_EXPRESSION_ADD_BRACKET}+TOKEN_OP_GROUP_END{$ENDIF}; | |||||
end; | end; | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
@@ -439,9 +439,9 @@ begin | |||||
if not Assigned(fFirst) or not Assigned(fSecond) then | if not Assigned(fFirst) or not Assigned(fSecond) then | ||||
raise EengExpression.Create('first or second item not assigned'); | raise EengExpression.Create('first or second item not assigned'); | ||||
result := | result := | ||||
{$IFDEF EXPRESSION_ADD_BRACKET}TOKEN_OP_GROUP_BEGIN +{$ENDIF} | |||||
{$IFDEF SHADER_FILE_EXPRESSION_ADD_BRACKET}TOKEN_OP_GROUP_BEGIN +{$ENDIF} | |||||
fFirst.GetText + ' ' + EXPRESSION_BINARY_OPERATIONS[fBinaryOp] + ' ' + fSecond.GetText | fFirst.GetText + ' ' + EXPRESSION_BINARY_OPERATIONS[fBinaryOp] + ' ' + fSecond.GetText | ||||
{$IFDEF EXPRESSION_ADD_BRACKET} + TOKEN_OP_GROUP_END{$ENDIF}; | |||||
{$IFDEF SHADER_FILE_EXPRESSION_ADD_BRACKET} + TOKEN_OP_GROUP_END{$ENDIF}; | |||||
end; | end; | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
@@ -693,7 +693,7 @@ begin | |||||
walker := TengKeyValuePairSearchWalker.Create(sr); | walker := TengKeyValuePairSearchWalker.Create(sr); | ||||
try | try | ||||
walker.Name := param.Name; | walker.Name := param.Name; | ||||
walker.SearchFlags := [sfSearchChildren, sfSearchParents]; | |||||
walker.SearchFlags := [sfSearchChildren, sfSearchParents, sfSearchInherited]; | |||||
walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartProperty, TengShaderPartStatic); | walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartProperty, TengShaderPartStatic); | ||||
walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartScope); | walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartScope); | ||||
walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile); | walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile); | ||||
@@ -41,6 +41,7 @@ type | |||||
TengSearchResults = class(TengShaderPartList) | TengSearchResults = class(TengShaderPartList) | ||||
public | public | ||||
function Add(const aItem: TengShaderPart): Integer; reintroduce; | |||||
constructor Create; | constructor Create; | ||||
end; | end; | ||||
@@ -193,6 +194,18 @@ begin | |||||
end; | end; | ||||
end; | end; | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
function TengSearchResults.Add(const aItem: TengShaderPart): Integer; | |||||
var | |||||
i: Integer; | |||||
begin | |||||
result := -1; | |||||
for i := 0 to Count-1 do | |||||
if (Items[i] = aItem) then | |||||
exit; | |||||
result := inherited Add(aItem); | |||||
end; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
//TengSearchResults///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TengSearchResults///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
@@ -9,7 +9,7 @@ uses | |||||
Classes, SysUtils, | Classes, SysUtils, | ||||
uengShaderFileTypes | uengShaderFileTypes | ||||
{$IFDEF USE_BITSPACE_UTILS} | |||||
{$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} | |||||
, uutlGenerics | , uutlGenerics | ||||
{$ELSE} | {$ELSE} | ||||
, fgl | , fgl | ||||
@@ -8,14 +8,14 @@ interface | |||||
uses | uses | ||||
Classes, SysUtils | Classes, SysUtils | ||||
{$IFDEF USE_BITSPACE_UTILS} | |||||
{$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} | |||||
, uutlSerialization, uutlCommon, uutlGenerics | , uutlSerialization, uutlCommon, uutlGenerics | ||||
{$ENDIF} | {$ENDIF} | ||||
; | ; | ||||
type | type | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
{$IFDEF USE_BITSPACE_UTILS} | |||||
{$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} | |||||
IengShaderFileWriter = uutlSerialization.IutlFileWriter; | IengShaderFileWriter = uutlSerialization.IutlFileWriter; | ||||
IengShaderFileReader = uutlSerialization.IutlFileReader; | IengShaderFileReader = uutlSerialization.IutlFileReader; | ||||
TengShaderFileReader = uutlSerialization.TutlSimpleFileReader; | TengShaderFileReader = uutlSerialization.TutlSimpleFileReader; | ||||
@@ -47,6 +47,9 @@ type | |||||
implementation | implementation | ||||
uses | |||||
uengShaderFile, uengShaderFileHelper, uengShaderPartProc, uengShaderPartParameter; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
//TengShaderGenerator/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TengShaderGenerator/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
@@ -98,13 +101,16 @@ end; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
procedure TengShaderGenerator.AddProperty(const aProp: TengShaderPartProperty; const aShowWarning: Boolean); | procedure TengShaderGenerator.AddProperty(const aProp: TengShaderPartProperty; const aShowWarning: Boolean); | ||||
var | var | ||||
i: Integer; | |||||
l: TengShaderPartPropertyList; | l: TengShaderPartPropertyList; | ||||
p: TengShaderPartProperty; | p: TengShaderPartProperty; | ||||
s: String; | s: String; | ||||
begin | begin | ||||
i := -1; | |||||
l := fPropertyMap[aProp.Name]; | l := fPropertyMap[aProp.Name]; | ||||
if Assigned(l) then begin | if Assigned(l) then begin | ||||
if aShowWarning then begin | |||||
i := l.IndexOf(aProp); | |||||
if aShowWarning and (i >= 0) then begin | |||||
p := l.Last; | p := l.Last; | ||||
s := Format('use of duplicate identifier: %s (%s %d:%d)', [aProp.Name, aProp.Filename, aProp.Line + 1, aProp.Col]) + sLineBreak + | s := Format('use of duplicate identifier: %s (%s %d:%d)', [aProp.Name, aProp.Filename, aProp.Line + 1, aProp.Col]) + sLineBreak + | ||||
'previously declared here:' + sLineBreak + | 'previously declared here:' + sLineBreak + | ||||
@@ -115,9 +121,11 @@ begin | |||||
l := TengShaderPartPropertyList.Create; | l := TengShaderPartPropertyList.Create; | ||||
fPropertyMap.Add(aProp.Name, l); | fPropertyMap.Add(aProp.Name, l); | ||||
end; | end; | ||||
l.Add(aProp); | |||||
if (aProp.Value <> Unassigned) then | |||||
l.Value := aProp.Value; | |||||
if (i < 0) then begin | |||||
l.Add(aProp); | |||||
if (aProp.Value <> Unassigned) then | |||||
l.Value := aProp.Value; | |||||
end; | |||||
end; | end; | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
@@ -148,11 +156,53 @@ end; | |||||
procedure TengShaderGenerator.GenerateCode(const aCode: TengShaderCode); | procedure TengShaderGenerator.GenerateCode(const aCode: TengShaderCode); | ||||
var | var | ||||
args: TengShaderGeneratorArgs; | args: TengShaderGeneratorArgs; | ||||
sr: TengSearchResults; | |||||
walker: TengSearchWalker; | |||||
main: TengShaderPartMain; | |||||
begin | begin | ||||
args := TengShaderGeneratorArgs.Create(self); | args := TengShaderGeneratorArgs.Create(self); | ||||
try | try | ||||
fPropertyMap.ApplyValues; | fPropertyMap.ApplyValues; | ||||
GenerateCodeIntern(args); | GenerateCodeIntern(args); | ||||
args.PushCode; | |||||
sr := TengSearchResults.Create; | |||||
walker := TengSearchWalker.Create(sr); | |||||
try | |||||
walker.SearchFlags := [sfSearchChildren, sfEvaluateIf]; | |||||
walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartMain); | |||||
walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderGenerator); | |||||
walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile); | |||||
walker.Run(self); | |||||
if (self is TengShaderFile) | |||||
then main := (ExtractSearchResult(self, TengShaderPartMain.GetTokenName, sr, []) as TengShaderPartMain) | |||||
else main := (ExtractSearchResult(self, TengShaderPartMain.GetTokenName, sr) as TengShaderPartMain); | |||||
if Assigned(main) then begin | |||||
args.PushFlags((args.Flags * [gfAddProcedureItem, gfAddParameterItem]) + [gfGenerateProcedureCode, gfGenerateProcedureMain]); | |||||
try | |||||
main.GenerateCodeIntern(args); | |||||
finally | |||||
args.PopFlags; | |||||
end; | |||||
end; | |||||
args.GenerateProcedureCode; | |||||
args.GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartVar)); | |||||
args.GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartVarying)); | |||||
args.GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartUniform)); | |||||
finally | |||||
FreeAndNil(walker); | |||||
FreeAndNil(sr); | |||||
args.PopCode([pcfAppend, pcfAddEmptyLine]); | |||||
end; | |||||
args.PushCode; | |||||
try | |||||
args.GenerateMetaCode; | |||||
finally | |||||
args.PopCode([pcfPrepend, pcfAddEmptyLine]); | |||||
end; | |||||
args.GenerateCode(aCode); | args.GenerateCode(aCode); | ||||
finally | finally | ||||
FreeAndNil(args); | FreeAndNil(args); | ||||
@@ -9,7 +9,7 @@ uses | |||||
Classes, SysUtils, | Classes, SysUtils, | ||||
uengShaderFileTypes, uengShaderPart | uengShaderFileTypes, uengShaderPart | ||||
{$IFDEF USE_BITSPACE_UTILS} | |||||
{$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} | |||||
, uutlGenerics | , uutlGenerics | ||||
{$ENDIF} | {$ENDIF} | ||||
; | ; | ||||
@@ -38,13 +38,14 @@ type | |||||
TengShaderGeneratorArgs = class(TObject) | TengShaderGeneratorArgs = class(TObject) | ||||
private type | private type | ||||
TengGeneratorToken = ( | TengGeneratorToken = ( | ||||
gtNormal = 0, // normal text | |||||
gtLineBreak = 1, // line break | |||||
gtCommandEnd = 2, // command end (like ';') | |||||
gtBlockBegin = 3, // code block begin (to calculate indent) | |||||
gtBlockEnd = 4, // code block end (to calculate indent) | |||||
gtAppendToPrev = 5, // append current line to prev line | |||||
gtToken = 6 // code token (like '$INCLUDE' or '$IF') | |||||
gtNormal = 0, // normal text | |||||
gtLineBreak = 1, // line break | |||||
gtCommandEnd = 2, // command end (like ';') | |||||
gtBlockBegin = 3, // code block begin (to calculate indent) | |||||
gtBlockEnd = 4, // code block end (to calculate indent) | |||||
gtAppendToPrev = 5, // append current line to prev line | |||||
gtIgnoreNextCommandEnd = 6, // ignore next command end | |||||
gtToken = 7 // code token (like '$INCLUDE' or '$IF') | |||||
); | ); | ||||
TCodePart = class(TObject) | TCodePart = class(TObject) | ||||
@@ -100,10 +101,6 @@ type | |||||
function GetFlags: TengGenerateFlags; | function GetFlags: TengGenerateFlags; | ||||
function GetProcParams: TStrings; | function GetProcParams: TStrings; | ||||
procedure GenerateParameterCode(const aTypes: CengShaderPartArr); | |||||
procedure GenerateProcedureCode; | |||||
procedure GenerateMetaCode; | |||||
public | public | ||||
property Root: TengShaderPart read fRoot; | property Root: TengShaderPart read fRoot; | ||||
property Flags: TengGenerateFlags read GetFlags; | property Flags: TengGenerateFlags read GetFlags; | ||||
@@ -125,6 +122,7 @@ type | |||||
function BeginBlock(const aIndent: Integer = High(Integer)): TengShaderGeneratorArgs; | function BeginBlock(const aIndent: Integer = High(Integer)): TengShaderGeneratorArgs; | ||||
function EndBlock(const aCanAppend: Boolean = false): TengShaderGeneratorArgs; | function EndBlock(const aCanAppend: Boolean = false): TengShaderGeneratorArgs; | ||||
function AppendToPrevLine: TengShaderGeneratorArgs; | function AppendToPrevLine: TengShaderGeneratorArgs; | ||||
function IgnoreNextCommandEnd: TengShaderGeneratorArgs; | |||||
procedure AddMeta(const aMeta: TengMetaData); | procedure AddMeta(const aMeta: TengMetaData); | ||||
procedure AddParameter(const aParam: TengShaderPart); | procedure AddParameter(const aParam: TengShaderPart); | ||||
@@ -134,6 +132,10 @@ type | |||||
function ReplaceIdents(const aOld, aNew: TStrings): TengShaderGeneratorArgs; | function ReplaceIdents(const aOld, aNew: TStrings): TengShaderGeneratorArgs; | ||||
function ReplaceReturns(const aCommand: TCodeStackItem; const aRetType, aName: String): TengShaderGeneratorArgs; | function ReplaceReturns(const aCommand: TCodeStackItem; const aRetType, aName: String): TengShaderGeneratorArgs; | ||||
procedure GenerateParameterCode(const aTypes: CengShaderPartArr); | |||||
procedure GenerateProcedureCode; | |||||
procedure GenerateMetaCode; | |||||
procedure GenerateCode(const aCode: TengShaderCode); | procedure GenerateCode(const aCode: TengShaderCode); | ||||
constructor Create(const aRoot: TengShaderPart); | constructor Create(const aRoot: TengShaderPart); | ||||
@@ -267,10 +269,11 @@ end; | |||||
procedure TengShaderGeneratorArgs.TCodeStackItem.GenerateCode(const aCode: TengShaderCode); | procedure TengShaderGeneratorArgs.TCodeStackItem.GenerateCode(const aCode: TengShaderCode); | ||||
type | type | ||||
TGenFlag = ( | 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) | |||||
gfAddToPrev // add current line to previouse line | |||||
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) | |||||
gfAddToPrev, // add current line to previouse line | |||||
gfIgnoreNextCommandEnd | |||||
); | ); | ||||
TGenFlags = set of TGenFlag; | TGenFlags = set of TGenFlag; | ||||
@@ -279,7 +282,7 @@ var | |||||
f: TGenFlags; | f: TGenFlags; | ||||
cb: TCodeBlock; | cb: TCodeBlock; | ||||
{$IFDEF DEBUG} | |||||
{$IFDEF SHADER_FILE_DEBUG} | |||||
procedure GenerateDebugCode; | procedure GenerateDebugCode; | ||||
var | var | ||||
cp: TCodePart; | cp: TCodePart; | ||||
@@ -359,6 +362,7 @@ var | |||||
var | var | ||||
cp: TCodePart; | cp: TCodePart; | ||||
tmp: Integer; | tmp: Integer; | ||||
s: String; | |||||
begin | begin | ||||
while (i < fItems.Count) do begin | while (i < fItems.Count) do begin | ||||
cp := fItems[i]; | cp := fItems[i]; | ||||
@@ -406,22 +410,36 @@ var | |||||
end; | end; | ||||
gtBlockEnd: begin | gtBlockEnd: begin | ||||
{$IFDEF DEBUG} | |||||
{$IFDEF SHADER_FILE_DEBUG} | |||||
GenerateCurrentCode(Format('------====== DEBUG STEP BEFORE INDENT (%d) ======------', [aCurrentBlockIndent])); | GenerateCurrentCode(Format('------====== DEBUG STEP BEFORE INDENT (%d) ======------', [aCurrentBlockIndent])); | ||||
{$ENDIF} | {$ENDIF} | ||||
IndentBlock(aDepth, aCurrentBlockIndent); | IndentBlock(aDepth, aCurrentBlockIndent); | ||||
{$IFDEF DEBUG} | |||||
{$IFDEF SHADER_FILE_DEBUG} | |||||
GenerateCurrentCode(Format('------====== DEBUG STEP AFTER INDENT (%d) ======------', [aCurrentBlockIndent])); | GenerateCurrentCode(Format('------====== DEBUG STEP AFTER INDENT (%d) ======------', [aCurrentBlockIndent])); | ||||
{$ENDIF} | {$ENDIF} | ||||
exit; | exit; | ||||
end; | end; | ||||
gtIgnoreNextCommandEnd: begin | |||||
include(f, gfIgnoreNextCommandEnd); | |||||
end; | |||||
gtAppendToPrev: begin | gtAppendToPrev: begin | ||||
if (Trim(cb.Last) = '') and not (gfPrevIsEmpty in f) then | if (Trim(cb.Last) = '') and not (gfPrevIsEmpty in f) then | ||||
include(f, gfAddToPrev); | include(f, gfAddToPrev); | ||||
end; | end; | ||||
gtCommandEnd: begin | |||||
if (gfIgnoreNextCommandEnd in f) | |||||
then exclude(f, gfIgnoreNextCommandEnd) | |||||
else cb.Last := cb.Last + cp.Code; | |||||
end; | |||||
else | else | ||||
cb.Last := cb.Last + cp.Code; | |||||
s := cp.Code; | |||||
if (Trim(s) <> '') then | |||||
exclude(f, gfIgnoreNextCommandEnd); | |||||
cb.Last := cb.Last + s; | |||||
end; | end; | ||||
end; | end; | ||||
end; | end; | ||||
@@ -429,7 +447,7 @@ var | |||||
var | var | ||||
s, e: Integer; | s, e: Integer; | ||||
begin | begin | ||||
{$IFDEF DEBUG} | |||||
{$IFDEF SHADER_FILE_DEBUG} | |||||
GenerateDebugCode; | GenerateDebugCode; | ||||
{$ENDIF} | {$ENDIF} | ||||
@@ -446,7 +464,7 @@ begin | |||||
dec(e); | dec(e); | ||||
for i := s to e do | for i := s to e do | ||||
aCode.Add( | aCode.Add( | ||||
{$IFDEF DEBUG} | |||||
{$IFDEF SHADER_FILE_DEBUG} | |||||
Format('[%02d]%s|', [cb.Depth[i], cb[i]]) | Format('[%02d]%s|', [cb.Depth[i], cb[i]]) | ||||
{$ELSE} | {$ELSE} | ||||
cb[i] | cb[i] | ||||
@@ -496,113 +514,6 @@ begin | |||||
result := fProcParams.Last; | result := fProcParams.Last; | ||||
end; | end; | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
procedure TengShaderGeneratorArgs.GenerateParameterCode(const aTypes: CengShaderPartArr); | |||||
var | |||||
m: TParameterMap; | |||||
p: TengShaderPart; | |||||
begin | |||||
PushCode; | |||||
PushFlags(Flags + [gfGenerateParameterCode] - [gfAddParameterItem]); | |||||
m := TParameterMap.Create(false); | |||||
try | |||||
fMaxParameterLength := 0; | |||||
for p in fParameters do begin | |||||
if CheckType(p, aTypes) then with (p as TengShaderPartParameter) do begin | |||||
fMaxParameterLength := Max(fMaxParameterLength, Length(Typ)); | |||||
m.Add(Typ+Name, p); | |||||
end; | |||||
end; | |||||
for p in m do begin | |||||
(p as TengShaderPartParameter).GenerateCodeIntern(self); | |||||
AddLineBreak; | |||||
end; | |||||
finally | |||||
FreeAndNil(m); | |||||
PopFlags; | |||||
PopCode([pcfPrepend, pcfAddEmptyLine]); | |||||
end; | |||||
end; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
procedure TengShaderGeneratorArgs.GenerateProcedureCode; | |||||
var | |||||
i: Integer; | |||||
begin | |||||
i := 0; | |||||
while (i < fProcedures.Count) do begin | |||||
PushCode; | |||||
PushFlags([gfGenerateProcedureCode, gfAddParameterItem]); | |||||
try | |||||
(fProcedures[i] as TengShaderPartProc).GenerateCodeIntern(self); | |||||
finally | |||||
PopFlags; | |||||
PopCode([pcfPrepend, pcfAddEmptyLine]); | |||||
end; | |||||
inc(i); | |||||
end; | |||||
end; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
procedure TengShaderGeneratorArgs.GenerateMetaCode; | |||||
var | |||||
layouts: TStringList; | |||||
m: TengMetaData; | |||||
vCompat: Boolean; | |||||
vMax, i: Integer; | |||||
s: String; | |||||
begin | |||||
PushCode; | |||||
vMax := 0; | |||||
vCompat := false; | |||||
layouts := TStringList.Create; | |||||
try | |||||
for m in fMetaDataList do begin | |||||
case m.MetaType of | |||||
metaVersion: begin | |||||
if (m.Values[0] = VERSION_EXTRA_COMPAT) then | |||||
vCompat := true | |||||
else if TryStrToInt(m.Values[0], i) then | |||||
vMax := max(vMax, i); | |||||
if (m.Count > 1) and (m.Values[1] = VERSION_EXTRA_COMPAT) then | |||||
vCompat := true; | |||||
end; | |||||
metaExtension: begin | |||||
AddText(format('#extension %s : %s', [m.Values[0], m.Values[1]])); | |||||
AddLineBreak; | |||||
end; | |||||
metaLayout: begin | |||||
layouts.Add('layout' + m.Values[0] + ';'); | |||||
end; | |||||
end; | |||||
end; | |||||
if (vMax >= LAYOUT_MIN_VERSION) then begin | |||||
for s in layouts do begin | |||||
AddText(s); | |||||
AddLineBreak; | |||||
end; | |||||
end; | |||||
if (vMax > 0) then begin | |||||
PushCode; | |||||
try | |||||
AddText('#version ' + IntToStr(vMax)); | |||||
if vCompat then | |||||
AddText(' ' + VERSION_EXTRA_COMPAT); | |||||
AddLineBreak; | |||||
finally | |||||
PopCode([pcfPrepend]); | |||||
end; | |||||
end; | |||||
finally | |||||
PopCode([pcfPrepend, pcfAddEmptyLine]); | |||||
FreeAndNil(layouts); | |||||
end; | |||||
end; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
function TengShaderGeneratorArgs.PushCode: TengShaderGeneratorArgs; | function TengShaderGeneratorArgs.PushCode: TengShaderGeneratorArgs; | ||||
begin | begin | ||||
@@ -711,6 +622,13 @@ begin | |||||
result := self; | result := self; | ||||
end; | end; | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
function TengShaderGeneratorArgs.IgnoreNextCommandEnd: TengShaderGeneratorArgs; | |||||
begin | |||||
fCode.Last.Items.Add(TCodePart.Create(gtIgnoreNextCommandEnd, '')); | |||||
result := self; | |||||
end; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
procedure TengShaderGeneratorArgs.AddMeta(const aMeta: TengMetaData); | procedure TengShaderGeneratorArgs.AddMeta(const aMeta: TengMetaData); | ||||
begin | begin | ||||
@@ -727,13 +645,13 @@ begin | |||||
raise EengShaderPartInternal.Create('parameter (' + aParam.ClassName + ') is not a ' + TengShaderPartParameter.ClassName, aParam); | raise EengShaderPartInternal.Create('parameter (' + aParam.ClassName + ') is not a ' + TengShaderPartParameter.ClassName, aParam); | ||||
with (aParam as TengShaderPartParameter) do begin | with (aParam as TengShaderPartParameter) do begin | ||||
p := fParameters[Name]; | p := fParameters[Name]; | ||||
if Assigned(p) then begin | |||||
if Assigned(p) and (p <> aParam) then begin | |||||
s := Format('use of duplicate identifier: %s (%s %d:%d)', [Name, Filename, Line + 1, Col]) + sLineBreak + | s := Format('use of duplicate identifier: %s (%s %d:%d)', [Name, Filename, Line + 1, Col]) + sLineBreak + | ||||
'previously declared here:' + sLineBreak + | 'previously declared here:' + sLineBreak + | ||||
Format(' %s %d:%d', [p.Filename, p.Line + 1, p.Col]) + sLineBreak; | Format(' %s %d:%d', [p.Filename, p.Line + 1, p.Col]) + sLineBreak; | ||||
fRoot.LogMsg(llWarning, s); | fRoot.LogMsg(llWarning, s); | ||||
fParameters[Name] := aParam; | fParameters[Name] := aParam; | ||||
end else | |||||
end else if (p <> aParam) then | |||||
fParameters.Add(Name, aParam); | fParameters.Add(Name, aParam); | ||||
end; | end; | ||||
end; | end; | ||||
@@ -883,14 +801,116 @@ begin | |||||
result := self; | result := self; | ||||
end; | end; | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
procedure TengShaderGeneratorArgs.GenerateParameterCode(const aTypes: CengShaderPartArr); | |||||
var | |||||
m: TParameterMap; | |||||
p: TengShaderPart; | |||||
begin | |||||
PushCode; | |||||
PushFlags(Flags + [gfGenerateParameterCode] - [gfAddParameterItem]); | |||||
m := TParameterMap.Create(false); | |||||
try | |||||
fMaxParameterLength := 0; | |||||
for p in fParameters do begin | |||||
if CheckType(p, aTypes) then with (p as TengShaderPartParameter) do begin | |||||
fMaxParameterLength := Max(fMaxParameterLength, Length(Typ)); | |||||
m.Add(Typ+Name, p); | |||||
end; | |||||
end; | |||||
for p in m do begin | |||||
(p as TengShaderPartParameter).GenerateCodeIntern(self); | |||||
AddLineBreak; | |||||
end; | |||||
finally | |||||
FreeAndNil(m); | |||||
PopFlags; | |||||
PopCode([pcfPrepend, pcfAddEmptyLine]); | |||||
end; | |||||
end; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
procedure TengShaderGeneratorArgs.GenerateProcedureCode; | |||||
var | |||||
i: Integer; | |||||
begin | |||||
i := 0; | |||||
while (i < fProcedures.Count) do begin | |||||
PushCode; | |||||
PushFlags([gfGenerateProcedureCode, gfAddParameterItem]); | |||||
try | |||||
(fProcedures[i] as TengShaderPartProc).GenerateCodeIntern(self); | |||||
finally | |||||
PopFlags; | |||||
PopCode([pcfPrepend, pcfAddEmptyLine]); | |||||
end; | |||||
inc(i); | |||||
end; | |||||
end; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
procedure TengShaderGeneratorArgs.GenerateMetaCode; | |||||
var | |||||
layouts: TStringList; | |||||
m: TengMetaData; | |||||
vCompat: Boolean; | |||||
vMax, i: Integer; | |||||
s: String; | |||||
begin | |||||
PushCode; | |||||
vMax := 0; | |||||
vCompat := false; | |||||
layouts := TStringList.Create; | |||||
try | |||||
for m in fMetaDataList do begin | |||||
case m.MetaType of | |||||
metaVersion: begin | |||||
if (m.Values[0] = VERSION_EXTRA_COMPAT) then | |||||
vCompat := true | |||||
else if TryStrToInt(m.Values[0], i) then | |||||
vMax := max(vMax, i); | |||||
if (m.Count > 1) and (m.Values[1] = VERSION_EXTRA_COMPAT) then | |||||
vCompat := true; | |||||
end; | |||||
metaExtension: begin | |||||
AddText(format('#extension %s : %s', [m.Values[0], m.Values[1]])); | |||||
AddLineBreak; | |||||
end; | |||||
metaLayout: begin | |||||
layouts.Add('layout' + m.Values[0] + ';'); | |||||
end; | |||||
end; | |||||
end; | |||||
if (vMax >= LAYOUT_MIN_VERSION) then begin | |||||
for s in layouts do begin | |||||
AddText(s); | |||||
AddLineBreak; | |||||
end; | |||||
end; | |||||
if (vMax > 0) then begin | |||||
PushCode; | |||||
try | |||||
AddText('#version ' + IntToStr(vMax)); | |||||
if vCompat then | |||||
AddText(' ' + VERSION_EXTRA_COMPAT); | |||||
AddLineBreak; | |||||
finally | |||||
PopCode([pcfPrepend]); | |||||
end; | |||||
end; | |||||
finally | |||||
PopCode([pcfPrepend, pcfAddEmptyLine]); | |||||
FreeAndNil(layouts); | |||||
end; | |||||
end; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
procedure TengShaderGeneratorArgs.GenerateCode(const aCode: TengShaderCode); | procedure TengShaderGeneratorArgs.GenerateCode(const aCode: TengShaderCode); | ||||
begin | begin | ||||
GenerateProcedureCode; | |||||
GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartVar)); | |||||
GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartVarying)); | |||||
GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartUniform)); | |||||
GenerateMetaCode; | |||||
fCode.Last.GenerateCode(aCode); | fCode.Last.GenerateCode(aCode); | ||||
end; | end; | ||||
@@ -10,7 +10,7 @@ uses | |||||
uengShaderFileParser, uengShaderFileTypes | uengShaderFileParser, uengShaderFileTypes | ||||
{$IFDEF USE_BITSPACE_UTILS} | |||||
{$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} | |||||
, uutlGenerics | , uutlGenerics | ||||
{$ELSE} | {$ELSE} | ||||
, fgl | , fgl | ||||
@@ -9,7 +9,7 @@ uses | |||||
Classes, SysUtils, | Classes, SysUtils, | ||||
uengShaderPart, uengShaderGenerator, uengShaderGeneratorArgs, uengShaderFileParser | uengShaderPart, uengShaderGenerator, uengShaderGeneratorArgs, uengShaderFileParser | ||||
{$IFDEF USE_BITSPACE_UTILS} | |||||
{$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} | |||||
, uutlGenerics | , uutlGenerics | ||||
{$ENDIF} | {$ENDIF} | ||||
; | ; | ||||
@@ -56,7 +56,7 @@ implementation | |||||
uses | uses | ||||
uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper, uengShaderPartKeyValuePair, | uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper, uengShaderPartKeyValuePair, | ||||
uengShaderPartScope, uengShaderFile, uengShaderPartProc; | |||||
uengShaderPartScope, uengShaderFile; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
//TengShaderPartClass/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TengShaderPartClass/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
@@ -174,9 +174,9 @@ begin | |||||
sr := TengSearchResults.Create; | sr := TengSearchResults.Create; | ||||
walker := TengSearchWalker.Create(sr); | walker := TengSearchWalker.Create(sr); | ||||
try | try | ||||
walker.SearchFlags := [sfSearchChildren]; | |||||
walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartProperty); | walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartProperty); | ||||
walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderGenerator); | |||||
walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile); | |||||
walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartClass); | |||||
walker.Run(self); | walker.Run(self); | ||||
for p in sr.GetReverseEnumerator do | for p in sr.GetReverseEnumerator do | ||||
AddProperty(p as TengShaderPartProperty); | AddProperty(p as TengShaderPartProperty); | ||||
@@ -190,32 +190,15 @@ end; | |||||
procedure TengShaderPartClass.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | procedure TengShaderPartClass.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | ||||
var | var | ||||
c: TengShaderPartClass; | c: TengShaderPartClass; | ||||
sr: TengSearchResults; | |||||
walker: TengSearchWalker; | |||||
main: TengShaderPartMain; | |||||
begin | begin | ||||
if (aArgs.Root <> self) then | |||||
exit; | |||||
for c in fInherited do | for c in fInherited do | ||||
c.GenerateCodeIntern(aArgs); | c.GenerateCodeIntern(aArgs); | ||||
inherited GenerateCodeIntern(aArgs); | |||||
sr := TengSearchResults.Create; | |||||
walker := TengSearchWalker.Create(sr); | |||||
aArgs.BeginBlock; | |||||
try | try | ||||
walker.SearchFlags := [sfSearchChildren, sfEvaluateIf]; | |||||
walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartMain); | |||||
walker.Run(self); | |||||
main := (ExtractSearchResult(self, TengShaderPartMain.GetTokenName, sr) as TengShaderPartMain); | |||||
aArgs.PushFlags([gfGenerateProcedureCode, gfGenerateProcedureMain]); | |||||
try | |||||
main.GenerateCodeIntern(aArgs); | |||||
finally | |||||
aArgs.PopFlags; | |||||
end; | |||||
inherited GenerateCodeIntern(aArgs); | |||||
finally | finally | ||||
FreeAndNil(walker); | |||||
FreeAndNil(sr); | |||||
aArgs.EndBlock; | |||||
end; | end; | ||||
end; | end; | ||||
@@ -15,13 +15,14 @@ type | |||||
{ Code Loading & Storage } | { Code Loading & Storage } | ||||
private | private | ||||
fChildren: TengShaderCodePartList; | fChildren: TengShaderCodePartList; | ||||
procedure AddChild(const aChild: TengShaderCodePart; const aPrepend: Boolean = false); | |||||
function HandleToken(const aToken: String; const aArgs: TengParseArgs): String; | function HandleToken(const aToken: String; const aArgs: TengParseArgs): String; | ||||
protected { virtual getter } | protected { virtual getter } | ||||
function GetCount: Integer; override; | function GetCount: Integer; override; | ||||
function GetChild(const aIndex: Integer): TengShaderPart; override; | function GetChild(const aIndex: Integer): TengShaderPart; override; | ||||
function GetText: String; override; | function GetText: String; override; | ||||
function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; | function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; | ||||
public | |||||
procedure AddChild(const aChild: TengShaderCodePart; const aPrepend: Boolean = false); | |||||
{ Code Generation } | { Code Generation } | ||||
public | public | ||||
@@ -40,13 +41,13 @@ uses | |||||
uengShaderPartKeyValuePair, uengShaderPartClass, uengShaderPartMessage, uengShaderPartMeta, | uengShaderPartKeyValuePair, uengShaderPartClass, uengShaderPartMessage, uengShaderPartMeta, | ||||
uengShaderPartCall, uengShaderPartProc, uengShaderPartText, uengShaderPartEcho, uengShaderPartIf, | uengShaderPartCall, uengShaderPartProc, uengShaderPartText, uengShaderPartEcho, uengShaderPartIf, | ||||
uengShaderPartInclude, uengShaderPartParameter, uengShaderPartComment, uengShaderFileConstants | uengShaderPartInclude, uengShaderPartParameter, uengShaderPartComment, uengShaderFileConstants | ||||
{$IFDEF DEBUG} | |||||
{$IFDEF SHADER_FILE_DEBUG} | |||||
, uengShaderFileTypes | , uengShaderFileTypes | ||||
{$ENDIF} | {$ENDIF} | ||||
; | ; | ||||
const | const | ||||
TOKEN_CLASSES: array[0..21] of CengShaderCodePart = ( | |||||
TOKEN_CLASSES: array[0..22] of CengShaderCodePart = ( | |||||
TengShaderPartCall, | TengShaderPartCall, | ||||
TengShaderPartClass, | TengShaderPartClass, | ||||
TengShaderPartConst, | TengShaderPartConst, | ||||
@@ -65,6 +66,7 @@ const | |||||
TengShaderPartMeta, | TengShaderPartMeta, | ||||
TengShaderPartProc, | TengShaderPartProc, | ||||
TengShaderPartProperty, | TengShaderPartProperty, | ||||
TengShaderPartThrow, | |||||
TengShaderPartUniform, | TengShaderPartUniform, | ||||
TengShaderPartVar, | TengShaderPartVar, | ||||
TengShaderPartVarying, | TengShaderPartVarying, | ||||
@@ -73,14 +75,6 @@ const | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
//TengShaderPartCntr//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TengShaderPartCntr//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
procedure TengShaderPartCntr.AddChild(const aChild: TengShaderCodePart; const aPrepend: Boolean); | |||||
begin | |||||
if aPrepend | |||||
then fChildren.PushFirst(aChild) | |||||
else fChildren.PushLast(aChild); | |||||
end; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
function TengShaderPartCntr.HandleToken(const aToken: String; const aArgs: TengParseArgs): String; | function TengShaderPartCntr.HandleToken(const aToken: String; const aArgs: TengParseArgs): String; | ||||
var | var | ||||
@@ -96,10 +90,6 @@ begin | |||||
break; | break; | ||||
end; | end; | ||||
end; | end; | ||||
{$IFDEF DEBUG} | |||||
if Assigned(p) then | |||||
LogMsg(llDebug, 'ParseText: ' + p.ClassName); | |||||
{$ENDIF} | |||||
if Assigned(p) | if Assigned(p) | ||||
then result := p.ParseText(aArgs) | then result := p.ParseText(aArgs) | ||||
else result := aToken; | else result := aToken; | ||||
@@ -150,6 +140,14 @@ begin | |||||
end; | end; | ||||
end; | end; | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
procedure TengShaderPartCntr.AddChild(const aChild: TengShaderCodePart; const aPrepend: Boolean); | |||||
begin | |||||
if aPrepend | |||||
then fChildren.PushFirst(aChild) | |||||
else fChildren.PushLast(aChild); | |||||
end; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
procedure TengShaderPartCntr.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | procedure TengShaderPartCntr.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); | ||||
var | var | ||||
@@ -169,7 +169,8 @@ begin | |||||
if Assigned(p) then begin | if Assigned(p) then begin | ||||
p.GenerateCodeIntern(aArgs); | p.GenerateCodeIntern(aArgs); | ||||
aArgs.AppendToPrevLine; | aArgs.AppendToPrevLine; | ||||
end; | |||||
end else | |||||
aArgs.AddToken(GetTokenName); | |||||
end; | end; | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
@@ -7,9 +7,9 @@ interface | |||||
uses | uses | ||||
Classes, SysUtils, variants, | Classes, SysUtils, variants, | ||||
uengShaderCodePart, uengShaderFileParser | |||||
uengShaderPart, uengShaderCodePart, uengShaderFileParser | |||||
{$IFDEF USE_BITSPACE_UTILS} | |||||
{$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} | |||||
, uutlGenerics | , uutlGenerics | ||||
{$ENDIF} | {$ENDIF} | ||||
; | ; | ||||
@@ -34,6 +34,8 @@ type | |||||
property ValueName: String read fValueName; | property ValueName: String read fValueName; | ||||
property Value: Variant read fValue; | property Value: Variant read fValue; | ||||
property DefaultValue: Variant read fDefaultValue; | property DefaultValue: Variant read fDefaultValue; | ||||
constructor Create(const aParent: TengShaderPart; const aName: String; const aValue: Variant); overload; | |||||
end; | end; | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
@@ -48,7 +50,7 @@ type | |||||
end; | end; | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
TengShaderPartPropertyList = class(specialize TutlSimpleList<TengShaderPartProperty>) | |||||
TengShaderPartPropertyList = class(specialize TutlList<TengShaderPartProperty>) | |||||
private | private | ||||
fValue: Variant; | fValue: Variant; | ||||
public | public | ||||
@@ -72,7 +74,7 @@ type | |||||
implementation | implementation | ||||
uses | uses | ||||
uengShaderPart, uengShaderFile, uengShaderPartScope, uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper; | |||||
uengShaderFile, uengShaderPartScope, uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
//TengShaderPartPropertyList///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TengShaderPartPropertyList///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
@@ -163,6 +165,16 @@ begin | |||||
end; | end; | ||||
end; | end; | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
constructor TengShaderPartKeyValuePair.Create(const aParent: TengShaderPart; const aName: String; const aValue: Variant); | |||||
begin | |||||
inherited Create(aParent); | |||||
fName := aName; | |||||
fValueName := ''; | |||||
fValue := aValue; | |||||
fDefaultValue := aValue; | |||||
end; | |||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
//TengShaderPartProperty//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TengShaderPartProperty//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
@@ -9,7 +9,7 @@ uses | |||||
Classes, SysUtils, | Classes, SysUtils, | ||||
uengShaderPart, uengShaderPartScope, uengShaderFileParser, uengShaderGeneratorArgs | uengShaderPart, uengShaderPartScope, uengShaderFileParser, uengShaderGeneratorArgs | ||||
{$IFDEF USE_BITSPACE_UTILS} | |||||
{$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} | |||||
, uutlGenerics; | , uutlGenerics; | ||||
{$ELSE} | {$ELSE} | ||||
, fgl; | , fgl; | ||||
@@ -250,7 +250,8 @@ begin | |||||
((gfGenerateInlineCode in aArgs.Flags) or fIsInline) then | ((gfGenerateInlineCode in aArgs.Flags) or fIsInline) then | ||||
begin | begin | ||||
GenerateInlineCode(aArgs); | GenerateInlineCode(aArgs); | ||||
// TODO: ignore next command end?! | |||||
if (GetTokenName = TOKEN_PROC) then | |||||
aArgs.IgnoreNextCommandEnd; | |||||
// generate code | // generate code | ||||
end else if (gfGenerateProcedureCode in aArgs.Flags) then begin | end else if (gfGenerateProcedureCode in aArgs.Flags) then begin | ||||