diff --git a/uengShaderFile.pas b/uengShaderFile.pas index e940b10..6ce12ed 100644 --- a/uengShaderFile.pas +++ b/uengShaderFile.pas @@ -50,7 +50,7 @@ type protected procedure LogMsgIntern(const aSender: TengShaderPart; const aLogLevel: TengShaderPartLogLevel; const aMsg: String); override; public - property Generator [const aName: String]: TengShaderGenerator read GetGenerator; + property Generator [const aName: String]: TengShaderGenerator read GetGenerator; property GeneratorNames[const aIndex: Integer]: String read GetGeneratorNames; property GeneratorCount: Integer read GetGeneratorCount; property OnLog: TengShaderFileLogEvent read fOnLog write fOnLog; @@ -239,8 +239,10 @@ begin ms := TMemoryStream.Create; walker := TengSearchWalker.Create(sr); try - walker.SearchFlags := [sfSearchChildren]; - walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartInclude); + walker.SearchFlags := [sfSearchChildren]; + walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderFile); + walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartInclude); + walker.Run(self); for i := 0 to sr.Count-1 do (sr[i] as TengShaderPartInclude).SaveToFile(aFilename, aFileWriter); sl.Text := Text; diff --git a/uengShaderFileTypes.pas b/uengShaderFileTypes.pas index f01376b..01f8452 100644 --- a/uengShaderFileTypes.pas +++ b/uengShaderFileTypes.pas @@ -222,6 +222,7 @@ implementation uses uengShaderPart; +{$IFNDEF SHADER_FILE_USE_BITSPACE_UTILS} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TIntfObjNoRefCount////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -274,6 +275,7 @@ begin FreeAndNil(fs); end; end; +{$ENDIF} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TengMetaData////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/uengShaderGenerator.pas b/uengShaderGenerator.pas index 4a1498a..2073593 100644 --- a/uengShaderGenerator.pas +++ b/uengShaderGenerator.pas @@ -35,6 +35,10 @@ type property PropertyNames [const aIndex: Integer]: String read GetPropertyNames; property PropertyCount: Integer read GetPropertyCount; + function TryGetProperty(const aName: String; out aValue: Variant): Boolean; + function TrySetProperty(const aName: String; const aValue: Variant): Boolean; + procedure ListProperties(const aPropertyNames: TStrings); + { Generate Shader Code } public procedure GenerateCode(const aCode: TengShaderCode); @@ -152,6 +156,38 @@ begin UpdateProperties; end; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +function TengShaderGenerator.TryGetProperty(const aName: String; out aValue: Variant): Boolean; +var + l: TengShaderPartPropertyList; +begin + l := fPropertyMap[aName]; + result := Assigned(l); + if result + then aValue := l.Value + else aValue := unassigned; +end; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +function TengShaderGenerator.TrySetProperty(const aName: String; const aValue: Variant): Boolean; +var + l: TengShaderPartPropertyList; +begin + l := fPropertyMap[aName]; + result := Assigned(l); + if result then + l.Value := aValue; +end; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +procedure TengShaderGenerator.ListProperties(const aPropertyNames: TStrings); +var + s: String; +begin + for s in fPropertyMap.Keys do + aPropertyNames.Add(s); +end; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TengShaderGenerator.GenerateCode(const aCode: TengShaderCode); var @@ -185,17 +221,17 @@ begin 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.GenerateProcedureCode; + args.GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartVar)); + args.GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartVarying)); + args.GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartUniform)); + args.PushCode; try args.GenerateMetaCode; diff --git a/uengShaderPartInclude.pas b/uengShaderPartInclude.pas index 10804cd..fbeda9a 100644 --- a/uengShaderPartInclude.pas +++ b/uengShaderPartInclude.pas @@ -106,7 +106,8 @@ end; procedure TengShaderPartInclude.SaveToFile(const aFilename: String; const aFileWriter: IengShaderFileWriter); begin LoadShaderFile; - fIncludeFile := Format('%p_', [Pointer(fShaderFile)]) + ExtractFileName(fIncludeFile); + if (Pos('SFPF', ExtractFileName(fIncludeFile)) <> 1) then + fIncludeFile := Format('SFPF%p_', [Pointer(fShaderFile)]) + ExtractFileName(fIncludeFile); fAbsoluteFile := ExtractFilePath(aFilename) + fIncludeFile; fShaderFile.SaveToFile(fAbsoluteFile, aFileWriter); end; diff --git a/uengShaderPartProc.pas b/uengShaderPartProc.pas index 2e509e2..a65d7e4 100644 --- a/uengShaderPartProc.pas +++ b/uengShaderPartProc.pas @@ -10,7 +10,7 @@ uses uengShaderPart, uengShaderPartScope, uengShaderFileParser, uengShaderGeneratorArgs {$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} - , uutlGenerics; + , uutlGenerics {$ELSE} , uengShaderFileGenerics {$ENDIF}