1
0
KF2-Dev-Scripts/Engine/Classes/FracturedBaseComponent.uc
2020-12-13 18:01:13 +03:00

145 lines
5.7 KiB
Ucode

/**
* FracturedBaseComponent.uc - Declaration of the base fractured component which handles rendering with a dynamic index buffer.
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
*/
class FracturedBaseComponent extends StaticMeshComponent
native(Mesh)
abstract;
/** This component's index buffer, used for rendering when bUseDynamicIndexBuffer is true. */
var protected{protected} const native transient pointer ComponentBaseResources{class FFracturedBaseResources};
/** A fence used to track when the rendering thread has released the component's resources. */
var protected{protected} native const transient RenderCommandFence_Mirror ReleaseResourcesFence{FRenderCommandFence};
/** Stores non-zero for each fragment that is visible, and 0 otherwise. */
var protected{protected} transient const array<byte> VisibleFragments;
/** If true, VisibleFragments has changed since the last attach and the dynamic index buffer needs to be updated. */
var protected{protected} transient bool bVisibilityHasChanged;
/** True if VisibleFragments was reset to bInitialVisibilityValue since the last component attach. */
var protected{protected} transient const bool bVisibilityReset;
/** Initial visibility value for this component. */
var protected{protected} const bool bInitialVisibilityValue;
/**
* If true, each element will be rendered with one draw call by using a dynamic index buffer that is repacked when visibility changes.
* If false, each element will be rendered with n draw calls, where n is the number of consecutive index ranges, and there will be no memory overhead.
*/
var protected{protected} const bool bUseDynamicIndexBuffer;
/**
* If true, bUseDynamicIndexBuffer will be enabled when at least one fragment is hidden, otherwise it will be disabled.
* If false, bUseDynamicIndexBuffer will not be overridden.
*/
var protected{protected} const bool bUseDynamicIBWithHiddenFragments;
/**
* Number of indices in the resource's index buffer the last time the component index buffer was built.
* Used to detect when the resource's index buffer has changed and the component's index buffer should be rebuilt.
*/
var private{private} const int NumResourceIndices;
/** TRUE whenever the static mesh is being reset during Reattach */
var protected{protected} transient const int bResetStaticMesh;
cpptext
{
public:
//UObject
/** Blocks until the component's render resources have been released so that they can safely be modified */
virtual void PreEditChange(UProperty* PropertyAboutToChange);
virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent);
/**
* Signals to the object to begin asynchronously releasing resources
*/
virtual void BeginDestroy();
/**
* Check for asynchronous resource cleanup completion
* @return TRUE if the rendering resources have been released
*/
virtual UBOOL IsReadyForFinishDestroy();
//Accessors
INT GetNumVisibleTriangles() const;
UBOOL GetInitialVisibilityValue() const;
protected:
/**
* Called after all objects referenced by this object have been serialized. Order of PostLoad routed to
* multiple objects loaded in one set is not deterministic though ConditionalPostLoad can be forced to
* ensure an object has been "PostLoad"ed.
*/
virtual void PostLoad();
virtual void InitResources();
virtual void ReleaseResources();
void ReleaseBaseResources();
/** Attaches the component to the scene, and initializes the component's resources if they have not been yet. */
virtual void Attach();
/** Checks if the given fragment is visible. */
virtual UBOOL IsElementFragmentVisible(INT ElementIndex, INT FragmentIndex, INT InteriorElementIndex, INT CoreFragmentIndex, UBOOL bAnyFragmentsHidden) const;
/**
* Updates the fragments of this component that are visible.
* @param NewVisibleFragments - visibility factors for this component, corresponding to FracturedStaticMesh's Fragments array
* @param bForceUpdate - whether to update this component's resources even if no fragments have changed visibility
*/
virtual void UpdateVisibleFragments(const TArray<BYTE>& NewVisibleFragments, UBOOL bForceUpdate);
/**
* Resets VisibleFragments to bInitialVisibilityValue.
* Does not cause a reattach, so the results won't be propagated to the render thread until the next reattach.
*/
void ResetVisibility();
/**
* Determine if the mesh currently has any hidden fragments
* @return TRUE if >0 hidden fragments
*/
UBOOL HasHiddenFragments() const;
private:
/** Enqueues a rendering command to update the component's dynamic index buffer. */
void UpdateComponentIndexBuffer();
friend class FFracturedBaseSceneProxy;
}
/**
* Change the StaticMesh used by this instance, and resets VisibleFragments to all be visible if NewMesh is valid.
* @param NewMesh - StaticMesh to set. If this is not also a UFracturedStaticMesh, assignment will fail.
* @return bool - TRUE if assignment succeeded.
*/
simulated native function bool SetStaticMesh( StaticMesh NewMesh, optional bool bForce );
/** Returns array of currently visible fragments. */
simulated native function array<byte> GetVisibleFragments() const;
/** Returns whether the specified fragment is currently visible or not. */
simulated native function bool IsFragmentVisible(INT FragmentIndex) const;
/** Get the number of chunks in the assigned fractured mesh. */
native function int GetNumFragments() const;
/** Get the number of chunks that are currently visible. */
native function int GetNumVisibleFragments() const;
defaultproperties
{
bUseDynamicIndexBuffer=true
bInitialVisibilityValue=true
bAcceptsDecalsDuringGameplay=FALSE
bAcceptsStaticDecals=FALSE
bAcceptsDynamicDecals=TRUE
}