1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
unit V3DSceneShadows;
{$I v3dsceneconf.inc}
interface
uses CastleWindow, CastleScene, CastleTransform, CastleVectors, CastleViewport,
CastleRenderOptions;
{ Compile also with CGE branches that don't yet have new-cameras work merged.
Once new-cameras merged -> master, we can remove this. }
{$if not declared(TCastleAutoNavigationViewport)}
{$define TCastleAutoNavigationViewport:=TCastleViewport}
{$endif}
type
{ Takes care of setting shadow volume properties, and modifies a little
shadow volume rendering to work nicely with all view3dscene
configurations (bump mapping, fill modes etc.) }
TV3DShadowsViewport = class(TCastleAutoNavigationViewport)
protected
procedure RenderOnePass(const Params: TRenderParams); override;
end;
var
ShadowVolumes: boolean = true;
ShadowVolumesRender: boolean = false;
procedure ViewportShadowsProperties(Viewport: TCastleViewport);
implementation
uses SysUtils, CastleConfig, CastleGLUtils, V3DSceneFillMode;
procedure ViewportShadowsProperties(Viewport: TCastleViewport);
begin
Viewport.ShadowVolumes := ShadowVolumes;
Viewport.ShadowVolumesRender := ShadowVolumesRender;
end;
procedure TV3DShadowsViewport.RenderOnePass(const Params: TRenderParams);
procedure RenderOnePassShadowsBegin(Scene: TCastleScene);
begin
{ Thanks to using SolidShadowColor, shadow is visible
even when rmSolidColor is used }
Scene.RenderOptions.SolidColor := SolidShadowColor;
end;
procedure RenderOnePassNoShadowsBegin(Scene: TCastleScene);
begin
Scene.RenderOptions.SolidColor := SolidColor;
end;
begin
if Params.InShadow then
begin
RenderOnePassShadowsBegin(Items.MainScene);
inherited;
end else
begin
RenderOnePassNoShadowsBegin(Items.MainScene);
inherited;
end;
end;
end.
|