diff --git a/CHANGELOG.md b/CHANGELOG.md index b380495ea..bf8ef5d2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -158,6 +158,7 @@ - `SkeletonRenderTexture` example components now provide a `shaderPasses` parameter to customize which passes are rendered to the `RenderTexture`. It defaults to `-1` for all passes to keep the existing behaviour. You might want to set it to `0` to only render the first pass e.g. to avoid issues when using a URP shader at the original skeleton. - `SkeletonGraphicRenderTexture` example component now also received a `quadMaterial` property, defaulting to the newly added Material asset `RenderQuadGraphicMaterial` which applies proper premultiplied-alpha blending of the render texture. The `quadMaterial` member variable was moved from `SkeletonRenderTexture` to the common base class `SkeletonRenderTextureBase`. - All Spine Outline shaders, including the URP outline shader, now provide an additional parameter `Width in Screen Space`. Enable it to keep the outline width constant in screen space instead of texture space. Requires more expensive computations, so enable only where necessary. Defaults to `disabled` to maintain existing behaviour. + - Added support for BlendModeMaterials at runtime instantiation from files via an additional method `SkeletonDataAsset.SetupRuntimeBlendModeMaterials`. See example scene `Spine Examples/Other Examples/Instantiate from Script` for a usage example. - **Breaking changes** diff --git a/spine-unity/Assets/Spine Examples/Other Examples/Instantiate from Script.unity b/spine-unity/Assets/Spine Examples/Other Examples/Instantiate from Script.unity index 5432a019a..08816535e 100644 --- a/spine-unity/Assets/Spine Examples/Other Examples/Instantiate from Script.unity +++ b/spine-unity/Assets/Spine Examples/Other Examples/Instantiate from Script.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 8 + serializedVersion: 10 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -39,37 +39,33 @@ RenderSettings: m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 1 + serializedVersion: 12 m_GISettings: serializedVersion: 2 m_BounceScale: 1 m_IndirectOutputScale: 1 m_AlbedoBoost: 1 - m_TemporalCoherenceThreshold: 1 m_EnvironmentLightingMode: 0 m_EnableBakedLightmaps: 0 m_EnableRealtimeLightmaps: 0 m_LightmapEditorSettings: - serializedVersion: 9 + serializedVersion: 12 m_Resolution: 2 m_BakeResolution: 40 - m_TextureWidth: 1024 - m_TextureHeight: 1024 + m_AtlasSize: 1024 m_AO: 0 m_AOMaxDistance: 1 m_CompAOExponent: 1 m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 m_Padding: 2 m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 0 @@ -77,23 +73,34 @@ LightmapSettings: m_PVRDirectSampleCount: 32 m_PVRSampleCount: 500 m_PVRBounces: 2 - m_PVRFiltering: 0 - m_PVRFilteringMode: 1 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 m_PVRCulling: 1 m_PVRFilteringGaussRadiusDirect: 1 m_PVRFilteringGaussRadiusIndirect: 5 m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousColorSigma: 1 - m_PVRFilteringAtrousNormalSigma: 1 - m_PVRFilteringAtrousPositionSigma: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 m_LightingDataAsset: {fileID: 0} - m_UseShadowmask: 1 + m_LightingSettings: {fileID: 1506007501} --- !u!196 &4 NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: - serializedVersion: 2 + serializedVersion: 3 agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 @@ -106,20 +113,25 @@ NavMeshSettings: cellSize: 0.16666667 manualTileSize: 0 tileSize: 256 - accuratePlacement: 0 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 m_NavMeshData: {fileID: 0} --- !u!1 &92207858 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 m_Component: - component: {fileID: 92207862} - component: {fileID: 92207861} - component: {fileID: 92207860} m_Layer: 5 - m_Name: 3 Canvas - Spawn SkeletonGraphic Sample + m_Name: 2 Canvas - Spawn SkeletonGraphic Sample m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -128,12 +140,13 @@ GameObject: --- !u!114 &92207860 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 92207858} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} m_Name: m_EditorClassIdentifier: m_UiScaleMode: 1 @@ -146,11 +159,13 @@ MonoBehaviour: m_FallbackScreenDPI: 96 m_DefaultSpriteDPI: 96 m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 --- !u!223 &92207861 Canvas: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 92207858} m_Enabled: 1 serializedVersion: 3 @@ -162,35 +177,122 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 --- !u!224 &92207862 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 92207858} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1691562007} m_Father: {fileID: 0} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} +--- !u!1 &191860306 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 191860307} + - component: {fileID: 191860309} + - component: {fileID: 191860308} + m_Layer: 0 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &191860307 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 191860306} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1200587070} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &191860308 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 191860306} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1920, y: 1080} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &191860309 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 191860306} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!1 &433620963 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 m_Component: - component: {fileID: 433620968} - component: {fileID: 433620967} @@ -206,27 +308,44 @@ GameObject: --- !u!81 &433620964 AudioListener: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 433620963} m_Enabled: 1 --- !u!124 &433620965 Behaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 433620963} m_Enabled: 1 --- !u!20 &433620967 Camera: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 433620963} m_Enabled: 1 serializedVersion: 2 m_ClearFlags: 1 m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -248,35 +367,38 @@ Camera: m_TargetEye: 3 m_HDR: 1 m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 m_ForceIntoRT: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 - m_StereoMirrorMode: 0 --- !u!4 &433620968 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 433620963} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -10} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &651278528 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 m_Component: - component: {fileID: 651278530} - component: {fileID: 651278529} m_Layer: 0 - m_Name: 2 RuntimeLoadFromExports + m_Name: 3 RuntimeLoadFromExports m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -285,8 +407,9 @@ GameObject: --- !u!114 &651278529 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 651278528} m_Enabled: 1 m_EditorHideFlags: 0 @@ -297,27 +420,251 @@ MonoBehaviour: atlasText: {fileID: 4900000, guid: 5c0a5c36970a46e4d8378760ab4a4cfc, type: 3} textures: - {fileID: 2800000, guid: 49bb65eefe08e424bbf7a38bc98ec638, type: 3} - materialPropertySource: {fileID: 2100000, guid: 1455e88fdb81ccc45bdeaedd657bad4d, - type: 2} + materialPropertySource: {fileID: 2100000, guid: 1455e88fdb81ccc45bdeaedd657bad4d, type: 2} + delay: 0 + skinName: + animationName: + blendModeMaterials: 0 + applyAdditiveMaterial: 0 + blendModeTemplateMaterials: + additiveTemplate: {fileID: 0} + multiplyTemplate: {fileID: 0} + screenTemplate: {fileID: 0} + graphicBlendModeMaterials: + additiveTemplate: {fileID: 0} + multiplyTemplate: {fileID: 0} + screenTemplate: {fileID: 0} + skeletonGraphicMaterial: {fileID: 2100000, guid: b66cf7a186d13054989b33a5c90044e4, type: 2} --- !u!4 &651278530 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 651278528} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1025308469} m_Father: {fileID: 0} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1025308468 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1025308469} + - component: {fileID: 1025308472} + - component: {fileID: 1025308471} + m_Layer: 0 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1025308469 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1025308468} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 651278530} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1025308471 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1025308468} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1920, y: 1080} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1025308472 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1025308468} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!1 &1200587068 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1200587070} + - component: {fileID: 1200587069} + m_Layer: 0 + m_Name: 4 Runtime BlendModes from Exports + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1200587069 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1200587068} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bb0837af7345d504db63d0c662fd12dc, type: 3} + m_Name: + m_EditorClassIdentifier: + skeletonJson: {fileID: 4900000, guid: 1a6f51aad0fef5a40aeedfeec5c0b8b2, type: 3} + atlasText: {fileID: 4900000, guid: 188756a89517d7649a67fb53606220f5, type: 3} + textures: + - {fileID: 2800000, guid: dc1b9f9665c8aa74799404a1d2038e3d, type: 3} + materialPropertySource: {fileID: 2100000, guid: 1455e88fdb81ccc45bdeaedd657bad4d, type: 2} + delay: 0 + skinName: + animationName: + blendModeMaterials: 1 + applyAdditiveMaterial: 0 + blendModeTemplateMaterials: + additiveTemplate: {fileID: 2100000, guid: 4deba332d47209e4780b3c5fcf0e3745, type: 2} + multiplyTemplate: {fileID: 2100000, guid: 53bf0ab317d032d418cf1252d68f51df, type: 2} + screenTemplate: {fileID: 2100000, guid: 73f0f46d3177c614baf0fa48d646a9be, type: 2} + graphicBlendModeMaterials: + additiveTemplate: {fileID: 2100000, guid: 2e8245019faeb8c43b75f9ca3ac8ee34, type: 2} + multiplyTemplate: {fileID: 2100000, guid: e74a1f8978a7da348a721508d0d58834, type: 2} + screenTemplate: {fileID: 2100000, guid: bab24c479f34eec45be6ea8595891569, type: 2} + skeletonGraphicMaterial: {fileID: 2100000, guid: b66cf7a186d13054989b33a5c90044e4, type: 2} +--- !u!4 &1200587070 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1200587068} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 191860307} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!850595691 &1506007501 +LightingSettings: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Settings.lighting + serializedVersion: 8 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_RealtimeEnvironmentLighting: 1 + m_BounceScale: 1 + m_AlbedoBoost: 1 + m_IndirectOutputScale: 1 + m_UsingShadowmask: 1 + m_BakeBackend: 1 + m_LightmapMaxSize: 1024 + m_LightmapSizeFixed: 0 + m_UseMipmapLimits: 1 + m_BakeResolution: 40 + m_Padding: 2 + m_LightmapCompression: 3 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAO: 0 + m_MixedBakeMode: 2 + m_LightmapsBakeMode: 1 + m_FilterMode: 1 + m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0} + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_RealtimeResolution: 2 + m_ForceWhiteAlbedo: 0 + m_ForceUpdates: 0 + m_PVRCulling: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVREnvironmentSampleCount: 512 + m_PVREnvironmentReferencePointCount: 2048 + m_LightProbeSampleCountMultiplier: 4 + m_PVRBounces: 2 + m_PVRMinBounces: 2 + m_PVREnvironmentImportanceSampling: 0 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_RespectSceneVisibilityWhenBakingGI: 0 --- !u!1 &1691562006 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 m_Component: - component: {fileID: 1691562007} - component: {fileID: 1691562008} @@ -331,15 +678,16 @@ GameObject: --- !u!224 &1691562007 RectTransform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1691562006} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 92207862} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -349,8 +697,9 @@ RectTransform: --- !u!114 &1691562008 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1691562006} m_Enabled: 1 m_EditorHideFlags: 0 @@ -360,14 +709,14 @@ MonoBehaviour: skeletonDataAsset: {fileID: 11400000, guid: a467507a4ffb1d542a558739b2fede77, type: 2} startingAnimation: run startingSkin: base - skeletonGraphicMaterial: {fileID: 2100000, guid: 1455e88fdb81ccc45bdeaedd657bad4d, - type: 2} + skeletonGraphicMaterial: {fileID: 2100000, guid: b66cf7a186d13054989b33a5c90044e4, type: 2} --- !u!1 &1807176298 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 m_Component: - component: {fileID: 1807176300} - component: {fileID: 1807176299} @@ -381,8 +730,9 @@ GameObject: --- !u!114 &1807176299 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1807176298} m_Enabled: 1 m_EditorHideFlags: 0 @@ -395,13 +745,93 @@ MonoBehaviour: --- !u!4 &1807176300 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1807176298} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1924218899 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1924218902} + - component: {fileID: 1924218901} + - component: {fileID: 1924218900} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1924218900 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1924218899} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1924218901 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1924218899} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1924218902 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1924218899} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 433620968} + - {fileID: 1807176300} + - {fileID: 92207862} + - {fileID: 651278530} + - {fileID: 1200587070} + - {fileID: 1924218902} diff --git a/spine-unity/Assets/Spine Examples/Scripts/RuntimeLoadFromExportsExample.cs b/spine-unity/Assets/Spine Examples/Scripts/RuntimeLoadFromExportsExample.cs index 17f19b4bb..baa935964 100644 --- a/spine-unity/Assets/Spine Examples/Scripts/RuntimeLoadFromExportsExample.cs +++ b/spine-unity/Assets/Spine Examples/Scripts/RuntimeLoadFromExportsExample.cs @@ -46,14 +46,27 @@ namespace Spine.Unity.Examples { SpineAtlasAsset runtimeAtlasAsset; SkeletonDataAsset runtimeSkeletonDataAsset; SkeletonAnimation runtimeSkeletonAnimation; + SkeletonGraphic runtimeSkeletonGraphic; + + public bool blendModeMaterials = false; + public bool applyAdditiveMaterial = false; + public BlendModeMaterials.TemplateMaterials blendModeTemplateMaterials; + public BlendModeMaterials.TemplateMaterials graphicBlendModeMaterials; + public Material skeletonGraphicMaterial; void CreateRuntimeAssetsAndGameObject () { // 1. Create the AtlasAsset (needs atlas text asset and textures, and materials/shader); // 2. Create SkeletonDataAsset (needs json or binary asset file, and an AtlasAsset) - // 3. Create SkeletonAnimation (needs a valid SkeletonDataAsset) + // 2.1 Optional: Setup blend mode materials at SkeletonDataAsset. Only required if the skeleton + // uses blend modes which require blend mode materials. + // 3.a Create SkeletonAnimation (needs a valid SkeletonDataAsset) + // 3.b Create SkeletonGraphic (needs a valid SkeletonDataAsset) - runtimeAtlasAsset = SpineAtlasAsset.CreateRuntimeInstance(atlasText, textures, materialPropertySource, true); + runtimeAtlasAsset = SpineAtlasAsset.CreateRuntimeInstance(atlasText, textures, materialPropertySource, true, null, true); runtimeSkeletonDataAsset = SkeletonDataAsset.CreateRuntimeInstance(skeletonJson, runtimeAtlasAsset, true); + if (blendModeMaterials) + runtimeSkeletonDataAsset.SetupRuntimeBlendModeMaterials( + applyAdditiveMaterial, blendModeTemplateMaterials); } IEnumerator Start () { @@ -62,7 +75,15 @@ namespace Spine.Unity.Examples { runtimeSkeletonDataAsset.GetSkeletonData(false); // preload yield return new WaitForSeconds(delay); } + InstantiateSkeletonAnimation(); + + InstantiateSkeletonGraphic(); + } + + void InstantiateSkeletonAnimation () { runtimeSkeletonAnimation = SkeletonAnimation.NewSkeletonAnimationGameObject(runtimeSkeletonDataAsset); + runtimeSkeletonAnimation.transform.parent = transform; + runtimeSkeletonAnimation.name = "SkeletonAnimation Instance"; // additional initialization runtimeSkeletonAnimation.Initialize(false); @@ -72,6 +93,28 @@ namespace Spine.Unity.Examples { if (animationName != "") runtimeSkeletonAnimation.AnimationState.SetAnimation(0, animationName, true); } - } + void InstantiateSkeletonGraphic () { + Canvas canvas = this.GetComponentInChildren(); + Transform parent = canvas.transform; + + runtimeSkeletonGraphic = SkeletonGraphic.NewSkeletonGraphicGameObject(runtimeSkeletonDataAsset, parent, skeletonGraphicMaterial); + runtimeSkeletonGraphic.name = "SkeletonGraphic Instance"; + + if (blendModeMaterials) { + runtimeSkeletonGraphic.allowMultipleCanvasRenderers = true; + runtimeSkeletonGraphic.additiveMaterial = graphicBlendModeMaterials.additiveTemplate; + runtimeSkeletonGraphic.multiplyMaterial = graphicBlendModeMaterials.multiplyTemplate; + runtimeSkeletonGraphic.screenMaterial = graphicBlendModeMaterials.screenTemplate; + } + + // additional initialization + runtimeSkeletonGraphic.Initialize(false); + if (skinName != "") + runtimeSkeletonGraphic.Skeleton.SetSkin(skinName); + runtimeSkeletonGraphic.Skeleton.SetSlotsToSetupPose(); + if (animationName != "") + runtimeSkeletonGraphic.AnimationState.SetAnimation(0, animationName, true); + } + } } diff --git a/spine-unity/Assets/Spine Examples/package.json b/spine-unity/Assets/Spine Examples/package.json index e6d9c0d53..71b12aebb 100644 --- a/spine-unity/Assets/Spine Examples/package.json +++ b/spine-unity/Assets/Spine Examples/package.json @@ -2,7 +2,7 @@ "name": "com.esotericsoftware.spine.spine-unity-examples", "displayName": "spine-unity Runtime Examples", "description": "This plugin provides example scenes and scripts for the spine-unity runtime.", - "version": "4.2.32", + "version": "4.2.33", "unity": "2018.3", "author": { "name": "Esoteric Software", diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/BlendModeMaterialsUtility.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/BlendModeMaterialsUtility.cs index 2cb24f730..8f920da52 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/BlendModeMaterialsUtility.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/BlendModeMaterialsUtility.cs @@ -37,25 +37,19 @@ using UnityEditor; using UnityEngine; namespace Spine.Unity.Editor { + using TemplateMaterials = BlendModeMaterials.TemplateMaterials; public class BlendModeMaterialsUtility { - public const string MATERIAL_SUFFIX_MULTIPLY = "-Multiply"; - public const string MATERIAL_SUFFIX_SCREEN = "-Screen"; - public const string MATERIAL_SUFFIX_ADDITIVE = "-Additive"; + public const string MATERIAL_SUFFIX_MULTIPLY = BlendModeMaterials.MATERIAL_SUFFIX_MULTIPLY; + public const string MATERIAL_SUFFIX_SCREEN = BlendModeMaterials.MATERIAL_SUFFIX_SCREEN; + public const string MATERIAL_SUFFIX_ADDITIVE = BlendModeMaterials.MATERIAL_SUFFIX_ADDITIVE; #if UPGRADE_ALL_BLEND_MODE_MATERIALS public const bool ShallUpgradeBlendModeMaterials = true; #else public const bool ShallUpgradeBlendModeMaterials = false; #endif - - protected class TemplateMaterials { - public Material multiplyTemplate; - public Material screenTemplate; - public Material additiveTemplate; - }; - public static void UpgradeBlendModeMaterials (SkeletonDataAsset skeletonDataAsset) { SkeletonData skeletonData = skeletonDataAsset.GetSkeletonData(true); if (skeletonData == null) @@ -158,72 +152,11 @@ namespace Spine.Unity.Editor { protected static bool CreateAndAssignMaterials (SkeletonDataAsset skeletonDataAsset, TemplateMaterials templateMaterials, ref bool anyReplacementMaterialsChanged) { - bool anyCreationFailed = false; - BlendModeMaterials blendModeMaterials = skeletonDataAsset.blendModeMaterials; - bool applyAdditiveMaterial = blendModeMaterials.applyAdditiveMaterial; - - List skinEntries = new List(); - - SpineEditorUtilities.ClearSkeletonDataAsset(skeletonDataAsset); - skeletonDataAsset.isUpgradingBlendModeMaterials = true; - SkeletonData skeletonData = skeletonDataAsset.GetSkeletonData(true); - - SlotData[] slotsItems = skeletonData.Slots.Items; - for (int slotIndex = 0, slotCount = skeletonData.Slots.Count; slotIndex < slotCount; slotIndex++) { - SlotData slot = slotsItems[slotIndex]; - if (slot.BlendMode == BlendMode.Normal) continue; - if (!applyAdditiveMaterial && slot.BlendMode == BlendMode.Additive) continue; - - List replacementMaterials = null; - Material materialTemplate = null; - string materialSuffix = null; - switch (slot.BlendMode) { - case BlendMode.Multiply: - replacementMaterials = blendModeMaterials.multiplyMaterials; - materialTemplate = templateMaterials.multiplyTemplate; - materialSuffix = MATERIAL_SUFFIX_MULTIPLY; - break; - case BlendMode.Screen: - replacementMaterials = blendModeMaterials.screenMaterials; - materialTemplate = templateMaterials.screenTemplate; - materialSuffix = MATERIAL_SUFFIX_SCREEN; - break; - case BlendMode.Additive: - replacementMaterials = blendModeMaterials.additiveMaterials; - materialTemplate = templateMaterials.additiveTemplate; - materialSuffix = MATERIAL_SUFFIX_ADDITIVE; - break; - } - - skinEntries.Clear(); - foreach (Skin skin in skeletonData.Skins) - skin.GetAttachments(slotIndex, skinEntries); - - foreach (Skin.SkinEntry entry in skinEntries) { - IHasTextureRegion renderableAttachment = entry.Attachment as IHasTextureRegion; - if (renderableAttachment != null) { - AtlasRegion originalRegion = (AtlasRegion)renderableAttachment.Region; - if (originalRegion != null) { - anyCreationFailed |= CreateForRegion( - ref replacementMaterials, ref anyReplacementMaterialsChanged, - originalRegion, materialTemplate, materialSuffix, skeletonDataAsset); - } else { - Sequence sequence = renderableAttachment.Sequence; - if (sequence != null && sequence.Regions != null) { - for (int i = 0, count = sequence.Regions.Length; i < count; ++i) { - originalRegion = (AtlasRegion)sequence.Regions[i]; - anyCreationFailed |= CreateForRegion( - ref replacementMaterials, ref anyReplacementMaterialsChanged, - originalRegion, materialTemplate, materialSuffix, skeletonDataAsset); - } - } - } - } - } - } - skeletonDataAsset.isUpgradingBlendModeMaterials = false; - EditorUtility.SetDirty(skeletonDataAsset); - return !anyCreationFailed; + return BlendModeMaterials.CreateAndAssignMaterials(skeletonDataAsset, + templateMaterials, ref anyReplacementMaterialsChanged, + SpineEditorUtilities.ClearSkeletonDataAsset, + EditorUtility.SetDirty, + CreateForRegion); } protected static bool CreateForRegion (ref List replacementMaterials, diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/BlendModeMaterials.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/BlendModeMaterials.cs index 8ecf4d1da..94bcb7893 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/BlendModeMaterials.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/BlendModeMaterials.cs @@ -37,6 +37,10 @@ namespace Spine.Unity { [System.Serializable] public class BlendModeMaterials { + public const string MATERIAL_SUFFIX_MULTIPLY = "-Multiply"; + public const string MATERIAL_SUFFIX_SCREEN = "-Screen"; + public const string MATERIAL_SUFFIX_ADDITIVE = "-Additive"; + [System.Serializable] public class ReplacementMaterial { public string pageName; @@ -66,6 +70,7 @@ namespace Spine.Unity { public void TransferSettingsFrom (BlendModeMaterialsAsset modifierAsset) { applyAdditiveMaterial = modifierAsset.applyAdditiveMaterial; } +#endif public bool UpdateBlendmodeMaterialsRequiredState (SkeletonData skeletonData) { requiresBlendModeMaterials = false; @@ -92,7 +97,146 @@ namespace Spine.Unity { } return false; } -#endif + + [System.Serializable] + public class TemplateMaterials { + public Material additiveTemplate; + public Material multiplyTemplate; + public Material screenTemplate; + }; + + public delegate bool CreateForRegionDelegate (ref List replacementMaterials, + ref bool anyReplacementMaterialsChanged, + AtlasRegion originalRegion, Material materialTemplate, string materialSuffix, + SkeletonDataAsset skeletonDataAsset); + + public static bool CreateAndAssignMaterials (SkeletonDataAsset skeletonDataAsset, + TemplateMaterials templateMaterials, ref bool anyReplacementMaterialsChanged) { + + return CreateAndAssignMaterials(skeletonDataAsset, + templateMaterials, ref anyReplacementMaterialsChanged, + (asset) => { asset.Clear(); }, null, CreateForRegion); + } + + public static bool CreateAndAssignMaterials (SkeletonDataAsset skeletonDataAsset, + TemplateMaterials templateMaterials, ref bool anyReplacementMaterialsChanged, + System.Action clearSkeletonDataAssetFunc, + System.Action afterAssetModifiedFunc, + CreateForRegionDelegate createForRegionFunc) { + + bool anyCreationFailed = false; + BlendModeMaterials blendModeMaterials = skeletonDataAsset.blendModeMaterials; + bool applyAdditiveMaterial = blendModeMaterials.applyAdditiveMaterial; + + List skinEntries = new List(); + + clearSkeletonDataAssetFunc(skeletonDataAsset); + skeletonDataAsset.isUpgradingBlendModeMaterials = true; + SkeletonData skeletonData = skeletonDataAsset.GetSkeletonData(true); + + SlotData[] slotsItems = skeletonData.Slots.Items; + for (int slotIndex = 0, slotCount = skeletonData.Slots.Count; slotIndex < slotCount; slotIndex++) { + SlotData slot = slotsItems[slotIndex]; + if (slot.BlendMode == BlendMode.Normal) continue; + if (!applyAdditiveMaterial && slot.BlendMode == BlendMode.Additive) continue; + + List replacementMaterials = null; + Material materialTemplate = null; + string materialSuffix = null; + switch (slot.BlendMode) { + case BlendMode.Multiply: + replacementMaterials = blendModeMaterials.multiplyMaterials; + materialTemplate = templateMaterials.multiplyTemplate; + materialSuffix = MATERIAL_SUFFIX_MULTIPLY; + break; + case BlendMode.Screen: + replacementMaterials = blendModeMaterials.screenMaterials; + materialTemplate = templateMaterials.screenTemplate; + materialSuffix = MATERIAL_SUFFIX_SCREEN; + break; + case BlendMode.Additive: + replacementMaterials = blendModeMaterials.additiveMaterials; + materialTemplate = templateMaterials.additiveTemplate; + materialSuffix = MATERIAL_SUFFIX_ADDITIVE; + break; + } + + skinEntries.Clear(); + foreach (Skin skin in skeletonData.Skins) + skin.GetAttachments(slotIndex, skinEntries); + + foreach (Skin.SkinEntry entry in skinEntries) { + IHasTextureRegion renderableAttachment = entry.Attachment as IHasTextureRegion; + if (renderableAttachment != null) { + AtlasRegion originalRegion = (AtlasRegion)renderableAttachment.Region; + if (originalRegion != null) { + anyCreationFailed |= createForRegionFunc( + ref replacementMaterials, ref anyReplacementMaterialsChanged, + originalRegion, materialTemplate, materialSuffix, skeletonDataAsset); + } else { + Sequence sequence = renderableAttachment.Sequence; + if (sequence != null && sequence.Regions != null) { + for (int i = 0, count = sequence.Regions.Length; i < count; ++i) { + originalRegion = (AtlasRegion)sequence.Regions[i]; + anyCreationFailed |= createForRegionFunc( + ref replacementMaterials, ref anyReplacementMaterialsChanged, + originalRegion, materialTemplate, materialSuffix, skeletonDataAsset); + } + } + } + } + } + } + skeletonDataAsset.isUpgradingBlendModeMaterials = false; + if (afterAssetModifiedFunc != null) afterAssetModifiedFunc(skeletonDataAsset); + return !anyCreationFailed; + } + + protected static bool CreateForRegion (ref List replacementMaterials, + ref bool anyReplacementMaterialsChanged, + AtlasRegion originalRegion, Material materialTemplate, string materialSuffix, + SkeletonDataAsset skeletonDataAsset) { + + bool anyCreationFailed = false; + bool replacementExists = replacementMaterials.Exists( + replacement => replacement.pageName == originalRegion.page.name); + if (!replacementExists) { + BlendModeMaterials.ReplacementMaterial replacement = CreateReplacementMaterial(originalRegion, materialTemplate, materialSuffix); + if (replacement != null) { + replacementMaterials.Add(replacement); + anyReplacementMaterialsChanged = true; + } else { + Debug.LogError(string.Format("Failed creating blend mode Material for SkeletonData asset '{0}'," + + " atlas page '{1}', template '{2}'.", + skeletonDataAsset.name, originalRegion.page.name, materialTemplate.name), + skeletonDataAsset); + anyCreationFailed = true; + } + } + return anyCreationFailed; + } + + protected static BlendModeMaterials.ReplacementMaterial CreateReplacementMaterial ( + AtlasRegion originalRegion, Material materialTemplate, string materialSuffix) { + + BlendModeMaterials.ReplacementMaterial newReplacement = new BlendModeMaterials.ReplacementMaterial(); + AtlasPage originalPage = originalRegion.page; + Material originalMaterial = originalPage.rendererObject as Material; + + newReplacement.pageName = originalPage.name; + + Material blendModeMaterial = new Material(materialTemplate) { + name = originalMaterial.name + " " + materialTemplate.name, + mainTexture = originalMaterial.mainTexture + }; + newReplacement.material = blendModeMaterial; + + if (newReplacement.material) + return newReplacement; + else + return null; + } + public void ApplyMaterials (SkeletonData skeletonData) { if (skeletonData == null) throw new ArgumentNullException("skeletonData"); if (!requiresBlendModeMaterials) diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SkeletonDataAsset.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SkeletonDataAsset.cs index dfdad9838..8cc55179a 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SkeletonDataAsset.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SkeletonDataAsset.cs @@ -85,7 +85,8 @@ namespace Spine.Unity { } /// - /// Creates a runtime SkeletonDataAsset. + /// Creates a runtime SkeletonDataAsset. + /// If you require blend mode materials, call afterwards. public static SkeletonDataAsset CreateRuntimeInstance (TextAsset skeletonDataFile, AtlasAssetBase[] atlasAssets, bool initialize, float scale = 0.01f) { SkeletonDataAsset skeletonDataAsset = ScriptableObject.CreateInstance(); skeletonDataAsset.Clear(); @@ -98,6 +99,19 @@ namespace Spine.Unity { return skeletonDataAsset; } + + /// If this SkeletonDataAsset has been created via , + /// this method sets up blend mode materials for it. + public void SetupRuntimeBlendModeMaterials (bool applyAdditiveMaterial, + BlendModeMaterials.TemplateMaterials templateMaterials) { + blendModeMaterials.applyAdditiveMaterial = applyAdditiveMaterial; + blendModeMaterials.UpdateBlendmodeMaterialsRequiredState(GetSkeletonData(true)); + bool anyMaterialsChanged = false; + BlendModeMaterials.CreateAndAssignMaterials(this, templateMaterials, ref anyMaterialsChanged); + + Clear(); + GetSkeletonData(true); + } #endregion /// Clears the loaded SkeletonData and AnimationStateData. Use this to force a reload for the next time GetSkeletonData is called. diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SpineAtlasAsset.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SpineAtlasAsset.cs index 4206ed57d..a610292ea 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SpineAtlasAsset.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Asset Types/SpineAtlasAsset.cs @@ -78,10 +78,13 @@ namespace Spine.Unity { /// atlas asset JSON file. When procedurally creating textures, each Texture.name /// needs to be set to the atlas page texture filename without the .png extension, /// e.g. 'my_skeleton' if the png filename listed in the atlas asset file is 'my_skeleton.png'. + /// If true, newly created materials will be renamed to the atlas texture page name. + /// If false, the materials keep the name of the materialPropertySource material they are copied from. /// public static SpineAtlasAsset CreateRuntimeInstance (TextAsset atlasText, Texture2D[] textures, Material materialPropertySource, bool initialize, - Func newCustomTextureLoader = null) { + Func newCustomTextureLoader = null, + bool renameMaterial = false) { // Get atlas page names. string atlasString = atlasText.text; @@ -106,6 +109,8 @@ namespace Spine.Unity { // Match found. mat = new Material(materialPropertySource); mat.mainTexture = textures[j]; + if (renameMaterial) + mat.name = pageName; break; } } diff --git a/spine-unity/Assets/Spine/package.json b/spine-unity/Assets/Spine/package.json index 2b090cdbd..b641aaa91 100644 --- a/spine-unity/Assets/Spine/package.json +++ b/spine-unity/Assets/Spine/package.json @@ -2,7 +2,7 @@ "name": "com.esotericsoftware.spine.spine-unity", "displayName": "spine-unity Runtime", "description": "This plugin provides the spine-unity runtime core.", - "version": "4.2.67", + "version": "4.2.68", "unity": "2018.3", "author": { "name": "Esoteric Software",