Files
BladeSmith/Source/BladeSmith/IronBlock.h
T
2025-11-16 00:26:50 +08:00

75 lines
2.0 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
// FDeformComputeShader.h 假定包含了 FDeformationCSDispatchParams 结构
#include "FDeformComputeShader.h"
#include "IronBlock.generated.h"
class UTextureRenderTarget2D;
class UMaterialInstanceDynamic;
class UStaticMeshComponent;
UCLASS()
class BLADESMITH_API AIronBlock : public AActor
{
GENERATED_BODY()
public:
UPROPERTY()
UStaticMeshComponent* StaticMeshComp;
/* 变形表现基础材质 */
UPROPERTY(EditAnywhere)
UMaterial* DeformBaseMat;
/* 变形冲击计算材质 */
UPROPERTY(EditAnywhere)
UMaterial* DeformCalMat;
/* 冲击力系数 */
UPROPERTY(EditAnywhere)
float ImpactForce;
/* 冲击力范围 */
UPROPERTY(EditAnywhere)
float ImpactAffectRange;
/* 冲击计算RT贴图大小 */
UPROPERTY(EditAnywhere)
float TexSize;
public:
// Sets default values for this actor's properties
AIronBlock();
UFUNCTION(BlueprintCallable)
void OnHammerHit(const FHitResult& HitResult);
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
virtual void PostInitProperties();
/** 初始化两个渲染目标和它们的初始数据 */
void InitializePositionTexture();
/** 创建一个配置好用于变形计算的 RenderTarget */
UTextureRenderTarget2D* CreateDeformRT(const FString& RTName, int32 Size);
/** 设置动态材质实例和参数 */
void SetupDeformationMaterial(UTexture2D* OrigTex);
private:
/** * 双缓冲纹理索引
* 0: 读 RT0, 写 RT1
* 1: 读 RT1, 写 RT0
*/
int32 CurrentTextureIndex = 0;
/** 应用于网格的动态材质实例 */
UMaterialInstanceDynamic* DynMaterial;
/** 用于Ping-Pong缓冲的渲染目标 A */
UTextureRenderTarget2D* PositionRenderTarget0;
/** 用于Ping-Pong缓冲的渲染目标 B */
UTextureRenderTarget2D* PositionRenderTarget1;
/** 应用于网格的动态材质实例 */
UMaterialInstanceDynamic* DynCalMaterial;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
};