Class TRayCollision
Unit
Declaration
type TRayCollision = class(specialize TStructList<TRayCollisionNode>)
Description
Represents a ray collision with TCastleTransform (TCastleTransform that may have parents).
We advise to access the useful information using only the Transform or Info methods or read Distance field.
Everything else is somewhat internal information and things get complicated if you try to make sense of it. It's a TODO: to maybe deprecate this structure in favor of something simpler.
The full description is that this is a list, from the innermost TCastleTransform that was hit by the ray, to the root of the TCastleTransform tree. The First item is the collision information with the final TCastleTransform. The rest of items are parent, grandparent etc. of this TCastleTransform object (so it is a path within TCastleViewport.Items hierarchy tree).
But be aware that CGE uses some internal TCastleTransform instances. E.g. TCastleBox, TCastleTiledMap have internal TCastleScene instances. These internal components are marked with csTransient flag in ComponentState.
We, again, advise to not iterate over this list or access e.g. first item directly. Use only Transform or Info methods or read Distance field! Things are simple then.
This is never an empty list when returned by RayCollision.
Source: transform/castletransform_initial_types.inc (line 153).
Hierarchy
- TObject
- TList
- TStructList
- TRayCollision
Overview
Nested Types
| Public | PtrT = ˆT; |
| Public | PTypeList = ˆTTypeList; |
| Public | TTypeList = array [0 .. MaxInt div SizeOf(T) - 1] of T; |
Fields
| Public | Distance: Single; |
Methods
| Public | function List: PTypeList; deprecated 'use L, like MyList.L[123] instead of MyList.Listˆ[123]'; |
| Public | function L: PtrT; |
| Public | function Add: PtrT; overload; |
| Public | function Ptr(const I: TListSize): PtrT; |
| Public | procedure Assign(const Source: TStructList ); overload; |
| Public | procedure Assign(const A: array of T); overload; |
| Public | function ItemSize: TListSize; |
| Public | procedure AddSubRange(const Source: TStructList ; const Index, AddCount: TListSize); |
| Public | procedure AssignLerpRange(const Fraction: Single; const V1, V2: TStructList ; const Index1, Index2, ACount: TListSize); virtual; |
| Public | procedure AssignLerp(const Fraction: Single; const V1, V2: TStructList ); |
| Public | function PerfectlyEquals( const SecondValue: TStructList): Boolean; |
| Public | procedure AddArray(const A: array of T); deprecated 'use AddRange'; |
| Public | procedure AddList(const Source: TStructList ); deprecated 'use AddRange'; |
| Public | procedure AssignArray(const A: array of T); deprecated 'use Assign'; |
| Public | function IndexOfItem(const Item: TCastleTransform): Integer; overload; |
| Public | function IndexOfItem(const ItemClass: TCastleTransformClass): Integer; overload; |
| Public | function Transform: TCastleTransform; |
| Public | function Info(out HitInfo: TRayCollisionNode): Boolean; |
Description
Nested Types
| Public | PtrT = ˆT; |
|
This item is declared in ancestor TStructList. This item has no description. | |
| Public | PTypeList = ˆTTypeList; |
|
This item is declared in ancestor TStructList. This item has no description. | |
| Public | TTypeList = array [0 .. MaxInt div SizeOf(T) - 1] of T; |
|
This item is declared in ancestor TStructList. TODO: Can we calculate better size on Delphi? Now we just assume that T has max size 16 * 16. This declaration will fail if you try to use TStructList with larger T. Note: we cannot declare list size too small, or using it may fail with range check error (e.g. Delphi, in IndexedPolygons_TrianglesCount, testcase: build_3d_object_by_code_2_tunnel. | |
Fields
| Public | Distance: Single; |
|
Distance, in world coordinate system, from the current camera to the picked point. The suggested usage is to decide if player is close enough to reach the 3D object — for example, you may not want to allow player to open a door by clicking on it from a far distance. If the ray hit empty space, the distance is MaxSingle. Such case may occur because, once TCastleTransform handles TCastleTransform.PointingDevicePress, we make sure to inform it about PointingDeviceMove and PointingDeviceRelease, regardless if ray still hits this TCastleTransform instance. Source: transform/castletransform_initial_types.inc (line 165). | |
Methods
| Public | function List: PTypeList; deprecated 'use L, like MyList.L[123] instead of MyList.Listˆ[123]'; |
|
This item is declared in ancestor TStructList. Warning: this symbol is deprecated: use L, like MyList.L[123] instead of MyList.Listˆ[123] Access the list contents through a pointer to an array of items. This is exactly the same pointer as L, but the type is different: List points to an array of items, while L points to a single item. Using L is preferred over this List, because L avoids "fake infinite list" type TTypeList, that in particular on Delphi may have too small size (and cause range check errors). See the L description for a more detailed explanation and example. See also
| |
| Public | function L: PtrT; |
|
This item is declared in ancestor TStructList. Access the list contents through a pointer, to get or set them efficiently. Use this to directly access a list value, like this: MyIntList.L[I] := 123; // Equivalent but less efficient to syntax without L: // MyIntList[I] := 123; MyIntList.L[I] := MyIntList.L[I] + 123; // Equivalent but less efficient to syntax without L: // MyIntList[I] := MyIntList[I] + 123; MyRecordList.L[I].MyField := 123; // Never use syntax without L (see below for reasons): // MyRecordList[I].MyField := 123; //< never do this!
The above examples of L work only in FPC ObjFpc mode or in Delphi with pointermath "on" (see https://docwiki.embarcadero.com/RADStudio/Sydney/en/Pointer_Math_(Delphi) ). These are CGE default settings when being compiled with FPC or Delphi, so you can depend on them at least in CGE implementation. Note that Delphi code using this doesn't need to be compiled with pointermath "on", it is enough that this unit is compiled with pointermath "on" and then one can use math on PtrT. This is in particular useful if you have a list of records and you would like to set their fields. E.g. this is incorrect (and should not even compile if MyField is really a simple field): type TMyRecord = record MyField: Integer; end; TMyRecordList = specialize TGenericStructList<TMyRecord>; var MyList: TMyRecordList; begin // ... MyList[I].MyField := 123;
It will not work OK because you would modify only a temporary record returned by the In contrast, this will work OK:
MyList.L[I].MyField := 123;
Using L is preferred over this List, because it avoids "fake infinite list" type TTypeList, that in particular on Delphi may have too small size. See also
| |
| Public | function Add: PtrT; overload; |
|
This item is declared in ancestor TStructList. Increase Count and return pointer to new item. Comfortable and efficient way to add a new item that you want to immediately initialize. | |
| Public | function Ptr(const I: TListSize): PtrT; |
|
This item is declared in ancestor TStructList. Pointer to ith item. | |
| Public | procedure Assign(const Source: TStructList ); overload; |
|
This item is declared in ancestor TStructList. This item has no description. | |
| Public | procedure Assign(const A: array of T); overload; |
|
This item is declared in ancestor TStructList. This item has no description. | |
| Public | function ItemSize: TListSize; |
|
This item is declared in ancestor TStructList. This item has no description. | |
| Public | procedure AddSubRange(const Source: TStructList ; const Index, AddCount: TListSize); |
|
This item is declared in ancestor TStructList. Add a subrange of another list here. This method may ignore the OnNotify mechanism, for the sake of fast execution. | |
| Public | procedure AssignLerpRange(const Fraction: Single; const V1, V2: TStructList ; const Index1, Index2, ACount: TListSize); virtual; |
|
This item is declared in ancestor TStructList. Assign here a linear interpolation of two other arrays. We take ACount items, from V1[Index1 ... Index1 + ACount - 1] and V2[Index2 ... Index2 + ACount - 1], and interpolate between them. It's Ok for both V1 and V2 to be the same objects. But their ranges should not overlap, for future optimizations. Exceptions raised
| |
| Public | procedure AssignLerp(const Fraction: Single; const V1, V2: TStructList ); |
|
This item is declared in ancestor TStructList. Assign linear interpolation between two other arrays. Exceptions raised
| |
| Public | function PerfectlyEquals( const SecondValue: TStructList): Boolean; |
|
This item is declared in ancestor TStructList. Does the SecondValue have equal type, length and content. The values are compared perfectly, without any tolerance for difference. | |
| Public | procedure AddArray(const A: array of T); deprecated 'use AddRange'; |
|
This item is declared in ancestor TStructList. Warning: this symbol is deprecated: use AddRange This item has no description. | |
| Public | procedure AddList(const Source: TStructList ); deprecated 'use AddRange'; |
|
This item is declared in ancestor TStructList. Warning: this symbol is deprecated: use AddRange This item has no description. | |
| Public | procedure AssignArray(const A: array of T); deprecated 'use Assign'; |
|
This item is declared in ancestor TStructList. Warning: this symbol is deprecated: use Assign This item has no description. | |
| Public | function IndexOfItem(const Item: TCastleTransform): Integer; overload; |
|
Index of node with given Item, -1 if none. Source: transform/castletransform_initial_types.inc (line 168). | |
| Public | function IndexOfItem(const ItemClass: TCastleTransformClass): Integer; overload; |
|
Index of node with given ItemClass, -1 if none. Source: transform/castletransform_initial_types.inc (line 171). | |
| Public | function Transform: TCastleTransform; |
|
TCastleTransform that was hit by given ray. To be precise, this returns the inner-most TCastleTransform in the TCastleTransform tree, except it doesn't return internal TCastleTransform (that has csTransient flag in ComponentState). This way it doesn't return internal components, like internal TCastleScene inside TCastleBox or TCastleTiledMap. Returns Source: transform/castletransform_initial_types.inc (line 183). | |
| Public | function Info(out HitInfo: TRayCollisionNode): Boolean; |
|
Returns information about what was hit by given ray. To be precise, this returns the first TRayCollisionNode on the list except it doesn't return TRayCollisionNode that relates to internal TCastleTransform (that has csTransient flag is ComponentState). This way it doesn't return internal components, like internal TCastleScene inside TCastleBox or TCastleTiledMap. Returned HitInfo (TRayCollisionNode) is a record, which proved to be more comfortable in this case. So (unlike a class instance) you don't need to worry "who will free it" or "if it's Returns Source: transform/castletransform_initial_types.inc (line 201). | |
Generated by PasDoc 0.17.0.snapshot.