Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revisionBoth sides next revision
1.0.0:physics [2023/03/16 08:54] – [Remote-Control] admin1.0.0:physics [2023/03/16 08:58] – [Example] admin
Line 228: Line 228:
  
 ===== Example ===== ===== Example =====
 +
 +==== Runtime Integration ====
 +
 For a working physics system you need a TGorillaPhysicsSystem component on your form. For a working physics system you need a TGorillaPhysicsSystem component on your form.
  
Line 297: Line 300:
 </file> </file>
  
 +==== Override Collider-Registration ====
 +
 +Default collider registration methods only support TControl3D objects.
 +But it is sometimes needed to register other types of objects for colliders, like a virtual instance of a mesh.
 +
 +Writing a helper class gives you access to the protected internal registration methods which are unspecified by type:
 +^Method ^
 +|procedure DoAddBoxCollider(const AData : Pointer; const AType : PTypeInfo; const APrefab : TGorillaColliderSettings; const AAbsoluteMatrix : TMatrix3D; const ASize : TPoint3D; out ABody : TQ3Body); virtual;|
 +|procedure DoAddSphereCollider(const AData : Pointer; const AType : PTypeInfo; const APrefab : TGorillaColliderSettings; const AAbsoluteMatrix : TMatrix3D; const ARadius : Single; out ABody : TQ3Body); virtual;|
 +|procedure DoAddCapsuleCollider(const AData : Pointer; const AType : PTypeInfo; const APrefab : TGorillaColliderSettings; const AAbsoluteMatrix : TMatrix3D; const ARadius : Single; const AHeight : Single; out ABody : TQ3Body); virtual;|
 +|procedure DoAddTerrainCollider(const AData : Pointer; const AType : PTypeInfo; const APrefab : TGorillaColliderSettings; const AAbsoluteMatrix : TMatrix3D; const AMeshMatrix : TMatrix3D; const ASize : TPoint3D; const AMeshData : TMeshData; out ABody : TQ3Body); virtual;|
 +|procedure DoAddMeshCollider(const AData : Pointer; const AType : PTypeInfo; const APrefab : TGorillaColliderSettings; const AAbsoluteMatrix : TMatrix3D; const AMeshMatrix : TMatrix3D; const ASize : TPoint3D; const AMeshData : TMeshData; out ABody : TQ3Body); virtual;|
 +
 +<file pascal>
 +type
 +  /// <summary>
 +  /// Create a helper class to access protected methods for adding colliders.
 +  /// Default methods only handle TControl3D instances, but we
 +  /// want to add colliders dynamically for our virtual instances (TGorillaMeshInstance).
 +  /// </summary>
 +  TGorillaPhysicsHelper = class helper for TGorillaPhysicsSystem
 +    public
 +      procedure AddInstanceCollider(const ATemplate : TMeshDef;
 +        const AData: TGorillaMeshInstance; const APrefab: TGorillaColliderSettings;
 +        const AAbsoluteMatrix: TMatrix3D; const ASize: TPoint3D; const AFlipData : Boolean;
 +        out ABody: TQ3Body);
 +  end;
 +
 +{ TGorillaPhysicsHelper }
 +
 +procedure TGorillaPhysicsHelper.AddInstanceCollider(const ATemplate : TMeshDef;
 +  const AData: TGorillaMeshInstance; const APrefab: TGorillaColliderSettings;
 +  const AAbsoluteMatrix: TMatrix3D; const ASize: TPoint3D; const AFlipData : Boolean;
 +  out ABody: TQ3Body);
 +var LTransform : TMatrix3D;
 +begin
 +  // Get the translation from absolute instance matrix
 +  LTransform := TMatrix3D.CreateTranslation(
 +    TTransformationMatrixUtils.GetTranslationFromTransformationMatrix(AAbsoluteMatrix)
 +    );
 +
 +  // Add a sphere collider for each instance with the maximum size of a side as radius
 +  DoAddSphereCollider(AData, TypeInfo(TGorillaMeshInstance), APrefab,
 +    LTransform, Max(ASize.X, Max(ASize.Y, ASize.Z)), ABody);
 +end;
 +</file>
  
 Next step: [[fmodaudio|FMOD Audio]] Next step: [[fmodaudio|FMOD Audio]]