@@ -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; | |||
@@ -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////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
@@ -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; | |||
@@ -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; | |||
@@ -10,7 +10,7 @@ uses | |||
uengShaderPart, uengShaderPartScope, uengShaderFileParser, uengShaderGeneratorArgs | |||
{$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} | |||
, uutlGenerics; | |||
, uutlGenerics | |||
{$ELSE} | |||
, uengShaderFileGenerics | |||
{$ENDIF} | |||