Class TCastleSceneCore
Unit
Declaration
type TCastleSceneCore = class(TX3DEventsEngine)
Description
Loading and processing of a scene. Almost everything visible in your game will be an instance of TCastleScene, which is a descendant of this class that adds rendering capabilities.
This class provides a lot of functionality, like loading of the scene (Load method), animating it, performing collisions with the scene, and calculating things (like LocalBoundingBox).
The actual scene information (visible and collidable things) is inside X3D nodes graph contained within the RootNode. During the lifetime of the scene, this X3D graph can change (e.g. because of animations), and you can always change it by code too. E.g. you can freely change TTransformNode.Translation or add children by RootNode.AddChildren. The X3D nodes graph works like a DOM tree for rendering HTML documents: it's typically initialized from a file (3D model), but during the game execution it is dynamic, always changing.
This class takes care of performing the X3D events and routes mechanism (if ProcessEvents is True
). This is what allows X3D graph to be animated, or even be interactive (respond to user actions). For a simple way to play animations, use the PlayAnimation method.
This class maintains a Shapes tree is always synchronized with the X3D nodes tree in RootNode. The Shapes tree provides a little simple view at the scene, sometimes easier (or faster) to iterate over.
Many results are cached, so querying them multiple times is fast, if the scene does not change (in a significant way) between each query. So you can query information like LocalBoundingBox, BoundingBox, VerticesCount... as often as you want to.
Hierarchy
- TObject
- TPersistent
- TComponent
- TCastleComponent
- TCastleTransform
- TX3DEventsEngine
- TCastleSceneCore
Overview
Nested Classes and Records
TVisibilitySensors = class(specialize TDictionary<TVisibilitySensorNode,TVisibilitySensorInstanceList>) |
Nested Types
TCompiledScriptHandler = procedure ( Value: TX3DField; const Time: TX3DTime) of object; |
|
TVisibilitySensorInstanceList = specialize TObjectList<TVisibilitySensorInstance>; |
Fields
ScreenEffectNodes: TX3DNodeList; |
|
IsVisibleNow: boolean; |
|
GeneratedTextures: TGeneratedTextureList; |
|
nested const DefaultShadowMapsDefaultSize = 256; |
Methods
function InternalBuildNodeInside: TObject; override; |
|
function CreateShape(const AGeometry: TAbstractGeometryNode; const AState: TX3DGraphTraverseState; const ParentInfo: PTraversingInfo): TShape; virtual; |
|
procedure UpdateHeadlightOnFromNavigationInfo; |
|
procedure ChangedTransform; override; |
|
procedure ChangeWorld(const Value: TCastleAbstractRootTransform); override; |
|
procedure DoPointingDeviceSensorsChange; virtual; |
|
procedure ExecuteCompiledScript(const HandlerName: String; ReceivedValue: TX3DField); override; |
|
function LocalHeightCollision(const APosition, GravityUp: TVector3; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc; out AboveHeight: Single; out AboveGround: PTriangle): boolean; override; |
|
function LocalMoveCollision( const OldPos, ProposedNewPos: TVector3; out NewPos: TVector3; const IsRadius: boolean; const Radius: Single; const OldBox, NewBox: TBox3D; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc): boolean; override; |
|
function LocalMoveCollision( const OldPos, NewPos: TVector3; const IsRadius: boolean; const Radius: Single; const OldBox, NewBox: TBox3D; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc): boolean; override; |
|
function LocalSegmentCollision(const Pos1, Pos2: TVector3; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc; const ALineOfSight: boolean): boolean; override; |
|
function LocalSphereCollision(const Pos: TVector3; const Radius: Single; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc): boolean; override; |
|
function LocalSphereCollision2D(const Pos: TVector2; const Radius: Single; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc; const Details: TCollisionDetails): boolean; override; |
|
function LocalPointCollision2D(const Point: TVector2; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc): boolean; override; |
|
function LocalBoxCollision(const Box: TBox3D; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc): boolean; override; |
|
function LocalRayCollision(const RayOrigin, RayDirection: TVector3; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc): TRayCollision; override; |
|
procedure LocalRender(const Params: TRenderParams); override; |
|
procedure Loaded; override; |
|
procedure InternalMoveShapeAssociations( const OldNode, NewNode: TX3DNode; const ContainingShapes: TObject); override; |
|
function LocalBoundingBoxNoChildren: TBox3D; |
|
constructor Create(AOwner: TComponent); override; |
|
function PropertySections(const PropertyName: String): TPropertySections; override; |
|
procedure CustomSerialization(const SerializationProcess: TSerializationProcess); override; |
|
procedure Load(const ARootNode: TX3DRootNode; const AOwnsRootNode: boolean; const AOptions: TSceneLoadOptions = []); overload; |
|
procedure Load(const AUrl: String; const AOptions: TSceneLoadOptions = []); overload; |
|
procedure Load(const AUrl: String; const AllowStdIn: boolean; const AResetTime: boolean = true); overload; deprecated 'use Load with (AUrl: String, AOptions: TSceneLoadOptions) parameters. AllowStdIn is not implemented anymore.'; |
|
procedure Save(const AUrl: String); |
|
procedure BeforeDestruction; override; |
|
destructor Destroy; override; |
|
function ShapesActiveCount: Cardinal; |
|
function ShapesActiveVisibleCount: Cardinal; |
|
function VerticesCount: Cardinal; overload; |
|
function TrianglesCount: Cardinal; overload; |
|
function ViewpointsCount: Cardinal; |
|
function GetViewpointNode(const Idx: integer): TAbstractViewpointNode; |
|
function GetViewpointName(const Idx: integer): String; |
|
procedure MoveToViewpoint(const Idx: integer; const Animated: boolean = true); |
|
procedure AddViewpointFromNavigation(const Navigation: TCastleNavigation; const AName: String); |
|
procedure BeforeNodesFree(const InternalChangedAll: boolean = false); override; |
|
procedure NodeFreeRemovingFromAllParents(Node: TX3DNode); |
|
procedure RemoveShape(Shape: TShape); |
|
procedure ChangedAll(const OnlyAdditions: Boolean = false); override; |
|
procedure DoGeometryChanged(const Change: TGeometryChange; LocalGeometryShape: TShape); virtual; |
|
procedure DoViewpointsChanged; |
|
procedure DoBoundViewpointVectorsChanged; |
|
procedure DoBoundNavigationInfoFieldsChanged; virtual; |
|
procedure ScheduleChangedAll(const OnlyAdditions: Boolean = false); |
|
procedure BeginChangesSchedule; |
|
procedure EndChangesSchedule; |
|
function Info( ATriangleVerticesCounts, ABoundingBox: boolean; AManifoldAndBorderEdges: boolean): String; deprecated 'do not use this, better to construct a summary string yourself'; |
|
function InfoTriangleVerticesCounts: String; deprecated 'better to construct a string yourself, use TrianglesCount, VerticesCount'; |
|
function InfoBoundingBox: String; deprecated 'better to construct a string yourself, use BoundingBox.ToString'; |
|
function InfoManifoldAndBorderEdges: String; deprecated 'better to construct a string yourself, use EdgesCount'; |
|
procedure EdgesCount(out ManifoldEdges, BorderEdges: Cardinal); |
|
function InternalOctreeRendering: TShapeOctree; |
|
function InternalOctreeDynamicCollisions: TShapeOctree; |
|
function InternalOctreeCollisions: TBaseTrianglesOctree; |
|
function UseInternalOctreeCollisions: boolean; |
|
function GetViewpoint( out ProjectionType: TProjectionType; out CamPos, CamDir, CamUp, GravityUp: TVector3; const ViewpointDescription: String = ''): TAbstractViewpointNode; |
|
function GetPerspectiveViewpoint( out CamPos, CamDir, CamUp, GravityUp: TVector3; const ViewpointDescription: String = ''): TAbstractViewpointNode; |
|
procedure FreeResources(Resources: TSceneFreeResources); virtual; |
|
procedure UnregisterScene(Node: TX3DNode); deprecated 'use Node.UnregisterScene'; |
|
function Press(const Event: TInputPressRelease): boolean; override; |
|
function Release(const Event: TInputPressRelease): boolean; override; |
|
function PointingDevicePress(const Pick: TRayCollisionNode; const Distance: Single): Boolean; override; |
|
function PointingDeviceRelease(const Pick: TRayCollisionNode; const Distance: Single; const CancelAction: Boolean): Boolean; override; |
|
function PointingDeviceMove(const Pick: TRayCollisionNode; const Distance: Single): boolean; override; |
|
function PointingDeviceSensors: TPointingDeviceSensorList; |
|
procedure PointingDeviceClear; |
|
function LocalBoundingBox: TBox3D; override; |
|
procedure Update(const SecondsPassed: Single; var RemoveMe: TRemoveType); override; |
|
procedure SetTime(const NewValue: TFloatTime); |
|
procedure IncreaseTime(const TimeIncrease: TFloatTime); |
|
procedure IncreaseTimeTick; deprecated 'it should not be necessary to call this, ever; using TX3DEvent.Send(...) or TX3DEvent.Send(..., NextEventTime) will automatically behave Ok.'; |
|
function Time: TFloatTime; override; |
|
function NextEventTime: TX3DTime; override; |
|
procedure ResetTime(const NewValue: TFloatTime); |
|
procedure ResetTimeAtLoad; |
|
function GetBackgroundStack: TX3DBindableStackBasic; override; |
|
function GetFogStack: TX3DBindableStackBasic; override; |
|
function GetNavigationInfoStack: TX3DBindableStackBasic; override; |
|
function GetViewpointStack: TX3DBindableStackBasic; override; |
|
procedure RegisterCompiledScript(const HandlerName: String; Handler: TCompiledScriptHandler); |
|
procedure InternalUpdateNavigation( const Navigation: TCastleNavigation); |
|
procedure CameraTransition(const Camera: TCastleCamera; const APosition, ADirection, AUp: TVector3); overload; deprecated 'use Camera.AnimateTo(APosition, ADirection, AUp)'; |
|
procedure CameraTransition(const Camera: TCastleCamera; const APosition, ADirection, AUp, GravityUp: TVector3); overload; deprecated 'use Camera.AnimateTo(APosition, ADirection, AUp)'; |
|
procedure CameraTransition(const Navigation: TCastleNavigation; const APosition, ADirection, AUp: TVector3); overload; deprecated 'use Camera.AnimateTo(APosition, ADirection, AUp)'; |
|
procedure CameraTransition(const Navigation: TCastleNavigation; const APosition, ADirection, AUp, GravityUp: TVector3); overload; deprecated 'use Camera.AnimateTo(APosition, ADirection, AUp)'; |
|
function CustomHeadlight: TAbstractLightNode; |
|
procedure PrepareResources(const Options: TPrepareResourcesOptions; const Params: TPrepareParams); override; |
|
function Caption: String; |
|
function Node(const NodeClass: TX3DNodeClass; const NodeName: String; const Options: TFindNodeOptions = []): TX3DNode; overload; |
|
function Node(const NodeName: String): TX3DNode; overload; |
|
function Field(const NodeName, FieldName: String): TX3DField; overload; |
|
function Event(const NodeName, EventName: String): TX3DEvent; overload; |
|
function HasAnimation(const AnimationName: String): boolean; |
|
function AnimationTimeSensor(const AnimationName: String): TTimeSensorNode; overload; |
|
function AnimationTimeSensor(const Index: Integer): TTimeSensorNode; overload; |
|
function ForceAnimationPose(const AnimationName: String; const TimeInAnimation: TFloatTime; const Loop: boolean; const Forward: boolean = true): boolean; overload; |
|
function PlayAnimation(const Parameters: TPlayAnimationParameters): boolean; overload; |
|
function PlayAnimation(const AnimationName: String; const Loop: boolean; const Forward: boolean = true): boolean; overload; |
|
procedure ForceInitialAnimationPose; |
|
function AnimationDuration(const AnimationName: String): TFloatTime; |
|
procedure StopAnimation(const DisableStopNotification: Boolean = false); |
|
procedure ResetAnimationState(const IgnoreAffectedBy: TTimeSensorNode = nil); |
|
procedure FontChanged; |
|
function Clone(const AOwner: TComponent): TCastleSceneCore; |
|
procedure InternalIncShapesHash; |
|
procedure ReloadUrl; |
Properties
property VisibilitySensors: TVisibilitySensors read FVisibilitySensors; |
|
property Shapes: TShapeTree read FShapes; |
|
property OnGeometryChanged: TSceneGeometryChanged
read FOnGeometryChanged write FOnGeometryChanged; |
|
property OnViewpointsChanged: TNotifyEvent
read FOnViewpointsChanged write FOnViewpointsChanged; |
|
property OnBoundViewpointVectorsChanged: TNotifyEvent
read FOnBoundViewpointVectorsChanged write FOnBoundViewpointVectorsChanged; |
|
property OnBoundNavigationInfoFieldsChanged: TNotifyEvent
read FOnBoundNavigationInfoFieldsChanged write FOnBoundNavigationInfoFieldsChanged; |
|
property RootNode: TX3DRootNode read FRootNode write SetRootNode; |
|
property OwnsRootNode: boolean read FOwnsRootNode write FOwnsRootNode default true; deprecated 'set OwnsRootNode only at loading, do not depend on this property'; |
|
property PointingDeviceOverItem: PTriangle
read FPointingDeviceOverItem write FPointingDeviceOverItem; |
|
property PointingDeviceOverPoint: TVector3
read FPointingDeviceOverPoint write FPointingDeviceOverPoint; |
|
property PointingDeviceActiveSensors: TX3DNodeList
read FPointingDeviceActiveSensors; |
|
property PointingDeviceActive: boolean
read FPointingDeviceActive default false; |
|
property OnPointingDeviceSensorsChange: TNotifyEvent
read FOnPointingDeviceSensorsChange
write FOnPointingDeviceSensorsChange; |
|
property TimeAtLoad: TFloatTime read FTimeAtLoad; |
|
property BackgroundStack: TBackgroundStack read FBackgroundStack; |
|
property FogStack: TFogStack read FFogStack; |
|
property NavigationInfoStack: TNavigationInfoStack read FNavigationInfoStack; |
|
property ViewpointStack: TViewpointStack read FViewpointStack; |
|
property CompiledScriptHandlers: TCompiledScriptHandlerInfoList
read FCompiledScriptHandlers; |
|
property HeadlightOn: boolean
read FHeadlightOn write SetHeadlightOn; |
|
property OnHeadlightOnChanged: TNotifyEvent
read FOnHeadlightOnChanged write FOnHeadlightOnChanged; |
|
property InternalGlobalLights: TLightInstancesList read FGlobalLights; |
|
property AnimationsList: TStrings read FAnimationsList; |
|
property AnimationPrefix: String
read FAnimationPrefix write FAnimationPrefix; deprecated 'this property did not prove to be of much use; report if you need it, otherwise it may be removed one day'; |
|
property CurrentAnimation: TTimeSensorNode read FCurrentAnimation; |
|
property FileName: String read FUrl write SetUrl; deprecated; |
|
property InternalShapesHash: TShapesHash read FShapesHash; |
|
property DefaultAnimationTransition: Single
read FDefaultAnimationTransition write FDefaultAnimationTransition default 0.0; |
|
property TimePlaying: boolean read FTimePlaying write FTimePlaying default true; |
|
property TimePlayingSpeed: Single read FTimePlayingSpeed write FTimePlayingSpeed default 1.0; |
|
property PreciseCollisions: Boolean read FPreciseCollisions write SetPreciseCollisions default false; |
|
property ProcessEvents: boolean
read FProcessEvents write SetProcessEvents default false; |
|
property Url: String read FUrl write SetUrl; |
|
property ShadowMaps: boolean read FShadowMaps write SetShadowMaps default true; |
|
property ShadowMapsDefaultSize: Cardinal
read FShadowMapsDefaultSize write SetShadowMapsDefaultSize
default DefaultShadowMapsDefaultSize; |
|
property InitialViewpointIndex: Cardinal
read FInitialViewpointIndex write FInitialViewpointIndex default 0; |
|
property InitialViewpointName: String
read FInitialViewpointName write FInitialViewpointName; |
|
property AnimateOnlyWhenVisible: boolean
read FAnimateOnlyWhenVisible write FAnimateOnlyWhenVisible default false; |
|
property AnimateSkipTicks: Cardinal read FAnimateSkipTicks write SetAnimateSkipTicks
default 0; |
|
property AutoAnimation: String
read FAutoAnimation write SetAutoAnimation; |
|
property AutoAnimationLoop: Boolean
read FAutoAnimationLoop write SetAutoAnimationLoop default true; deprecated 'in future engine versions, AutoAnimationLoop may behave as always = true, and AutoAnimation will be renamed to just Animation and changing it will always cause a looping animation. Use PlayAnimation(''my_anim'',false) from code to play animation without looping.'; |
|
property ExposeTransforms: TStrings read FExposeTransforms write SetExposeTransforms; |
|
property ExposeTransformsPrefix: String read FExposeTransformsPrefix write SetExposeTransformsPrefix; |
|
property Cache: Boolean read FCache write FCache default false; |
Description
Nested Types
TCompiledScriptHandler = procedure ( Value: TX3DField; const Time: TX3DTime) of object; |
|
This item has no description. |
TVisibilitySensorInstanceList = specialize TObjectList<TVisibilitySensorInstance>; |
|
This item has no description. |
Fields
ScreenEffectNodes: TX3DNodeList; |
|
List of TScreenEffectNode nodes, collected by ChangedAll. |
IsVisibleNow: boolean; |
|
Is the scene visible currently. Descendants may set this to |
GeneratedTextures: TGeneratedTextureList; |
|
This item has no description. |
nested const DefaultShadowMapsDefaultSize = 256; |
|
This item has no description. |
Methods
function InternalBuildNodeInside: TObject; override; |
|
This item has no description. Showing description inherited from TCastleTransform.InternalBuildNodeInside.
Helper for InternalBuildNode. Result must be TAbstractChildNode or |
function CreateShape(const AGeometry: TAbstractGeometryNode; const AState: TX3DGraphTraverseState; const ParentInfo: PTraversingInfo): TShape; virtual; |
|
Create TShape (or descendant) instance suitable for this TCastleSceneCore descendant. In this class, this simply creates new TShape instance. If you make a descendant of TCastleSceneCore, you may need to store some per-shape information, and then it may be useful to have your own TShape descendant to carry this information. So you can override this to create your own descendant, and then you're sure that all leafs within Shapes tree are created using this. Example: TCastleScene uses this to create TGLShape. |
procedure UpdateHeadlightOnFromNavigationInfo; |
|
This item has no description. |
procedure ChangedTransform; override; |
|
This item has no description. Showing description inherited from TCastleTransform.ChangedTransform. Override to be notified about every transformation change. By default, this calls VisibleChangeHere, which causes the window to redraw. |
procedure ChangeWorld(const Value: TCastleAbstractRootTransform); override; |
|
This item has no description. Showing description inherited from TCastleTransform.ChangeWorld. Called when the current World that contains this object changes. In the usual case, World corresponds to a TCastleViewport.Items instance, and when this method is called it means that object is added/removed from a viewport. You can ignore this when called with Value equal to current World. Note that each TCastleTransform instance can only be part of one world (TCastleAbstractRootTransform) at a time. Although we may be present many times within the same world. Always remove the TCastleTransform from previous world before adding it to a new one. |
procedure DoPointingDeviceSensorsChange; virtual; |
|
Called after PointingDeviceSensors or PointingDeviceActiveSensors lists (possibly) changed. In this class, |
procedure ExecuteCompiledScript(const HandlerName: String; ReceivedValue: TX3DField); override; |
|
This item has no description. |
function LocalHeightCollision(const APosition, GravityUp: TVector3; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc; out AboveHeight: Single; out AboveGround: PTriangle): boolean; override; |
|
This item has no description. |
function LocalMoveCollision( const OldPos, ProposedNewPos: TVector3; out NewPos: TVector3; const IsRadius: boolean; const Radius: Single; const OldBox, NewBox: TBox3D; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc): boolean; override; |
|
This item has no description. |
function LocalMoveCollision( const OldPos, NewPos: TVector3; const IsRadius: boolean; const Radius: Single; const OldBox, NewBox: TBox3D; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc): boolean; override; |
|
This item has no description. |
function LocalSegmentCollision(const Pos1, Pos2: TVector3; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc; const ALineOfSight: boolean): boolean; override; |
|
This item has no description. |
function LocalSphereCollision(const Pos: TVector3; const Radius: Single; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc): boolean; override; |
|
This item has no description. |
function LocalSphereCollision2D(const Pos: TVector2; const Radius: Single; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc; const Details: TCollisionDetails): boolean; override; |
|
This item has no description. |
function LocalPointCollision2D(const Point: TVector2; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc): boolean; override; |
|
This item has no description. |
function LocalBoxCollision(const Box: TBox3D; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc): boolean; override; |
|
This item has no description. |
function LocalRayCollision(const RayOrigin, RayDirection: TVector3; const TrianglesToIgnoreFunc: TTriangleIgnoreFunc): TRayCollision; override; |
|
This item has no description. |
procedure LocalRender(const Params: TRenderParams); override; |
|
This item has no description. Showing description inherited from TCastleTransform.LocalRender. Collect the things to be rendered now. Override this method if you need to perform custom rendering, by direct OpenGL(ES) calls. Never call this method yourself – the rendering of TCastleViewport will call it when needed. Warning: It is an advanced topic how to make such rendering work, and make it work in a cross-platform way. You will need to understand how OpenGL(ES) works, and you will need to account for how the engine renders things too, to not conflict with the engine – e.g. you will have to use RenderContext for some things. If you're not ready for this, then you're better off not overriding this method, instead just rely on the engine built-in rendering, done by TCastleScene and other components. This method gets parameters (Params) including a full transformation of this scene. In return, it should add the things to be rendered in this frame using Params.AddRenderEvent. Internally: TCastleScene also adds X3D shapes to be rendered to TRenderParams.Collector. But you should not need to deal with TRenderParams.Collector in your own code. TODO: The names |
procedure Loaded; override; |
|
This item has no description. |
procedure InternalMoveShapeAssociations( const OldNode, NewNode: TX3DNode; const ContainingShapes: TObject); override; |
|
Called before changing one node into another, when old node may have beeen associated with a shape using TShapeTree.AssociateNode. Both OldNode and NewNode may be It is allowed to call this even when OldNode = NewNode, which means that nothing really changes. |
function LocalBoundingBoxNoChildren: TBox3D; |
|
Local (not affected by our Translation, Rotation, Scale) bounding box. Takes into account loaded scene (in Url) but not children TCastleTransform bounding volumes. |
constructor Create(AOwner: TComponent); override; |
|
This item has no description. |
function PropertySections(const PropertyName: String): TPropertySections; override; |
|
This item has no description. Showing description inherited from TCastleComponent.PropertySections. Section where to show property in the editor. |
procedure CustomSerialization(const SerializationProcess: TSerializationProcess); override; |
|
This item has no description. Showing description inherited from TCastleComponent.CustomSerialization. Override this method to call various methods of SerializationProcess, which in turn allows to serialize/deserialize things that are not published. This allows to serialize/deserialize with more freedom, e.g. to serialize/deserialize some private field. |
procedure Load(const ARootNode: TX3DRootNode; const AOwnsRootNode: boolean; const AOptions: TSceneLoadOptions = []); overload; |
|
Load the given model. This replaces RootNode with new value.
Note that you should never load the same TX3DRootNode instance into multiple TCastleScene instances.
// DON'T DO THIS!
Node := LoadNode(Url);
Scene1 := TCastleScene.Create(Application);
Scene1.Load(Node, false);
Scene2 := TCastleScene.Create(Application);
Scene2.Load(Node, false);
If you need to load the same model into multiple scenes, it is best to use the Clone method: SceneTemplate := TCastleScene.Create(Application); SceneTemplate.Load(Url); Scene1 := SceneTemplate.Clone(Application); Scene2 := SceneTemplate.Clone(Application);
Using the Clone makes a copy of the underlying X3D graph, so it is roughly like doing: Node := LoadNode(Url); Scene1 := TCastleScene.Create(Application); Scene1.Load(Node.DeepCopy as TX3DRootNode, false); Scene2 := TCastleScene.Create(Application); Scene2.Load(Node.DeepCopy as TX3DRootNode, false);
Note that sometimes you don't need to create multiple scenes to show the same model many times. You can simply insert the same TCastleScene instance multiple times to TCastleViewport.Items (TCastleRootTransform). See the manual: https://castle-engine.io/manual_scene.php#section_many_instances Parameters
|
procedure Load(const AUrl: String; const AOptions: TSceneLoadOptions = []); overload; |
|
Load the 3D model from given URL. We load a number of 3D model formats (X3D, VRML, Collada, Wavefront OBJ...) and some 2D model formats (Spine JSON). See https://castle-engine.io/creating_data_model_formats.php for the complete list. URL is downloaded using the CastleDownload unit, so it supports files, http resources and more. See https://castle-engine.io/manual_network.php about supported URL schemes. If you all you care about is loading normal files, then just pass a normal filename (absolute or relative to the current directory) as the URL parameter. |
procedure Save(const AUrl: String); |
|
Save the current 3D model (X3D nodes graph) to the given file (URL). The X3D encoding is automatically guessed from the URL extension. By default it is XML, and we suggest using the The file may also be automatically gzip compressed if extension indicates it. Use The Url property is also changed. |
procedure BeforeDestruction; override; |
|
This item has no description. |
destructor Destroy; override; |
|
This item has no description. |
function ShapesActiveCount: Cardinal; |
|
Number of active shapes in the Shapes tree. This is equivalent to Shapes.ShapesCount(true), except that this is faster (it's cached and reused in this instance, and automatically invalidated only when needed). |
function ShapesActiveVisibleCount: Cardinal; |
|
Number of active and visible (TShape.Visible) shapes in the Shapes tree. See also
|
function VerticesCount: Cardinal; overload; |
|
Calculate the number of triangls and vertexes of all shapa states. For detailed specification of what these functions do see appropriate TAbstractGeometryNode methods. Here, we just sum their results for all shapes. |
function TrianglesCount: Cardinal; overload; |
|
This item has no description. |
function ViewpointsCount: Cardinal; |
|
Number of viewpoints (named camera position+orientation). -1 if none. |
function GetViewpointNode(const Idx: integer): TAbstractViewpointNode; |
|
Viewpoint node (TAbstractViewpointNode) from an index between 0 and ViewpointsCount. |
function GetViewpointName(const Idx: integer): String; |
|
Good name to show user for a viewpoint, defined by an index between 0 and ViewpointsCount. |
procedure MoveToViewpoint(const Idx: integer; const Animated: boolean = true); |
|
Move current camera of the enclosing TCastleViewport to reflect the given viewpoint. This changes the camera position and orientation. In X3D terminology, the new viewpoint node becomes "bound" (current). Switching the viewpoint that is already bound (current) also has an effect, it will change the camera position and orientation to reflect the viewpoint defined position / orientation. |
procedure AddViewpointFromNavigation(const Navigation: TCastleNavigation; const AName: String); |
|
Add to scene nodes (graph in RootNode) new viewpoint node reflecting current camera and navigation settings. The new viewpoint increases ViewpointsCount, so it's also immediately available for switching to it. |
procedure BeforeNodesFree(const InternalChangedAll: boolean = false); override; |
|
Release all internal associations with your VRML/X3D nodes. In particular, this will release OpenGL resources connected to your nodes. You should always call this before you (may) free some nodes in RootNode. You have to call ChangedAll or Load at sometime after The InternalChangedAll parameter is for internal use. It is set to |
procedure NodeFreeRemovingFromAllParents(Node: TX3DNode); |
|
Call Node.FreeRemovingFromAllParents, making sure that changes to our VRML/X3D node graph are allowed. This makes sure we call BeforeNodesFree befor freeing, and ChangedAll afterwards. This avoids a common pitfall with relying on TShape or such existence between BeforeNodesFree and ChangedAll. BeforeNodesFree may free all our TShape instances, so if you want to free TX3DNode from our graph — you typically want to get this TX3DNode instance *before* calling BeforeNodesFree. Using this method to free the node ensures this. |
procedure RemoveShape(Shape: TShape); |
|
Remove the shape node from the scene. In case of VRML 1.0 / Inventor, when the Shape doesn't have a node, we remove the geometry node. |
procedure ChangedAll(const OnlyAdditions: Boolean = false); override; |
|
Notify scene that potentially everything changed in the VRML/X3D graph. This includes adding/removal of some nodes within RootNode graph and changing their fields' values. (Before freeing the nodes, remember to also call BeforeNodesFree earlier.) You usually never need to call this method explicitly. It's called by engine when necesssary. However, you need to call it yourself if you change the X3D graph directly through nodes'
Descendant implementors notes:
|
procedure DoGeometryChanged(const Change: TGeometryChange; LocalGeometryShape: TShape); virtual; |
|
Called when geometry changed. Does OnGeometryChanged, and does some other stuff necessary (mark some octrees for regenerating at next access). This is public only for overloading (and for internal TShape access). Do not call this yourself — TShape and TCastleSceneCore implementations know when and how to call this. |
procedure DoViewpointsChanged; |
|
Call OnViewpointsChanged, if assigned. |
procedure DoBoundViewpointVectorsChanged; |
|
Call OnBoundViewpointVectorsChanged, if assigned. |
procedure DoBoundNavigationInfoFieldsChanged; virtual; |
|
This item has no description. |
procedure ScheduleChangedAll(const OnlyAdditions: Boolean = false); |
|
Mechanism to schedule ChangedAll calls. Since these calls may be costly (traversing the hierarchy), and their results are often not immediately needed by TCastleSceneCore or TX3DNode hierarchy, it's sometimes not desirable to call them immediately when geometry changed / all changed. So you can use When you're within Begin/EndChangesSchedule, then |
procedure BeginChangesSchedule; |
|
This item has no description. |
procedure EndChangesSchedule; |
|
This item has no description. |
function Info( ATriangleVerticesCounts, ABoundingBox: boolean; AManifoldAndBorderEdges: boolean): String; deprecated 'do not use this, better to construct a summary string yourself'; |
|
Warning: this symbol is deprecated: do not use this, better to construct a summary string yourself Returns short information about the scene. This consists of a few lines, separated by newlines. Last line also ends with CastleUtils.NL. |
procedure EdgesCount(out ManifoldEdges, BorderEdges: Cardinal); |
|
Edges count in the scene, for information purposes. |
function InternalOctreeRendering: TShapeOctree; |
|
A spatial structure containing all visible shapes. Set PreciseCollisions to This is used internally for "frustum culling", it will be automatically used by TCastleScene rendering to speed it up. You should not need to use this directly. This octree will be automatically updated on dynamic scenes (when e.g. animation moves some shape by changing it's transformation). Note that when VRML/X3D scene contains Collision nodes, this octree contains the visible (not necessarily collidable) objects. |
function InternalOctreeDynamicCollisions: TShapeOctree; |
|
A spatial structure containing all collidable shapes (and then collidable triangles for a specifc shape). Set PreciseCollisions to This is actually a hierarchy of octrees: scene is partitioned first into Shapes (each instance of VRML/X3D geometry node), and then each Shape has an octree of triangles inside. Thanks to this, merely transforming some Shape means that only one item needs to be moved in the top-level shape tree. So this is the most important structure for collision detection on dynamic scenes. This octree is useful for all kinds of collision detection. This is automatically used by the XxxCollision methods in this class. You should not usually use this directly. Instead use TCastleViewport and then use Note that when VRML/X3D scene contains Collision nodes, this octree contains the collidable (not necessarily rendered) objects. This is kept up-to-date automatically when the scene changes. TODO: Temporarily, this is updated simply by rebuilding. |
function InternalOctreeCollisions: TBaseTrianglesOctree; |
|
Octree for collisions. This is equal to InternalOctreeDynamicCollisions now as we don't have other ways to check for collisions. Set PreciseCollisions to You should not usually use this directly. Instead use TCastleViewport and then use |
function UseInternalOctreeCollisions: boolean; |
|
This item has no description. |
function GetViewpoint( out ProjectionType: TProjectionType; out CamPos, CamDir, CamUp, GravityUp: TVector3; const ViewpointDescription: String = ''): TAbstractViewpointNode; |
|
Viewpoint defined in the 3D file (or some default camera settings if no viewpoint is found).
If ViewpointDescription = '', they return the first found viewpoint node. Otherwise, they look for X3DViewpointNode with description field mathing given string. If camera properties were found in some node, it returns this node. Otherwise it returns nil. This way you can optionally extract some additional info from used viewpoint node, or do something special if default values were used. Often you will just ignore result of this function — after all, the most important feature of this function is that you don't have to care about details of dealing with camera node. Returned CamDir and CamUp and GravityUp are always normalized — reasons the same as for TAbstractViewpointNode.GetView. |
function GetPerspectiveViewpoint( out CamPos, CamDir, CamUp, GravityUp: TVector3; const ViewpointDescription: String = ''): TAbstractViewpointNode; |
|
This item has no description. |
procedure FreeResources(Resources: TSceneFreeResources); virtual; |
|
Frees some scene resources, to conserve memory. See TSceneFreeResources documentation. |
procedure UnregisterScene(Node: TX3DNode); deprecated 'use Node.UnregisterScene'; |
|
Warning: this symbol is deprecated: use Node.UnregisterScene Recursively unset node's TX3DNode.Scene. |
function Press(const Event: TInputPressRelease): boolean; override; |
|
Scene processes X3D key sensor nodes here, https://castle-engine.io/x3d_implementation_keydevicesensor.php . Remember to set ListenPressRelease to process the key sensor nodes. |
function Release(const Event: TInputPressRelease): boolean; override; |
|
This item has no description. |
function PointingDevicePress(const Pick: TRayCollisionNode; const Distance: Single): Boolean; override; |
|
This item has no description. Showing description inherited from TCastleTransform.PointingDevicePress.
Pointing device (mouse or touch) events, you can override these to handle pointing device events. These methods are automatically called by the TCastleViewport. They are exposed here only to allow overriding them. Return
They receive Pick information (TRayCollisionNode) about what exactly is hit by the 3D ray corresponding to the current pointing device position. It contains the detailed information about the point, triangle and ray (all in local coordinate system of this TCastleTransform) that are indicated by the pointing device. TRayCollisionNode.Triangle is They also receive Distance to the collision point, in world coordinates. See TRayCollision.Distance. The Distance may be MaxSingle when it was not possible to determine. There is a concept of a TCastleTransform that is currently "capturing" the pointing device events. Once TCastleTransform handles After the "capturing" instance, every pointing device event (press, release or move) is send to the leaf in TCastleTransform hierarchy (usually a TCastleScene) that is under the mouse/touch position. If the event is not handled, it is passed to other objects under the mouse/touch position. The PointingDeviceMove event is also always passed to TCastleRootTransform.MainScene at the end (if it wasn't already the "capturing" transform, or under the mouse/touch position). This way TCastleRootTransform.MainScene is always informed about pointing device movement. These methods are called only if the object Exists. There's no need to check this condition inside the method implementation. |
function PointingDeviceRelease(const Pick: TRayCollisionNode; const Distance: Single; const CancelAction: Boolean): Boolean; override; |
|
This item has no description. |
function PointingDeviceMove(const Pick: TRayCollisionNode; const Distance: Single): boolean; override; |
|
Called when pointing device moves. This may generate the continuously-generated events like hitPoint_changed, also it updates PointingDeviceOverItem and PointingDeviceOverPoint, thus producing isOver and such events. For pointing device sensors to work, you must have collision structures set up by setting PreciseCollisions to |
function PointingDeviceSensors: TPointingDeviceSensorList; |
|
Pointing-device sensors over which the pointing device is. This is just a shortcut for PointingDeviceOverItemˆ.State.PointingDeviceSensors, returning |
procedure PointingDeviceClear; |
|
Clear any references to PTriangle passed previously in TRayCollisionNode argument to PointingDevicePress, PointingDeviceRelease, PointingDeviceMove. This is internally used in case some of past seen PTriangle may become invalid, so any memory about them should be cleared. This doesn't cause any X3D events (contrary to e.g. calling PointingDeviceMove with Pick.Triangle = This method clears any references to saved PTriangle and PointingDeviceActiveSensors. Note that this still calls DoPointingDeviceSensorsChange (making OnPointingDeviceSensorsChange event), if PointingDeviceActiveSensors / PointingDeviceSensors possibly changed. |
function LocalBoundingBox: TBox3D; override; |
|
This item has no description. Showing description inherited from TCastleTransform.LocalBoundingBox. Bounding box of this object, ignoring the transformations of this scene and parents.
|
procedure Update(const SecondsPassed: Single; var RemoveMe: TRemoveType); override; |
|
This item has no description. Showing description inherited from TCastleTransform.Update. Continuously occuring event, for various tasks. Executed only on instances that have Exists (no need to check this in overridden Update implementation). |
procedure SetTime(const NewValue: TFloatTime); |
|
Change current scene time, setting Time. It is crucial that you call this continuously to have some VRML/X3D time-dependent features working, like TimeSensor and MovieTexture. See Time for details what is affected by this. This is automatically taken care of if you added this scene to TCastleWindow.Controls or TCastleControl.Controls. Then our Update takes care of doing the job, according to TimePlaying and TimePlayingSpeed. This causes time to be passed to appropriate time-dependent nodes, events will be called etc.
Following X3D specification, time should only grow. So NewValue should be > Time (or TimeIncrease > 0). Otherwise we ignore this call. For resetting the time (when you don't necessarily want to grow Time) see ResetTime. If a change of Time will produce some visible change in the VRML/X3D model (for example, MovieTexture will change, or TimeSensor change will be routed by interpolator to coordinates of some visible node) it will be reported by usual method, that is VisibleChangeHere. |
procedure IncreaseTime(const TimeIncrease: TFloatTime); |
|
This item has no description. |
function Time: TFloatTime; override; |
|
The time within this scene, in seconds. Increasing this "drives" the animations (by increasing time of time-dependent nodes like X3D TimeSensor, which in turn drive the rest of the animation). You can use SetTime or IncreaseTime to move time forward manually. But usually there's no need for it: our Update method takes care of it automatically, you only need to place the scene inside TCastleViewport.Items. You can start/stop time progress by TimePlaying and scale it by TimePlayingSpeed. These properties affect how the time is updated by the Update method (so if you use SetTime or IncreaseTime methods, you're working around these properties). Default time value is 0.0 (zero). However it will be reset at load to a current time (seconds since Unix epoch — that's what X3D standard says to use, although you can change it by KambiNavigationInfo.timeOriginAtLoad, see https://castle-engine.io/x3d_implementation_navigation_extensions.php#section_ext_time_origin_at_load ). You can perform this "time reset" yourself by ResetTimeAtLoad or ResetTime. |
function NextEventTime: TX3DTime; override; |
|
Time that should be used for next event. You usually don't need to call this directly, this is automatically used by TX3DEvent.Send when you don't specify explicit time. |
procedure ResetTime(const NewValue: TFloatTime); |
|
Set Time to arbitrary value. You should only use this when you loaded new VRML/X3D model. Unlike SetTime and IncreaseTime, this doesn't require that Time grows. It still does some time-dependent events work, although some time-dependent nodes may be just unconditionally reset by this to starting value (as they keep local time, and so require TimeIncrease notion, without it we can only reset them). |
procedure ResetTimeAtLoad; |
|
Set Time to suitable initial value after loading a world. This honours VRML/X3D specification about VRML/X3D time origin, and our extension [https://castle-engine.io/x3d_extensions.php#section_ext_time_origin_at_load]. |
function GetBackgroundStack: TX3DBindableStackBasic; override; |
|
This item has no description. |
function GetFogStack: TX3DBindableStackBasic; override; |
|
This item has no description. |
function GetNavigationInfoStack: TX3DBindableStackBasic; override; |
|
This item has no description. |
function GetViewpointStack: TX3DBindableStackBasic; override; |
|
This item has no description. |
procedure RegisterCompiledScript(const HandlerName: String; Handler: TCompiledScriptHandler); |
|
Register compiled script handler, for VRML/X3D Script node with "compiled:" protocol. See [https://castle-engine.io/x3d_extensions.php#section_ext_script_compiled]. |
procedure InternalUpdateNavigation( const Navigation: TCastleNavigation); |
|
Update TCastleNavigation properties based on currently bound TNavigationInfoNode. Bound TNavigationInfoNode is taken from NavigationInfoStack.Top. If no such node is bound (NavigationInfoStack.Top is Note that, since some fields are only in some descendants (e.g. MoveSpeed is only at TCastleWalkNavigation) then some TNavigationInfoNode settings are just not transferred to all Navigation instances like TCastleExamineNavigation |
procedure CameraTransition(const Camera: TCastleCamera; const APosition, ADirection, AUp: TVector3); overload; deprecated 'use Camera.AnimateTo(APosition, ADirection, AUp)'; |
|
Warning: this symbol is deprecated: use Camera.AnimateTo(APosition, ADirection, AUp) Make Camera go to the view given by (world coordinates) APosition, ADirection, AUp. Honours current NavigationInfo.transitionType and transitionTime. If transitionType indicates instanteneous transition, then jumps by simple Will generate NavigationInfo.transitionComplete when transition ends. |
procedure CameraTransition(const Camera: TCastleCamera; const APosition, ADirection, AUp, GravityUp: TVector3); overload; deprecated 'use Camera.AnimateTo(APosition, ADirection, AUp)'; |
|
Warning: this symbol is deprecated: use Camera.AnimateTo(APosition, ADirection, AUp) This item has no description. |
procedure CameraTransition(const Navigation: TCastleNavigation; const APosition, ADirection, AUp: TVector3); overload; deprecated 'use Camera.AnimateTo(APosition, ADirection, AUp)'; |
|
Warning: this symbol is deprecated: use Camera.AnimateTo(APosition, ADirection, AUp) This item has no description. |
procedure CameraTransition(const Navigation: TCastleNavigation; const APosition, ADirection, AUp, GravityUp: TVector3); overload; deprecated 'use Camera.AnimateTo(APosition, ADirection, AUp)'; |
|
Warning: this symbol is deprecated: use Camera.AnimateTo(APosition, ADirection, AUp) This item has no description. |
function CustomHeadlight: TAbstractLightNode; |
|
Light node that should be used for headlight, or This never returns |
procedure PrepareResources(const Options: TPrepareResourcesOptions; const Params: TPrepareParams); override; |
|
This item has no description. Showing description inherited from TCastleTransform.PrepareResources. Prepare resources, making various methods (like rendering and such) to execute fast. It is usually simpler to call TCastleViewport.PrepareResources then this method. Calling It is best to call this when the rendering context is initailized, e.g. at Application.OnInitialize or later. Calling this method before the rendering context is initialized (e.g. from initializaton section of some unit) will have to skip some preparations, thus reducing the effectiveness of this method. But it is allowed to call this at any time, regardless of the context being initialized, just like e.g. TCastleContainer.LoadSettings (which may call this, to warmup cache). This makes sure that appropriate methods execute as fast as possible. It's never required to call this method — everything will be prepared "as needed" anyway. But if you allow everything to be prepared "as needed", then e.g. the first Render call may take a long time because it may have to prepare resources that will be reused in next Render calls. This may make your program seem slow at the beginning (when rendering resources are being prepared, so at the first frame, or a couple of first animation frames). To avoid this, call this method, showing the user something like "now we're preparing the resources — please wait".
TODO: It is not possible to call this now without TPrepareParams, and to get params you need to access deprecated TCastleViewport.PrepareParams. We advise to call TCastleViewport.PrepareResources instead. We'd like to get rid of TPrepareParams eventually. |
function Caption: String; |
|
Nice scene caption. Uses the "title" of WorldInfo node inside the VRML/X3D scene. If there is no WorldInfo node (or it has empty title) then result is based on loaded URL. |
function Node(const NodeClass: TX3DNodeClass; const NodeName: String; const Options: TFindNodeOptions = []): TX3DNode; overload; |
|
Find a named X3D node in the current node graph. By default it searches both active and inactive graph parts. Add fnOnlyActive to search only in active parts. It searches only within nodes of given type (NodeClass). Specifying NodeClass helps to make search unambiguous (as name clashes are possible, some authoring tools may write models with duplicate names for materials, meshes etc. and both glTF and X3D allow it). This allows to safely write code like: MyMaterial := Scene.Node(TNodePhysicalMaterial, 'MyMaterial') as TNodePhysicalMaterial;
TODO: An even better version, "MyMaterial := Scene.Node<TNodePhysicalMaterial>('MyMaterial')", may be available in the future, if FPC support for generic methods will improve. Define GENERIC_METHODS to try it out now, but heed the warnings in castleconf.inc . Exceptions raised
|
function Node(const NodeName: String): TX3DNode; overload; |
|
This item has no description. |
function Field(const NodeName, FieldName: String): TX3DField; overload; |
|
Find a named field within an X3D node in the current node graph. Like Node, this searches all nodes (in active or not) graph parts. Exceptions raised
|
function Event(const NodeName, EventName: String): TX3DEvent; overload; |
|
Find a named event within an X3D node in the current node graph. Like Node, this searches all nodes (in active or not) graph parts. Exceptions raised
|
function HasAnimation(const AnimationName: String): boolean; |
|
Does named animation with given name exist. See also
|
function AnimationTimeSensor(const AnimationName: String): TTimeSensorNode; overload; |
|
TimeSensor of this animation. |
function AnimationTimeSensor(const Index: Integer): TTimeSensorNode; overload; |
|
TimeSensor of this animation, by animation index (index on AnimationsList). |
function ForceAnimationPose(const AnimationName: String; const TimeInAnimation: TFloatTime; const Loop: boolean; const Forward: boolean = true): boolean; overload; |
|
Forcefully, immediately, set pose from given animation, with given time in animation. This avoids the normal passage of time in X3D scenes, it ignores the ProcessEvents and AnimateOnlyWhenVisible properties, it ignores the current animation set by PlayAnimation, and forces the current time on TimeSensors by TTimeSensorNode.FakeTime. |
function PlayAnimation(const Parameters: TPlayAnimationParameters): boolean; overload; |
|
Play an animation specified by name. You can specify the animation name, whether it should loop, and whether to play it forward or backward using parameters to this method. Or you can specify even more parameters using TPlayAnimationParameters instance. TPlayAnimationParameters can additionally specify a stop notification, initial time and more. It is OK to create a short-lived TPlayAnimationParameters instance and destroy it right after calling this method. This method doesn't store the TPlayAnimationParameters instance reference. To get the list of available animations, see AnimationsList. This is one of the simplest way to play animations using Castle Game Engine. Alternative (that calls PlayAnimation under the hood) is to set AutoAnimation. See https://castle-engine.io/viewport_3d#_play_animation . Playing an already-playing animation is guaranteed to restart it from the beginning (more precisely: from TPlayAnimationParameters.InitialTime, if you pass TPlayAnimationParameters). If the given animation name exists, then we stop previously playing animation (if any), calling it's stop notification (see TPlayAnimationParameters.StopNotification), start playing the new animation, and return The change from previous to new animation can be smooth (using animation cross-fading) if you use TPlayAnimationParameters with TPlayAnimationParameters.TransitionDuration or if you set DefaultAnimationTransition to something non-zero. This automatically turns on ProcessEvents, if it wasn't turned on already. Processing events is necessary for playing animations. More details about how this works:
|
function PlayAnimation(const AnimationName: String; const Loop: boolean; const Forward: boolean = true): boolean; overload; |
|
This item has no description. |
procedure ForceInitialAnimationPose; |
|
Force the model to look like the initial animation frame now. Use this after calling PlayAnimation. Calling this is simply ignored if no PlayAnimation was called earlier, of if the model already looks following the animation requested by PlayAnimation. If you don't use this method, there may be a 1-frame delay between calling PlayAnimation and actually updating the rendered scene look. If during that time a rendering will happen, the user will see a scene in previous pose (not in the first pose of animation you requested by PlayAnimation). To avoid this, simply call this method right after PlayAnimation. This sets first animation frame, unless you used TPlayAnimationParameters.InitialTime <> 0. |
function AnimationDuration(const AnimationName: String): TFloatTime; |
|
Duration, in seconds, of the named animation (named animations are detected by AnimationsList method). For a looping animation, this is the duration of a single cycle. 0 if not found. |
procedure StopAnimation(const DisableStopNotification: Boolean = false); |
|
Stop the CurrentAnimation, started by last PlayAnimation call. Note that this leaves the model in a state in the middle of the last animation. You can use ResetAnimationState to reset the state afterwards. Calling ForceInitialAnimationPose also will do it. Note that it is not necessary to stop the previous animation before starting a new one (by PlayAnimation). PlayAnimation will automatically stop the previous animation. Moreover, PlayAnimation may do animation blending (cross-fade) between old and new animation (if you use TPlayAnimationParameters.TransitionDuration), which only works if you did not call When animation is stopped (by this or any other means), by default it's TPlayAnimationParameters.StopNotification is called. You can use DisableStopNotification to avoid it, which should be used only in exceptional situations. |
procedure ResetAnimationState(const IgnoreAffectedBy: TTimeSensorNode = nil); |
|
Reset all the fields affected by animations. See TimeSensor.detectAffectedFields documentation (https://castle-engine.io/x3d_implementation_time_extensions.php#section_detect_affected_fields) for details how these fields are detected, and when this is useful. By default this is enabled, for all TimeSensor nodes. If IgnoreAffectedBy <> nil, the fields affected by the given TimeSensor may not be reset. This is an optimization useful in case this TimeSensor will modify the scene very soon, so resetting its affected fields is a waste of time. Do not depend on 100% that the fields affected by given TimeSensor are left untouched (in the current implementation, this field is ignored). |
procedure FontChanged; |
|
Force recalculating the text shapes when font changed. For now, we don't detect font changes (e.g. when TFontStyleNode.CustomFont changed) automatically. This calls TTextNode.FontChanged and TAsciiTextNode_1.FontChanged on all appropriate nodes. |
function Clone(const AOwner: TComponent): TCastleSceneCore; |
|
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 attributes, like ProcessEvents or TCastleScene.RenderOptions. It only copies the scene graph (RootNode) and also sets target URL based on source URL (for logging purposes, e.g. TCastleProfilerTime use this URL to report loading and preparation times). |
procedure InternalIncShapesHash; |
|
This item has no description. |
procedure ReloadUrl; |
|
Load again the model from current URL. This makes sense to be used when underlying file on disk changed, and you want to reload it. TODO: If the file is cached using Cache, then it will not reload the version in cache, so effectively it will not load new version from disk. This will be fixed at some point. |
Properties
property VisibilitySensors: TVisibilitySensors read FVisibilitySensors; |
|
This item has no description. |
property Shapes: TShapeTree read FShapes; |
|
Tree of shapes in the scene, acting as a simplfied mirror of the X3D node graph. Contents of this tree are read-only from outside. |
property OnGeometryChanged: TSceneGeometryChanged
read FOnGeometryChanged write FOnGeometryChanged; |
|
Notification when geometry changed. "Geometry changed" means that the positions of triangles changed. This is not send when merely things like material changed. It is not guaranteed that octrees are already recalculated when this is called. (They may be recalculated only on-demand, that is when you actually access them.) However, it is guaranteed that shape's transformation (like TShape.State.Transform) are already updated. |
property OnViewpointsChanged: TNotifyEvent
read FOnViewpointsChanged write FOnViewpointsChanged; |
|
Notification when the list of viewpoints in the scene possibly changed. Note that this doesn't necessarily mean that the current, bound viewpoint changed (although it could). If you only want to get notified when currently bound viewpoint changes, then what you seek is rather ViewpointStack.OnBoundChanged. |
property OnBoundViewpointVectorsChanged: TNotifyEvent
read FOnBoundViewpointVectorsChanged write FOnBoundViewpointVectorsChanged; |
|
Notification when the currently bound viewpoint's vectors (position/orientation and such) changed. More precisely, this is called whenever values generated by ViewpointStack.Top.GetView changed. It cannot be called when ViewpointStack.Top = |
property OnBoundNavigationInfoFieldsChanged: TNotifyEvent
read FOnBoundNavigationInfoFieldsChanged write FOnBoundNavigationInfoFieldsChanged; |
|
This item has no description. |
property RootNode: TX3DRootNode read FRootNode write SetRootNode; |
|
Actual VRML/X3D graph defining this scene. It is allowed to change contents of It is also allowed to change the value of |
property OwnsRootNode: boolean read FOwnsRootNode write FOwnsRootNode default true; deprecated 'set OwnsRootNode only at loading, do not depend on this property'; |
|
Warning: this symbol is deprecated: set OwnsRootNode only at loading, do not depend on this property
If |
property PointingDeviceOverItem: PTriangle
read FPointingDeviceOverItem write FPointingDeviceOverItem; |
|
Current item over which the pointing device is. |
property PointingDeviceOverPoint: TVector3
read FPointingDeviceOverPoint write FPointingDeviceOverPoint; |
|
Current 3D point under the pointing device. Only meaningful when PointingDeviceOverItem <> nil, otherwise undefined. |
property PointingDeviceActiveSensors: TX3DNodeList
read FPointingDeviceActiveSensors; |
|
Currently active pointing-device sensors. Only TAbstractPointingDeviceSensorNode instances. Always empty when PointingDeviceActive = Note that sensor specified here doesn't have to be one of the sensors of PointingDeviceOverItem. When some sensor is activated, it grabs further events until it's deactivated (e.g. when you set PointingDeviceActive := false, which means that user released mouse button). This means that when user moves the mouse while given sensors are active, he can move mouse over other items, even the ones where the active sensors aren't listed — but the sensors remain active. |
property PointingDeviceActive: boolean
read FPointingDeviceActive default false; |
|
Is pointing device currently active (for example, mouse button is pressed down). |
property OnPointingDeviceSensorsChange: TNotifyEvent
read FOnPointingDeviceSensorsChange
write FOnPointingDeviceSensorsChange; |
|
Event called PointingDeviceSensors or PointingDeviceActiveSensors lists (possibly) changed. |
property TimeAtLoad: TFloatTime read FTimeAtLoad; |
|
Initial world time, set by the last ResetTimeAtLoad call. |
property BackgroundStack: TBackgroundStack read FBackgroundStack; |
|
Stack of background nodes. The node at the top is the current background. All nodes on this stack must descend from TAbstractBackgroundNode class. |
property FogStack: TFogStack read FFogStack; |
|
Stack of fog nodes. The node at the top is the current fog. All nodes on this stack must descend from TFogNode class. |
property NavigationInfoStack: TNavigationInfoStack read FNavigationInfoStack; |
|
Stack of NavigatinInfo nodes. The node at the top is the current NavigatinInfo. All nodes on this stack must descend from TNavigationInfoNode class. |
property ViewpointStack: TViewpointStack read FViewpointStack; |
|
Stack of viewpoint nodes. The node at the top is the current Viewpoint. All nodes on this stack must descend from TAbstractViewpointNode. Note that this includes also VRML 1.0/Inventor nodes. |
property CompiledScriptHandlers: TCompiledScriptHandlerInfoList
read FCompiledScriptHandlers; |
|
List of handlers for VRML/X3D Script node with "compiled:" protocol. This is read-only, change this only by RegisterCompiledScript. |
property HeadlightOn: boolean
read FHeadlightOn write SetHeadlightOn; |
|
Should we use headlight for this scene. Controls if containing TCastleViewport will use a headlight, if this is the main scene. When you load a new model, this is always updated based on this model's NavigationInfo.headlight. (If no NavigationInfo node, then default is to use the headlight.) When you bind a new NavigationInfo node, this is also updated to follow NavigationInfo.headlight. You can change the value of this property. If we have a NavigationInfo node, then NavigationInfo.headlight field will be always updated to correspond to this value. (It will be even updated using events mechanism if ProcessEvents, so scripts inside the VRML/X3D "know" when you turn on/off the headlight and may react to it, e.g. spawn a zombie monster when you turn on the flashlight.) |
property OnHeadlightOnChanged: TNotifyEvent
read FOnHeadlightOnChanged write FOnHeadlightOnChanged; |
|
This item has no description. |
property InternalGlobalLights: TLightInstancesList read FGlobalLights; |
|
Global lights of this scene. Read-only. Useful to shine these lights on other scenes, if TCastleScene.CastGlobalLights. |
property AnimationsList: TStrings read FAnimationsList; |
|
List the names of available animations in current scene. Animations are detected looking for TimeSensor nodes. See https://castle-engine.io/x3d_implementation_interpolation.php for an overview how nodes are used to create animations. Note that if you set AnimationPrefix property, we additionally filter TimeSensor nodes to show only the names starting with given prefix. In this case, not all TTimeSensorNode are reflected in this list. You can get the corresponding TTimeSensorNode by AnimationTimeSensor. Note that the same TTimeSensorNode may occur multiple times on this list, in case X3D IMPORT mechanism was used to rename the imported animation. The resulting TStringList instance is owned by this object, do not free it. Note that the list of animations may change if you rebuild the underlying X3D nodes graph, for example if you start to delete / add some TimeSensor nodes. |
property AnimationPrefix: String
read FAnimationPrefix write FAnimationPrefix; deprecated 'this property did not prove to be of much use; report if you need it, otherwise it may be removed one day'; |
|
Warning: this symbol is deprecated: this property did not prove to be of much use; report if you need it, otherwise it may be removed one day The prefix of an X3D TimeSensor node name to treat it as a "named animation". Named animation are used by methods AnimationsList, PlayAnimation, and AnimationDuration, HasAnimation. By default this is empty, which means we consider all TimeSensor nodes a "named animation". You can set this to something like 'Anim_' or 'Animation_' or whatever your 3D export software produces. Only the TimeSensor nodes with names starting with this prefix will be available on AnimationsList, and this prefix will be stripped from the names you use with methods like PlayAnimation. |
property CurrentAnimation: TTimeSensorNode read FCurrentAnimation; |
|
Currently played animation by PlayAnimation, or Note that, in a general case, you can have multiple active animations (multiple TimeSensor X3D nodes may be active) at the same time. Calling TTimeSensorNode.Start directly on multiple nodes is one way to make it happen. This property simply describes the animation controlled by the last PlayAnimation method. Note that the animation may be started by PlayAnimation with a 1-frame delay, but this property hides it from you, it is changed immediately by the PlayAnimation call. |
property FileName: String read FUrl write SetUrl; deprecated; |
|
Warning: this symbol is deprecated. Deprecated name for Url. |
property InternalShapesHash: TShapesHash read FShapesHash; |
|
This item has no description. |
property DefaultAnimationTransition: Single
read FDefaultAnimationTransition write FDefaultAnimationTransition default 0.0; |
|
When using PlayAnimation without TPlayAnimationParameters, this value is used as the duration (in seconds) of animation cross-fade (blending of animations). Zero (default value) disables the smooth transition, animations will change without any transition by default. This default transition is only used if some previous animation was playing. Otherwise, it would be applied even when starting the initial animation. |
property TimePlaying: boolean read FTimePlaying write FTimePlaying default true; |
|
When |
property TimePlayingSpeed: Single read FTimePlayingSpeed write FTimePlayingSpeed default 1.0; |
|
Controls the time speed (if TimePlaying is |
property PreciseCollisions: Boolean read FPreciseCollisions write SetPreciseCollisions default false; |
|
Resolve collisions precisely with the scene triangles. When this is More details: Setting this creates two spatial structures (octrees):
|
property ProcessEvents: boolean
read FProcessEvents write SetProcessEvents default false; |
|
Should the event mechanism (a basic of animations and interactions) work. If In other words, this makes the scene fully animated and interacting with the user. If |
property Url: String read FUrl write SetUrl; |
|
Currently loaded scene URL. Change this property to load a scene from the given URL. We support many 3D and 2D scene formats, like X3D and glTF, see https://castle-engine.io/creating_data_model_formats.php . Setting this property works just like using the Load method with a new URL. In fact, using directly the Load method will also change this URL property. The only difference between Pass Url = '' to load an empty scene, this sets RootNode to |
property ShadowMaps: boolean read FShadowMaps write SetShadowMaps default true; |
|
At loading, process the scene to support shadow maps. This happens at the Load method call, and it makes "receiveShadows" field automatically handled. Note that this is not the only way to make shadow maps. VRML/X3D author can always make shadow maps by using lower-level nodes, see [https://castle-engine.io/x3d_extensions.php#section_ext_shadow_maps]. When using these lower-level nodes, this property does not matter This property (and related ones like ShadowMapsDefaultSize) is relevant only for handling shadows by the "receiveShadows" field. |
property ShadowMapsDefaultSize: Cardinal
read FShadowMapsDefaultSize write SetShadowMapsDefaultSize
default DefaultShadowMapsDefaultSize; |
|
Default shadow map texture size. Affects how shadow maps are handled for the "receiveShadows" field. This is taken into account at the scene Load time, and only if ShadowMaps is VRML/X3D author can always override this by placing a |
property InitialViewpointIndex: Cardinal
read FInitialViewpointIndex write FInitialViewpointIndex default 0; |
|
When loading new model, use this viewpoint index to initialize camera. VRML/X3D specification says to use the first (index = 0) viewpoint, you can change this property to bind 2nd, 3rd and so on viewpoints. This is applied only at loading (actually, at ChangedAll). If you later want to bind another viewpoint, just send set_bind := true to it. |
property InitialViewpointName: String
read FInitialViewpointName write FInitialViewpointName; |
|
When loading new model and looking for initial viewpoint, consider only viewpoints with this node name. Relevant only if non-empty. This may cooperate with InitialViewpointIndex: InitialViewpointIndex specifies the index of viewpoint node that satisfies also
|
property AnimateOnlyWhenVisible: boolean
read FAnimateOnlyWhenVisible write FAnimateOnlyWhenVisible default false; |
|
When See examples/animations/optimize_animations_test for a demo of this. |
property AnimateSkipTicks: Cardinal read FAnimateSkipTicks write SetAnimateSkipTicks
default 0; |
|
Non-zero values optimize the animation processing, by not updating the animation every frame. After updating the animation in one Update call, the next This is an effective optimization if the scene is usually not large on the screen.
See examples/animations/optimize_animations_test for a demo of this. |
property AutoAnimation: String
read FAutoAnimation write SetAutoAnimation; |
|
If Note: Using AutoAnimation will under the hood call methods like PlayAnimation, StopAnimation and update CurrentAnimation. The reverse is not true: calling PlayAnimation doesn't change AutoAnimation. So you can think of AutoAnimation as "an initial animation, activated each time we load the model, even if later we can change it to something else using PlayAnimation". |
property AutoAnimationLoop: Boolean
read FAutoAnimationLoop write SetAutoAnimationLoop default true; deprecated 'in future engine versions, AutoAnimationLoop may behave as always = true, and AutoAnimation will be renamed to just Animation and changing it will always cause a looping animation. Use PlayAnimation(''my_anim'',false) from code to play animation without looping.'; |
|
Warning: this symbol is deprecated: in future engine versions, AutoAnimationLoop may behave as always = true, and AutoAnimation will be renamed to just Animation and changing it will always cause a looping animation. Use PlayAnimation('my_anim',false) from code to play animation without looping. Does the animation indicated by AutoAnimation loops. |
property ExposeTransforms: TStrings read FExposeTransforms write SetExposeTransforms; |
|
Transformation nodes inside the model that are synchronized with automatically-created children TCastleTransform. This allows to expose transformation nodes from glTF, X3D and other model formats as TCastleTransform. These transformation nodes include animated bones from skeletons (armatures). Such "exposed transformation" results in a creation of TCastleTransform child, with the same name and synchronized transformation (translation, rotation, scale). This allows to expose e.g. "hand that may hold a weapon", or "slot of a vehicle where to attach a camera", as TCastleTransform. And this allows, in turn, to attach various things to (possibly animated) transformations, e.g. attach model of a weapon to a hand, or attach TCastleCamera to some bone. The attached things will be automatically animated when the scene skeleton animates. Setting this property merely copies the contents using TStrings.Assign, as is usual for published TStrings properties. In CGE editor, there's a nice GUI editor to pick the transfomation nodes, click on "..." at this property. Note: the owner of auto-created children is equal to this scene's Owner. This is most natural when you edit this in CGE editor, or load using TransformLoad. See the engine example in: examples/animations/expose_transformations_to_animate_children/ . See also
|
property ExposeTransformsPrefix: String read FExposeTransformsPrefix write SetExposeTransformsPrefix; |
|
Name prefix for all children created by ExposeTransforms. Useful to keep names unique in the scene. |
property Cache: Boolean read FCache write FCache default false; |
|
Use cache to load given scene. This makes sense when you have multiple TCastleScene instances using the same URL, loading them will be much faster if they share the cache, so set If you have only one scene using given URL, using cache is not necessary and in fact it will result in a bit of wasted memory. So better to keep |
Generated by PasDoc 0.16.0-snapshot.