GXS.MultiMaterialShader.pas 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. //
  2. // The graphics engine GLXEngine. The unit of GXScene for Delphi
  3. //
  4. unit GXS.MultiMaterialShader;
  5. (*
  6. A shader that applies a render pass for each material in
  7. its assigned MaterialLibrary.
  8. *)
  9. interface
  10. uses
  11. System.Classes,
  12. GXS.Material,
  13. GXS.RenderContextInfo,
  14. GXS.State;
  15. type
  16. TgxMultiMaterialShader = class(TgxShader)
  17. private
  18. FPass: Integer;
  19. FMaterialLibrary: TgxMaterialLibrary;
  20. FVisibleAtDesignTime: boolean;
  21. FShaderActiveAtDesignTime: boolean;
  22. FShaderStyle: TgxShaderStyle;
  23. procedure SetVisibleAtDesignTime(const Value: boolean);
  24. procedure SetShaderStyle(const Value: TgxShaderStyle);
  25. protected
  26. procedure SetMaterialLibrary(const val: TgxMaterialLibrary);
  27. procedure DoApply(var rci: TgxRenderContextInfo; Sender: TObject); override;
  28. function DoUnApply(var rci: TgxRenderContextInfo): boolean; override;
  29. public
  30. constructor Create(aOwner: TComponent); override;
  31. published
  32. property MaterialLibrary: TgxMaterialLibrary read FMaterialLibrary
  33. write SetMaterialLibrary;
  34. property VisibleAtDesignTime: boolean read FVisibleAtDesignTime
  35. write SetVisibleAtDesignTime;
  36. property ShaderStyle: TgxShaderStyle read FShaderStyle write SetShaderStyle;
  37. end;
  38. // ------------------------------------------------------------------
  39. implementation
  40. // ------------------------------------------------------------------
  41. // ------------------
  42. // ------------------ TgxMultiMaterialShader ------------------
  43. // ------------------
  44. constructor TgxMultiMaterialShader.Create(aOwner: TComponent);
  45. begin
  46. inherited;
  47. FShaderStyle := ssReplace;
  48. FVisibleAtDesignTime := False;
  49. end;
  50. procedure TgxMultiMaterialShader.DoApply(var rci: TgxRenderContextInfo;
  51. Sender: TObject);
  52. begin
  53. if not Assigned(FMaterialLibrary) then
  54. exit;
  55. FShaderActiveAtDesignTime := FVisibleAtDesignTime;
  56. FPass := 1;
  57. if (not(csDesigning in ComponentState)) or FShaderActiveAtDesignTime then
  58. begin
  59. rci.ignoreDepthRequests := True;
  60. rci.gxStates.Enable(stDepthTest);
  61. rci.gxStates.DepthFunc := cfLEqual;
  62. if FMaterialLibrary.Materials.Count > 0 then
  63. FMaterialLibrary.Materials[0].Apply(rci);
  64. rci.ignoreDepthRequests := False;
  65. end;
  66. end;
  67. function TgxMultiMaterialShader.DoUnApply
  68. (var rci: TgxRenderContextInfo): boolean;
  69. begin
  70. Result := False;
  71. if not Assigned(FMaterialLibrary) then
  72. exit;
  73. if (not(csDesigning in ComponentState)) or FShaderActiveAtDesignTime then
  74. begin
  75. if FMaterialLibrary.Materials.Count > 0 then
  76. // handle multi-pass materials
  77. if FMaterialLibrary.Materials[FPass - 1].UnApply(rci) then
  78. begin
  79. Result := True;
  80. exit;
  81. end;
  82. if (FPass >= FMaterialLibrary.Materials.Count) then
  83. begin
  84. rci.gxStates.DepthFunc := cfLess;
  85. exit;
  86. end;
  87. FMaterialLibrary.Materials[FPass].Apply(rci);
  88. Result := True;
  89. Inc(FPass);
  90. end;
  91. end;
  92. procedure TgxMultiMaterialShader.SetMaterialLibrary
  93. (const val: TgxMaterialLibrary);
  94. begin
  95. if val <> FMaterialLibrary then
  96. begin
  97. FMaterialLibrary := val;
  98. NotifyChange(Self);
  99. end;
  100. end;
  101. procedure TgxMultiMaterialShader.SetShaderStyle(const Value: TgxShaderStyle);
  102. begin
  103. FShaderStyle := Value;
  104. inherited ShaderStyle := FShaderStyle;
  105. end;
  106. procedure TgxMultiMaterialShader.SetVisibleAtDesignTime(const Value: boolean);
  107. begin
  108. FVisibleAtDesignTime := Value;
  109. if csDesigning in ComponentState then
  110. NotifyChange(Self);
  111. end;
  112. end.