diff --git a/spine-ue4/Content/Maps/example.umap b/spine-ue4/Content/Maps/example.umap index ad6e14d7c..dde85a2e4 100644 Binary files a/spine-ue4/Content/Maps/example.umap and b/spine-ue4/Content/Maps/example.umap differ diff --git a/spine-ue4/Content/SpineBoy/Spineboy_Blueprint.uasset b/spine-ue4/Content/SpineBoy/Spineboy_Blueprint.uasset index 4cfeafb10..fd266eb7c 100644 Binary files a/spine-ue4/Content/SpineBoy/Spineboy_Blueprint.uasset and b/spine-ue4/Content/SpineBoy/Spineboy_Blueprint.uasset differ diff --git a/spine-ue4/Plugins/SpinePlugin/Content/SpineUnlitAdditiveMaterial.uasset b/spine-ue4/Plugins/SpinePlugin/Content/SpineUnlitAdditiveMaterial.uasset new file mode 100644 index 000000000..9ccd5cd5e Binary files /dev/null and b/spine-ue4/Plugins/SpinePlugin/Content/SpineUnlitAdditiveMaterial.uasset differ diff --git a/spine-ue4/Plugins/SpinePlugin/Content/SpineUnlitMultiplyMaterial.uasset b/spine-ue4/Plugins/SpinePlugin/Content/SpineUnlitMultiplyMaterial.uasset new file mode 100644 index 000000000..81867ab71 Binary files /dev/null and b/spine-ue4/Plugins/SpinePlugin/Content/SpineUnlitMultiplyMaterial.uasset differ diff --git a/spine-ue4/Plugins/SpinePlugin/Content/SpineUnlitNormalMaterial.uasset b/spine-ue4/Plugins/SpinePlugin/Content/SpineUnlitNormalMaterial.uasset new file mode 100644 index 000000000..b1b714b27 Binary files /dev/null and b/spine-ue4/Plugins/SpinePlugin/Content/SpineUnlitNormalMaterial.uasset differ diff --git a/spine-ue4/Plugins/SpinePlugin/Content/SpineUnlitScreenMaterial.uasset b/spine-ue4/Plugins/SpinePlugin/Content/SpineUnlitScreenMaterial.uasset new file mode 100644 index 000000000..675910f9f Binary files /dev/null and b/spine-ue4/Plugins/SpinePlugin/Content/SpineUnlitScreenMaterial.uasset differ diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonRendererComponent.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonRendererComponent.cpp index 60dbe35e0..8af6b307c 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonRendererComponent.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineSkeletonRendererComponent.cpp @@ -11,8 +11,18 @@ USpineSkeletonRendererComponent::USpineSkeletonRendererComponent (const FObjectI bTickInEditor = true; bAutoActivate = true; - static ConstructorHelpers::FObjectFinder MaskedMaterialRef(TEXT("/Paper2D/MaskedUnlitSpriteMaterial")); - DefaultMaterial = MaskedMaterialRef.Object; + static ConstructorHelpers::FObjectFinder NormalMaterialRef(TEXT("/SpinePlugin/SpineUnlitNormalMaterial")); + NormalBlendMaterial = NormalMaterialRef.Object; + + static ConstructorHelpers::FObjectFinder AdditiveMaterialRef(TEXT("/SpinePlugin/SpineUnlitAdditiveMaterial")); + AdditiveBlendMaterial = AdditiveMaterialRef.Object; + + static ConstructorHelpers::FObjectFinder MultiplyMaterialRef(TEXT("/SpinePlugin/SpineUnlitMultiplyMaterial")); + MultiplyBlendMaterial = MultiplyMaterialRef.Object; + + static ConstructorHelpers::FObjectFinder ScreenMaterialRef(TEXT("/SpinePlugin/SpineUnlitScreenMaterial")); + ScreenBlendMaterial = ScreenMaterialRef.Object; + TextureParameterName = FName(TEXT("SpriteTexture")); } @@ -30,30 +40,84 @@ void USpineSkeletonRendererComponent::TickComponent (float DeltaTime, ELevelTick USpineSkeletonComponent* skeleton = Cast(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); diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonRendererComponent.h b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonRendererComponent.h index 0b79cb37f..b890c49e7 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonRendererComponent.h +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonRendererComponent.h @@ -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 &Vertices, TArray &Indices, TArray &Uvs, TArray &Colors, UMaterialInstanceDynamic* Material); - TArray atlasMaterials; - TMap pageToMaterial; + TArray atlasNormalBlendMaterials; + TMap pageToNormalBlendMaterial; + + TArray atlasAdditiveBlendMaterials; + TMap pageToAdditiveBlendMaterial; + + TArray atlasMultiplyBlendMaterials; + TMap pageToMultiplyBlendMaterial; + + TArray atlasScreenBlendMaterials; + TMap pageToScreenBlendMaterial; }; diff --git a/spine-ue4/Plugins/SpinePlugin/SpinePlugin.uplugin b/spine-ue4/Plugins/SpinePlugin/SpinePlugin.uplugin index fb0c4854e..3540c0a76 100644 --- a/spine-ue4/Plugins/SpinePlugin/SpinePlugin.uplugin +++ b/spine-ue4/Plugins/SpinePlugin/SpinePlugin.uplugin @@ -11,7 +11,7 @@ "MarketplaceURL" : "", "SupportURL" : "", "EnabledByDefault" : false, - "CanContainContent" : false, + "CanContainContent" : true, "IsBetaVersion" : false, "Installed" : false, "Modules" : @@ -26,4 +26,4 @@ "Type" : "Editor" } ] -} \ No newline at end of file +}