Prechádzať zdrojové kódy

[ue4] Modifying parent materials (of the four blend modes) updates material instances again. Closes #1791.

Harald Csaszar 4 rokov pred
rodič
commit
a088270186

+ 33 - 47
spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonRendererComponent.cpp

@@ -36,7 +36,7 @@
 
 using namespace spine;
 
-USpineSkeletonRendererComponent::USpineSkeletonRendererComponent (const FObjectInitializer& ObjectInitializer) 
+USpineSkeletonRendererComponent::USpineSkeletonRendererComponent (const FObjectInitializer& ObjectInitializer)
 : UProceduralMeshComponent(ObjectInitializer) {
 	PrimaryComponentTick.bCanEverTick = true;
 	bTickInEditor = true;
@@ -44,16 +44,16 @@ USpineSkeletonRendererComponent::USpineSkeletonRendererComponent (const FObjectI
 
 	static ConstructorHelpers::FObjectFinder<UMaterialInterface> NormalMaterialRef(TEXT("/SpinePlugin/SpineUnlitNormalMaterial"));
 	NormalBlendMaterial = NormalMaterialRef.Object;
-	
+
 	static ConstructorHelpers::FObjectFinder<UMaterialInterface> AdditiveMaterialRef(TEXT("/SpinePlugin/SpineUnlitAdditiveMaterial"));
 	AdditiveBlendMaterial = AdditiveMaterialRef.Object;
-	
+
 	static ConstructorHelpers::FObjectFinder<UMaterialInterface> MultiplyMaterialRef(TEXT("/SpinePlugin/SpineUnlitMultiplyMaterial"));
 	MultiplyBlendMaterial = MultiplyMaterialRef.Object;
-	
+
 	static ConstructorHelpers::FObjectFinder<UMaterialInterface> ScreenMaterialRef(TEXT("/SpinePlugin/SpineUnlitScreenMaterial"));
 	ScreenBlendMaterial = ScreenMaterialRef.Object;
-	
+
 	TextureParameterName = FName(TEXT("SpriteTexture"));
 
 	worldVertices.ensureCapacity(1024 * 2);
@@ -69,12 +69,12 @@ void USpineSkeletonRendererComponent::BeginPlay () {
 
 void USpineSkeletonRendererComponent::TickComponent (float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) {
 	Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
-	
+
 	AActor* owner = GetOwner();
 	if (owner) {
 		UClass* skeletonClass = USpineSkeletonComponent::StaticClass();
 		USpineSkeletonComponent* skeleton = Cast<USpineSkeletonComponent>(owner->GetComponentByClass(skeletonClass));
-		
+
 		UpdateRenderer(skeleton);
 	}
 }
@@ -126,41 +126,12 @@ void USpineSkeletonRendererComponent::UpdateRenderer(USpineSkeletonComponent* sk
 
 			for (int i = 0; i < skeleton->Atlas->atlasPages.Num(); i++) {
 				AtlasPage* currPage = skeleton->Atlas->GetAtlas()->getPages()[i];
-
 				UTexture2D* texture = skeleton->Atlas->atlasPages[i];
-				UTexture* oldTexture = nullptr;
-
-				UMaterialInstanceDynamic* current = atlasNormalBlendMaterials[i];
-				if (!current || !current->GetTextureParameterValue(TextureParameterName, oldTexture) || oldTexture != texture) {
-					UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(NormalBlendMaterial, this);
-					material->SetTextureParameterValue(TextureParameterName, texture);
-					atlasNormalBlendMaterials[i] = material;
-				}
-				pageToNormalBlendMaterial.Add(currPage, atlasNormalBlendMaterials[i]);
-
-				current = atlasAdditiveBlendMaterials[i];
-				if (!current || !current->GetTextureParameterValue(TextureParameterName, oldTexture) || oldTexture != texture) {
-					UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(AdditiveBlendMaterial, this);
-					material->SetTextureParameterValue(TextureParameterName, texture);
-					atlasAdditiveBlendMaterials[i] = material;
-				}
-				pageToAdditiveBlendMaterial.Add(currPage, atlasAdditiveBlendMaterials[i]);
-
-				current = atlasMultiplyBlendMaterials[i];
-				if (!current || !current->GetTextureParameterValue(TextureParameterName, oldTexture) || oldTexture != texture) {
-					UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(MultiplyBlendMaterial, this);
-					material->SetTextureParameterValue(TextureParameterName, texture);
-					atlasMultiplyBlendMaterials[i] = material;
-				}
-				pageToMultiplyBlendMaterial.Add(currPage, atlasMultiplyBlendMaterials[i]);
-
-				current = atlasScreenBlendMaterials[i];
-				if (!current || !current->GetTextureParameterValue(TextureParameterName, oldTexture) || oldTexture != texture) {
-					UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(ScreenBlendMaterial, this);
-					material->SetTextureParameterValue(TextureParameterName, texture);
-					atlasScreenBlendMaterials[i] = material;
-				}
-				pageToScreenBlendMaterial.Add(currPage, atlasScreenBlendMaterials[i]);
+
+				UpdateRendererMaterial(currPage, texture, atlasNormalBlendMaterials[i], NormalBlendMaterial, pageToNormalBlendMaterial);
+				UpdateRendererMaterial(currPage, texture, atlasAdditiveBlendMaterials[i], AdditiveBlendMaterial, pageToAdditiveBlendMaterial);
+				UpdateRendererMaterial(currPage, texture, atlasMultiplyBlendMaterials[i], MultiplyBlendMaterial, pageToMultiplyBlendMaterial);
+				UpdateRendererMaterial(currPage, texture, atlasScreenBlendMaterials[i], ScreenBlendMaterial, pageToScreenBlendMaterial);
 			}
 		}
 		UpdateMesh(skeleton->GetSkeleton());
@@ -170,6 +141,21 @@ void USpineSkeletonRendererComponent::UpdateRenderer(USpineSkeletonComponent* sk
 	}
 }
 
+void USpineSkeletonRendererComponent::UpdateRendererMaterial (spine::AtlasPage *CurrentPage, UTexture2D *Texture,
+	UMaterialInstanceDynamic *&CurrentInstance, UMaterialInterface *ParentMaterial,
+	TMap<spine::AtlasPage *, UMaterialInstanceDynamic *> &PageToBlendMaterial) {
+
+	UTexture* oldTexture = nullptr;
+	if (!CurrentInstance || !CurrentInstance->GetTextureParameterValue(TextureParameterName, oldTexture) ||
+		oldTexture != Texture || CurrentInstance->Parent != ParentMaterial) {
+
+		UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(ParentMaterial, this);
+		material->SetTextureParameterValue(TextureParameterName, Texture);
+		CurrentInstance = material;
+	}
+	PageToBlendMaterial.Add(CurrentPage, CurrentInstance);
+}
+
 void USpineSkeletonRendererComponent::Flush (int &Idx, TArray<FVector> &Vertices, TArray<int32> &Indices, TArray<FVector> &Normals, TArray<FVector2D> &Uvs, TArray<FColor> &Colors, TArray<FVector>& Colors2, UMaterialInstanceDynamic* Material) {
 	if (Vertices.Num() == 0) return;
 	SetMaterial(Idx, Material);
@@ -192,7 +178,7 @@ void USpineSkeletonRendererComponent::UpdateMesh(Skeleton* Skeleton) {
 	TArray<FVector2D> uvs;
 	TArray<FColor> colors;
 	TArray<FVector> darkColors;
-	
+
 	int idx = 0;
 	int meshSection = 0;
 	UMaterialInstanceDynamic* lastMaterial = nullptr;
@@ -231,7 +217,7 @@ void USpineSkeletonRendererComponent::UpdateMesh(Skeleton* Skeleton) {
 			clipper.clipEnd(*slot);
 			continue;
 		}
-		
+
 		if (attachment->getRTTI().isExactly(RegionAttachment::rtti)) {
 			RegionAttachment* regionAttachment = (RegionAttachment*)attachment;
 
@@ -258,7 +244,7 @@ void USpineSkeletonRendererComponent::UpdateMesh(Skeleton* Skeleton) {
 			}
 
 			attachmentColor.set(mesh->getColor());
-			attachmentAtlasRegion = (AtlasRegion*)mesh->getRendererObject();			
+			attachmentAtlasRegion = (AtlasRegion*)mesh->getRendererObject();
 			mesh->computeWorldVertices(*slot, 0, mesh->getWorldVerticesLength(), *attachmentVertices, 0, 2);
 			attachmentIndices = mesh->getTriangles().buffer();
 			attachmentUvs = mesh->getUVs().buffer();
@@ -339,7 +325,7 @@ void USpineSkeletonRendererComponent::UpdateMesh(Skeleton* Skeleton) {
 
 		float dr = slot->hasDarkColor() ? slot->getDarkColor().r : 0.0f;
 		float dg = slot->hasDarkColor() ? slot->getDarkColor().g : 0.0f;
-		float db = slot->hasDarkColor() ? slot->getDarkColor().b : 0.0f;		
+		float db = slot->hasDarkColor() ? slot->getDarkColor().b : 0.0f;
 
 		float* verticesPtr = attachmentVertices->buffer();
 		for (int j = 0; j < numVertices << 1; j += 2) {
@@ -357,9 +343,9 @@ void USpineSkeletonRendererComponent::UpdateMesh(Skeleton* Skeleton) {
 		idx += numVertices;
 		depthOffset += this->DepthOffset;
 
-		clipper.clipEnd(*slot);			
+		clipper.clipEnd(*slot);
 	}
-	
+
 	Flush(meshSection, vertices, indices, normals, uvs, colors, darkColors, lastMaterial);
 	clipper.clipEnd();
 }

+ 17 - 13
spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonRendererComponent.h

@@ -39,11 +39,11 @@ UCLASS(ClassGroup=(Spine), meta=(BlueprintSpawnableComponent))
 class SPINEPLUGIN_API USpineSkeletonRendererComponent: public UProceduralMeshComponent {
 	GENERATED_BODY()
 
-public: 
+public:
 	USpineSkeletonRendererComponent (const FObjectInitializer& ObjectInitializer);
-	
+
 	virtual void BeginPlay () override;
-		
+
 	virtual void TickComponent (float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
 
 	/* Updates this skeleton renderer using the provided skeleton animation component. */
@@ -52,13 +52,13 @@ public:
 	// Material Instance parents
 	UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadWrite)
 	UMaterialInterface* NormalBlendMaterial;
-	
+
 	UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadWrite)
 	UMaterialInterface* AdditiveBlendMaterial;
-	
+
 	UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadWrite)
 	UMaterialInterface* MultiplyBlendMaterial;
-	
+
 	UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadWrite)
 	UMaterialInterface* ScreenBlendMaterial;
 
@@ -66,22 +66,22 @@ public:
 	UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadWrite)
 	TArray<UMaterialInstanceDynamic*> atlasNormalBlendMaterials;
 	TMap<spine::AtlasPage*, UMaterialInstanceDynamic*> pageToNormalBlendMaterial;
-	
+
 	UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadWrite)
 	TArray<UMaterialInstanceDynamic*> atlasAdditiveBlendMaterials;
 	TMap<spine::AtlasPage*, UMaterialInstanceDynamic*> pageToAdditiveBlendMaterial;
-	
+
 	UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadWrite)
 	TArray<UMaterialInstanceDynamic*> atlasMultiplyBlendMaterials;
 	TMap<spine::AtlasPage*, UMaterialInstanceDynamic*> pageToMultiplyBlendMaterial;
-	
+
 	UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadWrite)
 	TArray<UMaterialInstanceDynamic*> atlasScreenBlendMaterials;
 	TMap<spine::AtlasPage*, UMaterialInstanceDynamic*> pageToScreenBlendMaterial;
-	
+
 	UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadWrite)
 	float DepthOffset = 0.1f;
-	
+
 	UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadWrite)
 	FName TextureParameterName;
 
@@ -93,12 +93,16 @@ public:
 	bool bCreateCollision;
 
 	virtual void FinishDestroy() override;
-	
+
 protected:
+	void UpdateRendererMaterial (spine::AtlasPage *CurrentPage, UTexture2D *Texture,
+		UMaterialInstanceDynamic *&CurrentInstance, UMaterialInterface *ParentMaterial,
+		TMap<spine::AtlasPage *, UMaterialInstanceDynamic *> &PageToBlendMaterial);
+
 	void UpdateMesh (spine::Skeleton* Skeleton);
 
 	void Flush (int &Idx, TArray<FVector> &Vertices, TArray<int32> &Indices, TArray<FVector> &Normals, TArray<FVector2D> &Uvs, TArray<FColor> &Colors, TArray<FVector> &Colors2, UMaterialInstanceDynamic* Material);
-	
+
 	spine::Vector<float> worldVertices;
 	spine::SkeletonClipping clipper;
 };