[ue4] Reworked material generation so we can implement (most) blend modes

This commit is contained in:
badlogic 2016-12-14 11:32:47 +01:00
parent 08ef2ec560
commit 277920b7fa
9 changed files with 102 additions and 20 deletions

Binary file not shown.

View File

@ -11,8 +11,18 @@ USpineSkeletonRendererComponent::USpineSkeletonRendererComponent (const FObjectI
bTickInEditor = true;
bAutoActivate = true;
static ConstructorHelpers::FObjectFinder<UMaterialInterface> MaskedMaterialRef(TEXT("/Paper2D/MaskedUnlitSpriteMaterial"));
DefaultMaterial = MaskedMaterialRef.Object;
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"));
}
@ -30,30 +40,84 @@ void USpineSkeletonRendererComponent::TickComponent (float DeltaTime, ELevelTick
USpineSkeletonComponent* skeleton = Cast<USpineSkeletonComponent>(owner->GetComponentByClass(skeletonClass));
if (skeleton && !skeleton->IsBeingDestroyed() && skeleton->GetSkeleton()) {
if (atlasMaterials.Num() != skeleton->Atlas->atlasPages.Num()) {
atlasMaterials.SetNum(0);
pageToMaterial.Empty();
if (atlasNormalBlendMaterials.Num() != skeleton->Atlas->atlasPages.Num()) {
atlasNormalBlendMaterials.SetNum(0);
pageToNormalBlendMaterial.Empty();
atlasAdditiveBlendMaterials.SetNum(0);
pageToAdditiveBlendMaterial.Empty();
atlasMultiplyBlendMaterials.SetNum(0);
pageToMultiplyBlendMaterial.Empty();
atlasScreenBlendMaterials.SetNum(0);
pageToScreenBlendMaterial.Empty();
spAtlasPage* currPage = skeleton->Atlas->GetAtlas(false)->pages;
for (int i = 0; i < skeleton->Atlas->atlasPages.Num(); i++) {
UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(DefaultMaterial, owner);
UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(NormalBlendMaterial, owner);
material->SetTextureParameterValue(TextureParameterName, skeleton->Atlas->atlasPages[i]);
atlasMaterials.Add(material);
pageToMaterial.Add(currPage, material);
atlasNormalBlendMaterials.Add(material);
pageToNormalBlendMaterial.Add(currPage, material);
material = UMaterialInstanceDynamic::Create(AdditiveBlendMaterial, owner);
material->SetTextureParameterValue(TextureParameterName, skeleton->Atlas->atlasPages[i]);
atlasAdditiveBlendMaterials.Add(material);
pageToAdditiveBlendMaterial.Add(currPage, material);
material = UMaterialInstanceDynamic::Create(MultiplyBlendMaterial, owner);
material->SetTextureParameterValue(TextureParameterName, skeleton->Atlas->atlasPages[i]);
atlasMultiplyBlendMaterials.Add(material);
pageToMultiplyBlendMaterial.Add(currPage, material);
material = UMaterialInstanceDynamic::Create(ScreenBlendMaterial, owner);
material->SetTextureParameterValue(TextureParameterName, skeleton->Atlas->atlasPages[i]);
atlasScreenBlendMaterials.Add(material);
pageToScreenBlendMaterial.Add(currPage, material);
currPage = currPage->next;
}
} else {
pageToMaterial.Empty();
pageToNormalBlendMaterial.Empty();
pageToAdditiveBlendMaterial.Empty();
pageToMultiplyBlendMaterial.Empty();
pageToScreenBlendMaterial.Empty();
spAtlasPage* currPage = skeleton->Atlas->GetAtlas(false)->pages;
for (int i = 0; i < skeleton->Atlas->atlasPages.Num(); i++) {
UMaterialInstanceDynamic* current = atlasMaterials[i];
UTexture2D* texture = skeleton->Atlas->atlasPages[i];
UTexture* oldTexture = nullptr;
UMaterialInstanceDynamic* current = atlasNormalBlendMaterials[i];
if(!current->GetTextureParameterValue(TextureParameterName, oldTexture) || oldTexture != texture) {
UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(DefaultMaterial, owner);
UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(NormalBlendMaterial, owner);
material->SetTextureParameterValue(TextureParameterName, texture);
atlasMaterials[i] = material;
atlasNormalBlendMaterials[i] = material;
}
pageToMaterial.Add(currPage, atlasMaterials[i]);
pageToNormalBlendMaterial.Add(currPage, atlasNormalBlendMaterials[i]);
current = atlasAdditiveBlendMaterials[i];
if(!current->GetTextureParameterValue(TextureParameterName, oldTexture) || oldTexture != texture) {
UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(AdditiveBlendMaterial, owner);
material->SetTextureParameterValue(TextureParameterName, texture);
atlasAdditiveBlendMaterials[i] = material;
}
pageToAdditiveBlendMaterial.Add(currPage, atlasAdditiveBlendMaterials[i]);
current = atlasMultiplyBlendMaterials[i];
if(!current->GetTextureParameterValue(TextureParameterName, oldTexture) || oldTexture != texture) {
UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(MultiplyBlendMaterial, owner);
material->SetTextureParameterValue(TextureParameterName, texture);
atlasMultiplyBlendMaterials[i] = material;
}
pageToMultiplyBlendMaterial.Add(currPage, atlasMultiplyBlendMaterials[i]);
current = atlasScreenBlendMaterials[i];
if(!current->GetTextureParameterValue(TextureParameterName, oldTexture) || oldTexture != texture) {
UMaterialInstanceDynamic* material = UMaterialInstanceDynamic::Create(ScreenBlendMaterial, owner);
material->SetTextureParameterValue(TextureParameterName, texture);
atlasScreenBlendMaterials[i] = material;
}
pageToScreenBlendMaterial.Add(currPage, atlasScreenBlendMaterials[i]);
currPage = currPage->next;
}
}
@ -99,7 +163,7 @@ void USpineSkeletonRendererComponent::UpdateMesh(spSkeleton* Skeleton) {
if (attachment->type == SP_ATTACHMENT_REGION) {
spRegionAttachment* regionAttachment = (spRegionAttachment*)attachment;
spAtlasRegion* region = (spAtlasRegion*)regionAttachment->rendererObject;
UMaterialInstanceDynamic* material = pageToMaterial[region->page];
UMaterialInstanceDynamic* material = pageToNormalBlendMaterial[region->page];
if (lastMaterial != material) {
Flush(meshSection, vertices, indices, uvs, colors, lastMaterial);
@ -142,7 +206,7 @@ void USpineSkeletonRendererComponent::UpdateMesh(spSkeleton* Skeleton) {
} else if (attachment->type == SP_ATTACHMENT_MESH) {
spMeshAttachment* mesh = (spMeshAttachment*)attachment;
spAtlasRegion* region = (spAtlasRegion*)mesh->rendererObject;
UMaterialInstanceDynamic* material = pageToMaterial[region->page];
UMaterialInstanceDynamic* material = pageToNormalBlendMaterial[region->page];
if (lastMaterial != material) {
Flush(meshSection, vertices, indices, uvs, colors, lastMaterial);

View File

@ -20,7 +20,16 @@ public:
virtual void TickComponent (float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadOnly)
UMaterialInterface* DefaultMaterial;
UMaterialInterface* NormalBlendMaterial;
UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadOnly)
UMaterialInterface* AdditiveBlendMaterial;
UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadOnly)
UMaterialInterface* MultiplyBlendMaterial;
UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadOnly)
UMaterialInterface* ScreenBlendMaterial;
UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadWrite)
float DepthOffset = 0.1f;
@ -33,6 +42,15 @@ protected:
void Flush (int &Idx, TArray<FVector> &Vertices, TArray<int32> &Indices, TArray<FVector2D> &Uvs, TArray<FColor> &Colors, UMaterialInstanceDynamic* Material);
TArray<UMaterialInstanceDynamic*> atlasMaterials;
TMap<spAtlasPage*, UMaterialInstanceDynamic*> pageToMaterial;
TArray<UMaterialInstanceDynamic*> atlasNormalBlendMaterials;
TMap<spAtlasPage*, UMaterialInstanceDynamic*> pageToNormalBlendMaterial;
TArray<UMaterialInstanceDynamic*> atlasAdditiveBlendMaterials;
TMap<spAtlasPage*, UMaterialInstanceDynamic*> pageToAdditiveBlendMaterial;
TArray<UMaterialInstanceDynamic*> atlasMultiplyBlendMaterials;
TMap<spAtlasPage*, UMaterialInstanceDynamic*> pageToMultiplyBlendMaterial;
TArray<UMaterialInstanceDynamic*> atlasScreenBlendMaterials;
TMap<spAtlasPage*, UMaterialInstanceDynamic*> pageToScreenBlendMaterial;
};

View File

@ -11,7 +11,7 @@
"MarketplaceURL" : "",
"SupportURL" : "",
"EnabledByDefault" : false,
"CanContainContent" : false,
"CanContainContent" : true,
"IsBetaVersion" : false,
"Installed" : false,
"Modules" :
@ -26,4 +26,4 @@
"Type" : "Editor"
}
]
}
}