| @@ -0,0 +1,11 @@ | |||||
| {$CLASS TestClass} | |||||
| /* some code here */ | |||||
| {$PROC TestProc} | |||||
| gl_FragColor = vec4(1.0); | |||||
| {$END} | |||||
| {$MAIN} | |||||
| {$CALL TestProc}; | |||||
| {$END} | |||||
| {$END} | |||||
| @@ -0,0 +1,11 @@ | |||||
| /* some code here */ | |||||
| void TestClass_TestProc(void) | |||||
| { | |||||
| gl_FragColor = vec4(1.0); | |||||
| } | |||||
| void main(void) | |||||
| { | |||||
| TestClass_TestProc(); | |||||
| } | |||||
| @@ -52,6 +52,11 @@ type | |||||
| procedure InheritedMain; | procedure InheritedMain; | ||||
| end; | end; | ||||
| TTestCase_General = class(TShaderFileTestCase) | |||||
| published | |||||
| procedure OrderOfMainProcClassContent; | |||||
| end; | |||||
| implementation | implementation | ||||
| uses | uses | ||||
| @@ -206,11 +211,20 @@ begin | |||||
| DoTest('code_Class_InheritedMain.shdr', 'SimpleClass', 'result_Class_InheritedMain.shdr'); | DoTest('code_Class_InheritedMain.shdr', 'SimpleClass', 'result_Class_InheritedMain.shdr'); | ||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TTestCase_General///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TTestCase_General.OrderOfMainProcClassContent; | |||||
| begin | |||||
| DoTest('code_General_OrderOfMainProcClassContent.shdr', 'TestClass', 'result_General_OrderOfMainProcClassContent.shdr'); | |||||
| end; | |||||
| initialization | initialization | ||||
| RegisterTest(TTestCase_IfElifElseEnd); | RegisterTest(TTestCase_IfElifElseEnd); | ||||
| RegisterTest(TTestCase_FuncProcMain); | RegisterTest(TTestCase_FuncProcMain); | ||||
| RegisterTest(TTestCase_Include); | RegisterTest(TTestCase_Include); | ||||
| RegisterTest(TTestCase_Class); | RegisterTest(TTestCase_Class); | ||||
| RegisterTest(TTestCase_General); | |||||
| end. | end. | ||||
| @@ -205,7 +205,7 @@ begin | |||||
| sr := TengSearchResults.Create; | sr := TengSearchResults.Create; | ||||
| walker := TengSearchWalker.Create(sr); | walker := TengSearchWalker.Create(sr); | ||||
| try | try | ||||
| walker.SearchFlags := [sfSearchChildren, sfEvaluateIf]; | |||||
| walker.SearchFlags := [sfSearchChildren, sfEvaluateIf, sfSearchInherited]; | |||||
| walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartMain); | walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartMain); | ||||
| walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderGenerator); | walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderGenerator); | ||||
| walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile); | walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile); | ||||
| @@ -221,17 +221,17 @@ begin | |||||
| args.PopFlags; | args.PopFlags; | ||||
| end; | end; | ||||
| end; | end; | ||||
| args.GenerateProcedureCode; | |||||
| args.GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartVar)); | |||||
| args.GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartVarying)); | |||||
| args.GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartUniform)); | |||||
| finally | finally | ||||
| FreeAndNil(walker); | FreeAndNil(walker); | ||||
| FreeAndNil(sr); | FreeAndNil(sr); | ||||
| args.PopCode([pcfAppend, pcfAddEmptyLine]); | args.PopCode([pcfAppend, pcfAddEmptyLine]); | ||||
| end; | end; | ||||
| args.GenerateProcedureCode; | |||||
| args.GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartVar)); | |||||
| args.GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartVarying)); | |||||
| args.GenerateParameterCode(CengShaderPartArr.Create(TengShaderPartUniform)); | |||||
| args.PushCode; | args.PushCode; | ||||
| try | try | ||||
| args.GenerateMetaCode; | args.GenerateMetaCode; | ||||
| @@ -86,7 +86,7 @@ type | |||||
| private type | private type | ||||
| TCodeStack = specialize TutlSimpleList<TCodeStackItem>; | TCodeStack = specialize TutlSimpleList<TCodeStackItem>; | ||||
| TParameterMap = specialize TutlMap<string, TengShaderPart>; | TParameterMap = specialize TutlMap<string, TengShaderPart>; | ||||
| TProcedureList = specialize TutlSimpleList<TengShaderPart>; | |||||
| TProcedureList = specialize TutlList<TengShaderPart>; | |||||
| TProcParamStack = specialize TutlSimpleList<TStrings>; | TProcParamStack = specialize TutlSimpleList<TStrings>; | ||||
| private | private | ||||
| @@ -663,7 +663,8 @@ procedure TengShaderGeneratorArgs.AddProcedure(const aProc: TengShaderPart); | |||||
| begin | begin | ||||
| if not (aProc is TengShaderPartProc) then | if not (aProc is TengShaderPartProc) then | ||||
| raise EengShaderPartInternal.Create('parameter (' + aProc.ClassName + ') is not a ' + TengShaderPartProc.ClassName, aProc); | raise EengShaderPartInternal.Create('parameter (' + aProc.ClassName + ') is not a ' + TengShaderPartProc.ClassName, aProc); | ||||
| fProcedures.Add(aProc); | |||||
| if (fProcedures.IndexOf(aProc) < 0) then | |||||
| fProcedures.Add(aProc); | |||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||