Search Unity

[RELEASED] Mesh Combine Studio 2 (Boost Performance)

Discussion in 'Assets and Asset Store' started by eagle555, Oct 24, 2017.

  1. EdwinLyons

    EdwinLyons

    Joined:
    Oct 4, 2012
    Posts:
    84
    Hi Nathaniel,

    We've just updated to your latest version of MCS. We've done this primarily for the fix for the game hanging about 1 in 5 times when combining meshes - which I hope is fixed.

    The changes introduced in this version cause some issues for us, primarily the change to how LodGroups are handled.

    Previously it was possible to have one LodGroup, with items in that LodGroup that either matched or didn't match the combining criteria. For example, we have a single LodGroup that contains some items that are to be combined, some that aren't, and some get combined by a different MCS instance that has different output settings (shadows etc).

    This all worked fine in the previous version (baring the bug I reported to you via email, which is resolved in this update).

    In this update, the system has been changed so that now the LodGroup is the thing that has to match the search criteria, rather than the renderers themselves. This means that in our situation, MCS ignores our LodGroup (it doesn't match) but applies itself to the renderers inside the LodGroup. This has the nasty effect of both breaking LODing, and combing together meshes from multiple LOD levels, leading to nasty texture fighting (and many extra triangles being rendered).

    I believe I've fixed this for our use case by:

    Removing this condition from ValidObject:
    Code (CSharp):
    1. if (objectType != ObjectType.LodRenderer)
    along with the block starting:
    Code (CSharp):
    1. if (objectType != ObjectType.LodGroup)
    And changing this line in AddLodGroups:
    Code (CSharp):
    1. if (ValidObject(lodGroup.transform, ObjectType.LodGroup, useSearchOptions, ref cachedGODummy) != 1) continue;
    to:
    Code (CSharp):
    1. if (searchOptions.onlyActive && !lodGroup.gameObject.activeInHierarchy) continue;
    This approximately changes the system to work as it worked before - and this works for us.

    I do think this behaviour makes more sense, as otherwise you have to create a LodGroup for each search criteria you want to have. Certainly if you're going to ignore a LodGroup based on search criteria you should also ignore any renderers that it affects or you'll get very undesirable results.
     
    Weblox likes this.
  2. EdwinLyons

    EdwinLyons

    Joined:
    Oct 4, 2012
    Posts:
    84
    @eagle555 I haven't yet got to the bottom of it, but updating to the latest version introduces a big memory issue in our project. I'm fairly confident that this is caused by HasArray in MeshCombineJobManager being called more times than before. This function allocates quite a lot of memory (depending on the input) - potentially up to a 2MB each time it is called as it allocates a fixed array of 65534 items which may be Vector4s.

    In the previous version of MCS, this array is allocated 14 times for one of our scenes. In the new version it's allocated 194 times. This is causing the device to run out of memory.

    I'm going to continue investigating (as it's probably faster than waiting for a reply).
     
  3. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Thanks for reporting both issues. I changed the LodGroup because someone reporter the previous behavior as wrong, which I thought he was right. Can you still get it to work like you want with this in fixed state? Or you need the previous behavior?
    As for the memory increases, the arrays should be pooled, think this broke.

    It's a bit late here, but I will take a look at it tomorrow morning and upload the fixes for it.
     
  4. EdwinLyons

    EdwinLyons

    Joined:
    Oct 4, 2012
    Posts:
    84
    Hi @eagle555. Thanks for your reply.

    Regarding the LodGroup issue: I'd say the old behaviour is preferable for us, though I can see arguments for both. Maybe an 'apply filters to LodGroups' tick box that switches between the two behaviours would be useful.

    I definitely think that the new behaviour is broken though, in that it will combine together objects that are inside LodGroups that have been filtered out, even those at different LOD levels.

    Regarding the memory issue: Thanks for looking into fixing this. I've spent all day trying to work it out. It definitely doesn't seem to pool the memory in a logical way, though I can't quite tell how it would be expected to as each NewMeshObject has as newMeshCache which can contain quite a number of these arrays. These NewMeshObjects seem to exist until the meshes are generated from them - and that happens after all the meshes have been generated if the CombineAtOnce flag is set (as it is in our case).

    But maybe I'm misunderstanding it!

    Either way, we'd really appreciate a fix for this soon as it's blocking us from releasing.
     
  5. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Yes I will make a LODGroup setting for both ways.

    When combining all at once and not using multi-threading it actually could use only 1 mesh-cache. I made the pooling system so it can use less memory then normally with combining. As when you apply e.g. the vertex array to Unity's Mesh API, the array needs to be of exact length. So would be unavoidable to create a new array for each mesh which would create garbage, but I found a way to trick Unity to think that the array length is matching. Something like Mesh.SetVertices(Vector3[] array, int startIndex, int length) would have been great.

    I don't like the Mesh.SetVertices(List<Vector3>) overload as Lists are 3x slower than arrays. In the recent update I included my FastList which basically is an unordered List, but you can access the array directly by List.items[index], instead of List[index]. This makes it as fast as an array, and removing elements is an O(1) operation as it replaces the removed element with the last element. E.g. also has a List.FastClear(), that only resets the List.Count, instead of clearing the array. E.g. for structs and value types it's a bit pointless and wasted time to clear the array. I use my FastList all over the place in our game.

    Can you send me a screenshot of your settings in the MCS Inspector with Job Settings and Runtime visible?
     
  6. EdwinLyons

    EdwinLyons

    Joined:
    Oct 4, 2012
    Posts:
    84
    Hi @eagle555 - I've emailed you some screenshots!
     
  7. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    I have it ready :) I'm glad you reported these issues as now I was able to improve the thread combining management a lot. Think it also shouldn't hang anymore.

    Mesh Combine Studio Update 2.05:
    (I submitted to the Asset Store)

    Features:

    • LOD Group search mode
    • Search option `Not` in components filters

    Fixes:
    • Mesh array pooling wasn't working correctly. Now it takes the least amount of memory possible.

    upload_2019-5-5_15-54-28.png

    You can see the amount of Mesh arrays used in `Mesh Arrays Cached`. It should only use 1 per thread now, for multi-threading it needs to use more because we want to combine on multiple threads at the same time to make it finish faster.

    Nathaniel
     

    Attached Files:

  8. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    I implemented your request in the 2.05 update^^^ ;)
     
    rattlesnake likes this.
  9. lod3

    lod3

    Joined:
    Mar 21, 2012
    Posts:
    679
    @eagle555

    From the 2.05 release notes, what does, "Mesh array pooling wasn’t working correctly. Now it takes the least amount of memory possible" mean exactly?
     
  10. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
  11. lod3

    lod3

    Joined:
    Mar 21, 2012
    Posts:
    679
    Gotcha. Is this for their specific use-case, or is this something that would benefit users in general?

    And one other question... I noticed when combining it keeps the mesh data contained in the scene file, and that saving the combine meshes would offload that (40MB scene vs. 4.5MB without MCS). Does saving these combined meshes give any kind of additional performance boost, or is it the same as if they were never saved?
     
  12. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    This fix benefits all users, it takes less memory to combine and creates less garbage.

    Yes if you combine in the Unity Editor the new combined meshes are stored in the Scene file. Saving the meshes in the project window makes them an Asset and then they are loaded from there. It doesn't make a difference in performance and also not in runtime memory used.
     
    twitchfactor likes this.
  13. lod3

    lod3

    Joined:
    Mar 21, 2012
    Posts:
    679
    Thank you!
     
  14. Weblox

    Weblox

    Joined:
    Apr 11, 2016
    Posts:
    277
    Hi @eagle555 - So MCS is working greatly in my Project. However, everytime Unity has to compile something (e.g. new scripts added) I am getting a bunch of Error - messages like this :

    NullReferenceException: Object reference not set to an instance of an object
    MeshCombineStudio.MeshCombineJobManager.ResetMeshCache () (at Assets/Addons/MCS/MeshCombineStudio/Scripts/Mesh/MeshCombineJobManager.cs:100)
    MeshCombineStudio.DetectMeshImportSettingsChange.OnPreprocessModel () (at Assets/Addons/MCS/MeshCombineStudio/Editor/DetectMeshImportSettingsChange.cs:18)
    System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)
    Rethrow as TargetInvocationException: Exception has been thrown by the target of an invocation.
    System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:232)
    System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MethodBase.cs:115)
    UnityEditor.AttributeHelper.InvokeMemberIfAvailable (System.Object target, System.String methodName, System.Object[] args) (at C:/buildslave/unity/build/Editor/Mono/AttributeHelper.cs:162)
    UnityEditor.AssetPostprocessingInternal.PreprocessMesh (System.String pathName) (at C:/buildslave/unity/build/Editor/Mono/AssetPostprocessor.cs:361)

    This occurs also, when working in Scenes that do not contain any MCS Elements. How can I fix this, plz?
     
  15. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Ah yes that happens if MCS is not in the Scene. Here's the fix for it. I also submitted it to the Asset Store.
     

    Attached Files:

    Weblox likes this.
  16. Weblox

    Weblox

    Joined:
    Apr 11, 2016
    Posts:
    277
  17. EdwinLyons

    EdwinLyons

    Joined:
    Oct 4, 2012
    Posts:
    84
    Just realised I forgot to say thanks to @eagle555 for producing the fix to the memory issue so quickly. It's resolved our issues and meant we can remove some custom patches to the code - thanks again!
     
  18. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    No prob, I'm glad that your issues are solved :) Should take even less memory than it was using before when the caching wasn't broken.

    P.s. feel free to leave a review...
     
  19. EdwinLyons

    EdwinLyons

    Joined:
    Oct 4, 2012
    Posts:
    84
    I've edited my previous review - you may want to edit your reply to it. Thanks again.
     
  20. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Thanks! I also modified my reply.
     
  21. lod3

    lod3

    Joined:
    Mar 21, 2012
    Posts:
    679
    @eagle555

    Curious... if I already have a working scene setup with MCS 1.16, would I gain anything by upgrading to 2.06? Only using basic combining, nothing fancy.
     
  22. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    You can see the changelog here what has been added:
    http://www.terraincomposer.com/mcs-release-notes/

    It's more bug free, has new settings and takes less memory for combining.
     
    hopeful likes this.
  23. Cyrill9

    Cyrill9

    Joined:
    Oct 7, 2016
    Posts:
    8
    Greetings!

    Planning to purchase the asset for its unique features, but have some questions on topics I found unclear:

    1) Does it remove the geometry below the terrain only for that cave and rocks asset you advertise MCS with, or it will work with any of my models I decide to throw onto the terrain (I know it might be a silly question but still unclear for me)

    2) Does it work with skinned meshes? For example I have a scene with some NPCs who are always present there, could MCS optimize them as well as static objects?

    3) (if you're familiar with sectr)
    I plan to purchase this along with Sectr ( https://assetstore.unity.com/packages/tools/terrain/sectr-complete-2019-144433 ), are there going to be any potential conflicts in terms of the systems both assets have to prevent the rendering of unnecessary meshes?
     
  24. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Hello!

    1) MCS can remove geometry of any mesh below a surface (with or without collider) and backfacing triangles (where you can divine camera can go with a cubic range or direction). What the MCS Caves & Overhangs does is removing geometry of overlapping meshes, with the requirement that these meshes need to be closed.

    2) It doesn't work with skinned meshes.

    3). MCS is perfect for usage with Sectr and WorldStreamer because it combines meshes cell based and those assets use cell based loading / unloading.
     
    hopeful likes this.
  25. Cyrill9

    Cyrill9

    Joined:
    Oct 7, 2016
    Posts:
    8
    Thank you for the answers. Kinda sad that skinned meshes aren't supported, but for the price you're asking the functionality is more than justified.

    Do you have any future plans to include the support for the skinned meshes, as part of MCS or as a separate extension asset?
     
    Last edited: May 10, 2019
  26. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Yes skinned meshes and atlassing are one the roadmap.
     
    Weblox and AthrunVLokiz like this.
  27. rattlesnake

    rattlesnake

    Joined:
    Jul 18, 2013
    Posts:
    138
    I'm unsure of a thing, does it keeps the instances or does it break them when combined ?
     
  28. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    You mean GPU Instancing? As you can either use one of the 2, combining or GPU Instancing. As GPU Instancing instances the same mesh many times. Each combined mesh is different...
     
    rattlesnake likes this.
  29. HeadClot88

    HeadClot88

    Joined:
    Jul 3, 2012
    Posts:
    736
  30. mfleurent

    mfleurent

    Joined:
    Mar 5, 2015
    Posts:
    25
    it work for me
     
  31. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    This should work fine. Maybe it's your firewall / virus-scanner that blocks it?
     
  32. HeadClot88

    HeadClot88

    Joined:
    Jul 3, 2012
    Posts:
    736
    Just found out my ISP is having issues. So that is more than likely the cause.
     
  33. adslitw

    adslitw

    Joined:
    Aug 23, 2012
    Posts:
    275
    Hi,

    I've just started with this asset and have immediately hit a couple of issues:

    1. When using the terrain as a surface layer mask, some tris above ground are randomly being removed. EDIT: Fixed this one. That object was accidentally also assigned to the 'terrain' layer!
    upload_2019-6-17_13-41-30.png

    2. When copying lightmapping, some trees get messed up. EDIT: Something was clearly wrong with the UV2s for this model, because I turned on 'generate lightmap UVs' and it now all works as expected.
    upload_2019-6-17_13-41-54.png


    I'll leave this here in case anyone has similar issues. :)
     
    Last edited: Jun 17, 2019
  34. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    I'm glad you were able to solve both issues :)
     
  35. magique

    magique

    Joined:
    May 2, 2014
    Posts:
    4,030
    @eagle555 I have one question about usage that I have no idea how to do. To use MCS I have to turn off Unity's Static Batching. However, this is a global setting that affects all game scenes. What if I have a scene where MCS is not well-suited for and I want that one scene to use Unity's Static Batching? Is it possible to turn Unity's batching back on for when that scene is running and turn it back off for scenes that need it off?
     
  36. magique

    magique

    Joined:
    May 2, 2014
    Posts:
    4,030
    @eagle555 Did you miss my post above? This is the one thing that could potentially make MCS unusable for me. Otherwise it has been amazing and definitely a game change.
     
  37. zylazla

    zylazla

    Joined:
    Feb 28, 2013
    Posts:
    4
    Hey,
    I would like to use the MeshCombineStudio from editor script. I need exactly to realize such flow:
    1. Add MeshCombiner from the editor script.
    2. Combine meshes.
    3. Remove original components (e.g. MeshRenderers, MeshFilter).
    4. Remove MeshCombiner.

    Is it possible?
     
  38. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Sorry for the delayed reply. You don't need to turn off static batching, only make sure the static flags of the static meshes you combine are not set to "Batching Static".
     
  39. magique

    magique

    Joined:
    May 2, 2014
    Posts:
    4,030
    Oh, how simple. I had no idea. Thank you very much. That will help immensely.
     
  40. ResideSin

    ResideSin

    Joined:
    Apr 18, 2019
    Posts:
    5
    After combining.. Trees & vegetation start to float.. any idea.. what may cause it ?
     
    Last edited: Jun 24, 2019
  41. kingstone426

    kingstone426

    Joined:
    Jun 21, 2013
    Posts:
    44
    Hi I am running into an UnassignedReferenceException when trying to combine meshes. Does anyone know what's wrong?

    Code (CSharp):
    1. Mesh Combine Studio error -> UnityEngine.UnassignedReferenceException: The variable mr of CachedComponents has not been assigned.
    2. You probably need to assign the mr variable of the CachedComponents script in the inspector.
    3.   at (wrapper managed-to-native) UnityEngine.Renderer.SetMaterial(UnityEngine.Renderer,UnityEngine.Material)
    4.   at UnityEngine.Renderer.set_sharedMaterial (UnityEngine.Material value) [0x00003] in C:\buildslave\unity\build\Runtime\Export\Graphics\GraphicsRenderers.bindings.cs:140
    5.   at MeshCombineStudio.MeshCombineJobManager+NewMeshObject.CreateMesh () [0x00471] in C:\Users\Toddy\plastic\switchcraft\Assets\MeshCombineStudio\Scripts\Mesh\MeshCombineJobManager.cs:1162
    6.   at MeshCombineStudio.MeshCombineJobManager.CombineMeshesDone (MeshCombineStudio.MeshCombineJobManager+MeshCombineJobsThread meshCombineJobThread) [0x00068] in C:\Users\Toddy\plastic\switchcraft\Assets\MeshCombineStudio\Scripts\Mesh\MeshCombineJobManager.cs:474
    7. UnityEngine.Debug:LogError(Object)
    8. MeshCombineStudio.MeshCombineJobManager:CombineMeshesDone(MeshCombineJobsThread) (at Assets/MeshCombineStudio/Scripts/Mesh/MeshCombineJobManager.cs:484)
    9. MeshCombineStudio.MeshCombineJobManager:ExecuteJobs() (at Assets/MeshCombineStudio/Scripts/Mesh/MeshCombineJobManager.cs:439)
    10. MeshCombineStudio.MeshCombiner:CombineAll() (at Assets/MeshCombineStudio/Scripts/Mesh/MeshCombiner.cs:506)
    11. MeshCombineStudio.MeshCombinerEditor:OnInspectorGUI() (at Assets/MeshCombineStudio/Editor/MeshCombinerEditor.cs:320)
    12. UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
    13.  
    Here are my settings:

    upload_2019-6-25_11-24-32.png
     
  42. CurseDeReaper93

    CurseDeReaper93

    Joined:
    Apr 8, 2018
    Posts:
    1
    I have a similar problems with my Billboards made with Amplify Imposter.
    I guess the Tool isn't working with Billboards. I'll try to exclude the Billboards by putting them on an extra layer. But I guess by deactivating the LOD groups it won't help.
    Or has anyone else an Idea on how to include billboards?
     
  43. EdwinLyons

    EdwinLyons

    Joined:
    Oct 4, 2012
    Posts:
    84
    Billboards (or anything else that moves) can't be batched. You'll need to exclude them from batching using layers. Unity's dynamic batching may be able to batch them for you though.
     
  44. ResideSin

    ResideSin

    Joined:
    Apr 18, 2019
    Posts:
    5
    Got a question regarding combining..
    If after combining.. during runtime client launch. .i will see great FPS performance increase.

    If i build client..
    then FPS is again crappy..
    for built client.. should i re-enable unity static/dynamic batching.. Or i have to save those "prefabs" and use them.. to get same performance in built client ?
     
  45. HenryChinaski

    HenryChinaski

    Joined:
    Jul 9, 2013
    Posts:
    108
    Hi,
    I bought MeshCombineStudio a while ago and it never really worked for me.
    I was glad seeing that support is back again, but unfortunately - after removing the asset and installing it updated - I get an error whenever I click on the combine button:


    Mesh Combine Studio thread error -> System.IndexOutOfRangeException: Index was outside the bounds of the array.
    at MeshCombineStudio.MeshCombineJobManager+NewMeshObject.Combine (MeshCombineStudio.MeshCombineJobManager+MeshCombineJob meshCombineJob) [0x00471] in J:\...\Assets\MeshCombineStudio\Scripts\Mesh\MeshCombineJobManager.cs:766
    at MeshCombineStudio.MeshCombineJobManager+MeshCombineJobsThread.ExecuteJobsThread (System.Object state) [0x000b0] in J:\...\Assets\MeshCombineStudio\Scripts\Mesh\MeshCombineJobManager.cs:567
    UnityEngine.Debug:LogError(Object)
    MeshCombineStudio.MeshCombineJobsThread:ExecuteJobsThread(Object) (at Assets/MeshCombineStudio/Scripts/Mesh/MeshCombineJobManager.cs:590)
    System.Threading._ThreadPoolWaitCallback:PerformWaitCallback()


    Any idea what the problem is?
     
  46. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    In general MCS is not meant to combine trees and vegetation unless they are low poly meshes. However is some cases it might work. Can you give me more details on which objects you are combining?
     
  47. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Can you give more info on what kind of objects you are trying to combine?
     
  48. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    The fps in a build should be a bit better than in Unity runtime. If it works at Unity runtime it should work the same in the build. What is important is not to use any static batching on what MCS combined (no static batching flag should be assigned to MCS created GameObjects), as that would mean double combining which would break it.

    Can you give more details on what you combine and performance before/after and in build?
     
  49. eagle555

    eagle555

    Joined:
    Aug 28, 2011
    Posts:
    2,705
    Can you give more info on what you are trying to combine?
     
  50. Keaneo

    Keaneo

    Joined:
    Mar 7, 2015
    Posts:
    99
    Hi,
    I have a prefab that is instantiated at runtime and contains a repeated grid of a single LOD model, which I'd like to combine with MCS. I added the MCS prefab as a child of my prefab and configured search, etc. (hopefully I can do this inside a prefab as opposed to inside a whole scene?)

    A few questions:

    1) If I try to search and combine the mesh in the editor, the changes don't persist. i.e. it shows me stats on the performance increase and seems to generate new meshes, but if I apply then prefab, delete the prefab from the scene then drag it back in, the "combined" models don't appear (and the original have been disabled of course).
    2) I can fix the issue above by selecting "combine in runtime". However, when I run the game I get the same 4 errors repeated 100s of times i.e.:

    RuntimeNavMeshBuilder: Source mesh PillarBand1 does not allow read access. This will work in playmode in the editor but not in player
    UnityEngine.AI.NavMeshSurface:BuildNavMesh()
    DunGen.Adapters.UnityNavMeshAdapter:Generate(Dungeon) (at Assets/DunGen/Integration/Unity NavMesh/UnityNavMeshAdapter.cs:78)
    DunGen.Adapters.NavMeshAdapter:Run(DungeonGenerator) (at Assets/DunGen/Code/Adapters/NavMeshAdapter.cs:26)
    DunGen.Adapters.BaseAdapter:OnPostProcess(DungeonGenerator) (at Assets/DunGen/Code/Adapters/BaseAdapter.cs:39)
    DunGen.<PostProcess>c__Iterator4:MoveNext() (at Assets/DunGen/Code/DungeonGenerator.cs:1037)
    UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

    This is then repeated for PillarBand2/3/4. Weirdly, the "PillarBand" things are MATERIALS on my object, not meshes.

    I've ensured that the original imported object has "Read/Write enabled" set to true in the editor.

    Any ideas?
    Thanks!