Class TCastleScene

Unit

Declaration

type TCastleScene = class(TCastleSceneCore)

Description

Complete loading, processing and rendering of a scene. This is a descendant of TCastleSceneCore that adds efficient rendering.

Hierarchy

Overview

Fields

Public InternalVisibilityTest: TTestShapeVisibility;

Methods

Protected function CreateShape(const AGeometry: TAbstractGeometryNode; const AState: TX3DGraphTraverseState; const ParentInfo: PTraversingInfo): TShape; override;
Protected procedure InternalInvalidateBackgroundRenderer; override;
Protected procedure LocalRender(const Params: TRenderParams); override;
Protected procedure LocalRenderShadowVolume(const Params: TRenderParams; const ShadowVolumeRenderer: TBaseShadowVolumeRenderer); override;
Protected procedure ChangeWorld(const Value: TCastleAbstractRootTransform); override;
Public constructor Create(AOwner: TComponent); override;
Public destructor Destroy; override;
Public procedure Update(const SecondsPassed: Single; var RemoveMe: TRemoveType); override;
Public function PropertySections(const PropertyName: String): TPropertySections; override;
Public procedure GLContextClose; override;
Public procedure PrepareResources(const Options: TPrepareResourcesOptions; const Params: TPrepareParams); override; deprecated 'this is internal; use TCastleViewport.PrepareResources to prepare transformations';
Public procedure BeforeNodesFree(const InternalChangedAll: boolean = false); override;
Public function HasColliderMesh: Boolean; override;
Public procedure ColliderMesh(const TriangleEvent: TTriangleEvent); override;
Public procedure FreeResources(Resources: TSceneFreeResources); override;
Public function Attributes: TCastleRenderOptions; deprecated 'use RenderOptions';
Public procedure InternalCameraChanged; override;
Public function InternalScreenEffectsCount: Integer;
Public function InternalScreenEffectsNeedDepth: boolean;
Public function Clone(const AOwner: TComponent): TCastleScene;
Public function WasVisible: Boolean;

Properties

Published property ShapeFrustumCulling: Boolean read FShapeFrustumCulling write SetShapeFrustumCulling default true;
Published property SceneFrustumCulling: Boolean read FSceneFrustumCulling write FSceneFrustumCulling default true;
Published property ReceiveShadowVolumes: boolean read FReceiveShadowVolumes write FReceiveShadowVolumes default true;
Published property DistanceCulling: Single read FDistanceCulling write SetDistanceCulling default 0;
Published property RenderOptions: TCastleRenderOptions read FRenderOptions;
Published property CastGlobalLights: Boolean read FCastGlobalLights write SetCastGlobalLights default false;

Description

Fields

Public InternalVisibilityTest: TTestShapeVisibility;

Internal override test visibility.

Methods

Protected function CreateShape(const AGeometry: TAbstractGeometryNode; const AState: TX3DGraphTraverseState; const ParentInfo: PTraversingInfo): TShape; override;
 
Protected procedure InternalInvalidateBackgroundRenderer; override;
 
Protected procedure LocalRender(const Params: TRenderParams); override;
 
Protected procedure LocalRenderShadowVolume(const Params: TRenderParams; const ShadowVolumeRenderer: TBaseShadowVolumeRenderer); override;

Render shadow volume (sides and caps) of this scene, for shadow volume algorithm.

Uses ShadowVolumeRenderer for rendering, and to detect if rendering is necessary at all.

It always uses silhouette optimization. This is the usual, fast method of rendering shadow volumes.

All shadow quads are generated from scene triangles transformed by ParentTransform. We must be able to correctly detect front and back facing triangles with respect to light position, so ShadowVolumeRenderer.LightPosition and "this scene transformed by ParentTransform" must be in the same coordinate system. If ParentTransformIsIdentity then ParentTransform value is ignored and everything works like ParentTransform = identity matrix (and is a little faster in this special case).

Uses TrianglesListShadowCasters and ManifoldEdges and BorderEdges (so you may prefer to prepare it before, e.g. by calling PrepareResources with prShadowVolume included).

We look at some RenderOptions, like RenderOptions.Blending, because transparent triangles have to be handled a little differently, and when RenderOptions.Blending = false then all triangles are forced to be opaque. In other words, this takes RenderOptions into account, to cooperate with our Render method.

ShadowVolumeRenderer.LightPosition is the light position. ShadowVolumeRenderer.LightPosition[3] must be 1 (to indicate positional light) or 0 (a directional light). It's expected that ShadowVolumeRenderer is already initialized by ShadowVolumeRenderer.InitFrustumAndLight.

Faces (both shadow quads and caps) are rendered such that CCW <=> you're looking at it from outside (i.e. it's considered front face of this shadow volume).

Protected procedure ChangeWorld(const Value: TCastleAbstractRootTransform); override;
 
Public constructor Create(AOwner: TComponent); override;
 
Public destructor Destroy; override;
 
Public procedure Update(const SecondsPassed: Single; var RemoveMe: TRemoveType); override;
 
Public function PropertySections(const PropertyName: String): TPropertySections; override;
 
Public procedure GLContextClose; override;

Destroy any associations of this object with current OpenGL context. For example, release any allocated texture names.

Generally speaking, destroys everything that is allocated by PrepareResources call. It's harmless to call this method when there are already no associations with current OpenGL context. This is called automatically from the destructor.

Public procedure PrepareResources(const Options: TPrepareResourcesOptions; const Params: TPrepareParams); override; deprecated 'this is internal; use TCastleViewport.PrepareResources to prepare transformations';

Warning: this symbol is deprecated: this is internal; use TCastleViewport.PrepareResources to prepare transformations

 
Public procedure BeforeNodesFree(const InternalChangedAll: boolean = false); override;
 
Public function HasColliderMesh: Boolean; override;

Does this transform have a collision mesh that TCastleMeshCollider can use.

Public procedure ColliderMesh(const TriangleEvent: TTriangleEvent); override;

Enumerate triangles for a collision mesh that TCastleMeshCollider can use.

Public procedure FreeResources(Resources: TSceneFreeResources); override;
 
Public function Attributes: TCastleRenderOptions; deprecated 'use RenderOptions';

Warning: this symbol is deprecated: use RenderOptions

 
Public procedure InternalCameraChanged; override;
 
Public function InternalScreenEffectsCount: Integer;
 
Public function InternalScreenEffectsNeedDepth: boolean;
 
Public function Clone(const AOwner: TComponent): TCastleScene;

Create a scene with the same contents (X3D scene graph) as this one. The created scene has exactly the same class as this one (we use ClassType.Create to call a virtual constructor).

Note that this does not copy other scene properties, like ProcessEvents or Spatial or RenderOptions contents.

Public function WasVisible: Boolean;

Whether the scene was (potentially, at least partially) visible in the last rendering event.

The "was visible" means that "some shape was visible", that is: some shape passed frustum culling, distance culling and occlusion culling (see https://castle-engine.io/occlusion_culling ) tests.

The result of this method is not affected by:

  • Lights.

    That is, it doesn't matter whether this scene contains some lights (X3D light nodes in RootNode) that possibly make some other scenes brighter.

  • Background.

    It doesn't matter whether the scene contains some background that affects TCastleViewport skybox.

  • Children scenes.

    It doesn't matter if you have any children scenes (TCastleScene instances that are children of this) and whether they are visible. This follows the general rule that TCastleScene-specific features do not look/affect children scenes, including children TCastleScene. Only TCastleTransform features, like TCastleTransform.Exists, are applied recursively, i.e. they generally affect the children transformations.

To summarize and emphasize: for this method, only the visibility of shapes within this scene matters.

If this scene instance is used multiple times within some viewport, or when multiple viewports render the same scene, then it is enough that at least one shape in one of the scene instances was visible last frame.

TODO: For now, occlusion culling doesn't affect this, i.e. if the scene is not visible because occlusion culling.

Properties

Published property ShapeFrustumCulling: Boolean read FShapeFrustumCulling write SetShapeFrustumCulling default true;

Improve performance of rendering by checking for each shape whether it is inside frustum (camera pyramid of view) before rendering.

This is almost always a good idea. Exception may be when, in the most common scene position, all the shapes are inside the frustum, or all the shapes are outside the frustum. In this case this check is wasting time, and it matters if you have a lot of shapes. In such case, SceneFrustumCulling will be enough.

Published property SceneFrustumCulling: Boolean read FSceneFrustumCulling write FSceneFrustumCulling default true;

Improve performance of rendering by checking for the whole scene whether it is inside frustum (camera pyramid of view) before rendering.

This is almost always a good idea. Exception may be when the scene is almost always within the frustum, and you have a lot of scenes. In such case, this check may be a waste of time.

Published property ReceiveShadowVolumes: boolean read FReceiveShadowVolumes write FReceiveShadowVolumes default true;

Does this scene receive shadows by shadow volumes.

Published property DistanceCulling: Single read FDistanceCulling write SetDistanceCulling default 0;

Cull shapes farther than this distance. Ignored if <= 0.

Published property RenderOptions: TCastleRenderOptions read FRenderOptions;

Rendering options. You are free to change them at any time.

Published property CastGlobalLights: Boolean read FCastGlobalLights write SetCastGlobalLights default false;

Lights defines by given scene shine on everything in the viewport, including all other TCastleScene.


Generated by PasDoc 0.16.0.