diff --git a/.gitignore b/.gitignore
index e8f2f54b..59d98ef3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,405 +1,58 @@
-## Ignores added manually
-
-# NuGet commandline
-nuget.exe
-
-
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-##
-## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
-
-# User-specific files
-*.rsuser
-*.suo
-*.user
-*.userosscache
-*.sln.docstates
-
-# User-specific files (MonoDevelop/Xamarin Studio)
-*.userprefs
-
-# Mono auto generated files
-mono_crash.*
-
-# Build results
-[Dd]ebug/
-[Dd]ebugPublic/
-[Rr]elease/
-[Rr]eleases/
-x64/
-x86/
-[Ww][Ii][Nn]32/
-[Aa][Rr][Mm]/
-[Aa][Rr][Mm]64/
-bld/
-[Bb]in/
+[Ll]ibrary/
+[Tt]emp/
 [Oo]bj/
-[Ll]og/
-[Ll]ogs/
-
-# Visual Studio 2015/2017 cache/options directory
-.vs/
-# Uncomment if you have tasks that create the project's static files in wwwroot
-#wwwroot/
-
-# Visual Studio 2017 auto generated files
-Generated\ Files/
+[Bb]uild/
+[Bb]uilds/
+[Mm]aps/
+[Rr]esults/
+Assets/AssetStoreTools* 
+ 
+ 
+# Visual Studio cache directory 
+.vs/ 
+ 
+ 
+# Autogenerated VS/MD/Consulo solution and project files 
+ExportedObj/ 
+.consulo/ 
+*.csproj 
+*.unityproj 
+*.sln 
+*.suo 
+*.tmp 
+*.user 
+*.userprefs 
+*.pidb 
+*.booproj 
+*.svd 
+*.pdb 
+*.opendb 
+*.log
+*.tlog
 
-# MSTest test Results
-[Tt]est[Rr]esult*/
-[Bb]uild[Ll]og.*
 
-# NUnit
-*.VisualState.xml
-TestResult.xml
-nunit-*.xml
+# Unity3D generated meta files 
+*.pidb.meta 
+*.pdb.meta 
 
-# Build Results of an ATL Project
-[Dd]ebugPS/
-[Rr]eleasePS/
-dlldata.c
 
-# Benchmark Results
-BenchmarkDotNet.Artifacts/
 
-# .NET Core
-project.lock.json
-project.fragment.lock.json
-artifacts/
+# Unity3D Generated File On Crash Reports 
+sysinfo.txt 
 
-# ASP.NET Scaffolding
-ScaffoldingReadMe.txt
+# Extra removed from native code at Saab
+Assets/Plugins/*
 
-# StyleCop
-StyleCopReport.xml
 
-# Files built by Visual Studio
-*_i.c
-*_p.c
-*_h.h
-*.ilk
-*.meta
+# Builds 
+*.apk 
+Logs/
 *.obj
+*.exp
 *.iobj
-*.pch
-*.pdb
 *.ipdb
-*.pgc
-*.pgd
-*.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.tmp_proj
-*_wpftmp.csproj
-*.log
-*.tlog
-*.vspscc
-*.vssscc
-.builds
-*.pidb
-*.svclog
-*.scc
-
-# Chutzpah Test files
-_Chutzpah*
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opendb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
-
-# Visual Studio profiler
-*.psess
-*.vsp
-*.vspx
-*.sap
-
-# Visual Studio Trace Files
-*.e2e
-
-# TFS 2012 Local Workspace
-$tf/
-
-# Guidance Automation Toolkit
-*.gpState
-
-# ReSharper is a .NET coding add-in
-_ReSharper*/
-*.[Rr]e[Ss]harper
-*.DotSettings.user
-
-# TeamCity is a build add-in
-_TeamCity*
-
-# DotCover is a Code Coverage Tool
-*.dotCover
-
-# AxoCover is a Code Coverage Tool
-.axoCover/*
-!.axoCover/settings.json
-
-# Coverlet is a free, cross platform Code Coverage Tool
-coverage*.json
-coverage*.xml
-coverage*.info
-
-# Visual Studio code coverage results
-*.coverage
-*.coveragexml
-
-# NCrunch
-_NCrunch_*
-.*crunch*.local.xml
-nCrunchTemp_*
-
-# MightyMoose
-*.mm.*
-AutoTest.Net/
-
-# Web workbench (sass)
-.sass-cache/
-
-# Installshield output folder
-[Ee]xpress/
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish/
-
-# Publish Web Output
-*.[Pp]ublish.xml
-*.azurePubxml
-# Note: Comment the next line if you want to checkin your web deploy settings,
-# but database connection strings (with potential passwords) will be unencrypted
-*.pubxml
-*.publishproj
-
-# Microsoft Azure Web App publish settings. Comment the next line if you want to
-# checkin your Azure Web App publish settings, but sensitive information contained
-# in these scripts will be unencrypted
-PublishScripts/
-
-# NuGet Packages
-*.nupkg
-# NuGet Symbol Packages
-*.snupkg
-# The packages folder can be ignored because of Package Restore
-**/[Pp]ackages/*
-# except build/, which is used as an MSBuild target.
-!**/[Pp]ackages/build/
-# Uncomment if necessary however generally it will be regenerated when needed
-#!**/[Pp]ackages/repositories.config
-# NuGet v3's project.json files produces more ignorable files
-*.nuget.props
-*.nuget.targets
-
-# Microsoft Azure Build Output
-csx/
-*.build.csdef
-
-# Microsoft Azure Emulator
-ecf/
-rcf/
-
-# Windows Store app package directories and files
-AppPackages/
-BundleArtifacts/
-Package.StoreAssociation.xml
-_pkginfo.txt
-*.appx
-*.appxbundle
-*.appxupload
-
-# Visual Studio cache files
-# files ending in .cache can be ignored
-*.[Cc]ache
-# but keep track of directories ending in .cache
-!?*.[Cc]ache/
-
-# Others
-ClientBin/
-~$*
-*~
-*.dbmdl
-*.dbproj.schemaview
-*.jfm
-*.pfx
-*.publishsettings
-orleans.codegen.cs
-
-# Including strong name files can present a security risk
-# (https://github.com/github/gitignore/pull/2483#issue-259490424)
-#*.snk
-
-# Since there are multiple workflows, uncomment next line to ignore bower_components
-# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
-#bower_components/
-
-# RIA/Silverlight projects
-Generated_Code/
-
-# Backup & report files from converting an old project file
-# to a newer Visual Studio version. Backup files are not needed,
-# because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
-UpgradeLog*.htm
-ServiceFabricBackup/
-*.rptproj.bak
-
-# SQL Server files
-*.mdf
-*.ldf
-*.ndf
-
-# Business Intelligence projects
-*.rdl.data
-*.bim.layout
-*.bim_*.settings
-*.rptproj.rsuser
-*- [Bb]ackup.rdl
-*- [Bb]ackup ([0-9]).rdl
-*- [Bb]ackup ([0-9][0-9]).rdl
-
-# Microsoft Fakes
-FakesAssemblies/
-
-# GhostDoc plugin setting file
-*.GhostDoc.xml
-
-# Node.js Tools for Visual Studio
-.ntvs_analysis.dat
-node_modules/
-
-# Visual Studio 6 build log
-*.plg
-
-# Visual Studio 6 workspace options file
-*.opt
-
-# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
-*.vbw
-
-# Visual Studio 6 auto-generated project file (contains which files were open etc.)
-*.vbp
-
-# Visual Studio 6 workspace and project file (working project files containing files to include in project)
-*.dsw
-*.dsp
-
-# Visual Studio 6 technical files
-*.ncb
-*.aps
-
-# Visual Studio LightSwitch build output
-**/*.HTMLClient/GeneratedArtifacts
-**/*.DesktopClient/GeneratedArtifacts
-**/*.DesktopClient/ModelManifest.xml
-**/*.Server/GeneratedArtifacts
-**/*.Server/ModelManifest.xml
-_Pvt_Extensions
-
-# Paket dependency manager
-.paket/paket.exe
-paket-files/
-
-# FAKE - F# Make
-.fake/
-
-# CodeRush personal settings
-.cr/personal
-
-# Python Tools for Visual Studio (PTVS)
-__pycache__/
-*.pyc
-
-# Cake - Uncomment if you are using it
-# tools/**
-# !tools/packages.config
-
-# Tabs Studio
-*.tss
-
-# Telerik's JustMock configuration file
-*.jmconfig
-
-# BizTalk build output
-*.btp.cs
-*.btm.cs
-*.odx.cs
-*.xsd.cs
-
-# OpenCover UI analysis results
-OpenCover/
-
-# Azure Stream Analytics local run output
-ASALocalRun/
-
-# MSBuild Binary and Structured Log
-*.binlog
-
-# NVidia Nsight GPU debugger configuration file
-*.nvuser
-
-# MFractors (Xamarin productivity tool) working folder
-.mfractor/
-
-# Local History for Visual Studio
-.localhistory/
-
-# Visual Studio History (VSHistory) files
-.vshistory/
-
-# BeatPulse healthcheck temp database
-healthchecksdb
-
-# Backup folder for Package Reference Convert tool in Visual Studio 2017
-MigrationBackup/
-
-# Ionide (cross platform F# VS Code tools) working folder
-.ionide/
-
-# Fody - auto-generated XML schema
-FodyWeavers.xsd
-
-# VS Code files for those working on multiple tools
-.vscode/*
-!.vscode/settings.json
-!.vscode/tasks.json
-!.vscode/launch.json
-!.vscode/extensions.json
-*.code-workspace
-
-# Local History for Visual Studio Code
-.history/
-
-# Windows Installer files from build outputs
-*.cab
-*.msi
-*.msix
-*.msm
-*.msp
-
-# JetBrains Rider
-*.sln.iml
-*.original
+[Tt]ools/*/*.lib
+[Tt]ools/*/*.txt
+*.recipe
+crossboard_res - FULL.gzd
+Assets/TextMesh Pro/
diff --git a/.tfignore b/.tfignore
new file mode 100644
index 00000000..b949d8cf
--- /dev/null
+++ b/.tfignore
@@ -0,0 +1,24 @@
+!*.meta
+*.csproj
+*.sln
+mcs.rsp
+mcs.rsp.meta
+csc.rsp
+csc.rsp.meta
+Library\
+Temp\
+Plugins\
+Plugins.meta
+Saab\
+Saab.meta
+Maps\
+Maps.meta
+Results\
+Results.meta
+AssetBundles\
+Shaders\
+Shaders.meta
+AssetStore
+AssetStore.meta
+Resources\
+Resources.meta
\ No newline at end of file
diff --git a/projects/com.saab.map-streamer/.vsconfig b/.vsconfig
similarity index 74%
rename from projects/com.saab.map-streamer/.vsconfig
rename to .vsconfig
index d70cd98b..1586a483 100644
--- a/projects/com.saab.map-streamer/.vsconfig
+++ b/.vsconfig
@@ -1,6 +1,6 @@
-﻿{
+{
   "version": "1.0",
-  "components": [
+  "components": [ 
     "Microsoft.VisualStudio.Workload.ManagedGame"
   ]
-}
+} 
diff --git a/com.saab.map-streamer/Plugins/Debug.meta b/Assets/Images.meta
similarity index 77%
rename from com.saab.map-streamer/Plugins/Debug.meta
rename to Assets/Images.meta
index 64d16039..5c7f4f86 100644
--- a/com.saab.map-streamer/Plugins/Debug.meta
+++ b/Assets/Images.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 9c079d27d9988cd4e8ddfc075643cf0e
+guid: c1d4a62236306de44b8960aa46a953b2
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/Assets/Images/Explosion.tif b/Assets/Images/Explosion.tif
new file mode 100644
index 00000000..b2548d88
Binary files /dev/null and b/Assets/Images/Explosion.tif differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Color.jpg.meta b/Assets/Images/Explosion.tif.meta
similarity index 98%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Color.jpg.meta
rename to Assets/Images/Explosion.tif.meta
index 7266a31e..0fe9e204 100644
--- a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Color.jpg.meta
+++ b/Assets/Images/Explosion.tif.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 99dc2de5da65a8c4d9b1acd47402c399
+guid: f3e68c77dcb7aa3479485f1680685ef2
 TextureImporter:
   internalIDToNameTable: []
   externalObjects: {}
diff --git a/Assets/Images/Saab_Technologies_logo.png b/Assets/Images/Saab_Technologies_logo.png
new file mode 100644
index 00000000..af540847
Binary files /dev/null and b/Assets/Images/Saab_Technologies_logo.png differ
diff --git a/Assets/Images/Saab_Technologies_logo.png.meta b/Assets/Images/Saab_Technologies_logo.png.meta
new file mode 100644
index 00000000..a532b13f
--- /dev/null
+++ b/Assets/Images/Saab_Technologies_logo.png.meta
@@ -0,0 +1,91 @@
+fileFormatVersion: 2
+guid: 7c1783e4ce534fe4fb9f1ee3cb1cbaab
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 10
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Images/Saab_Technologies_logo_white.png b/Assets/Images/Saab_Technologies_logo_white.png
new file mode 100644
index 00000000..cab6e223
Binary files /dev/null and b/Assets/Images/Saab_Technologies_logo_white.png differ
diff --git a/Assets/Images/Saab_Technologies_logo_white.png.meta b/Assets/Images/Saab_Technologies_logo_white.png.meta
new file mode 100644
index 00000000..b65db8d9
--- /dev/null
+++ b/Assets/Images/Saab_Technologies_logo_white.png.meta
@@ -0,0 +1,91 @@
+fileFormatVersion: 2
+guid: 2a2046b4474af4843bf3d0ad51489cda
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 10
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Images/icon.png b/Assets/Images/icon.png
new file mode 100644
index 00000000..7de04f6e
Binary files /dev/null and b/Assets/Images/icon.png differ
diff --git a/Assets/Images/icon.png.meta b/Assets/Images/icon.png.meta
new file mode 100644
index 00000000..97c01b27
--- /dev/null
+++ b/Assets/Images/icon.png.meta
@@ -0,0 +1,91 @@
+fileFormatVersion: 2
+guid: 507e00e4ee60ef047a2980ffeec77deb
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 10
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Plugins.meta b/Assets/Plugins.meta
similarity index 77%
rename from com.saab.map-streamer/Plugins.meta
rename to Assets/Plugins.meta
index 1fba8b4e..db598d74 100644
--- a/com.saab.map-streamer/Plugins.meta
+++ b/Assets/Plugins.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: b6162deaf2510104abd6225d0c1783c6
+guid: 344cb0005a04a6d46a74e02d985e4f83
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/Assets/Plugins/ARM64/netcoreapp3.1/Gizmo3D.dll.meta b/Assets/Plugins/ARM64/netcoreapp3.1/Gizmo3D.dll.meta
new file mode 100644
index 00000000..c96ee356
--- /dev/null
+++ b/Assets/Plugins/ARM64/netcoreapp3.1/Gizmo3D.dll.meta
@@ -0,0 +1,75 @@
+fileFormatVersion: 2
+guid: 73a33a00dccc74f42b8e6816ed35a636
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      : Any
+    second:
+      enabled: 0
+      settings:
+        Exclude Android: 0
+        Exclude Editor: 1
+        Exclude Linux64: 1
+        Exclude OSXUniversal: 1
+        Exclude Win: 1
+        Exclude Win64: 1
+  - first:
+      Android: Android
+    second:
+      enabled: 1
+      settings: {}
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        CPU: ARM64
+        DefaultValueInitialized: true
+        OS: OSX
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: OSXUniversal
+    second:
+      enabled: 0
+      settings:
+        CPU: ARM64
+  - first:
+      Standalone: Win
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Windows Store Apps: WindowsStoreApps
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/ARM64/netcoreapp3.1/GizmoBase.dll.meta b/Assets/Plugins/ARM64/netcoreapp3.1/GizmoBase.dll.meta
new file mode 100644
index 00000000..bad53cd9
--- /dev/null
+++ b/Assets/Plugins/ARM64/netcoreapp3.1/GizmoBase.dll.meta
@@ -0,0 +1,75 @@
+fileFormatVersion: 2
+guid: 7375c6917fd1d27458a66f1300a723ee
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      : Any
+    second:
+      enabled: 0
+      settings:
+        Exclude Android: 0
+        Exclude Editor: 1
+        Exclude Linux64: 1
+        Exclude OSXUniversal: 1
+        Exclude Win: 1
+        Exclude Win64: 1
+  - first:
+      Android: Android
+    second:
+      enabled: 1
+      settings: {}
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        CPU: ARM64
+        DefaultValueInitialized: true
+        OS: OSX
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: OSXUniversal
+    second:
+      enabled: 0
+      settings:
+        CPU: ARM64
+  - first:
+      Standalone: Win
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Windows Store Apps: WindowsStoreApps
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/ARM64/netcoreapp3.1/GizmoDistribution.dll.meta b/Assets/Plugins/ARM64/netcoreapp3.1/GizmoDistribution.dll.meta
new file mode 100644
index 00000000..476efbb1
--- /dev/null
+++ b/Assets/Plugins/ARM64/netcoreapp3.1/GizmoDistribution.dll.meta
@@ -0,0 +1,75 @@
+fileFormatVersion: 2
+guid: accc4161066385240a37fb0e1bb5f3bf
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      : Any
+    second:
+      enabled: 0
+      settings:
+        Exclude Android: 0
+        Exclude Editor: 1
+        Exclude Linux64: 1
+        Exclude OSXUniversal: 1
+        Exclude Win: 1
+        Exclude Win64: 1
+  - first:
+      Android: Android
+    second:
+      enabled: 1
+      settings: {}
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        CPU: ARM64
+        DefaultValueInitialized: true
+        OS: OSX
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: OSXUniversal
+    second:
+      enabled: 0
+      settings:
+        CPU: ARM64
+  - first:
+      Standalone: Win
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Windows Store Apps: WindowsStoreApps
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/ARM64/netcoreapp3.1/InstallPackages.dll.meta b/Assets/Plugins/ARM64/netcoreapp3.1/InstallPackages.dll.meta
new file mode 100644
index 00000000..d23bd874
--- /dev/null
+++ b/Assets/Plugins/ARM64/netcoreapp3.1/InstallPackages.dll.meta
@@ -0,0 +1,75 @@
+fileFormatVersion: 2
+guid: c3ae6db6097d1f544a3bbfb9eac0b8da
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      : Any
+    second:
+      enabled: 0
+      settings:
+        Exclude Android: 0
+        Exclude Editor: 1
+        Exclude Linux64: 1
+        Exclude OSXUniversal: 1
+        Exclude Win: 1
+        Exclude Win64: 1
+  - first:
+      Android: Android
+    second:
+      enabled: 1
+      settings: {}
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        CPU: ARM64
+        DefaultValueInitialized: true
+        OS: OSX
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: OSXUniversal
+    second:
+      enabled: 0
+      settings:
+        CPU: ARM64
+  - first:
+      Standalone: Win
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Windows Store Apps: WindowsStoreApps
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/Android/AndroidManifest.xml b/Assets/Plugins/Android/AndroidManifest.xml
new file mode 100644
index 00000000..495f6c5b
--- /dev/null
+++ b/Assets/Plugins/Android/AndroidManifest.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.SaabAB.Streaming_Map_Demo"
+    android:installLocation="preferExternal"
+    android:targetSandboxVersion="2"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk
+        android:minSdkVersion="23"
+        android:targetSdkVersion="30" />
+
+    <supports-screens
+        android:anyDensity="true"
+        android:largeScreens="true"
+        android:normalScreens="true"
+        android:smallScreens="true"
+        android:xlargeScreens="true" />
+
+    <uses-feature android:glEsVersion="0x00020000" />
+
+    <supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
+
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+	<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+	<uses-permission android:name="android.permission.INTERNET"/>
+	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+	<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
+	<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
+
+    <uses-feature
+        android:name="android.hardware.touchscreen"
+        android:required="false" />
+  <uses-feature
+      android:name="android.hardware.touchscreen.multitouch"
+      android:required="false" />
+  <uses-feature
+      android:name="android.hardware.touchscreen.multitouch.distinct"
+      android:required="false" />
+
+    <application
+        android:debuggable="true"
+        android:extractNativeLibs="true"
+        android:icon="@mipmap/app_icon"
+        android:label="@string/app_name" >
+        <activity
+            android:name="com.unity3d.player.UnityPlayerActivity"
+            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
+            android:hardwareAccelerated="false"
+            android:launchMode="singleTask"
+            android:resizeableActivity="false"
+            android:screenOrientation="landscape"
+            android:theme="@style/UnityThemeSelector" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+
+            <meta-data
+                android:name="unityplayer.UnityActivity"
+                android:value="true" />
+            <meta-data
+                android:name="android.notch_support"
+                android:value="true" />
+        </activity>
+
+        <meta-data
+            android:name="unity.splash-mode"
+            android:value="0" />
+        <meta-data
+            android:name="unity.splash-enable"
+            android:value="True" />
+        <meta-data
+            android:name="unity.launch-fullscreen"
+            android:value="True" />
+        <meta-data
+            android:name="unity.allow-resizable-window"
+            android:value="False" />
+        <meta-data
+            android:name="notch.config"
+            android:value="portrait|landscape" />
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/Assets/Plugins/x64/netcoreapp3.1/Gizmo3D.dll.meta b/Assets/Plugins/x64/netcoreapp3.1/Gizmo3D.dll.meta
new file mode 100644
index 00000000..d4722859
--- /dev/null
+++ b/Assets/Plugins/x64/netcoreapp3.1/Gizmo3D.dll.meta
@@ -0,0 +1,69 @@
+fileFormatVersion: 2
+guid: e7c103278f3efc845a76b6d98efcea12
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      : Any
+    second:
+      enabled: 0
+      settings:
+        Exclude Android: 1
+        Exclude Editor: 0
+        Exclude Linux64: 0
+        Exclude OSXUniversal: 0
+        Exclude Win: 0
+        Exclude Win64: 0
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+        DefaultValueInitialized: true
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Standalone: OSXUniversal
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+  - first:
+      Standalone: Win
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Windows Store Apps: WindowsStoreApps
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/x64/netcoreapp3.1/GizmoBase.dll.meta b/Assets/Plugins/x64/netcoreapp3.1/GizmoBase.dll.meta
new file mode 100644
index 00000000..7266c6b8
--- /dev/null
+++ b/Assets/Plugins/x64/netcoreapp3.1/GizmoBase.dll.meta
@@ -0,0 +1,69 @@
+fileFormatVersion: 2
+guid: 4080dff3deb169e4aba0c233487abe7b
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      : Any
+    second:
+      enabled: 0
+      settings:
+        Exclude Android: 1
+        Exclude Editor: 0
+        Exclude Linux64: 0
+        Exclude OSXUniversal: 0
+        Exclude Win: 0
+        Exclude Win64: 0
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+        DefaultValueInitialized: true
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Standalone: OSXUniversal
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+  - first:
+      Standalone: Win
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Windows Store Apps: WindowsStoreApps
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/x64/netcoreapp3.1/GizmoDistribution.dll.meta b/Assets/Plugins/x64/netcoreapp3.1/GizmoDistribution.dll.meta
new file mode 100644
index 00000000..eee8b7ec
--- /dev/null
+++ b/Assets/Plugins/x64/netcoreapp3.1/GizmoDistribution.dll.meta
@@ -0,0 +1,69 @@
+fileFormatVersion: 2
+guid: 9e64f9982e97ed44ba24ade4697ed97b
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      : Any
+    second:
+      enabled: 0
+      settings:
+        Exclude Android: 1
+        Exclude Editor: 0
+        Exclude Linux64: 0
+        Exclude OSXUniversal: 0
+        Exclude Win: 0
+        Exclude Win64: 0
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+        DefaultValueInitialized: true
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Standalone: OSXUniversal
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+  - first:
+      Standalone: Win
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Windows Store Apps: WindowsStoreApps
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Plugins/x64/netcoreapp3.1/InstallPackages.dll.meta b/Assets/Plugins/x64/netcoreapp3.1/InstallPackages.dll.meta
new file mode 100644
index 00000000..f6da6892
--- /dev/null
+++ b/Assets/Plugins/x64/netcoreapp3.1/InstallPackages.dll.meta
@@ -0,0 +1,69 @@
+fileFormatVersion: 2
+guid: 7122c92f611cbbb4995268ad6fa43e08
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      : Any
+    second:
+      enabled: 0
+      settings:
+        Exclude Android: 1
+        Exclude Editor: 0
+        Exclude Linux64: 0
+        Exclude OSXUniversal: 0
+        Exclude Win: 0
+        Exclude Win64: 0
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+        DefaultValueInitialized: true
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Standalone: OSXUniversal
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+  - first:
+      Standalone: Win
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Windows Store Apps: WindowsStoreApps
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/PostEffect.asset b/Assets/PostEffect.asset
new file mode 100644
index 00000000..db47edfe
--- /dev/null
+++ b/Assets/PostEffect.asset
@@ -0,0 +1,2124 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &-9108605057807336775
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Rain
+  m_EditorClassIdentifier: Assembly-CSharp::Rain
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 0
+  RainShader:
+    overrideState: 1
+    value: {fileID: 7200000, guid: 247d17e29d700194aa29f9f616605f85, type: 3}
+  Noise:
+    overrideState: 1
+    value: {fileID: 2800000, guid: 1df2bc37d39dc6349b7d1d23dc1255a7, type: 3}
+    defaultState: 1
+  Density:
+    overrideState: 0
+    value: 2000
+  Color:
+    overrideState: 0
+    value: {r: 0.8, g: 0.8, b: 0.8, a: 0.5}
+  Speed:
+    overrideState: 0
+    value: 8
+  Fade:
+    overrideState: 0
+    value: 5
+  Radius:
+    overrideState: 0
+    value: 1
+  Wind:
+    overrideState: 1
+    value: {x: 0.1, y: -0.2}
+--- !u!114 &-8880481511883530775
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d6a39c3742c18764fbd0edb542c9fb17, type: 3}
+  m_Name: FogEffect
+  m_EditorClassIdentifier: 
+  active: 0
+  enabled:
+    overrideState: 1
+    value: 1
+  Density:
+    overrideState: 0
+    value: 1
+  MinDensity:
+    overrideState: 0
+    value: 0
+  MaxDensity:
+    overrideState: 0
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 1000
+  FogHeight:
+    overrideState: 0
+    value: 200
+  Color:
+    overrideState: 1
+    value: {r: 0.8, g: 0.8, b: 0.8, a: 0.5019608}
+--- !u!114 &-8864327642618990139
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Rain
+  m_EditorClassIdentifier: Assembly-CSharp::Rain
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  RainShader:
+    overrideState: 1
+    value: {fileID: 7200000, guid: 247d17e29d700194aa29f9f616605f85, type: 3}
+  Noise:
+    overrideState: 1
+    value: {fileID: 2800000, guid: 1df2bc37d39dc6349b7d1d23dc1255a7, type: 3}
+    defaultState: 1
+  Density:
+    overrideState: 1
+    value: 10000
+  Color:
+    overrideState: 0
+    value: {r: 0.8, g: 0.8, b: 0.8, a: 0.5}
+  Speed:
+    overrideState: 1
+    value: 8
+  Fade:
+    overrideState: 1
+    value: 5
+  Radius:
+    overrideState: 0
+    value: 1
+  Wind:
+    overrideState: 1
+    value: {x: 0.1, y: -0.2}
+--- !u!114 &-8821741626796729485
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Fog
+  m_EditorClassIdentifier: Assembly-CSharp::Fog
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  Density:
+    overrideState: 1
+    value: 1
+  MinDensity:
+    overrideState: 1
+    value: 0
+  MaxDensity:
+    overrideState: 1
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 100
+  FogHeight:
+    overrideState: 0
+    value: 200
+  Color:
+    overrideState: 0
+    value: {r: 1, g: 1, b: 1, a: 1}
+--- !u!114 &-7996436235010773021
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Fog
+  m_EditorClassIdentifier: Assembly-CSharp::Fog
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  Density:
+    overrideState: 1
+    value: 1
+  MinDensity:
+    overrideState: 1
+    value: 0
+  MaxDensity:
+    overrideState: 1
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 500
+  FogHeight:
+    overrideState: 1
+    value: 200
+  Color:
+    overrideState: 1
+    value: {r: 0.6603774, g: 0.6603774, b: 0.6603774, a: 1}
+--- !u!114 &-7639983590074803095
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Fog
+  m_EditorClassIdentifier: Assembly-CSharp::Fog
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  Density:
+    overrideState: 1
+    value: 1
+  MinDensity:
+    overrideState: 1
+    value: 0
+  MaxDensity:
+    overrideState: 1
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 500
+  FogHeight:
+    overrideState: 1
+    value: 200
+  Color:
+    overrideState: 0
+    value: {r: 1, g: 1, b: 1, a: 1}
+--- !u!114 &-4311958439933255868
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Fog
+  m_EditorClassIdentifier: Assembly-CSharp::Fog
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  Density:
+    overrideState: 1
+    value: 1
+  MinDensity:
+    overrideState: 1
+    value: 0
+  MaxDensity:
+    overrideState: 1
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 100
+  FogHeight:
+    overrideState: 1
+    value: 200
+  Color:
+    overrideState: 1
+    value: {r: 1, g: 1, b: 1, a: 1}
+--- !u!114 &-3910830657191367389
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Rain
+  m_EditorClassIdentifier: Assembly-CSharp::Rain
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  RainShader:
+    overrideState: 1
+    value: {fileID: 7200000, guid: 247d17e29d700194aa29f9f616605f85, type: 3}
+  Noise:
+    overrideState: 1
+    value: {fileID: 2800000, guid: 1df2bc37d39dc6349b7d1d23dc1255a7, type: 3}
+    defaultState: 1
+  Density:
+    overrideState: 1
+    value: 10000
+  Color:
+    overrideState: 1
+    value: {r: 0.8, g: 0.8, b: 0.8, a: 0.5}
+  Speed:
+    overrideState: 1
+    value: 8
+  Fade:
+    overrideState: 1
+    value: 5
+  Radius:
+    overrideState: 1
+    value: 0.74
+  Wind:
+    overrideState: 1
+    value: {x: 0.2, y: 0.2}
+--- !u!114 &-3585571523422951272
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Fog
+  m_EditorClassIdentifier: Assembly-CSharp::Fog
+  active: 0
+  enabled:
+    overrideState: 1
+    value: 1
+  Density:
+    overrideState: 1
+    value: 1
+  MinDensity:
+    overrideState: 1
+    value: 0
+  MaxDensity:
+    overrideState: 1
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 100
+  FogHeight:
+    overrideState: 1
+    value: 200
+  Color:
+    overrideState: 1
+    value: {r: 1, g: 1, b: 1, a: 1}
+--- !u!114 &-3185424743242531339
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: b94fcd11afffcb142908bfcb1e261fba, type: 3}
+  m_Name: MotionBlur
+  m_EditorClassIdentifier: 
+  active: 0
+  enabled:
+    overrideState: 1
+    value: 1
+  shutterAngle:
+    overrideState: 1
+    value: 360
+  sampleCount:
+    overrideState: 1
+    value: 15
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8e6292b2c06870d4495f009f912b9600, type: 3}
+  m_Name: PostEffect
+  m_EditorClassIdentifier: 
+  settings:
+  - {fileID: -3185424743242531339}
+  - {fileID: -8880481511883530775}
+  - {fileID: 8366492674992291223}
+  - {fileID: 5849322528493315636}
+  - {fileID: 4588061427061268980}
+--- !u!114 &218451947831216816
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Rain
+  m_EditorClassIdentifier: Assembly-CSharp::Rain
+  active: 0
+  enabled:
+    overrideState: 1
+    value: 1
+  RainShader:
+    overrideState: 1
+    value: {fileID: 7200000, guid: 247d17e29d700194aa29f9f616605f85, type: 3}
+  Noise:
+    overrideState: 1
+    value: {fileID: 2800000, guid: 1df2bc37d39dc6349b7d1d23dc1255a7, type: 3}
+    defaultState: 1
+  Density:
+    overrideState: 0
+    value: 2000
+  Color:
+    overrideState: 0
+    value: {r: 0.8, g: 0.8, b: 0.8, a: 0.5}
+  Speed:
+    overrideState: 0
+    value: 8
+  Fade:
+    overrideState: 0
+    value: 5
+  Radius:
+    overrideState: 0
+    value: 1
+  Wind:
+    overrideState: 0
+    value: {x: 0, y: 0}
+--- !u!114 &1128818114361627927
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Fog
+  m_EditorClassIdentifier: Assembly-CSharp::Fog
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  Density:
+    overrideState: 0
+    value: 1
+  MinDensity:
+    overrideState: 0
+    value: 0
+  MaxDensity:
+    overrideState: 0
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 100
+  FogHeight:
+    overrideState: 0
+    value: 200
+  Color:
+    overrideState: 0
+    value: {r: 1, g: 1, b: 1, a: 1}
+--- !u!114 &2602772561015032273
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Fog
+  m_EditorClassIdentifier: Assembly-CSharp::Fog
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  Density:
+    overrideState: 0
+    value: 1
+  MinDensity:
+    overrideState: 0
+    value: 0
+  MaxDensity:
+    overrideState: 0
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 100
+  FogHeight:
+    overrideState: 0
+    value: 200
+  Color:
+    overrideState: 0
+    value: {r: 1, g: 1, b: 1, a: 1}
+--- !u!114 &4284183168253689439
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Fog
+  m_EditorClassIdentifier: Assembly-CSharp::Fog
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  Density:
+    overrideState: 1
+    value: 1
+  MinDensity:
+    overrideState: 1
+    value: 0
+  MaxDensity:
+    overrideState: 1
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 1000
+  FogHeight:
+    overrideState: 0
+    value: 200
+  Color:
+    overrideState: 1
+    value: {r: 0.6226415, g: 0.6226415, b: 0.6226415, a: 1}
+--- !u!114 &4588061427061268980
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c1cb7e9e120078f43bce4f0b1be547a7, type: 3}
+  m_Name: AmbientOcclusion
+  m_EditorClassIdentifier: 
+  active: 0
+  enabled:
+    overrideState: 1
+    value: 1
+  mode:
+    overrideState: 1
+    value: 1
+  intensity:
+    overrideState: 1
+    value: 1
+  color:
+    overrideState: 0
+    value: {r: 0, g: 0, b: 0, a: 1}
+  ambientOnly:
+    overrideState: 1
+    value: 0
+  noiseFilterTolerance:
+    overrideState: 0
+    value: 0
+  blurTolerance:
+    overrideState: 0
+    value: -4.6
+  upsampleTolerance:
+    overrideState: 0
+    value: -12
+  thicknessModifier:
+    overrideState: 1
+    value: 1
+  directLightingStrength:
+    overrideState: 0
+    value: 0
+  radius:
+    overrideState: 1
+    value: 15
+  quality:
+    overrideState: 0
+    value: 2
+--- !u!114 &4691276232897494364
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Fog
+  m_EditorClassIdentifier: Assembly-CSharp::Fog
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 0
+  Density:
+    overrideState: 0
+    value: 1
+  MinDensity:
+    overrideState: 0
+    value: 0
+  MaxDensity:
+    overrideState: 0
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 200
+  FogHeight:
+    overrideState: 0
+    value: 200
+  Color:
+    overrideState: 0
+    value: {r: 1, g: 1, b: 1, a: 1}
+--- !u!114 &4838997547539754608
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Fog
+  m_EditorClassIdentifier: Assembly-CSharp::Fog
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  Density:
+    overrideState: 0
+    value: 1
+  MinDensity:
+    overrideState: 0
+    value: 0
+  MaxDensity:
+    overrideState: 0
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 100
+  FogHeight:
+    overrideState: 0
+    value: 200
+  Color:
+    overrideState: 0
+    value: {r: 1, g: 1, b: 1, a: 1}
+--- !u!114 &5849322528493315636
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: adb84e30e02715445aeb9959894e3b4d, type: 3}
+  m_Name: ColorGrading
+  m_EditorClassIdentifier: 
+  active: 0
+  enabled:
+    overrideState: 1
+    value: 1
+  gradingMode:
+    overrideState: 1
+    value: 0
+  externalLut:
+    overrideState: 0
+    value: {fileID: 0}
+    defaultState: 1
+  tonemapper:
+    overrideState: 0
+    value: 0
+  toneCurveToeStrength:
+    overrideState: 0
+    value: 0
+  toneCurveToeLength:
+    overrideState: 0
+    value: 0.5
+  toneCurveShoulderStrength:
+    overrideState: 0
+    value: 0
+  toneCurveShoulderLength:
+    overrideState: 0
+    value: 0.5
+  toneCurveShoulderAngle:
+    overrideState: 0
+    value: 0
+  toneCurveGamma:
+    overrideState: 0
+    value: 1
+  ldrLut:
+    overrideState: 0
+    value: {fileID: 0}
+    defaultState: 4
+  ldrLutContribution:
+    overrideState: 0
+    value: 1
+  temperature:
+    overrideState: 0
+    value: 0
+  tint:
+    overrideState: 0
+    value: 0
+  colorFilter:
+    overrideState: 0
+    value: {r: 1, g: 1, b: 1, a: 1}
+  hueShift:
+    overrideState: 0
+    value: 0
+  saturation:
+    overrideState: 1
+    value: 30
+  brightness:
+    overrideState: 0
+    value: 0
+  postExposure:
+    overrideState: 0
+    value: 0
+  contrast:
+    overrideState: 1
+    value: 10
+  mixerRedOutRedIn:
+    overrideState: 0
+    value: 100
+  mixerRedOutGreenIn:
+    overrideState: 0
+    value: 0
+  mixerRedOutBlueIn:
+    overrideState: 0
+    value: 0
+  mixerGreenOutRedIn:
+    overrideState: 0
+    value: 0
+  mixerGreenOutGreenIn:
+    overrideState: 0
+    value: 100
+  mixerGreenOutBlueIn:
+    overrideState: 0
+    value: 0
+  mixerBlueOutRedIn:
+    overrideState: 0
+    value: 0
+  mixerBlueOutGreenIn:
+    overrideState: 0
+    value: 0
+  mixerBlueOutBlueIn:
+    overrideState: 0
+    value: 100
+  lift:
+    overrideState: 0
+    value: {x: 1, y: 1, z: 1, w: 0}
+  gamma:
+    overrideState: 0
+    value: {x: 1, y: 1, z: 1, w: -0.17207149}
+  gain:
+    overrideState: 0
+    value: {x: 1, y: 1, z: 1, w: 0.21178031}
+  masterCurve:
+    overrideState: 0
+    value:
+      curve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 1
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0
+          outWeight: 0
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 1
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0
+          outWeight: 0
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      m_Loop: 0
+      m_ZeroValue: 0
+      m_Range: 1
+      cachedData:
+      - 0
+      - 0.0078125
+      - 0.015625
+      - 0.0234375
+      - 0.03125
+      - 0.0390625
+      - 0.046875
+      - 0.0546875
+      - 0.0625
+      - 0.0703125
+      - 0.078125
+      - 0.0859375
+      - 0.09375
+      - 0.1015625
+      - 0.109375
+      - 0.1171875
+      - 0.125
+      - 0.1328125
+      - 0.140625
+      - 0.1484375
+      - 0.15625
+      - 0.1640625
+      - 0.171875
+      - 0.1796875
+      - 0.1875
+      - 0.1953125
+      - 0.203125
+      - 0.2109375
+      - 0.21875
+      - 0.2265625
+      - 0.234375
+      - 0.2421875
+      - 0.25
+      - 0.2578125
+      - 0.265625
+      - 0.2734375
+      - 0.28125
+      - 0.2890625
+      - 0.296875
+      - 0.3046875
+      - 0.3125
+      - 0.3203125
+      - 0.328125
+      - 0.3359375
+      - 0.34375
+      - 0.3515625
+      - 0.359375
+      - 0.3671875
+      - 0.375
+      - 0.3828125
+      - 0.390625
+      - 0.3984375
+      - 0.40625
+      - 0.4140625
+      - 0.421875
+      - 0.4296875
+      - 0.4375
+      - 0.4453125
+      - 0.453125
+      - 0.4609375
+      - 0.46875
+      - 0.4765625
+      - 0.484375
+      - 0.4921875
+      - 0.5
+      - 0.5078125
+      - 0.515625
+      - 0.5234375
+      - 0.53125
+      - 0.5390625
+      - 0.546875
+      - 0.5546875
+      - 0.5625
+      - 0.5703125
+      - 0.578125
+      - 0.5859375
+      - 0.59375
+      - 0.6015625
+      - 0.609375
+      - 0.6171875
+      - 0.625
+      - 0.6328125
+      - 0.640625
+      - 0.6484375
+      - 0.65625
+      - 0.6640625
+      - 0.671875
+      - 0.6796875
+      - 0.6875
+      - 0.6953125
+      - 0.703125
+      - 0.7109375
+      - 0.71875
+      - 0.7265625
+      - 0.734375
+      - 0.7421875
+      - 0.75
+      - 0.7578125
+      - 0.765625
+      - 0.7734375
+      - 0.78125
+      - 0.7890625
+      - 0.796875
+      - 0.8046875
+      - 0.8125
+      - 0.8203125
+      - 0.828125
+      - 0.8359375
+      - 0.84375
+      - 0.8515625
+      - 0.859375
+      - 0.8671875
+      - 0.875
+      - 0.8828125
+      - 0.890625
+      - 0.8984375
+      - 0.90625
+      - 0.9140625
+      - 0.921875
+      - 0.9296875
+      - 0.9375
+      - 0.9453125
+      - 0.953125
+      - 0.9609375
+      - 0.96875
+      - 0.9765625
+      - 0.984375
+      - 0.9921875
+  redCurve:
+    overrideState: 0
+    value:
+      curve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 1
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0
+          outWeight: 0
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 1
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0
+          outWeight: 0
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      m_Loop: 0
+      m_ZeroValue: 0
+      m_Range: 1
+      cachedData:
+      - 0
+      - 0.0078125
+      - 0.015625
+      - 0.0234375
+      - 0.03125
+      - 0.0390625
+      - 0.046875
+      - 0.0546875
+      - 0.0625
+      - 0.0703125
+      - 0.078125
+      - 0.0859375
+      - 0.09375
+      - 0.1015625
+      - 0.109375
+      - 0.1171875
+      - 0.125
+      - 0.1328125
+      - 0.140625
+      - 0.1484375
+      - 0.15625
+      - 0.1640625
+      - 0.171875
+      - 0.1796875
+      - 0.1875
+      - 0.1953125
+      - 0.203125
+      - 0.2109375
+      - 0.21875
+      - 0.2265625
+      - 0.234375
+      - 0.2421875
+      - 0.25
+      - 0.2578125
+      - 0.265625
+      - 0.2734375
+      - 0.28125
+      - 0.2890625
+      - 0.296875
+      - 0.3046875
+      - 0.3125
+      - 0.3203125
+      - 0.328125
+      - 0.3359375
+      - 0.34375
+      - 0.3515625
+      - 0.359375
+      - 0.3671875
+      - 0.375
+      - 0.3828125
+      - 0.390625
+      - 0.3984375
+      - 0.40625
+      - 0.4140625
+      - 0.421875
+      - 0.4296875
+      - 0.4375
+      - 0.4453125
+      - 0.453125
+      - 0.4609375
+      - 0.46875
+      - 0.4765625
+      - 0.484375
+      - 0.4921875
+      - 0.5
+      - 0.5078125
+      - 0.515625
+      - 0.5234375
+      - 0.53125
+      - 0.5390625
+      - 0.546875
+      - 0.5546875
+      - 0.5625
+      - 0.5703125
+      - 0.578125
+      - 0.5859375
+      - 0.59375
+      - 0.6015625
+      - 0.609375
+      - 0.6171875
+      - 0.625
+      - 0.6328125
+      - 0.640625
+      - 0.6484375
+      - 0.65625
+      - 0.6640625
+      - 0.671875
+      - 0.6796875
+      - 0.6875
+      - 0.6953125
+      - 0.703125
+      - 0.7109375
+      - 0.71875
+      - 0.7265625
+      - 0.734375
+      - 0.7421875
+      - 0.75
+      - 0.7578125
+      - 0.765625
+      - 0.7734375
+      - 0.78125
+      - 0.7890625
+      - 0.796875
+      - 0.8046875
+      - 0.8125
+      - 0.8203125
+      - 0.828125
+      - 0.8359375
+      - 0.84375
+      - 0.8515625
+      - 0.859375
+      - 0.8671875
+      - 0.875
+      - 0.8828125
+      - 0.890625
+      - 0.8984375
+      - 0.90625
+      - 0.9140625
+      - 0.921875
+      - 0.9296875
+      - 0.9375
+      - 0.9453125
+      - 0.953125
+      - 0.9609375
+      - 0.96875
+      - 0.9765625
+      - 0.984375
+      - 0.9921875
+  greenCurve:
+    overrideState: 0
+    value:
+      curve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 1
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0
+          outWeight: 0
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 1
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0
+          outWeight: 0
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      m_Loop: 0
+      m_ZeroValue: 0
+      m_Range: 1
+      cachedData:
+      - 0
+      - 0.0078125
+      - 0.015625
+      - 0.0234375
+      - 0.03125
+      - 0.0390625
+      - 0.046875
+      - 0.0546875
+      - 0.0625
+      - 0.0703125
+      - 0.078125
+      - 0.0859375
+      - 0.09375
+      - 0.1015625
+      - 0.109375
+      - 0.1171875
+      - 0.125
+      - 0.1328125
+      - 0.140625
+      - 0.1484375
+      - 0.15625
+      - 0.1640625
+      - 0.171875
+      - 0.1796875
+      - 0.1875
+      - 0.1953125
+      - 0.203125
+      - 0.2109375
+      - 0.21875
+      - 0.2265625
+      - 0.234375
+      - 0.2421875
+      - 0.25
+      - 0.2578125
+      - 0.265625
+      - 0.2734375
+      - 0.28125
+      - 0.2890625
+      - 0.296875
+      - 0.3046875
+      - 0.3125
+      - 0.3203125
+      - 0.328125
+      - 0.3359375
+      - 0.34375
+      - 0.3515625
+      - 0.359375
+      - 0.3671875
+      - 0.375
+      - 0.3828125
+      - 0.390625
+      - 0.3984375
+      - 0.40625
+      - 0.4140625
+      - 0.421875
+      - 0.4296875
+      - 0.4375
+      - 0.4453125
+      - 0.453125
+      - 0.4609375
+      - 0.46875
+      - 0.4765625
+      - 0.484375
+      - 0.4921875
+      - 0.5
+      - 0.5078125
+      - 0.515625
+      - 0.5234375
+      - 0.53125
+      - 0.5390625
+      - 0.546875
+      - 0.5546875
+      - 0.5625
+      - 0.5703125
+      - 0.578125
+      - 0.5859375
+      - 0.59375
+      - 0.6015625
+      - 0.609375
+      - 0.6171875
+      - 0.625
+      - 0.6328125
+      - 0.640625
+      - 0.6484375
+      - 0.65625
+      - 0.6640625
+      - 0.671875
+      - 0.6796875
+      - 0.6875
+      - 0.6953125
+      - 0.703125
+      - 0.7109375
+      - 0.71875
+      - 0.7265625
+      - 0.734375
+      - 0.7421875
+      - 0.75
+      - 0.7578125
+      - 0.765625
+      - 0.7734375
+      - 0.78125
+      - 0.7890625
+      - 0.796875
+      - 0.8046875
+      - 0.8125
+      - 0.8203125
+      - 0.828125
+      - 0.8359375
+      - 0.84375
+      - 0.8515625
+      - 0.859375
+      - 0.8671875
+      - 0.875
+      - 0.8828125
+      - 0.890625
+      - 0.8984375
+      - 0.90625
+      - 0.9140625
+      - 0.921875
+      - 0.9296875
+      - 0.9375
+      - 0.9453125
+      - 0.953125
+      - 0.9609375
+      - 0.96875
+      - 0.9765625
+      - 0.984375
+      - 0.9921875
+  blueCurve:
+    overrideState: 0
+    value:
+      curve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 1
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0
+          outWeight: 0
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 1
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0
+          outWeight: 0
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      m_Loop: 0
+      m_ZeroValue: 0
+      m_Range: 1
+      cachedData:
+      - 0
+      - 0.0078125
+      - 0.015625
+      - 0.0234375
+      - 0.03125
+      - 0.0390625
+      - 0.046875
+      - 0.0546875
+      - 0.0625
+      - 0.0703125
+      - 0.078125
+      - 0.0859375
+      - 0.09375
+      - 0.1015625
+      - 0.109375
+      - 0.1171875
+      - 0.125
+      - 0.1328125
+      - 0.140625
+      - 0.1484375
+      - 0.15625
+      - 0.1640625
+      - 0.171875
+      - 0.1796875
+      - 0.1875
+      - 0.1953125
+      - 0.203125
+      - 0.2109375
+      - 0.21875
+      - 0.2265625
+      - 0.234375
+      - 0.2421875
+      - 0.25
+      - 0.2578125
+      - 0.265625
+      - 0.2734375
+      - 0.28125
+      - 0.2890625
+      - 0.296875
+      - 0.3046875
+      - 0.3125
+      - 0.3203125
+      - 0.328125
+      - 0.3359375
+      - 0.34375
+      - 0.3515625
+      - 0.359375
+      - 0.3671875
+      - 0.375
+      - 0.3828125
+      - 0.390625
+      - 0.3984375
+      - 0.40625
+      - 0.4140625
+      - 0.421875
+      - 0.4296875
+      - 0.4375
+      - 0.4453125
+      - 0.453125
+      - 0.4609375
+      - 0.46875
+      - 0.4765625
+      - 0.484375
+      - 0.4921875
+      - 0.5
+      - 0.5078125
+      - 0.515625
+      - 0.5234375
+      - 0.53125
+      - 0.5390625
+      - 0.546875
+      - 0.5546875
+      - 0.5625
+      - 0.5703125
+      - 0.578125
+      - 0.5859375
+      - 0.59375
+      - 0.6015625
+      - 0.609375
+      - 0.6171875
+      - 0.625
+      - 0.6328125
+      - 0.640625
+      - 0.6484375
+      - 0.65625
+      - 0.6640625
+      - 0.671875
+      - 0.6796875
+      - 0.6875
+      - 0.6953125
+      - 0.703125
+      - 0.7109375
+      - 0.71875
+      - 0.7265625
+      - 0.734375
+      - 0.7421875
+      - 0.75
+      - 0.7578125
+      - 0.765625
+      - 0.7734375
+      - 0.78125
+      - 0.7890625
+      - 0.796875
+      - 0.8046875
+      - 0.8125
+      - 0.8203125
+      - 0.828125
+      - 0.8359375
+      - 0.84375
+      - 0.8515625
+      - 0.859375
+      - 0.8671875
+      - 0.875
+      - 0.8828125
+      - 0.890625
+      - 0.8984375
+      - 0.90625
+      - 0.9140625
+      - 0.921875
+      - 0.9296875
+      - 0.9375
+      - 0.9453125
+      - 0.953125
+      - 0.9609375
+      - 0.96875
+      - 0.9765625
+      - 0.984375
+      - 0.9921875
+  hueVsHueCurve:
+    overrideState: 0
+    value:
+      curve:
+        serializedVersion: 2
+        m_Curve: []
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      m_Loop: 1
+      m_ZeroValue: 0.5
+      m_Range: 1
+      cachedData:
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+  hueVsSatCurve:
+    overrideState: 0
+    value:
+      curve:
+        serializedVersion: 2
+        m_Curve: []
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      m_Loop: 1
+      m_ZeroValue: 0.5
+      m_Range: 1
+      cachedData:
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+  satVsSatCurve:
+    overrideState: 0
+    value:
+      curve:
+        serializedVersion: 2
+        m_Curve: []
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      m_Loop: 0
+      m_ZeroValue: 0.5
+      m_Range: 1
+      cachedData:
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+  lumVsSatCurve:
+    overrideState: 0
+    value:
+      curve:
+        serializedVersion: 2
+        m_Curve: []
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      m_Loop: 0
+      m_ZeroValue: 0.5
+      m_Range: 1
+      cachedData:
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+      - 0.5
+--- !u!114 &6183105284041869922
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Rain
+  m_EditorClassIdentifier: Assembly-CSharp::Rain
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  RainShader:
+    overrideState: 1
+    value: {fileID: 7200000, guid: 247d17e29d700194aa29f9f616605f85, type: 3}
+  Noise:
+    overrideState: 1
+    value: {fileID: 2800000, guid: 1df2bc37d39dc6349b7d1d23dc1255a7, type: 3}
+    defaultState: 1
+  Density:
+    overrideState: 1
+    value: 2000
+  Color:
+    overrideState: 0
+    value: {r: 0.8, g: 0.8, b: 0.8, a: 0.5}
+  Speed:
+    overrideState: 1
+    value: 8
+  Fade:
+    overrideState: 1
+    value: 5
+  Radius:
+    overrideState: 0
+    value: 1
+  Wind:
+    overrideState: 1
+    value: {x: 0.2, y: -0.1}
+--- !u!114 &6823596894541431779
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Fog
+  m_EditorClassIdentifier: Assembly-CSharp::Fog
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  Density:
+    overrideState: 0
+    value: 1
+  MinDensity:
+    overrideState: 0
+    value: 0
+  MaxDensity:
+    overrideState: 0
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 500
+  FogHeight:
+    overrideState: 0
+    value: 200
+  Color:
+    overrideState: 0
+    value: {r: 1, g: 1, b: 1, a: 1}
+--- !u!114 &7576908198702621002
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Fog
+  m_EditorClassIdentifier: Assembly-CSharp::Fog
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  Density:
+    overrideState: 1
+    value: 1
+  MinDensity:
+    overrideState: 1
+    value: 0
+  MaxDensity:
+    overrideState: 1
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 100
+  FogHeight:
+    overrideState: 1
+    value: 200
+  Color:
+    overrideState: 1
+    value: {r: 1, g: 1, b: 1, a: 1}
+--- !u!114 &8001057333831541487
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 0}
+  m_Name: Fog
+  m_EditorClassIdentifier: Assembly-CSharp::Fog
+  active: 1
+  enabled:
+    overrideState: 1
+    value: 1
+  Density:
+    overrideState: 0
+    value: 1
+  MinDensity:
+    overrideState: 0
+    value: 0
+  MaxDensity:
+    overrideState: 0
+    value: 1
+  ViewDistance:
+    overrideState: 1
+    value: 100
+  FogHeight:
+    overrideState: 0
+    value: 200
+  Color:
+    overrideState: 0
+    value: {r: 1, g: 1, b: 1, a: 1}
+--- !u!114 &8366492674992291223
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0ea85088c98091645850e55d316b61b1, type: 3}
+  m_Name: RainEffect
+  m_EditorClassIdentifier: 
+  active: 0
+  enabled:
+    overrideState: 1
+    value: 1
+  RainShader:
+    overrideState: 1
+    value: {fileID: 7200000, guid: 247d17e29d700194aa29f9f616605f85, type: 3}
+  Noise:
+    overrideState: 1
+    value: {fileID: 2800000, guid: 1df2bc37d39dc6349b7d1d23dc1255a7, type: 3}
+    defaultState: 1
+  Density:
+    overrideState: 1
+    value: 3762
+  Color:
+    overrideState: 1
+    value: {r: 0.8, g: 0.8, b: 0.8, a: 1}
+  Speed:
+    overrideState: 1
+    value: 5
+  Fade:
+    overrideState: 1
+    value: 6
+  Radius:
+    overrideState: 1
+    value: 2.5
+  Wind:
+    overrideState: 1
+    value: {x: 0, y: 0}
diff --git a/com.saab.map-streamer/Runtime/Assets/FoliageSet/DemoVegetationSet.asset.meta b/Assets/PostEffect.asset.meta
similarity index 79%
rename from com.saab.map-streamer/Runtime/Assets/FoliageSet/DemoVegetationSet.asset.meta
rename to Assets/PostEffect.asset.meta
index 1cdcc048..15c5e3a1 100644
--- a/com.saab.map-streamer/Runtime/Assets/FoliageSet/DemoVegetationSet.asset.meta
+++ b/Assets/PostEffect.asset.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: a41238585ae0397468f576c11c14ce64
+guid: 250d81bdeb789f74788ec1d006e88e45
 NativeFormatImporter:
   externalObjects: {}
   mainObjectFileID: 11400000
diff --git a/com.saab.map-streamer/Plugins/Debug/x86_64.meta b/Assets/Saab.Initializer.meta
similarity index 77%
rename from com.saab.map-streamer/Plugins/Debug/x86_64.meta
rename to Assets/Saab.Initializer.meta
index 9954b968..254db7ce 100644
--- a/com.saab.map-streamer/Plugins/Debug/x86_64.meta
+++ b/Assets/Saab.Initializer.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d013dbaa5465dd4492a789a667f6fb0
+guid: a9f20b536e6793642a6415201480ca24
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/com.saab.map-streamer/Runtime/Saab.Unity/Saab.Unity.Initializer/Initializer.cs b/Assets/Saab.Initializer/Initializer.cs
similarity index 81%
rename from com.saab.map-streamer/Runtime/Saab.Unity/Saab.Unity.Initializer/Initializer.cs
rename to Assets/Saab.Initializer/Initializer.cs
index 47afcc13..167d0db1 100644
--- a/com.saab.map-streamer/Runtime/Saab.Unity/Saab.Unity.Initializer/Initializer.cs
+++ b/Assets/Saab.Initializer/Initializer.cs
@@ -19,7 +19,7 @@
 // Module		:
 // Description	: Bindings stub for Gizmo Messages
 // Author		: Anders Modén
-// Product		: GizmoBase 2.12.185
+// Product		: GizmoBase 2.12.33
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
@@ -119,8 +119,6 @@ void EnableMulticastState()
 
         private void Awake()
         {
-
-
             GizmoSDK.GizmoBase.Platform.Initialize();
               
             Message.OnMessage += Message_OnMessage;
@@ -135,16 +133,16 @@ private void Awake()
 
 #if UNITY_ANDROID
             GizmoSDK.GizmoBase.Monitor.InstallMonitor("udp::45454?nic=${wlan0}");
-
-            // Initialize application ragistry
-            KeyDatabase.SetDefaultRegistry($"/data/data/{Application.identifier}/files/gizmosdk.reg");
 #else
             GizmoSDK.GizmoBase.Monitor.InstallMonitor();
 #endif //UNITY_ANDROID
 
             Message.SetMessageLevel(MessageLevel.PERF_DEBUG);
 
-            
+            // Initialize application ragistry
+            KeyDatabase.SetDefaultRegistry($"/data/data/{Application.identifier}/files/gizmosdk.reg");
+
+
             // Set local xml config
             KeyDatabase.SetLocalRegistry("config.xml");
 
@@ -162,8 +160,8 @@ private void Awake()
 
             // Set up scene manager camera
 
-            SceneManager scenemanager = FindObjectOfType<SceneManager>();
-            CameraControl cameracontrol = FindObjectOfType<CameraControl>();
+            SceneManager scenemanager = GetComponent<SceneManager>();
+            CameraControl cameracontrol = GetComponent<CameraControl>();
 
             scenemanager.MapUrl = KeyDatabase.GetDefaultUserKey("SceneManager/MapUrl", scenemanager.MapUrl);
 
@@ -183,11 +181,11 @@ private void Message_OnMessage(string sender, MessageLevel level, string message
                 case MessageLevel.PERF_DEBUG:
                 case MessageLevel.DEBUG:
                 case MessageLevel.TRACE_DEBUG:
-                    Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, message);
+                    Debug.Log(message);
                     break;
 
                 case MessageLevel.NOTICE:
-                    Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, message);
+                    Debug.Log(message);
                     break;
 
                 case MessageLevel.WARNING:
@@ -203,7 +201,7 @@ private void Message_OnMessage(string sender, MessageLevel level, string message
                     break;
 
                 case MessageLevel.ALWAYS:
-                    Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, message);
+                    Debug.Log(message);
                     break;
             }
         }
@@ -218,7 +216,6 @@ private void Message_OnMessage(string sender, MessageLevel level, string message
 
         private void Update()
         {
-
             double time = GizmoSDK.GizmoBase.Time.SystemSeconds;
 
             if (_frameTime>0)
@@ -227,49 +224,58 @@ private void Update()
             _frameTime = time;
 
 
-            // Example of getting performance graphical output
+            try
+            {
+                Performance.Enter("Initializer.Update");
+
+                // Example of getting performance graphical output
 
 #if SHOW_TRACERS
 
-            if (_counter == 10)
-            {
-                tracer = new PerformanceTracer();
+                if (_counter == 10)
+                {
+                    tracer = new PerformanceTracer();
 
-                tracer.AddAll();
+                    tracer.AddAll();
 
-                tracer.Run();
-            }
+                    tracer.Run();
+                }
 
 #endif // SHOW_TRACERS
 
 
-            _counter++;
+                _counter++;
 
-            // Exemple of getting allocate dmemory in native parts
+                // Exemple of getting allocate dmemory in native parts
 
 #if SHOW_MEMORY
-            if (_counter % 30 == 0)
-            {
-                //System.GC.Collect();
-                //System.GC.WaitForPendingFinalizers();
+                if (_counter % 30 == 0)
+                {
+                    //System.GC.Collect();
+                    //System.GC.WaitForPendingFinalizers();
 
-                GizmoSDK.GizmoBase.Monitor.AddValue("mem", MemoryControl.GetAllocMem());
+                    GizmoSDK.GizmoBase.Monitor.AddValue("mem", MemoryControl.GetAllocMem());
 
-                GizmoSDK.GizmoBase.Monitor.AddValue("internal", MemoryControl.GetAllocMem(0, 0, false, true));
+                    GizmoSDK.GizmoBase.Monitor.AddValue("internal", MemoryControl.GetAllocMem(0, 0, false, true));
 
-                GizmoSDK.GizmoBase.Monitor.AddValue("dyn", MemoryControl.GetAllocMem(66666));
+                    GizmoSDK.GizmoBase.Monitor.AddValue("dyn", MemoryControl.GetAllocMem(66666));
 
-                GizmoSDK.GizmoBase.Monitor.AddValue("tex", Image.GetRegisteredImageData());
-            }
+                    GizmoSDK.GizmoBase.Monitor.AddValue("tex", Image.GetRegisteredImageData());
+                }
 #endif //SHOW_MEMORY
 
 #if SHOW_FPS
-            if (_counter % 30 == 0)
-            {
-                GizmoSDK.GizmoBase.Monitor.AddValue("fps", 1 / _frameDurationTime);
-            }
+                if (_counter % 30 == 0)
+                {
+                    GizmoSDK.GizmoBase.Monitor.AddValue("fps", 1 / _frameDurationTime);
+                }
 #endif //SHOW_FPS
 
+            }
+            finally
+            {
+                Performance.Leave();
+            }
         }
     }
 
diff --git a/com.saab.map-streamer/Runtime/Saab.Unity/Saab.Unity.Initializer/Initializer.cs.meta b/Assets/Saab.Initializer/Initializer.cs.meta
similarity index 74%
rename from com.saab.map-streamer/Runtime/Saab.Unity/Saab.Unity.Initializer/Initializer.cs.meta
rename to Assets/Saab.Initializer/Initializer.cs.meta
index 8c2cb8d3..049783b2 100644
--- a/com.saab.map-streamer/Runtime/Saab.Unity/Saab.Unity.Initializer/Initializer.cs.meta
+++ b/Assets/Saab.Initializer/Initializer.cs.meta
@@ -1,10 +1,10 @@
 fileFormatVersion: 2
-guid: a284ca71ed695f84385934cf4c567931
+guid: c2e02af6fa35924458434ab42b58dcae
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
   defaultReferences: []
-  executionOrder: -104
+  executionOrder: -100
   icon: {instanceID: 0}
   userData: 
   assetBundleName: 
diff --git a/com.saab.map-streamer/Plugins/Release.meta b/Assets/Saab.meta
similarity index 77%
rename from com.saab.map-streamer/Plugins/Release.meta
rename to Assets/Saab.meta
index bf6fe7a7..c76532b5 100644
--- a/com.saab.map-streamer/Plugins/Release.meta
+++ b/Assets/Saab.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 53f5381982aa6d747811d53259528619
+guid: 420398902f7207e478e78d36610de8e5
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/com.saab.map-streamer/Plugins/Release/x86_64.meta b/Assets/Saab/Foundation.meta
similarity index 77%
rename from com.saab.map-streamer/Plugins/Release/x86_64.meta
rename to Assets/Saab/Foundation.meta
index ef6122ff..7866d5a9 100644
--- a/com.saab.map-streamer/Plugins/Release/x86_64.meta
+++ b/Assets/Saab/Foundation.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 0e61e41d99f079d4bbf179aaf0ef68bf
+guid: e04f9fbf4d1da7041b9788090136d406
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager.meta b/Assets/Saab/Foundation/Saab.Foundation.Map.Manager.meta
similarity index 77%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager.meta
rename to Assets/Saab/Foundation/Saab.Foundation.Map.Manager.meta
index 2f646ba6..15507861 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager.meta
+++ b/Assets/Saab/Foundation/Saab.Foundation.Map.Manager.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: cc22a79d69f83384989c50a09b1ff93e
+guid: a9f7d88d4da37ca4ca0c4b219fcbedfe
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/AssemblyInfo.cs b/Assets/Saab/Foundation/Saab.Foundation.Map.Manager/AssemblyInfo.cs
similarity index 93%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/AssemblyInfo.cs
rename to Assets/Saab/Foundation/Saab.Foundation.Map.Manager/AssemblyInfo.cs
index bd05faf7..c7e13071 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/AssemblyInfo.cs
+++ b/Assets/Saab/Foundation/Saab.Foundation.Map.Manager/AssemblyInfo.cs
@@ -19,7 +19,7 @@
 // Module		: Saab.Foundation.Map.Manager
 // Description	: Information about assembly as library
 // Author		: Anders Modén		
-// Product		: Gizmo3D 2.12.185
+// Product		: Gizmo3D 2.12.75
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
@@ -31,6 +31,7 @@
 // Who	Date	Description						
 //									
 // AMO	180301	Created file 	
+//
 //******************************************************************************
 
 using System.Reflection;
@@ -68,8 +69,8 @@
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("2.12.185.1")]
-[assembly: AssemblyFileVersion("2.12.185.1")]
-[assembly: AssemblyInformationalVersion("2.12.185.1")]
+[assembly: AssemblyVersion("2.12.75.1")]
+[assembly: AssemblyFileVersion("2.12.75.1")]
+[assembly: AssemblyInformationalVersion("2.12.75.1")]
 
 #endif
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/AssemblyInfo.cs.meta b/Assets/Saab/Foundation/Saab.Foundation.Map.Manager/AssemblyInfo.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/AssemblyInfo.cs.meta
rename to Assets/Saab/Foundation/Saab.Foundation.Map.Manager/AssemblyInfo.cs.meta
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/Map.cs b/Assets/Saab/Foundation/Saab.Foundation.Map.Manager/Map.cs
similarity index 77%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/Map.cs
rename to Assets/Saab/Foundation/Saab.Foundation.Map.Manager/Map.cs
index 4460ce00..354ade14 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/Map.cs
+++ b/Assets/Saab/Foundation/Saab.Foundation.Map.Manager/Map.cs
@@ -19,7 +19,7 @@
 // Module		: Saab.Foundation.Map.Manager
 // Description	: Map Manager of maps in BTA
 // Author		: Anders Modén		
-// Product		: Gizmo3D 2.12.185
+// Product		: Gizmo3D 2.12.75
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
@@ -32,7 +32,6 @@
 //									
 // AMO	180301	Created file 	
 // AMO  191023  Fixed issue in double position in screenvectors
-// AMO  240412  Added META info about LOD, Size and Extent            (2.12.143)
 //
 //******************************************************************************
 
@@ -68,42 +67,21 @@ public enum ClampFlags
         WAIT_FOR_DATA           = 1<<1,
         ISECT_LOD_QUALITY       = 1<<2,
         FRUSTRUM_CULL           = 1<<3,    
-        UPDATE_DATA             = 1<<4,
-        CONSTRAIN_SURFACE       = 1<<5,
+        UPDATE_DATA             = 1<<4,        
 
         DEFAULT = FRUSTRUM_CULL,
     }
 
     public class MapControl
     {
-        // Constants for GZ_DB_INFO_PROJECTION ---------------------------------------------------------------------------------------------
-
-        const string GZ_DB_INFO_PROJECTION_FLAT           = "Flat Earth";
-        const string GZ_DB_INFO_PROJECTION_SPHERE         = "Sphere";
-        const string GZ_DB_INFO_PROJECTION_TRAPEZODIAL    = "Trapezoidal";
-        const string GZ_DB_INFO_PROJECTION_LAMBERT        = "Lambert";
-        const string GZ_DB_INFO_PROJECTION_UTM            = "UTM";
-        const string GZ_DB_INFO_PROJECTION_RT90           = "RT90";
-        const string GZ_DB_INFO_PROJECTION_SWEREF99       = "SWEREF99";
-        const string GZ_DB_INFO_PROJECTION_PROJECTED      = "Projected";
-
-        // Attribute names -----------------------------------------------------------------------------------------------------------------
-
-        const string GZ_DB_INFO_METER_SCALE     = "DbI-MeterScale";             // Number to scale model to meters approx
-        const string GZ_DB_INFO_PROJECTION      = "DbI-Projection";             // GZ_DB_INFO_PROJECTION_xx
-        const string GZ_DB_INFO_ELLIPSOID       = "DbI-Ellipsoid";
-        const string GZ_DB_INFO_COORD_SYS       = "DbI-CoordSystem";			// CoordSystem String
-              
-        const string GZ_DB_INFO_DB_ORIGIN_POS   = "DbI-Database Origin";        // Depends on GZ_DB_INFO_COORD_SYS
-        const string GZ_DB_INFO_DB_SW_POS       = "DbI-Database SWpos";         // gzAttribute_LatPos in radians
-        const string GZ_DB_INFO_DB_NE_POS       = "DbI-Database NEpos";         // gzAttribute_LatPos in radians
-
-        const string GZ_DB_INFO_DB_SIZE         = "DbI-SZ";				        // gzAttribute_DBSize
-
-        // Max Lod distance from loaded db
-
-        const string GZ_DB_INFO_DB_MAX_LOD_RANGE = "DbI-LR";				// Meters
-
+        const string USER_DATA_DB_INFO              = "UserDataDbInfo";
+        const string DBI_PROJECTION                 = "DbI-Projection";
+        const string DBI_PROJECTION_UTM             = "UTM";
+        const string DBI_PROJECTION_FLAT_EARTH      = "Flat Earth";
+        const string DBI_PROJECTION_SPHERE          = "Sphere";
+        const string DBI_ORIGIN                     = "DbI-Database Origin";
+        const string DBI_MAX_LOD_RANGE			    = "DbI-LR";
+        const string DBI_COORD_SYS                  = "DbI-CoordSystem";
 
         const double MAX_TRIANGLE_CACHE_AGE = 3.0;
 
@@ -111,8 +89,6 @@ public class MapControl
         public delegate void EventHandler_MapInfo(string url,MapType type,Node root);
         public event EventHandler_MapInfo OnMapInfo;
 
-        private readonly Coordinate _converter = new Coordinate();
-
         public MapControl()
         {
             Reset();
@@ -229,27 +205,31 @@ public bool GlobalToWorld(Vec3D global_position, out LatPos result)
         {
             // TODO:Coordinate.GetGlobalCoordinate(global_position+_origin, _coordSystem, _metaData, out LatPos lp);
 
-            if (!GlobalToWorld(global_position))
+            Coordinate converter = new Coordinate();
+
+            if (!GlobalToWorld(converter, global_position))
             {
                 result = default;
                 return false;
             }
 
-            return _converter.GetLatPos(out result);
+            return converter.GetLatPos(out result);
         }
 
         public bool GlobalToWorld(Vec3D global_position, out CartPos result)
         {
-            if (!GlobalToWorld(global_position))
+            Coordinate converter = new Coordinate();
+
+            if (!GlobalToWorld(converter, global_position))
             {
                 result = default;
                 return false;
             }
 
-            return _converter.GetCartPos(out result);
+            return converter.GetCartPos(out result);
         }
 
-        private bool WorldToGlobal(ref Vec3D pos, ref Matrix3 orientationMatrix)
+        private bool WorldToGlobal(Coordinate converter, ref Vec3D pos, ref Matrix3 orientationMatrix)
         {
 
             // Convert to global 3D coordinate in appropriate target system
@@ -260,7 +240,7 @@ private bool WorldToGlobal(ref Vec3D pos, ref Matrix3 orientationMatrix)
                     {
                         UTMPos utmpos;
 
-                        if (!_converter.GetUTMPos(out utmpos))
+                        if (!converter.GetUTMPos(out utmpos))
                         {
                             Message.Send("Controller", MessageLevel.WARNING, "Failed to convert to UTM");
                             return false;
@@ -275,7 +255,7 @@ private bool WorldToGlobal(ref Vec3D pos, ref Matrix3 orientationMatrix)
                     {
                         CartPos cartpos;
 
-                        if (!_converter.GetCartPos(out cartpos))
+                        if (!converter.GetCartPos(out cartpos))
                         {
                             Message.Send("Controller", MessageLevel.WARNING, "Failed to convert to Geocentric");
                             return false;
@@ -296,7 +276,7 @@ private bool WorldToGlobal(ref Vec3D pos, ref Matrix3 orientationMatrix)
             return true;
         }
 
-        public bool GlobalToWorld(Vec3D position)
+        public bool GlobalToWorld(Coordinate converter, Vec3D position)
         {
             switch (_mapType)
             {
@@ -309,7 +289,7 @@ public bool GlobalToWorld(Vec3D position)
 
                     UTMPos utmpos = new UTMPos(_metaData.Zone(),_metaData.North(), -(position.z + _origin.z), position.x + _origin.x, position.y + _origin.y);
 
-                    _converter.SetUTMPos(utmpos);
+                    converter.SetUTMPos(utmpos);
 
                     break;
 
@@ -317,7 +297,7 @@ public bool GlobalToWorld(Vec3D position)
 
                     CartPos cartpos = new CartPos(position.x + _origin.x, position.y + _origin.y, position.z + _origin.z);
 
-                    _converter.SetCartPos(cartpos);
+                    converter.SetCartPos(cartpos);
 
                     break;
             }
@@ -380,7 +360,7 @@ public bool GetGroundPosition(Vec3D global_position, Vec3 direction, out MapPos
             Intersector isect = new Intersector();
 
             var mask = GetMask(clampType);
-            isect.IntersectMask=mask;  // Lets hit the ground
+            isect.SetIntersectMask(mask);  // Lets hit the ground
 
             // Check camera frustrum -----------------------------------------------------------
 
@@ -395,8 +375,8 @@ public bool GetGroundPosition(Vec3D global_position, Vec3 direction, out MapPos
             // Adjust intersector to use origo as center
             global_position = global_position - origo;
 
-            isect.StartPosition=(Vec3)global_position;
-            isect.Direction=direction;
+            isect.SetStartPosition((Vec3)global_position);
+            isect.SetDirection(direction);
 
             if (isect.Intersect(_currentMap,  IntersectQuery.ABC_TRI | 
                                                     IntersectQuery.NEAREST_POINT |
@@ -539,7 +519,6 @@ public bool UpdatePosition(MapPos result, GroundClampType groundClamp = GroundCl
 
             if (groundClamp != GroundClampType.NONE)
             {
-                
 
                 // Add ROINode position as offset   - Go to global 3D coordinate system as we need to clamp in global 3D
 
@@ -595,12 +574,12 @@ public bool UpdatePosition(MapPos result, GroundClampType groundClamp = GroundCl
                     origo = result.position;
 
 
-                isect.StartPosition=(Vec3)(result.position - origo) - 10000.0f * down;  // Move backwards
-                isect.Direction=down;
-                isect.IntersectMask=GetMask(groundClamp);
+                isect.SetStartPosition((Vec3)(result.position - origo) - 10000.0f * down);  // Move backwards
+                isect.SetDirection(down);
+                isect.SetIntersectMask(GetMask(groundClamp));
 
                 if (isect.Intersect(_currentMap, IntersectQuery.NEAREST_POINT | IntersectQuery.ABC_TRI |
-                                                    (flags.HasFlag(ClampFlags.ALIGN_NORMAL_TO_SURFACE) ? IntersectQuery.NORMAL : 0) |
+                                                    (flags.HasFlag(ClampFlags.ALIGN_NORMAL_TO_SURFACE) ? IntersectQuery.NORMAL : 0) | //IntersectQuery.NORMAL |
                                                     (flags.HasFlag(ClampFlags.WAIT_FOR_DATA) ? IntersectQuery.WAIT_FOR_DYNAMIC_DATA : 0) |
                                                     (flags.HasFlag(ClampFlags.UPDATE_DATA) ? IntersectQuery.UPDATE_DYNAMIC_DATA : 0)
                                                     , LodFactor, true, origo))
@@ -678,6 +657,8 @@ private static IntersectMaskValue GetMask(GroundClampType clampType)
         /// <returns></returns>
         public Matrix3 GetLocalOrientation(Vec3D global_position)
         {
+            Coordinate converter = new Coordinate();
+
             switch (_mapType)
             {
                 default:
@@ -703,7 +684,8 @@ public Matrix3 GetLocalOrientation(Vec3D global_position)
         /// <returns></returns>
         public Matrix3 GetLocalOrientation(LatPos pos)
         {
-            _converter.SetLatPos(pos);
+            Coordinate converter = new Coordinate();
+            converter.SetLatPos(pos);
 
             switch (_mapType)
             {
@@ -721,7 +703,7 @@ public Matrix3 GetLocalOrientation(LatPos pos)
 
                     CartPos cartpos;
 
-                    if (!_converter.GetCartPos(out cartpos))
+                    if (!converter.GetCartPos(out cartpos))
                     {
                         Message.Send("Controller", MessageLevel.WARNING, "Failed to convert to Geocentric");
                         return new Matrix3();
@@ -731,6 +713,10 @@ public Matrix3 GetLocalOrientation(LatPos pos)
             }
         }
 
+        
+
+       
+
         /// <summary>
         /// Converts a global mappos to a local under a roi
         /// </summary>
@@ -738,7 +724,6 @@ public Matrix3 GetLocalOrientation(LatPos pos)
         /// <returns></returns>
         public bool ToLocal(MapPos result)
         {
-
             if (result.node != null)        // Already local
                 return true;
 
@@ -788,47 +773,31 @@ public bool ToGlobal(MapPos result)
 
         public bool SetPosition(MapPos result, LatPos pos, GroundClampType groundClamp = GroundClampType.NONE, ClampFlags flags = ClampFlags.DEFAULT)
         {
-            _converter.SetLatPos(pos);
+            Coordinate converter = new Coordinate();
+            converter.SetLatPos(pos);
 
-            return SetPositionInternal(result, groundClamp, flags);
-        }
+            if (!WorldToGlobal(converter, ref result.position, ref result.local_orientation))
+                return false;
 
-        public bool SetPosition(MapPos result, CartPos pos, GroundClampType groundClamp = GroundClampType.NONE, ClampFlags flags = ClampFlags.DEFAULT)
-        {
-            _converter.SetCartPos(pos);
+            ToLocal(result);
 
-            return SetPositionInternal(result, groundClamp, flags);
+            return UpdatePosition(result, groundClamp, flags);
         }
 
-        private bool SetPositionInternal(MapPos result, GroundClampType groundClamp, ClampFlags flags)
+        public bool SetPosition(MapPos result, CartPos pos, GroundClampType groundClamp = GroundClampType.NONE, ClampFlags flags = ClampFlags.DEFAULT)
         {
-            if (!WorldToGlobal(ref result.position, ref result.local_orientation))
-                return false;
-
-            // optimized path when not handling surface constraint
-            if (!flags.HasFlag(ClampFlags.CONSTRAIN_SURFACE))
-            {
-                ToLocal(result);
+            Coordinate converter = new Coordinate();
+            converter.SetCartPos(pos);
 
-                return UpdatePosition(result, groundClamp, flags);
-            }
+            if (!WorldToGlobal(converter, ref result.position, ref result.local_orientation))
+                return false;
 
-            // store unclamped position
-            Vec3D oldPos = result.position;
+            // Check possibly local 3D under a roiNode
 
             ToLocal(result);
 
-            if (!UpdatePosition(result, groundClamp, flags))
-                return false;
-
-            // get vector between unclamped and clamped position
-            var delta = (Vec3)(oldPos - result.position);
 
-            // if clamped position was below unclamped position we discard the clamped position
-            if (Vec3.Dot(delta, result.normal) > 0)
-                result.position = oldPos;
-
-            return true;
+            return UpdatePosition(result, groundClamp, flags);
         }
              
 
@@ -893,48 +862,36 @@ public Node CurrentMap
 
                     _currentMap = value;
 
-                    // reset to defaults
-                    _converter.PrefUTMZone = -1;
-                    _converter.PrefUTMHemisphere = 0;
-
-                    if (value != null && value.IsValid() && value.HasDbInfo())
+                    if (value != null && value.IsValid())
                     {
-                        var projection = _currentMap.GetDbInfo(GZ_DB_INFO_PROJECTION);
+                        var projection = _currentMap.GetAttribute(USER_DATA_DB_INFO, DBI_PROJECTION);
 
-                        if (projection == GZ_DB_INFO_PROJECTION_UTM)
+                        if (projection == DBI_PROJECTION_UTM)
                         {
                             _mapType = MapType.UTM;
-
-                            UTMPos utmOrigin = _currentMap.GetDbInfo( GZ_DB_INFO_DB_ORIGIN_POS);
-
+                            UTMPos utmOrigin = _currentMap.GetAttribute(USER_DATA_DB_INFO, DBI_ORIGIN);
                             _origin = new Vec3D(utmOrigin.Easting, utmOrigin.H, -utmOrigin.Northing);
 
                             _metaData = new CoordinateSystemMetaData(utmOrigin.Zone, utmOrigin.North);
 
                             _coordSystem = new CoordinateSystem(Datum.WGS84_ELLIPSOID, FlatGaussProjection.UTM, CoordinateType.UTM);
-
-                            // we need to set utm zone converter settings according to map settings
-                            _converter.PrefUTMZone = utmOrigin.Zone;
-                            _converter.PrefUTMHemisphere = utmOrigin.North ? 1 : -1;
                         }
-                        else if (projection == GZ_DB_INFO_PROJECTION_FLAT)   // To run a 3D world without world coordinates
+                        else if (projection == DBI_PROJECTION_FLAT_EARTH)   // To run a 3D world without world coordinates
                         {
                             _mapType = MapType.PLAIN;
-                            _origin = (Vec3D)_currentMap.GetDbInfo( GZ_DB_INFO_DB_ORIGIN_POS).GetVec3();
+                            _origin = (Vec3D)_currentMap.GetAttribute(USER_DATA_DB_INFO, DBI_ORIGIN).GetVec3();
 
-                            _metaData.value1 = 0;
-                            _metaData.value2 = 0;
+                            _metaData.value = 0;
 
                             _coordSystem = new CoordinateSystem();
                         }
-                        else if (projection == GZ_DB_INFO_PROJECTION_SPHERE)
+                        else if (projection == DBI_PROJECTION_SPHERE)
                         {
                             _mapType = MapType.GEOCENTRIC;
-                            CartPos cartOrigin = _currentMap.GetDbInfo( GZ_DB_INFO_DB_ORIGIN_POS);
+                            CartPos cartOrigin = _currentMap.GetAttribute(USER_DATA_DB_INFO, DBI_ORIGIN);
                             _origin = new Vec3D(cartOrigin.X, cartOrigin.Y, cartOrigin.Z);
 
-                            _metaData.value1 = 0;
-                            _metaData.value2 = 0;
+                            _metaData.value = 0;
 
                             _coordSystem = new CoordinateSystem(Datum.WGS84_ELLIPSOID, FlatGaussProjection.NOT_DEFINED, CoordinateType.GEOCENTRIC);
                         }
@@ -943,31 +900,15 @@ public Node CurrentMap
                             _mapType = MapType.UNKNOWN;
                             _origin = new Vec3D(0, 0, 0);
 
-                            _metaData.value1 = 0;
-                            _metaData.value2 = 0;
+                            _metaData.value = 0;
 
                             _coordSystem = new CoordinateSystem();
                         }
 
-                        if(_currentMap.HasDbInfo(GZ_DB_INFO_COORD_SYS))
-                            _coordSystem = new CoordinateSystem(_currentMap.GetDbInfo( GZ_DB_INFO_COORD_SYS));
+                        if(_currentMap.HasAttribute(USER_DATA_DB_INFO, DBI_COORD_SYS))
+                            _coordSystem = new CoordinateSystem(_currentMap.GetAttribute(USER_DATA_DB_INFO, DBI_COORD_SYS));
 
-                        if (_currentMap.HasDbInfo(GZ_DB_INFO_DB_MAX_LOD_RANGE))
-                            _maxLODDistance = _currentMap.GetDbInfo( GZ_DB_INFO_DB_MAX_LOD_RANGE).GetNumber();
-                        else
-                            _maxLODDistance = 0;
-
-                        if (_currentMap.HasDbInfo(GZ_DB_INFO_DB_NE_POS))
-                            _ne_extent = _currentMap.GetDbInfo( GZ_DB_INFO_DB_NE_POS);
-                        else
-                            _ne_extent = new LatPos(0,0,0);
-
-                        if (_currentMap.HasDbInfo(GZ_DB_INFO_DB_SW_POS))
-                            _sw_extent = _currentMap.GetDbInfo( GZ_DB_INFO_DB_SW_POS);
-                        else
-                            _sw_extent = new LatPos(0, 0, 0);
-
-                        _db_size= _currentMap.GetDbInfo( GZ_DB_INFO_DB_SIZE).AsString();
+                        var maxLodDistance = _currentMap.GetAttribute(USER_DATA_DB_INFO, DBI_MAX_LOD_RANGE).GetNumber();
 
                         _topRoi = FindTopRoi(value);
 
@@ -977,8 +918,8 @@ public Node CurrentMap
 
                             RoiNode roiNode = new RoiNode
                             {
-                                LoadDistance = 2 * _maxLODDistance,
-                                PurgeDistance = 2 * _maxLODDistance
+                                LoadDistance = 2 * maxLodDistance,
+                                PurgeDistance = 2 * maxLodDistance
                             };
 
                             if (_nodeURL != null)  // We have an URL
@@ -1040,7 +981,6 @@ public Camera Camera
             set { _camera = value; }
         }
 
-        
         public string NodeURL
         {
             get
@@ -1094,70 +1034,6 @@ public float LodFactor
 
         public static MapControl SystemMap=new MapControl();
 
-        public LatPos SWExtent
-        {
-            get
-            {
-                try
-                {
-                    NodeLock.WaitLockEdit();
-                    return _sw_extent;
-                }
-                finally
-                {
-                    NodeLock.UnLock();
-                }
-            }
-        }
-
-        public LatPos NEExtent
-        {
-            get
-            {
-                try
-                {
-                    NodeLock.WaitLockEdit();
-                    return _ne_extent;
-                }
-                finally
-                {
-                    NodeLock.UnLock();
-                }
-            }
-        }
-
-        public double MaxLODDistance
-        {
-            get
-            {
-                try
-                {
-                    NodeLock.WaitLockEdit();
-                    return _maxLODDistance;
-                }
-                finally
-                {
-                    NodeLock.UnLock();
-                }
-            }
-        }
-
-        public string DBSize
-        {
-            get
-            {
-                try
-                {
-                    NodeLock.WaitLockEdit();
-                    return _db_size;
-                }
-                finally
-                {
-                    NodeLock.UnLock();
-                }
-            }
-        }
-
         #region ----- Private methods ------------------
 
         private Roi FindTopRoi(Node map)
@@ -1192,20 +1068,14 @@ private Roi FindTopRoi(Node map)
 
         #region ----- Private variables ----------------
 
-        private MapType                     _mapType;
-        private Node                        _currentMap;
-        private CoordinateSystem            _coordSystem;
-
-        private CoordinateSystemMetaData    _metaData;
-
-        private Vec3D                       _origin;
-        private Roi                         _topRoi;
+        private MapType                  _mapType;
+        private Node                     _currentMap;
+        private CoordinateSystem         _coordSystem;
 
-        private double                      _maxLODDistance;
-        private LatPos                      _ne_extent;
-        private LatPos                      _sw_extent;
+        private CoordinateSystemMetaData _metaData;
 
-        private string                      _db_size;
+        private Vec3D                    _origin;
+        private Roi                      _topRoi;
 
         private Camera  _camera;
         private string  _nodeURL;
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/Map.cs.meta b/Assets/Saab/Foundation/Saab.Foundation.Map.Manager/Map.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/Map.cs.meta
rename to Assets/Saab/Foundation/Saab.Foundation.Map.Manager/Map.cs.meta
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/MapPos.cs b/Assets/Saab/Foundation/Saab.Foundation.Map.Manager/MapPos.cs
similarity index 97%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/MapPos.cs
rename to Assets/Saab/Foundation/Saab.Foundation.Map.Manager/MapPos.cs
index 54f1d780..69637908 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/MapPos.cs
+++ b/Assets/Saab/Foundation/Saab.Foundation.Map.Manager/MapPos.cs
@@ -19,7 +19,7 @@
 // Module		: Saab.Foundation.Map.Manager
 // Description	: Definition of the MapPos map position structure
 // Author		: Anders Modén		
-// Product		: Gizmo3D 2.12.185
+// Product		: Gizmo3D 2.12.75
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
@@ -34,6 +34,12 @@
 //
 //******************************************************************************
 
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
 
 using GizmoSDK.Coordinate;
 using GizmoSDK.Gizmo3D;
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/MapPos.cs.meta b/Assets/Saab/Foundation/Saab.Foundation.Map.Manager/MapPos.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Map/Saab.Foundation.Map.Manager/MapPos.cs.meta
rename to Assets/Saab/Foundation/Saab.Foundation.Map.Manager/MapPos.cs.meta
diff --git a/Assets/Saab/Unity.meta b/Assets/Saab/Unity.meta
new file mode 100644
index 00000000..67044a20
--- /dev/null
+++ b/Assets/Saab/Unity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3ca5e742f3268884aa90f0f126752712
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Saab/Unity/Foundation.meta b/Assets/Saab/Unity/Foundation.meta
new file mode 100644
index 00000000..7a8aaab6
--- /dev/null
+++ b/Assets/Saab/Unity/Foundation.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cf40e4f136a793443bbb3abc4f54c924
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules.meta
new file mode 100644
index 00000000..7afbb66f
--- /dev/null
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a5a4d57c78b4f124593cf14d0fd136ce
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/BufferUtility.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/BufferUtility.cs
similarity index 67%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/BufferUtility.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/BufferUtility.cs
index 9d260a34..39c21216 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/BufferUtility.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/BufferUtility.cs
@@ -1,18 +1,3 @@
-/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
 using System;
 using UnityEngine;
 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/BufferUtility.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/BufferUtility.cs.meta
similarity index 83%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/BufferUtility.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/BufferUtility.cs.meta
index 38d8897d..e7e0c9ac 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/BufferUtility.cs.meta
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/BufferUtility.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: f37d430ec9d0d0045b918fe43cb058ee
+guid: 957a9b8ee0b12c44ea7903e90f168c46
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/CullingShader.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/CullingShader.cs
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/CullingShader.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/CullingShader.cs
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/CullingShader.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/CullingShader.cs.meta
similarity index 83%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/CullingShader.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/CullingShader.cs.meta
index b3ee3eb0..4f6a4d96 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/CullingShader.cs.meta
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/CullingShader.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 0349d756ded040b42a3b34e80bbec02b
+guid: ee2962d9a41579240b8bf9953f685db5
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/Foliage.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/Foliage.cs
similarity index 69%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/Foliage.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/Foliage.cs
index be401538..48b8622a 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/Foliage.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/Foliage.cs
@@ -1,18 +1,3 @@
-/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
@@ -43,6 +28,15 @@ public enum FoliageBiome
         MontaneForest = 1 << 17,
     }
 
+    public enum Feature
+    {
+        Nodata,
+        Undefined,
+        GroundGrass,
+        GroundBarren,
+        Vegetation
+    }
+
     public enum TextureMode
     {
         Single,
@@ -60,12 +54,9 @@ public class Foliage : ScriptableObject
         public Material MeshMaterial;
         public Vector2 MaxMin;
         public Vector2 Offset;
-
-        [Range(0.1f, 1f)]
-        public float CullAreaWidth = 0.25f;
         [Range(0f,1f)]
         public float Weight = 1;
-        public MapFeature Feature;
+        public Feature Feature;
         public FoliageBiome Biome;
         public TextureMode TextureMode;
     }
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/Foliage.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/Foliage.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/Foliage.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/Foliage.cs.meta
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageEditor.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageEditor.cs
similarity index 56%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageEditor.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageEditor.cs
index 769005d9..ddecea7e 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageEditor.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageEditor.cs
@@ -1,18 +1,3 @@
-/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
@@ -24,6 +9,7 @@ namespace Saab.Foundation.Unity.MapStreamer.Modules
     [CustomEditor(typeof(Foliage))]
     public class FoliageEditor : Editor
     {
+        [System.Obsolete]
         public override void OnInspectorGUI()
         {
             Foliage foliage = (Foliage)target;
@@ -36,10 +22,10 @@ public override void OnInspectorGUI()
             foliage.Normal = TextureField("Normal", foliage.Normal);
             EditorGUILayout.EndHorizontal();
 
-            foliage.Feature = (MapFeature)EditorGUILayout.EnumFlagsField("Feature", foliage.Feature);
+            foliage.Feature = (Feature)EditorGUILayout.EnumPopup("Feature", foliage.Feature);
             foliage.Biome = (FoliageBiome)EditorGUILayout.EnumFlagsField("Biome", foliage.Biome);
-            foliage.Mesh = (Mesh)EditorGUILayout.ObjectField("Mesh", foliage.Mesh, typeof(Mesh), allowSceneObjects: false);
-            foliage.MeshMaterial = (Material)EditorGUILayout.ObjectField("Mesh Material", foliage.MeshMaterial, typeof(Material), allowSceneObjects: false);
+            foliage.Mesh = (Mesh)EditorGUILayout.ObjectField("Mesh", foliage.Mesh, typeof(Mesh));
+            foliage.MeshMaterial = (Material)EditorGUILayout.ObjectField("Mesh Material", foliage.MeshMaterial, typeof(Material));
 
             EditorGUILayout.BeginHorizontal();
             foliage.MaxMin.x = EditorGUILayout.FloatField("Min height", foliage.MaxMin.x);
@@ -48,12 +34,9 @@ public override void OnInspectorGUI()
             foliage.MaxMin.x = Mathf.Min(foliage.MaxMin.x, foliage.MaxMin.y);
             EditorGUILayout.EndHorizontal();
 
-            //foliage.Offset = EditorGUILayout.Vector2Field("Origin", foliage.Offset);
-            foliage.Offset.y = EditorGUILayout.FloatField("GroundOffset", foliage.Offset.y);
-            foliage.Offset.y = Mathf.Abs(foliage.Offset.y > 1 ? 1 : foliage.Offset.y);
-
-            foliage.Offset.x = 0;
+            foliage.Offset = EditorGUILayout.Vector2Field("Origin", foliage.Offset);
             foliage.Offset.x = foliage.Offset.x > 0.5f ? 0.5f : foliage.Offset.x < -0.5f ? -0.5f : foliage.Offset.x;
+            foliage.Offset.y = Mathf.Abs(foliage.Offset.y > 1 ? 1 : foliage.Offset.y);
 
             foliage.TextureMode = (TextureMode)EditorGUILayout.EnumPopup("Mode", foliage.TextureMode);
             EditorGUILayout.BeginHorizontal();
@@ -64,41 +47,20 @@ public override void OnInspectorGUI()
             foliage.Weight = EditorGUILayout.Slider(foliage.Weight, 0.1f, 1f);
             EditorGUILayout.EndHorizontal();
 
-            EditorGUILayout.BeginHorizontal();
-            GUILayout.Label("Cull", style);
-            foliage.CullAreaWidth = EditorGUILayout.Slider(foliage.CullAreaWidth, 0.01f, 1f);
-            EditorGUILayout.EndHorizontal();
-
             if (foliage.MainTexture != null)
             {
                 EditorGUILayout.BeginVertical();
                 int PreviewSize = 400;
-                int HeightPos = 340;
+                int HeightPos = 300;
                 EditorGUILayout.Space(450, true);
                 EditorGUI.DrawRect(new Rect(3, HeightPos, PreviewSize, PreviewSize), Color.white);
 
                 if (foliage.TextureMode == TextureMode.Atlas)
-                {
                     GUI.DrawTextureWithTexCoords(new Rect(3, HeightPos, PreviewSize, PreviewSize), foliage.MainTexture, new Rect(0, 0, 0.5f, 0.5f));
-                    EditorGUI.DrawRect(new Rect(3, HeightPos - 5 + PreviewSize * (1 - foliage.Offset.y) + 4, PreviewSize, 2), new Color(1, 0, 0, 0.5f));
-
-                    var width = PreviewSize * foliage.CullAreaWidth;
-                    var height = width;
-
-                    var offset = PreviewSize * (foliage.Offset.y);
-                    var rect = new Rect(3 + PreviewSize / 2f - width / 2f, HeightPos + offset, width, PreviewSize);
-                    //DrawRect(rect, 2, Color.blue);
-                    rect.y -= offset;
-                    rect.height -= offset;
-                    DrawRect(rect, 2, Color.green);
-
-                }
                 else if (foliage.TextureMode == TextureMode.Single)
-                {
                     GUI.DrawTextureWithTexCoords(new Rect(3, HeightPos, PreviewSize, PreviewSize), foliage.MainTexture, new Rect(0, 0, 1, 1));
-                }
 
-                //EditorGUI.DrawRect(new Rect(3, HeightPos - 5 + PreviewSize * (1 - foliage.Offset.y) + 4, PreviewSize, 2), new Color(1, 0, 0, 0.5f));
+                EditorGUI.DrawRect(new Rect(3 - 5 + PreviewSize * (foliage.Offset.x + 0.5f), HeightPos - 5 + PreviewSize * (1 - foliage.Offset.y), 10, 10), new Color(1, 0, 0, 0.5f));
                 EditorGUILayout.EndVertical();
             }
             EditorUtility.SetDirty(foliage);
@@ -106,21 +68,6 @@ public override void OnInspectorGUI()
             //DrawDefaultInspector();
         }
 
-        private static void DrawRect(Rect rect, float strokeWidth, Color color)
-        {
-            // Draw the top border.
-            EditorGUI.DrawRect(new Rect(rect.x, rect.y, rect.width, strokeWidth), color);
-
-            // Draw the bottom border.
-            EditorGUI.DrawRect(new Rect(rect.x, rect.y + rect.height - strokeWidth, rect.width, strokeWidth), color);
-
-            // Draw the left border.
-            EditorGUI.DrawRect(new Rect(rect.x, rect.y, strokeWidth, rect.height), color);
-
-            // Draw the right border.
-            EditorGUI.DrawRect(new Rect(rect.x + rect.width - strokeWidth, rect.y, strokeWidth, rect.height), color);
-        }
-
         private static Texture2D TextureField(string name, Texture2D texture)
         {
             GUILayout.BeginVertical();
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageEditor.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageEditor.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageEditor.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageEditor.cs.meta
diff --git a/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageFeature.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageFeature.cs
new file mode 100644
index 00000000..494a8b8c
--- /dev/null
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageFeature.cs
@@ -0,0 +1,413 @@
+﻿using UnityEngine;
+using System.Collections.Generic;
+using System;
+using GizmoSDK.GizmoBase;
+using System.Linq;
+//using System.IO;
+
+namespace Saab.Foundation.Unity.MapStreamer.Modules
+{
+    public struct FoliagePoint
+    {
+        Vector3 Position;
+        Vector3 Color;
+        float Height;
+        float Random;
+    }
+
+    public class FeatureData : IDisposable
+    {
+        public GameObject Object { get; private set; }
+        public ComputeBuffer PlacementMatrix { get; private set; }
+        public Vector2 NodeOffset { get; private set; }
+        public ComputeBuffer MinXY { get; private set; }
+        public ComputeBuffer TerrainPoints;
+        public Texture2D FeatureMap;
+        public Texture2D Texture;
+        public Texture2D surfaceHeight;
+        public Texture2D surfaceHeightNew;
+        public RenderTexture HeightMap;
+
+        public FeatureData(GameObject gameObject, Matrix3D matrix, float density, uint maxSide, float scale = 1000)
+        {
+            Object = gameObject;
+            var stepsize = (1 / density) * 10;
+
+            MinXY = new ComputeBuffer(2, sizeof(uint), ComputeBufferType.Default);
+            uint[] max = { maxSide * 2, maxSide * 2 };
+            MinXY.SetData(max);
+
+            PlacementMatrix = new ComputeBuffer(9, sizeof(float), ComputeBufferType.Default);
+            float[] data = {
+                (float)matrix.v11, (float)matrix.v12, (float)((matrix.v13) % stepsize),
+                (float)matrix.v21, (float)matrix.v22, (float)((matrix.v23) % stepsize),
+                (float)matrix.v31, (float)matrix.v32, (float)matrix.v33
+            };
+
+            NodeOffset = new Vector2((float)(matrix.v13 + matrix.v11) % scale, (float)(matrix.v23 + matrix.v22) % scale);
+            PlacementMatrix.SetData(data);
+        } 
+
+        public void Dispose()
+        {
+            var data = new FoliagePoint[TerrainPoints.count];
+            TerrainPoints.SetData(data);
+            TerrainPoints.Release();
+
+            HeightMap.Release();
+            PlacementMatrix.Release();
+            MinXY.Release();
+        }
+    }
+
+    public class FoliageFeature : IDisposable
+    {
+        // list of all instances currently being rendered
+        private readonly List<FeatureData> _items = new List<FeatureData>(128);
+        private Vector2 _resolution;
+        private readonly ComputeShader _placement;
+        private readonly float _density;
+        private readonly float _scale = 1000;
+
+        // *********** buffers ***********
+        private ComputeBuffer _vertices;
+        private ComputeBuffer _indices;
+        private ComputeBuffer _texcoords;
+        private int _maxVertexCount;
+        private int _maxIndexCount;
+        private readonly ComputeBuffer _pointCloud;
+
+        public FoliageFeature(int BufferSize, float density, ComputeShader computeShader)
+        {
+            _placement = computeShader;
+            _density = density;
+            _pointCloud = new ComputeBuffer(BufferSize, sizeof(float) * 8, ComputeBufferType.Append);
+        }
+
+        public FeatureData AddFoliage(GameObject go, NodeHandle node)
+        {
+            Texture2D featureMap = node.feature;
+            Texture2D texture = node.texture;
+            Texture2D height = node.surfaceHeight;
+
+            if (featureMap == null)
+            {
+                //Debug.LogWarning($"node:{go.name}, no feature Map exist");
+                return null;
+            }
+            if (texture == null)
+            {
+                //Debug.LogWarning($"node:{go.name}, no texture exist");
+                return null;
+            }
+            if (height == null)
+            {
+                //Debug.LogWarning($"node:{go.name}, no surface height exist");
+                return null;
+            }
+            if (!go.activeInHierarchy)
+            {
+                Debug.LogWarning($"node:{go.name}, gameobject disabled");
+                return null;
+            }
+
+            //if (go.name != "15_48_1")
+            //    return;
+
+            var mesh = go.GetComponent<MeshFilter>().sharedMesh;
+            _resolution = new Vector2((float)node.featureInfo.v11, (float)node.featureInfo.v22);
+
+            var maxside = Mathf.Max(featureMap.width, featureMap.height);
+
+            var data = new FeatureData(go, node.featureInfo, _density, (uint)maxside, _scale)
+            {
+                FeatureMap = featureMap,
+                Texture = texture,
+                surfaceHeight = height
+            };
+
+            GenerateSharedData(data);
+            GenerateHeight(data, mesh);
+            FeauturePlacement(data);
+
+            _items.Add(data);
+            return data;
+        }
+        public void RemoveFoliage(GameObject gameobj)
+        {
+            for (var i = 0; i < _items.Count; ++i)
+            {
+                if (_items[i].Object != gameobj)
+                    continue;
+
+                _items[i].Dispose();
+
+                if ((i + 1) < _items.Count)
+                    _items[i] = _items[_items.Count - 1];
+
+                _items.RemoveAt(_items.Count - 1);
+
+                return;
+            }
+        }
+        public void Dispose()
+        {
+            for (var i = 0; i < _items.Count; ++i)
+            {
+                _items[i].Dispose();
+            }
+            _items.Clear();
+
+            _pointCloud?.Release();
+            _vertices?.Release();
+            _indices?.Release();
+            _texcoords?.Release();
+        }
+        public int GetVideoMemoryUsage()
+        {
+            var size = 0;
+            foreach(var item in _items)
+            {
+                size += item.TerrainPoints.stride * item.TerrainPoints.count;
+                size += item.HeightMap.width * item.HeightMap.width * sizeof(float);
+            }
+            size += _pointCloud.stride * _pointCloud.count;
+            size += _indices.stride * _indices.count;
+            size += _vertices.stride * _vertices.count;
+            size += _texcoords.stride * _texcoords.count;
+            return size;
+        }
+        private void SetupBuffers(Mesh mesh)
+        {
+            if (mesh.vertexCount > _maxVertexCount)
+            {
+                if (_vertices != null)
+                {
+                    _vertices.Release();
+                    _texcoords.Release();
+                }
+
+                _vertices = new ComputeBuffer(mesh.vertexCount, sizeof(float) * 3, ComputeBufferType.Default);
+                _texcoords = new ComputeBuffer(mesh.vertexCount, sizeof(float) * 2, ComputeBufferType.Default);
+                _maxVertexCount = _vertices.count;
+            }
+
+            if (mesh.GetIndexCount(0) > _maxIndexCount)
+            {
+                if (_indices != null)
+                {
+                    _indices.Release();
+                }
+                _indices = new ComputeBuffer((int)mesh.GetIndexCount(0), sizeof(int), ComputeBufferType.Default);
+                _maxIndexCount = (int)mesh.GetIndexCount(0);
+            }
+
+        }
+        private int FindBufferSize(FeatureData node)
+        {
+            var maxSize =
+                Mathf.CeilToInt((node.FeatureMap.width) * _resolution.x * _density) *
+                Mathf.CeilToInt((node.FeatureMap.height) * _resolution.y * _density);
+
+            return maxSize;
+
+            var bufferKernel = _placement.FindKernel("CSFindBufferSize");
+            var result = new uint[1];
+
+            var sizeBuffer = new ComputeBuffer(1, sizeof(uint), ComputeBufferType.Default);
+            sizeBuffer.SetData(result);
+
+            _placement.SetBuffer(bufferKernel, "BufferSize", sizeBuffer);
+            _placement.SetTexture(bufferKernel, "SplatMap", node.FeatureMap);
+            _placement.Dispatch(bufferKernel, Mathf.CeilToInt((node.FeatureMap.width - 2) / 8f) < 1 ? 1 : Mathf.CeilToInt((node.FeatureMap.height - 2) / 8f), 1, 1);
+
+            sizeBuffer.GetData(result);
+            var percentage = (result[0] * 8 * 8) / (float)((node.FeatureMap.width - 2) * (node.FeatureMap.height - 2));
+            Debug.Log($"{(result[0] * 8 * 8)}/{node.FeatureMap.width * node.FeatureMap.height}");
+
+            //var size = Mathf.CeilToInt(maxSize * percentage);
+            var area1 = Mathf.Sqrt(result[0] * 8 * 8) * _resolution;
+            var fArea = Mathf.Sqrt(node.FeatureMap.width * node.FeatureMap.height) * _resolution;
+            //var percentage = area
+
+            //var calcSize = Mathf.CeilToInt(area1.x * _density) * Mathf.CeilToInt(area1.y * _density);
+
+            //Debug.Log($"{size}/{maxSize} or {calcSize}/{maxSize} : {percentage:F3}");
+
+            //sizeBuffer.Release();
+            //Debug.Log($"saved: {size * (sizeof(float) * 8) / 1000000f:F2} mb / {maxSize * (sizeof(float) * 8) / 1000000f:F2} mb = {(1 - (size / (float)maxSize)) * 100:F2}%");
+            return maxSize;
+        }
+
+        Texture2D toTexture2D(RenderTexture rTex)
+        {
+            var tmp = RenderTexture.active;
+            Texture2D tex = new Texture2D(rTex.width, rTex.height, TextureFormat.RFloat, false);
+            tex.filterMode = rTex.filterMode;
+            // ReadPixels looks at the active RenderTexture.
+            RenderTexture.active = rTex;
+            tex.ReadPixels(new Rect(0, 0, rTex.width, rTex.height), 0, 0);
+            tex.Apply();
+            RenderTexture.active = tmp;
+            return tex;
+        }
+        //private void SaveImage(Texture2D tex, string name)
+        //{
+        //    if (!tex.isReadable)
+        //    {
+        //        Debug.LogWarning("could not read file");
+        //        return;
+        //    }
+
+        //    var data = tex.EncodeToPNG();
+        //    var dirPath = Application.dataPath + "/../SaveImages/";
+        //    if (!Directory.Exists(dirPath))
+        //    {
+        //        Directory.CreateDirectory(dirPath);
+        //    }
+        //    File.WriteAllBytes(dirPath + name + ".png", data);
+        //}
+
+        private RenderTexture GenerateSurfaceHeight(FeatureData node)
+        {
+            var kernel = _placement.FindKernel("CSUpSampleVegetation");
+
+            var surfaceHeightMap = new RenderTexture(node.surfaceHeight.width , node.surfaceHeight.height, 24, RenderTextureFormat.RFloat);
+            surfaceHeightMap.filterMode = FilterMode.Point;
+            surfaceHeightMap.enableRandomWrite = true;
+            surfaceHeightMap.Create();
+
+            _placement.SetVector("heightResolution", new Vector2(node.surfaceHeight.width, node.surfaceHeight.height));
+            _placement.SetTexture(kernel, "VegetationHeightMap", surfaceHeightMap);
+            _placement.SetTexture(kernel, "HeightSurface", node.surfaceHeight);
+            _placement.SetTexture(kernel, "SplatMap", node.FeatureMap);
+
+            var threadx = Mathf.CeilToInt(surfaceHeightMap.width / 4f) < 1 ? 1 : Mathf.CeilToInt(surfaceHeightMap.width / 4f);
+            var thready = Mathf.CeilToInt(surfaceHeightMap.height / 4f) < 1 ? 1 : Mathf.CeilToInt(surfaceHeightMap.height / 4f);
+
+            _placement.Dispatch(kernel, threadx, thready, 1);
+
+            return surfaceHeightMap;
+        }
+        private void GenerateSharedData(FeatureData node)
+        {
+            var size = FindBufferSize(node);
+            node.TerrainPoints = new ComputeBuffer(size < 1 ? 1 : size, sizeof(float) * 8, ComputeBufferType.Append);
+
+            var mesh = node.Object.GetComponent<MeshFilter>().sharedMesh;
+            _placement.SetVector("terrainResolution", new Vector2(node.FeatureMap.width, node.FeatureMap.height));
+            _placement.SetVector("terrainSize", mesh.bounds.size);
+
+            _placement.SetVector("NodeOffset", node.NodeOffset);
+            _placement.SetVector("Resolution", _resolution);
+            _placement.SetFloat("Density", _density);
+            _placement.SetMatrix("ObjToWorld", node.Object.transform.localToWorldMatrix);
+        }
+        private void GenerateHeight(FeatureData node, Mesh mesh)
+        {
+            // ************* hack to find min uv, a bit of a performance thief ************* //
+
+            SetupBuffers(mesh);
+
+            _vertices.SetData(mesh.vertices);
+            _indices.SetData(mesh.GetIndices(0));
+            _texcoords.SetData(mesh.uv);
+
+            var kernelFindUV = _placement.FindKernel("CSFindMinUv");
+            _placement.SetInt("uvCount", mesh.vertexCount);
+            _placement.SetBuffer(kernelFindUV, "MinXY", node.MinXY);
+            _placement.SetBuffer(kernelFindUV, "surfaceUVs", _texcoords);
+            var threads = Mathf.CeilToInt(mesh.vertexCount / 32f) < 1 ? 1 : Mathf.CeilToInt(mesh.vertexCount / 32f);
+            _placement.Dispatch(kernelFindUV, threads, 1, 1);
+
+            var data = new uint[2];
+            node.MinXY.GetData(data);
+
+            // ************* Find center of Node ************* //
+
+            var offsetX = ((node.FeatureMap.width - 2) * _resolution.x / 2 - mesh.bounds.extents.x);
+            offsetX = data[0] > 0 ? -offsetX : offsetX;
+            var offsetY = ((node.FeatureMap.height - 2) * _resolution.y / 2 - mesh.bounds.extents.z);
+            offsetY = data[1] > 0 ? offsetY : -offsetY;
+
+            var center = mesh.bounds.center;
+            center.x += offsetX;
+            center.z += offsetY;
+
+            var extents = new Vector3(((node.FeatureMap.width - 2) * _resolution.x / 2), mesh.bounds.size.y, (node.FeatureMap.height * _resolution.y / 2));
+            _placement.SetVector("MeshBoundsMax", center + extents);
+
+            // ************* Generate Height Map  ************* //
+
+            var kernelHeight = _placement.FindKernel("CSHeightMap");
+
+            node.HeightMap = new RenderTexture(node.FeatureMap.width, node.FeatureMap.height, 24, RenderTextureFormat.RFloat);
+            node.HeightMap.enableRandomWrite = true;
+            node.HeightMap.Create();
+
+            var triangleCount = Mathf.CeilToInt(mesh.GetIndices(0).Length / 3f);
+
+            _placement.SetInt("indexCount", triangleCount);
+            _placement.SetBuffer(kernelHeight, "surfaceVertices", _vertices);
+            _placement.SetBuffer(kernelHeight, "surfaceIndices", _indices);
+            _placement.SetBuffer(kernelHeight, "surfaceUVs", _texcoords);
+            _placement.SetTexture(kernelHeight, "HeightMap", node.HeightMap);
+
+            threads = Mathf.CeilToInt(triangleCount / 4f) < 1 ? 1 : Mathf.CeilToInt(triangleCount / 4f);
+            _placement.Dispatch(kernelHeight, threads, 1, 1);
+        }
+        private void FeauturePlacement(FeatureData node)
+        {
+            //var surfaceHeight = GenerateSurfaceHeight(node);
+
+            var kernelPlacement = _placement.FindKernel("CSPlacement");
+            _placement.SetTexture(kernelPlacement, "SplatMap", node.FeatureMap);
+            _placement.SetTexture(kernelPlacement, "Texture", node.Texture);
+            _placement.SetTexture(kernelPlacement, "HeightMap", node.HeightMap);
+            _placement.SetTexture(kernelPlacement, "HeightSurface", node.surfaceHeight);
+
+            _placement.SetVector("heightResolution", new Vector2(node.surfaceHeight.width, node.surfaceHeight.height));
+            //node.surfaceHeightNew = toTexture2D(surfaceHeight);
+            //SaveImage(toTexture2D(surfaceHeight), Guid.NewGuid().ToString());
+
+            _placement.SetBuffer(kernelPlacement, "TerrainPoints", node.TerrainPoints);
+            _placement.SetBuffer(kernelPlacement, "PixelToWorld", node.PlacementMatrix);
+
+            int threadsX = Mathf.CeilToInt((node.FeatureMap.width) / (float)4);
+            int threadsY = Mathf.CeilToInt((node.FeatureMap.height) / (float)4);
+
+            node.TerrainPoints.SetCounterValue(0);
+            _placement.Dispatch(kernelPlacement, threadsX < 1 ? 1 : threadsX, threadsY < 1 ? 1 : threadsY, 1);
+
+            //surfaceHeight.Release();
+        }
+        public ComputeBuffer Cull(Vector4[] frustum, Camera camera, float maxHeight)
+        {
+            _pointCloud.SetCounterValue(0);     // only once every frame
+            var kernelCull = _placement.FindKernel("CSCull");
+
+            _placement.SetFloat("maxHeight", maxHeight);
+            _placement.SetBuffer(kernelCull, "OutputBuffer", _pointCloud);
+            _placement.SetVector("CameraPosition", camera.transform.position);
+            _placement.SetVectorArray("frustumPlanes", frustum);
+
+            var count = 0;
+            var points = 0;
+
+            foreach (var item in _items)
+            {
+                // don't cull disabled objects
+                if (!item.Object.activeInHierarchy)
+                    continue;
+
+                count++;
+                points += item.TerrainPoints.count;
+                _placement.SetBuffer(kernelCull, "InputBuffer", item.TerrainPoints);
+                _placement.SetMatrix("ObjToWorld", item.Object.transform.localToWorldMatrix);
+                _placement.Dispatch(kernelCull, Mathf.CeilToInt(item.TerrainPoints.count / 128f) < 1 ? 1 : Mathf.CeilToInt(item.TerrainPoints.count / 128f), 1, 1);
+            }
+
+            return _pointCloud;
+        }
+    }
+}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageFeature.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageFeature.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageFeature.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageFeature.cs.meta
diff --git a/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageModule.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageModule.cs
new file mode 100644
index 00000000..6bce4f2b
--- /dev/null
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageModule.cs
@@ -0,0 +1,244 @@
+﻿using Saab.Utility.GfxCaps;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+using UnityEngine;
+
+namespace Saab.Foundation.Unity.MapStreamer.Modules
+{
+    public class FoliageModule : MonoBehaviour
+    {
+        public SceneManager SceneManager;
+        public ComputeShader ComputeShader;
+        public Material FoliageMaterial;
+
+        [Header("Main Settings")]
+        public int BufferSize = 1000000;
+        public float DrawDistance = 3000;
+        public float Density = 0.5f;
+        public bool Shadows = false;
+
+        [Header("Debug Settings")]
+        public bool DebugPrintCount = false;
+        public bool Disabled = false;
+        public bool DebugNoDraw = false;
+
+        [Header("Auto filled Settings")]
+        public List<Foliage> FoliageTypes = new List<Foliage>();
+
+        private ComputeBuffer _inderectBuffer;
+        private FoliageFeature _foliage;
+        private Vector4[] _frustum = new Vector4[6];
+        private ComputeBuffer _foliageData;
+        private float _maxHeight;
+
+        // Start is called before the first frame update
+        void Start()
+        {
+            SceneManager.OnNewGeometry += SceneManager_OnNewGeometry;
+            SceneManager.OnPostTraverse += SceneManager_OnPostTraverse;
+            SceneManager.OnEnterPool += SceneManager_OnEnterPool;
+
+            Disabled = !GfxCaps.CurrentCaps.HasFlag(Capability.UseFoliageCrossboards);
+
+            var FoliageSetting = GfxCaps.GetFoliageSettings;
+            DrawDistance = FoliageSetting.DrawDistance;
+            Shadows = FoliageSetting.Shadows;
+            Density = FoliageSetting.Density;
+
+            _foliage = new FoliageFeature(BufferSize, Density, ComputeShader);
+
+            // ------- Setup -------
+            _inderectBuffer = new ComputeBuffer(4, sizeof(uint), ComputeBufferType.IndirectArguments);
+            _inderectBuffer.SetData(new uint[] { 0, 1, 0, 0 });
+
+            SetupFoliage();
+        }
+
+        private void OnValidate()
+        {
+#if UNITY_EDITOR
+            FoliageTypes = AssetDatabase.FindAssets($"t: {typeof(Foliage).Name}").ToList()
+                     .Select(AssetDatabase.GUIDToAssetPath)
+                     .Select(AssetDatabase.LoadAssetAtPath<Foliage>)
+                     .ToList();
+#endif
+        }
+
+        struct FoliageShaderData
+        {
+            public Vector2 MaxMin;
+            public Vector2 Offset;
+            public float Weight;
+        };
+
+        private void SetupFoliage()
+        {
+
+
+#if UNITY_ANDROID
+            var format = TextureFormat.ETC2_RGBA8;
+            Debug.Log("foliage Use ETC2");
+#else
+            var format = TextureFormat.DXT5;
+#endif           
+            var mainTexs = Create2DArray(FoliageTypes, format);
+
+            FoliageMaterial.SetInt("_foliageCount", FoliageTypes.Count);
+            FoliageMaterial.SetTexture("_MainTexArray", mainTexs);
+
+            var data = new FoliageShaderData[FoliageTypes.Count];
+            for (int i = 0; i < FoliageTypes.Count; i++)
+            {
+                var foliage = FoliageTypes[i];
+                _maxHeight = Mathf.Max(_maxHeight, foliage.MaxMin.y);
+
+                var item = new FoliageShaderData()
+                {
+                    MaxMin = foliage.MaxMin,
+                    Offset = foliage.Offset,
+                    Weight = foliage.Weight,
+                };
+                data[i] = item;
+            }
+
+            if (_foliageData != null)
+                _foliageData.Release();
+
+            _foliageData = new ComputeBuffer(FoliageTypes.Count, sizeof(float) * 5, ComputeBufferType.Default);
+            _foliageData.SetData(data);
+            FoliageMaterial.SetBuffer("_foliageData", _foliageData);
+        }
+
+        private static uint NextPowerOfTwo(uint v)
+        {
+            v--;
+            v |= v >> 1;
+            v |= v >> 2;
+            v |= v >> 4;
+            v |= v >> 8;
+            v |= v >> 16;
+
+            return v + 1;
+        }
+
+        public int GetMemoryfootprint()
+        {
+            return _foliage.GetVideoMemoryUsage();
+        }
+        public Texture2DArray Create2DArray(List<Foliage> foliages, TextureFormat targetFormat)
+        {
+            var textureCount = foliages.Count;
+            var textureResolution = Mathf.Max(foliages.Max(item => item.MainTexture.width), foliages.Max(item => item.MainTexture.height));
+            textureResolution = (int)NextPowerOfTwo((uint)textureResolution);
+
+            Texture2DArray textureArray;
+
+            textureArray = new Texture2DArray(textureResolution, textureResolution, textureCount, targetFormat, true)
+            {
+                wrapMode = TextureWrapMode.Clamp
+            };
+
+            RenderTexture temporaryRenderTexture = new RenderTexture(textureResolution, textureResolution, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default)
+            {
+                useMipMap = true,
+                antiAliasing = 1
+            };
+
+            for (int i = 0; i < textureCount; i++)
+            {
+                //Debug.LogWarning($"graphic format: {foliages[i].MainTexture.graphicsFormat} format: {foliages[i].MainTexture.format}");
+                Graphics.Blit(foliages[i].MainTexture, temporaryRenderTexture);
+                RenderTexture.active = temporaryRenderTexture;
+
+                Texture2D temporaryTexture = new Texture2D(textureResolution, textureResolution, TextureFormat.ARGB32, true);
+                temporaryTexture.ReadPixels(new Rect(0, 0, temporaryTexture.width, temporaryTexture.height), 0, 0);
+                RenderTexture.active = null;
+                temporaryTexture.Apply(true);
+                temporaryTexture.Compress(true);
+                Graphics.CopyTexture(temporaryTexture, 0, textureArray, i);
+
+                DestroyImmediate(temporaryTexture);
+            }
+            textureArray.Apply(false, true);
+
+            DestroyImmediate(temporaryRenderTexture);
+
+            return textureArray;
+        }
+        private void GenerateFrustumPlane(Camera camera)
+        {
+            var planes = GeometryUtility.CalculateFrustumPlanes(camera);
+
+            for (int i = 0; i < 6; i++)
+            {
+                _frustum[i] = new Vector4(planes[i].normal.x, planes[i].normal.y, planes[i].normal.z, planes[i].distance);
+            }
+            _frustum[5].w = DrawDistance;  // draw distance
+        }
+        private void SceneManager_OnEnterPool(GameObject go)
+        {
+            _foliage.RemoveFoliage(go);
+        }
+        private void SceneManager_OnNewGeometry(GameObject go)
+        {
+            var nodehandle = go.GetComponent<NodeHandle>();
+
+            if (nodehandle != null && !Disabled)
+            {
+                if (nodehandle.node.BoundaryRadius < 890 && nodehandle.node.BoundaryRadius > 0)
+                {
+                    var res = _foliage.AddFoliage(go, nodehandle);
+
+                    //if (Mathf.Abs(nodehandle.node.BoundaryRadius - 361.1371f) < 0.001f)
+                    //    _foliage.AddFoliage(go, nodehandle);
+                    //if (nodehandle.name == "15_38_85" || nodehandle.name == "15_38_84" || nodehandle.name == "15_39_85" || nodehandle.name == "15_39_84")
+                    //    _foliage.AddFoliage(go, nodehandle);
+                    //if (res != null)
+                    //  go.GetComponent<MeshRenderer>().material.mainTexture = res.surfaceHeight;
+                }
+            }
+        }
+
+        private void OnDestroy()
+        {
+            if (_foliage != null)
+                _foliage.Dispose();
+            _inderectBuffer.Release();
+            _foliageData.Dispose();
+        }
+
+        private void SceneManager_OnPostTraverse(bool locked)
+        {
+            if (Disabled)
+                return;
+
+            var cam = SceneManager.SceneManagerCamera.Camera;
+            GenerateFrustumPlane(cam);
+
+            // Render all points
+            var buffer = _foliage.Cull(_frustum, cam, _maxHeight);
+            FoliageMaterial.SetBuffer("_PointBuffer", buffer);
+
+            // ------- Render -------
+            ComputeBuffer.CopyCount(buffer, _inderectBuffer, 0);
+
+            if (DebugPrintCount)
+            {
+                DebugPrintCount = false;
+                int[] array = new int[4];
+                _inderectBuffer.GetData(array);
+                UnityEngine.Debug.LogFormat(LogType.Warning, LogOption.NoStacktrace, null, "Current buffer size :: {0}/{1}", array[0].ToString(), buffer.count);
+            }
+
+            if (DebugNoDraw)
+                return;
+
+            var renderBounds = new Bounds(Vector3.zero, new Vector3(DrawDistance, DrawDistance, DrawDistance));
+            Graphics.DrawProceduralIndirect(FoliageMaterial, renderBounds, MeshTopology.Points, _inderectBuffer, 0, null, null, Shadows ? UnityEngine.Rendering.ShadowCastingMode.On : UnityEngine.Rendering.ShadowCastingMode.Off);
+        }
+    }
+}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageModule.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageModule.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageModule.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/FoliageModule.cs.meta
diff --git a/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/GrassModule.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/GrassModule.cs
new file mode 100644
index 00000000..614b5378
--- /dev/null
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/GrassModule.cs
@@ -0,0 +1,397 @@
+﻿/* 
+ * Copyright (C) SAAB AB
+ *
+ * All rights, including the copyright, to the computer program(s) 
+ * herein belong to Saab AB. The program(s) may be used and/or
+ * copied only with the written permission of Saab AB, or in
+ * accordance with the terms and conditions stipulated in the
+ * agreement/contract under which the program(s) have been
+ * supplied. 
+ * 
+ * Information Class:          COMPANY RESTRICTED
+ * Defence Secrecy:            UNCLASSIFIED
+ * Export Control:             NOT EXPORT CONTROLLED
+ * 
+ */
+
+using Saab.Unity.Core.ComputeExtension;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+
+namespace Saab.Foundation.Unity.MapStreamer.Modules
+{
+    public class GrassModule : TerrainFeature
+    {
+        [Header("****** SETTINGS ******")]
+        public TerrainTextures[] GrassTextures;
+        public Texture2D PerlinNoise;
+        public Texture2D DefaultSplatMap;
+        public ComputeShader ComputeShader; // <-- TODO: Replace with 1 shader per responsibility (generator, culling, rendering)
+        public int BufferLimit = 1000000;
+        public bool UsePlacementMap;
+
+        // maximum concurrent GPU jobs, higher values increases memory footprint
+        private const int MAX_JOBS_PER_FRAME = 2;
+
+        // list of all current jobs being processed by the GPU
+        private readonly List<JobOutput> _currentJobs = new List<JobOutput>(MAX_JOBS_PER_FRAME);
+
+        // list of all jobs not yet processed
+        private readonly List<PendingJob> _pendingJobs = new List<PendingJob>();
+
+        // list of all instances currently being rendered
+        private readonly List<Item> _items = new List<Item>(128);
+
+        // used to draw all instances
+        private RenderingShader _renderingShader;
+
+        // used to generate instance data from a mesh
+        private readonly Stack<InstanceGenerator> _pointGenerators = new Stack<InstanceGenerator>();
+
+        // TEMP TEST JUNK
+        public Mesh TestMesh;
+        public Material TestMat;
+
+        private void Start()
+        {
+            if (PerlinNoise == null)
+            {
+                PerlinNoise = Resources.Load("Textures/PerlinNoiseRGB") as Texture2D;
+            }
+
+            _renderingShader = new RenderingShader(ComputeShader, Shader, BufferLimit)
+            {
+                Noise = PerlinNoise,
+                ColorVariance = PerlinNoise,
+            };
+
+            _renderingShader.DebugMode = DebugMode;
+
+#if UNITY_ANDROID
+            var format = TextureFormat.ETC2_RGBA8;
+            Debug.Log("Grass Use ETC2");
+#else
+            var format = TextureFormat.DXT5;
+#endif
+
+            // ...
+            _renderingShader.SetBillboardData(Create2DArray(GrassTextures, format),
+                GrassTextures.Select(x => x.GetMinMaxWidthHeight).ToArray(),
+                GrassTextures.Select(x => x.Yoffset).ToArray());
+
+            _renderingShader.SetQuads(GetQuads(GrassTextures, true));
+        }
+
+        public void AddGrass(GameObject go, Texture2D placementMap = null)
+        {
+            var meshFilter = go.GetComponent<MeshFilter>();
+            if (!meshFilter)
+                return;
+
+            var meshRenderer = go.GetComponent<MeshRenderer>();
+            if (!meshRenderer)
+                return;
+
+            var material = meshRenderer.material;
+            if (!material)
+                return;
+
+            var diffuse = material.mainTexture as Texture2D;
+            if (diffuse == null)
+                return;
+
+            System.Diagnostics.Debug.Assert(meshFilter.mesh.GetTopology(0) == MeshTopology.Triangles);
+
+            _pendingJobs.Add(new PendingJobMesh()
+            {
+                GameObject = go,
+                Mesh = meshFilter.mesh,
+                Diffuse = diffuse,
+                PlacementMap = placementMap
+            });
+        }
+        public void RemoveGrass(GameObject gameobj)
+        {
+            for (var i = 0; i < _currentJobs.Count; ++i)
+            {
+                if (_currentJobs[i].GameObject != gameobj)
+                    continue;
+
+                _currentJobs[i].PointBuffer.SafeRelease();
+                _pointGenerators.Push(_currentJobs[i].Generator);
+
+                if ((i + 1) < _currentJobs.Count)
+                    _currentJobs[i] = _currentJobs[_currentJobs.Count - 1];
+
+                _currentJobs.RemoveAt(_currentJobs.Count - 1);
+
+                return;
+            }
+
+
+            for (var i = 0; i < _items.Count; ++i)
+            {
+                if (_items[i].GameObject != gameobj)
+                    continue;
+
+                _items[i].Dispose();
+
+                if ((i + 1) < _items.Count)
+                    _items[i] = _items[_items.Count - 1];
+
+                _items.RemoveAt(_items.Count - 1);
+
+                return;
+            }
+
+            for (var i = 0; i < _pendingJobs.Count; ++i)
+            {
+                if (_pendingJobs[i].GameObject != gameobj)
+                    continue;
+
+                if ((i + 1) < _pendingJobs.Count)
+                    _pendingJobs[i] = _pendingJobs[_pendingJobs.Count - 1];
+
+                _pendingJobs.RemoveAt(_pendingJobs.Count - 1);
+
+                return;
+            }
+        }
+        private void AddJobs()
+        {
+            // TODO: Can we avoid sorting per-frame? Change swap-remove to something else and only sort on
+
+            if (SortByDistance)
+            {
+                _pendingJobs.Sort((a, b) =>
+                {
+                    var d1 = a.GameObject.transform.position.sqrMagnitude;
+                    var d2 = b.GameObject.transform.position.sqrMagnitude;
+                    return d1.CompareTo(d2);
+                });
+            }
+
+            for (var i = 0; i < _pendingJobs.Count; ++i)
+            {
+                var job = _pendingJobs[i] as PendingJobMesh;
+
+                if (job == null)
+                    return;
+
+                var go = job.GameObject;
+
+                // get new job, according to certain rules (maybe priority later)
+                if (!go.activeInHierarchy)
+                    continue;
+
+                var mesh = job.Mesh;
+                var bounds = mesh.bounds;
+
+                var extents = bounds.extents;
+                var maxExtent = Mathf.Max(extents.x, extents.y, extents.z) * 2;
+                var centerWorld = go.transform.TransformPoint(bounds.center);
+
+                var frustum = _frustum;
+                _frustum[5].w += maxExtent + DrawDistance;
+
+                if (!IsInFrustum(centerWorld - CameraPosition, -maxExtent * 1.75f))
+                    continue;
+
+                var triangleCount = mesh.GetIndexCount(0) / 3f;
+                var bufferSize = Math.Max(1, (maxExtent * maxExtent) / Density);
+                bufferSize = bufferSize < triangleCount ? triangleCount : bufferSize;
+
+                _frustum = frustum;
+
+                if (_pointGenerators.Count == 0 || _pointGenerators.Peek().GetFeature != InstanceGenerator.Feature.Grass)
+                {
+                    _pointGenerators.Push(new InstanceGenerator(Instantiate(ComputeShader), InstanceGenerator.Feature.Grass)
+                    {
+                        Density = Density,
+                        SplatMap = DefaultSplatMap
+                    });
+                }
+
+                var pointGenerator = _pointGenerators.Pop();
+                var outputBuffer = new ComputeBuffer(Mathf.CeilToInt(bufferSize), sizeof(float) * 4, ComputeBufferType.Append);
+
+                outputBuffer.SetCounterValue(0);
+                pointGenerator.SetMesh(mesh);
+                pointGenerator.PlacementMapEnabled = false;
+
+                if (job.PlacementMap != null && UsePlacementMap)
+                {
+                    pointGenerator.PlacementMap = job.PlacementMap;
+                    pointGenerator.PlacementMapEnabled = true;
+                }
+                else
+                {
+                    pointGenerator.PlacementMap = new Texture2D(job.Diffuse.width, job.Diffuse.height);
+                }
+
+                pointGenerator.ColorMap = job.Diffuse;
+                pointGenerator.OutputBuffer = outputBuffer;
+
+                var threadGroups = Mathf.CeilToInt(triangleCount / 16f);
+                pointGenerator.Dispatch(threadGroups > 0 ? threadGroups : 1, 16);
+
+                // swap remove
+                if ((i + 1) < _pendingJobs.Count)
+                    _pendingJobs[i--] = _pendingJobs[_pendingJobs.Count - 1];
+                _pendingJobs.RemoveAt(_pendingJobs.Count - 1);
+
+                _currentJobs.Add(new JobOutput()
+                {
+                    GameObject = go,
+                    Bounds = bounds,
+                    PointBuffer = outputBuffer,
+                    Generator = pointGenerator
+                });
+
+                if (_currentJobs.Count >= MAX_JOBS_PER_FRAME)
+                    return;
+            }
+        }
+        public int GetMemoryFootprint
+        {
+            get
+            {
+                var size = GetModuleBufferMemory(_items);
+                size += GetModuleBufferMemory(_currentJobs);
+                size += _renderingShader.GetMemoryFootPrint;
+                return size;
+            }
+        }
+        private void Render()
+        {
+            var camera = CurrentCamera;
+
+            if (!camera)
+                return;
+
+            _renderingShader.Depth = DepthTexture;
+
+            for (var i = 0; i < _currentJobs.Count; ++i)
+            {
+                var job = _currentJobs[i];
+
+                var cullShader = new CullingShader(Instantiate(ComputeShader), CullingShader.CullingType.Fade)
+                {
+                    InputBuffer = job.PointBuffer,
+                    RenderBufferNear = _renderingShader.RenderBufferNear,
+                    RenderBufferFar = _renderingShader.RenderBufferFar,
+                };
+
+                var item = new Item()
+                {
+                    GameObject = job.GameObject,
+                    CullShader = cullShader,
+                    Bounds = job.Bounds,
+                };
+
+                _items.Add(item);
+
+                _pointGenerators.Push(job.Generator);
+            }
+
+            _currentJobs.Clear();
+
+            AddJobs();
+
+            var fadeFarAmmount = DrawDistance / 3;
+            var fadeFarValue = DrawDistance - fadeFarAmmount;
+
+            fadeFarAmmount = fadeFarAmmount > 0 ? fadeFarAmmount : 1;
+            fadeFarValue = fadeFarValue > 0 ? fadeFarValue : 1;
+
+            _renderingShader.SetNearFade(NearFadeStart, NearFadeEnd);
+            _renderingShader.SetFarFade(fadeFarValue, fadeFarAmmount);
+            _renderingShader.Wind = Wind;
+
+            _renderingShader.Frustum = _frustum;
+
+            _renderingShader.RenderBegin();
+
+            GameObject any = null;
+            var maxSide = 0f;
+
+            // Culling      
+            for (var i = 0; i < _items.Count; ++i)
+            {
+                var item = _items[i];
+
+                var go = item.GameObject;
+                if (!go.activeInHierarchy)
+                    continue;
+
+                any = go;
+
+                var bounds = item.Bounds;
+
+                var maxExtent = Mathf.Max(bounds.extents.x, bounds.extents.y, bounds.extents.z) * 2;
+                maxSide = maxExtent + DrawDistance;
+
+                var centerWorld = go.transform.TransformPoint(bounds.center);
+
+                var frustum = _frustum;
+                _frustum[5].w += maxSide;
+
+                if (!IsInFrustum(centerWorld - CameraPosition, (-maxSide * 1.75f)))
+                    continue;
+
+                _frustum[5].w = DrawDistance;
+
+                var cullShader = item.CullShader;
+
+                cullShader.LocalToWorld = go.transform.localToWorldMatrix;
+                cullShader.Frustum = frustum;
+                cullShader.CameraPosition = CameraPosition;
+
+                cullShader.Dispatch();
+            }
+
+            if (any == null)
+                return;
+
+            // TODO: 
+            var roiTransform = FindFirstNodeParent(any.transform);
+
+            var worldToLocal = roiTransform == null ? Matrix4x4.identity : roiTransform.worldToLocalMatrix;
+
+            _renderingShader.WorldToLocal = worldToLocal;
+            _renderingShader.ViewDirection = CurrentCamera.transform.forward;
+
+            var renderBounds = new Bounds(Vector3.zero, new Vector3(maxSide, maxSide, maxSide));
+
+            var shadows = DrawShadows ? UnityEngine.Rendering.ShadowCastingMode.On : UnityEngine.Rendering.ShadowCastingMode.Off;
+            _renderingShader.ShadowCastingMode = shadows;
+
+            _renderingShader.RenderEnd(renderBounds);
+        }
+        public void Camera_OnPostTraverse()
+        {
+            _renderingShader.DebugMode = DebugMode;
+            Render();
+        }
+
+        private void OnDestroy()
+        {
+            for (var i = 0; i < _items.Count; ++i)
+                _items[i].Dispose();
+
+            for (var i = 0; i < _currentJobs.Count; ++i)
+            {
+                _currentJobs[i].PointBuffer.SafeRelease();
+                _currentJobs[i].Generator.Dispose();
+            }
+
+            while (_pointGenerators.Count > 0)
+                _pointGenerators.Pop().Dispose();
+
+            if (_renderingShader != null)
+                _renderingShader.Dispose();
+        }
+    }
+}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug/DebugUtils.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/GrassModule.cs.meta
similarity index 83%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug/DebugUtils.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/GrassModule.cs.meta
index 9764b6e5..96f03e67 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug/DebugUtils.cs.meta
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/GrassModule.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: a3798a5c92da7624dacc2687f6cede19
+guid: 028fea051f1d6d54485dfcc3c75a70a6
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/InstanceGenerator.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/InstanceGenerator.cs
similarity index 94%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/InstanceGenerator.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/InstanceGenerator.cs
index ce690de8..9baaf7bf 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/InstanceGenerator.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/InstanceGenerator.cs
@@ -182,7 +182,7 @@ public void SetPoints(Vector3[] points)
         {
             if (points.Length > _maxVertices)
             {
-                //Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "Shader: Updated vertices buffer size from: {0} -- {1}", _maxVertices, points.Length);
+                Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "Shader: Updated vertices buffer size from: {0} -- {1}", _maxVertices, points.Length);
                 _maxVertices = points.Length;
                 _maxIndices = points.Length;
                 GenerateBuffers(_maxVertices, _maxIndices);
@@ -206,7 +206,7 @@ public void SetMesh(Mesh mesh, bool pointCloud = false)
 
             if (_surfaceIndices.Count > _maxIndices || surfaceVertices.Length > _maxVertices)
             {
-                //Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "Shader: Updated vertices buffer size from: {0} -- {1}\nUpdated indices buffer size from: {2} -- {3}", _maxVertices, surfaceVertices.Length, _maxIndices, _surfaceIndices.Count);
+                Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "Shader: Updated vertices buffer size from: {0} -- {1}\nUpdated indices buffer size from: {2} -- {3}", _maxVertices, surfaceVertices.Length, _maxIndices, _surfaceIndices.Count);
                 _maxVertices = surfaceVertices.Length;
                 _maxIndices = _surfaceIndices.Count;
                 GenerateBuffers(_maxVertices, _maxIndices);
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/InstanceGenerator.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/InstanceGenerator.cs.meta
similarity index 83%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/InstanceGenerator.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/InstanceGenerator.cs.meta
index a783ceef..2cb12404 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/InstanceGenerator.cs.meta
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/InstanceGenerator.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 2729e86ba95ddc3448825ffc11ec4afa
+guid: 28dc8509b799c014d9148a9fe09be21f
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/RenderingShader.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/RenderingShader.cs
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/RenderingShader.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/RenderingShader.cs
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/RenderingShader.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/RenderingShader.cs.meta
similarity index 83%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/RenderingShader.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/RenderingShader.cs.meta
index b41e7ae2..73a7fee6 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/RenderingShader.cs.meta
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/RenderingShader.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 9b895620e05a52a44864e7935df44941
+guid: 598c51287546e304ca6d3133b7c427c5
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainFeature.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TerrainFeature.cs
similarity index 96%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainFeature.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TerrainFeature.cs
index bd0d1e24..26fec947 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainFeature.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TerrainFeature.cs
@@ -284,26 +284,33 @@ public static Texture2DArray Create2DArray(TerrainTextures[] texture, TextureFor
                 wrapMode = TextureWrapMode.Clamp
             };
 
-            RenderTexture temporaryRenderTexture = RenderTexture.GetTemporary(textureResolution, textureResolution, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default, 1);
+            RenderTexture temporaryRenderTexture = new RenderTexture(textureResolution, textureResolution, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default)
+            {
+                useMipMap = true,
+                antiAliasing = 1
+            };
 
             for (int i = 0; i < textureCount; i++)
             {
                 Graphics.Blit(texture[i].FeatureTexture, temporaryRenderTexture);
                 RenderTexture.active = temporaryRenderTexture;
 
+                //Debug.LogFormat(LogType.Error, LogOption.NoStacktrace, null, "creating 2d texture: {0} x {0}", textureResolution);
                 Texture2D temporaryTexture = new Texture2D(textureResolution, textureResolution, TextureFormat.ARGB32, true);
 
                 temporaryTexture.ReadPixels(new Rect(0, 0, temporaryTexture.width, temporaryTexture.height), 0, 0);
                 RenderTexture.active = null;
                 temporaryTexture.Apply(true);
                 temporaryTexture.Compress(true);
+
+                //TexToFile(temporaryGrassTexture, Application.dataPath + "/../grassTextureArraySaved_" + i + ".png");
+
                 Graphics.CopyTexture(temporaryTexture, 0, textureArray, i);
-                DestroyImmediate(temporaryTexture);
+                Destroy(temporaryTexture);
             }
             textureArray.Apply(false, true);
 
-            RenderTexture.ReleaseTemporary(temporaryRenderTexture);
-            DestroyImmediate(temporaryRenderTexture);
+            Destroy(temporaryRenderTexture);
 
             return textureArray;
         }
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainFeature.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TerrainFeature.cs.meta
similarity index 83%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainFeature.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TerrainFeature.cs.meta
index c35c3424..7a0c19eb 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainFeature.cs.meta
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TerrainFeature.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 565e44dc3e4331e4282090ebcd24866f
+guid: f2a1ae34a229d8346bba015fffed39b0
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TerrainModule.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TerrainModule.cs
new file mode 100644
index 00000000..2ea2c168
--- /dev/null
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TerrainModule.cs
@@ -0,0 +1,480 @@
+﻿/* 
+ * Copyright (C) SAAB AB
+ *
+ * All rights, including the copyright, to the computer program(s) 
+ * herein belong to Saab AB. The program(s) may be used and/or
+ * copied only with the written permission of Saab AB, or in
+ * accordance with the terms and conditions stipulated in the
+ * agreement/contract under which the program(s) have been
+ * supplied. 
+ * 
+ * Information Class:          COMPANY RESTRICTED
+ * Defence Secrecy:            UNCLASSIFIED
+ * Export Control:             NOT EXPORT CONTROLLED
+ */
+
+using UnityEngine;
+using System.Collections;
+using System;
+using Saab.Utility.GfxCaps;
+
+namespace Saab.Foundation.Unity.MapStreamer.Modules
+{
+    [Serializable]
+    public struct TerrainSetting
+    {
+        public TerrainTextures[] GrassTextures;
+        public TerrainTextures[] TreeTextures;
+        public Texture2D[] TerrainDetailTextures;
+        public Texture2D[] TerrainDetailNormalMaps;
+        public Texture2D[] TerrainDetailHeightMaps;
+        public Texture2D[] TerrainDetailRoughnessMaps;
+
+        public Texture2D PerlinNoise;
+        public Texture2D DefaultSplatMap;
+        public Texture2D PlacementMap;
+
+        public float wind;
+        public bool SortByDistance;
+
+        public float GrassDensity;      // 0.0413
+        public float TreeDensity;       // 22.127
+
+        public Mesh TreeTestMesh;
+        public Material TreeTestMaterial;
+
+        public int GrassDrawDistance;
+        public int TreeDrawDistance;
+
+        public bool GrassShadows;
+        public bool TreeShadows;
+
+        public ComputeShader ComputeTerrainShader;
+        public Shader GrassShader;
+        public Shader TreeShader;
+        public Shader DetailTextureShader;
+    }
+
+    public class TerrainModule : MonoBehaviour
+    {
+        public SceneManager SceneManager;
+
+        [Header("Compute Shader Settings")]
+        public ComputeShader DepthShader;
+        public bool OcclusionCulling;
+
+        [Header("Main Settings")]
+        public bool EnableTrees = false;
+        public bool EnableCross = false;
+        public bool EnableGrass = false;
+        public bool EnableDetailedTextures = false;
+
+        [Header("Module Settings")]
+        public TerrainSetting TerrainSettings;
+
+        [Header("Debug/Test Settings")]
+        public bool PointCloud;
+        public bool TreeMesh;
+
+        private GrassModule _grassModule;
+        private TreeModule _treeModule;
+        private GameObject _modulesParent;
+        private Camera _camera;
+
+        [SerializeField]
+        private RenderTexture _outputTex;
+        [SerializeField]
+        private RenderTexture _whiteTex;
+
+        private Vector4[] _frustum = new Vector4[6];
+        private int _kernelHandle;
+
+        private void Awake()
+        {
+            _whiteTex = new RenderTexture(Screen.width, Screen.height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
+            _whiteTex.enableRandomWrite = true;
+            _whiteTex.Create();
+
+            RenderTexture.active = _whiteTex;
+            GL.Clear(true, true, Color.white);
+            RenderTexture.active = null;
+
+            if (SceneManager == null) { return; }
+
+            EnableTrees = GfxCaps.CurrentCaps.HasFlag(Capability.UseDynamicTreeCrossboards);
+            EnableCross = GfxCaps.CurrentCaps.HasFlag(Capability.UseTreeCrossboards);
+            EnableGrass = GfxCaps.CurrentCaps.HasFlag(Capability.UseDynamicGrassCrossboards);
+            EnableDetailedTextures = GfxCaps.CurrentCaps.HasFlag(Capability.UseTerrainDetailTextures);
+
+            var grassSetting = GfxCaps.GetGrassSettings;
+            var treeSetting = GfxCaps.GetTreeSettings;
+
+            TerrainSettings.GrassDensity = grassSetting.Density;
+            TerrainSettings.GrassDrawDistance = grassSetting.DrawDistance;
+            TerrainSettings.TreeDensity = treeSetting.Density;
+            TerrainSettings.TreeDrawDistance = treeSetting.DrawDistance;
+            InitializeModule(SceneManager);
+        }
+
+        public void InitializeModule(SceneManager sceneManager)
+        {
+            SceneManager = sceneManager;
+            _modulesParent = this.gameObject;
+
+            if (SceneManager)
+            {
+                InitMapModules();
+                if (_treeModule != null || _grassModule != null)
+                    SceneManager.OnPostTraverse += SceneManager_OnPostTraverse;
+
+                if (_treeModule != null)
+                {
+                    SceneManager.OnEnterPool += _treeModule.RemoveTree;
+                }
+
+                if (_grassModule != null)
+                {
+                    SceneManager.OnEnterPool += _grassModule.RemoveGrass;
+                }
+
+                if(sceneManager.SceneManagerCamera != null)
+                    _camera = sceneManager.SceneManagerCamera.Camera;
+            }
+        }
+
+        public void SetCamera(Camera camera)
+        {
+            _camera = camera;
+        }
+
+        public void GenerateFrustumPlane(Camera camera)
+        {
+            var planes = GeometryUtility.CalculateFrustumPlanes(camera);
+
+            for (int i = 0; i < 6; i++)
+            {
+                _frustum[i] = new Vector4(planes[i].normal.x, planes[i].normal.y, planes[i].normal.z, planes[i].distance);
+            }
+        }
+
+        public void GetDepthTexture(Camera camera)
+        {
+            if (_outputTex == null || (_outputTex.width != camera.pixelWidth || _outputTex.height != camera.pixelHeight))
+            {
+                _outputTex = new RenderTexture(camera.pixelWidth, camera.pixelHeight, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
+                _outputTex.enableRandomWrite = true;
+                _outputTex.Create();
+
+                _whiteTex = new RenderTexture(camera.pixelWidth, camera.pixelHeight, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
+                _whiteTex.enableRandomWrite = true;
+                _whiteTex.Create();
+
+                RenderTexture.active = _whiteTex;
+                GL.Clear(true, true, Color.white);
+                RenderTexture.active = null;
+            }
+
+            _kernelHandle = DepthShader.FindKernel("Depth");
+            DepthShader.SetTextureFromGlobal(_kernelHandle, "_DepthTexture", "_CameraDepthTexture");
+            DepthShader.SetTexture(_kernelHandle, "_OutputTexture", _outputTex);
+            DepthShader.Dispatch(_kernelHandle, Mathf.CeilToInt(camera.pixelWidth / 32), Mathf.CeilToInt(camera.pixelHeight / 32), 1);
+        }
+
+        private void SceneManager_OnPostTraverse(bool locked)
+        {
+            if (_camera == null)
+                return;
+
+            if (_camera.depthTextureMode != DepthTextureMode.Depth)
+                _camera.depthTextureMode = _camera.depthTextureMode | DepthTextureMode.Depth;
+
+            GenerateFrustumPlane(_camera);
+
+            if (OcclusionCulling)
+                GetDepthTexture(_camera);
+
+            if (_treeModule != null && (EnableTrees || EnableCross))
+            {
+                if (OcclusionCulling)
+                    _treeModule.DepthTexture = _outputTex;
+                else
+                    _treeModule.DepthTexture = _whiteTex;
+
+                _treeModule.FrustumPlane = _frustum;
+                _treeModule.CurrentCamera = _camera;
+                _treeModule.Camera_OnPostTraverse();
+            }
+
+            if (_grassModule != null && EnableGrass)
+            {
+                if (OcclusionCulling)
+                    _grassModule.DepthTexture = _outputTex;
+                else
+                    _grassModule.DepthTexture = _whiteTex;
+
+                _grassModule.FrustumPlane = _frustum;
+                _grassModule.CurrentCamera = _camera;
+                _grassModule.Camera_OnPostTraverse();
+            }
+        }
+
+        private IEnumerator GetTerrainMemory()
+        {
+            while (true)
+            {
+                yield return new WaitForSeconds(2f); // wait two seconds
+                int size = 0;
+                if (_grassModule != null)
+                {
+                    size += _grassModule.GetMemoryFootprint;
+                }
+
+                if (_treeModule != null)
+                    size += _treeModule.GetMemoryFootprint;
+
+                //Debug.LogFormat(LogType.Warning, LogOption.NoStacktrace, null, "Memory Footprint {0} MB", (size / 1000000f).ToString("F2"));
+            }
+        }
+
+        private void InitMapModules()
+        {
+            //if (EnableGrass)
+            {
+                // ******* setup GameObject *******
+                var go = new GameObject("GrassModule");
+                go.transform.parent = _modulesParent.transform;
+                _grassModule = go.AddComponent<GrassModule>();
+
+                // ********************************
+                _grassModule.GrassTextures = TerrainSettings.GrassTextures;
+                _grassModule.PerlinNoise = TerrainSettings.PerlinNoise;
+                _grassModule.DefaultSplatMap = TerrainSettings.DefaultSplatMap;
+                _grassModule.ComputeShader = TerrainSettings.ComputeTerrainShader;
+                _grassModule.Shader = TerrainSettings.GrassShader;
+
+                _grassModule.DrawDistance = TerrainSettings.GrassDrawDistance;
+                _grassModule.DrawShadows = TerrainSettings.GrassShadows;
+                _grassModule.SortByDistance = TerrainSettings.SortByDistance;
+
+                _grassModule.Wind = TerrainSettings.wind;
+
+                _grassModule.Density = TerrainSettings.GrassDensity;
+                _grassModule.UsePlacementMap = true;
+            }
+
+            //if (EnableTrees || EnableCross)
+            {
+                // ******* setup GameObject *******
+                var go = new GameObject("TreeModule");
+                go.transform.parent = _modulesParent.transform;
+                _treeModule = go.AddComponent<TreeModule>();
+
+                // ********************************
+                _treeModule.PointCloud = PointCloud;
+                _treeModule.MeshTree = TreeMesh;
+
+                _treeModule.TreeTextures = TerrainSettings.TreeTextures;
+                _treeModule.PerlinNoise = TerrainSettings.PerlinNoise;
+                _treeModule.DefaultSplatMap = TerrainSettings.DefaultSplatMap;
+                _treeModule.ComputeShader = TerrainSettings.ComputeTerrainShader;
+                _treeModule.Shader = TerrainSettings.TreeShader;
+
+                _treeModule.TestMesh = TerrainSettings.TreeTestMesh;
+                _treeModule.TestMat = TerrainSettings.TreeTestMaterial;
+
+                _treeModule.DrawDistance = TerrainSettings.TreeDrawDistance;
+                _treeModule.DrawShadows = TerrainSettings.TreeShadows;
+                _treeModule.SortByDistance = TerrainSettings.SortByDistance;
+
+                _treeModule.Wind = TerrainSettings.wind / 100;
+
+                _treeModule.Density = TerrainSettings.TreeDensity;
+                _treeModule.UsePlacementMap = true;
+            }
+
+            SceneManager.OnNewGeometry += SceneManager_OnNewGeometry;
+            SceneManager.OnNewCrossboard += SceneManager_OnNewCrossboard;
+        }
+
+        private void SceneManager_OnNewCrossboard(GameObject go)
+        {
+            var nodehandler = go.GetComponent<NodeHandle>();
+
+            if (nodehandler == null)
+                return;
+
+            var cb = nodehandler.node as GizmoSDK.Gizmo3D.Crossboard;
+
+            if (cb == null)
+                return;
+
+            if (!cb.GetObjectPositions(out float[] position_data))
+                return;
+
+            // *************** Deprecated ***************
+            if (!cb.GetObjectData(out float[] object_data))
+                return;
+            // ******************************************
+
+            var objects = position_data.Length / 3; // Number of objects
+            var positions = new Vector3[objects];
+            var data = new Vector4[objects];
+
+            var float3_index = 0;
+            var float4_index = 0;
+
+            for (var i = 0; i < objects; i++)
+            {
+                positions[i] = new Vector3(position_data[float3_index], position_data[float3_index + 1], position_data[float3_index + 2]);
+                data[i] = new Vector4(object_data[float4_index], object_data[float4_index + 1], object_data[float4_index + 2], object_data[float4_index + 3]);
+                float3_index += 3;
+                float4_index += 4;
+            }
+
+            if (EnableCross)
+            {
+                _treeModule.AddTree(go, positions, data);
+            }
+        }
+
+        Texture2DArray TextureArray;
+        Texture2DArray NormalMapArray;
+        Texture2DArray HeightMapArray;
+        Texture2DArray RoughnessMapArray;
+
+        private void SceneManager_OnNewGeometry(GameObject go)
+        {
+            var nodehandle = go.GetComponent<NodeHandle>();
+            if (nodehandle != null)
+            {
+                if (EnableGrass)
+                {
+                    if (nodehandle.node.BoundaryRadius < 190 && nodehandle.node.BoundaryRadius > 0)
+                    {
+                        _grassModule.AddGrass(go, nodehandle.feature);
+                    }
+                }
+                if (EnableTrees)
+                {
+                    if (nodehandle.node.BoundaryRadius < 890 && nodehandle.node.BoundaryRadius > 0)
+                    {
+                        _treeModule.AddTree(go, nodehandle.feature);
+                    }
+                }
+
+                var meshRenderer = go.GetComponent<MeshRenderer>();
+                if (meshRenderer != null &&
+                    nodehandle.feature != null &&
+                    nodehandle.texture != null &&
+                    EnableDetailedTextures)
+                {
+                    meshRenderer.material.shader = TerrainSettings.DetailTextureShader;
+
+                    meshRenderer.material.SetTexture(Shader.PropertyToID("_SplatTex"), nodehandle.feature);
+                    meshRenderer.material.SetVector(Shader.PropertyToID("_SplatTex_ST"), new Vector4(2, 2, 0, 0));
+                    meshRenderer.material.SetTexture(Shader.PropertyToID("_CoarseTexture"), nodehandle.texture);
+                    var splatDimensions = new Vector2(nodehandle.texture.width, nodehandle.texture.height);
+                    meshRenderer.material.SetVector(Shader.PropertyToID("_SplatMapDimensions"), splatDimensions);
+                    meshRenderer.material.SetFloat(Shader.PropertyToID("_Smoothness"), 1);
+                    meshRenderer.material.SetFloat(Shader.PropertyToID("_SplatVisualization"), 1);
+                    meshRenderer.material.SetFloat(Shader.PropertyToID("_DetailTextureFadeStart"), 100);
+                    meshRenderer.material.SetFloat(Shader.PropertyToID("_DetailTextureFadeZoneLength"), 100);
+
+                    if (TextureArray is null)
+                    {
+                        int width = TerrainSettings.TerrainDetailTextures[0].width;
+                        int height = TerrainSettings.TerrainDetailTextures[0].height;
+                        int depth = TerrainSettings.TerrainDetailTextures.Length;
+                        TextureArray = new Texture2DArray(width, height, depth, TextureFormat.DXT1, true);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[0], 0, TextureArray, 0);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[1], 0, TextureArray, 1);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[2], 0, TextureArray, 2);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[3], 0, TextureArray, 3);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[4], 0, TextureArray, 4);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[5], 0, TextureArray, 5);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[6], 0, TextureArray, 6);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[7], 0, TextureArray, 7);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[8], 0, TextureArray, 8);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[9], 0, TextureArray, 9);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[10], 0, TextureArray, 10);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[11], 0, TextureArray, 11);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[12], 0, TextureArray, 12);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[13], 0, TextureArray, 13);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[14], 0, TextureArray, 14);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[15], 0, TextureArray, 15);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[16], 0, TextureArray, 16);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[17], 0, TextureArray, 17);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailTextures[18], 0, TextureArray, 18);
+
+                        NormalMapArray = new Texture2DArray(width, height, depth, TextureFormat.DXT5, true);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[0], 0, NormalMapArray, 0);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[1], 0, NormalMapArray, 1);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[2], 0, NormalMapArray, 2);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[3], 0, NormalMapArray, 3);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[4], 0, NormalMapArray, 4);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[5], 0, NormalMapArray, 5);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[6], 0, NormalMapArray, 6);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[7], 0, NormalMapArray, 7);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[8], 0, NormalMapArray, 8);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[9], 0, NormalMapArray, 9);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[10], 0, NormalMapArray, 10);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[11], 0, NormalMapArray, 11);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[12], 0, NormalMapArray, 12);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[13], 0, NormalMapArray, 13);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[14], 0, NormalMapArray, 14);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[15], 0, NormalMapArray, 15);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[16], 0, NormalMapArray, 16);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[17], 0, NormalMapArray, 17);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailNormalMaps[18], 0, NormalMapArray, 18);
+
+                        HeightMapArray = new Texture2DArray(width, height, depth, TextureFormat.DXT1, true);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[0], 0, HeightMapArray, 0);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[1], 0, HeightMapArray, 1);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[2], 0, HeightMapArray, 2);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[3], 0, HeightMapArray, 3);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[4], 0, HeightMapArray, 4);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[5], 0, HeightMapArray, 5);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[6], 0, HeightMapArray, 6);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[7], 0, HeightMapArray, 7);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[8], 0, HeightMapArray, 8);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[9], 0, HeightMapArray, 9);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[10], 0, HeightMapArray, 10);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[11], 0, HeightMapArray, 11);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[12], 0, HeightMapArray, 12);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[13], 0, HeightMapArray, 13);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[14], 0, HeightMapArray, 14);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[15], 0, HeightMapArray, 15);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[16], 0, HeightMapArray, 16);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[17], 0, HeightMapArray, 17);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailHeightMaps[18], 0, HeightMapArray, 18);
+
+                        RoughnessMapArray = new Texture2DArray(width, height, depth, TextureFormat.DXT1, true);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[0], 0, RoughnessMapArray, 0);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[1], 0, RoughnessMapArray, 1);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[2], 0, RoughnessMapArray, 2);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[3], 0, RoughnessMapArray, 3);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[4], 0, RoughnessMapArray, 4);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[5], 0, RoughnessMapArray, 5);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[6], 0, RoughnessMapArray, 6);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[7], 0, RoughnessMapArray, 7);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[8], 0, RoughnessMapArray, 8);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[9], 0, RoughnessMapArray, 9);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[10], 0, RoughnessMapArray, 10);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[11], 0, RoughnessMapArray, 11);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[12], 0, RoughnessMapArray, 12);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[13], 0, RoughnessMapArray, 13);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[14], 0, RoughnessMapArray, 14);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[15], 0, RoughnessMapArray, 15);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[16], 0, RoughnessMapArray, 16);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[17], 0, RoughnessMapArray, 17);
+                        Graphics.CopyTexture(TerrainSettings.TerrainDetailRoughnessMaps[18], 0, RoughnessMapArray, 18);
+                    }
+                    meshRenderer.material.SetTexture(Shader.PropertyToID("_Textures"), TextureArray);
+                    meshRenderer.material.SetTexture(Shader.PropertyToID("_NormalMaps"), NormalMapArray);
+                    meshRenderer.material.SetTexture(Shader.PropertyToID("_HeightMaps"), HeightMapArray);
+                    meshRenderer.material.SetTexture(Shader.PropertyToID("_RoughnessMaps"), RoughnessMapArray);
+                }
+            }
+        }
+    }
+}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageSet.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TerrainModule.cs.meta
similarity index 83%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageSet.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TerrainModule.cs.meta
index 2d748d2b..e926708a 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageSet.cs.meta
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TerrainModule.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 82f397700e6a04f429c81d3628c3cfd4
+guid: 938f8c8c9a37449478b52f1baab22262
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TreeModule.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TreeModule.cs
new file mode 100644
index 00000000..bdc582ec
--- /dev/null
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TreeModule.cs
@@ -0,0 +1,496 @@
+﻿/* 
+ * Copyright (C) SAAB AB
+ *
+ * All rights, including the copyright, to the computer program(s) 
+ * herein belong to Saab AB. The program(s) may be used and/or
+ * copied only with the written permission of Saab AB, or in
+ * accordance with the terms and conditions stipulated in the
+ * agreement/contract under which the program(s) have been
+ * supplied. 
+ * 
+ * Information Class:          COMPANY RESTRICTED
+ * Defence Secrecy:            UNCLASSIFIED
+ * Export Control:             NOT EXPORT CONTROLLED
+ */
+
+using Saab.Unity.Core.ComputeExtension;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+
+namespace Saab.Foundation.Unity.MapStreamer.Modules
+{
+    public class TreeModule : TerrainFeature
+    {
+        [Header("****** SETTINGS ******")]
+        public TerrainTextures[] TreeTextures;
+        public Texture2D PerlinNoise;
+        public Texture2D DefaultSplatMap;
+        public ComputeShader ComputeShader; // <-- TODO: Replace with 1 shader per responsibility (generator, culling, rendering)
+        public int BufferLimit = 2000000;
+        public bool UsePlacementMap;
+        public bool PointCloud;
+        public bool MeshTree;
+
+        // maximum concurrent GPU jobs, higher values increases memory footprint
+        private const int MAX_JOBS_PER_FRAME = 6;
+
+        // list of all current jobs being processed by the GPU
+        private readonly List<JobOutput> _currentJobs = new List<JobOutput>(MAX_JOBS_PER_FRAME);
+
+        // list of all jobs not yet processed
+        private readonly List<PendingJob> _pendingJobs = new List<PendingJob>();
+
+        // list of all instances currently being rendered
+        private readonly List<Item> _items = new List<Item>(128);
+
+        // used to draw all instances
+        private RenderingShader _renderingShader;
+
+        // used to generate instance data from a mesh
+        private readonly Stack<InstanceGenerator> _pointGenerators = new Stack<InstanceGenerator>();
+
+        // TEMP TEST JUNK
+        public Mesh TestMesh;
+        public Material TestMat;
+
+        private void Start()
+        {
+            if (PerlinNoise == null)
+            {
+                PerlinNoise = Resources.Load("Textures/PerlinNoiseRGB") as Texture2D;
+            }
+
+            _renderingShader = new RenderingShader(ComputeShader, Shader, BufferLimit, MeshTree, TestMesh, TestMat)
+            {
+                Noise = PerlinNoise,
+                ColorVariance = PerlinNoise,
+            };
+
+            _renderingShader.DebugMode = DebugMode;
+
+#if UNITY_ANDROID
+            var format = TextureFormat.ETC2_RGBA8;
+            Debug.Log("Tree Use ETC2");
+#else
+            var format = TextureFormat.DXT5;
+#endif
+
+            // ...
+            _renderingShader.SetBillboardData(Create2DArray(TreeTextures, format),
+                TreeTextures.Select(x => x.GetMinMaxWidthHeight).ToArray(),
+                TreeTextures.Select(x => x.Yoffset).ToArray());
+
+            _renderingShader.SetQuads(GetQuads(TreeTextures));
+        }
+
+        public void AddTree(GameObject go, Vector3[] placement, Vector4[] data)
+        {
+            // fix tree pos to be on ground instead of center of tree.
+            // TODO: Future points should be placed on Ground
+
+            var update = placement;
+
+            for (int i = 0; i < placement.Length; i++)
+            {
+                update[i] = placement[i] - (Vector3.up * data[i].x);
+            }
+
+            _pendingJobs.Add(new PendingJobPoints()
+            {
+                GameObject = go,
+                PointCloud = update,
+                Transforms = data
+            });
+        }
+
+        public void AddTree(GameObject go, Texture2D placementMap = null)
+        {
+            var meshFilter = go.GetComponent<MeshFilter>();
+            if (!meshFilter)
+                return;
+
+            var meshRenderer = go.GetComponent<MeshRenderer>();
+            if (!meshRenderer)
+                return;
+
+            var material = meshRenderer.material;
+            if (!material)
+                return;
+
+            var diffuse = material.mainTexture as Texture2D;
+            if (diffuse == null)
+                return;
+
+            System.Diagnostics.Debug.Assert(meshFilter.mesh.GetTopology(0) == MeshTopology.Triangles);
+
+            _pendingJobs.Add(new PendingJobMesh()
+            {
+                GameObject = go,
+                Mesh = meshFilter.mesh,
+                Diffuse = diffuse,
+                PlacementMap = placementMap
+            });
+        }
+        public void RemoveTree(GameObject gameobj)
+        {
+            for (var i = 0; i < _currentJobs.Count; ++i)
+            {
+                if (_currentJobs[i].GameObject != gameobj)
+                    continue;
+
+                _currentJobs[i].PointBuffer.SafeRelease();
+                _pointGenerators.Push(_currentJobs[i].Generator);
+
+                if ((i + 1) < _currentJobs.Count)
+                    _currentJobs[i] = _currentJobs[_currentJobs.Count - 1];
+
+                _currentJobs.RemoveAt(_currentJobs.Count - 1);
+
+                return;
+            }
+
+            for (var i = 0; i < _items.Count; ++i)
+            {
+                if (_items[i].GameObject != gameobj)
+                    continue;
+
+                _items[i].Dispose();
+
+                if ((i + 1) < _items.Count)
+                    _items[i] = _items[_items.Count - 1];
+
+                _items.RemoveAt(_items.Count - 1);
+
+                return;
+            }
+
+            for (var i = 0; i < _pendingJobs.Count; ++i)
+            {
+                if (_pendingJobs[i].GameObject != gameobj)
+                    continue;
+
+                if ((i + 1) < _pendingJobs.Count)
+                    _pendingJobs[i] = _pendingJobs[_pendingJobs.Count - 1];
+
+                _pendingJobs.RemoveAt(_pendingJobs.Count - 1);
+
+                return;
+            }
+        }
+
+        private void AddJobs()
+        {
+            // TODO: Can we avoid sorting per-frame? Change swap-remove to something else and only sort on
+            if (SortByDistance)
+            {
+                _pendingJobs.Sort((a, b) =>
+                {
+                    var d1 = a.GameObject.transform.position.sqrMagnitude;
+                    var d2 = b.GameObject.transform.position.sqrMagnitude;
+                    return d1.CompareTo(d2);
+                });
+            }
+
+            for (var i = 0; i < _pendingJobs.Count; ++i)
+            {
+                var pending = _pendingJobs[i];
+                if (pending == null)
+                    return;
+
+                var go = pending.GameObject;
+
+                // get new job, according to certain rules (maybe priority later)
+                if (!go.activeInHierarchy)
+                    continue;
+
+                if (pending is PendingJobMesh)
+                {
+                    var job = pending as PendingJobMesh;
+                    // Mesh
+
+                    var mesh = job.Mesh;
+                    var bounds = mesh.bounds;
+
+                    var extents = bounds.extents;
+                    var maxExtent = Mathf.Max(extents.x, extents.y, extents.z);
+                    var centerWorld = go.transform.TransformPoint(bounds.center);
+
+                    var frustum = _frustum;
+                    _frustum[5].w += maxExtent + DrawDistance;
+
+                    if (!IsInFrustum(centerWorld - CameraPosition, -maxExtent * 1.75f))
+                        continue;
+
+                    var triangleCount = mesh.GetIndexCount(0) / 3f;
+                    var bufferSize = Math.Max(1, (maxExtent * maxExtent) / Density);
+                    bufferSize = bufferSize + triangleCount * 2;
+                    bufferSize = bufferSize < mesh.vertexCount ? mesh.vertexCount : bufferSize;
+
+                    _frustum = frustum;
+                    var subs = 16;
+
+                    var expectedFeature = InstanceGenerator.Feature.Tree;
+                    if (PointCloud)
+                    {
+                        expectedFeature = InstanceGenerator.Feature.PointCloud;
+                        subs = 1;
+                    }
+
+                    if (_pointGenerators.Count == 0 || _pointGenerators.Peek().GetFeature != expectedFeature)
+                    {
+                        _pointGenerators.Push(new InstanceGenerator(Instantiate(ComputeShader), expectedFeature)
+                        {
+                            Density = Density,
+                            SplatMap = DefaultSplatMap
+                        });
+                    }
+
+                    var pointGenerator = _pointGenerators.Pop();
+                    var outputBuffer = new ComputeBuffer(Mathf.CeilToInt(bufferSize), sizeof(float) * 4, ComputeBufferType.Append);
+
+                    outputBuffer.SetCounterValue(0);
+                    pointGenerator.SetMesh(mesh, PointCloud);
+                    pointGenerator.PlacementMapEnabled = false;
+
+                    if (job.PlacementMap != null && UsePlacementMap)
+                    {
+                        pointGenerator.PlacementMapEnabled = true;
+                        pointGenerator.PlacementMap = job.PlacementMap;
+                    }
+                    else
+                    {
+                        pointGenerator.PlacementMap = job.Diffuse; //new Texture2D(job.Diffuse.width, job.Diffuse.height);
+                    }
+
+                    pointGenerator.ColorMap = job.Diffuse;
+                    pointGenerator.OutputBuffer = outputBuffer;
+
+                    var threadGroups = Mathf.CeilToInt(triangleCount / 16f);
+                    pointGenerator.Dispatch(threadGroups > 0 ? threadGroups : 1, subs);
+
+                    // swap remove
+                    if ((i + 1) < _pendingJobs.Count)
+                        _pendingJobs[i] = _pendingJobs[_pendingJobs.Count - 1];
+                    _pendingJobs.RemoveAt(_pendingJobs.Count - 1);
+
+                    _currentJobs.Add(new JobOutput()
+                    {
+                        GameObject = go,
+                        Bounds = bounds,
+                        PointBuffer = outputBuffer,
+                        Generator = pointGenerator
+                    });
+
+                }
+                else if (pending is PendingJobPoints)
+                {
+                    var job = pending as PendingJobPoints;
+
+                    var bufferSize = job.PointCloud.Length;
+
+                    if (bufferSize == 0)
+                    {
+                        Debug.LogFormat(LogType.Warning, LogOption.NoStacktrace, null, "Crossboard has 0 points");
+                        continue;
+                    }
+
+                    // Points
+
+                    if (_pointGenerators.Count == 0 || _pointGenerators.Peek().GetFeature != InstanceGenerator.Feature.CrossBoard)
+                    {
+                        _pointGenerators.Push(new InstanceGenerator(Instantiate(ComputeShader), InstanceGenerator.Feature.CrossBoard)
+                        {
+                            Density = Density,
+                            SplatMap = DefaultSplatMap
+                        });
+                    }
+
+                    var pointGenerator = _pointGenerators.Pop();
+                    var outputBuffer = new ComputeBuffer(Mathf.CeilToInt(bufferSize), sizeof(float) * 4, ComputeBufferType.Append);
+
+                    outputBuffer.SetCounterValue(0);
+                    pointGenerator.SetPoints(job.PointCloud);
+
+                    pointGenerator.OutputBuffer = outputBuffer;
+
+                    // Update
+                    var threadGroups = Mathf.CeilToInt(bufferSize / 16f);
+                    pointGenerator.Dispatch(threadGroups > 0 ? threadGroups : 1, 1);
+
+                    // swap remove
+                    if ((i + 1) < _pendingJobs.Count)
+                        _pendingJobs[i] = _pendingJobs[_pendingJobs.Count - 1];
+                    _pendingJobs.RemoveAt(_pendingJobs.Count - 1);
+
+                    var bounds = new Bounds(Vector3.zero, new Vector3(512, 80, 512));
+
+                    _currentJobs.Add(new JobOutput()
+                    {
+                        GameObject = go,
+                        Bounds = bounds,
+                        PointBuffer = outputBuffer,
+                        Generator = pointGenerator
+                    });
+                }
+
+                if (_currentJobs.Count == MAX_JOBS_PER_FRAME)
+                    return;
+            }
+        }
+
+        public int GetMemoryFootprint
+        {
+            get
+            {
+                var size = GetModuleBufferMemory(_items);
+                size += GetModuleBufferMemory(_currentJobs);
+                size += _renderingShader.GetMemoryFootPrint;
+                //Debug.LogFormat(LogType.Warning, LogOption.NoStacktrace, null, "Grass :: total buffer memory size {0} MB", size / 1000000f);
+                return size;
+            }
+        }
+
+        private void Render()
+        {
+            var camera = CurrentCamera;
+
+            if (!camera)
+                return;
+
+            _renderingShader.Depth = DepthTexture;
+
+            //var sw = System.Diagnostics.Stopwatch.StartNew();
+            for (var i = 0; i < _currentJobs.Count; ++i)
+            {
+                var job = _currentJobs[i];
+
+                var cullShader = new CullingShader(Instantiate(ComputeShader))
+                {
+                    InputBuffer = job.PointBuffer,
+                    RenderBufferNear = _renderingShader.RenderBufferNear,
+                    RenderBufferFar = _renderingShader.RenderBufferFar,
+                };
+
+
+                var item = new Item()
+                {
+                    GameObject = job.GameObject,
+                    CullShader = cullShader,
+                    Bounds = job.Bounds,
+                };
+
+                _items.Add(item);
+
+                _pointGenerators.Push(job.Generator);
+            }
+
+            _currentJobs.Clear();
+
+            AddJobs();
+
+            var fadeFarAmmount = DrawDistance / 3;
+            var fadeFarValue = DrawDistance - fadeFarAmmount;
+
+            fadeFarAmmount = fadeFarAmmount > 0 ? fadeFarAmmount : 1;
+            fadeFarValue = fadeFarValue > 0 ? fadeFarValue : 1;
+
+            _renderingShader.SetNearFade(NearFadeStart, NearFadeEnd);
+            _renderingShader.SetFarFade(fadeFarValue, fadeFarAmmount);
+
+            _renderingShader.Wind = Wind;
+            _renderingShader.Frustum = _frustum;
+
+            _renderingShader.RenderBegin();
+
+
+            GameObject any = null;
+            float maxSide = 0;
+
+
+            // Culling      
+            for (var i = 0; i < _items.Count; ++i)
+            {
+                var item = _items[i];
+
+                var go = item.GameObject;
+                if (!go.activeInHierarchy)
+                    continue;
+
+                any = go;
+
+                var bounds = item.Bounds;
+
+                var maxExtent = Mathf.Max(bounds.extents.x, bounds.extents.y, bounds.extents.z) * 2;
+                maxSide = maxExtent + DrawDistance;
+
+                var centerWorld = go.transform.TransformPoint(bounds.center);
+
+                var frustum = _frustum;
+                _frustum[5].w += maxSide;
+
+                //if (!IsInFrustum(centerWorld - CameraPosition, (-maxSide * 1.75f)))
+                //    continue;
+
+                _frustum[5].w = DrawDistance;
+
+                var cullShader = item.CullShader;
+                cullShader.LocalToWorld = go.transform.localToWorldMatrix;
+                cullShader.Frustum = frustum;
+                cullShader.CameraPosition = CameraPosition;
+
+                cullShader.Dispatch();
+            }
+
+            if (any == null)
+                return;
+
+            // TODO: 
+            var roiTransform = FindFirstNodeParent(any.transform);
+
+            var worldToLocal = roiTransform == null ? Matrix4x4.identity : roiTransform.worldToLocalMatrix;
+
+            _renderingShader.WorldToLocal = worldToLocal;
+            _renderingShader.ViewDirection = CurrentCamera.transform.forward;
+
+            var renderBounds = new Bounds(Vector3.zero, new Vector3(maxSide, maxSide, maxSide));
+
+            var shadows = DrawShadows ? UnityEngine.Rendering.ShadowCastingMode.On : UnityEngine.Rendering.ShadowCastingMode.Off;
+            _renderingShader.ShadowCastingMode = shadows;
+
+            if (MeshTree)
+            {
+                _renderingShader.RenderEnd3D(renderBounds, TestMesh);
+            }
+            else
+            {
+                _renderingShader.RenderEnd(renderBounds);
+            }
+        }
+
+        public void Camera_OnPostTraverse()
+        {
+            _renderingShader.DebugMode = DebugMode;
+            Render();
+        }
+
+        private void OnDestroy()
+        {
+            for (var i = 0; i < _items.Count; ++i)
+                _items[i].Dispose();
+
+            for (var i = 0; i < _currentJobs.Count; ++i)
+            {
+                _currentJobs[i].PointBuffer.SafeRelease();
+                _currentJobs[i].Generator.Dispose();
+            }
+
+            while (_pointGenerators.Count > 0)
+                _pointGenerators.Pop().Dispose();
+
+            if (_renderingShader != null)
+                _renderingShader.Dispose();
+        }
+    }
+}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageSetEditor.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TreeModule.cs.meta
similarity index 83%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageSetEditor.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TreeModule.cs.meta
index ddfe95c9..21e0716a 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageSetEditor.cs.meta
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.Modules/TreeModule.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: d64ecf130ce984341aab9b36b4c8685e
+guid: a77a86c8f4b0a4e4ca016991479e62ae
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.meta
new file mode 100644
index 00000000..496f6a85
--- /dev/null
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b32868f99e17a4b44891d3f67a6bfd20
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/CameraControl.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/CameraControl.cs
similarity index 66%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/CameraControl.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/CameraControl.cs
index a626d74a..3943f690 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/CameraControl.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/CameraControl.cs
@@ -19,7 +19,7 @@
 // Module		:
 // Description	: Manages camera updates with large coordinates
 // Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
+// Product		: Gizmo3D 2.12.75
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
@@ -34,17 +34,22 @@
 //
 //******************************************************************************
 
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
 //#define TEST_ROTATION   // Just test some default rotation
 
 using GizmoSDK.GizmoBase;
 using Saab.Foundation.Map;
 using Saab.Unity.Extensions;
 using Saab.Utility.Unity.NodeUtils;
-using System;
 using System.Collections.Generic;
 using UnityEngine;
+
 using Quaternion = UnityEngine.Quaternion;
-using Random = UnityEngine.Random;
 
 
 
@@ -59,7 +64,7 @@ public struct AutoMovement
         public float tilt;
     }
 
-    public class CameraControl : MonoBehaviour, ISceneManagerCamera
+    public class CameraControl : MonoBehaviour , ISceneManagerCamera
     {
 
         public float Speed = 20f;
@@ -107,26 +112,6 @@ public Vec3D GlobalPosition
             }
         }
 
-        private float _countDownJump = 4;
-        private float _jumpTime = 4;
-        public float JumpInterval
-        {
-            get
-            {
-                return _jumpTime;
-            }
-            set
-            {
-                _jumpTime = value;
-                _countDownJump = _jumpTime;
-            }
-        }
-
-        public void SetSeed(int seed)
-        {
-            Random.InitState(seed);
-        }
-
         public Vector3 Up
         {
             get { return MapControl.SystemMap.GetLocalOrientation(GlobalPosition).GetCol(2).ToVector3(); }
@@ -185,14 +170,6 @@ public void UpdateMoveCamera(float forward, float right, float up, float pan, fl
             _inputLocked = lockOtherInput;
         }
 
-        private void UpdateShaderPos()
-        {
-            var pos = GlobalPosition;
-            var cameraHeight = (float)Math.Clamp(pos.y, -float.MaxValue, float.MaxValue);
-            var worldOffset = new Vector3((float)(pos.x % float.MaxValue), cameraHeight, -(float)(pos.z % float.MaxValue));
-            Shader.SetGlobalVector("_WorldOffset", worldOffset);
-        }
-
         private void Move(AutoMovement movement)
         {
             MoveForward(movement.forward);
@@ -205,70 +182,88 @@ private void Move(AutoMovement movement)
             transform.rotation = rot;
         }
 
-        // Update is called once per frame
+            // Update is called once per frame
         void Update()
         {
-            UpdateShaderPos();
-
-            if (Input.GetButtonDown("Fire1") && Input.GetKey(KeyCode.LeftShift) && !_inputLocked)
+            try
             {
-                Map.MapPos mapPos;
+                Performance.Enter("CameraControl.Update");
+                // Check mouse click
 
-                var layerMask = GroundClampType.GROUND;
-
-                if (Map.MapControl.SystemMap.GetScreenGroundPosition((int)Input.mousePosition.x, (int)(Screen.height - Input.mousePosition.y), (uint)Screen.width, (uint)Screen.height, out mapPos, layerMask, Map.ClampFlags.DEFAULT))
+                if (Input.GetButtonDown("Fire1") &&  Input.GetKey(KeyCode.LeftShift) && !_inputLocked)
                 {
-                    List<GameObject> list;
+                    Map.MapPos mapPos;
+
+                    var layerMask = GroundClampType.GROUND;
 
-                    if (NodeUtils.FindGameObjects(mapPos.node.GetNativeReference(), out list))
+                    if (Map.MapControl.SystemMap.GetScreenGroundPosition((int)Input.mousePosition.x, (int)(Screen.height - Input.mousePosition.y), (uint)Screen.width, (uint)Screen.height, out mapPos, layerMask, Map.ClampFlags.DEFAULT))
                     {
-                        foreach (GameObject o in list)
-                        {
-                            GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
+                        List<GameObject> list;
 
-                            sphere.transform.parent = o.transform;
-                            sphere.transform.transform.localPosition = new Vector3((float)mapPos.position.x, (float)mapPos.position.y, (float)mapPos.position.z);
-                            sphere.transform.localScale = new Vector3(10, 10, 10);
+                        if (NodeUtils.FindGameObjects(mapPos.node.GetNativeReference(), out list))
+                        {
+                            foreach (GameObject o in list)
+                            {
+                                GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
+
+                                sphere.transform.parent = o.transform;
+                                sphere.transform.transform.localPosition = new Vector3((float)mapPos.position.x, (float)mapPos.position.y, (float)mapPos.position.z);
+                                sphere.transform.localScale = new Vector3(10, 10, 10);
+                            }
                         }
-                    }
 
-                    // Just test some update
-                    mapPos.position += new Vec3(1, 1, 1);
+                        // Just test some update
+                        mapPos.position += new Vec3(1, 1, 1);
 
-                    Map.MapControl.SystemMap.UpdatePosition(mapPos, GroundClampType.GROUND);
+                        Map.MapControl.SystemMap.UpdatePosition(mapPos, GroundClampType.GROUND);
 
-                    GlobalPosition = mapPos.GlobalPosition(new Vec3(0, 0, 10));
-                }
+                        GlobalPosition = mapPos.GlobalPosition(new Vec3(0, 0, 10));
+                    }
 
 
-            }
+                }
 
-            if (Input.GetButtonDown("Fire2"))
-            {
-                GizmoSDK.Coordinate.LatPos latpos = new GizmoSDK.Coordinate.LatPos
+                if (Input.GetButtonDown("Fire2"))
                 {
-                    Altitude = 245.52585220821,
-                    Latitude = 1.00778345058085,
-                    Longitude = 0.251106492463706
+                    GizmoSDK.Coordinate.LatPos latpos = new GizmoSDK.Coordinate.LatPos
+                    {
+                        Altitude = 245.52585220821,
+                        Latitude = 1.00778345058085,
+                        Longitude = 0.251106492463706
 
-                };
+                    };
 
-                Map.MapPos mappos;
+                    Map.MapPos mappos;
 
-                if (Map.MapControl.SystemMap.GetPosition(latpos, out mappos, Map.GroundClampType.GROUND, Map.ClampFlags.WAIT_FOR_DATA))
+                    if (Map.MapControl.SystemMap.GetPosition(latpos, out mappos, Map.GroundClampType.GROUND, Map.ClampFlags.WAIT_FOR_DATA))
+                    {
+                        Debug.Log("Hit Ground ok");
+                    }
+
+                    //Performance.DumpPerformanceInfo();
+                }
+
+                //transform.position;
+
+                
+                if(Input.GetKey("b"))
                 {
-                    Debug.Log("Hit Ground ok");
+                    GizmoSDK.Gizmo3D.DynamicLoaderManager.StopManager();
                 }
-            }
 
-            if (Input.GetKey("b"))
-            {
-                GizmoSDK.Gizmo3D.DynamicLoaderManager.StopManager();
-            }
+                if (Input.GetKey("v"))
+                {
+                    GizmoSDK.Gizmo3D.DynamicLoaderManager.StartManager();
+                }
 
-            if (Input.GetKey("v"))
+
+                //transform.position = pos;
+
+                
+            }
+            finally
             {
-                GizmoSDK.Gizmo3D.DynamicLoaderManager.StartManager();
+                Performance.Leave();
             }
         }
 
@@ -282,27 +277,6 @@ public void PostTraverse(bool locked)
             // Called after all nodes have updated their transforms
         }
 
-        public void RandomJump(float distance, float maxDistance = 3000)
-        {
-            _countDownJump -= UnityEngine.Time.deltaTime;
-
-            if (_countDownJump <= 0)
-            {
-                _countDownJump = JumpInterval;
-                Quaternion rot = transform.rotation;
-                rot *= Quaternion.Euler(0, Random.Range(160, 200), 0);
-                transform.rotation = rot;
-
-                X = X + (Random.value * 0.5) + 0.5f * distance;
-                Z = Z + (Random.value * 0.5) + 0.5f * distance;
-
-                if (X > maxDistance)
-                    X = 0;
-                if (Z > maxDistance)
-                    Z = 0;
-            }
-        }
-
         public double UpdateCamera(double renderTime)
         {
             _lastRenderTime = _currentRenderTime;
@@ -316,7 +290,7 @@ public double UpdateCamera(double renderTime)
             var speed = Speed;
 
             if (Input.GetKey(KeyCode.LeftShift))
-                speed *= ShiftMultiplier;
+                speed *= ShiftMultiplier; 
 
             if (Input.GetKey("w"))
             {
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/CameraControl.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/CameraControl.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/CameraControl.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/CameraControl.cs.meta
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/CrossboardBuilder.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/CrossboardBuilder.cs
similarity index 65%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/CrossboardBuilder.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/CrossboardBuilder.cs
index 59ac64a2..2131c050 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/CrossboardBuilder.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/CrossboardBuilder.cs
@@ -19,7 +19,7 @@
 // Module		:
 // Description	: Special class for Crossboard builder
 // Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
+// Product		: Gizmo3D 2.12.75
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
@@ -34,6 +34,12 @@
 //
 //******************************************************************************
 
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
 // Framework
 using System.Collections.Generic;
 
@@ -44,7 +50,7 @@
 using GizmoSDK.Gizmo3D;
 
 // Internal
-//using Assets.Crossboard;
+using Assets.Crossboard;
 
 namespace Saab.Foundation.Unity.MapStreamer
 { 
@@ -55,10 +61,9 @@ public class CrossboardNodeBuilder : INodeBuilder
         public PoolObjectFeature Feature => PoolObjectFeature.Crossboard;
 
         // lifetime data ----------
-
+        
         // we will cache crossboard textures
-        // private readonly TextureCache _textureCache = new TextureCache();
-        private TextureManager _textureManager;
+        private readonly TextureCache _textureCache = new TextureCache();
 
         // material to use when rendering
         private readonly Material _crossboardMaterial;
@@ -76,13 +81,13 @@ public CrossboardNodeBuilder(Shader shader, ComputeShader computeShader, BuildPr
             _computeShader = computeShader;
         }
 
-        public bool CanBuild(Node node, TraversalState traversalState, IntersectMaskValue intersectMask)
+        public bool CanBuild(Node node)
         {
             return node is Crossboard;
         }
 
         // TODO: Make functions...
-        public bool Build(NodeHandle nodeHandle, NodeHandle activeStateNode)
+        public bool Build(NodeHandle nodeHandle, GameObject gameObject, NodeHandle activeStateNode)
         {
             var node = nodeHandle.node;
 
@@ -103,24 +108,24 @@ public bool Build(NodeHandle nodeHandle, NodeHandle activeStateNode)
 
             // NOTE: CrossboardDatasets are copied to compute buffers when assigning the dataset,
             // thus we can reuse same dataset objects to reduce GC pressure if needed.
-            //CrossboardDataset dataset = new CrossboardDataset();
-            //dataset.POSITION = new Vector3[objects];
-            //dataset.UV0ListComp = new List<Vector4>(objects);
-            //dataset.UV1ListComp = new List<Vector4>(objects);
-            //dataset.COLOR = new Color[objects];
+            CrossboardDataset dataset = new CrossboardDataset();
+            dataset.POSITION = new Vector3[objects];
+            dataset.UV0ListComp = new List<Vector4>(objects);
+            dataset.UV1ListComp = new List<Vector4>(objects);
+            dataset.COLOR = new Color[objects];
 
             var float3_index = 0;
             var float4_index = 0;
 
             for (var i = 0; i < objects; i++)
             {
-                //dataset.POSITION[i] = new Vector3(position_data[float3_index], position_data[float3_index + 1], position_data[float3_index + 2]);
+                dataset.POSITION[i] = new Vector3(position_data[float3_index], position_data[float3_index + 1], position_data[float3_index + 2]);
 
-                //// size, heading, pitch, roll 
-                //dataset.UV0ListComp.Add(new Vector4(object_data[float4_index] * 2f, object_data[float4_index + 1], object_data[float4_index + 2], object_data[float4_index + 3]));
+                // size, heading, pitch, roll 
+                dataset.UV0ListComp.Add(new Vector4(object_data[float4_index] * 2f, object_data[float4_index + 1], object_data[float4_index + 2], object_data[float4_index + 3]));
 
-                //// postion offset (x - its up normal), planes offset ( xyz - in there normal direction)
-                //dataset.UV1ListComp.Add(new Vector4(-0.02f, 0, 0, 0));
+                // postion offset (x - its up normal), planes offset ( xyz - in there normal direction)
+                dataset.UV1ListComp.Add(new Vector4(-0.02f, 0, 0, 0));
 
                 float3_index += 3;
                 float4_index += 4;
@@ -144,17 +149,17 @@ public bool Build(NodeHandle nodeHandle, NodeHandle activeStateNode)
                     float4_index += 4;
                 }
 
-                //dataset.COLOR = colors;
+                dataset.COLOR = colors;
             }
 
-            //var renderer = gameObject.GetComponent<CrossboardRenderer_ComputeShader>();
-            //if (renderer == null)
-            //{
-            //    renderer = gameObject.AddComponent<CrossboardRenderer_ComputeShader>();
+            var renderer = gameObject.GetComponent<CrossboardRenderer_ComputeShader>();
+            if (renderer == null)
+            {
+                renderer = gameObject.AddComponent<CrossboardRenderer_ComputeShader>();
 
-            //    renderer.OpaqueCrossboardCompute = true;
-            //    renderer._computeShader = GameObject.Instantiate(_computeShader);
-            //}
+                renderer.OpaqueCrossboardCompute = true;
+                renderer._computeShader = GameObject.Instantiate(_computeShader);
+            }
 
 
             var material = GameObject.Instantiate(_crossboardMaterial);
@@ -166,7 +171,7 @@ public bool Build(NodeHandle nodeHandle, NodeHandle activeStateNode)
                 {
                     var state = activeStateNode.node.State;
 
-                    if (!StateHelper.Build(state, out StateBuildOutput buildOutput, _textureManager))
+                    if (!StateHelper.Build(state, out StateBuildOutput buildOutput, _textureCache))
                         return false;
 
                     activeStateNode.stateLoadInfo |= StateLoadInfo.Texture;
@@ -178,40 +183,24 @@ public bool Build(NodeHandle nodeHandle, NodeHandle activeStateNode)
                 material.mainTexture = activeStateNode.texture;
             }
 
-            //renderer.SetCrossboardDataset(dataset, material);
+            renderer.SetCrossboardDataset(dataset, material);
 
             return true;
         }
 
-        public void BuiltObjectReturnedToPool(GameObject gameObject, bool sharedAsset)
+        public void BuiltObjectReturnedToPool(GameObject gameObject)
         {
-            //var crossboardRenderer = gameObject.GetComponent<CrossboardRenderer_ComputeShader>();
-            //if (!crossboardRenderer)
-            //    return;
+            var crossboardRenderer = gameObject.GetComponent<CrossboardRenderer_ComputeShader>();
+            if (!crossboardRenderer)
+                return;
 
-            //// crossboard renderer uses alot of resources, so we will release it
-            //GameObject.Destroy(crossboardRenderer);
+            // crossboard renderer uses alot of resources, so we will release it
+            GameObject.Destroy(crossboardRenderer);
         }
 
-        public void InitPoolObject(GameObject gameObject)
-        {
-
-        }
-
-        public void SetTextureManager(TextureManager textureManager)
-        {
-            _textureManager = textureManager;
-        }
-
-        public void SetMaterialManager(MaterialManager textureManager)
-        {
-            // nop
-        }
-
-
-        public void Reset()
+        public void CleanUp()
         {
-            // NOP
+            throw new System.NotImplementedException();
         }
     }
 }
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/CrossboardBuilder.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/CrossboardBuilder.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/CrossboardBuilder.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/CrossboardBuilder.cs.meta
diff --git a/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/GeometryBuilder.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/GeometryBuilder.cs
new file mode 100644
index 00000000..4fc268f0
--- /dev/null
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/GeometryBuilder.cs
@@ -0,0 +1,154 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: GeometryBuilder.cs
+// Module		:
+// Description	: Special class for geometry builder
+// Author		: Anders Modén
+// Product		: Gizmo3D 2.12.75
+//
+// NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
+//			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
+//			usage in Game or VisSim development.
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+// ZJP	200625	Created file                                        (2.10.6)
+// AMO  230113  Added Feature Maps from texture 1                   (2.12.43)
+//
+//******************************************************************************
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+// Framework
+
+// Unity
+using UnityEngine;
+
+// GizmoSDK
+using GizmoSDK.Gizmo3D;
+
+namespace Saab.Foundation.Unity.MapStreamer
+{
+    public class DefaultGeometryNodeBuilder : INodeBuilder
+    {
+        public BuildPriority Priority { get; private set; }
+
+        public PoolObjectFeature Feature => PoolObjectFeature.StaticMesh;
+
+        // we will cache shared textures
+        private readonly TextureCache _textureCache = new TextureCache();
+
+        // lifetime data
+        private readonly Material _defaultMaterial;
+
+        // per-frame data
+
+        public DefaultGeometryNodeBuilder(Shader shader, BuildPriority priority = BuildPriority.Immediate)
+        {
+            Priority = priority;
+
+            _defaultMaterial = new Material(shader);
+        }
+
+        public bool CanBuild(Node node)
+        {
+            return node is Geometry;
+        }
+
+        public bool Build(NodeHandle nodeHandle, GameObject gameObject, NodeHandle activeStateNode)
+        {
+            var node = nodeHandle.node;
+
+            var geo = node as Geometry;
+            if (geo == null)
+                return false;
+
+            // Renderer, state and material ---------------------------------
+
+            var meshRenderer = gameObject.GetComponent<MeshRenderer>();
+
+            // Check if we didnt have a material already in pool
+            if (meshRenderer == null)
+            {
+                meshRenderer = gameObject.AddComponent<MeshRenderer>();
+                meshRenderer.sharedMaterial = _defaultMaterial;
+            }
+          
+            // check if the texture is loaded for this state, otherwise load it
+            if (activeStateNode != null)
+            {
+                if ((activeStateNode.stateLoadInfo & StateLoadInfo.Texture) == StateLoadInfo.None)
+                {
+                    var state = activeStateNode.node.State;
+
+                    if (!StateHelper.Build(state, out StateBuildOutput buildOutput, _textureCache))
+                        return false;
+
+                    activeStateNode.stateLoadInfo |= StateLoadInfo.Texture;
+                    activeStateNode.texture = buildOutput.Texture;
+                    activeStateNode.feature = buildOutput.Feature;
+                    activeStateNode.surfaceHeight = buildOutput.SurfaceHeight;
+                    activeStateNode.featureInfo = buildOutput.Feature_homography;
+
+                    state.ReleaseAlreadyLocked();
+                }
+
+                meshRenderer.material.mainTexture = activeStateNode.texture;
+
+                if (activeStateNode.feature != null)
+                {
+                    meshRenderer.material.SetTexture("feature", activeStateNode.feature);
+                    meshRenderer.material.EnableKeyword("feature");
+                }
+            }
+
+            // --------- Mesh ---------------------------------------------------------
+
+            if (!GeometryHelper.Build(geo, out Mesh mesh, meshRenderer))
+                return false;
+
+            // ------- Filter ---------------------------------------------------------
+
+            var meshFilter = gameObject.GetComponent<MeshFilter>();
+            if (meshFilter == null)
+                meshFilter = gameObject.AddComponent<MeshFilter>();
+
+            meshFilter.sharedMesh = mesh;
+
+            
+
+            return true;
+        }
+
+        public void BuiltObjectReturnedToPool(GameObject gameObject)
+        {
+            // NOP
+        }
+
+        public void CleanUp()
+        {
+            _textureCache.CleanUp();
+        }
+    }
+}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/GeometryBuilder.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/GeometryBuilder.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/GeometryBuilder.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/GeometryBuilder.cs.meta
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/MapUtil.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/MapUtil.cs
similarity index 73%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/MapUtil.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/MapUtil.cs
index 7f319f9c..ff4960b6 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/MapUtil.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/MapUtil.cs
@@ -19,7 +19,7 @@
 // Module		:
 // Description	: Utilities for Map  
 // Author		: Johan Gustavsson
-// Product		: Gizmo3D 2.12.185
+// Product		: Gizmo3D 2.12.75
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
@@ -34,64 +34,40 @@
 //
 //******************************************************************************
 
-using System;
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
 using GizmoSDK.Coordinate;
 using Saab.Foundation.Map;
 using Saab.Utility.Unity.NodeUtils;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
 using UnityEngine;
 
 namespace Saab.Foundation.Unity.MapStreamer
 {
     public static class MapUtil
     {
-        [Flags]
-        public enum ClampOptions
+        public static bool WorldToUnity(Transform transform, LatPos position, bool clampToGround = false)
         {
-            None = 0,
-            GroundLayer = 1 << 0,
-            BuildingLayer = 1 << 1,
-            AnyLayer = GroundLayer | BuildingLayer,
-
-            LoadTerrain = 1 << 16,
-        }
-
-        private static ClampFlags GetClampFlags(ClampOptions options)
-        {
-            return (options & ClampOptions.LoadTerrain) == ClampOptions.LoadTerrain
-                ? ClampFlags.UPDATE_DATA | ClampFlags.WAIT_FOR_DATA
-                : ClampFlags.FRUSTRUM_CULL;
-        }
-
-        private static GroundClampType GetClampType(ClampOptions options)
-        {
-            return (GroundClampType)(int)(options);
-        }
-
-        public static bool WorldToUnity(Transform transform, LatPos position, 
-            ClampOptions clampOptions = ClampOptions.None)
-        {
-            var clampFlags = GetClampFlags(clampOptions);
-            var clampType = GetClampType(clampOptions);
-
             var mp = new MapPos();
-            mp.clampFlags = clampFlags;
 
-            if (!MapControl.SystemMap.SetPosition(mp, position, clampType, clampFlags))
+            if (!MapControl.SystemMap.SetPosition(mp, position, clampToGround ? GroundClampType.GROUND : GroundClampType.NONE))
                 return false;
 
             return MapToUnity(transform, mp);
         }
 
-        public static bool WorldToUnity(Transform transform, CartPos position, 
-            ClampOptions clampOptions = ClampOptions.None)
+        public static bool WorldToUnity(Transform transform, CartPos position, bool clampToGround = false)
         {
-            var clampFlags = GetClampFlags(clampOptions);
-            var clampType = GetClampType(clampOptions);
-
             var mp = new MapPos();
-            mp.clampFlags = clampFlags;
 
-            if (!MapControl.SystemMap.SetPosition(mp, position, clampType, clampFlags))
+            if (!MapControl.SystemMap.SetPosition(mp, position, clampToGround ? GroundClampType.GROUND : GroundClampType.NONE))
                 return false;
 
             return MapToUnity(transform, mp);
@@ -114,24 +90,6 @@ public static bool MapToUnity(Transform transform, MapPos position)
             return true;
         }
 
-        public static bool MapToUnity(MapPos position, out Transform roi, out Vector3 offset)
-        {
-            roi = default;
-            offset = default;
-            
-            if (!MapControl.SystemMap.ToLocal(position))
-                return false;
-            
-            roi = NodeUtils.FindFirstGameObjectTransform(position.node.GetNativeReference());
-            if (!roi)
-                return false;
-
-            var local = position.LocalPosition;
-            offset = new Vector3(local.x, local.y, local.z);
-            
-            return true;
-        }
-
         public static bool UnityToWorld(Transform transform, out LatPos position)
         {
             if (!UnityToMap(transform, out MapPos mp))
@@ -164,7 +122,6 @@ public static bool UnityToMap(Transform transform, out MapPos position)
             }
 
             position = new MapPos();
-            position.clampFlags = ClampFlags.NONE;
             position.node = node.node;
 
             var nodeRelative = node.transform.InverseTransformPoint(transform.position);
@@ -183,34 +140,23 @@ public static bool MapToWorld(MapPos mappos, out CartPos cartpos)
             return MapControl.SystemMap.GlobalToWorld(mappos.GlobalPosition(), out cartpos);
         }
 
-        public static bool WorldToMap(LatPos latpos, out MapPos mappos, 
-            ClampOptions clampOptions = ClampOptions.None)
+        public static bool WorldToMap(LatPos latpos, out MapPos mappos, bool clampToGround = false)
         {
-            var clampFlags = GetClampFlags(clampOptions);
-            var clampType = GetClampType(clampOptions);
-
             mappos = new MapPos();
-
-            return MapControl.SystemMap.SetPosition(mappos, latpos, clampType, clampFlags);
+            return MapControl.SystemMap.SetPosition(mappos, latpos, clampToGround ? GroundClampType.GROUND : GroundClampType.NONE);
         }
 
-        public static bool WorldToMap(CartPos cartpos, out MapPos mappos,
-            ClampOptions clampOptions = ClampOptions.None)
+        public static bool WorldToMap(CartPos cartpos, out MapPos mappos, bool clampToGround = false)
         {
-            var clampFlags = GetClampFlags(clampOptions);
-            var clampType = GetClampType(clampOptions);
-
             mappos = new MapPos();
-            mappos.clampFlags = clampFlags;
-
-            return MapControl.SystemMap.SetPosition(mappos, cartpos, clampType, clampFlags);
+            return MapControl.SystemMap.SetPosition(mappos, cartpos, clampToGround ? GroundClampType.GROUND : GroundClampType.NONE);
         }
 
         public static class Debug
         {
             public static GameObject CreatePrimitive(PrimitiveType primType, LatPos latpos, float scale = 1f, Color? color = null)
             {
-                if (!WorldToMap(latpos, out MapPos mappos, ClampOptions.None))
+                if (!WorldToMap(latpos, out MapPos mappos, false))
                     return null;
 
                 return CreatePrimitive(primType, mappos, scale, color);
@@ -218,7 +164,7 @@ public static GameObject CreatePrimitive(PrimitiveType primType, LatPos latpos,
 
             public static GameObject CreatePrimitive(PrimitiveType primType, CartPos cartpos, float scale = 1f, Color? color = null)
             {
-                if (!WorldToMap(cartpos, out MapPos mappos, ClampOptions.None))
+                if (!WorldToMap(cartpos, out MapPos mappos, false))
                     return null;
 
                 return CreatePrimitive(primType, mappos, scale, color);
@@ -247,10 +193,10 @@ public static GameObject CreatePrimitive(PrimitiveType primType, MapPos mappos,
 
             public static GameObject DrawLine(CartPos from, CartPos to, float size = 1f, Color? color = null)
             {
-                if (!WorldToMap(from, out var mapFrom, ClampOptions.None))
+                if (!WorldToMap(from, out var mapFrom, false))
                     return null;
                 
-                if (!WorldToMap(to, out var mapTo, ClampOptions.None))
+                if (!WorldToMap(to, out var mapTo, false))
                     return null;
 
                 return DrawLine(mapFrom, mapTo, size, color);
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/MapUtil.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/MapUtil.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/MapUtil.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/MapUtil.cs.meta
diff --git a/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeBuilder.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeBuilder.cs
new file mode 100644
index 00000000..76ca2e0a
--- /dev/null
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeBuilder.cs
@@ -0,0 +1,62 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: NodeBuilder.cs
+// Module		:
+// Description	: Generic Builder Interface
+// Author		: Anders Modén
+// Product		: Gizmo3D 2.12.75
+//
+// NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
+//			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
+//			usage in Game or VisSim development.
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+// ZJP	200625	Created file                                        (2.10.6)
+//
+//******************************************************************************
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+using UnityEngine;
+using GizmoSDK.Gizmo3D;
+
+namespace Saab.Foundation.Unity.MapStreamer
+{
+    public enum BuildPriority
+    {
+        Immediate,
+        Low,
+    }
+
+    public interface INodeBuilder
+    {
+        PoolObjectFeature Feature { get; }
+        BuildPriority Priority { get; }
+        bool CanBuild(Node node);
+        bool Build(NodeHandle nodeHandle, GameObject gameObject, NodeHandle activeStateNode);
+        void BuiltObjectReturnedToPool(GameObject gameObject);
+        void CleanUp();
+    }
+}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeBuilder.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeBuilder.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeBuilder.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeBuilder.cs.meta
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeGeometryHelper.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeGeometryHelper.cs
similarity index 69%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeGeometryHelper.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeGeometryHelper.cs
index 516c5107..7389bd0c 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeGeometryHelper.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeGeometryHelper.cs
@@ -19,7 +19,7 @@
 // Module		:
 // Description	: Helper class for vertice updates
 // Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
+// Product		: Gizmo3D 2.12.75
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
@@ -34,6 +34,11 @@
 //
 //******************************************************************************
 
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
 // Framework
 using System;
 
@@ -44,13 +49,11 @@
 using GizmoSDK.Gizmo3D;
 using GizmoSDK.GizmoBase;
 
-using ProfilerMarker = global::Unity.Profiling.ProfilerMarker;
-using ProfilerCategory = global::Unity.Profiling.ProfilerCategory;
-
 namespace Saab.Foundation.Unity.MapStreamer
 {
     public static class GeometryHelper
     {
+        [ThreadStatic] private static float[] _float_data;
         [ThreadStatic] private static int[] _indices;
 
         [ThreadStatic] private static Vector3[] _positions;
@@ -58,16 +61,18 @@ public static class GeometryHelper
         [ThreadStatic] private static Color[] _colors;
         [ThreadStatic] private static Vector2[] _texCoords;
 
-        private static readonly ProfilerMarker _profilerMarker = new ProfilerMarker(ProfilerCategory.Render, "SM-BuildGeometry");
-
-        public static bool Build(Geometry geom, out Mesh output, out Color uniformColor)
+        public static bool Build(Geometry geom, out Mesh output, MeshRenderer renderer)
         {
-            _profilerMarker.Begin();
-            
-            var res = BuildInternal(geom, out output, out uniformColor);
-            
-            _profilerMarker.End();
-            return res;
+            try
+            {
+                Performance.Enter("GeometryBuilder.Build");
+
+                return BuildInternal(geom, out output,renderer);
+            }
+            finally
+            {
+                Performance.Leave();
+            }
         }
 
         private static bool CopyPositionAndIndices(Geometry geom, Mesh mesh)
@@ -75,21 +80,17 @@ private static bool CopyPositionAndIndices(Geometry geom, Mesh mesh)
             uint numVertices = 0;
             uint numIndices = 0;
 
-            if (!geom.GetTrinagleVertexData<Vector3>(ref _positions, ref numVertices, ref _indices, ref numIndices))
+            if (!geom.GetVertexData<Vector3>(ref _positions, ref numVertices, ref _indices, ref numIndices))
                 return false;
 
-            if (numVertices < 3 || numIndices < 3)
-                return false;
-            
             mesh.SetVertices(_positions, 0, (int)numVertices);
             mesh.SetIndices(_indices, 0, (int)numIndices, MeshTopology.Triangles, 0);
 
             return true;
         }
 
-        private static bool CopyColors(Geometry geom, Mesh mesh, out Color uniformColor)
+        private static bool CopyColors(Geometry geom, Mesh mesh,MeshRenderer renderer)
         {
-            uniformColor = Color.white;
             var numVertices = mesh.vertexCount;
 
             uint numColors = 0;
@@ -101,7 +102,7 @@ private static bool CopyColors(Geometry geom, Mesh mesh, out Color uniformColor)
 
             if (numColors == 1)    // Overall color, not per vertex
             {
-                uniformColor = _colors[0];
+                renderer.material.color = _colors[0];
                 return true;
             }
             else if (numColors != numVertices)
@@ -138,6 +139,8 @@ private static void GenerateNormals(Mesh mesh)
 
         private static bool CopyTexcoords(Geometry geom, Mesh mesh)
         {
+            var numVertices = mesh.vertexCount;
+
             var texture_units = geom.GetTextureUnits();
 
             uint numTexCoords=0;
@@ -155,39 +158,37 @@ private static bool CopyTexcoords(Geometry geom, Mesh mesh)
             return true;
         }
 
-        //output = default;
-
-        //TODO: Lets try to get native data directly in the future
-        //      Try NativeArray<> ??
-        // NativeArray<T> ConvertExistingDataToNativeArray(void* dataPointer, int length, Unity.Collections.Allocator allocator); 
-
-        //IntPtr native_vertice_data=IntPtr.Zero;
-        //IntPtr native_indice_data=IntPtr.Zero;
-        //
-        //if (geom.GetVertexData(ref native_vertice_data, ref len, ref native_indice_data, ref indice_len))
-        //{
-        //    unsafe
-        //    {
-        //        NativeArray<Vector3> _vec3 = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<Vector3>(native_vertice_data.ToPointer(), (int)/en, /Allocator.None);
-        //    }
-        //
-        //}
-
-        // Further: Unity offset SetVertexDataParams, SetVertexData API, allowing us to define a vertex structure
-        // NativeArray<VertexStructure>
-        //
-        // This could be used to improve the SetX functions of the mesh
-
-        private static bool BuildInternal(Geometry geom, out Mesh mesh, out Color uniformColor)
+        private static bool BuildInternal(Geometry geom, out Mesh mesh,MeshRenderer renderer)
         {
-            uniformColor = Color.white;
+            //output = default;
+
+            //TODO: Lets try to get native data directly in the future
+            //      Try NativeArray<> ??
+            // NativeArray<T> ConvertExistingDataToNativeArray(void* dataPointer, int length, Unity.Collections.Allocator allocator); 
+
+            //IntPtr native_vertice_data=IntPtr.Zero;
+            //IntPtr native_indice_data=IntPtr.Zero;
+            //
+            //if (geom.GetVertexData(ref native_vertice_data, ref len, ref native_indice_data, ref indice_len))
+            //{
+            //    unsafe
+            //    {
+            //        NativeArray<Vector3> _vec3 = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<Vector3>(native_vertice_data.ToPointer(), (int)/en, /Allocator.None);
+            //    }
+            //
+            //}
+
+            // Further: Unity offset SetVertexDataParams, SetVertexData API, allowing us to define a vertex structure
+            // NativeArray<VertexStructure>
+            //
+            // This could be used to improve the SetX functions of the mesh
 
             mesh = new Mesh();
 
             if (!CopyPositionAndIndices(geom, mesh))
                 return false;
 
-            CopyColors(geom, mesh, out uniformColor);
+            CopyColors(geom, mesh,renderer);
 
             if (!CopyNormals(geom, mesh))
                 GenerateNormals(mesh);          // Todo: 221205 AMO This must be changed if we have an overall normal ! AMO
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeGeometryHelper.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeGeometryHelper.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeGeometryHelper.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeGeometryHelper.cs.meta
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeHandle.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeHandle.cs
similarity index 79%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeHandle.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeHandle.cs
index d889470d..6454cf8a 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeHandle.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeHandle.cs
@@ -19,7 +19,7 @@
 // Module		:
 // Description	: Handle to native Gizmo3D nodes
 // Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
+// Product		: Gizmo3D 2.12.75
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
@@ -35,6 +35,12 @@
 //
 //******************************************************************************
 
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
 // Framework
 using GizmoSDK.Gizmo3D;
 // Gizmo Managed classes
@@ -81,57 +87,40 @@ public enum NodeStateFlags : byte
         /// we shall continiously update our transform
         /// </summary>
         UpdateTransform = 1 << 2,
-
-        /// <summary>
-        /// node is referencing an asset prefab
-        /// </summary>
-        AssetInstance = 1 << 3,
     }
 
     // The NodeHandle component of a game object stores a Node reference to the corresponding Gizmo item on the native side
     public class NodeHandle : MonoBehaviour
     {
         // Handle to native gizmo node
-        public Node node { get; internal set; }
+        internal Node node;
 
         // Tracks internal state of the node
-        [NonSerialized]
         internal NodeStateFlags stateFlags;
 
         // Tracks state status
-        [NonSerialized]
         internal StateLoadInfo stateLoadInfo;
 
         // Pooling key associated with this handle
-        [SerializeField]
         internal PoolObjectFeature featureKey;
 
         // builder associated with this node
-        [NonSerialized]
         internal INodeBuilder builder;
 
-        // used during delayed build to detect recycled nodes
-        [NonSerialized]
-        internal byte version;
-
         // state-data (for now only single texture)
-        [NonSerialized]
-        public Texture2D texture;
+        internal Texture2D texture;
 
         // state-data-feature (for now only single texture)
-        [NonSerialized]
-        public Texture2D feature;
+        internal Texture2D feature;
 
         // state-data-height (for now only single texture)
-        [NonSerialized]
-        public Texture2D surfaceHeight;
+        internal Texture2D surfaceHeight;
 
         // resolution in meters for feature map
-        [NonSerialized]
-        public Matrix3D featureInfo;
+        internal Matrix3D featureInfo;
 
         private const string ID = "Saab.Foundation.Unity.MapStreamer.NodeHandle";
-        
+
         internal bool inNodeUtilsRegistry
         {
             get { return (stateFlags & NodeStateFlags.InRegistry) != NodeStateFlags.None; }
@@ -201,33 +190,5 @@ public void UpdateNodeInternals()
             transform.localScale = mat4.Scale().ToVector3();
             transform.localRotation = mat4.Quaternion().ToQuaternion();
         }
-
-        internal void Recycle(TextureManager textureManager)
-        {
-            if (node != null)
-                node.ReleaseAlreadyLocked();
-            
-            node = null;
-            builder = null;
-            stateLoadInfo = StateLoadInfo.None;
-            stateFlags = NodeStateFlags.None;
-            if (texture)
-            {
-                textureManager.Free(texture);
-                texture = null;
-            }
-            if (feature)
-            {
-                textureManager.Free(feature);
-                feature = null;
-            }
-            if (surfaceHeight)
-            {
-                textureManager.Free(surfaceHeight);
-                surfaceHeight = null;
-            }
-            featureInfo = default;
-            version++;
-        }
     }
 }
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeHandle.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeHandle.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeHandle.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeHandle.cs.meta
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeStateHelper.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeStateHelper.cs
similarity index 61%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeStateHelper.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeStateHelper.cs
index 49bfe5bf..8f02742e 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeStateHelper.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeStateHelper.cs
@@ -19,7 +19,7 @@
 // Module		:
 // Description	: Helper for texture and state uploads
 // Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
+// Product		: Gizmo3D 2.12.75
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
@@ -34,8 +34,14 @@
 //
 //******************************************************************************
 
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
 // Framework
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 
 // Unity
@@ -46,9 +52,8 @@
 using GizmoSDK.Gizmo3D;
 
 using gzTexture = GizmoSDK.Gizmo3D.Texture;
-using Texture = UnityEngine.Texture;
-using ProfilerMarker = global::Unity.Profiling.ProfilerMarker;
-using ProfilerCategory = global::Unity.Profiling.ProfilerCategory;
+using Unity.Collections.LowLevel.Unsafe;
+using Unity.Collections;
 
 namespace Saab.Foundation.Unity.MapStreamer
 {
@@ -70,156 +75,165 @@ public class TextureImageInfo
         public DynamicType border_y;
     }
 
-    public static class StateHelper
+    public interface ICache<in TKey, TValue>
+    {
+        bool TryGet(TKey key, out TValue value);
+        bool TryAdd(TKey key, TValue value);
+        void CleanUp();
+    }
+
+    // Basic threadsafe implementation of a texture cache
+    public class TextureCache : ICache<IntPtr, Texture2D>
     {
-        private static readonly ProfilerMarker _profilerMarker = new ProfilerMarker(ProfilerCategory.Render, "SM-ReadTexture");
+        private readonly ConcurrentDictionary<IntPtr, Texture2D> _cache = new ConcurrentDictionary<IntPtr, Texture2D>();
+        public bool TryGet(IntPtr key, out Texture2D value)
+        {
+            return _cache.TryGetValue(key, out value);
+        }
+        public bool TryAdd(IntPtr key, Texture2D value)
+        {
+            if (_cache.TryAdd(key, value))
+            {
+                Reference.Ref(key);
+                return true;
+            }
+
+            return false;
+        }
+
+        public void CleanUp()
+        {
+            foreach (var item in _cache)
+            {
+                var count = Reference.GetRef(item.Key);
+
+                if(count<=2)    // Possibly One native (+1) and one managed (1)
+                {
+                    // Move dealloc to NodeLocked by secondary thread
+                    ThreadEditLockedDeallocator.Dealloc(item.Key);
+
+                    Reference.UnRef(item.Key);
+
+                    Texture2D tex;
+
+                    _cache.TryRemove(item.Key, out tex);
+                        
+                }
+            }
+        }
+    }
 
+    public static class StateHelper
+    {
         private static readonly Dictionary<TextureFormat, bool> _supportedFormats = new Dictionary<TextureFormat, bool>();
 
-        public static bool Build(State state, out StateBuildOutput output, TextureManager textureCache = null)
+        public static bool Build(State state, out StateBuildOutput output, ICache<IntPtr, Texture2D> textureCache = null)
         {
             output = default;
 
-            if (!ReadTextureFromState(state, out Texture2D texture, textureCache))
-                return false;
+            try
+            {
+                Performance.Enter("StateBuilder.Build");
 
-            output.Texture = texture;
+                if (!ReadTextureFromState(state, out Texture2D texture,textureCache,null))
+                    return false;
 
-            if (ReadTextureFromState(state, out Texture2D feature, textureCache, out TextureImageInfo info, 1, false))       // Features always singletons and no mipmap force
-            {
-                if (info != null && info.homography.Is("gzImageHomography"))
+                output.Texture = texture;
+
+                TextureImageInfo info=new TextureImageInfo();
+
+                if (ReadTextureFromState(state, out Texture2D feature, null, info, 1, false))       // Features always singletons and no mipmap force
                 {
                     output.Feature = feature;
-                    output.Feature_homography = ((ImageHomography)info.homography);
+                    
+                    if(info.homography.Is("gzImageHomography"))
+                        output.Feature_homography = ((ImageHomography)info.homography);
                 }
-                else
-                    output.Feature = null;
-            }
 
-            if (ReadTextureFromState(state, out Texture2D surface, textureCache, out info, 2, false))       // Features always singletons and no mipmap force
-            {
-                if (info != null && info.homography.Is("gzImageHomography"))
+                info = new TextureImageInfo();
+
+                if (ReadTextureFromState(state, out Texture2D surface, null, info, 2, false))       // Features always singletons and no mipmap force
                 {
                     output.SurfaceHeight = surface;
-                    output.SurfaceHeight_homography = ((ImageHomography)info.homography);
+                                        
+                    if (info.homography.Is("gzImageHomography"))
+                        output.SurfaceHeight_homography = ((ImageHomography)info.homography);
                 }
-                else
-                    output.SurfaceHeight = null;
+            }
+            finally
+            {
+                Performance.Leave();
             }
 
             return true;
         }
 
-        public static bool Build(State state, out Texture2D output, TextureManager textureCache = null)
-        {
-            output = default;
-
-            if (!ReadTextureFromState(state, out Texture2D texture, textureCache))
-                return false;
-
-            output = texture;
-
-            return true;
-        }
-
-        private static bool ReadTextureFromState(State state, out Texture2D result, TextureManager textureCache, out TextureImageInfo info, uint unit=0,bool useMipMap=true)
+        private static bool ReadTextureFromState(State state, out Texture2D result, ICache<IntPtr, Texture2D> textureCache, TextureImageInfo tex_image_info, uint unit=0,bool useMipMap=true)
         {
             result = null;
-            info = null;
 
             if (!state.HasTexture(unit) || state.GetMode(StateMode.TEXTURE) != StateModeActivation.ON)
                 return false;
 
             using (var texture = state.GetTexture(unit))
             {
-                try
+                if (textureCache != null)
                 {
-                    if (textureCache != null)
-                    {
-                        var ptr = texture.GetNativeReference();
+                    // Check possible shared states
 
-                        if (textureCache.TryGet(ptr, out Texture cachedTexture, out TextureImageInfo cachedInfo))
+                    var stateShare = state.GetReferenceCount();
+
+                    if(stateShare>2)             // Share: 1 native, 1 managed, extra shared>2
+                    {
+                        if (textureCache.TryGet(state.GetNativeReference(), out result))
                         {
-                            result = (Texture2D)cachedTexture;
-                            info = cachedInfo;
+                            texture.ReleaseAlreadyLocked();
                             return true;
                         }
 
-                        info = new TextureImageInfo();
-
-                        if (!CopyTexture(texture, out result, info, useMipMap))
+                        if (!CopyTexture(texture, out result, tex_image_info, useMipMap))
                             return false;
 
-                        return textureCache.TryAdd(ptr, result, info);
-                    }
-
-                    info = new TextureImageInfo();
-
-                    if (!CopyTexture(texture, out result, info, useMipMap))
-                        return false;
-                }
-                finally
-                {
-                    // prevent dispose from locking object by releasing it manually here
-                    texture.ReleaseAlreadyLocked();
-                }
-            }
-
-            return true;
-        }
-
-        private static bool ReadTextureFromState(State state, out Texture2D result, TextureManager textureCache, uint unit = 0, bool useMipMap = true)
-        {
-            _profilerMarker.Begin();
-
-            var res = ReadTextureFromStateInternal(state, out result, textureCache, unit, useMipMap);
+                        // Add a reference to data
 
-            _profilerMarker.End();
+                        textureCache.TryAdd(state.GetNativeReference(), result);
 
-            return res;
-        }
+                        texture.ReleaseAlreadyLocked();
 
-        private static bool ReadTextureFromStateInternal(State state, out Texture2D result, TextureManager textureCache, uint unit = 0, bool useMipMap = true)
-        {
-            result = null;
+                        return true;
+                    }
 
-            if (!state.HasTexture(unit) || state.GetMode(StateMode.TEXTURE) != StateModeActivation.ON)
-                return false;
+                    var texShare = texture.GetReferenceCount();
 
-            using (var texture = state.GetTexture(unit))
-            {
-                try
-                {
-                    if (textureCache != null)
+                    if (texShare > 2)             // Share: 1 native, 1 managed, extra shared>2
                     {
-                        var ptr = texture.GetNativeReference();
-
-                        if (textureCache.TryGet(ptr, out Texture cachedTexture, out _))
+                        if (textureCache.TryGet(texture.GetNativeReference(), out result))
                         {
-                            result = (Texture2D)cachedTexture;
+                            texture.ReleaseAlreadyLocked();
                             return true;
                         }
 
-                        if (!CopyTexture(texture, out result, null, useMipMap))
+                        if (!CopyTexture(texture, out result, tex_image_info, useMipMap))
                             return false;
 
-                        return textureCache.TryAdd(ptr, result, null);
-                    }
+                        textureCache.TryAdd(texture.GetNativeReference(), result);
 
-                    if (!CopyTexture(texture, out result, null, useMipMap))
-                        return false;
-                }
-                finally
-                {
-                    // prevent dispose from locking object by releasing it manually here
-                    texture.ReleaseAlreadyLocked();
+                        texture.ReleaseAlreadyLocked();
+
+                        return true;
+                    }
                 }
+
+                if (!CopyTexture(texture, out result, tex_image_info, useMipMap))
+                    return false;
+
+                texture.ReleaseAlreadyLocked();
             }
 
             return true;
         }
 
-        private static bool CopyTexture(gzTexture gzTexture, out Texture2D result, TextureImageInfo info, bool mipChain = true)
+        private static bool CopyTexture(gzTexture gzTexture, out Texture2D result, TextureImageInfo tex_image_info, bool mipChain = true)
         {
             result = null;
 
@@ -228,11 +242,11 @@ private static bool CopyTexture(gzTexture gzTexture, out Texture2D result, Textu
 
             using (var image = gzTexture.GetImage())
             {
-                var imageFormat = image.Format;
+                var imageFormat = image.GetFormat();
 
-                var componentType = image.ComponentType;
+                var componentType = image.GetComponentType();
 
-                var components = image.Components;
+                var components = image.GetComponents();
 
                 var textureFormat = GetUnityTextureFormat(imageFormat,componentType,components);
 
@@ -248,10 +262,6 @@ private static bool CopyTexture(gzTexture gzTexture, out Texture2D result, Textu
                     return false;
 
                 result = new Texture2D((int)width, (int)height, textureFormat, mipChain);
-                if (!result)
-                    return false;
-                
-                result.name = "SM - NodeTexture";
 
 #if false
                 unsafe
@@ -287,12 +297,12 @@ private static bool CopyTexture(gzTexture gzTexture, out Texture2D result, Textu
 
                 result.Apply(mipChain, true);
 
-                if (info != null)
+                if (tex_image_info != null)
                 {
-                    info.homography = image.GetAttribute("UserDataImInfo", "ImI-Wrld-Hom");
+                    tex_image_info.homography = image.GetAttribute("UserDataImInfo", "ImI-Wrld-Hom");
 
-                    info.border_x = image.GetAttribute("UserDataImInfo", "ImI-Pixel-X-border");
-                    info.border_y = image.GetAttribute("UserDataImInfo", "ImI-Pixel-Y-border");
+                    tex_image_info.border_x = image.GetAttribute("UserDataImInfo", "ImI-Pixel-X-border");
+                    tex_image_info.border_y = image.GetAttribute("UserDataImInfo", "ImI-Pixel-Y-border");
                 }
             }
 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeStateHelper.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeStateHelper.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeStateHelper.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/NodeStateHelper.cs.meta
diff --git a/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/SceneManager.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/SceneManager.cs
new file mode 100644
index 00000000..f4d00833
--- /dev/null
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/SceneManager.cs
@@ -0,0 +1,1432 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: SceneManager.cs
+// Module		:
+// Description	: Management of dynamic asset loader from GizmoSDK
+// Author		: Anders Modén
+// Product		: Gizmo3D 2.12.75
+//
+// NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
+//			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
+//			usage in Game or VisSim development.
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+// AMO	180607	Created file        (2.9.1)
+// AMO  200304  Updated SceneManager with events for external users     (2.10.1)
+// AMO  221130  Updated SM with new locking and camera sync             (2.12.35)
+//
+//******************************************************************************
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+//#define DEBUG_CAMERA
+
+// Unity Managed classes
+using UnityEngine;
+
+// Gizmo Managed classes
+using GizmoSDK.GizmoBase;
+using GizmoSDK.Gizmo3D;
+
+// Fix some conflicts between unity and Gizmo namespaces
+using gzCamera = GizmoSDK.Gizmo3D.Camera;
+using gzTransform = GizmoSDK.Gizmo3D.Transform;
+using gzTexture = GizmoSDK.Gizmo3D.Texture;
+
+
+// Map utility
+using Saab.Foundation.Map;
+using Saab.Unity.Extensions;
+using Saab.Utility.Unity.NodeUtils;
+using Saab.Utility.GfxCaps;
+
+// Fix unity conflicts
+using unTransform = UnityEngine.Transform;
+
+// System
+using System.Collections.Generic;
+using System;
+using System.Collections;
+using UnityEngine.Networking;
+
+namespace Saab.Foundation.Unity.MapStreamer
+{
+    // The SceneManager behaviour takes a unity camera and follows that to populate the current scene with GameObjects in a scenegraph hierarchy
+
+    public interface ISceneManagerCamera
+    {
+        UnityEngine.Camera Camera { get; }
+        Vec3D GlobalPosition { get; set; }           // Position in Global coordinate system
+
+        Vector3 Up { get; }                         // Get up vector in global coordinate system for current position
+        Vector3 North { get; }                      // Get north vector in global coordinate system for current position
+
+        void PreTraverse(bool locked);              // Executed before scene is traversed and updated with new transform and new geometry
+
+        void PostTraverse(bool locked);             // Executed after nodes are repositioned with new transforms and correct activations
+
+        double UpdateCamera(double renderTime);     // Executed just before camera transform is used. Update you cam animation in this
+
+        void MapChanged();                          // Executed when map is changed
+
+        float LodFactor { get; }                    // Current lod factor
+    }
+
+    [Serializable]
+    public struct SceneManagerSettings
+    {
+        public UnityEngine.Shader DefaultShader;
+        // ************* [Deprecated] *************
+        //public UnityEngine.Shader CrossboardShader;
+        public UnityEngine.ComputeShader ComputeShader;
+        public int      SceneCleanupTime;                   // Time interval to cleanup scene and do gc
+        public double   MaxBuildTime;                       // Max time to spend in frame to build objects
+        public byte     DynamicLoaders;
+        public bool RenderInUpdate;                         // true to render during component update method
+
+        public static readonly SceneManagerSettings Default = new SceneManagerSettings 
+        { 
+            SceneCleanupTime = 10, 
+            MaxBuildTime = 0.016,
+            DynamicLoaders = 4,
+            RenderInUpdate = true,
+        };
+    }
+
+
+    public class SceneManager : MonoBehaviour
+    {
+        public SceneManagerSettings Settings = SceneManagerSettings.Default;
+        public ISceneManagerCamera  SceneManagerCamera;
+        public string               MapUrl;
+
+        // Events ----------------------------------------------------------
+
+        public delegate void EventHandler_OnGameObject(GameObject o);
+        public delegate void EventHandler_OnNode(Node node);
+        public delegate void EventHandler_OnUpdateCamera(double renderTime);
+        public delegate void EventHandler_OnMapLoadError(ref string url,string errorString,SerializeAdapter.AdapterError errorType,ref bool retry);
+
+        // Notifications for external users that wants to add components to created game objects. Be swift as we are in edit lock
+
+        public event EventHandler_OnGameObject  OnNewGeometry;      // GameObject with mesh
+        public event EventHandler_OnGameObject  OnNewCrossboard;    // CrossBoard/tree placement 
+        public event EventHandler_OnGameObject  OnNewLod;           // GameObject that toggles on off dep on distance
+        public event EventHandler_OnGameObject  OnNewTransform;     // GameObject that has a specific parent transform
+        public event EventHandler_OnGameObject  OnNewLoader;        // GameObject that works like a dynamic loader
+        public event EventHandler_OnGameObject  OnEnterPool;
+
+        public delegate void EventHandler_Traverse(bool locked);    // Pre and Post traversal in locked or unlocked mode (edit)
+
+        public event EventHandler_Traverse          OnPreTraverse;  // Called after SceneManagerCamera is updated
+        public event EventHandler_Traverse          OnPostTraverse; // Called after SceneManagerCamera is updated
+        public event EventHandler_OnNode            OnMapChanged;
+        public event EventHandler_OnMapLoadError    OnMapLoadError;
+        public event EventHandler_OnUpdateCamera    OnUpdateCamera; // Called after SceneManagerCamera is updated
+
+        #region ------------- Privates ----------------
+
+        private Scene _native_scene;
+        private gzCamera _native_camera;
+        private Context _native_context;
+        private CullTraverseAction _native_traverse_action;
+        private GameObject _root;
+
+        private NodeAction _actionReceiver;
+
+        private Timer _cleanupTimer = new Timer();
+  
+        private readonly string ID = "Saab.Foundation.Unity.MapStreamer.SceneManager";
+
+        //#pragma warning disable 414
+        //private UnityPluginInitializer _plugin_initializer;
+        //#pragma warning restore 414
+
+#endregion
+
+        struct NodeLoadInfo
+        {
+            public NodeLoadInfo(DynamicLoadingState _state, DynamicLoader _loader, Node _node)
+            {
+                state = _state;
+                loader = _loader;
+                node = _node;
+            }
+
+            public DynamicLoadingState state;
+            public DynamicLoader loader;
+            public Node node;
+
+        };
+
+        // The activation struct carries information about the state of a native node (loaded/unloaded)
+        struct ActivationInfo
+        {
+            public ActivationInfo(NodeActionEvent _state, Node _node)
+            {
+                state = _state;
+                node = _node;
+            }
+
+            public NodeActionEvent state;
+            public Node node;
+        };
+
+        
+        // AssetLoadInfo carries info about loading an asset
+        struct AssetLoadInfo
+        {
+            public AssetLoadInfo(GameObject _parent, string _res_url, string _obj_id)
+            {
+                parent = _parent;
+                resource_url = _res_url;
+                object_id = _obj_id;
+            }
+
+            public GameObject parent;
+            public string resource_url;
+            public string object_id;
+        };
+
+        // stores information for a pending build job
+        struct BuildInfo
+        {
+            public INodeBuilder Builder;
+            public NodeHandle NodeHandle;
+            public Node Node;
+            public GameObject GameObject;
+            public NodeHandle ActiveStateNode;
+        }
+
+        // A queue for new pending loads/unloads
+        List<NodeLoadInfo> pendingLoaders = new List<NodeLoadInfo>(100);
+        Dictionary<IntPtr,NodeLoadInfo> activePendingLoaders = new Dictionary<IntPtr, NodeLoadInfo>();
+
+        // A queue for pending activations/deactivations
+        List<ActivationInfo> pendingActivations = new List<ActivationInfo>(100);
+  
+        // A queue for post build work
+        Queue<BuildInfo> pendingBuilds = new Queue<BuildInfo>(200);
+
+        // A queue for AssetLoading
+        Stack<AssetLoadInfo> pendingAssetLoads = new Stack<AssetLoadInfo>(100);
+
+        // The current active asset bundles
+        Dictionary<string, AssetBundle> currentAssetBundles = new Dictionary<string, AssetBundle>();
+
+        // Linked List for nodes that needs updates on update
+        LinkedList<GameObject> updateNodeObjects = new LinkedList<GameObject>();
+        
+        private bool _initialized;
+
+        // Builders. Right now only one builder per node type hierarchy
+
+        private readonly List<INodeBuilder> _builders = new List<INodeBuilder>();
+
+        public void AddBuilder(INodeBuilder builder)
+        {
+            _builders.Add(builder);
+        }
+
+        public void RemoveBuilder(INodeBuilder builder)
+        {
+            _builders.Remove(builder);
+        }
+
+        private void CleanUpBuilders()
+        {
+            foreach (var builder in _builders)
+            {
+                builder.CleanUp();
+            }
+        }
+
+        private INodeBuilder GetBuilderForNode(Node node)
+        {
+            foreach (var builder in _builders)
+            {
+                if (!builder.CanBuild(node))
+                    continue;
+
+                return builder;
+            }
+
+            return null;
+        }
+
+        private void BuildNode(INodeBuilder builder, NodeHandle nodeHandle, NodeHandle activeStateNode)
+        {
+            switch (builder.Priority)
+            {
+                case BuildPriority.Immediate:
+                    if (builder.Build(nodeHandle, nodeHandle.gameObject, activeStateNode))
+                        nodeHandle.builder = builder;
+                    break;
+                default:
+                    pendingBuilds.Enqueue(new BuildInfo() 
+                    { 
+                        Builder = builder, 
+                        NodeHandle = nodeHandle, 
+                        Node = nodeHandle.node,
+                        GameObject = nodeHandle.gameObject, 
+                        ActiveStateNode = activeStateNode,
+                    });
+                    break;
+            }
+        }
+
+        private void ProcessTransformNode(gzTransform node, unTransform transform)
+        {
+            // Check if transform is Active and not unit (1)
+            if (!node.IsActive())
+                return;
+
+            if (node.GetTranslation(out Vec3 translation))
+            {
+                transform.localPosition = new Vector3(translation.x, translation.y, translation.z);
+                return;
+            }
+
+            node.GetTransform(out Matrix4 mat4);
+
+            transform.localPosition = mat4.Translation().ToVector3();
+            transform.localScale = mat4.Scale().ToVector3();
+            transform.localRotation = mat4.Quaternion().ToQuaternion();
+        }
+
+        private GameObject ProcessDynamicLoaderNode(DynamicLoader node, NodeHandle nodeHandle)
+        {
+            // Possibly we can add action interfaces for dyn load childs as they will get traversable if they have node actons
+            if (NodeUtils.FindGameObjectsUnsafe(node.GetNativeReference(), out List<GameObject> list))
+                return list[0]; // We are already in list, lets return first object wich is our main registered node
+            
+            // We are not registered
+            NodeUtils.AddGameObjectReferenceUnsafe(node.GetNativeReference(), nodeHandle.gameObject);
+
+            nodeHandle.inNodeUtilsRegistry = true;  // Added to registry
+
+            return null;
+        }
+
+        private void ProcessLodNode(Lod node, NodeHandle nodeHandle, NodeHandle activeStateNode)
+        {
+            ProcessGroup(node, nodeHandle, activeStateNode, true);
+        }
+
+        private void ProcessRoiNode(Roi node, NodeHandle nodeHandle, NodeHandle activeStateNode)
+        {
+            RegisterNodeForUpdate(nodeHandle);
+            ProcessGroup(node, nodeHandle, activeStateNode, true);
+        }
+
+        private void RegisterNodeForUpdate(NodeHandle nodeHandle)
+        {
+            nodeHandle.updateTransform = true;
+            nodeHandle.inNodeUpdateList = true;
+            updateNodeObjects.AddLast(nodeHandle.gameObject);
+        }
+
+        private void ProcessGroup(Group node, NodeHandle nodeHandle, NodeHandle activeStateNode, bool addActionInterfaces = false)
+        {
+            var parent = nodeHandle.transform;
+
+            if (addActionInterfaces)        // use addActionInterface if we shall be able to enable/disable part of the tree using action callbacks
+            {
+                foreach (var child in node)
+                {
+                    var gameObject = TraverseInternal(child, activeStateNode);
+
+                    var childNodeHandle = gameObject.GetComponent<NodeHandle>();
+
+                    if (!NodeUtils.HasGameObjectsUnsafe(child.GetNativeReference()))
+                    {
+                        NodeUtils.AddGameObjectReferenceUnsafe(child.GetNativeReference(), gameObject);
+
+                        childNodeHandle.inNodeUtilsRegistry = true;
+                        child.AddActionInterface(_actionReceiver, NodeActionEvent.IS_TRAVERSABLE);
+                        child.AddActionInterface(_actionReceiver, NodeActionEvent.IS_NOT_TRAVERSABLE);
+                    }
+
+                    gameObject.transform.SetParent(parent, false);
+                }
+                
+                return;
+            }
+
+            foreach (var child in node)
+            {
+                var gameObject = TraverseInternal(child, activeStateNode);
+
+                gameObject.transform.SetParent(parent, false);
+            }
+        }
+
+        private NodeHandle CreateNodeHandle(Node node, PoolObjectFeature feature)
+        {
+            var nodeHandle = Allocate(feature, node);
+            // we only use the name inside editor to avoid allocations in runtime
+#if UNITY_EDITOR
+            nodeHandle.name = node.GetName();
+            
+            if (string.IsNullOrEmpty(nodeHandle.name))
+                nodeHandle.name = node.GetType().Name;
+#endif
+            return nodeHandle;
+        }
+
+        private GameObject BeginTraverse(Node node,bool dynloaded=false)
+        {
+            // We must be called in edit lock
+
+            // if dynloaded we should add actions for traverse here as we can be toggled on/off by loader (fancier look)
+
+            return TraverseInternal(node, null);
+        }
+
+        private GameObject TraverseInternal(Node node, NodeHandle activeStateNode)
+        {
+            // We must be called in edit lock
+            
+            System.Diagnostics.Debug.Assert(node != null && node.IsValid());
+
+            // --------------------------- Add game object ---------------------------------------
+
+            NodeHandle nodeHandle;
+
+            var builder = GetBuilderForNode(node);
+
+            if (builder == null)
+            {
+                nodeHandle = CreateNodeHandle(node, PoolObjectFeature.None);
+                
+                // check for new active state
+                if (node.HasState())
+                    activeStateNode = nodeHandle;
+            }
+            else
+            {
+                nodeHandle = CreateNodeHandle(node, builder.Feature);
+
+                // check for new active state
+                if (node.HasState())
+                    activeStateNode = nodeHandle;
+
+                // build gameobjects for this node
+                BuildNode(builder, nodeHandle, activeStateNode);
+            }
+
+            var gameObject = nodeHandle.gameObject;
+
+            // ------- GROUP based ITEMS first --------------------------------------------------
+
+            // ---------------------------- Transform check -------------------------------------
+
+            if (node is gzTransform tr)
+            {
+                try
+                {
+                    Performance.Enter("SM.Traverse.Transform");
+
+                    ProcessTransformNode(tr, gameObject.transform);
+
+                    Performance.Enter("SM.Traverse.OnNewTransform");
+                    
+                    // Notify subscribers of new Transform
+                    OnNewTransform?.Invoke(gameObject);
+                    
+                    Performance.Leave();
+                }
+                finally
+                {
+                    Performance.Leave();
+                }    
+            }
+
+            // ---------------------------- DynamicLoader check -------------------------------------
+
+            // Add dynamic loader as game object in dictionary
+            // so other dynamic loaded data can parent them as child to loader
+            else if (node is DynamicLoader dl)
+            {
+                try
+                {
+                    Performance.Enter("SM.Traverse.Loader");
+
+                    var res = ProcessDynamicLoaderNode(dl, nodeHandle);
+                    if (res != null)
+                        return res;
+                    
+                    // We shall continue to iterate as a group to see if we already have loaded children
+
+
+                    Performance.Enter("SM.Traverse.OnNewLoader");
+                    
+                    // Notify subscribers of new Loader
+                    OnNewLoader?.Invoke(gameObject);
+                    
+                    Performance.Leave();
+                }
+                finally
+                {
+                    Performance.Leave();
+                }
+            }
+
+            // ---------------------------- Lod check -------------------------------------
+
+            else if (node is Lod ld)
+            {
+                ProcessLodNode(ld, nodeHandle, activeStateNode);
+
+                Performance.Enter("SM.Traverse.OnNewLod");
+                
+                // Notify subscribers of new Lod
+                OnNewLod?.Invoke(gameObject);
+                
+                Performance.Leave();
+
+                // Dont process group as group is already processed
+                return gameObject;
+            }
+
+            // ---------------------------- Roi check -------------------------------------
+
+            if (node is Roi roi)
+            {
+                ProcessRoiNode(roi, nodeHandle, activeStateNode);
+
+                // Dont process group as group is already processed
+                return gameObject;
+            }
+
+            // ---------------------------- RoiNode check -------------------------------------
+
+            else if (node is RoiNode)
+            {
+                RegisterNodeForUpdate(nodeHandle);
+
+                // Fall through to group 
+            }
+
+            // ---------------------------- Group check -------------------------------------
+                
+            if (node is Group g)
+            {
+                ProcessGroup(g, nodeHandle, activeStateNode);
+                return gameObject;
+            }
+
+            // -------------- ITEMS not built by builders --------------------------------------
+
+
+            // ---------------------------- Geometry check -------------------------------------
+
+            if (node is Geometry geom)
+            {
+                OnNewGeometry?.Invoke(gameObject);
+            }
+
+            // ---------------------------- Crossboard check -------------------------------------
+
+            else if (node is Crossboard cross)
+            {
+                OnNewCrossboard?.Invoke(gameObject);
+            }
+
+            // ---------------------------ExtRef check -----------------------------------------
+
+            else if (node is ExtRef extRef)
+            {
+                var info = new AssetLoadInfo(gameObject, extRef.ResourceURL, extRef.ObjectID);
+
+                pendingAssetLoads.Push(info);
+            }
+
+            return gameObject;
+        }
+
+        private IEnumerator AssetLoader()
+        {
+            while (true)
+            {
+                if (pendingAssetLoads.Count > 0)
+                {
+                    AssetLoadInfo info = pendingAssetLoads.Pop();
+
+                    AssetBundle assetBundle;
+
+                    if (!currentAssetBundles.TryGetValue(info.resource_url, out assetBundle))
+                    {
+                        UnityEngine.Networking.UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(info.resource_url, 0);
+
+                        yield return request.SendWebRequest();
+
+                        assetBundle = DownloadHandlerAssetBundle.GetContent(request);
+
+                        if (assetBundle)
+                            currentAssetBundles.Add(info.resource_url, assetBundle);
+                    }
+
+                    if (assetBundle != null)
+                    {
+
+                        GameObject extRefObject = assetBundle.LoadAsset<GameObject>(info.object_id);
+
+                        if (extRefObject != null)
+                        {
+                            GameObject instance = Instantiate(extRefObject);
+
+                            if (instance != null)
+                            {
+                                instance.name = info.object_id;
+                                instance.transform.SetParent(info.parent.transform, false);
+                            }
+                        }
+                    }
+                }
+
+                yield return null;
+            }
+        }
+
+        // The LoadMap function takes an URL and loads the map into GizmoSDK native db
+        public bool LoadMap(string mapURL)
+        {
+            NodeLock.WaitLockEdit();      // We assume we do all editing from main thread and to allow render we assume we edit in edit mode
+
+            try // We are now locked in edit
+            {
+
+                if (!ResetMap())
+                    return false;
+
+                Node node = null;
+
+                while (true)
+                {
+                    if (string.IsNullOrEmpty(mapURL))
+                        break;
+
+                    string errorString = "";
+                    SerializeAdapter.AdapterError errorType = SerializeAdapter.AdapterError.NO_ERROR;
+                    bool retry = false;
+
+                    node = DbManager.LoadDB(mapURL, ref errorString, ref errorType);
+
+                    if (node == null || !node.IsValid())
+                    {
+                        Message.Send(ID, MessageLevel.WARNING, $"Failed to load map {mapURL}");
+
+                        OnMapLoadError?.Invoke(ref mapURL, errorString, errorType, ref retry);
+
+                        if (retry)
+                            continue;
+
+                        return false;
+                    }
+
+                    break;
+                }
+
+                MapUrl = mapURL;
+
+                MapControl.SystemMap.NodeURL = mapURL;
+                MapControl.SystemMap.CurrentMap = node;
+
+                
+
+                if (node != null)
+                {
+                    _native_scene.AddNode(MapControl.SystemMap.CurrentMap);
+                    _native_scene.Debug();
+
+                    _root = new GameObject("root");
+                    GameObject scene = BeginTraverse(MapControl.SystemMap.CurrentMap);
+
+                    if (scene != null)
+                        scene.transform.SetParent(_root.transform, false);
+
+                    // As GizmoSDK has a flipped Z axis going out of the screen we need a top transform to flip Z
+                    _root.transform.localScale = new Vector3(1, 1, -1);
+                }
+                
+                
+
+                //// Add example object under ROI --------------------------------------------------------------
+
+                //MapPos mapPos;
+
+                //GetMapPosition(new LatPos(1.0084718541, 0.24984267815, 300), out mapPos, GroundClampType.GROUND, true);
+
+                //_test = GameObject.CreatePrimitive(PrimitiveType.Sphere);
+
+                //_test.transform.parent = FindFirstGameObjectTransform(mapPos.roiNode);
+                //_test.transform.localPosition = mapPos.position.ToVector3();
+                //_test.transform.localScale = new Vector3(10, 10, 10);
+
+                if (SceneManagerCamera != null)
+                    SceneManagerCamera.MapChanged();
+
+                OnMapChanged?.Invoke(node);
+            }
+            finally
+            {
+                NodeLock.UnLock();
+            }
+
+            return true;
+        }
+
+        public bool ResetMap()
+        {
+            //MapUrl = null;
+
+            NodeLock.WaitLockEdit();
+
+            try // We are now locked in edit
+            {
+
+                foreach (var p in pendingLoaders)
+                {
+                    p.loader?.Dispose();
+                    p.node?.Dispose();
+                }
+
+                pendingLoaders.Clear();
+                activePendingLoaders.Clear();
+
+                foreach (var p in pendingActivations)
+                {
+                    p.node?.Dispose();
+                }
+
+                pendingActivations.Clear();
+
+                if (_root)
+                {
+                    Free(_root.transform);
+                    _root = null;
+                }
+
+                _native_scene?.RemoveAllNodes();
+
+                MapControl.SystemMap.Reset();
+            }
+            finally
+            {
+                NodeLock.UnLock();
+            }
+
+            return true;
+        }
+
+        private void AddDefaultBuilders()
+        {
+            // initialize node builders
+            AddBuilder(new DefaultGeometryNodeBuilder(Settings.DefaultShader));
+
+            // ************* [Deprecated] *************
+            //if (GfxCaps.CurrentCaps.HasFlag(Capability.UseTreeCrossboards))
+            //AddBuilder(new CrossboardNodeBuilder(Settings.CrossboardShader, Settings.ComputeShader));
+        }
+
+
+        public bool InitializeInternal()        
+        {
+            // Initialize streamer APIs
+            if (!GizmoSDK.Gizmo3D.Platform.Initialize())
+                return false;
+
+            // Initialize formats
+            DbManager.Initialize();
+
+            GizmoSDK.GizmoBase.Message.Send("SceneManager", MessageLevel.DEBUG, "Initialize Graph Streaming");
+
+            // Add builder for registered types
+            AddDefaultBuilders();
+
+            // Setup internal subscription events
+            _actionReceiver = new NodeAction("DynamicLoadManager");
+            _actionReceiver.OnAction += ActionReceiver_OnAction;
+
+            DynamicLoader.OnDynamicLoad += DynamicLoader_OnDynamicLoad;
+
+            
+            NodeLock.WaitLockEdit();
+
+            try // We are now locked in edit
+            {
+                // Camera setup
+                _native_camera = new PerspCamera("Test");
+                _native_camera.RoiPosition = true;
+                MapControl.SystemMap.Camera = _native_camera;
+
+                // Top scene
+                _native_scene = new Scene("Scene");
+                _native_camera.Scene = _native_scene;
+
+                // Top context
+                _native_context = new Context();
+
+#if DEBUG_CAMERA
+
+                // If we want to visualize debug 3D
+                _native_camera.Debug(_native_context);      // Enable to debug view
+
+#endif // DEBUG_CAMERA
+
+                // Default travrser
+                _native_traverse_action = new CullTraverseAction();
+
+                // _native_traverse_action.SetOmniTraverser(true);  // To skip camera cull and use LOD in omni directions
+
+
+            }
+            finally
+            {
+
+                NodeLock.UnLock();
+            }
+
+            // Set up dynamic loading
+            DynamicLoader.UsePreCache(true);                    // Enable use of mipmap creation on dynamic loading
+            DynamicLoaderManager.SetNumberOfActiveLoaders(Settings.DynamicLoaders);   // Lets start with 4 parallell threads
+            DynamicLoaderManager.StartManager();
+
+            // Start coroutines for asset loading
+            StartCoroutine(AssetLoader());
+
+            return true;
+        }
+
+        public bool Uninitialize()
+        {
+            if (!_initialized)
+                   return false;
+
+            // Stop manager
+            DynamicLoaderManager.StopManager();
+
+            ResetMap();
+
+            // Remove actions
+            DynamicLoader.OnDynamicLoad -= DynamicLoader_OnDynamicLoad;
+            _actionReceiver.OnAction -= ActionReceiver_OnAction;
+
+            NodeLock.WaitLockEdit();
+
+            try // We are now locked in edit
+            {
+
+                _native_camera.Debug(_native_context, false);
+                _native_camera.Dispose();
+                _native_camera = null;
+
+                _native_context.Dispose();
+                _native_context = null;
+
+                _native_scene.Dispose();
+                _native_scene = null;
+
+
+                _actionReceiver.Dispose();
+                _actionReceiver = null;
+
+            }
+            finally
+            {
+                NodeLock.UnLock();
+            }
+
+            // Dont do this as Unity wants to keep modules loaded
+            //// Drop platform streamer
+            //GizmoSDK.Gizmo3D.Platform.Uninitialize();
+
+            _initialized = false;
+
+            return true;
+        }
+
+        internal bool Init(bool loadMap = true)
+        {
+            if (_initialized)
+                return true;
+
+            _initialized = true;
+           
+            // Initialize this manager
+            if (!InitializeInternal())
+                return false;
+
+            // Load the map
+            if (loadMap && !LoadMap(MapUrl))
+                return false;
+
+            return true;
+        }
+
+
+        private void ActionReceiver_OnAction(NodeAction sender, NodeActionEvent action, Context context, NodeActionProvider trigger, TraverseAction traverser, IntPtr userdata)
+        {
+            // Locked in edit or render (render) by caller
+
+            if ((action == NodeActionEvent.IS_TRAVERSABLE) || (action == NodeActionEvent.IS_NOT_TRAVERSABLE))
+            {
+                pendingActivations.Add(new ActivationInfo(action, trigger as Node));
+            }
+            else
+                trigger?.ReleaseNoDelete();      // We are getting ref counts on objects in scene graph and these need to be released immediately
+
+            traverser?.ReleaseNoDelete();
+            context?.ReleaseNoDelete();
+        }
+
+        private void Start()
+        {
+            Init();
+        }
+
+        private void OnEnable()
+        {
+            // important that we do not run Init() from OnEable() since that will run during AddComponent(),
+            // and in BTA we need to control when the map is loaded.
+            if (!_initialized)
+                return;
+
+            Init();
+        }
+
+        private void OnApplicationQuit()
+        {
+            Uninitialize();
+        }
+
+        private void OnDisable()
+        {
+            // We add Unitialize and shut down threads here as this routine gets called by an edit in code
+            Uninitialize();
+        }
+               
+        private void DynamicLoader_OnDynamicLoad(DynamicLoadingState state, DynamicLoader loader, Node node)
+        {
+            // Locked in edit or render (render) by caller
+
+            if (state == DynamicLoadingState.LOADED || state == DynamicLoadingState.UNLOADED)
+            {
+                if (!activePendingLoaders.ContainsKey(loader.GetNativeReference()))
+                {
+                    NodeLoadInfo info = new NodeLoadInfo(state, loader, node);
+
+                    pendingLoaders.Add(info);       // Sorted order
+                    activePendingLoaders.Add(loader.GetNativeReference(), info);    // Lookup
+                }
+                else
+                {
+                    // Balanced add/remove that will cancel traversal or delete
+
+                    for (int i = pendingLoaders.Count - 1; i >= 0; i--)
+                    {
+                        if (pendingLoaders[i].loader.GetNativeReference() == loader.GetNativeReference())
+                        {
+                            pendingLoaders.RemoveAt(i);
+                            break;
+                        }
+                    }
+
+                    // remove reference
+                    activePendingLoaders.Remove(loader.GetNativeReference());
+                }
+
+            }
+            //else if (state == DynamicLoadingState.REQUEST_LOAD || state == DynamicLoadingState.REQUEST_UNLOAD || state == DynamicLoadingState.REQUEST_LOAD_CANCEL || state == DynamicLoadingState.REQUEST_LOAD_CANCEL)
+            //{
+            //    loader?.ReleaseNoDelete();      // Same here. We are getting refs to objects in scene graph that we shouldnt release in GC
+            //    node?.ReleaseNoDelete();
+            //}
+            //else if (state == DynamicLoadingState.IN_LOADING)
+            //{
+            //    loader?.ReleaseNoDelete();      // Same here. We are getting refs to objects in scene graph that we shouldnt release in GC
+            //    node?.ReleaseNoDelete();
+            //}
+            else
+            {
+                loader?.ReleaseNoDelete();      // Same here. We are getting refs to objects in scene graph that we shouldnt release in GC
+                node?.ReleaseNoDelete();
+            }
+        }
+
+        Timer _timeInPendingUpdates = new Timer();
+
+        private void ProcessPendingUpdatesPreTraversal()
+        {
+            // We must be called in edit lock
+
+            #region Dynamic Loading/Add/Remove native handles ---------------------------------------------------------------
+
+            Performance.Enter("SM.ProcessPendingUpdates.BuildGO");
+
+            // Process changes of the scenegraph
+            ProcessPendingLoaders();
+
+            // Potentiallly cleanup after pending unloads
+            CleanUpBuilders();
+
+            Performance.Leave();
+
+            #endregion
+        }
+
+        private void ProcessPendingUpdatesPostTraversal()
+        {
+            // We must be called in edit lock
+
+            #region Activate/Deactivate GameObjects based on scenegraph -----------------------------------------------------
+
+            Performance.Enter("SM.ProcessPendingUpdates.ActivateGO");
+
+            ProcessPendingActivations();
+
+            Performance.Leave();
+
+            #endregion
+
+            #region Update slow loading assets ------------------------------------------------------------------------------
+
+            Performance.Enter("SM.ProcessPendingUpdates.DequeBuildGO");
+
+            var _remainingTimeToBuild = Settings.MaxBuildTime - _timeInPendingUpdates.GetTime();
+
+            if(_remainingTimeToBuild>0)
+                ProcessPendingBuilders(_remainingTimeToBuild);
+
+            Performance.Leave();
+
+            #endregion
+
+            // Right now we use this as a dirty fix to handle unused shared materials            
+
+            if(_cleanupTimer.GetTime() >= Settings.SceneCleanupTime)
+            {             
+                Performance.Enter("SM.ProcessPendingUpdates.Cleanup");
+
+               _cleanupTimer.Reset();
+
+                Resources.UnloadUnusedAssets();
+                Performance.Leave();
+            }
+        }
+
+        private void ProcessPendingLoaders()
+        {
+            foreach (NodeLoadInfo nodeLoadInfo in pendingLoaders)
+            {
+                if (nodeLoadInfo.state == DynamicLoadingState.LOADED)   // We got a callback from dyn loader that we were loaded or unloaded
+                {
+                    unTransform transform = NodeUtils.FindFirstGameObjectTransformUnsafe(nodeLoadInfo.loader.GetNativeReference());
+
+                    if (transform == null)              // We have been unloaded or not registered
+                        continue;
+
+                    if (transform.childCount != 0)       // We have already a child and our sub graph was loaded
+                        continue;
+
+                    // TODO: Active state node can be further up the tree and should be located and passed here
+
+                    GameObject go = BeginTraverse(nodeLoadInfo.node,true);       // Build sub graph as result of dynamic loader
+
+                    if (go != null)
+                        go.transform.SetParent(transform, false);               // Connect to our parent
+
+                }
+                else if (nodeLoadInfo.state == DynamicLoadingState.UNLOADED)
+                {
+                    List<GameObject> list;
+
+                    if (NodeUtils.FindGameObjectsUnsafe(nodeLoadInfo.loader.GetNativeReference(), out list))
+                    {
+                        foreach (var go in list)
+                        {
+                            //We need to unload all limked go in hierarchy
+                            var tr = go.transform;
+                            for (var i = tr.childCount - 1; i >= 0; i--)
+                                Free(tr.GetChild(i));
+                        }
+                    }
+                }
+            }
+
+            pendingLoaders.Clear();         // Clear List
+            activePendingLoaders.Clear();   // Clear index
+        }
+
+        private void ProcessPendingActivations()
+        {
+            foreach (ActivationInfo activationInfo in pendingActivations)
+            {
+                List<GameObject> list;  // We need to activate the correct nodes
+
+                if (NodeUtils.FindGameObjectsUnsafe(activationInfo.node.GetNativeReference(), out list))
+                {
+                    foreach (GameObject obj in list)
+                    {
+                        if (activationInfo.state == NodeActionEvent.IS_TRAVERSABLE)
+                            obj.SetActive(true);
+                        else if (activationInfo.state == NodeActionEvent.IS_NOT_TRAVERSABLE)
+                            obj.SetActive(false);
+                    }
+                }
+                else 
+                {
+                    Message.Send(ID, MessageLevel.DEBUG, $"Got Activation {activationInfo.state} for missing node");
+                }
+            }
+
+            pendingActivations.Clear();
+        }
+
+        private void ProcessPendingBuilders(double maxBuildTime)
+        {
+            var _timeInPendingBuilders = new Timer();
+
+            while ( (pendingBuilds.Count > 0) && (_timeInPendingBuilders.GetTime() < maxBuildTime))
+            {
+                var buildInfo = pendingBuilds.Dequeue();
+
+                // make sure the pending build is still valid
+                if (buildInfo.NodeHandle.node != buildInfo.Node)
+                    continue;
+
+                var res = buildInfo.Builder.Build(buildInfo.NodeHandle, buildInfo.GameObject, buildInfo.ActiveStateNode);
+                System.Diagnostics.Debug.Assert(res);
+            }
+        }
+        
+        private void UpdateNodeInternals()
+        {
+            // Only called if SceneManagerCamera is not null
+
+            Performance.Enter("SM.UpdateNodeInternals");
+
+            foreach (GameObject go in updateNodeObjects)
+            {
+                NodeHandle h = go.GetComponent<NodeHandle>();
+
+                h.UpdateNodeInternals();
+            }
+
+            Performance.Leave();
+        }
+
+        // Update is called once per frame
+        private void Update()
+        {
+            if (Settings.RenderInUpdate)
+                Render();
+        }
+
+        
+        public void Render()
+        {
+            // Check if global world camera is present -----------------------
+
+            if (SceneManagerCamera == null)
+                return;
+
+            // Check if local unity camera is present ------------------------
+
+            var UnityCamera = SceneManagerCamera.Camera;
+
+            if (UnityCamera == null)
+                return;
+
+            // Check if local native camera is present ------------------------
+
+            if (_native_camera == null)
+                return;
+
+            try
+            {
+                Performance.Enter("SM.Update");
+
+                // Lets try to build a scenegraph from pending changes from previous pass
+
+                if (!NodeLock.TryLockEdit(30))      // 30 msek allow latency of other pending editor
+                {
+                    Message.Send(ID,MessageLevel.DEBUG, "Lock contention detected! NodeLock::TryLockEdit() FRAME LOST");
+
+                    // We failed to refresh scene in reasonable time but we still need to issue updates;
+
+                    Performance.Enter("SM.Update.PreTraverse");
+                    SceneManagerCamera.PreTraverse(false);
+                    OnPreTraverse?.Invoke(false);
+                    Performance.Leave();
+
+                    return;
+                }
+
+                // Notify about we are starting to traverse -----------------------
+
+                Performance.Enter("SM.Update.PreTraverse");
+
+                // Signal the world camera we are in pre traverse locked
+                SceneManagerCamera.PreTraverse(true);
+
+                // Signal the SM we are in pre traverse locked
+                OnPreTraverse?.Invoke(true);
+
+                Performance.Leave();
+
+                try // We are now locked in edit
+                {
+                    Performance.Enter("SM.ProcessPendingUpdatesPreTraversal");
+
+                    // Builds a scenegraph from changes from previous frame
+                    ProcessPendingUpdatesPreTraversal();
+                }
+                finally
+                {
+                    Performance.Leave();
+
+                    if (!NodeLock.ChangeToRenderLock())
+                    {
+                        NodeLock.UnLock();
+
+                        Message.Send(ID, MessageLevel.DEBUG, "Failed to change into RenderLock");
+                    }
+                }
+
+                if (!NodeLock.IsLockedRender())
+                    return;
+
+
+                if (activePendingLoaders.Count > 0) // Check if we got a mismatch in updates
+                {
+                    NodeLock.UnLock(); // Unlock render
+
+                    Message.Send(ID, MessageLevel.FATAL, "Mismatch in virtual context (loaded/unloaded data)");
+
+                    return;
+                }
+
+
+                try // We are now locked in read
+                {
+                    // Setup LOD
+
+                    // lod bias
+                    var lodFactor = SceneManagerCamera.LodFactor;
+                    Lod.SetLODFactor(_native_context, lodFactor);
+                    MapControl.SystemMap.LodFactor = lodFactor;
+
+                    // Transfer camera parameters
+
+                    PerspCamera perspCamera = _native_camera as PerspCamera;
+
+                    // Right now we use system time as render time but this can be controlled externally in the future
+                    var renderTime = GizmoSDK.GizmoBase.Time.SystemSeconds;
+
+                    // Syncronized update. You should use the rendertime
+                    renderTime = SceneManagerCamera.UpdateCamera(renderTime);
+                    OnUpdateCamera?.Invoke(renderTime);
+
+                    // Use this time in render
+                    _native_context.SetCurrentRenderTime(renderTime);
+
+                    if (perspCamera != null)
+                    {
+                        perspCamera.VerticalFOV = UnityCamera.fieldOfView;
+                        perspCamera.HorizontalFOV = 2 * Mathf.Atan(Mathf.Tan(UnityCamera.fieldOfView * Mathf.Deg2Rad / 2) * UnityCamera.aspect) * Mathf.Rad2Deg; ;
+                        perspCamera.NearClipPlane = UnityCamera.nearClipPlane;
+                        perspCamera.FarClipPlane = UnityCamera.farClipPlane;
+                    }
+
+                    Matrix4x4 unity_camera_transform = UnityCamera.transform.worldToLocalMatrix;
+
+                    _native_camera.Transform = unity_camera_transform.ToZFlippedMatrix4();
+
+                    _native_camera.Position = SceneManagerCamera.GlobalPosition;
+
+                    _native_camera.Render(_native_context, 1000, 1000, 1000, _native_traverse_action);
+
+#if DEBUG_CAMERA
+                     _native_camera.DebugRefresh();
+#endif
+                }
+                finally
+                {
+                    if (!NodeLock.ChangeToEditLock())
+                    {
+                        NodeLock.UnLock();
+
+                        Message.Send(ID, MessageLevel.DEBUG, "Failed to change into EditLock");
+                    }
+                }
+
+                if (!NodeLock.IsLockedByMe())
+                    return;
+
+                try // We are now locked in edit
+                {
+                    Performance.Enter("SM.ProcessPendingUpdatesPostTraversal");
+
+                    // Builds a scenegraph from changes from previous frame
+                    ProcessPendingUpdatesPostTraversal();
+                }
+                finally
+                {
+                    Performance.Leave();
+
+                    NodeLock.UnLock();
+                }
+
+                // Unlocked updates
+                UpdateNodeInternals();
+
+                // -------------------------------------------------------------
+            }
+            finally
+            {
+                // Notify about we are ready in traverse -----------------------
+
+                Performance.Enter("SM.Update.PostTraverse");
+                SceneManagerCamera.PostTraverse(false);
+                OnPostTraverse?.Invoke(false);
+                Performance.Leave();
+
+                // Leave Scm update -------------------------------------------
+                Performance.Leave();
+            }
+        }
+
+        private readonly Dictionary<PoolObjectFeature, Stack<NodeHandle>> _free = new Dictionary<PoolObjectFeature, Stack<NodeHandle>>();
+
+        private NodeHandle Allocate(PoolObjectFeature featureKey, Node node)
+        {
+            if (_free.TryGetValue(featureKey, out Stack<NodeHandle> pool) && pool.Count > 0)
+            {
+                var res = pool.Pop();
+                res.node = node;
+
+                // init
+                res.gameObject.SetActive(true);
+                res.gameObject.hideFlags = HideFlags.None;
+
+                return res;
+            }
+
+            var go = new GameObject();
+   
+            var nh = go.AddComponent<NodeHandle>();
+            nh.node = node;
+            nh.featureKey = featureKey;
+            
+
+
+            return nh;
+        }
+
+        private void Free(unTransform transform)
+        {
+            for (var i = transform.childCount - 1; i >= 0; i--)
+                Free(transform.GetChild(i));
+
+            var nodeHandle = transform.GetComponent<NodeHandle>();
+
+            if (nodeHandle)
+                FreeHandle(nodeHandle);
+            else
+                Destroy(transform.gameObject);
+        }
+
+        private void FreeHandle(NodeHandle nodeHandle)
+        {
+            var featureKey = nodeHandle.featureKey;
+
+            if (!_free.TryGetValue(featureKey, out Stack<NodeHandle> pool))
+            {
+                pool = new Stack<NodeHandle>();
+                _free.Add(featureKey, pool);
+            }
+
+            pool.Push(nodeHandle);
+
+            var go = nodeHandle.gameObject;
+            go.SetActive(false);
+            go.hideFlags = HideFlags.HideInHierarchy;
+
+            var tr = go.transform;
+            tr.parent = null;
+            tr.localPosition = Vector3.zero;
+            tr.localRotation = UnityEngine.Quaternion.identity;
+            tr.localScale = Vector3.one;
+
+            
+            var node = nodeHandle.node;
+
+            if (nodeHandle.inNodeUtilsRegistry)
+                NodeUtils.RemoveGameObjectReferenceUnsafe(node.GetNativeReference(), go);
+
+            if (nodeHandle.inNodeUpdateList)
+                updateNodeObjects.Remove(go);
+
+            if (node != null)
+            {
+                node.ReleaseAlreadyLocked();
+                nodeHandle.node = null;
+            }
+            
+            if (nodeHandle.builder != null)
+            {
+                nodeHandle.builder.BuiltObjectReturnedToPool(go);
+                nodeHandle.builder = null;
+            }
+
+            nodeHandle.stateLoadInfo = StateLoadInfo.None;
+            nodeHandle.stateFlags = NodeStateFlags.None;
+            nodeHandle.texture = null;
+
+            OnEnterPool?.Invoke(go);
+        }
+    }
+
+    [Flags]
+    public enum PoolObjectFeature : byte
+    {
+        //
+        None = 0,
+
+        //
+        StaticMesh = 1 << 0,
+
+        //
+        Crossboard = 1 << 1,
+    }
+
+
+}
+
+
+
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/SceneManager.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/SceneManager.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/SceneManager.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/SceneManager.cs.meta
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/SceneManagerCamera.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/SceneManagerCamera.cs
similarity index 94%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/SceneManagerCamera.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/SceneManagerCamera.cs
index 028e8e87..44b0fe45 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/SceneManagerCamera.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/SceneManagerCamera.cs
@@ -19,7 +19,7 @@
 // Module		:
 // Description	: Extensions to convert between GizmoSDK and Unity3D
 // Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
+// Product		: Gizmo3D 2.12.75
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
@@ -34,6 +34,11 @@
 //
 //******************************************************************************
 
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
 using System;
 using System.Collections.Generic;
 using System.Linq;
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/SceneManagerCamera.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/SceneManagerCamera.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/SceneManagerCamera.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/SceneManagerCamera.cs.meta
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/UnityExtensions.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/UnityExtensions.cs
similarity index 95%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/UnityExtensions.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/UnityExtensions.cs
index 97fc0112..06ee0998 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/UnityExtensions.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/UnityExtensions.cs
@@ -19,7 +19,7 @@
 // Module		:
 // Description	: Extensions to convert between GizmoSDK and Unity3D
 // Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
+// Product		: Gizmo3D 2.12.75
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
@@ -34,6 +34,12 @@
 //
 //******************************************************************************
 
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
 // Unity Managed classes
 using UnityEngine;
 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/UnityExtensions.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/UnityExtensions.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/UnityExtensions.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.Mapstreamer/UnityExtensions.cs.meta
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.NodeProperties.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.NodeProperties.meta
similarity index 77%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.NodeProperties.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.NodeProperties.meta
index dd8ece65..dbc10a3e 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.NodeProperties.meta
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.NodeProperties.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 4ed295e12f7641843a48e240662a03d4
+guid: 6ef81ec57a1dc1a4da6bfc773d943b4a
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.NodeProperties/NodeProperties.cs b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.NodeProperties/NodeProperties.cs
similarity index 77%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.NodeProperties/NodeProperties.cs
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.NodeProperties/NodeProperties.cs
index 3ab84fe2..19915ec0 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.NodeProperties/NodeProperties.cs
+++ b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.NodeProperties/NodeProperties.cs
@@ -19,7 +19,7 @@
 // Module		:
 // Description	: Adds PropertyAttributes to GizmoSDK NodeHandler
 // Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
+// Product		: Gizmo3D 2.12.75
 //
 //
 //
@@ -36,6 +36,12 @@
 //
 //******************************************************************************
 
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
 #if UNITY_EDITOR // Only active in unity editor
 
 using System.Collections.Generic;
@@ -49,7 +55,6 @@
 
 using GizmoSDK.Gizmo3D;
 using Saab.Foundation.Unity.MapStreamer;
-using GizmoSDK.GizmoBase;
 
 [AttributeUsage(AttributeTargets.Property)]
 public class ExposePropertyAttribute : Attribute
@@ -317,11 +322,11 @@ bool PropEdit_Node(Node node)
                
         // ------------------------- Name -----------------------------------------------------
 
-        string name = EditorGUILayout.DelayedTextField("Name",node.Name, emptyOptions);
+        string name = EditorGUILayout.TextField("Name",node.GetName(), emptyOptions);
                
-        if (name != node.Name)
+        if (name != node.GetName())
         {
-            node.Name=name;
+            node.SetName(name);
             change = true;
 
             if (name.Length > 0)
@@ -330,44 +335,6 @@ bool PropEdit_Node(Node node)
                 m_Instance.gameObject.name = node.GetNativeTypeName();
         }
 
-        // ------------------------- Type -----------------------------------------------------
-
-        EditorGUILayout.LabelField("Type", node.GetNativeTypeName(), emptyOptions);
-
-        EditorGUILayout.Separator();
-
-        // ------------------------- NodeID -----------------------------------------------------
-
-        string nodeID = EditorGUILayout.DelayedTextField("NodeID", node.NodeID.ToString(), emptyOptions);
-
-        if (nodeID!=node.NodeID.ToString())
-        {
-            change = true;
-            node.NodeID = Convert.ToUInt32(nodeID); 
-        }
-
-        // ------------------------- StateID -----------------------------------------------------
-
-        if (node.HasState())
-        {
-            var ID = node.State.StateID;
-
-            string stateID = EditorGUILayout.DelayedTextField("StateID", ID.ToString(), emptyOptions);
-
-            if (stateID != ID.ToString())
-            {
-                change = true;
-                node.State.StateID = Convert.ToUInt32(stateID);
-            }
-
-            var state = node.State;
-            var refCount = state.GetReferenceCount() - 1;
-            EditorGUILayout.LabelField("State Refs", refCount.ToString());
-            state.Release();
-        }
-
-        EditorGUILayout.Separator();
-
         // ------------------------ Boundary --------------------------------------------------
 
         EditorGUILayout.LabelField("Boundary Radius", string.Format("{0}",node.BoundaryRadius));
@@ -380,37 +347,6 @@ bool PropEdit_Node(Node node)
             change = true;
         }
 
-        EditorGUILayout.Separator();
-
-        // ------------------------- Meta -----------------------------------------------------
-
-        if (node.HasDbInfo())
-            EditorGUILayout.LabelField("DbInfo", node.GetDbInfo().ToJSON(), EditorStyles.wordWrappedLabel, emptyOptions);
-
-        // ------------------------- GDAL Meta -----------------------------------------------------
-
-        if(node.ExistUserData("GDAL"))
-        {
-            UserDataAttributeContainer gdal=node.GetUserData("GDAL") as UserDataAttributeContainer;
-            
-            if (gdal != null) 
-            {
-                var container=gdal.GetAttributes();
-
-                if(container != null) 
-                {
-                    EditorGUILayout.LabelField("GDAL", container.ToJSON(), EditorStyles.wordWrappedLabel, emptyOptions);
-                }
-            }
-        }
-
-        // ------------------------- Mask Info -----------------------------------------------------
-        
-        EditorGUILayout.LabelField("Intersector Mask", node.IntersectMask.ToString());
-
-        EditorGUILayout.Separator();
-
-        EditorGUILayout.LabelField("Cull Mask", node.CullMask.ToString());
 
         EditorGUILayout.Separator();
 
@@ -439,39 +375,12 @@ bool PropEdit_DynamicLoader(DynamicLoader loader)
 
         // ------------------------ GetLastAccessRenderCount ------------------------------------
 
-        EditorGUILayout.LabelField("Last Access", string.Format("{0}", loader.LastAccessRenderCount));
-
-        EditorGUILayout.Separator();
-
-        return change;
-    }
-
-    bool PropEdit_RefNode(RefNode refnode)
-    {
-        if (refnode == null)
-            return false;
-
-        bool change = false;
-
-        GUILayoutOption[] emptyOptions = new GUILayoutOption[0];
-
-        // ------------------------- RefNodeID -----------------------------------------------------
-
-        var refNodeID = refnode.ReferenceNodeID;
-
-        string id = EditorGUILayout.DelayedTextField("RefNodeID", refNodeID.ToString(), emptyOptions);
-        
-        if (id != refNodeID.ToString())
-        {
-            change = true;
-            refnode.ReferenceNodeID = Convert.ToUInt32(id);
-        }
+        EditorGUILayout.LabelField("Last Access", string.Format("{0}", loader.GetLastAccessRenderCount()));
 
         EditorGUILayout.Separator();
 
         return change;
     }
-
     public override void OnInspectorGUI()
     {
 
@@ -524,9 +433,6 @@ public override void OnInspectorGUI()
             if (PropEdit_Node(m_Instance.node as Node))
                 change = true;
 
-            if (PropEdit_RefNode(m_Instance.node as RefNode))
-                change = true;
-
             if (PropEdit_DynamicLoader(m_Instance.node as DynamicLoader))
                 change = true;
 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.NodeProperties/NodeProperties.cs.meta b/Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.NodeProperties/NodeProperties.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.NodeProperties/NodeProperties.cs.meta
rename to Assets/Saab/Unity/Foundation/Saab.Foundation.Unity.NodeProperties/NodeProperties.cs.meta
diff --git a/Assets/Saab/Unity/Utility.meta b/Assets/Saab/Unity/Utility.meta
new file mode 100644
index 00000000..af77304e
--- /dev/null
+++ b/Assets/Saab/Unity/Utility.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6bf9a6d13b9f16944aa23b7dc92fde7a
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Unity/Saab.Utility.Unity.NodeUtils.meta b/Assets/Saab/Unity/Utility/Saab.Utility.Unity.NodeUtils.meta
similarity index 77%
rename from com.saab.map-streamer/Runtime/Saab.Unity/Saab.Utility.Unity.NodeUtils.meta
rename to Assets/Saab/Unity/Utility/Saab.Utility.Unity.NodeUtils.meta
index aaf6d797..dbb23dda 100644
--- a/com.saab.map-streamer/Runtime/Saab.Unity/Saab.Utility.Unity.NodeUtils.meta
+++ b/Assets/Saab/Unity/Utility/Saab.Utility.Unity.NodeUtils.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 685a5e15903c2754193ec139a83540e9
+guid: 14c46766eae96f144a30490357956e4e
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/com.saab.map-streamer/Runtime/Saab.Unity/Saab.Utility.Unity.NodeUtils/Saab.Utility.Unity.NodeUtils.cs b/Assets/Saab/Unity/Utility/Saab.Utility.Unity.NodeUtils/Saab.Utility.Unity.NodeUtils.cs
similarity index 95%
rename from com.saab.map-streamer/Runtime/Saab.Unity/Saab.Utility.Unity.NodeUtils/Saab.Utility.Unity.NodeUtils.cs
rename to Assets/Saab/Unity/Utility/Saab.Utility.Unity.NodeUtils/Saab.Utility.Unity.NodeUtils.cs
index 2e82bf17..dfd10ab0 100644
--- a/com.saab.map-streamer/Runtime/Saab.Unity/Saab.Utility.Unity.NodeUtils/Saab.Utility.Unity.NodeUtils.cs
+++ b/Assets/Saab/Unity/Utility/Saab.Utility.Unity.NodeUtils/Saab.Utility.Unity.NodeUtils.cs
@@ -19,7 +19,7 @@
 // Module		:
 // Description	: Utility to control access between native handles and game objects
 // Author		: Anders Modén	
-// Product		: Gizmo3D 2.12.185
+// Product		: Gizmo3D 2.12.75
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows (Win32) and IRIX® for  
@@ -34,6 +34,13 @@
 //
 //******************************************************************************
 
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+
 // Unity Managed classes
 using UnityEngine;
 
diff --git a/com.saab.map-streamer/Runtime/Saab.Unity/Saab.Utility.Unity.NodeUtils/Saab.Utility.Unity.NodeUtils.cs.meta b/Assets/Saab/Unity/Utility/Saab.Utility.Unity.NodeUtils/Saab.Utility.Unity.NodeUtils.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Unity/Saab.Utility.Unity.NodeUtils/Saab.Utility.Unity.NodeUtils.cs.meta
rename to Assets/Saab/Unity/Utility/Saab.Utility.Unity.NodeUtils/Saab.Utility.Unity.NodeUtils.cs.meta
diff --git a/Assets/Saab/Utility.meta b/Assets/Saab/Utility.meta
new file mode 100644
index 00000000..ce280ed2
--- /dev/null
+++ b/Assets/Saab/Utility.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 94b3e92ba6aa1464f8c96d05b1c248ed
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Utility.GfxCaps.meta b/Assets/Saab/Utility/Saab.Utility.GfxCaps.meta
similarity index 77%
rename from com.saab.map-streamer/Runtime/Saab.Utility.GfxCaps.meta
rename to Assets/Saab/Utility/Saab.Utility.GfxCaps.meta
index 2b23fedc..625fef91 100644
--- a/com.saab.map-streamer/Runtime/Saab.Utility.GfxCaps.meta
+++ b/Assets/Saab/Utility/Saab.Utility.GfxCaps.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 76e35005a71048a4ca39a0eeedc44258
+guid: 86bbf1e831b29f049932f48f4f5d3a18
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/com.saab.map-streamer/Runtime/Saab.Utility.GfxCaps/GfxCaps.cs b/Assets/Saab/Utility/Saab.Utility.GfxCaps/GfxCaps.cs
similarity index 58%
rename from com.saab.map-streamer/Runtime/Saab.Utility.GfxCaps/GfxCaps.cs
rename to Assets/Saab/Utility/Saab.Utility.GfxCaps/GfxCaps.cs
index ad1faa1e..8aa35ef4 100644
--- a/com.saab.map-streamer/Runtime/Saab.Utility.GfxCaps/GfxCaps.cs
+++ b/Assets/Saab/Utility/Saab.Utility.GfxCaps/GfxCaps.cs
@@ -19,7 +19,7 @@
 // Module		:
 // Description	: Manage selected capabilities of Graphics Performance
 // Author		: Anders Modén	
-// Product		: GizmoBase 2.12.185
+// Product		: GizmoBase 2.12.75
 //
 // NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
 //			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
@@ -34,6 +34,12 @@
 //
 //******************************************************************************
 
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
 using System;
 using GizmoSDK.GizmoBase;
 
@@ -67,32 +73,6 @@ public RenderSettings(int drawDistance, float density, bool shadows = false)
         }
     }
 
-    // TODO: replace with a better solution in the future
-    public enum SettingsFeatureType
-    {
-        Trees,
-        Grass
-    }
-
-    public struct SettingsFeature
-    {
-        public bool Enabled;
-        public float Density;
-        public float DrawDistance;
-        public bool Shadows;
-
-        public SettingsFeature(float density, float drawdistance, bool shadows)
-        {
-            Density = density;
-            DrawDistance = drawdistance;
-            Shadows = shadows;
-            Enabled = true;
-
-            if (drawdistance <= 0.0f || density <= 0.0f)
-                Enabled = false;
-        }
-    }
-
     public class GfxCaps
     {
         public static Capability CurrentCaps = KeyDatabase.GetDefaultUserKey("GfxCaps/CurrentCaps", Capability.DefaultCaps);
@@ -119,32 +99,16 @@ public static RenderSettings GetTreeSettings
             }
         }
 
-        public static SettingsFeature GetFoliageSettings(SettingsFeatureType type)
+        public static RenderSettings GetFoliageSettings
         {
-            var renderSettings = new SettingsFeature(1.0f, 1.0f, false);
-
-            switch (type)
+            get
             {
-                case SettingsFeatureType.Trees:
-                    renderSettings.DrawDistance =   KeyDatabase.GetDefaultUserKey("GfxCaps/Foliage/Trees/DrawDistance", renderSettings.DrawDistance);
-                    renderSettings.Density =        KeyDatabase.GetDefaultUserKey("GfxCaps/Foliage/Trees/Density", renderSettings.Density);
-                    renderSettings.Shadows =        KeyDatabase.GetDefaultUserKey("GfxCaps/Foliage/Trees/Shadows", true);
-
-                    if (renderSettings.Density <= 0.0f || renderSettings.DrawDistance <= 0.0f || !GfxCaps.CurrentCaps.HasFlag(Capability.UseFoliageCrossboards))
-                        renderSettings.Enabled = false;
-                    break;
-                case SettingsFeatureType.Grass:
-                    renderSettings.DrawDistance =   KeyDatabase.GetDefaultUserKey("GfxCaps/Foliage/Grass/DrawDistance", renderSettings.DrawDistance);
-                    renderSettings.Density =        KeyDatabase.GetDefaultUserKey("GfxCaps/Foliage/Grass/Density", renderSettings.Density);
-                    renderSettings.Shadows =        KeyDatabase.GetDefaultUserKey("GfxCaps/Foliage/Grass/Shadows", false);
-
-                    if (renderSettings.Density <= 0.0f || renderSettings.DrawDistance <= 0.0f || !GfxCaps.CurrentCaps.HasFlag(Capability.UseFoliageCrossboards))
-                        renderSettings.Enabled = false;
-                    break;
-                default:
-                    break;
+                var renderSettings = new RenderSettings(5000, 0.1f);
+                renderSettings.DrawDistance = KeyDatabase.GetDefaultUserKey("GfxCaps/Foliage/DrawDistance", renderSettings.DrawDistance);
+                renderSettings.Density = KeyDatabase.GetDefaultUserKey("GfxCaps/Foliage/Density", renderSettings.Density);
+                renderSettings.Shadows = KeyDatabase.GetDefaultUserKey("GfxCaps/Foliage/Shadows", renderSettings.Shadows);
+                return renderSettings;
             }
-            return renderSettings;
         }
 
         public static bool HasCapability(Capability caps)
diff --git a/com.saab.map-streamer/Runtime/Saab.Utility.GfxCaps/GfxCaps.cs.meta b/Assets/Saab/Utility/Saab.Utility.GfxCaps/GfxCaps.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Utility.GfxCaps/GfxCaps.cs.meta
rename to Assets/Saab/Utility/Saab.Utility.GfxCaps/GfxCaps.cs.meta
diff --git a/projects/com.saab.map-streamer/Assets/Scenes.meta b/Assets/Scenes.meta
similarity index 77%
rename from projects/com.saab.map-streamer/Assets/Scenes.meta
rename to Assets/Scenes.meta
index 83c741b2..17072cfd 100644
--- a/projects/com.saab.map-streamer/Assets/Scenes.meta
+++ b/Assets/Scenes.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6ea315d0fd7389c41b19996891e99ae3
+guid: 4f704ae4b4f98ae41a0bce26658850c1
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/Assets/Scenes/StreamingMaps.unity b/Assets/Scenes/StreamingMaps.unity
new file mode 100644
index 00000000..8e71d7b5
--- /dev/null
+++ b/Assets/Scenes/StreamingMaps.unity
@@ -0,0 +1,1876 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_OcclusionBakeSettings:
+    smallestOccluder: 5
+    smallestHole: 0.25
+    backfaceThreshold: 100
+  m_SceneGUID: 00000000000000000000000000000000
+  m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 9
+  m_Fog: 0
+  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+  m_FogMode: 3
+  m_FogDensity: 0.01
+  m_LinearFogStart: 0
+  m_LinearFogEnd: 300
+  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+  m_AmbientIntensity: 1
+  m_AmbientMode: 0
+  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+  m_SkyboxMaterial: {fileID: 2100000, guid: 2995ae3933759be4c9275a57ca8e36a6, type: 2}
+  m_HaloStrength: 0.5
+  m_FlareStrength: 1
+  m_FlareFadeSpeed: 3
+  m_HaloTexture: {fileID: 0}
+  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+  m_DefaultReflectionMode: 0
+  m_DefaultReflectionResolution: 128
+  m_ReflectionBounces: 1
+  m_ReflectionIntensity: 1
+  m_CustomReflection: {fileID: 0}
+  m_Sun: {fileID: 170076734}
+  m_IndirectSpecularColor: {r: 0.49039876, g: 0.6147035, b: 0.7419382, a: 1}
+  m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 12
+  m_GIWorkflowMode: 0
+  m_GISettings:
+    serializedVersion: 2
+    m_BounceScale: 1
+    m_IndirectOutputScale: 1
+    m_AlbedoBoost: 1
+    m_EnvironmentLightingMode: 0
+    m_EnableBakedLightmaps: 1
+    m_EnableRealtimeLightmaps: 0
+  m_LightmapEditorSettings:
+    serializedVersion: 12
+    m_Resolution: 2
+    m_BakeResolution: 40
+    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: 1
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 512
+    m_PVRBounces: 2
+    m_PVREnvironmentSampleCount: 256
+    m_PVREnvironmentReferencePointCount: 2048
+    m_PVRFilteringMode: 1
+    m_PVRDenoiserTypeDirect: 1
+    m_PVRDenoiserTypeIndirect: 1
+    m_PVRDenoiserTypeAO: 1
+    m_PVRFilterTypeDirect: 0
+    m_PVRFilterTypeIndirect: 0
+    m_PVRFilterTypeAO: 0
+    m_PVREnvironmentMIS: 1
+    m_PVRCulling: 1
+    m_PVRFilteringGaussRadiusDirect: 1
+    m_PVRFilteringGaussRadiusIndirect: 5
+    m_PVRFilteringGaussRadiusAO: 2
+    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+    m_PVRFilteringAtrousPositionSigmaIndirect: 2
+    m_PVRFilteringAtrousPositionSigmaAO: 1
+    m_ExportTrainingData: 0
+    m_TrainingDataDestination: TrainingData
+    m_LightProbeSampleCountMultiplier: 4
+  m_LightingDataAsset: {fileID: 0}
+  m_LightingSettings: {fileID: 51969955}
+--- !u!196 &4
+NavMeshSettings:
+  serializedVersion: 2
+  m_ObjectHideFlags: 0
+  m_BuildSettings:
+    serializedVersion: 2
+    agentTypeID: 0
+    agentRadius: 0.5
+    agentHeight: 2
+    agentSlope: 45
+    agentClimb: 0.4
+    ledgeDropHeight: 0
+    maxJumpAcrossDistance: 0
+    minRegionArea: 2
+    manualCellSize: 0
+    cellSize: 0.16666667
+    manualTileSize: 0
+    tileSize: 256
+    accuratePlacement: 0
+    maxJobWorkers: 0
+    preserveTilesOutsideBounds: 0
+    debug:
+      m_Flags: 0
+  m_NavMeshData: {fileID: 0}
+--- !u!850595691 &51969955
+LightingSettings:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Settings.lighting
+  serializedVersion: 4
+  m_GIWorkflowMode: 0
+  m_EnableBakedLightmaps: 1
+  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_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_FinalGather: 0
+  m_FinalGatherRayCount: 256
+  m_FinalGatherFiltering: 1
+  m_PVRCulling: 1
+  m_PVRSampling: 1
+  m_PVRDirectSampleCount: 32
+  m_PVRSampleCount: 512
+  m_PVREnvironmentSampleCount: 256
+  m_PVREnvironmentReferencePointCount: 2048
+  m_LightProbeSampleCountMultiplier: 4
+  m_PVRBounces: 2
+  m_PVRMinBounces: 2
+  m_PVREnvironmentMIS: 1
+  m_PVRFilteringMode: 1
+  m_PVRDenoiserTypeDirect: 1
+  m_PVRDenoiserTypeIndirect: 1
+  m_PVRDenoiserTypeAO: 1
+  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_PVRTiledBaking: 0
+--- !u!1 &170076733
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 170076735}
+  - component: {fileID: 170076734}
+  m_Layer: 0
+  m_Name: Directional Light
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!108 &170076734
+Light:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 170076733}
+  m_Enabled: 1
+  serializedVersion: 10
+  m_Type: 1
+  m_Shape: 0
+  m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+  m_Intensity: 0.5
+  m_Range: 10000000
+  m_SpotAngle: 146
+  m_InnerSpotAngle: 1
+  m_CookieSize: 0
+  m_Shadows:
+    m_Type: 2
+    m_Resolution: -1
+    m_CustomResolution: -1
+    m_Strength: 1
+    m_Bias: 0.05
+    m_NormalBias: 0.4
+    m_NearPlane: 0.2
+    m_CullingMatrixOverride:
+      e00: 1
+      e01: 0
+      e02: 0
+      e03: 0
+      e10: 0
+      e11: 1
+      e12: 0
+      e13: 0
+      e20: 0
+      e21: 0
+      e22: 1
+      e23: 0
+      e30: 0
+      e31: 0
+      e32: 0
+      e33: 1
+    m_UseCullingMatrixOverride: 0
+  m_Cookie: {fileID: 0}
+  m_DrawHalo: 0
+  m_Flare: {fileID: 0}
+  m_RenderMode: 0
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingLayerMask: 1
+  m_Lightmapping: 4
+  m_LightShadowCasterMode: 0
+  m_AreaSize: {x: 1, y: 1}
+  m_BounceIntensity: 1
+  m_ColorTemperature: 6570
+  m_UseColorTemperature: 0
+  m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+  m_UseBoundingSphereOverride: 0
+  m_UseViewFrustumForShadowCasterCull: 1
+  m_ShadowRadius: 0
+  m_ShadowAngle: 0
+--- !u!4 &170076735
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 170076733}
+  m_LocalRotation: {x: 0.25727367, y: -0.71902233, z: 0.33528557, w: 0.5517252}
+  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: 50.000004, y: -105, z: 0}
+--- !u!1 &325619153
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 325619154}
+  - component: {fileID: 325619157}
+  - component: {fileID: 325619156}
+  - component: {fileID: 325619155}
+  m_Layer: 5
+  m_Name: Memory
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &325619154
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 325619153}
+  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: 1942460222}
+  m_RootOrder: 1
+  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.5, y: 0.5}
+--- !u!114 &325619155
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 325619153}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_HorizontalFit: 2
+  m_VerticalFit: 2
+--- !u!114 &325619156
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 325619153}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: New Text
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 16
+  m_fontSizeBase: 16
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 5, y: 5, z: 5, w: 5}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!222 &325619157
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 325619153}
+  m_CullTransparentMesh: 1
+--- !u!1 &414794559
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 414794562}
+  - component: {fileID: 414794561}
+  - component: {fileID: 414794560}
+  m_Layer: 0
+  m_Name: EventSystem
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &414794560
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 414794559}
+  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 &414794561
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 414794559}
+  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 &414794562
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 414794559}
+  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: 1012504024}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &450521131
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 450521132}
+  - component: {fileID: 450521134}
+  - component: {fileID: 450521133}
+  - component: {fileID: 450521135}
+  m_Layer: 5
+  m_Name: Stats
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &450521132
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 450521131}
+  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: 1942460222}
+  m_RootOrder: 0
+  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.5, y: 0.5}
+--- !u!114 &450521133
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 450521131}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: New Text
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 16
+  m_fontSizeBase: 16
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 5, y: 5, z: 5, w: 5}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!222 &450521134
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 450521131}
+  m_CullTransparentMesh: 1
+--- !u!114 &450521135
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 450521131}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_HorizontalFit: 2
+  m_VerticalFit: 2
+--- !u!1 &479045188
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 479045190}
+  - component: {fileID: 479045189}
+  m_Layer: 0
+  m_Name: Foliage
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &479045189
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 479045188}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2c6e0776126240d4995d868b86fa45a1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  SceneManager: {fileID: 534669907}
+  ComputeShader: {fileID: 7200000, guid: 658d4304a9fd9fe49bd7d3b0ede75fb1, type: 3}
+  FoliageMaterial: {fileID: 2100000, guid: d47289c4d874bb64ab00d0c729287ee0, type: 2}
+  BufferSize: 1000000
+  DrawDistance: 5000
+  Density: 0.25
+  Shadows: 0
+  DebugPrintCount: 0
+  Disabled: 0
+  DebugNoDraw: 0
+  FoliageTypes:
+  - {fileID: 11400000, guid: 73f36aba0294abd40813c3c17fe2d82f, type: 2}
+  - {fileID: 11400000, guid: 7f2f7682ea667bc4cbb3af6d7a852a56, type: 2}
+  - {fileID: 11400000, guid: cf930c10eaf61584ab165e6fa1d5c36c, type: 2}
+  - {fileID: 11400000, guid: c8b018727f8739145a2b49f4b478543a, type: 2}
+  - {fileID: 11400000, guid: 035a41288c360d64592400895b700bbe, type: 2}
+  - {fileID: 11400000, guid: 207cec2ba880dfd4c986e803c745d549, type: 2}
+  - {fileID: 11400000, guid: e417fd68500df3142b9e84ac7bb37811, type: 2}
+  - {fileID: 11400000, guid: 470e90fc7da503f40a2b566e6efccf0f, type: 2}
+  - {fileID: 11400000, guid: 2033741e2b7ce3045b3db8c3dbb67763, type: 2}
+  - {fileID: 11400000, guid: ae7bd575a71a441429dfcf50d64a3e95, type: 2}
+  - {fileID: 11400000, guid: da57b986d7b25e0428db808f07d390cf, type: 2}
+--- !u!4 &479045190
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 479045188}
+  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: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &534669902
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 534669905}
+  - component: {fileID: 534669904}
+  - component: {fileID: 534669903}
+  - component: {fileID: 534669906}
+  - component: {fileID: 534669907}
+  - component: {fileID: 534669908}
+  - component: {fileID: 534669909}
+  - component: {fileID: 534669910}
+  m_Layer: 0
+  m_Name: Main Camera
+  m_TagString: MainCamera
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!81 &534669903
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 534669902}
+  m_Enabled: 1
+--- !u!20 &534669904
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 534669902}
+  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_SensorSize: {x: 36, y: 24}
+  m_LensShift: {x: 0, y: 0}
+  m_FocalLength: 50
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: 1
+  far clip plane: 100000
+  field of view: 35
+  orthographic: 0
+  orthographic size: 5
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingPath: 3
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  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
+--- !u!4 &534669905
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 534669902}
+  m_LocalRotation: {x: 0.106213726, y: -0.28475827, z: 0.03176463, w: 0.9521672}
+  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: 2
+  m_LocalEulerAnglesHint: {x: 12.73, y: -33.3, z: 0}
+--- !u!114 &534669906
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 534669902}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0283285cec50a434eac1ca6d49af4bb6, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  Speed: 200
+  ShiftMultiplier: 2
+  RotSpeed: 25
+  X: 0
+  Y: 200
+  Z: 0
+--- !u!114 &534669907
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 534669902}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4247e51c3496f4042a0b4726f65a39a6, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  Settings:
+    DefaultShader: {fileID: 7, guid: 0000000000000000f000000000000000, type: 0}
+    ComputeShader: {fileID: 7200000, guid: 75616827e64e7bd478340a97f80a1da0, type: 3}
+    SceneCleanupTime: 10
+    MaxBuildTime: 0.01
+    DynamicLoaders: 4
+    RenderInUpdate: 1
+  MapUrl: http://gizmosdk.blob.core.windows.net/maps/stock/map.gzd
+--- !u!114 &534669908
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 534669902}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c2e02af6fa35924458434ab42b58dcae, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!114 &534669909
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 534669902}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 938f8c8c9a37449478b52f1baab22262, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  SceneManager: {fileID: 534669907}
+  DepthShader: {fileID: 7200000, guid: 7efa00cde91893345ac06d76d72dcb3a, type: 3}
+  OcclusionCulling: 0
+  EnableTrees: 1
+  EnableCross: 0
+  EnableGrass: 0
+  EnableDetailedTextures: 1
+  TerrainSettings:
+    GrassTextures:
+    - FeatureTexture: {fileID: 2800000, guid: ff4b295e2ad7d4e48b4b80f4e67a53b5, type: 3}
+      Height: {x: 0.2, y: 0.6}
+      Width: {x: 0.6, y: 1}
+      Yoffset: 0
+    - FeatureTexture: {fileID: 2800000, guid: ea117e979ce44a44da900e5a7e728ae2, type: 3}
+      Height: {x: 0.2, y: 0.6}
+      Width: {x: 0.6, y: 1}
+      Yoffset: 0
+    - FeatureTexture: {fileID: 2800000, guid: d6929f302024f9d47bdc77dc30d504e8, type: 3}
+      Height: {x: 0.2, y: 0.6}
+      Width: {x: 0.6, y: 1}
+      Yoffset: 0
+    - FeatureTexture: {fileID: 2800000, guid: 53af13b5f08426645ac88632d0d76504, type: 3}
+      Height: {x: 0.2, y: 0.6}
+      Width: {x: 0.6, y: 1}
+      Yoffset: 0
+    - FeatureTexture: {fileID: 2800000, guid: e7857884386c60543ba2a332e003517a, type: 3}
+      Height: {x: 0.2, y: 0.6}
+      Width: {x: 0.6, y: 1}
+      Yoffset: 0
+    - FeatureTexture: {fileID: 2800000, guid: 6a56b83030d34254ab9e8b3803bd5a07, type: 3}
+      Height: {x: 0.2, y: 0.6}
+      Width: {x: 0.6, y: 1}
+      Yoffset: 0
+    - FeatureTexture: {fileID: 2800000, guid: 53af13b5f08426645ac88632d0d76504, type: 3}
+      Height: {x: 0.2, y: 0.6}
+      Width: {x: 0.6, y: 1}
+      Yoffset: 0
+    - FeatureTexture: {fileID: 2800000, guid: ea117e979ce44a44da900e5a7e728ae2, type: 3}
+      Height: {x: 0.2, y: 0.6}
+      Width: {x: 0.6, y: 1}
+      Yoffset: 0
+    TreeTextures:
+    - FeatureTexture: {fileID: 2800000, guid: aa8fa2e5a2dcdd942bea00bad42a66f2, type: 3}
+      Height: {x: 12, y: 18}
+      Width: {x: 12, y: 18}
+      Yoffset: 0.2
+    - FeatureTexture: {fileID: 2800000, guid: 17a742decc8fba5488cac793d64a0d79, type: 3}
+      Height: {x: 12, y: 18}
+      Width: {x: 12, y: 18}
+      Yoffset: 0
+    - FeatureTexture: {fileID: 2800000, guid: 068b08ab1f96ae448a9cb2cfa1140fe4, type: 3}
+      Height: {x: 12, y: 18}
+      Width: {x: 12, y: 18}
+      Yoffset: 0.2
+    - FeatureTexture: {fileID: 2800000, guid: bafbcfee8f8bed34f88c84bd3dc1fc8a, type: 3}
+      Height: {x: 5, y: 12}
+      Width: {x: 5, y: 12}
+      Yoffset: 0.2
+    - FeatureTexture: {fileID: 2800000, guid: e722561d90ea85448b100a299a03ccf2, type: 3}
+      Height: {x: 12, y: 18}
+      Width: {x: 12, y: 18}
+      Yoffset: 0
+    - FeatureTexture: {fileID: 2800000, guid: aa8fa2e5a2dcdd942bea00bad42a66f2, type: 3}
+      Height: {x: 12, y: 18}
+      Width: {x: 12, y: 18}
+      Yoffset: 0.2
+    - FeatureTexture: {fileID: 2800000, guid: 068b08ab1f96ae448a9cb2cfa1140fe4, type: 3}
+      Height: {x: 12, y: 18}
+      Width: {x: 12, y: 18}
+      Yoffset: 0.2
+    - FeatureTexture: {fileID: 2800000, guid: 17a742decc8fba5488cac793d64a0d79, type: 3}
+      Height: {x: 12, y: 18}
+      Width: {x: 12, y: 18}
+      Yoffset: 0
+    TerrainDetailTextures:
+    - {fileID: 2800000, guid: 1909481ecdfd7f542b4096715c9025b3, type: 3}
+    - {fileID: 2800000, guid: 1909481ecdfd7f542b4096715c9025b3, type: 3}
+    - {fileID: 2800000, guid: 851c4f977709cfa44a64fd06b1038103, type: 3}
+    - {fileID: 2800000, guid: 851c4f977709cfa44a64fd06b1038103, type: 3}
+    - {fileID: 2800000, guid: 8bff715a8a149694480bd68936d4aa04, type: 3}
+    - {fileID: 2800000, guid: bb168c5650579a345a47c12d5c480e51, type: 3}
+    - {fileID: 2800000, guid: 3bfaad54de1b5954f9e758ac9ef53f00, type: 3}
+    - {fileID: 2800000, guid: 130bece99fb2ba84d9804578461589df, type: 3}
+    - {fileID: 2800000, guid: 851c4f977709cfa44a64fd06b1038103, type: 3}
+    - {fileID: 2800000, guid: 130bece99fb2ba84d9804578461589df, type: 3}
+    - {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
+    - {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: bb168c5650579a345a47c12d5c480e51, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    TerrainDetailNormalMaps:
+    - {fileID: 2800000, guid: c1cac4bf4a8504e4dbab23fea896ccf7, type: 3}
+    - {fileID: 2800000, guid: c1cac4bf4a8504e4dbab23fea896ccf7, type: 3}
+    - {fileID: 2800000, guid: 0ae31176c715c464abb0ea7675df97e8, type: 3}
+    - {fileID: 2800000, guid: 0ae31176c715c464abb0ea7675df97e8, type: 3}
+    - {fileID: 2800000, guid: 5e223f127eae549488b3e58cc69f4f83, type: 3}
+    - {fileID: 2800000, guid: e6664d1bf8de5d14299e91c793d8a2bb, type: 3}
+    - {fileID: 2800000, guid: 2d233f04ec3c67740864d61b706787d6, type: 3}
+    - {fileID: 2800000, guid: 5b39f670d9d0cd740b59635e47de49af, type: 3}
+    - {fileID: 2800000, guid: 0ae31176c715c464abb0ea7675df97e8, type: 3}
+    - {fileID: 2800000, guid: 5b39f670d9d0cd740b59635e47de49af, type: 3}
+    - {fileID: 2800000, guid: 5b39f670d9d0cd740b59635e47de49af, type: 3}
+    - {fileID: 2800000, guid: 5b39f670d9d0cd740b59635e47de49af, type: 3}
+    - {fileID: 2800000, guid: 5b39f670d9d0cd740b59635e47de49af, type: 3}
+    - {fileID: 2800000, guid: e6664d1bf8de5d14299e91c793d8a2bb, type: 3}
+    - {fileID: 2800000, guid: 5b39f670d9d0cd740b59635e47de49af, type: 3}
+    - {fileID: 2800000, guid: 5b39f670d9d0cd740b59635e47de49af, type: 3}
+    - {fileID: 2800000, guid: 5b39f670d9d0cd740b59635e47de49af, type: 3}
+    - {fileID: 2800000, guid: 5b39f670d9d0cd740b59635e47de49af, type: 3}
+    - {fileID: 2800000, guid: 5b39f670d9d0cd740b59635e47de49af, type: 3}
+    TerrainDetailHeightMaps:
+    - {fileID: 2800000, guid: 1909481ecdfd7f542b4096715c9025b3, type: 3}
+    - {fileID: 2800000, guid: 1909481ecdfd7f542b4096715c9025b3, type: 3}
+    - {fileID: 2800000, guid: 545c61b7df5822549ba10d00bfbe4e5f, type: 3}
+    - {fileID: 2800000, guid: 545c61b7df5822549ba10d00bfbe4e5f, type: 3}
+    - {fileID: 2800000, guid: 08cc021935d64cc4f959851e7896b8e8, type: 3}
+    - {fileID: 2800000, guid: 122bf5322f2f94d439fab9ef91cb8c55, type: 3}
+    - {fileID: 2800000, guid: f4823cc1fa90dbb4995aed1a869e1d42, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: 545c61b7df5822549ba10d00bfbe4e5f, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: 122bf5322f2f94d439fab9ef91cb8c55, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    - {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
+    TerrainDetailRoughnessMaps:
+    - {fileID: 2800000, guid: a488394948220814d8ae734d917ca1a5, type: 3}
+    - {fileID: 2800000, guid: a488394948220814d8ae734d917ca1a5, type: 3}
+    - {fileID: 2800000, guid: d0a94f68019aeeb499bf1f9a6561f005, type: 3}
+    - {fileID: 2800000, guid: d0a94f68019aeeb499bf1f9a6561f005, type: 3}
+    - {fileID: 2800000, guid: 03584081e109b8d40ba724a6cbe9ec0f, type: 3}
+    - {fileID: 2800000, guid: eb705cd5845bfa242a947eac41de368a, type: 3}
+    - {fileID: 2800000, guid: 8f76d7bea65e195448f1e97ebe00cf4a, type: 3}
+    - {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
+    - {fileID: 2800000, guid: d0a94f68019aeeb499bf1f9a6561f005, type: 3}
+    - {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
+    - {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
+    - {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
+    - {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
+    - {fileID: 2800000, guid: eb705cd5845bfa242a947eac41de368a, type: 3}
+    - {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
+    - {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
+    - {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
+    - {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
+    - {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
+    PerlinNoise: {fileID: 2800000, guid: 7e19882b01255364e9c1cfbd084e8cd6, type: 3}
+    DefaultSplatMap: {fileID: 2800000, guid: 4ae789d2ed9128d4fb4f00384e672ce9, type: 3}
+    PlacementMap: {fileID: 2800000, guid: 0b35cd2ec975cae4297a5700bb887c3c, type: 3}
+    wind: 0.02
+    SortByDistance: 1
+    GrassDensity: 0.1
+    TreeDensity: 300
+    TreeTestMesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 3}
+    TreeTestMaterial: {fileID: 0}
+    GrassDrawDistance: 300
+    TreeDrawDistance: 2000
+    GrassShadows: 0
+    TreeShadows: 0
+    ComputeTerrainShader: {fileID: 7200000, guid: 513988170bf57ee4487af2231d625bad,
+      type: 3}
+    GrassShader: {fileID: 4800000, guid: cd675d8109e34104fa2267afa707fa09, type: 3}
+    TreeShader: {fileID: 4800000, guid: 124091d5347c85c408f244879bf65e3f, type: 3}
+    DetailTextureShader: {fileID: 4800000, guid: c4bebb8f9f2f76d458bf035be8998c0c,
+      type: 3}
+  PointCloud: 0
+  TreeMesh: 0
+  _outputTex: {fileID: 0}
+  _whiteTex: {fileID: 0}
+--- !u!114 &534669910
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 534669902}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 948f4100a11a5c24981795d21301da5c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  volumeTrigger: {fileID: 534669905}
+  volumeLayer:
+    serializedVersion: 2
+    m_Bits: 256
+  stopNaNPropagation: 1
+  finalBlitToCameraTarget: 0
+  antialiasingMode: 0
+  temporalAntialiasing:
+    jitterSpread: 0.75
+    sharpness: 0.25
+    stationaryBlending: 0.95
+    motionBlending: 0.85
+  subpixelMorphologicalAntialiasing:
+    quality: 2
+  fastApproximateAntialiasing:
+    fastMode: 0
+    keepAlpha: 0
+  fog:
+    enabled: 0
+    excludeSkybox: 0
+  debugLayer:
+    lightMeter:
+      width: 512
+      height: 256
+      showCurves: 1
+    histogram:
+      width: 512
+      height: 256
+      channel: 3
+    waveform:
+      exposure: 0.12
+      height: 256
+    vectorscope:
+      size: 256
+      exposure: 0.12
+    overlaySettings:
+      linearDepth: 0
+      motionColorIntensity: 4
+      motionGridSize: 64
+      colorBlindnessType: 0
+      colorBlindnessStrength: 1
+  m_Resources: {fileID: 11400000, guid: d82512f9c8e5d4a4d938b575d47f88d4, type: 2}
+  m_ShowToolkit: 0
+  m_ShowCustomSorter: 0
+  breakBeforeColorGrading: 0
+  m_BeforeTransparentBundles: []
+  m_BeforeStackBundles: []
+  m_AfterStackBundles:
+  - assemblyQualifiedName: FogEffect, Assembly-CSharp, Version=2.12.69.1, Culture=neutral,
+      PublicKeyToken=null
+  - assemblyQualifiedName: RainEffect, Assembly-CSharp, Version=2.12.69.1, Culture=neutral,
+      PublicKeyToken=null
+--- !u!1 &668180458
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 668180459}
+  - component: {fileID: 668180462}
+  - component: {fileID: 668180461}
+  - component: {fileID: 668180460}
+  m_Layer: 5
+  m_Name: Internal
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &668180459
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 668180458}
+  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: 1942460222}
+  m_RootOrder: 2
+  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.5, y: 0.5}
+--- !u!114 &668180460
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 668180458}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_HorizontalFit: 2
+  m_VerticalFit: 2
+--- !u!114 &668180461
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 668180458}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: New Text
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 16
+  m_fontSizeBase: 16
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 5, y: 5, z: 5, w: 5}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!222 &668180462
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 668180458}
+  m_CullTransparentMesh: 1
+--- !u!1 &715090241
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 715090245}
+  - component: {fileID: 715090244}
+  - component: {fileID: 715090243}
+  - component: {fileID: 715090242}
+  m_Layer: 5
+  m_Name: GUI
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &715090242
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 715090241}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreReversedGraphics: 1
+  m_BlockingObjects: 0
+  m_BlockingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+--- !u!114 &715090243
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 715090241}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_UiScaleMode: 0
+  m_ReferencePixelsPerUnit: 100
+  m_ScaleFactor: 1
+  m_ReferenceResolution: {x: 800, y: 600}
+  m_ScreenMatchMode: 0
+  m_MatchWidthOrHeight: 0
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+  m_PresetInfoIsWorld: 0
+--- !u!223 &715090244
+Canvas:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 715090241}
+  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_AdditionalShaderChannelsFlag: 25
+  m_SortingLayerID: 0
+  m_SortingOrder: 0
+  m_TargetDisplay: 0
+--- !u!224 &715090245
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 715090241}
+  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: 1942460222}
+  - {fileID: 1616384245}
+  m_Father: {fileID: 1012504024}
+  m_RootOrder: 1
+  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 &886433658
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 886433660}
+  - component: {fileID: 886433659}
+  m_Layer: 8
+  m_Name: PostProccesing
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &886433659
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 886433658}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8b9a305e18de0c04dbd257a21cd47087, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sharedProfile: {fileID: 11400000, guid: 250d81bdeb789f74788ec1d006e88e45, type: 2}
+  isGlobal: 1
+  blendDistance: 0
+  weight: 1
+  priority: 0
+--- !u!4 &886433660
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 886433658}
+  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: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1012504019
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1012504024}
+  - component: {fileID: 1012504023}
+  - component: {fileID: 1012504022}
+  - component: {fileID: 1012504021}
+  - component: {fileID: 1012504020}
+  m_Layer: 0
+  m_Name: Benchmark
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1012504020
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1012504019}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 6c471d9a4b43bbf4b8184739f47ab818, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  MinDistance: 100
+  MaxDistance: 200
+  MaxViewAngle: 30
+  EnabledFlak: 0
+  maxParticalCount: 200
+  SpawnCount: 20
+  SpawnInterval: 0.1
+  ParticalPrefab: {fileID: 5487844413025695174, guid: bcc3686037e169a4991ff3ed36d32ec0,
+    type: 3}
+--- !u!114 &1012504021
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1012504019}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: dafe92f68072c7448b24ec1aaaa8a6da, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  StatsText: {fileID: 450521133}
+  TimeText: {fileID: 1492352015}
+  CameraControl: {fileID: 534669906}
+  UpdateRate: 0.5
+  TestTime: 60
+  MemoryProfiler: {fileID: 1012504023}
+  InternalProfiler: {fileID: 1012504022}
+  SceneManager: {fileID: 534669907}
+  FoliageModule: {fileID: 479045189}
+  TerrainModule: {fileID: 534669909}
+  ParticalModule: {fileID: 1012504020}
+  Volume: {fileID: 886433659}
+--- !u!114 &1012504022
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1012504019}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 51b20aee9631094418cf55a25a49cab3, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  TMpro: {fileID: 668180461}
+--- !u!114 &1012504023
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1012504019}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fce30e23e0b8c2b4ebb596b5ecb36e23, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  TMpro: {fileID: 325619156}
+--- !u!4 &1012504024
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1012504019}
+  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: 414794562}
+  - {fileID: 715090245}
+  m_Father: {fileID: 0}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1492352014
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1492352017}
+  - component: {fileID: 1492352016}
+  - component: {fileID: 1492352015}
+  m_Layer: 5
+  m_Name: Time
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1492352015
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1492352014}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: New Text
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 16
+  m_fontSizeBase: 16
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 2, y: 2, z: 2, w: 2}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!222 &1492352016
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1492352014}
+  m_CullTransparentMesh: 1
+--- !u!224 &1492352017
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1492352014}
+  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: 1616384245}
+  m_RootOrder: 0
+  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: 1}
+--- !u!1 &1616384244
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1616384245}
+  - component: {fileID: 1616384248}
+  - component: {fileID: 1616384247}
+  - component: {fileID: 1616384246}
+  m_Layer: 5
+  m_Name: Panel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1616384245
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1616384244}
+  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: 1492352017}
+  m_Father: {fileID: 715090245}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 150, y: 30}
+  m_Pivot: {x: 0, y: 1}
+--- !u!114 &1616384246
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1616384244}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 0
+    m_Right: 0
+    m_Top: 0
+    m_Bottom: 0
+  m_ChildAlignment: 0
+  m_Spacing: 0
+  m_ChildForceExpandWidth: 1
+  m_ChildForceExpandHeight: 1
+  m_ChildControlWidth: 1
+  m_ChildControlHeight: 1
+  m_ChildScaleWidth: 0
+  m_ChildScaleHeight: 0
+  m_ReverseArrangement: 0
+--- !u!114 &1616384247
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1616384244}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.5294118, g: 0.5294118, b: 0.5294118, a: 0.6862745}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1616384248
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1616384244}
+  m_CullTransparentMesh: 1
+--- !u!1 &1942460221
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1942460222}
+  - component: {fileID: 1942460224}
+  - component: {fileID: 1942460223}
+  - component: {fileID: 1942460226}
+  - component: {fileID: 1942460225}
+  m_Layer: 5
+  m_Name: Panel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1942460222
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1942460221}
+  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: 450521132}
+  - {fileID: 325619154}
+  - {fileID: 668180459}
+  m_Father: {fileID: 715090245}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 1, y: 1}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 1, y: 1}
+--- !u!114 &1942460223
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1942460221}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.5283019, g: 0.5283019, b: 0.5283019, a: 0.6862745}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1942460224
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1942460221}
+  m_CullTransparentMesh: 1
+--- !u!114 &1942460225
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1942460221}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_HorizontalFit: 2
+  m_VerticalFit: 2
+--- !u!114 &1942460226
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1942460221}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 0
+    m_Right: 0
+    m_Top: 0
+    m_Bottom: 0
+  m_ChildAlignment: 0
+  m_Spacing: 0
+  m_ChildForceExpandWidth: 1
+  m_ChildForceExpandHeight: 1
+  m_ChildControlWidth: 0
+  m_ChildControlHeight: 0
+  m_ChildScaleWidth: 0
+  m_ChildScaleHeight: 0
+  m_ReverseArrangement: 0
diff --git a/projects/com.saab.map-streamer/Assets/Scenes/ExampleScene.unity.meta b/Assets/Scenes/StreamingMaps.unity.meta
similarity index 74%
rename from projects/com.saab.map-streamer/Assets/Scenes/ExampleScene.unity.meta
rename to Assets/Scenes/StreamingMaps.unity.meta
index 952bd1e9..9531828b 100644
--- a/projects/com.saab.map-streamer/Assets/Scenes/ExampleScene.unity.meta
+++ b/Assets/Scenes/StreamingMaps.unity.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 9fc0d4010bbf28b4594072e72b8655ab
+guid: 99c9720ab356a0642a771bea13969a05
 DefaultImporter:
   externalObjects: {}
   userData: 
diff --git a/Assets/Scripts.meta b/Assets/Scripts.meta
new file mode 100644
index 00000000..41194e75
--- /dev/null
+++ b/Assets/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4a08e5c35be392e45bf189584037e45e
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Benchmark.cs b/Assets/Scripts/Benchmark.cs
new file mode 100644
index 00000000..d3bdf751
--- /dev/null
+++ b/Assets/Scripts/Benchmark.cs
@@ -0,0 +1,276 @@
+﻿using Saab.Foundation.Unity.MapStreamer;
+using Saab.Foundation.Unity.MapStreamer.Modules;
+using System.Linq;
+using TMPro;
+using UnityEngine;
+using System;
+using System.IO;
+using Time = UnityEngine.Time;
+using System.Text.RegularExpressions;
+using GizmoSDK.GizmoBase;
+using UnityEngine.Rendering.PostProcessing;
+
+public class Benchmark : MonoBehaviour
+{
+    public TMP_Text StatsText;
+    public TMP_Text TimeText;
+    public CameraControl CameraControl;
+    public float UpdateRate = 1f;
+    public float TestTime = 10f;
+
+    public MemoryProfiler MemoryProfiler;
+    public InternalProfiler InternalProfiler;
+
+    public SceneManager SceneManager;
+    public FoliageModule FoliageModule;
+    public TerrainModule TerrainModule;
+    public ParticalModule ParticalModule;
+    public PostProcessVolume Volume;
+
+    private float _currentTime = 0f;
+    private float _currentRate = 0f;
+    private int _runId = 0;
+    private Transform _parent;
+
+    private bool _running;
+    private int _autoSpeedMultipler;
+    private string _SystemStats;
+    private string _startDate;
+    private string _title = "None";
+    private string _gfxCaps;
+    private RainEffect _rainEffect;
+    private FogEffect _fogEffect;
+    private ColorGrading _colorGrading;
+
+    private void Start()
+    {
+        var name = SystemInfo.deviceName;
+        var cpu = SystemInfo.processorType;
+        var hz = SystemInfo.processorFrequency;
+        var ram = SystemInfo.systemMemorySize;
+        var gpu = SystemInfo.graphicsDeviceName;
+        var vram = SystemInfo.graphicsMemorySize;
+        var res = Screen.currentResolution;
+        _SystemStats = $"Device: {name}\nCPU: {cpu}\nFrequency: {hz:F2} hz\nRAM: {ram / 1024f:F2} GB\nGPU: {gpu}\nVRAM: {vram / 1024f:F2} GB\nResolution {Screen.width}x{Screen.height} {res.refreshRate} hz";
+
+#if UNITY_ANDROID
+        // get defult settings (not reading config) 
+        _gfxCaps = "";
+#else
+        string config = File.ReadAllText(Application.dataPath + "/../config.xml");
+        GetSettings(config, out var result);
+        _gfxCaps = result;
+#endif
+
+        _parent = StatsText.GetComponentsInParent<Canvas>().FirstOrDefault().transform;
+        _parent.gameObject.SetActive(false);
+
+        Volume.profile.TryGetSettings<FogEffect>(out _fogEffect);
+        Volume.profile.TryGetSettings<RainEffect>(out _rainEffect);
+        Volume.profile.TryGetSettings<ColorGrading>(out _colorGrading);
+    }
+
+    private bool GetSettings(string input, out string output)
+    {
+        string pattern = "(<GfxCaps>[\\s\\S]*?<\\/GfxCaps>)";
+        output = "";
+        Match match = Regex.Match(input, pattern);
+
+        if (match.Success)
+        {
+            output = match.Groups[1].Value;
+            return true;
+        }
+        return false;
+    }
+
+    private void Update()
+    {
+        if (_currentTime > TestTime && _running)
+        {
+            StopBenchmark();
+            if (RunThroughGFXCaps(_runId++))
+            {
+                StartBenchmark();
+            }
+            else
+                _runId = 0;
+        }           
+        else if(_running)
+        {
+            _currentTime += Time.deltaTime;
+            TimeText.text = $"{_currentTime:F2} / {TestTime} sec";
+        }
+            
+
+        if (Input.GetKeyDown(KeyCode.F1))
+            _autoSpeedMultipler = 1;
+        if (Input.GetKeyDown(KeyCode.F2))
+            _autoSpeedMultipler = 2;
+        if (Input.GetKeyDown(KeyCode.F3))
+            _autoSpeedMultipler = 4;
+        if (Input.GetKeyDown(KeyCode.F4))
+            _autoSpeedMultipler = 8;
+
+        if ((Input.GetKey(KeyCode.LeftAlt) && Input.GetKeyDown(KeyCode.R)) || (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved))
+        {
+            if (_running)
+                StopBenchmark();
+            else
+            {
+                TerrainModule.EnableTrees = false;
+                TerrainModule.EnableGrass = false;
+                FoliageModule.Disabled = true;
+
+                DateTime dt = DateTime.Now;
+
+                _startDate = dt.ToString("yy-MM-dd-hh-mm");
+                SaveFile("Result", "******************** Computer hardware ********************\n" + _SystemStats 
+                    + "\n\n******************** GFX Settings ********************\n" + _gfxCaps + "\n\n******************** Map ********************\nMap Url:" + SceneManager.MapUrl);
+
+                StartBenchmark();
+            }             
+        }
+
+
+        if (_running)
+        {
+            RunBenchmark();
+            UpdateFps();
+        }
+
+        if (Input.GetKeyDown(KeyCode.Escape))
+            Application.Quit();
+
+    }
+
+    private void OnDestroy()
+    {
+        StopBenchmark();
+    }
+    private void StopBenchmark()
+    {
+        if (_running)
+        {
+            MemoryProfiler.StopBenchmark();
+            InternalProfiler.StopBenchmark();
+
+            SaveFile("Result", $"\n\n ******************** {_title} ********************\n" 
+                + InternalProfiler.GetExcel() + "\n" + MemoryProfiler.GetExcel() + "\n");
+        }
+
+        QualitySettings.vSyncCount = 1;
+        Application.targetFrameRate = -1;
+
+        _running = false;
+        _parent.gameObject.SetActive(false);
+        CameraControl.UpdateMoveCamera(0, 0, 0, 0, 0, false);
+    }
+    private void StartBenchmark()
+    {
+        MemoryProfiler.StartBenchmark();
+        InternalProfiler.StartBenchmark();
+
+        QualitySettings.vSyncCount = 0;
+        Application.targetFrameRate = 2000;
+
+        // clean up
+        _currentTime = 0f;
+
+        _running = true;
+        _autoSpeedMultipler = 1;
+        _parent.gameObject.SetActive(true);
+
+        var north = CameraControl.North;
+        var rot = CameraControl.Camera.transform.rotation;
+        rot.SetLookRotation(north);
+        CameraControl.Camera.transform.rotation = rot;
+
+        CameraControl.X = 0;
+        CameraControl.Y = 70;
+        CameraControl.Z = 0;
+        _currentRate = 0;
+    }
+    private void SaveFile(string name, string result)
+    {
+#if UNITY_ANDROID
+        Debug.Log(result);
+#else
+        var path = Application.dataPath + "/../Results/";
+        if (!Directory.Exists(path))
+        {
+            Directory.CreateDirectory(path);
+        }
+   
+        StreamWriter writer = new StreamWriter(path+$"{name}_{_startDate}.txt", true);
+        writer.WriteLine(result);
+        writer.Close();
+#endif
+    }
+    private void RunBenchmark()
+    {
+        CameraControl.UpdateMoveCamera(200 * _autoSpeedMultipler, 0, 0, 25, 0);
+    }
+    private void UpdateFps()
+    {
+        if(_currentRate > UpdateRate)
+        {
+            UpdateStats();
+            _currentRate = 0;
+        }
+        _currentRate += Time.deltaTime;
+    }
+    private void UpdateStats()
+    {
+       StatsText.text = _SystemStats;
+        string result = "";
+        if (MemoryProfiler.ToString(out result))
+            MemoryProfiler.Text.text = result;
+        if (InternalProfiler.ToString(out result))
+            InternalProfiler.Text.text = result;
+    }
+    private bool RunThroughGFXCaps(int RunId)
+    {
+        switch(RunId)
+        {
+            case 0:
+                _title = "TerrainModule Tree";
+                TerrainModule.EnableTrees = true;
+                break;
+            case 1:
+                _title = "TerrainModule Grass";
+                TerrainModule.EnableTrees = false;
+                TerrainModule.EnableGrass = true;
+                break;
+            case 2:
+                _title = "FoliageModule Tree";
+                TerrainModule.EnableGrass = false;
+                FoliageModule.Disabled = false;
+                break;
+            case 3:
+                _title = "ParticalModule";
+                TerrainModule.EnableTrees = false;
+                TerrainModule.EnableGrass = false;
+                FoliageModule.Disabled = true;
+                ParticalModule.EnabledFlak = true;
+                break;
+            case 4:
+                _title = "PostProcessing";
+                _fogEffect.active = true;
+                _rainEffect.active = true;
+                _colorGrading.active = true;
+                ParticalModule.EnabledFlak = false;
+                TerrainModule.EnableTrees = false;
+                TerrainModule.EnableGrass = false;
+                FoliageModule.Disabled = true;   
+                break;
+            case 5:
+                _title = "None";
+                _fogEffect.active = false;
+                _rainEffect.active = false;
+                _colorGrading.active = false;
+                return false;
+        }
+        return true;
+    }
+}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/MapShadingModule.cs.meta b/Assets/Scripts/Benchmark.cs.meta
similarity index 83%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/MapShadingModule.cs.meta
rename to Assets/Scripts/Benchmark.cs.meta
index 2e6a073b..930fa209 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/MapShadingModule.cs.meta
+++ b/Assets/Scripts/Benchmark.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 0848deeba0da44043a72f971b1879eb9
+guid: dafe92f68072c7448b24ec1aaaa8a6da
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Assets/Scripts/IProfiler.cs b/Assets/Scripts/IProfiler.cs
new file mode 100644
index 00000000..1cd47d73
--- /dev/null
+++ b/Assets/Scripts/IProfiler.cs
@@ -0,0 +1,11 @@
+using TMPro;
+
+public interface IProfiler
+{
+    public TMP_Text Text { get; }
+    public bool IsRunning { get; set; }
+    public void StartBenchmark();
+    public void StopBenchmark();
+    public bool ToString(out string data);
+    public string GetExcel();
+}
diff --git a/Assets/Scripts/IProfiler.cs.meta b/Assets/Scripts/IProfiler.cs.meta
new file mode 100644
index 00000000..870c0b98
--- /dev/null
+++ b/Assets/Scripts/IProfiler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6140c8483cd27a84b8e9e056fa960844
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InternalProfiler.cs b/Assets/Scripts/InternalProfiler.cs
new file mode 100644
index 00000000..913d19b8
--- /dev/null
+++ b/Assets/Scripts/InternalProfiler.cs
@@ -0,0 +1,120 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using TMPro;
+using Unity.Profiling;
+using UnityEngine;
+
+public class InternalProfiler : MonoBehaviour, IProfiler
+{
+    public TMP_Text TMpro;
+    private ProfilerRecorder _mainThreadTimeRecorder;
+    private ProfilerRecorder _gpuTimeRecorder;
+    private ProfilerRecorder _behaviourUpdateRecorder;
+    private ProfilerRecorder _gcCollectRecorder;
+
+    public bool IsRunning { get; set; }
+    public TMP_Text Text => TMpro;
+
+    private string _update, _max, _min, _render, _behaviour, _gc;
+
+    double GetRecorderFrameAverage(ProfilerRecorder recorder, out double max, out double min)
+    {
+        max = 0;
+        min = double.MaxValue;
+
+        var samplesCount = recorder.Capacity;
+        if (samplesCount == 0)
+            return 0;
+
+        double r = 0;
+        unsafe
+        {
+            var samples = stackalloc ProfilerRecorderSample[samplesCount];
+            recorder.CopyTo(samples, samplesCount);
+            for (var i = 0; i < samplesCount; ++i)
+            {
+                var sample = samples[i].Value;
+                max = Math.Max(max, sample);
+                min = Math.Min(min, sample);
+                r += sample;
+            }
+            r /= samplesCount;
+        }
+
+        return r;
+    }
+    public bool ToString(out string data)
+    {
+        var fps = GetRecorderFrameAverage(_mainThreadTimeRecorder, out var max, out var min);
+        var render = GetRecorderFrameAverage(_gpuTimeRecorder, out var renderMax, out var renderMin);
+        var behaviour = GetRecorderFrameAverage(_behaviourUpdateRecorder, out var behaviourMax, out var behaviourMin);
+        var gc = GetRecorderFrameAverage(_gcCollectRecorder, out var gcMax, out var gcMin);
+
+        var fpsText = $"Update: {fps * 1e-6f:F2} ms\nWorst: {max * 1e-6f:F2} ms\nBest: {min * 1e-6f:F2} ms\n";
+#if UNITY_EDITOR || DEVELOPMENT_BUILD
+        var renderText = $"render: {render * 1e-6f:F2} ms\n";
+        var behaviourText = $"Behaviour: {behaviour * 1e-6f:F2} ms ({(behaviour / fps) * 100:F1} %)\n";
+#else
+        var renderText = "";
+        var behaviourText = "";
+#endif
+
+        _update += $"{fps * 1e-6f:F2}\t";
+        _max += $"{max * 1e-6f:F2}\t";
+        _min += $"{min * 1e-6f:F2}\t";
+        _render += $"{renderMax * 1e-6f:F2}\t";
+        _behaviour += $"{behaviourMax * 1e-6f:F2}\t";
+        _gc += $"{gcMax * 1e-6f:F2}\t";
+
+        data = $"<b>Update:</b>\n{fpsText}{renderText}{behaviourText}";
+        return true;
+    }
+    public void StartBenchmark()
+    {
+        if (IsRunning)
+        {
+            Debug.LogWarning("FrameStats is already running");
+            return;
+        }
+        IsRunning = true;
+
+        _update = _max = _min = _render = _behaviour = _gc = "";
+
+        _mainThreadTimeRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Internal, "Main Thread", 50);
+        _gpuTimeRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Internal, "Gfx.WaitForPresentOnGfxThread", 50);
+        _behaviourUpdateRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Internal, "BehaviourUpdate", 50);
+        _gcCollectRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Internal, "GC.Collect", 50);
+    }
+    public void StopBenchmark()
+    {
+        if (!IsRunning)
+        {
+            Debug.LogWarning("FrameStats is not running");
+            return;
+        }
+        IsRunning = false;
+
+        _mainThreadTimeRecorder.Dispose();
+        _gpuTimeRecorder.Dispose();
+        _behaviourUpdateRecorder.Dispose();
+        _gcCollectRecorder.Dispose();
+    }
+
+    // Start is called before the first frame update
+    void Start()
+    {
+        IsRunning = false;
+    }
+
+    private void OnDestroy()
+    {
+        StopBenchmark();
+    }
+
+    public string GetExcel()
+    {
+        string excel = $"Update avg:\t{_update}\nUpdate Worst:\t{_max}\nGFX_wait Worst:\t{_render}\nBehaviour Worst:\t{_behaviour}\nGC Collect Worst:\t{_gc}\n";
+        return excel;
+    }
+}
diff --git a/Assets/Scripts/InternalProfiler.cs.meta b/Assets/Scripts/InternalProfiler.cs.meta
new file mode 100644
index 00000000..44e989b6
--- /dev/null
+++ b/Assets/Scripts/InternalProfiler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 51b20aee9631094418cf55a25a49cab3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/MemoryProfiler.cs b/Assets/Scripts/MemoryProfiler.cs
new file mode 100644
index 00000000..35e0bbc7
--- /dev/null
+++ b/Assets/Scripts/MemoryProfiler.cs
@@ -0,0 +1,121 @@
+using System.Collections;
+using System.Collections.Generic;
+using TMPro;
+using Unity.Profiling;
+using UnityEngine;
+
+public class MemoryProfiler : MonoBehaviour, IProfiler
+{
+    public TMP_Text TMpro;
+    private ProfilerRecorder _systemMemoryRecorder;
+    private ProfilerRecorder _totalMemoryRecorder;
+    private ProfilerRecorder _totalMemoryRecorderReserved;
+    private ProfilerRecorder _GpuMemoryRecorder;
+    private ProfilerRecorder _GpuMemoryRecorderReserved;
+    private ProfilerRecorder _gcMemoryRecorder;
+    private ProfilerRecorder _gcMemoryRecorderReserved;
+
+    private string _system, _mem, _memReserved, _memgpu, _memgpuReserved, _gc, _gcReserved;
+
+    private void Start()
+    {
+        IsRunning = false;
+    }
+    private void OnDestroy()
+    {
+        StopBenchmark();
+    }
+
+    public bool IsRunning
+    {
+        get; set;
+    }
+
+    public TMP_Text Text => TMpro;
+
+    public void StartBenchmark()
+    {
+        if (IsRunning)
+        {
+            Debug.LogWarning("MemoryBencmark is already running");
+            return;
+        }
+
+        IsRunning = true;
+
+        _system = _mem = _memReserved = _memgpu = _memgpuReserved = _gc = _gcReserved = "";
+
+        _systemMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "System Used Memory");
+
+        _totalMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Total Used Memory");
+        _totalMemoryRecorderReserved = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Total Reserved Memory");
+
+        _GpuMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Gfx Used Memory");
+        _GpuMemoryRecorderReserved = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Gfx Reserved Memory");
+
+        _gcMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "GC Used Memory");
+        _gcMemoryRecorderReserved = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "GC Reserved Memory");
+    }
+    public void StopBenchmark()
+    {
+        if (!IsRunning)
+        {
+            Debug.LogWarning("MemoryBencmark is not running");
+            return;
+        }
+        IsRunning = false;
+
+        _systemMemoryRecorder.Dispose();
+
+        _totalMemoryRecorder.Dispose();
+        _totalMemoryRecorderReserved.Dispose();
+
+        _GpuMemoryRecorder.Dispose();
+        _GpuMemoryRecorderReserved.Dispose();
+
+        _gcMemoryRecorder.Dispose();
+        _gcMemoryRecorderReserved.Dispose();
+    }
+
+    private double ByteToMB(double bytes)
+    {
+        return bytes / (1024.0 * 1024.0);
+    }
+    public bool ToString(out string data)
+    {
+        data = "";
+        if (!IsRunning)
+            return false;
+
+        var system = $"System: {ByteToMB(_systemMemoryRecorder.LastValue):F0} MB\n";
+        var totalmem = $"Ram: {ByteToMB(_totalMemoryRecorder.LastValue):F0} / {ByteToMB(_totalMemoryRecorderReserved.LastValue):F0} MB\n";
+#if UNITY_EDITOR || DEVELOPMENT_BUILD
+        var vram = $"Vram: {ByteToMB(_GpuMemoryRecorder.LastValue):F0} / {ByteToMB(_GpuMemoryRecorderReserved.LastValue):F0} MB\n";
+#else
+        var vram = "";
+#endif
+        var gc = $"GC: {ByteToMB(_gcMemoryRecorder.LastValue):F1} / {ByteToMB(_gcMemoryRecorderReserved.LastValue):F1} MB\n";
+
+        data = $"<b>Memory:</b>\n{system}{totalmem}{vram}{gc}";
+
+
+        _system += $"{ByteToMB(_systemMemoryRecorder.LastValue):F0}\t";
+
+        _mem += $"{ByteToMB(_totalMemoryRecorder.LastValue):F0}\t";
+        _memReserved += $"{ByteToMB(_totalMemoryRecorderReserved.LastValue):F0}\t";
+
+        _memgpu += $"{ByteToMB(_GpuMemoryRecorder.LastValue):F0}\t";
+        _memgpuReserved += $"{ByteToMB(_GpuMemoryRecorderReserved.LastValue):F0}\t";
+
+        _gc += $"{ByteToMB(_gcMemoryRecorder.LastValue):F0}\t";
+        _gcReserved += $"{ByteToMB(_gcMemoryRecorderReserved.LastValue):F0}\t";
+
+        return true;
+    }
+
+    public string GetExcel()
+    {
+        string excel = $"System Memory:\t{_system}\nMemory:\t{_mem}\nMemory Reserved:\t{_memReserved}\nMemory GPU:\t{_memgpu}\nMemory GPU Reserved:\t{_memgpuReserved}\nGC:\t{_gc}\nGC Reserved:\t{_gcReserved}";
+        return excel;
+    }
+}
diff --git a/Assets/Scripts/MemoryProfiler.cs.meta b/Assets/Scripts/MemoryProfiler.cs.meta
new file mode 100644
index 00000000..111bb1ef
--- /dev/null
+++ b/Assets/Scripts/MemoryProfiler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: fce30e23e0b8c2b4ebb596b5ecb36e23
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/ParticalModule.cs b/Assets/Scripts/ParticalModule.cs
new file mode 100644
index 00000000..8041ea2b
--- /dev/null
+++ b/Assets/Scripts/ParticalModule.cs
@@ -0,0 +1,83 @@
+using Saab.Foundation.Unity.MapStreamer;
+using Saab.Foundation.Map;
+using GizmoSDK.GizmoBase;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Quaternion = UnityEngine.Quaternion;
+
+public class ParticalModule : MonoBehaviour
+{
+    public float MinDistance = 5.0f;
+    public float MaxDistance = 10.0f;
+    public float MaxViewAngle = 30.0f;
+
+    public bool EnabledFlak = false;
+    public int maxParticalCount = 200;
+    public int SpawnCount = 2;
+    public float SpawnInterval = 0.1f;
+    private float _interval = 0;
+
+    public GameObject ParticalPrefab;
+    private Camera _camera;
+
+    private Queue<Transform> ParticalPool = new Queue<Transform>();
+
+    private void Start()
+    {
+        _camera = Camera.main;
+        for (int i = 0; i < maxParticalCount; i++)
+        {
+            var obj = Instantiate(ParticalPrefab);
+            obj.SetActive(false);
+
+            var scale = obj.transform.localScale;
+            scale.z *= -1;
+            obj.transform.localScale = scale;
+
+            ParticalPool.Enqueue(obj.transform);
+        }
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        if (Input.GetKeyDown(KeyCode.R))
+        {
+            var partical = Instantiate(ParticalPrefab);
+            GenerateRandomPoint(partical.transform);
+        }
+
+        if(EnabledFlak)
+        {
+            if(_interval > SpawnInterval)
+            {
+                _interval = 0;
+                for (int i = 0; i < SpawnCount; i++)
+                {
+                    var partical = ParticalPool.Dequeue();
+                    partical.gameObject.SetActive(true);
+                    GenerateRandomPoint(partical);
+                    ParticalPool.Enqueue(partical);
+                }              
+            }
+            else
+            {
+                _interval += UnityEngine.Time.deltaTime;
+            }
+        }
+    }
+
+    private bool GenerateRandomPoint(Transform transform)
+    {
+        Vector3 randomDirection = Quaternion.Euler(Random.Range(-MaxViewAngle, MaxViewAngle), Random.Range(-MaxViewAngle, MaxViewAngle), 0) * _camera.transform.forward;
+        float randomDistance = Random.Range(MinDistance, MaxDistance);
+        Vector3 randomPosition = randomDirection * randomDistance;
+        var campos = _camera.GetComponent<ISceneManagerCamera>().GlobalPosition;
+
+        var mapPos = MapControl.SystemMap.GlobalToLocal(new Vec3D(campos.x + randomPosition.x, campos.y + randomPosition.y, campos.z - randomPosition.z));
+        if (!MapUtil.MapToUnity(transform, mapPos))
+            return false;
+        return true;
+    }
+}
diff --git a/Assets/Scripts/ParticalModule.cs.meta b/Assets/Scripts/ParticalModule.cs.meta
new file mode 100644
index 00000000..b0ad8a61
--- /dev/null
+++ b/Assets/Scripts/ParticalModule.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6c471d9a4b43bbf4b8184739f47ab818
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Shaders.meta b/Assets/Shaders.meta
similarity index 77%
rename from com.saab.map-streamer/Runtime/Shaders.meta
rename to Assets/Shaders.meta
index 998b9594..eb4bfaae 100644
--- a/com.saab.map-streamer/Runtime/Shaders.meta
+++ b/Assets/Shaders.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: f56b7b047126aec499bce58c96132b79
+guid: f929c889d23af254f9b059c2f522afc7
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/com.saab.map-streamer/Runtime/Assets.meta b/Assets/Shaders/Assets.meta
similarity index 77%
rename from com.saab.map-streamer/Runtime/Assets.meta
rename to Assets/Shaders/Assets.meta
index 1c289f52..66e4fbc6 100644
--- a/com.saab.map-streamer/Runtime/Assets.meta
+++ b/Assets/Shaders/Assets.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 5b134e9b9aeca874e9de299c75df363d
+guid: ac8cc43787977f242b30c3a57e682150
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/com.saab.map-streamer/Runtime/Assets/Grass/deadGrass01.asset b/Assets/Shaders/Assets/Gledista_Triacanthos1.asset
similarity index 70%
rename from com.saab.map-streamer/Runtime/Assets/Grass/deadGrass01.asset
rename to Assets/Shaders/Assets/Gledista_Triacanthos1.asset
index 70b8a74d..87b768f5 100644
--- a/com.saab.map-streamer/Runtime/Assets/Grass/deadGrass01.asset
+++ b/Assets/Shaders/Assets/Gledista_Triacanthos1.asset
@@ -10,17 +10,17 @@ MonoBehaviour:
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: 0fbe837a22ffe434381219dee0818311, type: 3}
-  m_Name: deadGrass01
+  m_Name: Gledista_Triacanthos1
   m_EditorClassIdentifier: 
-  MainTexture: {fileID: 2800000, guid: e81f20d35c8730d4f8cd6dad096ebfda, type: 3}
+  MainTexture: {fileID: 2800000, guid: 9a32a409abb74d3478077c7a3f79ac10, type: 3}
   AutumnTexture: {fileID: 0}
   WinterTexture: {fileID: 0}
   Normal: {fileID: 0}
   Mesh: {fileID: 0}
   MeshMaterial: {fileID: 0}
-  MaxMin: {x: 0.1, y: 0.4}
-  Offset: {x: 0, y: 0.02}
-  Weight: 0.2
-  Feature: 1
+  MaxMin: {x: 3, y: 15}
+  Offset: {x: -0.02, y: 0.01}
+  Weight: 0.1
+  Feature: 4
   Biome: 0
-  TextureMode: 0
+  TextureMode: 1
diff --git a/com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass01.asset.meta b/Assets/Shaders/Assets/Gledista_Triacanthos1.asset.meta
similarity index 79%
rename from com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass01.asset.meta
rename to Assets/Shaders/Assets/Gledista_Triacanthos1.asset.meta
index 18abb4ca..ec29b751 100644
--- a/com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass01.asset.meta
+++ b/Assets/Shaders/Assets/Gledista_Triacanthos1.asset.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 4c3604037580ad84b9abb147085e591a
+guid: 035a41288c360d64592400895b700bbe
 NativeFormatImporter:
   externalObjects: {}
   mainObjectFileID: 11400000
diff --git a/com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass03.asset b/Assets/Shaders/Assets/Gledista_Triacanthos2.asset
similarity index 70%
rename from com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass03.asset
rename to Assets/Shaders/Assets/Gledista_Triacanthos2.asset
index 97daa578..3579da05 100644
--- a/com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass03.asset
+++ b/Assets/Shaders/Assets/Gledista_Triacanthos2.asset
@@ -10,17 +10,17 @@ MonoBehaviour:
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: 0fbe837a22ffe434381219dee0818311, type: 3}
-  m_Name: MeadowGrass03
+  m_Name: Gledista_Triacanthos2
   m_EditorClassIdentifier: 
-  MainTexture: {fileID: 2800000, guid: e7857884386c60543ba2a332e003517a, type: 3}
+  MainTexture: {fileID: 2800000, guid: 1b262daef7b956348ad212485367cb65, type: 3}
   AutumnTexture: {fileID: 0}
   WinterTexture: {fileID: 0}
   Normal: {fileID: 0}
   Mesh: {fileID: 0}
   MeshMaterial: {fileID: 0}
-  MaxMin: {x: 0.2, y: 0.4}
-  Offset: {x: 0, y: 0.02}
-  Weight: 1
-  Feature: 16385
+  MaxMin: {x: 3, y: 15}
+  Offset: {x: -0.02, y: 0.01}
+  Weight: 0.1
+  Feature: 4
   Biome: 0
-  TextureMode: 0
+  TextureMode: 1
diff --git a/com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass02.asset.meta b/Assets/Shaders/Assets/Gledista_Triacanthos2.asset.meta
similarity index 79%
rename from com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass02.asset.meta
rename to Assets/Shaders/Assets/Gledista_Triacanthos2.asset.meta
index 46373227..52b320fb 100644
--- a/com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass02.asset.meta
+++ b/Assets/Shaders/Assets/Gledista_Triacanthos2.asset.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: d652826759d75c149908ecda4f58ad43
+guid: 207cec2ba880dfd4c986e803c745d549
 NativeFormatImporter:
   externalObjects: {}
   mainObjectFileID: 11400000
diff --git a/com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass02.asset b/Assets/Shaders/Assets/Gledista_Triacanthos3.asset
similarity index 70%
rename from com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass02.asset
rename to Assets/Shaders/Assets/Gledista_Triacanthos3.asset
index 98014c87..ec6bd10d 100644
--- a/com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass02.asset
+++ b/Assets/Shaders/Assets/Gledista_Triacanthos3.asset
@@ -10,17 +10,17 @@ MonoBehaviour:
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: 0fbe837a22ffe434381219dee0818311, type: 3}
-  m_Name: MeadowGrass02
+  m_Name: Gledista_Triacanthos3
   m_EditorClassIdentifier: 
-  MainTexture: {fileID: 2800000, guid: ea117e979ce44a44da900e5a7e728ae2, type: 3}
+  MainTexture: {fileID: 2800000, guid: c54e0a6922762b34c84057db648cd4c0, type: 3}
   AutumnTexture: {fileID: 0}
   WinterTexture: {fileID: 0}
   Normal: {fileID: 0}
   Mesh: {fileID: 0}
   MeshMaterial: {fileID: 0}
-  MaxMin: {x: 0.1, y: 0.4}
-  Offset: {x: 0, y: 0.01}
-  Weight: 1
-  Feature: 16385
+  MaxMin: {x: 3, y: 15}
+  Offset: {x: -0.008, y: 0.01}
+  Weight: 0.1
+  Feature: 4
   Biome: 0
-  TextureMode: 0
+  TextureMode: 1
diff --git a/com.saab.map-streamer/Runtime/Assets/FoliageSet/DemoGrassSet.asset.meta b/Assets/Shaders/Assets/Gledista_Triacanthos3.asset.meta
similarity index 79%
rename from com.saab.map-streamer/Runtime/Assets/FoliageSet/DemoGrassSet.asset.meta
rename to Assets/Shaders/Assets/Gledista_Triacanthos3.asset.meta
index cf0ed910..d6ae229f 100644
--- a/com.saab.map-streamer/Runtime/Assets/FoliageSet/DemoGrassSet.asset.meta
+++ b/Assets/Shaders/Assets/Gledista_Triacanthos3.asset.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: da5ccc4a63dfdc540afefcd1b3990158
+guid: e417fd68500df3142b9e84ac7bb37811
 NativeFormatImporter:
   externalObjects: {}
   mainObjectFileID: 11400000
diff --git a/Assets/Shaders/Assets/Gledista_Triacanthos4.asset b/Assets/Shaders/Assets/Gledista_Triacanthos4.asset
new file mode 100644
index 00000000..d9ef1669
--- /dev/null
+++ b/Assets/Shaders/Assets/Gledista_Triacanthos4.asset
@@ -0,0 +1,26 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0fbe837a22ffe434381219dee0818311, type: 3}
+  m_Name: Gledista_Triacanthos4
+  m_EditorClassIdentifier: 
+  MainTexture: {fileID: 2800000, guid: 1b922d2f93fc0d247ae71937dcc31a51, type: 3}
+  AutumnTexture: {fileID: 0}
+  WinterTexture: {fileID: 0}
+  Normal: {fileID: 0}
+  Mesh: {fileID: 0}
+  MeshMaterial: {fileID: 0}
+  MaxMin: {x: 15, y: 25}
+  Offset: {x: -0.008, y: 0.01}
+  Weight: 0.1
+  Feature: 4
+  Biome: 0
+  TextureMode: 1
diff --git a/Assets/Shaders/Assets/Gledista_Triacanthos4.asset.meta b/Assets/Shaders/Assets/Gledista_Triacanthos4.asset.meta
new file mode 100644
index 00000000..cab13eb6
--- /dev/null
+++ b/Assets/Shaders/Assets/Gledista_Triacanthos4.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 470e90fc7da503f40a2b566e6efccf0f
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass01.asset b/Assets/Shaders/Assets/Gledista_Triacanthos5.asset
similarity index 74%
rename from com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass01.asset
rename to Assets/Shaders/Assets/Gledista_Triacanthos5.asset
index db5cbcb2..546d509b 100644
--- a/com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass01.asset
+++ b/Assets/Shaders/Assets/Gledista_Triacanthos5.asset
@@ -10,17 +10,17 @@ MonoBehaviour:
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: 0fbe837a22ffe434381219dee0818311, type: 3}
-  m_Name: MeadowGrass01
+  m_Name: Gledista_Triacanthos5
   m_EditorClassIdentifier: 
-  MainTexture: {fileID: 2800000, guid: 53af13b5f08426645ac88632d0d76504, type: 3}
+  MainTexture: {fileID: 2800000, guid: bcb14e4b99425b84082dcf8c72e8e7fe, type: 3}
   AutumnTexture: {fileID: 0}
   WinterTexture: {fileID: 0}
   Normal: {fileID: 0}
   Mesh: {fileID: 0}
   MeshMaterial: {fileID: 0}
-  MaxMin: {x: 0.1, y: 0.3}
+  MaxMin: {x: 15, y: 25}
   Offset: {x: 0, y: 0.01}
-  Weight: 1
-  Feature: 1
+  Weight: 0.1
+  Feature: 4
   Biome: 0
-  TextureMode: 0
+  TextureMode: 1
diff --git a/Assets/Shaders/Assets/Gledista_Triacanthos5.asset.meta b/Assets/Shaders/Assets/Gledista_Triacanthos5.asset.meta
new file mode 100644
index 00000000..43fb3d5b
--- /dev/null
+++ b/Assets/Shaders/Assets/Gledista_Triacanthos5.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2033741e2b7ce3045b3db8c3dbb67763
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Assets/Gledista_Triacanthos6.asset b/Assets/Shaders/Assets/Gledista_Triacanthos6.asset
new file mode 100644
index 00000000..c51d1216
--- /dev/null
+++ b/Assets/Shaders/Assets/Gledista_Triacanthos6.asset
@@ -0,0 +1,26 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0fbe837a22ffe434381219dee0818311, type: 3}
+  m_Name: Gledista_Triacanthos6
+  m_EditorClassIdentifier: 
+  MainTexture: {fileID: 2800000, guid: ef705a65644562f4f813f1fe360a8946, type: 3}
+  AutumnTexture: {fileID: 0}
+  WinterTexture: {fileID: 0}
+  Normal: {fileID: 0}
+  Mesh: {fileID: 0}
+  MeshMaterial: {fileID: 0}
+  MaxMin: {x: 15, y: 25}
+  Offset: {x: -0.008, y: 0.01}
+  Weight: 0.1
+  Feature: 4
+  Biome: 0
+  TextureMode: 1
diff --git a/Assets/Shaders/Assets/Gledista_Triacanthos6.asset.meta b/Assets/Shaders/Assets/Gledista_Triacanthos6.asset.meta
new file mode 100644
index 00000000..f7f99d17
--- /dev/null
+++ b/Assets/Shaders/Assets/Gledista_Triacanthos6.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ae7bd575a71a441429dfcf50d64a3e95
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures.meta b/Assets/Shaders/Assets/Textures.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures.meta
rename to Assets/Shaders/Assets/Textures.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Trees/Broadleaf_Desktop.png b/Assets/Shaders/Assets/Textures/Broadleaf_Desktop.png
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Trees/Broadleaf_Desktop.png
rename to Assets/Shaders/Assets/Textures/Broadleaf_Desktop.png
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Trees/Broadleaf_Desktop.png.meta b/Assets/Shaders/Assets/Textures/Broadleaf_Desktop.png.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Trees/Broadleaf_Desktop.png.meta
rename to Assets/Shaders/Assets/Textures/Broadleaf_Desktop.png.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Trees/Conifer_Desktop.png b/Assets/Shaders/Assets/Textures/Conifer_Desktop.png
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Trees/Conifer_Desktop.png
rename to Assets/Shaders/Assets/Textures/Conifer_Desktop.png
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Trees/Conifer_Desktop.png.meta b/Assets/Shaders/Assets/Textures/Conifer_Desktop.png.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Trees/Conifer_Desktop.png.meta
rename to Assets/Shaders/Assets/Textures/Conifer_Desktop.png.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Trees/EU32a.png b/Assets/Shaders/Assets/Textures/EU32a.png
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Trees/EU32a.png
rename to Assets/Shaders/Assets/Textures/EU32a.png
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Trees/EU32a.png.meta b/Assets/Shaders/Assets/Textures/EU32a.png.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Trees/EU32a.png.meta
rename to Assets/Shaders/Assets/Textures/EU32a.png.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Trees/EU32m.png b/Assets/Shaders/Assets/Textures/EU32m.png
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Trees/EU32m.png
rename to Assets/Shaders/Assets/Textures/EU32m.png
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Trees/EU32m.png.meta b/Assets/Shaders/Assets/Textures/EU32m.png.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Trees/EU32m.png.meta
rename to Assets/Shaders/Assets/Textures/EU32m.png.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Trees/EU32y.png b/Assets/Shaders/Assets/Textures/EU32y.png
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Trees/EU32y.png
rename to Assets/Shaders/Assets/Textures/EU32y.png
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Trees/EU32y.png.meta b/Assets/Shaders/Assets/Textures/EU32y.png.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Trees/EU32y.png.meta
rename to Assets/Shaders/Assets/Textures/EU32y.png.meta
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos.png b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos.png
new file mode 100644
index 00000000..f8c38680
Binary files /dev/null and b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos.png differ
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos.png.meta b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos.png.meta
new file mode 100644
index 00000000..870d74ce
--- /dev/null
+++ b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos.png.meta
@@ -0,0 +1,116 @@
+fileFormatVersion: 2
+guid: 9a32a409abb74d3478077c7a3f79ac10
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Assets/Textures/Gledista_TriacanthosNormal.png b/Assets/Shaders/Assets/Textures/Gledista_TriacanthosNormal.png
new file mode 100644
index 00000000..cf63ced4
Binary files /dev/null and b/Assets/Shaders/Assets/Textures/Gledista_TriacanthosNormal.png differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal.jpeg.meta b/Assets/Shaders/Assets/Textures/Gledista_TriacanthosNormal.png.meta
similarity index 74%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal.jpeg.meta
rename to Assets/Shaders/Assets/Textures/Gledista_TriacanthosNormal.png.meta
index 209cb625..dd76206f 100644
--- a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal.jpeg.meta
+++ b/Assets/Shaders/Assets/Textures/Gledista_TriacanthosNormal.png.meta
@@ -1,30 +1,28 @@
 fileFormatVersion: 2
-guid: 88de6f36df9916e48a8912d32f03524f
+guid: 444917d012b4b9544bbb008671e35fa4
 TextureImporter:
   internalIDToNameTable: []
   externalObjects: {}
-  serializedVersion: 12
+  serializedVersion: 11
   mipmaps:
     mipMapMode: 0
     enableMipMap: 1
     sRGBTexture: 0
     linearTexture: 0
-    fadeOut: 0
-    borderMipMap: 0
+    fadeOut: 1
+    borderMipMap: 1
     mipMapsPreserveCoverage: 0
     alphaTestReferenceValue: 0.5
     mipMapFadeDistanceStart: 1
-    mipMapFadeDistanceEnd: 3
+    mipMapFadeDistanceEnd: 9
   bumpmap:
     convertToNormalMap: 0
     externalNormalMap: 0
     heightScale: 0.25
     normalMapFilter: 0
-  isReadable: 0
+  isReadable: 1
   streamingMipmaps: 0
   streamingMipmapsPriority: 0
-  vTOnly: 0
-  ignoreMasterTextureLimit: 0
   grayScaleToAlpha: 0
   generateCubemap: 6
   cubemapConvolution: 0
@@ -33,12 +31,12 @@ TextureImporter:
   maxTextureSize: 2048
   textureSettings:
     serializedVersion: 2
-    filterMode: 1
-    aniso: 1
-    mipBias: 0
-    wrapU: 0
-    wrapV: 0
-    wrapW: 0
+    filterMode: 2
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
   nPOTScale: 1
   lightmap: 0
   compressionQuality: 50
@@ -56,19 +54,15 @@ TextureImporter:
   textureType: 1
   textureShape: 1
   singleChannelComponent: 0
-  flipbookRows: 1
-  flipbookColumns: 1
   maxTextureSizeSet: 0
   compressionQualitySet: 0
   textureFormatSet: 0
-  ignorePngGamma: 0
   applyGammaDecoding: 0
-  cookieLightType: 0
   platformSettings:
   - serializedVersion: 3
     buildTarget: DefaultTexturePlatform
     maxTextureSize: 2048
-    resizeAlgorithm: 0
+    resizeAlgorithm: 1
     textureFormat: -1
     textureCompression: 1
     compressionQuality: 50
@@ -80,7 +74,7 @@ TextureImporter:
   - serializedVersion: 3
     buildTarget: Standalone
     maxTextureSize: 2048
-    resizeAlgorithm: 0
+    resizeAlgorithm: 1
     textureFormat: -1
     textureCompression: 1
     compressionQuality: 50
@@ -90,21 +84,9 @@ TextureImporter:
     androidETC2FallbackOverride: 0
     forceMaximumCompressionQuality_BC6H_BC7: 0
   - serializedVersion: 3
-    buildTarget: Server
+    buildTarget: Android
     maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: EmbeddedLinux
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
+    resizeAlgorithm: 1
     textureFormat: -1
     textureCompression: 1
     compressionQuality: 50
@@ -126,7 +108,6 @@ TextureImporter:
     edges: []
     weights: []
     secondaryTextures: []
-    nameFileIdTable: {}
   spritePackingTag: 
   pSDRemoveMatte: 0
   pSDShowRemoveMatteOption: 0
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_2.png b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_2.png
new file mode 100644
index 00000000..2027a9ee
Binary files /dev/null and b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_2.png differ
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_2.png.meta b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_2.png.meta
new file mode 100644
index 00000000..ea2c8109
--- /dev/null
+++ b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_2.png.meta
@@ -0,0 +1,116 @@
+fileFormatVersion: 2
+guid: 1b262daef7b956348ad212485367cb65
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_2Normal.png b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_2Normal.png
new file mode 100644
index 00000000..ac0d470e
Binary files /dev/null and b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_2Normal.png differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal2.png.meta b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_2Normal.png.meta
similarity index 74%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal2.png.meta
rename to Assets/Shaders/Assets/Textures/Gledista_Triacanthos_2Normal.png.meta
index 4229c6a4..4df329c2 100644
--- a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal2.png.meta
+++ b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_2Normal.png.meta
@@ -1,30 +1,28 @@
 fileFormatVersion: 2
-guid: e5024afc6917e32428ef4171371717d6
+guid: d3a7341b0137902448a4d63cfff1642e
 TextureImporter:
   internalIDToNameTable: []
   externalObjects: {}
-  serializedVersion: 12
+  serializedVersion: 11
   mipmaps:
     mipMapMode: 0
     enableMipMap: 1
     sRGBTexture: 0
     linearTexture: 0
-    fadeOut: 0
-    borderMipMap: 0
+    fadeOut: 1
+    borderMipMap: 1
     mipMapsPreserveCoverage: 0
     alphaTestReferenceValue: 0.5
     mipMapFadeDistanceStart: 1
-    mipMapFadeDistanceEnd: 3
+    mipMapFadeDistanceEnd: 9
   bumpmap:
     convertToNormalMap: 0
     externalNormalMap: 0
     heightScale: 0.25
     normalMapFilter: 0
-  isReadable: 0
+  isReadable: 1
   streamingMipmaps: 0
   streamingMipmapsPriority: 0
-  vTOnly: 0
-  ignoreMasterTextureLimit: 0
   grayScaleToAlpha: 0
   generateCubemap: 6
   cubemapConvolution: 0
@@ -33,12 +31,12 @@ TextureImporter:
   maxTextureSize: 2048
   textureSettings:
     serializedVersion: 2
-    filterMode: 1
-    aniso: 1
-    mipBias: 0
-    wrapU: 0
-    wrapV: 0
-    wrapW: 0
+    filterMode: 2
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
   nPOTScale: 1
   lightmap: 0
   compressionQuality: 50
@@ -56,19 +54,15 @@ TextureImporter:
   textureType: 1
   textureShape: 1
   singleChannelComponent: 0
-  flipbookRows: 1
-  flipbookColumns: 1
   maxTextureSizeSet: 0
   compressionQualitySet: 0
   textureFormatSet: 0
-  ignorePngGamma: 0
   applyGammaDecoding: 0
-  cookieLightType: 0
   platformSettings:
   - serializedVersion: 3
     buildTarget: DefaultTexturePlatform
     maxTextureSize: 2048
-    resizeAlgorithm: 0
+    resizeAlgorithm: 1
     textureFormat: -1
     textureCompression: 1
     compressionQuality: 50
@@ -80,7 +74,7 @@ TextureImporter:
   - serializedVersion: 3
     buildTarget: Standalone
     maxTextureSize: 2048
-    resizeAlgorithm: 0
+    resizeAlgorithm: 1
     textureFormat: -1
     textureCompression: 1
     compressionQuality: 50
@@ -90,21 +84,9 @@ TextureImporter:
     androidETC2FallbackOverride: 0
     forceMaximumCompressionQuality_BC6H_BC7: 0
   - serializedVersion: 3
-    buildTarget: Server
+    buildTarget: Android
     maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: EmbeddedLinux
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
+    resizeAlgorithm: 1
     textureFormat: -1
     textureCompression: 1
     compressionQuality: 50
@@ -126,7 +108,6 @@ TextureImporter:
     edges: []
     weights: []
     secondaryTextures: []
-    nameFileIdTable: {}
   spritePackingTag: 
   pSDRemoveMatte: 0
   pSDShowRemoveMatteOption: 0
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_3.png b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_3.png
new file mode 100644
index 00000000..e4654214
Binary files /dev/null and b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_3.png differ
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_3.png.meta b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_3.png.meta
new file mode 100644
index 00000000..32fe96ad
--- /dev/null
+++ b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_3.png.meta
@@ -0,0 +1,116 @@
+fileFormatVersion: 2
+guid: c54e0a6922762b34c84057db648cd4c0
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_3Normal.png b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_3Normal.png
new file mode 100644
index 00000000..c503346b
Binary files /dev/null and b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_3Normal.png differ
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_3Normal.png.meta b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_3Normal.png.meta
new file mode 100644
index 00000000..59802fd0
--- /dev/null
+++ b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_3Normal.png.meta
@@ -0,0 +1,116 @@
+fileFormatVersion: 2
+guid: 64f94b18eeeda4740b57b9a95f64f50e
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 0
+    linearTexture: 0
+    fadeOut: 1
+    borderMipMap: 1
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 9
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 2
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 1
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 1
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 1
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 1
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_4.png b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_4.png
new file mode 100644
index 00000000..697b9b4e
Binary files /dev/null and b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_4.png differ
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_4.png.meta b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_4.png.meta
new file mode 100644
index 00000000..06197dfc
--- /dev/null
+++ b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_4.png.meta
@@ -0,0 +1,116 @@
+fileFormatVersion: 2
+guid: 1b922d2f93fc0d247ae71937dcc31a51
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_4Normal.png b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_4Normal.png
new file mode 100644
index 00000000..4d77cc90
Binary files /dev/null and b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_4Normal.png differ
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_4Normal.png.meta b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_4Normal.png.meta
new file mode 100644
index 00000000..31e8932f
--- /dev/null
+++ b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_4Normal.png.meta
@@ -0,0 +1,116 @@
+fileFormatVersion: 2
+guid: bbc2b2895ce2d3b419642145c422af6f
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 0
+    linearTexture: 0
+    fadeOut: 1
+    borderMipMap: 1
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 9
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 2
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 1
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 1
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 1
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 1
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_5.png b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_5.png
new file mode 100644
index 00000000..fd137f53
Binary files /dev/null and b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_5.png differ
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_5.png.meta b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_5.png.meta
new file mode 100644
index 00000000..7bdc2443
--- /dev/null
+++ b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_5.png.meta
@@ -0,0 +1,116 @@
+fileFormatVersion: 2
+guid: bcb14e4b99425b84082dcf8c72e8e7fe
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_5Normal.png b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_5Normal.png
new file mode 100644
index 00000000..185ef31b
Binary files /dev/null and b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_5Normal.png differ
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_5Normal.png.meta b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_5Normal.png.meta
new file mode 100644
index 00000000..6fb2b732
--- /dev/null
+++ b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_5Normal.png.meta
@@ -0,0 +1,116 @@
+fileFormatVersion: 2
+guid: 35df714f331cc1c439fe2ba1d77b154f
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 0
+    linearTexture: 0
+    fadeOut: 1
+    borderMipMap: 1
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 9
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 2
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 1
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 1
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 1
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 1
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_6.png b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_6.png
new file mode 100644
index 00000000..963f7c2f
Binary files /dev/null and b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_6.png differ
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_6.png.meta b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_6.png.meta
new file mode 100644
index 00000000..e4d063c7
--- /dev/null
+++ b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_6.png.meta
@@ -0,0 +1,116 @@
+fileFormatVersion: 2
+guid: ef705a65644562f4f813f1fe360a8946
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 2
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_6Normal.png b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_6Normal.png
new file mode 100644
index 00000000..006ef58e
Binary files /dev/null and b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_6Normal.png differ
diff --git a/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_6Normal.png.meta b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_6Normal.png.meta
new file mode 100644
index 00000000..927e172c
--- /dev/null
+++ b/Assets/Shaders/Assets/Textures/Gledista_Triacanthos_6Normal.png.meta
@@ -0,0 +1,116 @@
+fileFormatVersion: 2
+guid: b3347234b358c1a4ba31a2ca645a161d
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 0
+    linearTexture: 0
+    fadeOut: 1
+    borderMipMap: 1
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 9
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 2
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 1
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 1
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 1
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 1
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/conifer.asset b/Assets/Shaders/Assets/conifer.asset
similarity index 92%
rename from com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/conifer.asset
rename to Assets/Shaders/Assets/conifer.asset
index d743f53d..5889ac1a 100644
--- a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/conifer.asset
+++ b/Assets/Shaders/Assets/conifer.asset
@@ -19,9 +19,8 @@ MonoBehaviour:
   Mesh: {fileID: 0}
   MeshMaterial: {fileID: 0}
   MaxMin: {x: 15, y: 25}
-  Offset: {x: 0, y: 0.01}
-  Cull: 0.02
+  Offset: {x: 0, y: 0}
   Weight: 1
-  Feature: 395264
+  Feature: 4
   Biome: 0
   TextureMode: 1
diff --git a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/conifer.asset.meta b/Assets/Shaders/Assets/conifer.asset.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/conifer.asset.meta
rename to Assets/Shaders/Assets/conifer.asset.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32a.asset b/Assets/Shaders/Assets/eu32a.asset
similarity index 95%
rename from com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32a.asset
rename to Assets/Shaders/Assets/eu32a.asset
index 0d40abbd..2e94f7be 100644
--- a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32a.asset
+++ b/Assets/Shaders/Assets/eu32a.asset
@@ -20,8 +20,7 @@ MonoBehaviour:
   MeshMaterial: {fileID: 0}
   MaxMin: {x: 14, y: 24}
   Offset: {x: 0, y: 0.14}
-  Cull: 0.02
   Weight: 1
-  Feature: 395264
+  Feature: 4
   Biome: 0
   TextureMode: 1
diff --git a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32a.asset.meta b/Assets/Shaders/Assets/eu32a.asset.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32a.asset.meta
rename to Assets/Shaders/Assets/eu32a.asset.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32m.asset b/Assets/Shaders/Assets/eu32m.asset
similarity index 95%
rename from com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32m.asset
rename to Assets/Shaders/Assets/eu32m.asset
index dfa9c1aa..59662a13 100644
--- a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32m.asset
+++ b/Assets/Shaders/Assets/eu32m.asset
@@ -20,8 +20,7 @@ MonoBehaviour:
   MeshMaterial: {fileID: 0}
   MaxMin: {x: 7, y: 15}
   Offset: {x: 0, y: 0.18}
-  Cull: 0.02
   Weight: 1
-  Feature: 395264
+  Feature: 4
   Biome: 0
   TextureMode: 1
diff --git a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32m.asset.meta b/Assets/Shaders/Assets/eu32m.asset.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32m.asset.meta
rename to Assets/Shaders/Assets/eu32m.asset.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32y.asset b/Assets/Shaders/Assets/eu32y.asset
similarity index 95%
rename from com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32y.asset
rename to Assets/Shaders/Assets/eu32y.asset
index d053e90c..4d5287b6 100644
--- a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32y.asset
+++ b/Assets/Shaders/Assets/eu32y.asset
@@ -20,8 +20,7 @@ MonoBehaviour:
   MeshMaterial: {fileID: 0}
   MaxMin: {x: 4, y: 9}
   Offset: {x: 0, y: 0.19}
-  Cull: 0.02
   Weight: 1
-  Feature: 395264
+  Feature: 4
   Biome: 0
   TextureMode: 1
diff --git a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32y.asset.meta b/Assets/Shaders/Assets/eu32y.asset.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen/eu32y.asset.meta
rename to Assets/Shaders/Assets/eu32y.asset.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Vegetation/Deciduous/oak.asset b/Assets/Shaders/Assets/oak.asset
similarity index 92%
rename from com.saab.map-streamer/Runtime/Assets/Vegetation/Deciduous/oak.asset
rename to Assets/Shaders/Assets/oak.asset
index 6331e922..ab8e655b 100644
--- a/com.saab.map-streamer/Runtime/Assets/Vegetation/Deciduous/oak.asset
+++ b/Assets/Shaders/Assets/oak.asset
@@ -19,9 +19,8 @@ MonoBehaviour:
   Mesh: {fileID: 0}
   MeshMaterial: {fileID: 0}
   MaxMin: {x: 1, y: 6}
-  Offset: {x: 0, y: 0.01}
-  Cull: 0.04
+  Offset: {x: 0, y: 0}
   Weight: 0.1
-  Feature: 657408
+  Feature: 4
   Biome: 0
   TextureMode: 1
diff --git a/com.saab.map-streamer/Runtime/Assets/Vegetation/Deciduous/oak.asset.meta b/Assets/Shaders/Assets/oak.asset.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Vegetation/Deciduous/oak.asset.meta
rename to Assets/Shaders/Assets/oak.asset.meta
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/CullShader.compute b/Assets/Shaders/CullShader.compute
similarity index 100%
rename from com.saab.map-streamer/Runtime/Shaders/Foliage/CullShader.compute
rename to Assets/Shaders/CullShader.compute
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/CullShader.compute.meta b/Assets/Shaders/CullShader.compute.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Shaders/Foliage/CullShader.compute.meta
rename to Assets/Shaders/CullShader.compute.meta
diff --git a/Assets/Shaders/Custom_Terrain.mat b/Assets/Shaders/Custom_Terrain.mat
new file mode 100644
index 00000000..c7baefa5
--- /dev/null
+++ b/Assets/Shaders/Custom_Terrain.mat
@@ -0,0 +1,68 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Custom_Terrain
+  m_Shader: {fileID: 4800000, guid: c99e6a1cd5d508440a64c3f2239924cd, type: 3}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _DetailTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailTexs:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 1be9db103cca35d4dbde21df2f534d12, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _NormalMap:
+        m_Texture: {fileID: 2800000, guid: f3cf62d24e84bca45ac47cce0f6e324a, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _NormalTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _NormalTexs:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _PlacementTex:
+        m_Texture: {fileID: 2800000, guid: 5f3a618eccd4f3641815364bedfe5d84, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _TempTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Floats:
+    - _Blend: 0
+    - _BumpScale: 0.4
+    - _Fade: 20
+    - _FadeAmount: 20
+    - _Glossiness: 0
+    - _Metallic: 0
+    - _Smoothness: 0
+    - _fade: 10
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _DefaultTiling: {r: 30, g: 30, b: 0, a: 0}
+    - _SpecularTint: {r: 1, g: 1, b: 1, a: 1}
+    - _Tiling: {r: 200, g: 200, b: 1, a: 1}
+  m_BuildTextureStacks: []
diff --git a/Assets/Shaders/Custom_Terrain.mat.meta b/Assets/Shaders/Custom_Terrain.mat.meta
new file mode 100644
index 00000000..6e0912ae
--- /dev/null
+++ b/Assets/Shaders/Custom_Terrain.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1606d283f6dd5884180f7609cd651aed
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/DebugShader.meta b/Assets/Shaders/DebugShader.meta
new file mode 100644
index 00000000..0028ea98
--- /dev/null
+++ b/Assets/Shaders/DebugShader.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 99c25ff0a33c2ef439ea94d76a681857
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/DebugShader/Depth.shader b/Assets/Shaders/DebugShader/Depth.shader
new file mode 100644
index 00000000..6356ef83
--- /dev/null
+++ b/Assets/Shaders/DebugShader/Depth.shader
@@ -0,0 +1,92 @@
+﻿Shader "Render Depth"
+{
+	Properties
+	{
+		[MaterialToggle] _isToggled("Hue Toggle", Float) = 0
+		_MainTex("Texture", 2D) = "white"
+		_Distance("Draw Distance", float) = 2000.0
+		_Min("Min depth", float) = 0.0
+		_Max("Max depth", float) = 1.0
+	}
+
+		SubShader
+	{
+		Tags { "RenderType" = "Opaque" }
+
+		Cull Off
+		//ZWrite Off
+		ZTest Always
+
+		Pass
+		{
+			CGPROGRAM
+
+			#pragma vertex vert
+			#pragma fragment frag
+			#include "UnityCG.cginc"
+
+			// the depth texture
+			sampler2D _MainTex;
+			sampler2D _LastCameraDepthTexture;
+			float _isToggled;
+			float _Distance;
+
+			float _Min;
+			float _Max;
+
+			//the object data that's put into the vertex shader
+			struct appdata
+			{
+				float4 vertex : POSITION;
+				float2 uv : TEXCOORD0;
+			};
+
+			//the data that's used to generate fragments and can be read by the fragment shader
+			struct v2f
+			{
+				float4 position : SV_POSITION;
+				float2 uv : TEXCOORD0;
+			};
+
+			// the vertex shader
+			v2f vert(appdata v)
+			{
+				v2f o;
+				//convert the vertex positions from object space to clip space so they can be rendered
+				o.position = UnityObjectToClipPos(v.vertex);
+				o.uv = v.uv;
+				return o;
+			}
+
+			//the fragment shader
+			fixed4 frag(v2f i) : SV_TARGET
+			{
+				// get depth from depth texture
+				float depth = tex2D(_LastCameraDepthTexture, i.uv).r;
+				// linear depth between camera and far clipping plane
+				depth = Linear01Depth(depth);
+				// change linear depth to between camera and DrawDistance
+				float farClip = _ProjectionParams.z;
+
+				depth = (depth * farClip) / _Distance;
+				depth = depth > 1 ? 1 : depth;
+
+				if (depth > _Max || depth < _Min)
+				{
+					return 1;
+				}
+
+				if (_isToggled == 1)
+				{
+					float2 uv = (0.5, depth);
+					return tex2D(_MainTex, uv).rgba;
+				}
+				else
+				{
+					return depth;
+				}
+			}
+		ENDCG
+		}
+	}
+}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/AssetShader.shader.meta b/Assets/Shaders/DebugShader/Depth.shader.meta
similarity index 71%
rename from com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/AssetShader.shader.meta
rename to Assets/Shaders/DebugShader/Depth.shader.meta
index 41140bef..faf34cf9 100644
--- a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/AssetShader.shader.meta
+++ b/Assets/Shaders/DebugShader/Depth.shader.meta
@@ -1,10 +1,9 @@
 fileFormatVersion: 2
-guid: 52f95c311a9580141aea5f54d382b9db
+guid: b1a2ec8c9f6ac8641a6f3e9c746a838c
 ShaderImporter:
   externalObjects: {}
   defaultTextures: []
   nonModifiableTextures: []
-  preprocessorOverride: 0
   userData: 
   assetBundleName: 
   assetBundleVariant: 
diff --git a/Assets/Shaders/DebugShader/Render Depth.mat b/Assets/Shaders/DebugShader/Render Depth.mat
new file mode 100644
index 00000000..5b1d9418
--- /dev/null
+++ b/Assets/Shaders/DebugShader/Render Depth.mat	
@@ -0,0 +1,36 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Render Depth
+  m_Shader: {fileID: 4800000, guid: b1a2ec8c9f6ac8641a6f3e9c746a838c, type: 3}
+  m_ShaderKeywords: _ISTOGGLED_ON
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _MainTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Floats:
+    - _Brightness: 0
+    - _Contrast: 1
+    - _Distance: 300
+    - _Hue: -329
+    - _Max: 1
+    - _Min: 0
+    - _Saturation: 1
+    - _isToggled: 1
+    m_Colors:
+    - _Color: {r: 0, g: 0.9833336, b: 1, a: 1}
diff --git a/Assets/Shaders/DebugShader/Render Depth.mat.meta b/Assets/Shaders/DebugShader/Render Depth.mat.meta
new file mode 100644
index 00000000..69d9a8d3
--- /dev/null
+++ b/Assets/Shaders/DebugShader/Render Depth.mat.meta	
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c96e39c28317e0248ae30e3db7f027e5
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic.meta b/Assets/Shaders/Dynamic.meta
new file mode 100644
index 00000000..8ca6341e
--- /dev/null
+++ b/Assets/Shaders/Dynamic.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 68c522f2f8ab73d49ac8a803d9bbfa73
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/ComputeExtension.cs b/Assets/Shaders/Dynamic/ComputeExtension.cs
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/ComputeExtension.cs
rename to Assets/Shaders/Dynamic/ComputeExtension.cs
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/ComputeExtension.cs.meta b/Assets/Shaders/Dynamic/ComputeExtension.cs.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/ComputeExtension.cs.meta
rename to Assets/Shaders/Dynamic/ComputeExtension.cs.meta
diff --git a/Assets/Shaders/Dynamic/Depth.compute b/Assets/Shaders/Dynamic/Depth.compute
new file mode 100644
index 00000000..c958337f
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Depth.compute
@@ -0,0 +1,77 @@
+﻿#pragma kernel Depth
+#pragma kernel CalcMaxDepth
+#include "UnityCG.cginc"
+
+Texture2D<float4> _DepthTexture;
+RWTexture2D<float4> _OutputTexture;
+RWTexture2D<float4> _OutputTexture02;
+
+[numthreads(32, 32, 1)]
+void Depth(uint3 uv : SV_DispatchThreadID)
+{
+	// Get Linear Depth (nearclip to farclip camera)
+	float4 depth = Linear01Depth(_DepthTexture[uv.xy]);
+	float maxval = depth.x;
+	float minval = depth.x;
+
+	//for (float y = -5; y < 5; y++)
+	//{
+	//	for (float x = -5; x < 5; x++)
+	//	{
+	//		float4 pix = Linear01Depth(_DepthTexture[float2(uv.x + x, uv.y + y)]);
+
+	//		// Get max depth
+	//		maxval = max(maxval, pix.x);
+	//		// Get min Depth
+	//		minval = min(minval, pix.x);
+	//	}
+	//}
+
+	depth = Linear01Depth(_DepthTexture[float2(uv.x + 1, uv.y)]);
+	maxval = max(maxval, depth.x);
+	minval = min(minval, depth.x);
+	depth = Linear01Depth(_DepthTexture[float2(uv.x - 1, uv.y)]);
+	maxval = max(maxval, depth.x);
+	minval = min(minval, depth.x);
+	depth = Linear01Depth(_DepthTexture[float2(uv.x, uv.y + 1)]);
+	maxval = max(maxval, depth.x);
+	minval = min(minval, depth.x);
+	depth = Linear01Depth(_DepthTexture[float2(uv.x, uv.y - 1)]);
+	maxval = max(maxval, depth.x);
+	minval = min(minval, depth.x);
+
+	depth.y = maxval;
+	depth.z = minval;
+
+	depth.w = 1;
+
+	_OutputTexture[uv.xy] = depth;
+}
+
+[numthreads(32, 32, 1)]
+void CalcMaxDepth(uint3 uv : SV_DispatchThreadID)
+{
+	float4 depth = Linear01Depth(_DepthTexture[uv.xy]);
+	float maxval = depth.x;
+	float minval = depth.x;
+
+	depth = Linear01Depth(_DepthTexture[float2(uv.x + 1, uv.y)]);
+	maxval = max(maxval, depth.x);
+	minval = min(minval, depth.x);
+	depth = Linear01Depth(_DepthTexture[float2(uv.x - 1, uv.y)]);
+	maxval = max(maxval, depth.x);
+	minval = min(minval, depth.x);
+	depth = Linear01Depth(_DepthTexture[float2(uv.x, uv.y + 1)]);
+	maxval = max(maxval, depth.x);
+	minval = min(minval, depth.x);
+	depth = Linear01Depth(_DepthTexture[float2(uv.x, uv.y -1)]);
+	maxval = max(maxval, depth.x);
+	minval = min(minval, depth.x);
+
+	depth.y = maxval;
+	depth.z = minval;
+
+	depth.w = 1;
+
+	_OutputTexture[uv.xy] = depth;
+}
diff --git a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/NormalMapGenerator.compute.meta b/Assets/Shaders/Dynamic/Depth.compute.meta
similarity index 65%
rename from com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/NormalMapGenerator.compute.meta
rename to Assets/Shaders/Dynamic/Depth.compute.meta
index 39b01c7f..caf6120a 100644
--- a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/NormalMapGenerator.compute.meta
+++ b/Assets/Shaders/Dynamic/Depth.compute.meta
@@ -1,8 +1,8 @@
 fileFormatVersion: 2
-guid: 0e24b78a0e19e3745900ce3fc73a93c1
+guid: 7efa00cde91893345ac06d76d72dcb3a
 ComputeShaderImporter:
   externalObjects: {}
-  preprocessorOverride: 0
+  currentAPIMask: 4
   userData: 
   assetBundleName: 
   assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/DynamicTerrainCompute.compute b/Assets/Shaders/Dynamic/DynamicTerrainCompute.compute
new file mode 100644
index 00000000..395b3417
--- /dev/null
+++ b/Assets/Shaders/Dynamic/DynamicTerrainCompute.compute
@@ -0,0 +1,523 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: DynamicTerrainCompute.compute
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+// Links:
+// http://extremelearning.com.au/unreasonable-effectiveness-of-quasirandom-sequences/
+//
+//******************************************************************************
+
+// Kernels
+#pragma kernel MeshGrassGenerator
+#pragma kernel MeshTreeGenerator
+#pragma kernel PointCloudPlacement
+#pragma kernel CrossBoardPlacement
+#pragma kernel IndirectGrass
+#pragma kernel Cull
+#pragma kernel TreeCull
+#pragma kernel FindQuad
+#pragma kernel Resize
+
+// Minimum / maximum integer values
+#define intMin -2147483648
+#define intMax 2147483647
+#define SUBS 16
+#define plasticConstant 1.32471795724474602596
+
+// Buffers
+StructuredBuffer<float3> surfaceVertices;
+StructuredBuffer<int> surfaceIndices;
+StructuredBuffer<float2> surfaceUVs;
+
+// Calculated points
+AppendStructuredBuffer<float4> terrainPoints;
+
+// copy
+StructuredBuffer<float4> BigBuffer;
+AppendStructuredBuffer<float4> SmallBuffer;
+uint CopyCount;
+
+// culling
+StructuredBuffer<float4> Input;
+AppendStructuredBuffer<float4> Output;
+AppendStructuredBuffer<float4> closeBuffer;
+
+// Geometry
+AppendStructuredBuffer<float4> SmallestQuad;
+
+// Indirect buffer
+RWStructuredBuffer<int> indirectBuffer;
+
+// Textures
+Texture2D<float4> splatMap;                     // Grass splatMap
+Texture2D<unorm float> PlacementMap;                 // placementMap
+Texture2D<float4> NodeTexture;                  // Map tile texture
+Texture2D<float4> BillboardPlane;               // Billboard
+
+// Variables
+bool PlacementMapEnabled;
+float surfaceGridStep;
+float surfaceSize;
+uint cullCount;
+uint indexCount;
+uint BillboardPlaneResolution;
+
+float4 frustumPlanes[6];						// Frustum planes (6 planes * 4 floats: [ normal.x, normal.y, normal.z, distance ])
+float3 terrainOffset;                           // Terrain offset in meters
+float3 CameraPosition;
+float4x4 ObjToWorld;
+int terrainResolution;                          // Resolution of texture
+
+// Terrain frustum culling
+inline bool IsInFrustum(float3 positionAfterProjection, float treshold = 1)
+{
+	float cullValue = treshold;
+
+	return (dot(frustumPlanes[0].xyz, positionAfterProjection) >= cullValue &&
+		dot(frustumPlanes[1].xyz, positionAfterProjection) >= cullValue &&
+		dot(frustumPlanes[2].xyz, positionAfterProjection) >= cullValue &&
+		dot(frustumPlanes[3].xyz, positionAfterProjection) >= cullValue) &&
+		(frustumPlanes[5].w >= abs(distance(CameraPosition, positionAfterProjection)));
+}
+
+// ************* Get Grass Type *************
+
+int GetFeatureType(uint i, uint valid[8])
+{
+	uint Types[] = { 0,0,0,0,0,0,0,0 };
+	int index = 0;
+
+	for (int x = 0; x < 8; x++)
+	{
+		if (valid[x] == 1)
+		{
+			Types[index] = x;
+			index++;
+		}
+	}
+	if (index == 0)
+	{
+		return -1;
+	}
+
+	return Types[i % index];
+}
+
+int GetType(uint color, uint i)
+{
+	uint Types[] = { 0,0,0,0,0,0,0,0 };
+
+	Types[0] = (color >> 0) & 1;
+	Types[1] = (color >> 1) & 1;
+	Types[2] = (color >> 2) & 1;
+	Types[3] = (color >> 3) & 1;
+	Types[4] = (color >> 4) & 1;
+	Types[5] = (color >> 5) & 1;
+	Types[6] = (color >> 6) & 1;
+	Types[7] = (color >> 7) & 1;
+
+	int valid = GetFeatureType(i, Types);
+	return valid;
+}
+
+// ************* HSV *************
+float3 RGBToHSV(float3 RGB)
+{
+	float R = (RGB.x >= 1.0 ? 255 : RGB.x * 256.0);
+	float G = (RGB.y >= 1.0 ? 255 : RGB.y * 256.0);
+	float B = (RGB.z >= 1.0 ? 255 : RGB.z * 256.0);
+
+	float h = 0, s;
+
+	float v = max(max(R, G), B);
+	float Cmin = min(min(R, G), B);
+
+	float delta = v - Cmin;
+
+	if (v == 0.0) { s = 0; }
+	else { s = delta / v; }
+
+	if (s == 0) { h = 0.0; }
+	else
+	{
+		if (R == v)
+		{
+			h = (G - B) / delta;
+		}
+		else if (G == v)
+		{
+			h = 2 + (B - R) / delta;
+		}
+		else if (B == v)
+		{
+			h = 4 + (R - G) / delta;
+		}
+
+		h *= 60;
+		if (h < 0.0) { h = h + 360; }
+	}
+
+	return float3(h, s, (v / 255));
+}
+
+bool InRange(float3 value, float3 v1, float3 v2)
+{
+	if (value.x >= min(v1.x, v2.x) && value.x <= max(v1.x, v2.x))
+	{
+		//return true;
+		if (value.y >= min(v1.y, v2.y) && value.y <= max(v1.y, v2.y))
+		{
+			if (value.z >= min(v1.z, v2.z) && value.z <= max(v1.z, v2.z))
+			{
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
+// ************* Mesh Grass *************
+[numthreads(16, SUBS, 1)]
+// can calculate a maximum of (65535 * 8) 524,280 triangles parallel
+void MeshGrassGenerator(int3 id : SV_DispatchThreadID)
+{
+	float density = surfaceGridStep;
+	uint index = id.x * 3;
+	uint sub = id.y;
+
+	if (index >= indexCount) { return; }
+
+	float3 v1 = surfaceVertices[surfaceIndices[index]];
+	float3 v2 = surfaceVertices[surfaceIndices[index + 1]];
+	float3 v3 = surfaceVertices[surfaceIndices[index + 2]];
+
+	float2 uv1 = surfaceUVs[surfaceIndices[index]];
+	float2 uv2 = surfaceUVs[surfaceIndices[index + 1]];
+	float2 uv3 = surfaceUVs[surfaceIndices[index + 2]];
+
+	// Area
+	float area = length(cross((v2 - v1), (v3 - v1))) / 2;
+	if (area < density) { return; }
+	float grassAmount = area / density;
+
+	int start = sub * ceil(grassAmount / SUBS);
+	int end = (sub + 1) * ceil(grassAmount / SUBS);
+	end = min(end, grassAmount);
+
+	if (grassAmount <= SUBS)
+	{
+		if (sub != 0)
+		{
+			return;
+		}
+		start = 0;
+		end = grassAmount;
+	}
+
+	// ************* Barycentric coordinate *************
+	for (int i = start; i < end; i += 1.0f)
+	{
+		float a1 = 1 / (plasticConstant);
+		float a2 = 1 / ((plasticConstant) * (plasticConstant));
+
+		float r1 = frac(0.5 + a1 * i);
+		float r2 = frac(0.5 + a2 * i);
+
+		float2 uv = (1 - sqrt(r1)) * uv1 + (sqrt(r1) * (1 - r2)) * uv2 + (sqrt(r1) * r2) * uv3;
+		float3 finalPoint = (1 - sqrt(r1)) * v1 + (sqrt(r1) * (1 - r2)) * v2 + (sqrt(r1) * r2) * v3;
+
+		float4 color = splatMap[uv * terrainResolution];
+		float4 nodeColor = NodeTexture[uv * terrainResolution];
+		//float3 placement = PlacementMap[uv * terrainResolution];
+		unorm float placement = PlacementMap[uv * terrainResolution];
+
+		//uint value = (uint)(placement.x * 255) | (uint)(placement.y * 255) << 8 | (uint)(placement.z * 255) << 16;
+		uint blueColor = (color.z >= 1.0 ? 255 : color.z * 256.0);
+
+		int valid = GetType(blueColor, i);
+		if (valid != -1)
+		{
+			float3 HSV = RGBToHSV(nodeColor.xyz);
+			bool Append = PlacementMapEnabled;
+
+			if (PlacementMapEnabled)
+			{
+				uint feauture = uint(placement >= 1.0 ? 255 : placement * 256.0);
+				//uint green = uint(placement.y >= 1.0 ? 255 : placement.y * 256.0);
+				Append = feauture == 21 || feauture == 40;
+			}
+			else
+			{
+				Append = InRange(HSV, float3(22, 0.2, 0), float3(170, 1, 1));
+			}
+
+			// TODO: only until we generate a proper splatmap
+			//if (InRange(HSV, float3(22, 0.2, 0), float3(170, 1, 1)))
+			// if ((value >> 0) & 1 || (value >> 1) & 1)
+			if (Append)
+			{
+				terrainPoints.Append(float4(finalPoint.xyz, valid));
+			}
+		}
+	}
+}
+// ************* Mesh Tree *************
+[numthreads(16, SUBS, 1)]
+// can calculate a maximum of (65535 * 8) 524,280 triangles parallel
+void MeshTreeGenerator(int3 id : SV_DispatchThreadID)
+{
+	float density = surfaceGridStep;
+	uint index = (id.x * 3);
+	uint sub = id.y;
+	if (index >= indexCount) { return; }
+
+	float3 v1 = surfaceVertices[surfaceIndices[index]];
+	float3 v2 = surfaceVertices[surfaceIndices[index + 1]];
+	float3 v3 = surfaceVertices[surfaceIndices[index + 2]];
+
+	float2 uv1 = surfaceUVs[surfaceIndices[index]];
+	float2 uv2 = surfaceUVs[surfaceIndices[index + 1]];
+	float2 uv3 = surfaceUVs[surfaceIndices[index + 2]];
+	// Area
+
+	float area = length(cross((v2 - v1), (v3 - v1))) / 2;
+	//if (area < density) { return; }
+	float TreeAmount = ceil(area / density);
+
+	uint start = sub * ceil(TreeAmount / SUBS);
+	uint end = (sub + 1) * ceil(TreeAmount / SUBS);
+	end = min(end, TreeAmount);
+
+	if (TreeAmount <= SUBS)
+	{
+		if (sub != 0)
+		{
+			return;
+		}
+		start = 0;
+		end = TreeAmount;
+	}
+
+	// ************* Barycentric coordinate *************
+	for (uint i = start; i < end; i++)
+	{
+		float a1 = 1 / (plasticConstant);
+		float a2 = 1 / ((plasticConstant) * (plasticConstant));
+
+		float r1 = frac(0.5 + a1 * i);
+		float r2 = frac(0.5 + a2 * i);
+
+		float2 uv = (1 - sqrt(r1)) * uv1 + (sqrt(r1) * (1 - r2)) * uv2 + (sqrt(r1) * r2) * uv3;
+		float3 finalPoint = (1 - sqrt(r1)) * v1 + (sqrt(r1) * (1 - r2)) * v2 + (sqrt(r1) * r2) * v3;
+
+		float4 color = splatMap[uv * terrainResolution];
+		float4 nodeColor = NodeTexture[uv * terrainResolution];
+		//float3 placement = PlacementMap[uv * terrainResolution];
+		unorm float placement = PlacementMap[uv * terrainResolution];
+
+		uint blueColor = (color.z >= 1.0 ? 255 : color.z * 256.0);
+
+		int valid = GetType(blueColor, i);
+
+		float3 HSV = RGBToHSV(nodeColor.xyz);
+
+		//uint value = (uint)(placement.x * 255) | (uint)(placement.y * 255) << 8 | (uint)(placement.z * 255) << 16;
+		bool Append = PlacementMapEnabled;
+
+		if (PlacementMapEnabled)
+		{
+			//uint green = uint(placement.y >= 1.0 ? 255 : placement.y * 256.0);
+			//Append = green == 40;
+			Append = uint(placement >= 1.0 ? 255 : placement * 256.0) == 40;
+		}
+		else
+		{
+			Append = InRange(HSV, float3(80, 0.2, 0), float3(140, 1, 1));
+		}
+
+		if (Append)
+		{
+			terrainPoints.Append(float4(finalPoint.xyz, valid));
+		}
+
+	}
+}
+
+// ************* Point Cloud Placement ************
+[numthreads(16, 1, 1)]
+void PointCloudPlacement(int3 id : SV_DispatchThreadID)
+{
+	uint index = id.x;
+	if (index >= indexCount) { return; }
+
+	float3 p = surfaceVertices[index];
+	float2 uv = surfaceUVs[index];
+
+	float4 color = splatMap[uv * terrainResolution];
+	//float3 placement = PlacementMap[uv * terrainResolution];
+	unorm float placement = PlacementMap[uv * terrainResolution];
+
+	uint blueColor = (color.z >= 1.0 ? 255 : color.z * 256.0);
+	int valid = GetType(blueColor, id.x);
+
+	float4 nodeColor = NodeTexture[uv * terrainResolution];
+	float3 HSV = RGBToHSV(nodeColor.xyz);
+
+	//uint value = (uint)(placement.x * 255) | (uint)(placement.y * 255) << 8 | (uint)(placement.z * 255) << 16;
+	bool Append = PlacementMapEnabled;
+
+	if (PlacementMapEnabled)
+	{
+		//uint green = uint(placement.y >= 1.0 ? 255 : placement.y * 256.0);
+		//Append = green == 40;
+		Append = uint(placement >= 1.0 ? 255 : placement * 256.0) == 40;
+	}
+	else
+	{
+		Append = InRange(HSV, float3(80, 0.2, 0), float3(140, 1, 1));
+	}
+
+	if (Append)
+	{
+		if (id.x % 3 == 1)
+			terrainPoints.Append(float4(p.xyz, valid));
+	}
+}
+
+// ************* Point Cloud Placement ************
+
+[numthreads(16, 1, 1)]
+void CrossBoardPlacement(int3 id : SV_DispatchThreadID)
+{
+	uint index = id.x;
+	if (index >= indexCount) { return; }
+
+	float3 p = surfaceVertices[index];
+
+	terrainPoints.Append(float4(p.xyz, id.x % 2));
+}
+
+// ************* Cull shader *************
+// can cull a maximum of (65535 * 128) 8,388,480 grass strains parallel
+[numthreads(128, 1, 1)]
+void Cull(uint3 id : SV_DispatchThreadID)
+{
+	int index = id.x;
+	if (index >= indirectBuffer[0]) { return; }
+
+	float4 data = Input[index];
+	float4 pos = mul(ObjToWorld, float4(data.xyz, 1));
+
+	if (IsInFrustum(pos.xyz - CameraPosition, -5))
+	{
+		/*float dist = length(pos);
+		int t = index % frustumPlanes[5].w;
+
+		if (t < dist)
+		{
+			return;
+		}*/
+		Output.Append(float4(pos.xyz, data.w));
+	}
+}
+
+// ************* Cull shader *************
+// can cull a maximum of (65535 * 128) 8,388,480 grass strains parallel
+[numthreads(128, 1, 1)]
+void TreeCull(uint3 id : SV_DispatchThreadID)
+{
+	int index = id.x;
+	if (index >= indirectBuffer[0]) { return; }
+
+	float4 data = Input[index];
+
+	float4 pos = mul(ObjToWorld, float4(data.xyz, 1));
+
+	if (IsInFrustum(pos.xyz - CameraPosition, -15))
+	{
+		//Output.Append(float4(pos.xyz, data.w));
+		//if (length(pos) > 150)
+		{
+			Output.Append(float4(pos.xyz, data.w));
+		}
+		//if (length(pos) < 100)
+		{
+			closeBuffer.Append(float4(pos.xyz, data.w));
+		}
+	}
+}
+
+[numthreads(1, 1, 1)]
+void FindQuad(uint3 id : SV_DispatchThreadID)
+{
+	half cutoff = 0.9f;
+	int size = BillboardPlaneResolution;
+
+	int _maxX = 0;
+	int _maxY = 0;
+	int _minX = size;
+	int _minY = size;
+
+	for (int x = 0; x < size; x++)
+	{
+		for (int y = 0; y < size; y++)
+		{
+			half2 uv = half2(x, y);
+			half4 color = BillboardPlane[uv];
+
+			if (color.w > cutoff)
+			{
+				_maxX = max(x, _maxX);
+				_maxY = max(y, _maxY);
+
+				_minX = min(x, _minX);
+				_minY = min(y, _minY);
+			}
+		}
+	}
+	SmallestQuad.Append(float4(_minX, _maxX, _minY, _maxY));
+}
+
+// ************* Resize *************
+// Resize buffer to smaller version
+[numthreads(64, 1, 1)]
+void Resize(uint3 id : SV_DispatchThreadID)
+{
+	if (id.x >= CopyCount)
+		return;
+
+	float4 p = BigBuffer[id.x];
+	SmallBuffer.Append(p);
+}
+
+// ************* Indirect *************
+// may be used in the future for a performance increase
+[numthreads(1, 1, 1)]
+void IndirectGrass()
+{
+	indirectBuffer[0] = ceil(indirectBuffer[0] / 128.0); // mesh has 64000 vertices
+}
\ No newline at end of file
diff --git a/Assets/Shaders/Dynamic/DynamicTerrainCompute.compute.meta b/Assets/Shaders/Dynamic/DynamicTerrainCompute.compute.meta
new file mode 100644
index 00000000..2f5674e5
--- /dev/null
+++ b/Assets/Shaders/Dynamic/DynamicTerrainCompute.compute.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 513988170bf57ee4487af2231d625bad
+ComputeShaderImporter:
+  externalObjects: {}
+  currentAPIMask: 4
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/DynamicTerrainGrass.shader b/Assets/Shaders/Dynamic/DynamicTerrainGrass.shader
new file mode 100644
index 00000000..b6be3a97
--- /dev/null
+++ b/Assets/Shaders/Dynamic/DynamicTerrainGrass.shader
@@ -0,0 +1,529 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: DynamicTerrainGrass.shader
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************﻿
+
+Shader "Terrain/DynamicTerrain/Grass"
+{
+	Properties
+	{
+		_MainTex("Albedo (RGB)", 2DArray) = "white" {}
+		_Cutoff("Cutoff", float) = 0.38
+		_TextureWaving("Grass Texture Waving ", float) = 0.01
+		_ColorIntensity("Color Intensity", Range(0, 1)) = 0.85
+	}
+
+		SubShader
+		{
+			Tags
+			{
+				"Queue" = "AlphaTest"
+				"RenderType" = "Opaque"
+			// can interfere with render order.
+			"DisableBatching" = "True"
+		}
+
+		CGINCLUDE
+
+			// ****** Includes ******
+			#include "UnityCG.cginc"
+			#include "UnityGBuffer.cginc"
+			#include "UnityStandardUtils.cginc"
+			#include "UnityPBSLighting.cginc"
+
+			#define PI 3.1415926535
+			#define PI2 6.283185307
+
+			// ****** Textures ******
+			UNITY_DECLARE_TEX2DARRAY(_MainTex);
+			sampler2D _PerlinNoise;
+			sampler2D _DepthTexture;
+
+			// ****** Properties ******
+			float _Cutoff;
+			float _ColorIntensity;
+			float _TextureWaving;
+			fixed3 _ViewDir;
+			half3 _TerrainSize;
+			half4 _MinMaxWidthHeight[16];
+			fixed4 _FrustumPlanes[6];						// Frustum planes (6 planes * 4 floats: [ normal.x, normal.y, normal.z, distance ])
+			float4x4 _worldToObj;
+
+			// ****** Grass point cloud ******
+			StructuredBuffer<float4> _PointBuffer;
+
+			// Vertex shader
+			uint vert(uint id : SV_VertexID, uint instanceID : SV_InstanceID) : TEXCOORD
+			{
+				return id + instanceID * 64000;
+			}
+
+			inline fixed2 MirrorCoordinates(fixed2 uv)
+			{
+				fixed2 t = frac(uv * 0.5f) * 2.0f;
+				fixed2 length = fixed2(1.0f, 1.0f);
+				return length - abs(t - length);
+			}
+
+			inline half3 RGBToHSV(half3 RGB)
+			{
+				half R = (RGB.x >= 1.0 ? 255 : RGB.x * 256.0);
+				half G = (RGB.y >= 1.0 ? 255 : RGB.y * 256.0);
+				half B = (RGB.z >= 1.0 ? 255 : RGB.z * 256.0);
+
+				half h = 0, s;
+
+				half v = max(max(R, G), B);
+				half Cmin = min(min(R, G), B);
+
+				half delta = v - Cmin;
+
+				if (v == 0.0) { s = 0; }
+				else { s = delta / v; }
+
+				if (s == 0) { h = 0.0; }
+				else
+				{
+					if (R == v)
+					{
+						h = (G - B) / delta;
+					}
+					else if (G == v)
+					{
+						h = 2 + (B - R) / delta;
+					}
+					else if (B == v)
+					{
+						h = 4 + (R - G) / delta;
+					}
+
+					h *= 60;
+					if (h < 0.0) { h = h + 360; }
+				}
+
+				return half3(h, s, (v / 255));
+			}
+
+			inline fixed2 WorldToScreenPos(fixed3 pos)
+			{
+				pos = normalize(pos - _WorldSpaceCameraPos) * (_ProjectionParams.y + (_ProjectionParams.z - _ProjectionParams.y)) + _WorldSpaceCameraPos;
+				fixed2 uv = 0;
+				fixed3 toCam = mul(unity_WorldToCamera, pos);
+				fixed camPosZ = toCam.z;
+				fixed height = 2 * camPosZ / unity_CameraProjection._m11;
+				fixed width = _ScreenParams.x / _ScreenParams.y * height;
+				uv.x = (toCam.x + width / 2) / width;
+				uv.y = (toCam.y + height / 2) / height;
+				return uv;
+			}
+
+			inline bool IsVisable(half4 position, half dist, float farClip, half3 offset)
+			{
+				half2 screenPosUV = WorldToScreenPos(position.xyz + offset);
+
+				half2 pixel = half2(1 / _ScreenParams.x, 1 / _ScreenParams.y);
+
+				float depth = tex2Dlod(_DepthTexture, half4(screenPosUV, 1, 1)).g;
+				depth = (depth * farClip);
+
+				if (depth < dist - 50)
+				{
+					return false;
+				}
+				return true;
+			}
+
+			inline bool Cull(half4 position, half4 size)
+			{
+				float farClip = _ProjectionParams.z;
+				float3 forward = mul((float3x3)unity_CameraToWorld, float3(0, 0, 1));
+
+				half dist = dot(forward, position.xyz);
+
+				bool mid = IsVisable(position, dist, farClip, half3(0, size.y / 2, 0));
+
+				if (dist > 200)
+				{
+					return !mid;
+				}
+
+				bool top = IsVisable(position, dist, farClip, half3(0, size.y, 0));
+				bool top2 = IsVisable(position, dist, farClip, half3(0, size.y + (size.y / 4), 0));
+				bool base = IsVisable(position, dist, farClip, half3(0, 0, 0));
+
+				return !(top || top2 || mid || base);
+			}
+
+			// Grass mesh generation
+			inline bool GemerateGeometry(in uint p, inout half4 grassPosition, inout half4 displacement, inout half4 displacementx, inout half4 size, inout half tilt, inout half2 uvDistortion, inout half2 textureWaving, inout half index)
+			{
+				// Get grass position from compute buffer
+				grassPosition = _PointBuffer[p];
+				half4 objPos = mul(_worldToObj, half4(grassPosition.xyz, 1));
+				half2 _uv = objPos.xz;
+				half4 uv = half4(MirrorCoordinates(_uv.xy), 1, 1);
+
+				// To calculate tilt
+				half cameraDistance = distance(_WorldSpaceCameraPos.xyz, grassPosition.xyz);
+
+				// Sample perlin noise
+				half4 perlinNoise = tex2Dlod(_PerlinNoise, uv);
+				half3 hsv = RGBToHSV(perlinNoise.xyz);
+
+				// Grass "random" number (0.0 - 1.0)
+				fixed random = frac(hsv.x);
+
+				// Grass index
+				index = (half)grassPosition.w;
+
+				// Grass size
+				half4 minMaxWidthHeight = _MinMaxWidthHeight[index];
+				half2 s = lerp(minMaxWidthHeight.xz, minMaxWidthHeight.yw, random);
+
+				size = half4(s.x, s.y, s.x, random);
+				uvDistortion = ((uint) (grassPosition.w * 1000.0f)) % 2 ? fixed2(1.0f, 0) : fixed2(0.0f, 1.0f);
+
+				// Wind
+				textureWaving = fixed2(sin(_Time.w + PI * grassPosition.w), cos(_Time.w + PI * grassPosition.x)) * _TextureWaving;
+
+				// cull
+				if (false)
+				{
+					if (Cull(grassPosition, size))
+						return false;
+				}
+
+				// Generate grass quad
+				grassPosition = half4(grassPosition.xyz, 1.0f);
+
+				half sin;
+				half cos;
+
+				sincos(random * PI2, sin, cos);
+				displacement = half4(sin, 0, cos, 0) * 0.5 * size.y;
+				sincos(random * PI2 + PI / 2, sin, cos);
+				displacementx = half4(sin, 0, cos, 0) * 0.5 * size.y;
+
+				tilt = dot(half3(0, 1, 0), -_ViewDir) * saturate(cameraDistance / 3);
+
+				return true;
+			}
+
+			ENDCG
+
+			Pass
+			{
+				Name "GeometryShaderGrass"
+				Tags
+				{
+					"LightMode" = "Deferred"
+				}
+
+				Cull Off
+				Blend Off
+
+				CGPROGRAM
+
+				// Shader programs
+				#pragma vertex vert
+				#pragma geometry geom
+				#pragma fragment frag
+
+				// Compiler definitions
+				#pragma target 5.0
+				//#pragma only_renderers d3d11
+				#pragma multi_compile_prepassfinal noshadowmask nodynlightmap nodirlightmap nolightmap noshadow 
+
+				// Fragment input
+				struct FramentInput
+				{
+					half4 position : SV_POSITION;
+					fixed3 texcoord : TEXCOORD0;
+					#if UNITY_SHOULD_SAMPLE_SH
+						half3 sh : TEXCOORD1;
+					#endif
+				};
+
+				inline void AppendVertex(inout TriangleStream<FramentInput> triStream, half4 worldPosition, half4 displacement, fixed3 uv)
+				{
+					FramentInput o;
+					o.position = mul(UNITY_MATRIX_VP, worldPosition + displacement);
+					o.texcoord = uv;
+					#if UNITY_SHOULD_SAMPLE_SH
+						o.sh = 0;
+						o.sh = ShadeSHPerVertex(fixed3(0,1,0), o.sh);
+					#endif
+					triStream.Append(o);
+				}
+
+				// Geometry shader
+				[maxvertexcount(8)]
+				void geom(point uint p[1] : TEXCOORD, inout TriangleStream<FramentInput> triStream)
+				{
+					// Initialize fragment input
+					FramentInput o;
+					UNITY_INITIALIZE_OUTPUT(FramentInput, o);
+
+					int index;
+					half tilt;
+					half4 grassPosition;
+					half4 size;
+					fixed2 uvDistortion, textureWaving;
+					fixed4 displacement, displacementx;
+
+					grassPosition = 0;
+					displacement = 0;
+					displacementx = 0;
+					size = 0;
+					tilt = 0;
+					uvDistortion = 0;
+					textureWaving = 0;
+					index = 0;
+
+					// Generate grass mesh
+					if (GemerateGeometry(p[0], grassPosition, displacement, displacementx, size, tilt, uvDistortion, textureWaving, index))
+					{
+						//float cameraDistance = distance(_WorldSpaceCameraPos.xyz, grassPosition.xyz);
+						//float3 right = cross(_ViewDir.xyz, float3(0, 1, 0)) * length(displacement);
+						//float4 faceCam = float4(right.xyz, displacement.w);
+
+						// Top vertices
+						//AppendVertex(triStream, grassPosition, half4(0, size.y * 2, 0, 0) + tilt, fixed3(0.5f+ textureWaving.x, 2.0f, index));
+
+						AppendVertex(triStream, grassPosition, displacement + float4(0, size.y, 0, 0) + displacementx * tilt, float3(uvDistortion.x + textureWaving.x, 1.0f, index));
+						AppendVertex(triStream, grassPosition, -displacement + float4(0, size.y, 0, 0) - displacementx * tilt, float3(uvDistortion.y + textureWaving.y, 1.0f, index));
+
+						// Bottom vertices
+						AppendVertex(triStream, grassPosition, displacement, fixed3(uvDistortion.x, 0.0f, index));
+						AppendVertex(triStream, grassPosition, -displacement, fixed3(uvDistortion.y, 0.0f, index));
+
+						triStream.RestartStrip();
+
+						//AppendVertex(triStream, grassPosition, half4(0, size.y * 2, 0, 0) + tilt, fixed3(0.5f + textureWaving.x, 2.0f, index));
+
+						// Top vertices (crossed)
+						AppendVertex(triStream, grassPosition, displacementx + float4(0, size.y, 0, 0) - displacement * tilt, float3(uvDistortion.x + textureWaving.x, 1.0f, index));
+						AppendVertex(triStream, grassPosition, -displacementx + float4(0, size.y, 0, 0) - displacement * tilt, float3(uvDistortion.y + textureWaving.y, 1.0f, index));
+
+						// Bottom vertices (crossed)
+						AppendVertex(triStream, grassPosition, displacementx, fixed3(uvDistortion.x, 0.0f, index));
+						AppendVertex(triStream, grassPosition, -displacementx, fixed3(uvDistortion.y, 0.0f, index));
+					}
+				}
+
+				// Fragment shader
+				void frag(FramentInput IN, out half4 outGBuffer0 : SV_Target0, out half4 outGBuffer1 : SV_Target1, out half4 outGBuffer2 : SV_Target2, out half4 outEmission : SV_Target3)
+				{
+					// Sample texture and multiply color
+					fixed4 c = UNITY_SAMPLE_TEX2DARRAY(_MainTex, IN.texcoord);
+
+					// Cutoff
+					clip(c.a - _Cutoff);
+
+					//c *= IN.color;
+					c *= fixed4(0.75, 0.75, 0.75, 1);
+
+					half3 worldPos = IN.position;
+
+					fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
+
+					#ifdef UNITY_COMPILER_HLSL
+						SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0;
+					#else
+						SurfaceOutputStandardSpecular o;
+					#endif
+
+					o.Albedo = c.rgb * _ColorIntensity;
+					o.Emission = 0.0f;
+					o.Alpha = c.a;
+					o.Occlusion = 1.0f;
+					o.Smoothness = 0.0f;
+					o.Specular = 0.0f;
+					o.Normal = fixed3(0, 1, 0); // This is used only for ambient occlusion
+
+					// Setup lighting environment
+					UnityGI gi;
+					UNITY_INITIALIZE_OUTPUT(UnityGI, gi);
+					gi.indirect.diffuse = 0;
+					gi.indirect.specular = 0;
+					gi.light.color = 0;
+					gi.light.dir = fixed3(0, 1, 0);
+
+					// Call GI (lightmaps/SH/reflections) lighting function
+					UnityGIInput giInput;
+					UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);
+					giInput.light = gi.light;
+					giInput.worldPos = worldPos;
+					giInput.worldViewDir = worldViewDir;
+					giInput.atten = 1;
+					giInput.lightmapUV = 0.0;
+
+					#if UNITY_SHOULD_SAMPLE_SH
+						giInput.ambient = IN.sh;
+					#else
+						giInput.ambient.rgb = 0.0;
+					#endif
+
+					giInput.probeHDR[0] = unity_SpecCube0_HDR;
+					giInput.probeHDR[1] = unity_SpecCube1_HDR;
+
+					#if defined( UNITY_SPECCUBE_BLENDING ) || defined( UNITY_SPECCUBE_BOX_PROJECTION )
+						giInput.boxMin[0] = unity_SpecCube0_BoxMin; // .w holds lerp value for blending
+					#endif
+
+					#ifdef UNITY_SPECCUBE_BOX_PROJECTION
+						giInput.boxMax[0] = unity_SpecCube0_BoxMax;
+						giInput.probePosition[0] = unity_SpecCube0_ProbePosition;
+						giInput.boxMax[1] = unity_SpecCube1_BoxMax;
+						giInput.boxMin[1] = unity_SpecCube1_BoxMin;
+						giInput.probePosition[1] = unity_SpecCube1_ProbePosition;
+					#endif
+
+						// Standard specular global illumination
+						LightingStandardSpecular_GI(o, giInput, gi);
+
+						// Call lighting function to output g-buffer
+						outEmission = LightingStandardSpecular_Deferred(o, worldViewDir, gi, outGBuffer0, outGBuffer1, outGBuffer2);
+						outGBuffer2.w = 0;
+					#ifndef UNITY_HDR_ON
+						outEmission.rgb = exp2(-outEmission.rgb);
+					#endif
+
+			}
+			ENDCG
+			}
+
+			Pass
+			{
+				Name "ShadowCaster"
+				Tags
+				{
+					"LightMode" = "ShadowCaster"
+				}
+				Cull Off
+				Blend Off
+				CGPROGRAM
+
+				// Includes
+				#include "UnityCG.cginc"
+
+				// Shader programs
+				#pragma vertex vert
+				#pragma geometry geom
+				#pragma fragment frag
+
+				// Compiler definitions
+				#pragma target 5.0
+				#pragma multi_compile_shadowcaster
+				//#pragma only_renderers d3d11
+
+				struct FramentInput
+				{
+					half3 texcoord : TEXCOORD0;
+					V2F_SHADOW_CASTER;
+					UNITY_VERTEX_OUTPUT_STEREO
+				};
+
+				inline void AppendVertex(inout TriangleStream<FramentInput> triStream, half4 worldPosition, half4 displacement, fixed3 uv)
+				{
+					FramentInput o;
+					UNITY_INITIALIZE_OUTPUT(FramentInput, o);
+
+					o.texcoord = uv;
+					o.pos = mul(UNITY_MATRIX_VP, worldPosition + displacement);
+					triStream.Append(o);
+				}
+
+				// Geometry shader
+				[maxvertexcount(8)]
+				void geom(point uint p[1] : TEXCOORD, inout TriangleStream<FramentInput> triStream)
+				{
+					// Initialize fragment input
+					FramentInput o;
+					UNITY_INITIALIZE_OUTPUT(FramentInput, o);
+
+					int index;
+					half tilt;
+					half4 grassPosition;
+					half4 size;
+					fixed2 uvDistortion, textureWaving;
+					fixed4 displacement, displacementx;
+
+					grassPosition = 0;
+					displacement = 0;
+					displacementx = 0;
+					size = 0;
+					tilt = 0;
+					uvDistortion = 0;
+					textureWaving = 0;
+					index = 0;
+
+					// Generate grass mesh
+					if (GemerateGeometry(p[0], grassPosition, displacement, displacementx, size, tilt, uvDistortion, textureWaving, index))
+					{
+						//float cameraDistance = distance(_WorldSpaceCameraPos.xyz, grassPosition.xyz);
+						//float3 right = cross(_ViewDir.xyz, float3(0, 1, 0)) * length(displacement);
+						//float4 faceCam = float4(right.xyz, displacement.w);
+
+						//AppendVertex(triStream, grassPosition, half4(0, size.y * 2, 0, 0) + tilt, fixed3(0.5f + textureWaving.x, 2.0f, index));
+
+						// Top vertices
+						AppendVertex(triStream, grassPosition, displacement + float4(0, size.y, 0, 0) + displacementx * tilt, float3(uvDistortion.x + textureWaving.x, 1.0f, index));
+						AppendVertex(triStream, grassPosition, -displacement + float4(0, size.y, 0, 0) - displacementx * tilt, float3(uvDistortion.y + textureWaving.y, 1.0f, index));
+
+						// Bottom vertices
+						AppendVertex(triStream, grassPosition, displacement, fixed3(uvDistortion.x, 0.0f, index));
+						AppendVertex(triStream, grassPosition, -displacement, fixed3(uvDistortion.y, 0.0f, index));
+
+						triStream.RestartStrip();
+
+						//AppendVertex(triStream, grassPosition, half4(0, size.y * 2, 0, 0) + tilt, fixed3(0.5f + textureWaving.x, 2.0f, index));
+
+						// Top vertices (crossed)
+						AppendVertex(triStream, grassPosition, displacementx + float4(0, size.y, 0, 0) - displacement * tilt, float3(uvDistortion.x + textureWaving.x, 1.0f, index));
+						AppendVertex(triStream, grassPosition, -displacementx + float4(0, size.y, 0, 0) - displacement * tilt, float3(uvDistortion.y + textureWaving.y, 1.0f, index));
+
+						// Bottom vertices (crossed)
+						AppendVertex(triStream, grassPosition, displacementx, fixed3(uvDistortion.x, 0.0f, index));
+						AppendVertex(triStream, grassPosition, -displacementx, fixed3(uvDistortion.y, 0.0f, index));
+					}
+				}
+
+				half4 frag(FramentInput IN) : SV_Target
+				{
+					// Sample texture and multiply color
+					fixed4 c = UNITY_SAMPLE_TEX2DARRAY(_MainTex, IN.texcoord);
+				// Cutoff
+				clip(c.a - _Cutoff);
+				SHADOW_CASTER_FRAGMENT(IN)
+			}
+			ENDCG
+		}
+		}
+}
diff --git a/Assets/Shaders/Dynamic/DynamicTerrainGrass.shader.meta b/Assets/Shaders/Dynamic/DynamicTerrainGrass.shader.meta
new file mode 100644
index 00000000..a00db580
--- /dev/null
+++ b/Assets/Shaders/Dynamic/DynamicTerrainGrass.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: cd675d8109e34104fa2267afa707fa09
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/DynamicTerrainStar.shader b/Assets/Shaders/Dynamic/DynamicTerrainStar.shader
new file mode 100644
index 00000000..116ee72e
--- /dev/null
+++ b/Assets/Shaders/Dynamic/DynamicTerrainStar.shader
@@ -0,0 +1,649 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: DynamicTerrainGrass.shader
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************﻿
+
+Shader "Terrain/DynamicTerrain/StarTree"
+{
+	Properties
+	{
+		_MainTex("Albedo (RGB)", 2DArray) = "white" {}
+		_NormalTex("Normal", 2DArray) = "bump" {}
+		_Cutoff("Cutoff", float) = 0.62
+		_TextureWaving("Grass Texture Waving ", float) = 0.01
+		_ColorIntensity("Color Intensity", Range(0, 1)) = 1
+		_FadeNear("Fade Near value", float) = 100.0
+		_FadeFar("Fade Far value", float) = 500.0
+		_FadeNearAmount("Fade Near Amount", float) = 50
+		_FadeFarAmount("Fade Near Amount", float) = 200
+	}
+
+		SubShader
+		{
+			Tags
+			{
+				"Queue" = "AlphaTest"
+				"RenderType" = "Opaque"
+				"DisableBatching" = "True"
+			}
+
+			CGINCLUDE
+
+			// ****** Includes ******
+			#include "UnityCG.cginc"
+			#include "UnityGBuffer.cginc"
+			#include "UnityStandardUtils.cginc"
+			#include "UnityPBSLighting.cginc"
+
+			#define PI 3.1415926535
+			#define PI2 6.283185307
+
+			// ****** Textures ******
+			UNITY_DECLARE_TEX2DARRAY(_MainTex);
+			UNITY_DECLARE_TEX2DARRAY(_NormalTex);
+			sampler2D _PerlinNoise;
+			sampler2D _ColorVariance;
+
+			// ****** Properties ******
+			fixed _Cutoff;
+			fixed _ColorIntensity;
+			half _TextureWaving;
+
+			half _FadeNear;
+			half _FadeFar;
+			half _FadeNearAmount;
+			half _FadeFarAmount;
+			half _Yoffset[16];
+
+			fixed3 _ViewDir;
+			half3 _TerrainSize;
+
+			half4 _MinMaxWidthHeight[16];
+			half4 _Quads[24];
+			fixed4 _FrustumPlanes[6];						// Frustum planes (6 planes * 4 floats: [ normal.x, normal.y, normal.z, distance ])
+			float4x4 _worldToObj;
+			//float4x4 _worldToScreen;
+
+			// ****** Grass point cloud ******
+			StructuredBuffer<float4> _PointBuffer;
+
+			// Vertex shader
+			uint vert(uint id : SV_VertexID, uint instanceID : SV_InstanceID) : TEXCOORD
+			{
+				return id + instanceID * 64000;
+			}
+
+			inline fixed2 MirrorCoordinates(fixed2 uv)
+			{
+				fixed2 t = frac(uv * 0.5f) * 2.0f;
+				fixed2 length = fixed2(1.0f, 1.0f);
+				return length - abs(t - length);
+			}
+
+			inline half3 RGBToHSV(half3 RGB)
+			{
+				half R = (RGB.x >= 1.0 ? 255 : RGB.x * 256.0);
+				half G = (RGB.y >= 1.0 ? 255 : RGB.y * 256.0);
+				half B = (RGB.z >= 1.0 ? 255 : RGB.z * 256.0);
+
+				half h = 0, s;
+
+				half v = max(max(R, G), B);
+				half Cmin = min(min(R, G), B);
+
+				half delta = v - Cmin;
+
+				if (v == 0.0) { s = 0; }
+				else { s = delta / v; }
+
+				if (s == 0) { h = 0.0; }
+				else
+				{
+					if (R == v)
+					{
+						h = (G - B) / delta;
+					}
+					else if (G == v)
+					{
+						h = 2 + (B - R) / delta;
+					}
+					else if (B == v)
+					{
+						h = 4 + (R - G) / delta;
+					}
+
+					h *= 60;
+					if (h < 0.0) { h = h + 360; }
+				}
+
+				return half3(h, s, (v / 255));
+			}
+
+			// Grass mesh generation
+			inline bool GemerateGeometry(in uint p, inout half4 grassPosition, inout half4 displacement, inout half4 displacementx, inout half4 size, inout half tilt, inout half tiltx, inout fixed4 bottomColor, inout fixed4 topColor, inout float2 uvDistortion, inout fixed2 textureWaving, inout int index)
+			{
+				// Get grass position from compute buffer
+				grassPosition = _PointBuffer[p];
+				half4 objPos = mul(_worldToObj, half4(grassPosition.xyz, 1));
+				half2 _uv = objPos.xz;
+				half4 uv = half4(_uv.xy, 1, 1);
+
+				//half4 colorVar = tex2Dlod(_ColorVariance, uv);
+				//fixed offset = 0.75f;
+				//colorVar = half4(colorVar.x + offset > 1 ? 1 : colorVar.x + offset, colorVar.y + offset > 1 ? 1 : colorVar.y + offset, colorVar.z + offset > 1 ? 1 : colorVar.z + offset, 0);
+
+				// Sample perlin noise
+				fixed4 perlinNoise = tex2Dlod(_PerlinNoise, uv);
+				half3 hsv = RGBToHSV(perlinNoise.xyz);
+
+				// Grass "random" number (0.0 - 1.0)
+				half random = frac(hsv.x);
+				//random = 1;
+
+				// Grass index
+				index = (int)grassPosition.w;
+
+				// Grass color
+				//fixed4 color = fixed4(colorVar.xyz, 1.0);
+				//color = fixed4(1.0, 1.0, 1.0, 1.0) * fixed4(_LightColor0.rgb.xyz, 1.0);
+
+				// Grass size
+				half4 minMaxWidthHeight = _MinMaxWidthHeight[index];
+				half2 s = lerp(minMaxWidthHeight.xz, minMaxWidthHeight.yw, random);
+
+				size = half4(s.x, s.y, s.x, random);
+				uvDistortion = ((uint) (grassPosition.w * 1000.0f)) % 2 ? fixed2(1.0f, 0) : fixed2(0.0f, 1.0f);
+
+				// Wind
+				textureWaving = fixed2(sin(_Time.w + PI * grassPosition.w), cos(_Time.w + PI * grassPosition.x)) * _TextureWaving;
+
+				// Generate grass quad
+				grassPosition = half4(grassPosition.xyz, 1.0f);
+
+				// Top vertices
+				topColor = fixed4(1,1,1,1);
+				bottomColor = topColor;
+				half sin;
+				half cos;
+
+				sincos(random * PI2, sin, cos);
+				displacement = fixed4(sin, 0, cos, 0) * 0.5 * size.y;
+				sincos(random * PI2 + PI / 2, sin, cos);
+				displacementx = fixed4(sin, 0, cos, 0) * 0.5 * size.y;
+
+				fixed3 normal = normalize(lerp(displacementx, fixed3(0, 1, 0), 0.75));
+				fixed3 normalx = normalize(lerp(displacement, fixed3(0, 1, 0), 0.75));
+
+				//tilt = dot(float3(0, 1, 0), -_ViewDir) * saturate(cameraDistance / 3);
+
+				fixed3 lookview = normalize(fixed3(0,0,0) - grassPosition.xyz);
+				lookview.y = 0;
+
+				tilt = dot(lookview, normal);
+				tiltx = dot(lookview, normalx);
+
+				//topColor.a = 1 - abs(tilt * 2);
+
+				//bottomColor = topColor * fixed4(0.75f, 0.75f, 0.75f, 1.0f);
+				return true;
+			}
+
+			ENDCG
+
+			Pass
+			{
+				Tags
+				{
+					"LightMode" = "Deferred"
+				}
+
+				Cull Off
+				Blend Off
+
+				CGPROGRAM
+				// Upgrade NOTE: excluded shader from DX11 because it uses wrong array syntax (type[size] name)
+				//#pragma exclude_renderers d3d11
+
+				// Shader programs
+				#pragma vertex vert
+				#pragma geometry geom
+				#pragma fragment frag
+
+				// Compiler definitions
+				#pragma target 5.0
+				//#pragma only_renderers d3d11
+				#pragma multi_compile_prepassfinal noshadowmask nodynlightmap nodirlightmap nolightmap noshadow 
+
+
+				// Fragment input
+				struct FramentInput
+				{
+					float4 position : SV_POSITION;
+					fixed3 texcoord : TEXCOORD0;
+					fixed3 worldNormal : NORMAL;
+					fixed4 color : COLOR;
+					half4 worldPosition : TEXCOORD1;
+					#if UNITY_SHOULD_SAMPLE_SH
+						half3 sh : TEXCOORD2;
+					#endif
+				};
+
+				inline void AppendVertex(inout TriangleStream<FramentInput> triStream, half4 worldPosition, fixed4 displacement, fixed3 worldNormal, fixed3 uv, fixed4 color)
+				{
+					FramentInput o;
+					o.position = mul(UNITY_MATRIX_VP, worldPosition + displacement);
+					o.worldPosition = worldPosition;
+					o.worldNormal = worldNormal;
+					o.texcoord = uv;
+					o.color = color;
+					#if UNITY_SHOULD_SAMPLE_SH
+						o.sh = 0;
+						o.sh = ShadeSHPerVertex(worldNormal, o.sh);
+					#endif
+					triStream.Append(o);
+				}
+
+				// Geometry shader
+				[maxvertexcount(32)]
+				void geom(point uint p[1] : TEXCOORD, inout TriangleStream<FramentInput> triStream)
+				{
+					// Initialize fragment input
+					FramentInput o;
+					UNITY_INITIALIZE_OUTPUT(FramentInput, o);
+
+					int index;
+					half tilt;
+					half tiltx;
+					half4 grassPosition;
+					half4 size;
+					fixed2 uvDistortion, textureWaving;
+					fixed4 displacement, displacementx;
+					fixed4 bottomColor, topColor;
+
+					grassPosition = 0;
+					displacement = 0;
+					displacementx = 0;
+					size = 0;
+					tilt = 0;
+					tiltx = 0;
+					bottomColor = 0;
+					topColor = 0;
+					uvDistortion = 0;
+					textureWaving = 0;
+					index = 0;
+
+					fixed3 upNormal = fixed3(0, 1, 0);
+
+					// Generate Star mesh
+					if (GemerateGeometry(p[0], grassPosition, displacement, displacementx, size, tilt, tiltx, bottomColor, topColor, uvDistortion, textureWaving, index))
+					{
+						half dist = distance(grassPosition.xyz, fixed3(0, 0, 0));
+
+						half fadeAmount = _FadeNearAmount;
+						half maxdist = 30000;
+						half fade = _FadeNear;
+						half transparency = 0;
+
+						half4 a1 = half4(0, size.y / 2, 0, 0);
+						half4 a2 = half4(0, size.y / 3, 0, 0);
+						half4 a3 = half4(0, (size.y / 3) * 2, 0, 0);
+						half4 a4 = half4(0, 0, 0, 0);
+						half4 a5 = half4(0, size.y, 0, 0);
+						half4 a6 = half4(0, size.y / 3, 0, 0);
+						half4 a7 = half4(0, (size.y / 3) * 2, 0, 0);
+						half4 a8 = half4(0, size.y / 2, 0, 0);
+
+						half4 b1 = half4(0, size.y / 6, 0, 0);
+						half4 b2 = half4(0, size.y / 3, 0, 0);
+						half4 b3 = half4(0, (size.y / 2), 0, 0);
+						half4 b4 = half4(0, size.y / 6, 0, 0);
+						half4 b5 = half4(0, (size.y / 6) * 5, 0, 0);
+						half4 b6 = half4(0, (size.y / 2), 0, 0);
+						half4 b7 = half4(0, (size.y / 3) * 2, 0, 0);
+						half4 b8 = half4(0, (size.y / 6) * 5, 0, 0);
+
+						//grassPosition.y -= _Yoffset[index] * size.y;
+
+						fixed yaw = dot(normalize(grassPosition + size.y / 2), upNormal);
+
+						if (dist < fade)
+						{
+							fade = 1 - (abs(fade - dist) / fadeAmount);
+							//fade = ((dist - (fadeDist - fadeAmount)) / fadeAmount);
+							//if (fade < 0) { fade = 0; }
+						}
+						if (dist > _FadeFar)
+						{
+							half value = 1 - ((dist - _FadeFar) / _FadeFarAmount);
+							fade = value < 1.0 ? value : 0.0;
+						}
+						// ************ side ************
+
+						if (tiltx <= 1 && tiltx >= -1)
+						{
+							if (dist < maxdist)
+							{
+								transparency = (abs(tilt) * 2) > 1 ? 1 : (abs(tilt) * 2);
+								topColor.a = transparency < fade ? transparency : fade;
+								bottomColor.a = topColor.a;
+							}
+
+							half4 side = _Quads[index * 3 + 1];
+
+							// First star
+
+							AppendVertex(triStream, grassPosition, -displacement + a1, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, -displacement / 3 + a2, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, -displacement / 3 + a3, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, a4, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, a5, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, displacement / 3 + a6, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, displacement / 3 + a7, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, displacement + a8, upNormal, fixed3(0.5, 0, index), topColor);
+
+							triStream.RestartStrip();
+
+							// second star
+
+							AppendVertex(triStream, grassPosition, (-displacement / 3) * 2 + b1, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, b2, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, (-displacement / 3) + b3, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, (displacement / 3) * 2 + b4, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, (-displacement / 3) * 2 + b5, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, (displacement / 3) + b6, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, b7, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, (displacement / 3) * 2 + b8, upNormal, fixed3(0.5, 0, index), topColor);
+
+						}
+
+						// ************ Front ************
+
+						if (tilt <= 1 && tilt >= -1)
+						{
+							if (dist < maxdist)
+							{
+								transparency = (abs(tiltx) * 2) > 1 ? 1 : (abs(tiltx) * 2);
+								topColor.a = transparency < fade ? transparency : fade;
+								bottomColor.a = topColor.a;
+							}
+
+							half4 front = _Quads[index * 3];
+
+							triStream.RestartStrip();
+
+							// First star
+
+							AppendVertex(triStream, grassPosition, -displacementx + a1, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, -displacementx / 3 + a2, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, -displacementx / 3 + a3, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, a4, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, a5, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, displacementx / 3 + a6, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, displacementx / 3 + a7, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, displacementx + a8, upNormal, fixed3(0.5, 0, index), topColor);
+
+							triStream.RestartStrip();
+
+							// second star
+
+							AppendVertex(triStream, grassPosition, (-displacementx / 3) * 2 + b1, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, b2, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, (-displacementx / 3) + b3, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, (displacementx / 3) * 2 + b4, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, (-displacementx / 3) * 2 + b5, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, (displacementx / 3) + b6, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, b7, upNormal, fixed3(0.5, 0, index), topColor);
+							AppendVertex(triStream, grassPosition, (displacementx / 3) * 2 + b8, upNormal, fixed3(0.5, 0, index), topColor);
+
+						}
+					}
+				}
+
+				// Fragment shader
+				void frag(FramentInput IN, out half4 outGBuffer0 : SV_Target0, out half4 outGBuffer1 : SV_Target1, out half4 outGBuffer2 : SV_Target2, out half4 outEmission : SV_Target3)
+				{
+					// Sample texture and multiply color
+					fixed4 c = UNITY_SAMPLE_TEX2DARRAY(_MainTex, IN.texcoord);
+					fixed3 n = UNITY_SAMPLE_TEX2DARRAY(_NormalTex, IN.texcoord);
+
+					const half4x4 thresholdMatrix =
+					{
+						1, 9, 3, 11,
+						13, 5, 15, 7,
+						4, 12, 2, 10,
+						16, 8, 14, 6
+					};
+
+					//float3 screenPos = mul(_worldToScreen, IN.position);
+
+					fixed threshold = thresholdMatrix[IN.position.x % 4][IN.position.y % 4] / 17;
+
+					if (threshold >= IN.color.a)
+					{
+						discard;
+					}
+
+					// Cutoff
+					//clip((c.a - _Cutoff));
+					c *= IN.color;
+
+					half3 worldPos = IN.worldPosition;
+
+					fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
+
+					#ifdef UNITY_COMPILER_HLSL
+						SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0;
+					#else
+						SurfaceOutputStandardSpecular o;
+					#endif
+
+					o.Albedo = c.rgb * _ColorIntensity;
+					o.Emission = 0.0f;
+					o.Alpha = c.a;
+					o.Occlusion = 1.0f;
+					o.Smoothness = 0.0f;
+					o.Specular = 0.0f;
+					//o.Normal = n;
+					o.Normal = IN.worldNormal; // This is used only for ambient occlusion
+
+					// Setup lighting environment
+					UnityGI gi;
+					UNITY_INITIALIZE_OUTPUT(UnityGI, gi);
+					gi.indirect.diffuse = 0;
+					gi.indirect.specular = 0;
+					gi.light.color = 0;
+					gi.light.dir = fixed3(0, 1, 0);
+
+					// Call GI (lightmaps/SH/reflections) lighting function
+					UnityGIInput giInput;
+					UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);
+					giInput.light = gi.light;
+					giInput.worldPos = worldPos;
+					giInput.worldViewDir = worldViewDir;
+					giInput.atten = 1;
+					giInput.lightmapUV = 0.0;
+
+					#if UNITY_SHOULD_SAMPLE_SH
+						giInput.ambient = IN.sh;
+					#else
+						giInput.ambient.rgb = 0.0;
+					#endif
+
+					giInput.probeHDR[0] = unity_SpecCube0_HDR;
+					giInput.probeHDR[1] = unity_SpecCube1_HDR;
+
+					#if defined( UNITY_SPECCUBE_BLENDING ) || defined( UNITY_SPECCUBE_BOX_PROJECTION )
+						giInput.boxMin[0] = unity_SpecCube0_BoxMin; // .w holds lerp value for blending
+					#endif
+
+					#ifdef UNITY_SPECCUBE_BOX_PROJECTION
+						giInput.boxMax[0] = unity_SpecCube0_BoxMax;
+						giInput.probePosition[0] = unity_SpecCube0_ProbePosition;
+						giInput.boxMax[1] = unity_SpecCube1_BoxMax;
+						giInput.boxMin[1] = unity_SpecCube1_BoxMin;
+						giInput.probePosition[1] = unity_SpecCube1_ProbePosition;
+					#endif
+
+						// Standard specular global illumination
+						LightingStandardSpecular_GI(o, giInput, gi);
+
+						// Call lighting function to output g-buffer
+						outEmission = LightingStandardSpecular_Deferred(o, worldViewDir, gi, outGBuffer0, outGBuffer1, outGBuffer2);
+						outGBuffer2.w = 0;
+					#ifndef UNITY_HDR_ON
+						outEmission.rgb = exp2(-outEmission.rgb);
+					#endif
+
+				}
+				ENDCG
+				}
+
+			Pass
+			{
+				Name "ShadowCaster"
+				Tags
+				{
+					"LightMode" = "ShadowCaster"
+				}
+				Cull Off
+				Blend Off
+				CGPROGRAM
+
+					// Includes
+					#include "UnityCG.cginc"
+
+					// Shader programs
+					#pragma vertex vert
+					#pragma geometry geom
+					#pragma fragment frag
+
+					// Compiler definitions
+					#pragma target 5.0
+					#pragma multi_compile_shadowcaster
+					//#pragma only_renderers d3d11
+
+					struct FramentInput
+					{
+						fixed3 texcoord : TEXCOORD0;
+						V2F_SHADOW_CASTER;
+						UNITY_VERTEX_OUTPUT_STEREO
+					};
+
+					inline void AppendVertex(inout TriangleStream<FramentInput> triStream, half4 worldPosition, fixed4 displacement, fixed3 worldNormal, fixed3 uv, fixed4 color)
+					{
+						FramentInput o;
+						UNITY_INITIALIZE_OUTPUT(FramentInput, o);
+						o.texcoord = uv;
+						o.pos = mul(UNITY_MATRIX_VP, worldPosition + displacement);
+						triStream.Append(o);
+					}
+
+					// Geometry shader
+					[maxvertexcount(4)]
+					void geom(point uint p[1] : TEXCOORD, inout TriangleStream<FramentInput> triStream)
+					{
+						// Initialize fragment input
+						FramentInput o;
+						UNITY_INITIALIZE_OUTPUT(FramentInput, o);
+
+						int index;
+						half tilt;
+						half tiltx;
+						half4 grassPosition;
+						half4 size;
+						fixed2 uvDistortion, textureWaving;
+						fixed4 displacement, displacementx;
+						fixed4 bottomColor, topColor;
+
+						grassPosition = 0;
+						displacement = 0;
+						displacementx = 0;
+						size = 0;
+						tilt = 0;
+						tiltx = 0;
+						bottomColor = 0;
+						topColor = 0;
+						uvDistortion = 0;
+						textureWaving = 0;
+						index = 0;
+
+						fixed3 upNormal = fixed3(0, 1, 0);
+
+						// Generate grass mesh
+						if (GemerateGeometry(p[0], grassPosition, displacement, displacementx, size, tilt, tiltx, bottomColor, topColor, uvDistortion, textureWaving, index))
+						{
+							half dist = distance(grassPosition.xyz, fixed3(0, 0, 0));
+							grassPosition.y -= _Yoffset[index] * size.y;
+
+							half yaw = dot(normalize(grassPosition + size.y / 2), upNormal);
+
+							// ************ Side ************
+							if (tiltx <= 0.5 && tiltx >= -0.5)
+							{
+								half4 side = _Quads[index * 3 + 1];
+
+								// Top vertices
+								AppendVertex(triStream, grassPosition, displacement * ((0.5 - side.x) * 2) + half4(0, size.y, 0, 0), upNormal, fixed3((side.x * 0.5) + textureWaving.x, 0.5, index), topColor);
+								AppendVertex(triStream, grassPosition, -displacement * ((side.y - 0.5) * 2) + half4(0, size.y, 0, 0), upNormal, fixed3((side.y * 0.5) + textureWaving.y, 0.5, index), topColor);
+
+								// Bottom vertices
+								AppendVertex(triStream, grassPosition, displacement * ((0.5 - side.x) * 2), upNormal, fixed3((side.x * 0.5), 0, index), bottomColor);
+								AppendVertex(triStream, grassPosition, -displacement * ((side.y - 0.5) * 2), upNormal, fixed3((side.y * 0.5), 0, index), bottomColor);
+							}
+							else // ************ Front ************
+							{
+								//triStream.RestartStrip();
+								half4 front = _Quads[index * 3];
+
+								// Top vertices (crossed)
+								AppendVertex(triStream, grassPosition, displacementx * ((0.5 - front.x) * 2) + half4(0, size.y, 0, 0), displacementx, fixed3((front.x * 0.5) + textureWaving.x, 1, index), topColor);
+								AppendVertex(triStream, grassPosition, -displacementx * ((front.y - 0.5) * 2) + half4(0, size.y, 0, 0), -displacementx, fixed3((front.y * 0.5) + textureWaving.y, 1, index), topColor);
+
+								// Bottom vertices (crossed)
+								AppendVertex(triStream, grassPosition, displacementx * ((0.5 - front.x) * 2), displacementx, fixed3((front.x * 0.5), 0.5, index), bottomColor);
+								AppendVertex(triStream, grassPosition, -displacementx * ((front.y - 0.5) * 2), -displacementx, fixed3((front.y * 0.5), 0.5, index), bottomColor);
+							}
+
+						}
+					}
+
+					half4 frag(FramentInput IN) : SV_Target
+					{
+						// Sample texture and multiply color
+						fixed4 c = UNITY_SAMPLE_TEX2DARRAY(_MainTex, IN.texcoord);
+
+					// Cutoff
+					//clip((c.a - _Cutoff));
+
+				SHADOW_CASTER_FRAGMENT(IN)
+			}
+		ENDCG
+		}
+		}
+}
diff --git a/Assets/Shaders/Dynamic/DynamicTerrainStar.shader.meta b/Assets/Shaders/Dynamic/DynamicTerrainStar.shader.meta
new file mode 100644
index 00000000..1f9f3c40
--- /dev/null
+++ b/Assets/Shaders/Dynamic/DynamicTerrainStar.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 82aae3234faa38843899c61a8dc2eca9
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/DynamicTerrainTree.shader b/Assets/Shaders/Dynamic/DynamicTerrainTree.shader
new file mode 100644
index 00000000..9d29d801
--- /dev/null
+++ b/Assets/Shaders/Dynamic/DynamicTerrainTree.shader
@@ -0,0 +1,680 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: DynamicTerrainGrass.shader
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************﻿
+
+Shader "Terrain/DynamicTerrain/Tree"
+{
+	Properties
+	{
+		_MainTex("Albedo (RGB)", 2DArray) = "white" {}
+		_NormalTex("Normal", 2DArray) = "bump" {}
+		_Cutoff("Cutoff", float) = 0.62
+		_TextureWaving("Grass Texture Waving ", float) = 0.01
+		_ColorIntensity("Color Intensity", Range(0, 1)) = 1
+		_FadeNear("Fade Near value", float) = 100.0
+		_FadeFar("Fade Far value", float) = 500.0
+		_FadeNearAmount("Fade Near Amount", float) = 50
+		_FadeFarAmount("Fade Near Amount", float) = 200
+	}
+
+		SubShader
+		{
+			Tags
+			{
+				"Queue" = "AlphaTest"
+				"RenderType" = "Opaque"
+				"DisableBatching" = "True"
+			}
+
+			CGINCLUDE
+
+			// ****** Includes ******
+			#include "UnityCG.cginc"
+			#include "UnityGBuffer.cginc"
+			#include "UnityStandardUtils.cginc"
+			#include "UnityPBSLighting.cginc"
+
+			#define PI 3.1415926535
+			#define PI2 6.283185307
+
+			// ****** Textures ******
+			UNITY_DECLARE_TEX2DARRAY(_MainTex);
+			UNITY_DECLARE_TEX2DARRAY(_NormalTex);
+			sampler2D _DepthTexture;
+			sampler2D _PerlinNoise;
+			sampler2D _ColorVariance;
+
+			// ****** Properties ******
+
+			fixed _Cutoff;
+			fixed _ColorIntensity;
+			half _TextureWaving;
+
+			half _FadeNear;
+			half _FadeFar;
+			half _FadeNearAmount;
+			half _FadeFarAmount;
+			half _Yoffset[16];
+
+			fixed3 _ViewDir;
+			half3 _TerrainSize;
+
+			half4 _MinMaxWidthHeight[16];
+			half4 _Quads[24];
+			fixed4 _FrustumPlanes[6];						// Frustum planes (6 planes * 4 floats: [ normal.x, normal.y, normal.z, distance ])
+			float4x4 _worldToObj;
+
+			// ****** Grass point cloud ******
+			StructuredBuffer<float4> _PointBuffer;
+
+			// Vertex shader
+			uint vert(uint id : SV_VertexID, uint instanceID : SV_InstanceID) : TEXCOORD
+			{
+				return id + instanceID * 64000;
+			}
+
+			inline fixed2 MirrorCoordinates(fixed2 uv)
+			{
+				fixed2 t = frac(uv * 0.5f) * 2.0f;
+				fixed2 length = fixed2(1.0f, 1.0f);
+				return length - abs(t - length);
+			}
+
+			inline half3 RGBToHSV(half3 RGB)
+			{
+				half R = (RGB.x >= 1.0 ? 255 : RGB.x * 256.0);
+				half G = (RGB.y >= 1.0 ? 255 : RGB.y * 256.0);
+				half B = (RGB.z >= 1.0 ? 255 : RGB.z * 256.0);
+
+				half h = 0, s;
+
+				half v = max(max(R, G), B);
+				half Cmin = min(min(R, G), B);
+
+				half delta = v - Cmin;
+
+				if (v == 0.0) { s = 0; }
+				else { s = delta / v; }
+
+				if (s == 0) { h = 0.0; }
+				else
+				{
+					if (R == v)
+					{
+						h = (G - B) / delta;
+					}
+					else if (G == v)
+					{
+						h = 2 + (B - R) / delta;
+					}
+					else if (B == v)
+					{
+						h = 4 + (R - G) / delta;
+					}
+
+					h *= 60;
+					if (h < 0.0) { h = h + 360; }
+				}
+
+				return half3(h, s, (v / 255));
+			}
+
+			inline fixed2 WorldToScreenPos(fixed3 pos)
+			{
+				pos = normalize(pos - _WorldSpaceCameraPos) * (_ProjectionParams.y + (_ProjectionParams.z - _ProjectionParams.y)) + _WorldSpaceCameraPos;
+				fixed2 uv = 0;
+				fixed3 toCam = mul(unity_WorldToCamera, pos);
+				fixed camPosZ = toCam.z;
+				fixed height = 2 * camPosZ / unity_CameraProjection._m11;
+				fixed width = _ScreenParams.x / _ScreenParams.y * height;
+				uv.x = (toCam.x + width / 2) / width;
+				uv.y = (toCam.y + height / 2) / height;
+				return uv;
+			}
+
+			inline bool IsVisable(half4 position, half dist, float farClip, half3 offset)
+			{
+				half2 screenPosUV = WorldToScreenPos(position.xyz + offset);
+
+				half2 pixel = half2(1 / _ScreenParams.x, 1 / _ScreenParams.y);
+
+				float depth = tex2Dlod(_DepthTexture, half4(screenPosUV, 1, 1)).g;
+				depth = (depth * farClip);
+
+				if (depth < dist - 50)
+				{
+					return false;
+				}
+				return true;
+			}
+
+			inline bool Cull(half4 position, half4 size)
+			{
+				float farClip = _ProjectionParams.z;
+				float3 forward = mul((float3x3)unity_CameraToWorld, float3(0, 0, 1));
+
+				half dist = dot(forward, position.xyz);
+			
+				bool mid = IsVisable(position, dist, farClip, half3(0, size.y / 2, 0));
+				bool top = IsVisable(position, dist, farClip, half3(0, size.y, 0));
+
+				if (dist > 500)
+				{
+					return !(mid || top);
+				}
+
+				bool bottom = IsVisable(position, dist, farClip, half3(0, 0, 0));
+				bool bottom2 = IsVisable(position, dist, farClip, half3(0, size.y / 4, 0));
+				bool right = IsVisable(position, dist, farClip, half3(2 * (size.x / 3), size.y / 2, 0));
+				bool left = IsVisable(position, dist, farClip, half3(-2 * (size.x / 3), size.y / 2, 0));
+				
+				return !(mid || top || bottom || bottom2 || right || left);
+			}
+
+			// Grass mesh generation
+			inline bool GemerateGeometry(in uint p, inout half4 grassPosition, inout half4 displacement, inout half4 displacementx, inout half4 size, inout half tilt, inout half tiltx, inout fixed4 bottomColor, inout fixed4 topColor, inout float2 uvDistortion, inout fixed2 textureWaving, inout int index, bool Culling)
+			{
+				// Get grass position from compute buffer
+				grassPosition = _PointBuffer[p];
+				half4 objPos = mul(_worldToObj, half4(grassPosition.xyz, 1));
+
+				half2 _uv = floor(objPos.xz*10) * 0.1;
+				half4 uv = half4(_uv.xy, 1, 1);
+
+				//half4 colorVar = tex2Dlod(_ColorVariance, uv);
+				//fixed offset = 0.75f;
+				//colorVar = half4(colorVar.x + offset > 1 ? 1 : colorVar.x + offset, colorVar.y + offset > 1 ? 1 : colorVar.y + offset, colorVar.z + offset > 1 ? 1 : colorVar.z + offset, 0);
+
+				// Sample perlin noise
+				fixed4 perlinNoise = tex2Dlod(_PerlinNoise, uv);
+				half3 hsv = RGBToHSV(perlinNoise.xyz);
+
+				// Grass "random" number (0.0 - 1.0)
+				half random = frac(hsv.x);
+				//random = 1;
+
+				// Grass index
+				index = (int)grassPosition.w;
+
+				// Grass color
+				//fixed4 color = fixed4(colorVar.xyz, 1.0);
+				//color = fixed4(1.0, 1.0, 1.0, 1.0) * fixed4(_LightColor0.rgb.xyz, 1.0);
+
+				// Grass size
+				half4 minMaxWidthHeight = _MinMaxWidthHeight[index];
+				half2 s = lerp(minMaxWidthHeight.xz, minMaxWidthHeight.yw, random);
+
+				size = half4(s.x, s.y, s.x, random);
+				uvDistortion = ((uint) (grassPosition.w * 1000.0f)) % 2 ? fixed2(1.0f, 0) : fixed2(0.0f, 1.0f);
+
+				// cull
+				if (Culling)
+				{
+					if (Cull(grassPosition, size))
+						return false;
+				}
+
+				// Wind
+				textureWaving = fixed2(sin(_Time.w + PI * grassPosition.w), cos(_Time.w + PI * grassPosition.x)) * _TextureWaving;
+
+				// Generate grass quad
+				grassPosition = half4(grassPosition.xyz, 1.0f);
+
+				// Top vertices
+				topColor = fixed4(1,1,1,1);
+				bottomColor = topColor;
+				half sin;
+				half cos;
+
+				sincos(random * PI2, sin, cos);
+				displacement = fixed4(sin, 0, cos, 0) * 0.5 * size.y;
+				sincos(random * PI2 + PI / 2, sin, cos);
+				displacementx = fixed4(sin, 0, cos, 0) * 0.5 * size.y;
+
+				fixed3 normal = normalize(lerp(displacementx, fixed3(0, 1, 0), 0.75));
+				fixed3 normalx = normalize(lerp(displacement, fixed3(0, 1, 0), 0.75));
+
+				//tilt = dot(float3(0, 1, 0), -_ViewDir) * saturate(cameraDistance / 3);
+
+				fixed3 lookview = normalize(_WorldSpaceCameraPos - grassPosition.xyz);
+				lookview.y = 0;
+
+				tilt = dot(lookview, normal);
+				tiltx = dot(lookview, normalx);
+
+				//topColor.a = 1 - abs(tilt * 2);
+
+				//bottomColor = topColor * fixed4(0.75f, 0.75f, 0.75f, 1.0f);
+				return true;
+			}
+
+			ENDCG
+
+			Pass
+			{
+				Tags
+				{
+					"LightMode" = "Deferred"
+				}
+
+				Cull Off
+				Blend Off
+
+				CGPROGRAM
+				// Upgrade NOTE: excluded shader from DX11 because it uses wrong array syntax (type[size] name)
+				//#pragma exclude_renderers d3d11
+
+				// Shader programs
+				#pragma vertex vert
+				#pragma geometry geom
+				#pragma fragment frag
+
+				// Compiler definitions
+				#pragma target 5.0
+				//#pragma only_renderers d3d11
+				#pragma multi_compile_prepassfinal noshadowmask nodynlightmap nodirlightmap nolightmap noshadow 
+
+				// Fragment input
+				struct FramentInput
+				{
+					float4 position : SV_POSITION;
+					fixed3 texcoord : TEXCOORD0;
+					fixed3 worldNormal : NORMAL;
+					fixed4 color : COLOR;
+					half4 worldPosition : TEXCOORD1;
+					#if UNITY_SHOULD_SAMPLE_SH
+						half3 sh : TEXCOORD2;
+					#endif
+				};
+
+				inline void AppendVertex(inout TriangleStream<FramentInput> triStream, half4 worldPosition, fixed4 displacement, fixed3 worldNormal, fixed3 uv, fixed4 color)
+				{
+					FramentInput o;
+					o.position = mul(UNITY_MATRIX_VP, worldPosition + displacement);
+					o.worldPosition = worldPosition;
+					o.worldNormal = worldNormal;
+					o.texcoord = uv;
+					o.color = color;
+					#if UNITY_SHOULD_SAMPLE_SH
+						o.sh = 0;
+						o.sh = ShadeSHPerVertex(worldNormal, o.sh);
+					#endif
+					triStream.Append(o);
+				}
+
+				// Geometry shader
+				[maxvertexcount(12)]
+				void geom(point uint p[1] : TEXCOORD, inout TriangleStream<FramentInput> triStream)
+				{
+					// Initialize fragment input
+					FramentInput o;
+					UNITY_INITIALIZE_OUTPUT(FramentInput, o);
+
+					int index;
+					half tilt;
+					half tiltx;
+					half4 grassPosition;
+					half4 size;
+					fixed2 uvDistortion, textureWaving;
+					fixed4 displacement, displacementx;
+					fixed4 bottomColor, topColor;
+					bool culling = false;
+
+					grassPosition = 0;
+					displacement = 0;
+					displacementx = 0;
+					size = 0;
+					tilt = 0;
+					tiltx = 0;
+					bottomColor = 0;
+					topColor = 0;
+					uvDistortion = 0;
+					textureWaving = 0;
+					index = 0;
+
+					fixed3 upNormal = fixed3(0, 1, 0);
+
+					// Generate grass mesh
+					if (GemerateGeometry(p[0], grassPosition, displacement, displacementx, size, tilt, tiltx, bottomColor, topColor, uvDistortion, textureWaving, index, culling))
+					{
+						half dist = distance(grassPosition.xyz, _WorldSpaceCameraPos);
+
+						half fadeAmount = _FadeNearAmount;
+						half maxdist = 30000;
+						half fade = _FadeNear;
+						half transparency = 0;
+
+						grassPosition.y -= _Yoffset[index] * size.y;
+
+						fixed yaw = dot(normalize((grassPosition + size.y / 2) - _WorldSpaceCameraPos), upNormal);
+
+						if (dist < fade)
+						{
+							fade = 1 - (abs(fade - dist) / fadeAmount);
+							//fade = ((dist - (fadeDist - fadeAmount)) / fadeAmount);
+							//if (fade < 0) { fade = 0; }
+						}
+						if (dist > _FadeFar)
+						{
+							half value = 1 - ((dist - _FadeFar) / _FadeFarAmount);
+							fade = value < 1.0 ? value : 0.0;
+						}
+						// ************ side ************
+
+						if (tiltx <= 1 && tiltx >= -1)
+						{
+							if (dist < maxdist)
+							{
+								transparency = (abs(tilt) * 2) > 1 ? 1 : (abs(tilt) * 2);
+								topColor.a = transparency < fade ? transparency : fade;
+								bottomColor.a = topColor.a;
+							}
+
+							half4 side = _Quads[index * 3 + 1];
+
+							// Top vertices
+							AppendVertex(triStream, grassPosition, displacement * ((0.5 - side.x) * 2) + half4(0, size.y, 0, 0), upNormal, fixed3((side.x * 0.5) + textureWaving.x, 0.5, index), topColor);
+							AppendVertex(triStream, grassPosition, -displacement * ((side.y - 0.5) * 2) + half4(0, size.y, 0, 0), upNormal, fixed3((side.y * 0.5) + textureWaving.y, 0.5, index), topColor);
+
+							// Bottom vertices
+							AppendVertex(triStream, grassPosition, displacement * ((0.5 - side.x) * 2), upNormal, fixed3((side.x * 0.5), 0, index), bottomColor);
+							AppendVertex(triStream, grassPosition, -displacement * ((side.y - 0.5) * 2), upNormal, fixed3((side.y * 0.5), 0, index), bottomColor);
+						}
+
+						// ************ Front ************
+
+						if (tilt <= 1 && tilt >= -1)
+						{
+							if (dist < maxdist)
+							{
+								transparency = (abs(tiltx) * 2) > 1 ? 1 : (abs(tiltx) * 2);
+								topColor.a = transparency < fade ? transparency : fade;
+								bottomColor.a = topColor.a;
+							}
+
+							triStream.RestartStrip();
+
+							half4 front = _Quads[index * 3];
+
+							// Top vertices (crossed)
+							AppendVertex(triStream, grassPosition, displacementx * ((0.5 - front.x) * 2) + half4(0, size.y, 0, 0), upNormal, fixed3((front.x * 0.5) + textureWaving.x, 1, index), topColor);
+							AppendVertex(triStream, grassPosition, -displacementx * ((front.y - 0.5) * 2) + half4(0, size.y, 0, 0), upNormal, fixed3((front.y * 0.5) + textureWaving.y, 1, index), topColor);
+
+							// Bottom vertices (crossed)
+							AppendVertex(triStream, grassPosition, displacementx * ((0.5 - front.x) * 2), upNormal, fixed3((front.x * 0.5), 0.5, index), bottomColor);
+							AppendVertex(triStream, grassPosition, -displacementx * ((front.y - 0.5) * 2), upNormal, fixed3((front.y * 0.5), 0.5, index), bottomColor);
+						}
+
+						// ************ Top ************
+
+						if (yaw < 0)
+						{
+							if (dist < maxdist)
+							{
+								transparency = (abs(yaw * 4)) > 1 ? 1 : (abs(yaw * 4));
+								topColor.a = transparency < fade ? transparency : fade;
+								bottomColor.a = topColor.a;
+							}
+
+							triStream.RestartStrip();
+
+							half4 Top = _Quads[index * 3 + 2];
+
+							// Top vertices (crossed)
+							AppendVertex(triStream, grassPosition, displacementx * ((0.5 - Top.x) * 2) + half4(0, size.y / 2, 0, 0) + (displacement * ((Top.w - 0.5) * 2)), upNormal, fixed3((0.5 * Top.x) + 0.5, Top.w * 0.5, index), topColor);
+							AppendVertex(triStream, grassPosition, -displacementx * ((Top.y - 0.5) * 2) + half4(0, size.y / 2, 0, 0) + (displacement * ((Top.w - 0.5) * 2)), upNormal, fixed3((0.5 * Top.y) + 0.5, Top.w * 0.5, index), topColor);
+
+							// Bottom vertices (crossed)
+							AppendVertex(triStream, grassPosition, displacementx * ((0.5 - Top.x) * 2) + half4(0, size.y / 2, 0, 0) - (displacement * ((0.5 - Top.z) * 2)), upNormal, fixed3((0.5 * Top.x) + 0.5, 0.5 * Top.z, index), bottomColor);
+							AppendVertex(triStream, grassPosition, -displacementx * ((Top.y - 0.5) * 2) + half4(0, size.y / 2, 0, 0) - (displacement * ((0.5 - Top.z) * 2)), upNormal, fixed3((0.5 * Top.y) + 0.5, 0.5 * Top.z, index), bottomColor);
+						}
+					}
+				}
+
+				// Fragment shader
+				void frag(FramentInput IN, out half4 outGBuffer0 : SV_Target0, out half4 outGBuffer1 : SV_Target1, out half4 outGBuffer2 : SV_Target2, out half4 outEmission : SV_Target3)
+				{
+					// Sample texture and multiply color
+					fixed4 c = UNITY_SAMPLE_TEX2DARRAY(_MainTex, IN.texcoord);
+					fixed3 n = UNITY_SAMPLE_TEX2DARRAY(_NormalTex, IN.texcoord);
+
+					const half4x4 thresholdMatrix =
+					{
+						1, 9, 3, 11,
+						13, 5, 15, 7,
+						4, 12, 2, 10,
+						16, 8, 14, 6
+					};
+
+					fixed threshold = thresholdMatrix[IN.position.x % 4][IN.position.y % 4] / 17;
+
+					if (threshold >= IN.color.a)
+					{
+						discard;
+					}
+
+					// Cutoff
+					clip((c.a - _Cutoff));
+					c *= IN.color;
+
+					half3 worldPos = IN.worldPosition;
+
+					fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
+
+					#ifdef UNITY_COMPILER_HLSL
+						SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0;
+					#else
+						SurfaceOutputStandardSpecular o;
+					#endif
+
+					o.Albedo = c.rgb * _ColorIntensity;
+					o.Emission = 0.0f;
+					o.Alpha = c.a;
+					o.Occlusion = 1.0f;
+					o.Smoothness = 0.0f;
+					o.Specular = 0.0f;
+					o.Normal = IN.worldNormal; // This is used only for ambient occlusion
+
+					// Setup lighting environment
+					UnityGI gi;
+					UNITY_INITIALIZE_OUTPUT(UnityGI, gi);
+					gi.indirect.diffuse = 0;
+					gi.indirect.specular = 0;
+					gi.light.color = 0;
+					gi.light.dir = fixed3(0, 1, 0);
+
+					// Call GI (lightmaps/SH/reflections) lighting function
+					UnityGIInput giInput;
+					UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);
+					giInput.light = gi.light;
+					giInput.worldPos = worldPos;
+					giInput.worldViewDir = worldViewDir;
+					giInput.atten = 1;
+					giInput.lightmapUV = 0.0;
+
+					#if UNITY_SHOULD_SAMPLE_SH
+						giInput.ambient = IN.sh;
+					#else
+						giInput.ambient.rgb = 0.0;
+					#endif
+
+					giInput.probeHDR[0] = unity_SpecCube0_HDR;
+					giInput.probeHDR[1] = unity_SpecCube1_HDR;
+
+					#if defined( UNITY_SPECCUBE_BLENDING ) || defined( UNITY_SPECCUBE_BOX_PROJECTION )
+						giInput.boxMin[0] = unity_SpecCube0_BoxMin; // .w holds lerp value for blending
+					#endif
+
+					#ifdef UNITY_SPECCUBE_BOX_PROJECTION
+						giInput.boxMax[0] = unity_SpecCube0_BoxMax;
+						giInput.probePosition[0] = unity_SpecCube0_ProbePosition;
+						giInput.boxMax[1] = unity_SpecCube1_BoxMax;
+						giInput.boxMin[1] = unity_SpecCube1_BoxMin;
+						giInput.probePosition[1] = unity_SpecCube1_ProbePosition;
+					#endif
+
+						// Standard specular global illumination
+						LightingStandardSpecular_GI(o, giInput, gi);
+
+						// Call lighting function to output g-buffer
+						outEmission = LightingStandardSpecular_Deferred(o, worldViewDir, gi, outGBuffer0, outGBuffer1, outGBuffer2);
+						outGBuffer2.w = 0;
+					#ifndef UNITY_HDR_ON
+						outEmission.rgb = exp2(-outEmission.rgb);
+					#endif
+
+				}
+				ENDCG
+				}
+
+			Pass
+			{
+				Name "ShadowCaster"
+				Tags
+				{
+					"LightMode" = "ShadowCaster"
+				}
+				Cull Off
+				Blend Off
+				CGPROGRAM
+
+					// Includes
+					#include "UnityCG.cginc"
+
+					// Shader programs
+					#pragma vertex vert
+					#pragma geometry geom
+					#pragma fragment frag
+
+					// Compiler definitions
+					#pragma target 5.0
+					#pragma multi_compile_shadowcaster
+					//#pragma only_renderers d3d11
+
+					struct FramentInput
+					{
+						fixed3 texcoord : TEXCOORD0;
+						V2F_SHADOW_CASTER;
+						UNITY_VERTEX_OUTPUT_STEREO
+					};
+
+					inline void AppendVertex(inout TriangleStream<FramentInput> triStream, half4 worldPosition, fixed4 displacement, fixed3 worldNormal, fixed3 uv, fixed4 color)
+					{
+						FramentInput o;
+						UNITY_INITIALIZE_OUTPUT(FramentInput, o);
+						o.texcoord = uv;
+						o.pos = mul(UNITY_MATRIX_VP, worldPosition + displacement);
+						triStream.Append(o);
+					}
+
+					// Geometry shader
+					[maxvertexcount(4)]
+					void geom(point uint p[1] : TEXCOORD, inout TriangleStream<FramentInput> triStream)
+					{
+						// Initialize fragment input
+						FramentInput o;
+						UNITY_INITIALIZE_OUTPUT(FramentInput, o);
+
+						int index;
+						half tilt;
+						half tiltx;
+						half4 grassPosition;
+						half4 size;
+						fixed2 uvDistortion, textureWaving;
+						fixed4 displacement, displacementx;
+						fixed4 bottomColor, topColor;
+						bool culling = false;
+
+						grassPosition = 0;
+						displacement = 0;
+						displacementx = 0;
+						size = 0;
+						tilt = 0;
+						tiltx = 0;
+						bottomColor = 0;
+						topColor = 0;
+						uvDistortion = 0;
+						textureWaving = 0;
+						index = 0;
+
+						fixed3 upNormal = fixed3(0, 1, 0);
+
+						// Generate grass mesh
+						if (GemerateGeometry(p[0], grassPosition, displacement, displacementx, size, tilt, tiltx, bottomColor, topColor, uvDistortion, textureWaving, index, culling))
+						{
+							half dist = distance(grassPosition.xyz, _WorldSpaceCameraPos);
+							grassPosition.y -= _Yoffset[index] * size.y;
+
+							half yaw = dot(normalize(grassPosition + size.y / 2), upNormal);
+
+							// ************ Side ************
+							if (tiltx <= 0.5 && tiltx >= -0.5)
+							{
+								half4 side = _Quads[index * 3 + 1];
+
+								// Top vertices
+								AppendVertex(triStream, grassPosition, displacement * ((0.5 - side.x) * 2) + half4(0, size.y, 0, 0), upNormal, fixed3((side.x * 0.5) + textureWaving.x, 0.5, index), topColor);
+								AppendVertex(triStream, grassPosition, -displacement * ((side.y - 0.5) * 2) + half4(0, size.y, 0, 0), upNormal, fixed3((side.y * 0.5) + textureWaving.y, 0.5, index), topColor);
+
+								// Bottom vertices
+								AppendVertex(triStream, grassPosition, displacement * ((0.5 - side.x) * 2), upNormal, fixed3((side.x * 0.5), 0, index), bottomColor);
+								AppendVertex(triStream, grassPosition, -displacement * ((side.y - 0.5) * 2), upNormal, fixed3((side.y * 0.5), 0, index), bottomColor);
+							}
+							else // ************ Front ************
+							{
+								//triStream.RestartStrip();
+								half4 front = _Quads[index * 3];
+
+								// Top vertices (crossed)
+								AppendVertex(triStream, grassPosition, displacementx * ((0.5 - front.x) * 2) + half4(0, size.y, 0, 0), displacementx, fixed3((front.x * 0.5) + textureWaving.x, 1, index), topColor);
+								AppendVertex(triStream, grassPosition, -displacementx * ((front.y - 0.5) * 2) + half4(0, size.y, 0, 0), -displacementx, fixed3((front.y * 0.5) + textureWaving.y, 1, index), topColor);
+
+								// Bottom vertices (crossed)
+								AppendVertex(triStream, grassPosition, displacementx * ((0.5 - front.x) * 2), displacementx, fixed3((front.x * 0.5), 0.5, index), bottomColor);
+								AppendVertex(triStream, grassPosition, -displacementx * ((front.y - 0.5) * 2), -displacementx, fixed3((front.y * 0.5), 0.5, index), bottomColor);
+							}
+
+						}
+					}
+
+					half4 frag(FramentInput IN) : SV_Target
+					{
+						// Sample texture and multiply color
+						fixed4 c = UNITY_SAMPLE_TEX2DARRAY(_MainTex, IN.texcoord);
+
+					// Cutoff
+					clip((c.a - _Cutoff));
+
+					SHADOW_CASTER_FRAGMENT(IN)
+				}
+			ENDCG
+			}
+		}
+}
diff --git a/Assets/Shaders/Dynamic/DynamicTerrainTree.shader.meta b/Assets/Shaders/Dynamic/DynamicTerrainTree.shader.meta
new file mode 100644
index 00000000..7a31f2f3
--- /dev/null
+++ b/Assets/Shaders/Dynamic/DynamicTerrainTree.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 124091d5347c85c408f244879bf65e3f
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/DynamicTerrainTreeMesh.shader b/Assets/Shaders/Dynamic/DynamicTerrainTreeMesh.shader
new file mode 100644
index 00000000..211a1165
--- /dev/null
+++ b/Assets/Shaders/Dynamic/DynamicTerrainTreeMesh.shader
@@ -0,0 +1,262 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: DynamicTerrainGrass.shader
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************﻿
+
+Shader "Terrain/DynamicTerrain/Tree/Mesh"
+{
+	Properties
+	{
+		_MainTex("Albedo (RGB)", 2D) = "white" {}
+		_ColorIntensity("Color Intensity", Range(0, 1)) = 1.0
+		_Fade("Fade in out", float) = 15.0
+	}
+
+		SubShader
+		{
+			Tags
+			{
+				"Queue" = "Geometry"
+				"RenderType" = "Opaque"
+			}
+
+			CGINCLUDE
+
+			// ****** Includes ******
+			#include "UnityCG.cginc"
+			#include "UnityGBuffer.cginc"
+			#include "UnityStandardUtils.cginc"
+			#include "UnityPBSLighting.cginc"
+
+			#define PI 3.1415926535
+			#define PI2 6.283185307
+
+			// ****** Textures ******
+			sampler2D _MainTex;
+			sampler2D _ColorVariance;
+
+			// ****** Properties ******
+			fixed _ColorIntensity;
+			half _Fade;
+			fixed3 _ViewDir;
+			half3 _TerrainSize;
+			half4 _MinMaxWidthHeight[16];
+			fixed4 _FrustumPlanes[6];						// Frustum planes (6 planes * 4 floats: [ normal.x, normal.y, normal.z, distance ])
+			float4x4 _worldToObj;
+			//float4x4 _worldToScreen;
+
+			// ****** Grass point cloud ******
+			StructuredBuffer<float4> _Buffer;
+
+			// Vertex shader
+			uint vert(uint id : SV_VertexID, uint instanceID : SV_InstanceID) : TEXCOORD
+			{
+				return id + instanceID * 64000;
+			}
+
+			ENDCG
+
+			Pass
+			{
+				Tags
+				{
+					"LightMode" = "Deferred"
+				}
+
+					//Cull ON
+					Blend Off
+
+					CGPROGRAM
+					// Upgrade NOTE: excluded shader from DX11 because it uses wrong array syntax (type[size] name)
+					//#pragma exclude_renderers d3d11
+
+					// Shader programs
+					#pragma vertex vert
+					#pragma fragment frag
+
+					// Compiler definitions
+					#pragma target 5.0
+					#pragma only_renderers d3d11
+					#pragma multi_compile_prepassfinal noshadowmask nodynlightmap nodirlightmap nolightmap noshadow 
+
+
+					// Fragment input
+					struct FramentInput
+					{
+						float4 position : SV_POSITION;
+						fixed3 texcoord : TEXCOORD0;
+						fixed3 worldNormal : NORMAL;
+						fixed4 color : COLOR;
+						half4 worldPosition : TEXCOORD1;
+						#if UNITY_SHOULD_SAMPLE_SH
+							half3 sh : TEXCOORD2;
+						#endif
+					};
+
+				// Fragment shader
+				void frag(FramentInput IN, out half4 outGBuffer0 : SV_Target0, out half4 outGBuffer1 : SV_Target1, out half4 outGBuffer2 : SV_Target2, out half4 outEmission : SV_Target3)
+				{
+					// Sample texture and multiply color
+					fixed4 c = tex2Dlod(_MainTex, half4(IN.texcoord.xy, 1,1));
+
+					const half4x4 thresholdMatrix =
+					{
+						1, 9, 3, 11,
+						13, 5, 15, 7,
+						4, 12, 2, 10,
+						16, 8, 14, 6
+					};
+
+					//float3 screenPos = mul(_worldToScreen, IN.position);
+
+					fixed threshold = thresholdMatrix[IN.position.x % 4][IN.position.y % 4] / 17;
+
+					if (threshold >= IN.color.a)
+					{
+						discard;
+					}
+
+					// Cutoff
+					//clip((c.a - _Cutoff));
+					c *= IN.color;
+
+					half3 worldPos = IN.worldPosition;
+
+					fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
+
+					#ifdef UNITY_COMPILER_HLSL
+						SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0;
+					#else
+						SurfaceOutputStandardSpecular o;
+					#endif
+
+					o.Albedo = c.rgb * _ColorIntensity;
+					o.Emission = 0.0f;
+					o.Alpha = c.a;
+					o.Occlusion = 1.0f;
+					o.Smoothness = 0.0f;
+					o.Specular = 0.0f;
+					o.Normal = IN.worldNormal; // This is used only for ambient occlusion
+
+					// Setup lighting environment
+					UnityGI gi;
+					UNITY_INITIALIZE_OUTPUT(UnityGI, gi);
+					gi.indirect.diffuse = 0;
+					gi.indirect.specular = 0;
+					gi.light.color = 0;
+					gi.light.dir = fixed3(0, 1, 0);
+
+					// Call GI (lightmaps/SH/reflections) lighting function
+					UnityGIInput giInput;
+					UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);
+					giInput.light = gi.light;
+					giInput.worldPos = worldPos;
+					giInput.worldViewDir = worldViewDir;
+					giInput.atten = 1;
+					giInput.lightmapUV = 0.0;
+
+					#if UNITY_SHOULD_SAMPLE_SH
+						giInput.ambient = IN.sh;
+					#else
+						giInput.ambient.rgb = 0.0;
+					#endif
+
+					giInput.probeHDR[0] = unity_SpecCube0_HDR;
+					giInput.probeHDR[1] = unity_SpecCube1_HDR;
+
+					#if defined( UNITY_SPECCUBE_BLENDING ) || defined( UNITY_SPECCUBE_BOX_PROJECTION )
+						giInput.boxMin[0] = unity_SpecCube0_BoxMin; // .w holds lerp value for blending
+					#endif
+
+					#ifdef UNITY_SPECCUBE_BOX_PROJECTION
+						giInput.boxMax[0] = unity_SpecCube0_BoxMax;
+						giInput.probePosition[0] = unity_SpecCube0_ProbePosition;
+						giInput.boxMax[1] = unity_SpecCube1_BoxMax;
+						giInput.boxMin[1] = unity_SpecCube1_BoxMin;
+						giInput.probePosition[1] = unity_SpecCube1_ProbePosition;
+					#endif
+
+						// Standard specular global illumination
+						LightingStandardSpecular_GI(o, giInput, gi);
+
+						// Call lighting function to output g-buffer
+						outEmission = LightingStandardSpecular_Deferred(o, worldViewDir, gi, outGBuffer0, outGBuffer1, outGBuffer2);
+						outGBuffer2.w = 0;
+					#ifndef UNITY_HDR_ON
+						outEmission.rgb = exp2(-outEmission.rgb);
+					#endif
+
+				}
+				ENDCG
+				}
+
+			Pass
+			{
+				Name "ShadowCaster"
+				Tags
+				{
+					"LightMode" = "ShadowCaster"
+				}
+				Cull Off
+				Blend Off
+				CGPROGRAM
+
+				// Includes
+				#include "UnityCG.cginc"
+
+				// Shader programs
+				#pragma vertex vert
+				#pragma fragment frag
+
+				// Compiler definitions
+				#pragma target 5.0
+				#pragma multi_compile_shadowcaster
+				//#pragma only_renderers d3d11
+
+				struct FramentInput
+				{
+					fixed3 texcoord : TEXCOORD0;
+					V2F_SHADOW_CASTER;
+					UNITY_VERTEX_OUTPUT_STEREO
+				};
+
+				half4 frag(FramentInput IN) : SV_Target
+				{
+					// Sample texture and multiply color
+					fixed4 c = tex2Dlod(_MainTex, half4(IN.texcoord.xy, 1,1));
+
+				// Cutoff
+				//clip((c.a - _Cutoff));
+
+				SHADOW_CASTER_FRAGMENT(IN)
+			}
+		ENDCG
+		}
+		}
+}
diff --git a/Assets/Shaders/Dynamic/DynamicTerrainTreeMesh.shader.meta b/Assets/Shaders/Dynamic/DynamicTerrainTreeMesh.shader.meta
new file mode 100644
index 00000000..047677c9
--- /dev/null
+++ b/Assets/Shaders/Dynamic/DynamicTerrainTreeMesh.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: dc17f2cc5ac281e469df223a602cb24e
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/InstancedShader.shader b/Assets/Shaders/Dynamic/InstancedShader.shader
new file mode 100644
index 00000000..a1ee8c1d
--- /dev/null
+++ b/Assets/Shaders/Dynamic/InstancedShader.shader
@@ -0,0 +1,138 @@
+﻿Shader "Instanced/InstancedShader" {
+	Properties{
+		_MainTex("Albedo (RGB)", 2D) = "white" {}
+		_FadeFar("fade Far value", float) = 3000
+		_FadeNear("fade Near value", float) = 20
+		_FadeDistance("Fade Distance", float) = 50
+	}
+		SubShader{
+
+			Tags
+			{
+				"Queue" = "AlphaTest"
+				"RenderType" = "Opaque"
+				"DisableBatching" = "True"
+			}
+
+			Pass {
+
+			CGPROGRAM
+
+			#pragma vertex vert
+			#pragma fragment frag
+			#pragma multi_compile_fwdbase nolightmap nodirlightmap nodynlightmap novertexlight
+			#pragma target 4.5
+
+			#include "UnityCG.cginc"
+			#include "UnityLightingCommon.cginc"
+			#include "AutoLight.cginc"
+
+			sampler2D _MainTex;
+			half _FadeFar;
+			half _FadeNear;
+			half _FadeDistance;
+
+		#if SHADER_TARGET >= 45
+			StructuredBuffer<float4> _Buffer;
+		#endif
+
+			struct v2f
+			{
+				float4 pos : SV_POSITION;
+				float4 worldPos : TEXCOORD5;
+				float2 uv_MainTex : TEXCOORD0;
+				float3 ambient : TEXCOORD1;
+				float3 diffuse : TEXCOORD2;
+				float3 color : TEXCOORD3;
+				SHADOW_COORDS(4)
+			};
+
+			void rotate2D(inout float2 v, float r)
+			{
+				float s, c;
+				sincos(r, s, c);
+				v = float2(v.x * c - v.y * s, v.x * s + v.y * c);
+			}
+
+			v2f vert(appdata_full v, uint instanceID : SV_InstanceID)
+			{
+			#if SHADER_TARGET >= 45
+				float4 data = _Buffer[instanceID];
+			#else
+				float4 data = 0;
+			#endif
+
+				/*float rotation = data.w * data.w * _Time.x * 0.5f;
+				rotate2D(data.xz, rotation);*/
+
+				float3 localPosition = v.vertex.xyz;
+				float3 worldPosition = data.xyz + localPosition;
+				float3 worldNormal = v.normal;
+
+				float3 ndotl = saturate(dot(worldNormal, _WorldSpaceLightPos0.xyz));
+				float3 ambient = ShadeSH9(float4(worldNormal, 1.0f));
+				float3 diffuse = (ndotl * _LightColor0.rgb);
+				float3 color = v.color;
+
+				v2f o;
+				o.pos = mul(UNITY_MATRIX_VP, float4(worldPosition, 1.0f));
+				o.worldPos = float4(worldPosition, 1.0f);
+				o.uv_MainTex = v.texcoord;
+				o.ambient = ambient;
+				o.diffuse = diffuse;
+				o.color = color;
+				TRANSFER_SHADOW(o)
+				return o;
+			}
+
+			fixed4 frag(v2f i) : SV_Target
+			{
+				const half4x4 thresholdMatrix =
+				{
+					16, 8, 14, 6,
+					4, 12, 2, 10,
+					13, 5, 15, 7,
+					1, 9, 3, 11
+				};
+
+				fixed threshold = thresholdMatrix[i.pos.x % 4][i.pos.y % 4] / 17;
+				half dist = distance(i.worldPos.xyz, fixed3(0, 0, 0));
+
+				half fade = _FadeFar;
+				half farfade = _FadeFar;
+				half nearfade = _FadeNear;
+				half alpha = 1.0;
+
+				if (dist > _FadeFar)
+				{
+					farfade = 1 - ((dist - fade) / _FadeDistance);
+					//fade = dist/fade;
+				}
+				if (dist < _FadeNear)
+				{
+					nearfade = dist / _FadeNear;
+				}
+
+				fade = min(farfade, nearfade);
+
+				if (threshold >= fade)
+				{
+					//alpha = threshold / fade;
+					discard;
+				}
+
+				fixed shadow = SHADOW_ATTENUATION(i);
+				fixed4 albedo = tex2D(_MainTex, i.uv_MainTex);
+				float3 lighting = i.diffuse * shadow + i.ambient;
+				fixed4 output = fixed4(albedo.rgb * i.color * lighting, albedo.w);
+
+				//output.a = fade;
+
+				//UNITY_APPLY_FOG(i.fogCoord, output);
+				return output;
+			}
+
+			ENDCG
+		}
+		}
+}
\ No newline at end of file
diff --git a/Assets/Shaders/Dynamic/InstancedShader.shader.meta b/Assets/Shaders/Dynamic/InstancedShader.shader.meta
new file mode 100644
index 00000000..61ede279
--- /dev/null
+++ b/Assets/Shaders/Dynamic/InstancedShader.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 628a84e38f4405e4da945ed47427b249
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/Models.meta b/Assets/Shaders/Dynamic/Models.meta
new file mode 100644
index 00000000..7c344880
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Models.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c8c7cfd219249c545a4c83fc0261d06b
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/Models/TestTree2.fbx b/Assets/Shaders/Dynamic/Models/TestTree2.fbx
new file mode 100644
index 00000000..548d71cc
Binary files /dev/null and b/Assets/Shaders/Dynamic/Models/TestTree2.fbx differ
diff --git a/Assets/Shaders/Dynamic/Models/TestTree2.fbx.meta b/Assets/Shaders/Dynamic/Models/TestTree2.fbx.meta
new file mode 100644
index 00000000..137915fe
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Models/TestTree2.fbx.meta
@@ -0,0 +1,96 @@
+fileFormatVersion: 2
+guid: 2f6af3d8e0a449d45b5010bc155fe0f1
+ModelImporter:
+  serializedVersion: 19300
+  internalIDToNameTable: []
+  externalObjects: {}
+  materials:
+    materialImportMode: 1
+    materialName: 0
+    materialSearch: 1
+    materialLocation: 1
+  animations:
+    legacyGenerateAnimations: 4
+    bakeSimulation: 0
+    resampleCurves: 1
+    optimizeGameObjects: 0
+    motionNodeName: 
+    rigImportErrors: 
+    rigImportWarnings: 
+    animationImportErrors: 
+    animationImportWarnings: 
+    animationRetargetingWarnings: 
+    animationDoRetargetingWarnings: 0
+    importAnimatedCustomProperties: 0
+    importConstraints: 0
+    animationCompression: 1
+    animationRotationError: 0.5
+    animationPositionError: 0.5
+    animationScaleError: 0.5
+    animationWrapMode: 0
+    extraExposedTransformPaths: []
+    extraUserProperties: []
+    clipAnimations: []
+    isReadable: 0
+  meshes:
+    lODScreenPercentages: []
+    globalScale: 1
+    meshCompression: 0
+    addColliders: 0
+    useSRGBMaterialColor: 1
+    sortHierarchyByName: 1
+    importVisibility: 1
+    importBlendShapes: 1
+    importCameras: 1
+    importLights: 1
+    swapUVChannels: 0
+    generateSecondaryUV: 0
+    useFileUnits: 1
+    keepQuads: 0
+    weldVertices: 1
+    preserveHierarchy: 0
+    skinWeightsMode: 0
+    maxBonesPerVertex: 4
+    minBoneWeight: 0.001
+    meshOptimizationFlags: -1
+    indexFormat: 0
+    secondaryUVAngleDistortion: 8
+    secondaryUVAreaDistortion: 15.000001
+    secondaryUVHardAngle: 88
+    secondaryUVPackMargin: 4
+    useFileScale: 1
+  tangentSpace:
+    normalSmoothAngle: 60
+    normalImportMode: 0
+    tangentImportMode: 3
+    normalCalculationMode: 4
+    legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
+    blendShapeNormalImportMode: 1
+    normalSmoothingSource: 0
+  referencedClips: []
+  importAnimation: 1
+  humanDescription:
+    serializedVersion: 3
+    human: []
+    skeleton: []
+    armTwist: 0.5
+    foreArmTwist: 0.5
+    upperLegTwist: 0.5
+    legTwist: 0.5
+    armStretch: 0.05
+    legStretch: 0.05
+    feetSpacing: 0
+    globalScale: 1
+    rootMotionBoneName: 
+    hasTranslationDoF: 0
+    hasExtraRoot: 0
+    skeletonHasParents: 1
+  lastHumanDescriptionAvatarSource: {instanceID: 0}
+  autoGenerateAvatarMappingIfUnspecified: 1
+  animationType: 2
+  humanoidOversampling: 1
+  avatarSetup: 0
+  additionalBone: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/NoiseTextureGenerator.cs b/Assets/Shaders/Dynamic/NoiseTextureGenerator.cs
new file mode 100644
index 00000000..6a9a2ffa
--- /dev/null
+++ b/Assets/Shaders/Dynamic/NoiseTextureGenerator.cs
@@ -0,0 +1,148 @@
+﻿/* 
+ * Copyright (C) SAAB AB
+ *
+ * All rights, including the copyright, to the computer program(s) 
+ * herein belong to Saab AB. The program(s) may be used and/or
+ * copied only with the written permission of Saab AB, or in
+ * accordance with the terms and conditions stipulated in the
+ * agreement/contract under which the program(s) have been
+ * supplied. 
+ * 
+ * Information Class:          COMPANY RESTRICTED
+ * Defence Secrecy:            UNCLASSIFIED
+ * Export Control:             NOT EXPORT CONTROLLED
+ */
+
+using System;
+using UnityEngine;
+
+namespace Saab.Unity.Core
+{
+    public class NoiseTexture
+    {
+        public enum TextureFormat
+        {
+            RFloat = UnityEngine.TextureFormat.RFloat,
+            RGFloat = UnityEngine.TextureFormat.RGFloat,
+            RGBAFloat = UnityEngine.TextureFormat.RGBAFloat,
+        }
+
+        // Default texture for saving GPU memory
+        private static Texture2D uniformR128x1;
+        public static Texture2D UniformR128x1
+        {
+            get
+            {
+                if (uniformR128x1 == null)
+                {
+                    uniformR128x1 = GenerateUniform(128, 1, TextureFormat.RFloat, false);
+                }
+                return uniformR128x1;
+            }
+        }
+
+        private static Texture2D uniformR128x128;
+        public static Texture2D UniformR128x128
+        {
+            get
+            {
+                if (uniformR128x128 == null)
+                {
+                    uniformR128x128 = GenerateUniform(128, 128, TextureFormat.RFloat, false);
+                }
+                return uniformR128x128;
+            }
+        }
+
+        private static Texture2D uniformRGBA128x128;
+        public static Texture2D UniformRGBA128x128
+        {
+            get
+            {
+                if (uniformRGBA128x128 == null)
+                {
+                    uniformRGBA128x128 = GenerateUniform(128, 128, TextureFormat.RGBAFloat, false);
+                }
+                return uniformRGBA128x128;
+            }
+        }
+
+        private static Texture2D uniformRGBA256x256;
+        public static Texture2D UniformRGBA256x256
+        {
+            get
+            {
+                if (uniformRGBA256x256 == null)
+                {
+                    uniformRGBA256x256 = GenerateUniform(256, 256, TextureFormat.RGBAFloat, false);
+                }
+                return uniformRGBA256x256;
+            }
+        }
+
+        private static Texture2D uniformRGBA512x512;
+        public static Texture2D UniformRGBA512x512
+        {
+            get
+            {
+                if (uniformRGBA512x512 == null)
+                {
+                    uniformRGBA512x512 = GenerateUniform(512, 512, TextureFormat.RGBAFloat, false);
+                }
+                return uniformRGBA512x512;
+            }
+        }
+
+        public static void ReleaseAll()
+        {
+            UnityEngine.Object.Destroy(uniformR128x1);
+            UnityEngine.Object.Destroy(uniformRGBA128x128);
+            UnityEngine.Object.Destroy(uniformRGBA256x256);
+            UnityEngine.Object.Destroy(uniformRGBA512x512);
+
+            uniformR128x1 = null;
+            uniformRGBA128x128 = null;
+            uniformRGBA256x256 = null;
+            uniformRGBA512x512 = null;
+        }
+
+        public static Texture2D GenerateUniform(int width, int height, TextureFormat textureFormat, bool linear)
+        {
+            Texture2D texture = new Texture2D(width, height, (UnityEngine.TextureFormat)textureFormat, false, linear);
+
+            float[] floatBuffer = new float[width * height * GetChannelsCount(textureFormat)];
+            for (int i = 0; i < floatBuffer.Length; i++)
+            {
+                floatBuffer[i] = UnityEngine.Random.value;
+            }
+
+            byte[] byteArray = new byte[floatBuffer.Length * sizeof(float)];
+
+            Buffer.BlockCopy(floatBuffer, 0, byteArray, 0, byteArray.Length);
+
+            texture.LoadRawTextureData(byteArray);
+            texture.Apply();
+
+            return texture;
+        }
+
+        private static int GetChannelsCount(TextureFormat textureFormat)
+        {
+            switch (textureFormat)
+            {
+                case TextureFormat.RFloat:
+                    {
+                        return 1;
+                    }
+                case TextureFormat.RGFloat:
+                    {
+                        return 2;
+                    }
+                default:
+                    {
+                        return 4;
+                    }
+            }
+        }
+    }
+}
diff --git a/Assets/Shaders/Dynamic/NoiseTextureGenerator.cs.meta b/Assets/Shaders/Dynamic/NoiseTextureGenerator.cs.meta
new file mode 100644
index 00000000..968bdc3d
--- /dev/null
+++ b/Assets/Shaders/Dynamic/NoiseTextureGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a4fecab36a6fdb34ebf993ba7033c25c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/Test.mat b/Assets/Shaders/Dynamic/Test.mat
new file mode 100644
index 00000000..b0b613fb
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Test.mat
@@ -0,0 +1,31 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Test
+  m_Shader: {fileID: 4800000, guid: 628a84e38f4405e4da945ed47427b249, type: 3}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: 2450
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 4eda53f22f321c945b26a02d7c480482, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Floats:
+    - _Fade: 100
+    - _FadeDistance: 5
+    - _FadeFar: 5000
+    - _FadeNear: 5
+    m_Colors: []
diff --git a/Assets/Shaders/Dynamic/Test.mat.meta b/Assets/Shaders/Dynamic/Test.mat.meta
new file mode 100644
index 00000000..fad396f5
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Test.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ae1ce7ba095402041a5e47fc2525865a
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/Textures.meta b/Assets/Shaders/Dynamic/Textures.meta
new file mode 100644
index 00000000..a4906126
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Textures.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 403a4a2d21904424a8757dc893411cba
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/Textures/5a222c09c80f28.4682557115121889378195.png b/Assets/Shaders/Dynamic/Textures/5a222c09c80f28.4682557115121889378195.png
new file mode 100644
index 00000000..b9098b87
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/5a222c09c80f28.4682557115121889378195.png differ
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/16x9.png.meta b/Assets/Shaders/Dynamic/Textures/5a222c09c80f28.4682557115121889378195.png.meta
similarity index 86%
rename from com.saab.map-streamer/Runtime/Shaders/Foliage/16x9.png.meta
rename to Assets/Shaders/Dynamic/Textures/5a222c09c80f28.4682557115121889378195.png.meta
index b5865f4a..f40735f1 100644
--- a/com.saab.map-streamer/Runtime/Shaders/Foliage/16x9.png.meta
+++ b/Assets/Shaders/Dynamic/Textures/5a222c09c80f28.4682557115121889378195.png.meta
@@ -1,9 +1,9 @@
 fileFormatVersion: 2
-guid: 3de1c34f27efc4a41aaa7a4ee0343687
+guid: 7a5f9072548d4d54fb29a55d1cf85aab
 TextureImporter:
   internalIDToNameTable: []
   externalObjects: {}
-  serializedVersion: 12
+  serializedVersion: 10
   mipmaps:
     mipMapMode: 0
     enableMipMap: 1
@@ -13,18 +13,16 @@ TextureImporter:
     borderMipMap: 0
     mipMapsPreserveCoverage: 0
     alphaTestReferenceValue: 0.5
-    mipMapFadeDistanceStart: 1
-    mipMapFadeDistanceEnd: 3
+    mipMapFadeDistanceStart: 2
+    mipMapFadeDistanceEnd: 4
   bumpmap:
     convertToNormalMap: 0
     externalNormalMap: 0
     heightScale: 0.25
     normalMapFilter: 0
-  isReadable: 0
+  isReadable: 1
   streamingMipmaps: 0
   streamingMipmapsPriority: 0
-  vTOnly: 0
-  ignoreMasterTextureLimit: 0
   grayScaleToAlpha: 0
   generateCubemap: 6
   cubemapConvolution: 0
@@ -33,12 +31,12 @@ TextureImporter:
   maxTextureSize: 2048
   textureSettings:
     serializedVersion: 2
-    filterMode: 1
-    aniso: 1
-    mipBias: 0
-    wrapU: 0
-    wrapV: 0
-    wrapW: 0
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
   nPOTScale: 1
   lightmap: 0
   compressionQuality: 50
@@ -56,14 +54,9 @@ TextureImporter:
   textureType: 0
   textureShape: 1
   singleChannelComponent: 0
-  flipbookRows: 1
-  flipbookColumns: 1
   maxTextureSizeSet: 0
   compressionQualitySet: 0
   textureFormatSet: 0
-  ignorePngGamma: 0
-  applyGammaDecoding: 0
-  cookieLightType: 0
   platformSettings:
   - serializedVersion: 3
     buildTarget: DefaultTexturePlatform
@@ -90,7 +83,7 @@ TextureImporter:
     androidETC2FallbackOverride: 0
     forceMaximumCompressionQuality_BC6H_BC7: 0
   - serializedVersion: 3
-    buildTarget: Server
+    buildTarget: Windows Store Apps
     maxTextureSize: 2048
     resizeAlgorithm: 0
     textureFormat: -1
@@ -126,7 +119,6 @@ TextureImporter:
     edges: []
     weights: []
     secondaryTextures: []
-    nameFileIdTable: {}
   spritePackingTag: 
   pSDRemoveMatte: 0
   pSDShowRemoveMatteOption: 0
diff --git a/com.saab.map-streamer/Runtime/Assets/FallbackMaterial.mat b/Assets/Shaders/Dynamic/Textures/BaseTestMaterial.mat
similarity index 87%
rename from com.saab.map-streamer/Runtime/Assets/FallbackMaterial.mat
rename to Assets/Shaders/Dynamic/Textures/BaseTestMaterial.mat
index d6aee34c..1bbf1240 100644
--- a/com.saab.map-streamer/Runtime/Assets/FallbackMaterial.mat
+++ b/Assets/Shaders/Dynamic/Textures/BaseTestMaterial.mat
@@ -2,17 +2,16 @@
 %TAG !u! tag:unity3d.com,2011:
 --- !u!21 &2100000
 Material:
-  serializedVersion: 8
+  serializedVersion: 6
   m_ObjectHideFlags: 0
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: FallbackMaterial
+  m_Name: BaseTestMaterial
   m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
-  m_ValidKeywords: []
-  m_InvalidKeywords: []
+  m_ShaderKeywords: 
   m_LightmapFlags: 4
-  m_EnableInstancingVariants: 1
+  m_EnableInstancingVariants: 0
   m_DoubleSidedGI: 0
   m_CustomRenderQueue: -1
   stringTagMap: {}
@@ -41,7 +40,7 @@ Material:
         m_Scale: {x: 1, y: 1}
         m_Offset: {x: 0, y: 0}
     - _MainTex:
-        m_Texture: {fileID: 0}
+        m_Texture: {fileID: 2800000, guid: 08ffa87f206b13341bb3c0ffb485837c, type: 3}
         m_Scale: {x: 1, y: 1}
         m_Offset: {x: 0, y: 0}
     - _MetallicGlossMap:
@@ -56,14 +55,13 @@ Material:
         m_Texture: {fileID: 0}
         m_Scale: {x: 1, y: 1}
         m_Offset: {x: 0, y: 0}
-    m_Ints: []
     m_Floats:
     - _BumpScale: 1
     - _Cutoff: 0.5
     - _DetailNormalMapScale: 1
     - _DstBlend: 0
     - _GlossMapScale: 1
-    - _Glossiness: 0
+    - _Glossiness: 0.5
     - _GlossyReflections: 1
     - _Metallic: 0
     - _Mode: 0
@@ -75,6 +73,5 @@ Material:
     - _UVSec: 0
     - _ZWrite: 1
     m_Colors:
-    - _Color: {r: 1, g: 0, b: 1, a: 1}
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
     - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
-  m_BuildTextureStacks: []
diff --git a/Assets/Shaders/Dynamic/Textures/BaseTestMaterial.mat.meta b/Assets/Shaders/Dynamic/Textures/BaseTestMaterial.mat.meta
new file mode 100644
index 00000000..3857c660
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Textures/BaseTestMaterial.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: eba9e0bc9aa2b0048bb9be54f2103719
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Grass/Dead_Grass_02_Albedo_Opacity.tif b/Assets/Shaders/Dynamic/Textures/Dead_Grass_02_Albedo_Opacity.tif
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Grass/Dead_Grass_02_Albedo_Opacity.tif
rename to Assets/Shaders/Dynamic/Textures/Dead_Grass_02_Albedo_Opacity.tif
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Grass/Dead_Grass_02_Albedo_Opacity.tif.meta b/Assets/Shaders/Dynamic/Textures/Dead_Grass_02_Albedo_Opacity.tif.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Grass/Dead_Grass_02_Albedo_Opacity.tif.meta
rename to Assets/Shaders/Dynamic/Textures/Dead_Grass_02_Albedo_Opacity.tif.meta
diff --git a/Assets/Shaders/Dynamic/Textures/Grass1.png b/Assets/Shaders/Dynamic/Textures/Grass1.png
new file mode 100644
index 00000000..d787c193
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/Grass1.png differ
diff --git a/Assets/Shaders/Dynamic/Textures/Grass1.png.meta b/Assets/Shaders/Dynamic/Textures/Grass1.png.meta
new file mode 100644
index 00000000..c9e56bc1
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Textures/Grass1.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: ff4b295e2ad7d4e48b4b80f4e67a53b5
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 10
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 0
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 512
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 512
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Windows Store Apps
+    maxTextureSize: 512
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 256
+    resizeAlgorithm: 0
+    textureFormat: 47
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/Textures/GrassProtoTest3_128_128.png b/Assets/Shaders/Dynamic/Textures/GrassProtoTest3_128_128.png
new file mode 100644
index 00000000..13ffa9f8
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/GrassProtoTest3_128_128.png differ
diff --git a/Assets/Shaders/Dynamic/Textures/GrassProtoTest3_128_128.png.meta b/Assets/Shaders/Dynamic/Textures/GrassProtoTest3_128_128.png.meta
new file mode 100644
index 00000000..2eb153f6
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Textures/GrassProtoTest3_128_128.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: 18f4f5582b456a94aa3c1b2d870bbf8e
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 10
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 0
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 1024
+    resizeAlgorithm: 1
+    textureFormat: 4
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 1024
+    resizeAlgorithm: 1
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Windows Store Apps
+    maxTextureSize: 1024
+    resizeAlgorithm: 1
+    textureFormat: 4
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 1024
+    resizeAlgorithm: 1
+    textureFormat: 4
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Grass/Meadow_Grass_01_Albedo_Opacitycut.tif b/Assets/Shaders/Dynamic/Textures/Meadow_Grass_01_Albedo_Opacitycut.tif
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Grass/Meadow_Grass_01_Albedo_Opacitycut.tif
rename to Assets/Shaders/Dynamic/Textures/Meadow_Grass_01_Albedo_Opacitycut.tif
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Grass/Meadow_Grass_01_Albedo_Opacitycut.tif.meta b/Assets/Shaders/Dynamic/Textures/Meadow_Grass_01_Albedo_Opacitycut.tif.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Grass/Meadow_Grass_01_Albedo_Opacitycut.tif.meta
rename to Assets/Shaders/Dynamic/Textures/Meadow_Grass_01_Albedo_Opacitycut.tif.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Grass/Meadow_Grass_01_Albedo_Opacitycut2.tif b/Assets/Shaders/Dynamic/Textures/Meadow_Grass_01_Albedo_Opacitycut2.tif
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Grass/Meadow_Grass_01_Albedo_Opacitycut2.tif
rename to Assets/Shaders/Dynamic/Textures/Meadow_Grass_01_Albedo_Opacitycut2.tif
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Grass/Meadow_Grass_01_Albedo_Opacitycut2.tif.meta b/Assets/Shaders/Dynamic/Textures/Meadow_Grass_01_Albedo_Opacitycut2.tif.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Grass/Meadow_Grass_01_Albedo_Opacitycut2.tif.meta
rename to Assets/Shaders/Dynamic/Textures/Meadow_Grass_01_Albedo_Opacitycut2.tif.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Grass/Meadow_Grass_01_Albedo_Opacitycut3.tif b/Assets/Shaders/Dynamic/Textures/Meadow_Grass_01_Albedo_Opacitycut3.tif
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Grass/Meadow_Grass_01_Albedo_Opacitycut3.tif
rename to Assets/Shaders/Dynamic/Textures/Meadow_Grass_01_Albedo_Opacitycut3.tif
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Grass/Meadow_Grass_01_Albedo_Opacitycut3.tif.meta b/Assets/Shaders/Dynamic/Textures/Meadow_Grass_01_Albedo_Opacitycut3.tif.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Grass/Meadow_Grass_01_Albedo_Opacitycut3.tif.meta
rename to Assets/Shaders/Dynamic/Textures/Meadow_Grass_01_Albedo_Opacitycut3.tif.meta
diff --git a/Assets/Shaders/Dynamic/Textures/OutputNormal.png b/Assets/Shaders/Dynamic/Textures/OutputNormal.png
new file mode 100644
index 00000000..c25a5c88
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/OutputNormal.png differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_NormalDX.jpg.meta b/Assets/Shaders/Dynamic/Textures/OutputNormal.png.meta
similarity index 87%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_NormalDX.jpg.meta
rename to Assets/Shaders/Dynamic/Textures/OutputNormal.png.meta
index b9dac02c..5b1b99d3 100644
--- a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_NormalDX.jpg.meta
+++ b/Assets/Shaders/Dynamic/Textures/OutputNormal.png.meta
@@ -1,9 +1,9 @@
 fileFormatVersion: 2
-guid: dab813c6421550747a3d0cb9aa6faeec
+guid: f6b5c606d9d847444989311c072f0867
 TextureImporter:
   internalIDToNameTable: []
   externalObjects: {}
-  serializedVersion: 12
+  serializedVersion: 10
   mipmaps:
     mipMapMode: 0
     enableMipMap: 1
@@ -20,11 +20,9 @@ TextureImporter:
     externalNormalMap: 0
     heightScale: 0.25
     normalMapFilter: 0
-  isReadable: 0
+  isReadable: 1
   streamingMipmaps: 0
   streamingMipmapsPriority: 0
-  vTOnly: 0
-  ignoreMasterTextureLimit: 0
   grayScaleToAlpha: 0
   generateCubemap: 6
   cubemapConvolution: 0
@@ -33,12 +31,12 @@ TextureImporter:
   maxTextureSize: 2048
   textureSettings:
     serializedVersion: 2
-    filterMode: 1
-    aniso: 1
-    mipBias: 0
-    wrapU: 0
-    wrapV: 0
-    wrapW: 0
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
   nPOTScale: 1
   lightmap: 0
   compressionQuality: 50
@@ -56,14 +54,9 @@ TextureImporter:
   textureType: 1
   textureShape: 1
   singleChannelComponent: 0
-  flipbookRows: 1
-  flipbookColumns: 1
   maxTextureSizeSet: 0
   compressionQualitySet: 0
   textureFormatSet: 0
-  ignorePngGamma: 0
-  applyGammaDecoding: 0
-  cookieLightType: 0
   platformSettings:
   - serializedVersion: 3
     buildTarget: DefaultTexturePlatform
@@ -90,7 +83,7 @@ TextureImporter:
     androidETC2FallbackOverride: 0
     forceMaximumCompressionQuality_BC6H_BC7: 0
   - serializedVersion: 3
-    buildTarget: Server
+    buildTarget: Windows Store Apps
     maxTextureSize: 2048
     resizeAlgorithm: 0
     textureFormat: -1
@@ -103,9 +96,9 @@ TextureImporter:
     forceMaximumCompressionQuality_BC6H_BC7: 0
   - serializedVersion: 3
     buildTarget: Android
-    maxTextureSize: 2048
+    maxTextureSize: 1024
     resizeAlgorithm: 0
-    textureFormat: -1
+    textureFormat: 47
     textureCompression: 1
     compressionQuality: 50
     crunchedCompression: 0
@@ -126,7 +119,6 @@ TextureImporter:
     edges: []
     weights: []
     secondaryTextures: []
-    nameFileIdTable: {}
   spritePackingTag: 
   pSDRemoveMatte: 0
   pSDShowRemoveMatteOption: 0
diff --git a/Assets/Shaders/Dynamic/Textures/Output_TestTree.png b/Assets/Shaders/Dynamic/Textures/Output_TestTree.png
new file mode 100644
index 00000000..2dedde30
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/Output_TestTree.png differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Roughness.jpg.meta b/Assets/Shaders/Dynamic/Textures/Output_TestTree.png.meta
similarity index 87%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Roughness.jpg.meta
rename to Assets/Shaders/Dynamic/Textures/Output_TestTree.png.meta
index cf2c5a21..8ba526ed 100644
--- a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Roughness.jpg.meta
+++ b/Assets/Shaders/Dynamic/Textures/Output_TestTree.png.meta
@@ -1,9 +1,9 @@
 fileFormatVersion: 2
-guid: 70d7df2c2fe3c9d44bbe3f95bd1137f0
+guid: 5a2804ae961ac4c40a91035188ab1b15
 TextureImporter:
   internalIDToNameTable: []
   externalObjects: {}
-  serializedVersion: 12
+  serializedVersion: 10
   mipmaps:
     mipMapMode: 0
     enableMipMap: 1
@@ -20,11 +20,9 @@ TextureImporter:
     externalNormalMap: 0
     heightScale: 0.25
     normalMapFilter: 0
-  isReadable: 0
+  isReadable: 1
   streamingMipmaps: 0
   streamingMipmapsPriority: 0
-  vTOnly: 0
-  ignoreMasterTextureLimit: 0
   grayScaleToAlpha: 0
   generateCubemap: 6
   cubemapConvolution: 0
@@ -33,12 +31,12 @@ TextureImporter:
   maxTextureSize: 2048
   textureSettings:
     serializedVersion: 2
-    filterMode: 1
-    aniso: 1
-    mipBias: 0
-    wrapU: 0
-    wrapV: 0
-    wrapW: 0
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
   nPOTScale: 1
   lightmap: 0
   compressionQuality: 50
@@ -56,14 +54,9 @@ TextureImporter:
   textureType: 0
   textureShape: 1
   singleChannelComponent: 0
-  flipbookRows: 1
-  flipbookColumns: 1
   maxTextureSizeSet: 0
   compressionQualitySet: 0
   textureFormatSet: 0
-  ignorePngGamma: 0
-  applyGammaDecoding: 0
-  cookieLightType: 0
   platformSettings:
   - serializedVersion: 3
     buildTarget: DefaultTexturePlatform
@@ -90,7 +83,7 @@ TextureImporter:
     androidETC2FallbackOverride: 0
     forceMaximumCompressionQuality_BC6H_BC7: 0
   - serializedVersion: 3
-    buildTarget: Server
+    buildTarget: Windows Store Apps
     maxTextureSize: 2048
     resizeAlgorithm: 0
     textureFormat: -1
@@ -103,9 +96,9 @@ TextureImporter:
     forceMaximumCompressionQuality_BC6H_BC7: 0
   - serializedVersion: 3
     buildTarget: Android
-    maxTextureSize: 2048
+    maxTextureSize: 1024
     resizeAlgorithm: 0
-    textureFormat: -1
+    textureFormat: 47
     textureCompression: 1
     compressionQuality: 50
     crunchedCompression: 0
@@ -126,7 +119,6 @@ TextureImporter:
     edges: []
     weights: []
     secondaryTextures: []
-    nameFileIdTable: {}
   spritePackingTag: 
   pSDRemoveMatte: 0
   pSDShowRemoveMatteOption: 0
diff --git a/Assets/Shaders/Dynamic/Textures/PerlinNoise.png b/Assets/Shaders/Dynamic/Textures/PerlinNoise.png
new file mode 100644
index 00000000..f954f7cc
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/PerlinNoise.png differ
diff --git a/Assets/Shaders/Dynamic/Textures/PerlinNoise.png.meta b/Assets/Shaders/Dynamic/Textures/PerlinNoise.png.meta
new file mode 100644
index 00000000..6cd16993
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Textures/PerlinNoise.png.meta
@@ -0,0 +1,92 @@
+fileFormatVersion: 2
+guid: 22bf2156a7a5bf5459492d3908da3bd7
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/Textures/PerlinNoiseRGB.png b/Assets/Shaders/Dynamic/Textures/PerlinNoiseRGB.png
new file mode 100644
index 00000000..9c87562a
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/PerlinNoiseRGB.png differ
diff --git a/Assets/Shaders/Dynamic/Textures/PerlinNoiseRGB.png.meta b/Assets/Shaders/Dynamic/Textures/PerlinNoiseRGB.png.meta
new file mode 100644
index 00000000..08bc68ac
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Textures/PerlinNoiseRGB.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: 7e19882b01255364e9c1cfbd084e8cd6
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 10
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 0
+    aniso: -1
+    mipBias: -100
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: 4
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: 4
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Windows Store Apps
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: 4
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: 4
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/Textures/TX_GradientNoise_1024.jpg b/Assets/Shaders/Dynamic/Textures/TX_GradientNoise_1024.jpg
new file mode 100644
index 00000000..aa280a0a
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/TX_GradientNoise_1024.jpg differ
diff --git a/Assets/Shaders/Dynamic/Textures/TX_GradientNoise_1024.jpg.meta b/Assets/Shaders/Dynamic/Textures/TX_GradientNoise_1024.jpg.meta
new file mode 100644
index 00000000..03a3c2d8
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Textures/TX_GradientNoise_1024.jpg.meta
@@ -0,0 +1,116 @@
+fileFormatVersion: 2
+guid: 4dfd9f8d8fe6072488b8b258394cb1ec
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 0
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Grass/T_grass_meadow_03_A_M01.tga b/Assets/Shaders/Dynamic/Textures/T_grass_meadow_03_A_M01.tga
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Grass/T_grass_meadow_03_A_M01.tga
rename to Assets/Shaders/Dynamic/Textures/T_grass_meadow_03_A_M01.tga
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Grass/T_grass_meadow_03_A_M01.tga.meta b/Assets/Shaders/Dynamic/Textures/T_grass_meadow_03_A_M01.tga.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Grass/T_grass_meadow_03_A_M01.tga.meta
rename to Assets/Shaders/Dynamic/Textures/T_grass_meadow_03_A_M01.tga.meta
diff --git a/Assets/Shaders/Dynamic/Textures/Texture_Alt_04.png b/Assets/Shaders/Dynamic/Textures/Texture_Alt_04.png
new file mode 100644
index 00000000..2ab5a372
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/Texture_Alt_04.png differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Displacement.jpg.meta b/Assets/Shaders/Dynamic/Textures/Texture_Alt_04.png.meta
similarity index 88%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Displacement.jpg.meta
rename to Assets/Shaders/Dynamic/Textures/Texture_Alt_04.png.meta
index aa36b9d8..b6062a3b 100644
--- a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Displacement.jpg.meta
+++ b/Assets/Shaders/Dynamic/Textures/Texture_Alt_04.png.meta
@@ -1,9 +1,9 @@
 fileFormatVersion: 2
-guid: 2e09a13c6014c6d4db6a5a2519cdc883
+guid: 4eda53f22f321c945b26a02d7c480482
 TextureImporter:
   internalIDToNameTable: []
   externalObjects: {}
-  serializedVersion: 12
+  serializedVersion: 10
   mipmaps:
     mipMapMode: 0
     enableMipMap: 1
@@ -20,11 +20,9 @@ TextureImporter:
     externalNormalMap: 0
     heightScale: 0.25
     normalMapFilter: 0
-  isReadable: 0
+  isReadable: 1
   streamingMipmaps: 0
   streamingMipmapsPriority: 0
-  vTOnly: 0
-  ignoreMasterTextureLimit: 0
   grayScaleToAlpha: 0
   generateCubemap: 6
   cubemapConvolution: 0
@@ -33,12 +31,12 @@ TextureImporter:
   maxTextureSize: 2048
   textureSettings:
     serializedVersion: 2
-    filterMode: 1
-    aniso: 1
-    mipBias: 0
-    wrapU: 0
-    wrapV: 0
-    wrapW: 0
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
   nPOTScale: 1
   lightmap: 0
   compressionQuality: 50
@@ -56,14 +54,9 @@ TextureImporter:
   textureType: 0
   textureShape: 1
   singleChannelComponent: 0
-  flipbookRows: 1
-  flipbookColumns: 1
   maxTextureSizeSet: 0
   compressionQualitySet: 0
   textureFormatSet: 0
-  ignorePngGamma: 0
-  applyGammaDecoding: 0
-  cookieLightType: 0
   platformSettings:
   - serializedVersion: 3
     buildTarget: DefaultTexturePlatform
@@ -90,7 +83,7 @@ TextureImporter:
     androidETC2FallbackOverride: 0
     forceMaximumCompressionQuality_BC6H_BC7: 0
   - serializedVersion: 3
-    buildTarget: Server
+    buildTarget: Windows Store Apps
     maxTextureSize: 2048
     resizeAlgorithm: 0
     textureFormat: -1
@@ -126,7 +119,6 @@ TextureImporter:
     edges: []
     weights: []
     secondaryTextures: []
-    nameFileIdTable: {}
   spritePackingTag: 
   pSDRemoveMatte: 0
   pSDShowRemoveMatteOption: 0
diff --git a/Assets/Shaders/Dynamic/Textures/Tree1.png b/Assets/Shaders/Dynamic/Textures/Tree1.png
new file mode 100644
index 00000000..5d872c50
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/Tree1.png differ
diff --git a/Assets/Shaders/Dynamic/Textures/Tree1.png.meta b/Assets/Shaders/Dynamic/Textures/Tree1.png.meta
new file mode 100644
index 00000000..31b4c814
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Textures/Tree1.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: 37c911dc7c8d2104bb1c0380bd6a540c
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 10
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 7
+    mipMapFadeDistanceEnd: 9
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Windows Store Apps
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/Textures/Wheat.png b/Assets/Shaders/Dynamic/Textures/Wheat.png
new file mode 100644
index 00000000..66eb9ccb
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/Wheat.png differ
diff --git a/Assets/Shaders/Dynamic/Textures/Wheat.png.meta b/Assets/Shaders/Dynamic/Textures/Wheat.png.meta
new file mode 100644
index 00000000..f6d9158a
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Textures/Wheat.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: 2487e973c6e0d224f9e3e39f3ca3ac7d
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 10
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 0
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 512
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 512
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Windows Store Apps
+    maxTextureSize: 512
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 256
+    resizeAlgorithm: 0
+    textureFormat: 47
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/Textures/b8892ac4634b18a4faf86868641dd793.png b/Assets/Shaders/Dynamic/Textures/b8892ac4634b18a4faf86868641dd793.png
new file mode 100644
index 00000000..3139d80b
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/b8892ac4634b18a4faf86868641dd793.png differ
diff --git a/Assets/Shaders/Dynamic/Textures/b8892ac4634b18a4faf86868641dd793.png.meta b/Assets/Shaders/Dynamic/Textures/b8892ac4634b18a4faf86868641dd793.png.meta
new file mode 100644
index 00000000..de5addce
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Textures/b8892ac4634b18a4faf86868641dd793.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: 6a56b83030d34254ab9e8b3803bd5a07
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 10
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 0
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 512
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 512
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Windows Store Apps
+    maxTextureSize: 512
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 256
+    resizeAlgorithm: 0
+    textureFormat: 47
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/Textures/grass_PNG4933.png b/Assets/Shaders/Dynamic/Textures/grass_PNG4933.png
new file mode 100644
index 00000000..ba3ba4a9
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/grass_PNG4933.png differ
diff --git a/Assets/Shaders/Dynamic/Textures/grass_PNG4933.png.meta b/Assets/Shaders/Dynamic/Textures/grass_PNG4933.png.meta
new file mode 100644
index 00000000..836a1be8
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Textures/grass_PNG4933.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: f943011009b3e4f4e8c44b9b0571b221
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 10
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 0
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 512
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 512
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Windows Store Apps
+    maxTextureSize: 512
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 256
+    resizeAlgorithm: 0
+    textureFormat: 47
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/Textures/placement.png b/Assets/Shaders/Dynamic/Textures/placement.png
new file mode 100644
index 00000000..33e0f9b3
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/placement.png differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_NormalGL.jpg.meta b/Assets/Shaders/Dynamic/Textures/placement.png.meta
similarity index 86%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_NormalGL.jpg.meta
rename to Assets/Shaders/Dynamic/Textures/placement.png.meta
index b33a8290..f55ad5f2 100644
--- a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_NormalGL.jpg.meta
+++ b/Assets/Shaders/Dynamic/Textures/placement.png.meta
@@ -1,9 +1,9 @@
 fileFormatVersion: 2
-guid: 343c8774e6442f542a5a5e75dab37ad9
+guid: 0b35cd2ec975cae4297a5700bb887c3c
 TextureImporter:
   internalIDToNameTable: []
   externalObjects: {}
-  serializedVersion: 12
+  serializedVersion: 10
   mipmaps:
     mipMapMode: 0
     enableMipMap: 1
@@ -20,11 +20,9 @@ TextureImporter:
     externalNormalMap: 0
     heightScale: 0.25
     normalMapFilter: 0
-  isReadable: 0
+  isReadable: 1
   streamingMipmaps: 0
   streamingMipmapsPriority: 0
-  vTOnly: 0
-  ignoreMasterTextureLimit: 0
   grayScaleToAlpha: 0
   generateCubemap: 6
   cubemapConvolution: 0
@@ -34,8 +32,8 @@ TextureImporter:
   textureSettings:
     serializedVersion: 2
     filterMode: 1
-    aniso: 1
-    mipBias: 0
+    aniso: -1
+    mipBias: -100
     wrapU: 0
     wrapV: 0
     wrapW: 0
@@ -50,27 +48,22 @@ TextureImporter:
   spritePixelsToUnits: 100
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
-  alphaUsage: 1
+  alphaUsage: 0
   alphaIsTransparency: 0
   spriteTessellationDetail: -1
-  textureType: 1
+  textureType: 0
   textureShape: 1
   singleChannelComponent: 0
-  flipbookRows: 1
-  flipbookColumns: 1
   maxTextureSizeSet: 0
   compressionQualitySet: 0
   textureFormatSet: 0
-  ignorePngGamma: 0
-  applyGammaDecoding: 0
-  cookieLightType: 0
   platformSettings:
   - serializedVersion: 3
     buildTarget: DefaultTexturePlatform
     maxTextureSize: 2048
     resizeAlgorithm: 0
     textureFormat: -1
-    textureCompression: 1
+    textureCompression: 0
     compressionQuality: 50
     crunchedCompression: 0
     allowsAlphaSplitting: 0
@@ -82,7 +75,7 @@ TextureImporter:
     maxTextureSize: 2048
     resizeAlgorithm: 0
     textureFormat: -1
-    textureCompression: 1
+    textureCompression: 0
     compressionQuality: 50
     crunchedCompression: 0
     allowsAlphaSplitting: 0
@@ -90,11 +83,11 @@ TextureImporter:
     androidETC2FallbackOverride: 0
     forceMaximumCompressionQuality_BC6H_BC7: 0
   - serializedVersion: 3
-    buildTarget: Server
+    buildTarget: Windows Store Apps
     maxTextureSize: 2048
     resizeAlgorithm: 0
     textureFormat: -1
-    textureCompression: 1
+    textureCompression: 0
     compressionQuality: 50
     crunchedCompression: 0
     allowsAlphaSplitting: 0
@@ -106,7 +99,7 @@ TextureImporter:
     maxTextureSize: 2048
     resizeAlgorithm: 0
     textureFormat: -1
-    textureCompression: 1
+    textureCompression: 0
     compressionQuality: 50
     crunchedCompression: 0
     allowsAlphaSplitting: 0
@@ -126,7 +119,6 @@ TextureImporter:
     edges: []
     weights: []
     secondaryTextures: []
-    nameFileIdTable: {}
   spritePackingTag: 
   pSDRemoveMatte: 0
   pSDShowRemoveMatteOption: 0
diff --git a/Assets/Shaders/Dynamic/Textures/placement2.png b/Assets/Shaders/Dynamic/Textures/placement2.png
new file mode 100644
index 00000000..35fd087b
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/placement2.png differ
diff --git a/Assets/Shaders/Dynamic/Textures/placement2.png.meta b/Assets/Shaders/Dynamic/Textures/placement2.png.meta
new file mode 100644
index 00000000..3b1b720c
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Textures/placement2.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: da4d3caaa5f837d489a00201575f458b
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 10
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 0
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 0
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Windows Store Apps
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Dynamic/Textures/test.png b/Assets/Shaders/Dynamic/Textures/test.png
new file mode 100644
index 00000000..70e483cf
Binary files /dev/null and b/Assets/Shaders/Dynamic/Textures/test.png differ
diff --git a/Assets/Shaders/Dynamic/Textures/test.png.meta b/Assets/Shaders/Dynamic/Textures/test.png.meta
new file mode 100644
index 00000000..cb21aa75
--- /dev/null
+++ b/Assets/Shaders/Dynamic/Textures/test.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: 4ae789d2ed9128d4fb4f00384e672ce9
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 10
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 0
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Windows Store Apps
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 0
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage.meta b/Assets/Shaders/Foliage.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Shaders/Foliage.meta
rename to Assets/Shaders/Foliage.meta
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/FoliageCrossboard.mat b/Assets/Shaders/Foliage/FoliageCrossboard.mat
similarity index 100%
rename from com.saab.map-streamer/Runtime/Shaders/Foliage/FoliageCrossboard.mat
rename to Assets/Shaders/Foliage/FoliageCrossboard.mat
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/FoliageCrossboard.mat.meta b/Assets/Shaders/Foliage/FoliageCrossboard.mat.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Shaders/Foliage/FoliageCrossboard.mat.meta
rename to Assets/Shaders/Foliage/FoliageCrossboard.mat.meta
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/FoliageCrossboard.shader b/Assets/Shaders/Foliage/FoliageCrossboard.shader
similarity index 62%
rename from com.saab.map-streamer/Runtime/Shaders/Foliage/FoliageCrossboard.shader
rename to Assets/Shaders/Foliage/FoliageCrossboard.shader
index eb8a4f51..63222d58 100644
--- a/com.saab.map-streamer/Runtime/Shaders/Foliage/FoliageCrossboard.shader
+++ b/Assets/Shaders/Foliage/FoliageCrossboard.shader
@@ -1,37 +1,20 @@
-/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
 Shader "Custom/Foliage/Billboard"
 {
 	Properties
 	{
 		_MainTexArray("Tex2DArray (RGB)", 2DArray) = "white" {}
+		_NormalMapArray("Normal Map", 2DArray) = "bump" {}
 		_AdditiveSize("Additive foliage Size", Range(0, 30)) = 0
-		_CutoffMax("Alpha cutoff close", Range(0, 1)) = 0.2
-		_CutoffMin("Alpha cutoff far", Range(0, 1)) = 0.2
-		_Threshold("Alpha cutoff distance", float) = 1000
-		//_Wind("Wind (x,y speed)", Vector ) = ( 0, 0, 0, 0)
-		[MaterialToggle] _isToggled("Up Normals", Float) = 1
+		_CutoffMax("Alpha cutoff close", Range(0, 1)) = 0.6
+		_CutoffMin("Alpha cutoff far", Range(0, 1)) = 0.1
+		_Threshold("Alpha cutoff distance", float) = 100
+		[MaterialToggle] _isToggled("Up Normals", Float) = 0
 	}
 
 		SubShader
 		{
 			CGINCLUDE
 
-			#pragma multi_compile __ CROSSBOARD_ON
-
 			#pragma target 5.0
 			#pragma vertex vert
 			#pragma fragment frag
@@ -50,7 +33,6 @@ Shader "Custom/Foliage/Billboard"
 				float3	tex0	: TEXCOORD0;
 				float3	normal	: NORMAL;
 				float3	color	: TEXCOORD1;
-				float	alpha	: TEXCOORD3;
 			};
 
 			struct FoliagePoint
@@ -59,7 +41,6 @@ Shader "Custom/Foliage/Billboard"
 				float3 Color;
 				float Height;
 				float Random;
-				float Visibility;
 			};
 
 			struct FoliageShaderData
@@ -69,22 +50,15 @@ Shader "Custom/Foliage/Billboard"
 				float Weight;
 			};
 
-			// ---- Global ----
-			sampler2D _WindTexture;
-			float3 _WorldOffset;
-			// ----------------
-
 			uint _foliageCount;
 			float _AdditiveSize;
 			float _CutoffMax;
 			float _CutoffMin;
 			float _Threshold;
 			float _isToggled;
-			float3 _WindVector;
-
-			sampler2D _PerlinNoise;
 
 			UNITY_DECLARE_TEX2DARRAY(_MainTexArray);
+			UNITY_DECLARE_TEX2DARRAY(_NormalMapArray);
 
 			// ****** foliage point cloud ******
 			StructuredBuffer<FoliagePoint> _PointBuffer;
@@ -104,27 +78,17 @@ Shader "Custom/Foliage/Billboard"
 				return weight;
 			}
 
-			float3 SphereProjectedNormal(FS_INPUT i)
+			float3 CylinderProjectedNormal(FS_INPUT i)
 			{
-				fixed4 col = UNITY_SAMPLE_TEX2DARRAY(_MainTexArray, i.tex0);
-
-				float3 camToPixelDir = normalize(i.wp - _WorldSpaceCameraPos);
-				float3 camToCenter = (i.center - _WorldSpaceCameraPos);
-				float centerProjection = dot(camToPixelDir, camToCenter);
-				float3 rightAnglePoint = _WorldSpaceCameraPos + camToPixelDir * centerProjection;
-				// float centerDistance = distance(i.center, rightAnglePoint);
-				float3 centerOffset = i.center - rightAnglePoint;
-				float centerDistanceSquared = dot(centerOffset, centerOffset);
-
-				float radiusSquared = i.radius * i.radius;
-
-				if (centerDistanceSquared > radiusSquared)
-					return normalize(rightAnglePoint - i.center);
-
-				float rightAngleDistance = sqrt(radiusSquared - centerDistanceSquared);
-				float3 projectedPoint = rightAnglePoint - camToPixelDir * (rightAngleDistance * (10 * col.r));
-
-				return normalize(projectedPoint - i.center);
+				float3 CamToPixelDir = normalize(i.wp - _WorldSpaceCameraPos);
+				float3 CamToCenter = (i.center - _WorldSpaceCameraPos);
+				float CenterProjection = dot(CamToPixelDir, CamToCenter);
+				float3 RightAnglePoint = _WorldSpaceCameraPos + CamToPixelDir * CenterProjection;
+				float CenterDistance = distance(i.center, RightAnglePoint);
+				float RightAngleDistance = sqrt(i.radius * i.radius - CenterDistance * CenterDistance);
+				float3 ProjectedPoint = RightAnglePoint - CamToPixelDir * RightAngleDistance;
+
+				return normalize(ProjectedPoint - i.center);
 			}
 
 			float CutoffDistance(float distance)
@@ -134,24 +98,6 @@ Shader "Custom/Foliage/Billboard"
 				return c;
 			}
 
-			float2 VectorToSphereUV(float3 normal)
-			{
-				float u = 0.5 + atan2(normal.z, normal.x) / (2 * 3.14159265359);
-				float v = 0.5 - asin(normal.y) / 3.14159265359;
-				return float2(u, v);
-			}
-
-			float invLerp(float from, float to, float value) 
-            {
-                return (value - from) / (to - from);
-            }
-
-            float remap(float origFrom, float origTo, float targetFrom, float targetTo, float value) 
-            {
-                float rel = invLerp(origFrom, origTo, value);
-                return lerp(targetFrom, targetTo, rel);
-            }
-
 			ENDCG
 
 			// ********* Opaque alpha cutoff - Deferred  *********
@@ -169,7 +115,7 @@ Shader "Custom/Foliage/Billboard"
 				Blend Off
 				CGPROGRAM
 				#include "Geometry.cginc" 
-				#pragma geometry geo
+				#pragma geometry Crossboard
 
 				#pragma target 5.0
 				#pragma multi_compile_prepassfinal noshadowmask nodynlightmap nodirlightmap nolightmap noshadow 
@@ -182,49 +128,52 @@ Shader "Custom/Foliage/Billboard"
 					float c = CutoffDistance(distance(i.wp, _WorldSpaceCameraPos));
 					clip(col.a - c);
 
+					col.rgb = col.rgb * 0.7f + i.color.rgb * 0.3f;
 
 					fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.wp));
 					float depth = i.pos.z / i.pos.w;
 					
 					float3 LookDir = normalize(_WorldSpaceCameraPos - i.wp);
-					//float blend = dot(i.normal, LookDir);
+					float blend = dot(i.normal, LookDir);
 
 					// *********** sphere normals ************* 
-					float3 sphereNormal = SphereProjectedNormal(i);
-					float2 SphereUV = VectorToSphereUV(sphereNormal);	// sphere normal uv coord 
-					
-					float3 finalNormal = sphereNormal;
+					float3 cylinderNormal = CylinderProjectedNormal(i);
+					float3 finalNormal = cylinderNormal;
 
-					col.rgb = col.rgb * 0.9f + i.color.rgb * 0.1f;
-	
 					if (_isToggled)
-					{
-						finalNormal = i.normal;
-						col.rgb = col.rgb * i.tex0.y + i.color.rgb * 0.4 * (1 - i.tex0.y);
-					}
+						finalNormal = float3(0, 1, 0);
 
 					const half4x4 thresholdMatrix =
 					{
-						0, 8, 2, 10,
-						12, 4, 14, 6,
-						3, 11, 1, 9,
-						15, 7, 13, 5
+						1, 9, 3, 11,
+						13, 5, 15, 7,
+						4, 12, 2, 10,
+						16, 8, 14, 6
+					};
+					const half4x4 invThresholdMatrix =
+					{
+						16, 8, 14, 6,
+						4, 12, 2, 10,
+						13, 5, 15, 7,
+						1, 9, 3, 11
 					};
 
-					fixed threshold = thresholdMatrix[i.pos.x % 4][i.pos.y % 4] / 17;
-					float power = 3;
-					clip(i.alpha - threshold);
+					fixed threshold;
 
-					if(1 - abs(i.normal.y) < 0.01)
+					if (depth % 2 == 0)
 					{
-						float upGradient = abs(dot(LookDir, i.normal));
-						float angle = 2 * acos(upGradient) / 3.141592653589793238462643;
-						float linearAngle = remap(0.3, 0.7, 1, 0, angle);
-
-						if(linearAngle <= threshold)
-							discard;
+						threshold = invThresholdMatrix[i.pos.x % 4][i.pos.y % 4] / 17;
+					}
+					else
+					{
+						threshold = thresholdMatrix[i.pos.x % 4][i.pos.y % 4] / 17;
 					}
 
+					float power = 3;
+					if (threshold >= (-pow(1 - abs(blend), power) + 1) * (1 - i.normal.y) + (i.normal.y) * pow(abs(blend), power))
+					{
+						//discard;
+					}
 
 					#ifdef UNITY_COMPILER_HLSL
 						SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0;
@@ -232,7 +181,7 @@ Shader "Custom/Foliage/Billboard"
 						SurfaceOutputStandardSpecular o;
 					#endif
 
-					o.Albedo = col.rgb;//normalize(finalNormal.xyz).rgb;
+					o.Albedo = col.rgb; //normalize(trueNormal * sign(blend)).rgb;
 					o.Emission = 0.0f;
 					o.Alpha = col.a;
 					o.Occlusion = 1.0f;
@@ -308,7 +257,6 @@ Shader "Custom/Foliage/Billboard"
 
 				#pragma multi_compile_shadowcaster
 				#pragma multi_compile_instancing	// allow instanced shadow pass for most of the shaders
-
 				#pragma geometry Billboard
 
 				// Fragment Shader 
@@ -317,7 +265,6 @@ Shader "Custom/Foliage/Billboard"
 					fixed4 col = UNITY_SAMPLE_TEX2DARRAY(_MainTexArray, i.tex0);
 					float c = CutoffDistance(distance(i.wp, _WorldSpaceCameraPos));
 					clip(col.a - c);
-
 					return float4(0,0,0,0);
 				}
 				ENDCG
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/FoliageCrossboard.shader.meta b/Assets/Shaders/Foliage/FoliageCrossboard.shader.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Shaders/Foliage/FoliageCrossboard.shader.meta
rename to Assets/Shaders/Foliage/FoliageCrossboard.shader.meta
diff --git a/Assets/Shaders/Foliage/FoliagePlacement.compute b/Assets/Shaders/Foliage/FoliagePlacement.compute
new file mode 100644
index 00000000..29ae20c8
--- /dev/null
+++ b/Assets/Shaders/Foliage/FoliagePlacement.compute
@@ -0,0 +1,374 @@
+#pragma kernel CSPlacement
+#pragma kernel CSHeightMap
+#pragma kernel CSCull
+#pragma kernel CSFindBufferSize
+#pragma kernel CSFindMinUv
+#pragma kernel CSUpSampleVegetation
+
+struct FoliagePoint
+{
+	float3 Position;
+	float3 Color;
+	float Height;
+	float Random;
+};
+
+// Buffers
+StructuredBuffer<float3> surfaceVertices;
+StructuredBuffer<int> surfaceIndices;
+StructuredBuffer<float2> surfaceUVs;
+
+RWStructuredBuffer<uint> BufferSize;
+RWStructuredBuffer<uint> MinXY;
+
+AppendStructuredBuffer<FoliagePoint> TerrainPoints;		// Calculated points for one mesh
+StructuredBuffer<FoliagePoint> InputBuffer;				// buffer with all points
+StructuredBuffer<float> PixelToWorld;					// matrix pixel to world (worldpixel coord)
+AppendStructuredBuffer<FoliagePoint> OutputBuffer;		// buffer with all (frustum) culled points 
+
+// textures input
+Texture2D<unorm float> SplatMap;
+Texture2D<float4> Texture;
+Texture2D<float2> HeightSurface;
+RWTexture2D<float> VegetationHeightMap;
+RWTexture2D<float> HeightMap;
+
+// Camera
+float3 CameraPosition;						// camera position in worldPos
+float4 frustumPlanes[6];					// Frustum planes (6 planes * 4 floats: [ normal.x, normal.y, normal.z, distance ])
+
+// Global Variables
+float2 NodeOffset;							// botom left corner of node in "world" space
+float maxHeight;							// max size of foliage in meters
+uint indexCount;							// mesh index count
+uint uvCount;								// the size of surfaceUVs buffer
+float2 terrainResolution;                   // Resolution of texture/feauture texture
+float2 heightResolution;					// Resolution of height texture
+float3 terrainSize;							// size of terrain (mesh) size
+float2 Resolution;							// the size of each pixel in meters
+float Density;								// density of trees
+float3 MeshBoundsMax;						// Mesh offset
+float4x4 ObjToWorld;						// Local To World
+
+// ************* Inside triangle check ************* //
+bool TriangleCheck(float2 p, float2 A, float2 B, float2 C)
+{
+	float area = 0.5 * (-B.y * C.x + A.y * (-B.x + C.x) + A.x * (B.y - C.y) + B.x * C.y);
+	float sign = area < 0 ? -1 : 1;
+
+	float s = (A.y * C.x - A.x * C.y + (C.y - A.y) * p.x + (A.x - C.x) * p.y) * sign;
+	float t = (A.x * B.y - A.y * B.x + (A.y - B.y) * p.x + (B.x - A.x) * p.y) * sign;
+
+	return s >= 0 && t >= 0 && (s + t) <= 2 * area * sign;
+}
+
+// ************* Plane Intersect ************* //
+float PlaneIntersect(float3 origin, float3 ray, float3 planeNormal, float3 planeCoord, out bool success)
+{
+	success = true;
+	// calculate plane
+	float distance = dot(planeNormal, planeCoord);
+
+	// avoid divide by zero
+	if (dot(planeNormal, ray) == 0)
+	{
+		success = false;
+		return 0;
+	}
+
+	// Compute the t value for the directed line ray intersecting the plane
+	float t = (distance - dot(planeNormal, origin)) / dot(planeNormal, ray);
+
+	// scale the ray by t
+	float3 newRay = ray * t;
+
+	// calc contact point
+	float3 contact = origin + newRay;
+
+	return contact.y;
+}
+
+float3 GetPixelCoord(float2 uv, float height = 0)
+{
+	// z-coordinate is negative because of the infamous BTA Z-flip	
+	float2 offset = terrainResolution * Resolution;
+	float3 coord = float3(uv.x * Resolution.x - offset.x + MeshBoundsMax.x, height, -uv.y * Resolution.y + MeshBoundsMax.z);
+	return coord;
+}
+
+float Random(float input, float mutator = 0.546)
+{
+	float random = frac(sin(input + mutator) * 14237.5554353);
+	return random;
+}
+
+float Random2D(float2 input, float mutator = 0.546)
+{
+	float i = (input.x * 131.071) + (input.y * 655.37);
+	return Random(i, mutator);
+}
+
+float BilinearHeight(int2 texCoord, float2 frac)
+{
+	float dl, dr, ul, ur;
+
+	dl = HeightMap[texCoord].r;
+	dr = HeightMap[int2(texCoord.x + 1, texCoord.y)].r;
+	ul = HeightMap[int2(texCoord.x, texCoord.y + 1)].r;
+	ur = HeightMap[int2(texCoord.x + 1, texCoord.y + 1)].r;
+
+	float dx = lerp(dl, dr, frac.x);
+	float ux = lerp(ul, ur, frac.x);
+
+	return lerp(ux, dx, frac.y);
+}
+
+float2 GetWorldCoord(uint2 texCoord, float3x3 worldToTexCoord, float2 nodeCoord)
+{
+	float stepsize = 1 / Density;
+	float3 worldCoord = mul(worldToTexCoord, float3(texCoord.xy, 1));
+
+	float2 nodeOffset = worldCoord / stepsize;
+
+	float wpx = ceil(nodeOffset.x) * stepsize;
+	float wpy = ceil(nodeOffset.y) * stepsize;
+
+	float2 foliageOffset = float2(fmod((wpx - worldCoord.x - Resolution.x), stepsize), fmod((wpy - worldCoord.y - Resolution.y), stepsize));
+
+	float2 WorldPixelCoord = nodeCoord + (texCoord * Resolution);
+	return WorldPixelCoord + foliageOffset;
+}
+
+// ************* Find min uv value ************* //
+[numthreads(32, 1, 1)]
+void CSFindMinUv(int3 id : SV_DispatchThreadID)
+{
+	if (id.x > uvCount)
+		return;
+
+	InterlockedMin(MinXY[0], (uint)(surfaceUVs[id.x].x * terrainResolution));
+	InterlockedMin(MinXY[1], (uint)(surfaceUVs[id.x].y * terrainResolution));
+}
+
+// ************* upsample SurfaceHeight with feauturedata ************* //
+[numthreads(4, 4, 1)]
+void CSUpSampleVegetation(int3 id : SV_DispatchThreadID)
+{
+	int2 uv = id.xy;
+	//int2 uvClamped = int2(clamp(uv.x - 1, 0, (int)heightResolution.x - 1), clamp(uv.y - 1, 0, (int)heightResolution.y - 1));
+
+	uint2 terrainRes = (terrainResolution - float2(2, 2));
+
+	uint2 featureStart = ceil((uv / heightResolution) * terrainRes);
+	uint2 featureEnd = ceil(((uv + float2(1,1)) / heightResolution) * terrainRes);
+
+	int count = 0;
+	int pixels = abs(featureEnd.x - featureStart.x) * abs(featureEnd.y - featureStart.y);
+
+	for (uint x = featureStart.x; x < featureEnd.x; x++)
+	{
+		for (uint y = featureStart.y; y < featureEnd.y; y++)
+		{
+			if (uint(SplatMap[float2(x, y)] * 255) == 40)
+				count++;
+		}
+	}
+
+	float percentage = count / pixels;
+	
+	float height = HeightSurface[uv].r;
+	VegetationHeightMap[uv] = height;
+}
+
+// ************* Generate Placement ************* //
+[numthreads(8, 8, 1)]
+void CSFindBufferSize(int3 id : SV_DispatchThreadID)
+{
+	float2 uv = id.xy;
+	int2 uvOffset = int2(1, 1);
+	uint feature = uint(SplatMap[uv + uvOffset] * 255.0);
+
+	if (feature == 40)
+	{
+		InterlockedAdd(BufferSize[0], 1);
+	}
+}
+
+// ************* Height Map Gen ************* //
+[numthreads(4, 4, 4)]
+void CSHeightMap(int3 id : SV_DispatchThreadID)
+{
+	uint index = (id.x * 3);
+	if (id.x > indexCount) { return; }
+
+	// Vertices for one triangle
+	float3 v1 = surfaceVertices[surfaceIndices[index]];
+	float3 v2 = surfaceVertices[surfaceIndices[index + 1]];
+	float3 v3 = surfaceVertices[surfaceIndices[index + 2]];
+
+	float maxVert = max(max(v1.y, v2.y), v3.y);
+
+	// pixelcoords for one triangle
+	float2 uv1 = surfaceUVs[surfaceIndices[index]] * terrainResolution;
+	float2 uv2 = surfaceUVs[surfaceIndices[index + 1]] * terrainResolution;
+	float2 uv3 = surfaceUVs[surfaceIndices[index + 2]] * terrainResolution;
+
+	// triangle normal
+	float3 planeNormal = normalize(cross(v2 - v1, v3 - v1));
+
+	// pixel grid to work
+	uint Xmax = max(max(uv1.x, uv2.x), uv3.x);
+	uint Xmin = min(min(uv1.x, uv2.x), uv3.x);
+	uint Ymax = max(max(uv1.y, uv2.y), uv3.y);
+	uint Ymin = min(min(uv1.y, uv2.y), uv3.y);
+
+	float height = maxVert;
+
+	// divide the for loop in 4x4 threads
+	// TODO: WHY + 2?!?!
+	int offsetX = ceil((Xmax - Xmin + 2) / 4);
+	int startX = Xmin + (id.y * offsetX);
+	int endX = Xmin + ((id.y + 1) * offsetX);
+
+	int offsetY = ceil((Ymax - Ymin + 2) / 4);
+	int startY = Ymin + (id.z * offsetY);
+	int endY = Ymin + ((id.z + 1) * offsetY);
+
+	bool success = true;
+
+	for (uint x = startX; x <= min(Xmax, endX); x++)
+	{
+		for (uint y = startY; y <= min(Ymax, endY); y++)
+		{
+			float2 uv = float2(x, y);
+			// HeightMap[uv] = height;
+			// check if inside triangle
+
+			if (TriangleCheck(uv, round(uv1), round(uv2), round(uv3)))
+			{
+				float3 pixelCoord = GetPixelCoord(uv, 1024);
+				height = PlaneIntersect(pixelCoord, float3(0, -1, 0), planeNormal, v1, success);
+
+				if (!success)
+					height = maxVert;
+
+				HeightMap[uv] = height;
+			}
+		}
+	}
+}
+
+// ************* Generate Placement ************* //
+[numthreads(4, 4, 4)]
+void CSPlacement(uint3 id : SV_DispatchThreadID)
+{
+	float3x3 ToWorldTexCoord = {
+		PixelToWorld[0], PixelToWorld[1], PixelToWorld[2],
+		PixelToWorld[3], PixelToWorld[4], PixelToWorld[5],
+		PixelToWorld[6], PixelToWorld[7], PixelToWorld[8],
+	};
+
+	float stepsize = (1 / Density);
+	float xCount = ceil(max(Resolution.x * Density, Resolution.x));
+	float yCount = ceil(max(Resolution.y * Density, Resolution.y));
+
+	float subPixelX = (1 / xCount);
+	float subPixelY = (1 / yCount);
+	float2 subPixel = float2(subPixelX, subPixelY);
+
+	uint2 uv = id.xy;
+	uint feature = uint(SplatMap[uv] * 255);
+	float2 pixelOverLap = float2(0, 0);
+
+	if (feature == 40)
+	{
+		// divide the for loop in 4 threads
+		uint threadx = ceil(xCount / 4);
+		uint start = id.z * threadx;
+		uint end = (id.z + 1) * threadx;
+
+		// loop throgh all potential points in pixel
+		for (uint x = start; x < min(end, xCount); x++)
+		{
+			for (uint y = 0; y < yCount; y++)
+			{
+				float2 pixelOffset = subPixel * float2(x, y);
+				float3 worldCoord = mul(ToWorldTexCoord, float3(uv.xy + pixelOffset.xy, 1));
+
+				float2 nodeOffset = worldCoord.xy / stepsize;
+				float wpx = ceil(nodeOffset.x) * stepsize;
+				float wpy = ceil(nodeOffset.y) * stepsize;
+
+				float offsetX = (wpx - worldCoord.x);
+				float offsetY = (wpy - worldCoord.y);
+
+				float2 foliagePoint = float2(GetPixelCoord(uv + pixelOffset + pixelOverLap).x + offsetX, GetPixelCoord(uv + pixelOffset + pixelOverLap).z - (Resolution.y - offsetY));
+
+				float2 randoffset = fmod(GetWorldCoord(uv, ToWorldTexCoord, NodeOffset), 1000);
+				float2 rand = randoffset * 0.001;
+
+				float angle = (Random2D(rand, 0.831) * 2 - 1) * 3.141592;
+				float2 randDir = float2(cos(angle), sin(angle));
+				float distance = Random2D(rand, 0.243) * (stepsize * 0.5) * sqrt(2);
+				float2 randomPoint = randDir * distance;
+				float2 uvfrac = frac(randomPoint / Resolution);
+				float2 uvOffset = floor(randomPoint / Resolution);
+				uvOffset.y *= -1;
+
+				// check if uv coord is valid (handle pixel Overlap)
+				if (any((uv + uvOffset) > (terrainResolution - float2(2, 2))) || any((uv + uvOffset) < float2(1, 1)))
+					continue;
+
+				feature = uint(SplatMap[uv + uvOffset] * 255);
+				float height = BilinearHeight(uv + uvOffset, uvfrac);		// we should interpolate height
+
+				if (offsetX < (Resolution.x * subPixelX) && offsetY < (Resolution.y * subPixelY) && feature == 40)
+				{
+					float3 color = Texture[uv + uvOffset].xyz;
+					float2 uvHeight = (id.xy / (terrainResolution - float2(2,2))) * heightResolution;
+					float surfaceHeight = HeightSurface[uvHeight].x;
+
+					float3 coord = float3(foliagePoint.x + randomPoint.x, height, foliagePoint.y + randomPoint.y);
+
+					FoliagePoint res;
+					res.Position = coord.xyz;
+					res.Color = color;
+					res.Random = Random2D(rand);
+					res.Height = surfaceHeight;
+
+					TerrainPoints.Append(res);
+				}
+			}
+		}
+	}
+}
+
+// ************* Terrain frustum culling ************* //
+inline bool IsInFrustum(float3 positionAfterProjection, float threshold)
+{
+	return (dot(normalize(frustumPlanes[0].xyz), positionAfterProjection) >= threshold &&
+		dot(normalize(frustumPlanes[1].xyz), positionAfterProjection) >= threshold &&
+		dot(normalize(frustumPlanes[2].xyz), positionAfterProjection) >= threshold &&
+		dot(normalize(frustumPlanes[3].xyz), positionAfterProjection) >= threshold);
+}
+
+// ************* Cull Points ************* //
+[numthreads(128, 1, 1)]
+void CSCull(uint3 id : SV_DispatchThreadID)
+{
+	FoliagePoint data = InputBuffer[id.x];
+	float4 pos = mul(ObjToWorld, float4(data.Position.xyz, 1));
+
+	// handle points with no value. (allocated points in buffer is by default float3(0,0,0)) 
+	if (length(data.Position.xyz) == 0)
+		return;
+
+	if (length(pos.xyz - CameraPosition) > frustumPlanes[5].w)
+		return;
+
+	if (IsInFrustum((pos.xyz - CameraPosition), -maxHeight))
+	{
+		data.Position = pos.xyz;
+		OutputBuffer.Append(data);
+	}
+}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/FoliagePlacement.compute.meta b/Assets/Shaders/Foliage/FoliagePlacement.compute.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Shaders/Foliage/FoliagePlacement.compute.meta
rename to Assets/Shaders/Foliage/FoliagePlacement.compute.meta
diff --git a/Assets/Shaders/Foliage/Geometry.cginc b/Assets/Shaders/Foliage/Geometry.cginc
new file mode 100644
index 00000000..16649da5
--- /dev/null
+++ b/Assets/Shaders/Foliage/Geometry.cginc
@@ -0,0 +1,251 @@
+void AppendVertex(inout FS_INPUT pin, float3 wp, float3 center, float radius, float3 uv, float3 normal, float3 color)
+{
+	pin.pos = UnityObjectToClipPos(wp);
+	pin.wp = wp;
+	pin.center = center;
+	pin.radius = radius;
+	pin.tex0 = uv;
+	pin.normal = normal;
+	pin.color = color;
+}
+
+float Random(float input, float mutator = 0.546)
+{
+	float random = frac(sin(input + mutator) * 142375.554353);
+	return random;
+}
+
+float Random2D(float2 input, float mutator = 0.546)
+{
+	float i = (input.x * 131.071) + (input.y * 655.37);
+	return Random(i, mutator);
+}
+
+int WeightedRandom(float random, float height)
+{
+	float weightSum = 0;
+	for (int index = 0; index < _foliageCount; index++)
+	{
+		float heightWeight = _foliageData[index].MaxMin.x > height ? 0 : 1;
+		weightSum += _foliageData[index].Weight * heightWeight;
+	}
+
+	float r = random * weightSum;
+
+	for (int i = 0; i < _foliageCount; i++)
+	{
+		float heightWeight = _foliageData[i].MaxMin.x > height ? 0 : 1;
+		r -= (_foliageData[i].Weight * heightWeight);
+		if (r >= 0)
+			continue;
+
+		if (heightWeight == 0)
+			return -1;
+
+		return i;
+	}
+	return -1;
+}
+
+// Geometry Shader Billboard
+[maxvertexcount(4)]
+void Billboard(point uint p[1] : TEXCOORD, inout TriangleStream<FS_INPUT> triStream)
+{
+	// ********************* point cloud data  ********************* //
+
+	float3 pos = _PointBuffer[p[0]].Position;
+	float3 color = _PointBuffer[p[0]].Color;
+	float height = _PointBuffer[p[0]].Height;
+	float random = _PointBuffer[p[0]].Random;
+
+	// ********************* MaxMin height  ********************* //
+
+	float foliageFactor = 0.2f;
+	float maxHorizonHeight = height * (1 + foliageFactor);
+	float minHorizonHeight = height * (1 - foliageFactor);
+
+	// ********************* foliage type data  ********************* //
+
+	int type = floor(random * _foliageCount);
+	type = WeightedRandom(random, height);
+	if (type < 0)
+		return;
+
+	float2 minMaxHeight = _foliageData[type].MaxMin;
+	float2 offset = _foliageData[type].Offset;
+	float weight = _foliageData[type].Weight;
+
+	// ********************* ***************  ********************* //
+
+	float foliageHeight = minMaxHeight.x + ((minMaxHeight.y - minMaxHeight.x) * Random(random, 0.321f));
+	foliageHeight = clamp(foliageHeight, minMaxHeight.x, height);
+	height = foliageHeight + _AdditiveSize;
+	pos.y -= offset.y * height;		// offset to handle Roots
+
+	float3 up = float3(0, 1, 0);
+	float3 look = float3(1, 1, 1);
+
+	float halfS = 0.5f * height;
+	float3 center = pos + up * halfS;
+
+#ifdef SHADOW_BILLBOARD
+	look = _WorldSpaceLightPos0;
+#else
+	look = _WorldSpaceCameraPos - pos;
+#endif
+
+	look.y = 0;
+	look = normalize(look);
+	float3 right = cross(up, look);
+
+	float4 v[4];
+	v[0] = float4(pos + halfS * right, 1.0f);
+	v[1] = float4(pos + halfS * right + height * up, 1.0f);
+	v[2] = float4(pos - halfS * right, 1.0f);
+	v[3] = float4(pos - halfS * right + height * up, 1.0f);
+
+	float3 uv0 = float3(1.0f, 0.0f, type);
+	float3 uv1 = float3(1.0f, 1.0f, type);
+	float3 uv2 = float3(0.0f, 0.0f, type);
+	float3 uv3 = float3(0.0f, 1.0f, type);
+
+	#ifdef CROSSBOARD
+		uv0 = float3(0.5f, 0.0f, type);
+		uv1 = float3(0.5f, 0.5f, type);
+		uv2 = float3(0.0f, 0.0f, type);
+		uv3 = float3(0.0f, 0.5f, type);
+	#endif
+
+	FS_INPUT pIn;
+
+	AppendVertex(pIn, v[0], center, halfS, uv0, -look, color);
+	triStream.Append(pIn);
+
+	AppendVertex(pIn, v[1], center, halfS, uv1, -look, color);
+	triStream.Append(pIn);
+
+	AppendVertex(pIn, v[2], center, halfS, uv2, -look, color);
+	triStream.Append(pIn);
+
+	AppendVertex(pIn, v[3], center, halfS, uv3, -look, color);
+	triStream.Append(pIn);
+}
+
+[maxvertexcount(12)]
+void Crossboard(point uint p[1] : TEXCOORD, inout TriangleStream<FS_INPUT> triStream)
+{
+	// ********************* point cloud data  ********************* //
+
+	float3 pos = _PointBuffer[p[0]].Position;
+	float3 color = _PointBuffer[p[0]].Color;
+	float height = _PointBuffer[p[0]].Height;
+	float random = _PointBuffer[p[0]].Random;
+
+	// ********************* MaxMin height  ********************* //
+
+	float foliageFactor = 0.2f;
+	float maxHorizonHeight = height * (1 + foliageFactor);
+	float minHorizonHeight = height * (1 - foliageFactor);
+
+	// ********************* foliage type data  ********************* //
+
+	int type = floor(random * _foliageCount);	// calculate the foliage (index) to place down
+	type = WeightedRandom(random, height);
+	if (type < 0)
+		return;
+
+	float2 minMaxHeight = _foliageData[type].MaxMin;
+	float2 offset = _foliageData[type].Offset;
+	float weight = _foliageData[type].Weight;
+
+	// ********************* ***************  ********************* //
+
+	float foliageHeight = minMaxHeight.x + ((minMaxHeight.y - minMaxHeight.x) * Random(random, 0.321f));
+	foliageHeight = clamp(foliageHeight, minMaxHeight.x, height);
+	height = foliageHeight + _AdditiveSize;
+	pos.y -= offset.y * height;		// offset to handle Roots
+
+	float3 up = normalize(float3(0, 1, 0));
+	float angle = (Random(random, 0.131f) * 2 - 1) * 3.141592;
+	float3 randDir = float3(cos(angle), 0, sin(angle));
+
+	float3 right = randDir; 
+	float3 front = normalize(-cross(up, right));
+
+	float halfS = 0.5f * height;
+	float3 center = pos + up * halfS;
+
+	// *********** front points ***********
+
+	float4 f[4];
+	f[0] = float4(pos + halfS * right, 1.0f);
+	f[1] = float4(pos + halfS * right + height * up, 1.0f);
+	f[2] = float4(pos - halfS * right, 1.0f);
+	f[3] = float4(pos - halfS * right + height * up, 1.0f);
+
+	// *********** Right points ***********
+
+	float4 r[4];
+	r[0] = float4(pos + halfS * front, 1.0f);
+	r[1] = float4(pos + halfS * front + height * up, 1.0f);
+	r[2] = float4(pos - halfS * front, 1.0f);
+	r[3] = float4(pos - halfS * front + height * up, 1.0f);
+
+	// *********** Top points ***********
+
+	float4 t[4];
+	t[0] = float4(center + halfS * right - halfS * front, 1.0f);
+	t[1] = float4(center + halfS * right + halfS * front, 1.0f);
+	t[2] = float4(center - halfS * right - halfS * front, 1.0f);
+	t[3] = float4(center - halfS * right + halfS * front, 1.0f);
+
+	// *********** Crossboards ***********
+
+	FS_INPUT pIn;
+
+	// *********** front face ***********
+
+	AppendVertex(pIn, f[0], center, halfS, float3(0.5f, 0.0f, type), normalize(front), color);
+	triStream.Append(pIn);
+
+	AppendVertex(pIn, f[1], center, halfS, float3(0.5f, 0.5f, type), normalize(front), color);
+	triStream.Append(pIn);
+
+	AppendVertex(pIn, f[2], center, halfS, float3(0.0f, 0.0f, type), normalize(front), color);
+	triStream.Append(pIn);
+
+	AppendVertex(pIn, f[3], center, halfS, float3(0.0f, 0.5f, type), normalize(front), color);
+	triStream.Append(pIn);
+
+	// *********** right face ***********
+
+	triStream.RestartStrip();
+
+	AppendVertex(pIn, r[0], center, halfS, float3(0.5f, 0.5f, type), normalize(right), color);
+	triStream.Append(pIn);
+
+	AppendVertex(pIn, r[1], center, halfS, float3(0.5f, 1.0f, type), normalize(right), color);
+	triStream.Append(pIn);
+
+	AppendVertex(pIn, r[2], center, halfS, float3(0.0f, 0.5f, type), normalize(right), color);
+	triStream.Append(pIn);
+
+	AppendVertex(pIn, r[3], center, halfS, float3(0.0f, 1.0f, type), normalize(right), color);
+	triStream.Append(pIn);
+
+	// *********** top face ***********
+
+	triStream.RestartStrip();
+
+	AppendVertex(pIn, t[0], center, halfS, float3(1.0f, 0.0f, type), normalize(up), color);
+	triStream.Append(pIn);
+
+	AppendVertex(pIn, t[1], center, halfS, float3(1.0f, 0.5f, type), normalize(up), color);
+	triStream.Append(pIn);
+
+	AppendVertex(pIn, t[2], center, halfS, float3(0.5f, 0.0f, type), normalize(up), color);
+	triStream.Append(pIn);
+
+	AppendVertex(pIn, t[3], center, halfS, float3(0.5f, 0.5f, type), normalize(up), color);
+	triStream.Append(pIn);
+}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/Geometry.cginc.meta b/Assets/Shaders/Foliage/Geometry.cginc.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Shaders/Foliage/Geometry.cginc.meta
rename to Assets/Shaders/Foliage/Geometry.cginc.meta
diff --git a/Assets/Shaders/GlowOutline.meta b/Assets/Shaders/GlowOutline.meta
new file mode 100644
index 00000000..611492ba
--- /dev/null
+++ b/Assets/Shaders/GlowOutline.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e0fdf7d8484682e4c8ba47bc34077daa
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/GlowOutline/Resources.meta b/Assets/Shaders/GlowOutline/Resources.meta
new file mode 100644
index 00000000..4935d36c
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Resources.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1099cf71e8ea24647b901d61054f11eb
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/GlowOutline/Resources/Blur.shader b/Assets/Shaders/GlowOutline/Resources/Blur.shader
new file mode 100644
index 00000000..abc9e75f
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Resources/Blur.shader
@@ -0,0 +1,140 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: Blur.shader
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
+
+Shader "Hidden/Blur"
+{
+	Properties
+	{
+		_MainTex ("Texture", 2D) = "white" {}
+	}
+	SubShader
+	{
+		Cull Off ZWrite Off ZTest Always
+
+		// Horizontal
+		Pass
+		{
+			CGPROGRAM
+			#pragma vertex vert
+			#pragma fragment frag
+			
+			#include "UnityCG.cginc"
+
+			struct appdata
+			{
+				float4 vertex : POSITION;
+				float2 uv : TEXCOORD0;
+			};
+
+			struct v2f
+			{
+				float4 vertex : SV_POSITION;
+				float2 uv : TEXCOORD0;
+			};
+
+			v2f vert (appdata v)
+			{
+				v2f o;
+				o.vertex = UnityObjectToClipPos(v.vertex);
+				o.uv = v.uv;
+				return o;
+			}
+			
+			sampler2D _MainTex;
+			float2 _BlurSize;
+
+			fixed4 frag (v2f i) : SV_Target
+			{
+				fixed4 s = tex2D(_MainTex, i.uv) * 0.38774;
+				s += tex2D(_MainTex, i.uv + float2(_BlurSize.x * 2, 0)) * 0.06136;
+				s += tex2D(_MainTex, i.uv + float2(_BlurSize.x, 0)) * 0.24477;
+				s += tex2D(_MainTex, i.uv + float2(_BlurSize.x * -1, 0)) * 0.24477;
+				s += tex2D(_MainTex, i.uv + float2(_BlurSize.x * -2, 0)) * 0.06136;
+
+				return s;
+			}
+			ENDCG
+		}
+
+		// Vertical
+		Pass
+		{
+			CGPROGRAM
+			#pragma vertex vert
+			#pragma fragment frag
+			
+			#include "UnityCG.cginc"
+
+			struct appdata
+			{
+				float4 vertex : POSITION;
+				float2 uv : TEXCOORD0;
+			};
+
+			struct v2f
+			{
+				float4 vertex : SV_POSITION;
+				float2 uv : TEXCOORD0;
+			};
+
+			v2f vert (appdata v)
+			{
+				v2f o;
+				o.vertex = UnityObjectToClipPos(v.vertex);
+				o.uv = v.uv;
+				return o;
+			}
+			
+			sampler2D _MainTex;
+			float2 _BlurSize;
+
+			fixed4 frag (v2f i) : SV_Target
+			{
+				fixed4 s = tex2D(_MainTex, i.uv) * 0.38774;
+				s += tex2D(_MainTex, i.uv + float2(0, _BlurSize.y * 2)) * 0.06136;
+				s += tex2D(_MainTex, i.uv + float2(0, _BlurSize.y)) * 0.24477;			
+				s += tex2D(_MainTex, i.uv + float2(0, _BlurSize.y * -1)) * 0.24477;
+				s += tex2D(_MainTex, i.uv + float2(0, _BlurSize.y * -2)) * 0.06136;
+
+				return s;
+			}
+			ENDCG
+		}
+	}
+}
diff --git a/Assets/Shaders/GlowOutline/Resources/Blur.shader.meta b/Assets/Shaders/GlowOutline/Resources/Blur.shader.meta
new file mode 100644
index 00000000..3ecf635f
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Resources/Blur.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 1a9323f081b383d41aed195e7502e60e
+timeCreated: 1484547957
+licenseType: Pro
+ShaderImporter:
+  defaultTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/GlowOutline/Resources/GlowCmdShader.shader b/Assets/Shaders/GlowOutline/Resources/GlowCmdShader.shader
new file mode 100644
index 00000000..f9d5a25b
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Resources/GlowCmdShader.shader
@@ -0,0 +1,79 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: GlowCmdShader.shader
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+Shader "Hidden/GlowCmdShader"
+{
+	SubShader
+	{
+		Tags { "RenderType"="Opaque" }
+		LOD 100
+
+		Pass
+		{
+			CGPROGRAM
+			#pragma vertex vert
+			#pragma fragment frag
+			
+			#include "UnityCG.cginc"
+
+			struct appdata
+			{
+				float4 vertex : POSITION;
+			};
+
+			struct v2f
+			{
+				float4 vertex : SV_POSITION;
+			};
+
+			v2f vert (appdata v)
+			{
+				v2f o;
+				o.vertex = UnityObjectToClipPos(v.vertex);
+				return o;
+			}
+			
+			fixed4 _GlowColor;
+
+			fixed4 frag (v2f i) : SV_Target
+			{
+				return _GlowColor;
+			}
+			ENDCG
+		}
+	}
+}
diff --git a/Assets/Shaders/GlowOutline/Resources/GlowCmdShader.shader.meta b/Assets/Shaders/GlowOutline/Resources/GlowCmdShader.shader.meta
new file mode 100644
index 00000000..dbb72f9a
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Resources/GlowCmdShader.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 653a2983856307e4584a1655218ab08e
+timeCreated: 1486115614
+licenseType: Pro
+ShaderImporter:
+  defaultTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/GlowOutline/Resources/GlowComposite.shader b/Assets/Shaders/GlowOutline/Resources/GlowComposite.shader
new file mode 100644
index 00000000..5efdfc1d
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Resources/GlowComposite.shader
@@ -0,0 +1,103 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: GlowComposite.shader
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
+
+Shader "Hidden/GlowComposite"
+{
+	Properties
+	{
+		_MainTex ("Texture", 2D) = "white" {}
+	}
+	SubShader
+	{
+		Cull Off ZWrite Off ZTest Always
+
+		Pass
+		{
+			CGPROGRAM
+			#pragma vertex vert
+			#pragma fragment frag
+			
+			#include "UnityCG.cginc"
+
+			struct appdata
+			{
+				float4 vertex : POSITION;
+				float2 uv : TEXCOORD0;
+			};
+
+			struct v2f
+			{
+				float4 vertex : SV_POSITION;
+				float2 uv0 : TEXCOORD0;
+				float2 uv1 : TEXCOORD1;
+			};
+
+			float2 _MainTex_TexelSize;
+
+			v2f vert (appdata v)
+			{
+				v2f o;
+				o.vertex = UnityObjectToClipPos(v.vertex);
+				o.uv0 = v.uv;
+				o.uv1 = v.uv;
+
+				#if UNITY_UV_STARTS_AT_TOP
+				if (_MainTex_TexelSize.y < 0)
+					o.uv1.y = 1 - o.uv1.y;
+				#endif
+
+				return o;
+			}
+			
+			sampler2D _MainTex;
+			sampler2D _GlowPrePassTex;
+			sampler2D _GlowBlurredTex;
+			sampler2D _TempTex0;
+			float _Intensity;
+
+			fixed4 frag (v2f i) : SV_Target
+			{
+				fixed4 col = tex2D(_MainTex, i.uv0);
+				fixed4 glow = max(0, tex2D(_GlowBlurredTex, i.uv1) - tex2D(_GlowPrePassTex, i.uv1));
+				return col + glow * _Intensity;
+			}
+			ENDCG
+		}
+	}
+}
diff --git a/Assets/Shaders/GlowOutline/Resources/GlowComposite.shader.meta b/Assets/Shaders/GlowOutline/Resources/GlowComposite.shader.meta
new file mode 100644
index 00000000..65a1b699
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Resources/GlowComposite.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: e4b39d1c04bdfb24ebc10e5897e6b067
+timeCreated: 1484548601
+licenseType: Pro
+ShaderImporter:
+  defaultTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/GlowOutline/Resources/GlowReplace.shader b/Assets/Shaders/GlowOutline/Resources/GlowReplace.shader
new file mode 100644
index 00000000..c335b709
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Resources/GlowReplace.shader
@@ -0,0 +1,84 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: GlowReplace.shader
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
+
+Shader "Hidden/GlowReplace"
+{
+	SubShader
+	{
+		Tags
+		{
+		"RenderType"="Opaque"
+		"Glowable" = "True"
+		}
+
+		Pass
+		{
+			CGPROGRAM
+			#pragma vertex vert
+			#pragma fragment frag
+			
+			#include "UnityCG.cginc"
+
+			struct appdata
+			{
+				float4 vertex : POSITION;
+			};
+
+			struct v2f
+			{
+				float4 vertex : SV_POSITION;
+			};
+			
+			v2f vert (appdata v)
+			{
+				v2f o;
+				o.vertex = UnityObjectToClipPos(v.vertex);
+				return o;
+			}
+			
+			fixed4 _GlowColor;
+
+			fixed4 frag (v2f i) : SV_Target
+			{
+				return _GlowColor;
+			}
+			ENDCG
+		}
+	}
+}
diff --git a/Assets/Shaders/GlowOutline/Resources/GlowReplace.shader.meta b/Assets/Shaders/GlowOutline/Resources/GlowReplace.shader.meta
new file mode 100644
index 00000000..40f34b7a
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Resources/GlowReplace.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 45f4b5fa143a31c4a96299642e84e286
+timeCreated: 1484547336
+licenseType: Pro
+ShaderImporter:
+  defaultTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/GlowOutline/Resources/Standard-Glow.shader b/Assets/Shaders/GlowOutline/Resources/Standard-Glow.shader
new file mode 100644
index 00000000..c7919d48
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Resources/Standard-Glow.shader
@@ -0,0 +1,355 @@
+//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: Standard-Glow.shader
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+Shader "StandardGlow"
+{
+	Properties
+	{
+		_Color("Color", Color) = (1,1,1,1)
+		_MainTex("Albedo", 2D) = "white" {}
+		
+		_Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
+
+		_Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5
+		[Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
+		_MetallicGlossMap("Metallic", 2D) = "white" {}
+
+		_BumpScale("Scale", Float) = 1.0
+		_BumpMap("Normal Map", 2D) = "bump" {}
+
+		_Parallax ("Height Scale", Range (0.005, 0.08)) = 0.02
+		_ParallaxMap ("Height Map", 2D) = "black" {}
+
+		_OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
+		_OcclusionMap("Occlusion", 2D) = "white" {}
+
+		_EmissionColor("Color", Color) = (0,0,0)
+		_EmissionMap("Emission", 2D) = "white" {}
+		
+		_DetailMask("Detail Mask", 2D) = "white" {}
+
+		_DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {}
+		_DetailNormalMapScale("Scale", Float) = 1.0
+		_DetailNormalMap("Normal Map", 2D) = "bump" {}
+
+		[Enum(UV0,0,UV1,1)] _UVSec ("UV Set for secondary textures", Float) = 0
+
+
+		// Blending state
+		[HideInInspector] _Mode ("__mode", Float) = 0.0
+		[HideInInspector] _SrcBlend ("__src", Float) = 1.0
+		[HideInInspector] _DstBlend ("__dst", Float) = 0.0
+		[HideInInspector] _ZWrite ("__zw", Float) = 1.0
+	}
+
+	CGINCLUDE
+		#define UNITY_SETUP_BRDF_INPUT MetallicSetup
+	ENDCG
+
+	SubShader
+	{
+		Tags { "RenderType"="Opaque" "PerformanceChecks"="False" "Glowable"="True" }
+		LOD 300
+
+		// ------------------------------------------------------------------
+		//  Base forward pass (directional light, emission, lightmaps, ...)
+		Pass
+		{
+			Name "FORWARD" 
+			Tags { "LightMode" = "ForwardBase" }
+
+			Blend [_SrcBlend] [_DstBlend]
+			ZWrite [_ZWrite]
+
+			CGPROGRAM
+			#pragma target 3.0
+			// TEMPORARY: GLES2.0 temporarily disabled to prevent errors spam on devices without textureCubeLodEXT
+			#pragma exclude_renderers gles
+			
+			// -------------------------------------
+					
+			#pragma shader_feature _NORMALMAP
+			#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
+			#pragma shader_feature _EMISSION
+			#pragma shader_feature _METALLICGLOSSMAP 
+			#pragma shader_feature ___ _DETAIL_MULX2
+			#pragma shader_feature _PARALLAXMAP
+			
+			#pragma multi_compile_fwdbase
+			#pragma multi_compile_fog
+
+			#pragma vertex vertBase
+			#pragma fragment fragBase
+			#include "UnityStandardCoreForward.cginc"
+
+			ENDCG
+		}
+
+		// ------------------------------------------------------------------
+		//  Additive forward pass (one light per pass)
+		Pass
+		{
+			Name "FORWARD_DELTA"
+			Tags { "LightMode" = "ForwardAdd" }
+			Blend [_SrcBlend] One
+			Fog { Color (0,0,0,0) } // in additive pass fog should be black
+			ZWrite Off
+			ZTest LEqual
+
+			CGPROGRAM
+			#pragma target 3.0
+			// GLES2.0 temporarily disabled to prevent errors spam on devices without textureCubeLodEXT
+			#pragma exclude_renderers gles
+
+			// -------------------------------------
+
+			
+			#pragma shader_feature _NORMALMAP
+			#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
+			#pragma shader_feature _METALLICGLOSSMAP
+			#pragma shader_feature ___ _DETAIL_MULX2
+			#pragma shader_feature _PARALLAXMAP
+			
+			#pragma multi_compile_fwdadd_fullshadows
+			#pragma multi_compile_fog
+
+			#pragma vertex vertAdd
+			#pragma fragment fragAdd
+			#include "UnityStandardCoreForward.cginc"
+
+			ENDCG
+		}
+		// ------------------------------------------------------------------
+		//  Shadow rendering pass
+		Pass {
+			Name "ShadowCaster"
+			Tags { "LightMode" = "ShadowCaster" }
+			
+			ZWrite On ZTest LEqual
+
+			CGPROGRAM
+			#pragma target 3.0
+			// TEMPORARY: GLES2.0 temporarily disabled to prevent errors spam on devices without textureCubeLodEXT
+			#pragma exclude_renderers gles
+			
+			// -------------------------------------
+
+
+			#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
+			#pragma multi_compile_shadowcaster
+
+			#pragma vertex vertShadowCaster
+			#pragma fragment fragShadowCaster
+
+			#include "UnityStandardShadow.cginc"
+
+			ENDCG
+		}
+		// ------------------------------------------------------------------
+		//  Deferred pass
+		Pass
+		{
+			Name "DEFERRED"
+			Tags { "LightMode" = "Deferred" }
+
+			CGPROGRAM
+			#pragma target 3.0
+			// TEMPORARY: GLES2.0 temporarily disabled to prevent errors spam on devices without textureCubeLodEXT
+			#pragma exclude_renderers nomrt gles
+			
+
+			// -------------------------------------
+
+			#pragma shader_feature _NORMALMAP
+			#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
+			#pragma shader_feature _EMISSION
+			#pragma shader_feature _METALLICGLOSSMAP
+			#pragma shader_feature ___ _DETAIL_MULX2
+			#pragma shader_feature _PARALLAXMAP
+
+			#pragma multi_compile ___ UNITY_HDR_ON
+			#pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON
+			#pragma multi_compile DIRLIGHTMAP_OFF DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
+			#pragma multi_compile DYNAMICLIGHTMAP_OFF DYNAMICLIGHTMAP_ON
+			
+			#pragma vertex vertDeferred
+			#pragma fragment fragDeferred
+
+			#include "UnityStandardCore.cginc"
+
+			ENDCG
+		}
+
+		// ------------------------------------------------------------------
+		// Extracts information for lightmapping, GI (emission, albedo, ...)
+		// This pass it not used during regular rendering.
+		Pass
+		{
+			Name "META" 
+			Tags { "LightMode"="Meta" }
+
+			Cull Off
+
+			CGPROGRAM
+			#pragma vertex vert_meta
+			#pragma fragment frag_meta
+
+			#pragma shader_feature _EMISSION
+			#pragma shader_feature _METALLICGLOSSMAP
+			#pragma shader_feature ___ _DETAIL_MULX2
+
+			#include "UnityStandardMeta.cginc"
+			ENDCG
+		}
+	}
+
+	SubShader
+	{
+		Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
+		LOD 150
+
+		// ------------------------------------------------------------------
+		//  Base forward pass (directional light, emission, lightmaps, ...)
+		Pass
+		{
+			Name "FORWARD" 
+			Tags { "LightMode" = "ForwardBase" }
+
+			Blend [_SrcBlend] [_DstBlend]
+			ZWrite [_ZWrite]
+
+			CGPROGRAM
+			#pragma target 2.0
+			
+			#pragma shader_feature _NORMALMAP
+			#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
+			#pragma shader_feature _EMISSION 
+			#pragma shader_feature _METALLICGLOSSMAP 
+			#pragma shader_feature ___ _DETAIL_MULX2
+			// SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
+
+			#pragma skip_variants SHADOWS_SOFT DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
+
+			#pragma multi_compile_fwdbase
+			#pragma multi_compile_fog
+
+			#pragma vertex vertBase
+			#pragma fragment fragBase
+			#include "UnityStandardCoreForward.cginc"
+
+			ENDCG
+		}
+		// ------------------------------------------------------------------
+		//  Additive forward pass (one light per pass)
+		Pass
+		{
+			Name "FORWARD_DELTA"
+			Tags { "LightMode" = "ForwardAdd" }
+			Blend [_SrcBlend] One
+			Fog { Color (0,0,0,0) } // in additive pass fog should be black
+			ZWrite Off
+			ZTest LEqual
+			
+			CGPROGRAM
+			#pragma target 2.0
+
+			#pragma shader_feature _NORMALMAP
+			#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
+			#pragma shader_feature _METALLICGLOSSMAP
+			#pragma shader_feature ___ _DETAIL_MULX2
+			// SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
+			#pragma skip_variants SHADOWS_SOFT
+			
+			#pragma multi_compile_fwdadd_fullshadows
+			#pragma multi_compile_fog
+			
+			#pragma vertex vertAdd
+			#pragma fragment fragAdd
+			#include "UnityStandardCoreForward.cginc"
+
+			ENDCG
+		}
+		// ------------------------------------------------------------------
+		//  Shadow rendering pass
+		Pass {
+			Name "ShadowCaster"
+			Tags { "LightMode" = "ShadowCaster" }
+			
+			ZWrite On ZTest LEqual
+
+			CGPROGRAM
+			#pragma target 2.0
+
+			#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
+			#pragma skip_variants SHADOWS_SOFT
+			#pragma multi_compile_shadowcaster
+
+			#pragma vertex vertShadowCaster
+			#pragma fragment fragShadowCaster
+
+			#include "UnityStandardShadow.cginc"
+
+			ENDCG
+		}
+
+		// ------------------------------------------------------------------
+		// Extracts information for lightmapping, GI (emission, albedo, ...)
+		// This pass it not used during regular rendering.
+		Pass
+		{
+			Name "META" 
+			Tags { "LightMode"="Meta" }
+
+			Cull Off
+
+			CGPROGRAM
+			#pragma vertex vert_meta
+			#pragma fragment frag_meta
+
+			#pragma shader_feature _EMISSION
+			#pragma shader_feature _METALLICGLOSSMAP
+			#pragma shader_feature ___ _DETAIL_MULX2
+
+			#include "UnityStandardMeta.cginc"
+			ENDCG
+		}
+	}
+
+
+	FallBack "VertexLit"
+	CustomEditor "StandardShaderGUI"
+}
diff --git a/Assets/Shaders/GlowOutline/Resources/Standard-Glow.shader.meta b/Assets/Shaders/GlowOutline/Resources/Standard-Glow.shader.meta
new file mode 100644
index 00000000..c01c4f5a
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Resources/Standard-Glow.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 442f40f05878ff645995c0d278686da4
+timeCreated: 1484547038
+licenseType: Pro
+ShaderImporter:
+  defaultTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/GlowOutline/Scripts.meta b/Assets/Shaders/GlowOutline/Scripts.meta
new file mode 100644
index 00000000..6253dc77
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 23625315a621d9845b5dbbbecb191ac8
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/GlowOutline/Scripts/GlowComposite.cs b/Assets/Shaders/GlowOutline/Scripts/GlowComposite.cs
new file mode 100644
index 00000000..ba475a6e
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Scripts/GlowComposite.cs
@@ -0,0 +1,43 @@
+﻿/* 
+ * Copyright (C) SAAB AB
+ *
+ * All rights, including the copyright, to the computer program(s) 
+ * herein belong to Saab AB. The program(s) may be used and/or
+ * copied only with the written permission of Saab AB, or in
+ * accordance with the terms and conditions stipulated in the
+ * agreement/contract under which the program(s) have been
+ * supplied. 
+ * 
+ * Information Class:          COMPANY RESTRICTED
+ * Defence Secrecy:            UNCLASSIFIED
+ * Export Control:             NOT EXPORT CONTROLLED
+ */
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+using UnityEngine;
+
+[ExecuteInEditMode]
+[RequireComponent(typeof(Camera))]
+public class GlowComposite : MonoBehaviour
+{
+	[Range (0, 10)]
+	public float Intensity = 2;
+
+	private Material _compositeMat;
+
+	void OnEnable()
+	{
+		_compositeMat = new Material(Shader.Find("Hidden/GlowComposite"));
+    }
+
+	void OnRenderImage(RenderTexture src, RenderTexture dst)
+	{
+		_compositeMat.SetFloat("_Intensity", Intensity);
+        Graphics.Blit(src, dst, _compositeMat, 0);
+	}
+}
diff --git a/Assets/Shaders/GlowOutline/Scripts/GlowComposite.cs.meta b/Assets/Shaders/GlowOutline/Scripts/GlowComposite.cs.meta
new file mode 100644
index 00000000..74537acd
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Scripts/GlowComposite.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: d4c072b0c78ba8a4ebec1edd40d3eff2
+timeCreated: 1484548498
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/GlowOutline/Scripts/GlowController.cs b/Assets/Shaders/GlowOutline/Scripts/GlowController.cs
new file mode 100644
index 00000000..86f83091
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Scripts/GlowController.cs
@@ -0,0 +1,127 @@
+﻿/* 
+ * Copyright (C) SAAB AB
+ *
+ * All rights, including the copyright, to the computer program(s) 
+ * herein belong to Saab AB. The program(s) may be used and/or
+ * copied only with the written permission of Saab AB, or in
+ * accordance with the terms and conditions stipulated in the
+ * agreement/contract under which the program(s) have been
+ * supplied. 
+ * 
+ * Information Class:          COMPANY RESTRICTED
+ * Defence Secrecy:            UNCLASSIFIED
+ * Export Control:             NOT EXPORT CONTROLLED
+ */
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+using UnityEngine;
+using UnityEngine.Rendering;
+using System.Collections.Generic;
+
+/// <summary>
+/// Creates and maintains a command buffer to set up the textures used in the glowing object image effect.
+/// </summary>
+public class GlowController : MonoBehaviour
+{
+	private static GlowController _instance;
+
+	private CommandBuffer _commandBuffer;
+
+	private List<GlowObjectCmd> _glowableObjects = new List<GlowObjectCmd>();
+	private Material _glowMat;
+	private Material _blurMaterial;
+	private Vector2 _blurTexelSize;
+
+	private int _prePassRenderTexID;
+	private int _blurPassRenderTexID;
+	private int _tempRenderTexID;
+	private int _blurSizeID;
+	private int _glowColorID;
+
+	/// <summary>
+	/// On Awake, we cache various values and setup our command buffer to be called Before Image Effects.
+	/// </summary>
+	private void Awake()
+	{
+		_instance = this;
+
+		_glowMat = new Material(Shader.Find("Hidden/GlowCmdShader"));
+		_blurMaterial = new Material(Shader.Find("Hidden/Blur"));
+
+		_prePassRenderTexID = Shader.PropertyToID("_GlowPrePassTex");
+		_blurPassRenderTexID = Shader.PropertyToID("_GlowBlurredTex");
+		_tempRenderTexID = Shader.PropertyToID("_TempTex0");
+		_blurSizeID = Shader.PropertyToID("_BlurSize");
+		_glowColorID = Shader.PropertyToID("_GlowColor");
+
+		_commandBuffer = new CommandBuffer();
+		_commandBuffer.name = "Glowing Objects Buffer"; // This name is visible in the Frame Debugger, so make it a descriptive!
+		GetComponent<Camera>().AddCommandBuffer(CameraEvent.BeforeImageEffects, _commandBuffer);
+	}
+
+	/// <summary>
+	/// TODO: Add a degister method.
+	/// </summary>
+	public static void RegisterObject(GlowObjectCmd glowObj)
+	{
+		if (_instance != null)
+		{
+			_instance._glowableObjects.Add(glowObj);
+		}
+	}
+
+	/// <summary>
+	/// Adds all the commands, in order, we want our command buffer to execute.
+	/// Similar to calling sequential rendering methods insde of OnRenderImage().
+	/// </summary>
+	private void RebuildCommandBuffer()
+	{
+		_commandBuffer.Clear();
+
+		_commandBuffer.GetTemporaryRT(_prePassRenderTexID, Screen.width, Screen.height, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default, QualitySettings.antiAliasing);
+		_commandBuffer.SetRenderTarget(_prePassRenderTexID);
+		_commandBuffer.ClearRenderTarget(true, true, Color.clear);
+
+		print(string.Format("glowable obj count: {0}", _glowableObjects.Count));
+		for (int i = 0; i < _glowableObjects.Count; i++)
+		{
+			_commandBuffer.SetGlobalColor(_glowColorID, _glowableObjects[i].CurrentColor);
+
+			for (int j = 0; j < _glowableObjects[i].Renderers.Length; j++)
+			{
+				print(string.Format("{0} length: {1}", _glowableObjects[i].name, _glowableObjects[i].Renderers.Length));
+				_commandBuffer.DrawRenderer(_glowableObjects[i].Renderers[j], _glowMat);
+			}
+		}
+
+		_commandBuffer.GetTemporaryRT(_blurPassRenderTexID, Screen.width >> 1, Screen.height >> 1, 0, FilterMode.Bilinear);
+		_commandBuffer.GetTemporaryRT(_tempRenderTexID, Screen.width >> 1, Screen.height >> 1, 0, FilterMode.Bilinear);
+		_commandBuffer.Blit(_prePassRenderTexID, _blurPassRenderTexID);
+
+		_blurTexelSize = new Vector2(1.5f / (Screen.width >> 1), 1.5f / (Screen.height >> 1));
+		_commandBuffer.SetGlobalVector(_blurSizeID, _blurTexelSize);
+
+		for (int i = 0; i < 4; i++)
+		{
+			_commandBuffer.Blit(_blurPassRenderTexID, _tempRenderTexID, _blurMaterial, 0);
+			_commandBuffer.Blit(_tempRenderTexID, _blurPassRenderTexID, _blurMaterial, 1);
+		}
+	}
+
+	/// <summary>
+	/// Rebuild the Command Buffer each frame to account for changes in color.
+	/// This could be improved to only rebuild when necessary when colors are changing.
+	/// 
+	/// Could be further optimized to not include objects which are currently black and not
+	/// affect thing the glow image.
+	/// </summary>
+	private void Update()
+	{
+		RebuildCommandBuffer();
+	}
+}
diff --git a/Assets/Shaders/GlowOutline/Scripts/GlowController.cs.meta b/Assets/Shaders/GlowOutline/Scripts/GlowController.cs.meta
new file mode 100644
index 00000000..69dac624
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Scripts/GlowController.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 49e1cb09022521d41a389281027e52c6
+timeCreated: 1486111389
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/GlowOutline/Scripts/GlowObject.cs b/Assets/Shaders/GlowOutline/Scripts/GlowObject.cs
new file mode 100644
index 00000000..6ddfab13
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Scripts/GlowObject.cs
@@ -0,0 +1,87 @@
+﻿/* 
+ * Copyright (C) SAAB AB
+ *
+ * All rights, including the copyright, to the computer program(s) 
+ * herein belong to Saab AB. The program(s) may be used and/or
+ * copied only with the written permission of Saab AB, or in
+ * accordance with the terms and conditions stipulated in the
+ * agreement/contract under which the program(s) have been
+ * supplied. 
+ * 
+ * Information Class:          COMPANY RESTRICTED
+ * Defence Secrecy:            UNCLASSIFIED
+ * Export Control:             NOT EXPORT CONTROLLED
+ */
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+using UnityEngine;
+using System.Collections.Generic;
+
+public class GlowObject : MonoBehaviour
+{
+	public Color GlowColor;
+	public float LerpFactor = 10;
+
+	public Renderer[] Renderers
+	{
+		get;
+		private set;
+	}
+
+	public Color CurrentColor
+	{
+		get { return _currentColor; }
+	}
+
+	private List<Material> _materials = new List<Material>();
+	private Color _currentColor;
+	private Color _targetColor;
+
+	void Start()
+	{
+		Renderers = GetComponentsInChildren<Renderer>();
+
+        _targetColor = GlowColor;
+        enabled = true;
+
+        foreach (var renderer in Renderers)
+		{	
+			_materials.AddRange(renderer.materials);
+		}
+	}
+
+	//private void OnMouseEnter()
+	//{
+	//	_targetColor = GlowColor;
+	//	enabled = true;
+	//}
+
+	//private void OnMouseExit()
+	//{
+	//	_targetColor = Color.black;
+	//	enabled = true;
+	//}
+
+	/// <summary>
+	/// Loop over all cached materials and update their color, disable self if we reach our target color.
+	/// </summary>
+	private void Update()
+	{
+		_currentColor = Color.Lerp(_currentColor, _targetColor, Time.deltaTime * LerpFactor);
+
+		for (int i = 0; i < _materials.Count; i++)
+		{
+			_materials[i].SetColor("_GlowColor", _currentColor);
+		}
+
+		if (_currentColor.Equals(_targetColor))
+		{
+			enabled = false;
+		}
+	}
+}
diff --git a/Assets/Shaders/GlowOutline/Scripts/GlowObject.cs.meta b/Assets/Shaders/GlowOutline/Scripts/GlowObject.cs.meta
new file mode 100644
index 00000000..1da12b62
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Scripts/GlowObject.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f8ec0fb3ff2a5454e8863609a58514d0
+timeCreated: 1484547418
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/GlowOutline/Scripts/GlowObjectCmd.cs b/Assets/Shaders/GlowOutline/Scripts/GlowObjectCmd.cs
new file mode 100644
index 00000000..a4c78d57
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Scripts/GlowObjectCmd.cs
@@ -0,0 +1,74 @@
+﻿/* 
+ * Copyright (C) SAAB AB
+ *
+ * All rights, including the copyright, to the computer program(s) 
+ * herein belong to Saab AB. The program(s) may be used and/or
+ * copied only with the written permission of Saab AB, or in
+ * accordance with the terms and conditions stipulated in the
+ * agreement/contract under which the program(s) have been
+ * supplied. 
+ * 
+ * Information Class:          COMPANY RESTRICTED
+ * Defence Secrecy:            UNCLASSIFIED
+ * Export Control:             NOT EXPORT CONTROLLED
+ */
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+using UnityEngine;
+using System.Collections.Generic;
+
+public class GlowObjectCmd : MonoBehaviour
+{
+	public Color GlowColor;
+	public float LerpFactor = 10;
+
+	public Renderer[] Renderers
+	{
+		get;
+		private set;
+	}
+
+	public Color CurrentColor
+	{
+		get { return _currentColor; }
+	}
+
+	private Color _currentColor;
+	private Color _targetColor;
+
+	void Start()
+	{
+		Renderers = GetComponentsInChildren<Renderer>();
+		GlowController.RegisterObject(this);
+	}
+
+	private void OnMouseEnter()
+	{
+		_targetColor = GlowColor;
+		enabled = true;
+	}
+
+	private void OnMouseExit()
+	{
+		_targetColor = Color.black;
+		enabled = true;
+	}
+
+	/// <summary>
+	/// Update color, disable self if we reach our target color.
+	/// </summary>
+	private void Update()
+	{
+		_currentColor = Color.Lerp(_currentColor, _targetColor, Time.deltaTime * LerpFactor);
+
+		if (_currentColor.Equals(_targetColor))
+		{
+			enabled = false;
+		}
+	}
+}
diff --git a/Assets/Shaders/GlowOutline/Scripts/GlowObjectCmd.cs.meta b/Assets/Shaders/GlowOutline/Scripts/GlowObjectCmd.cs.meta
new file mode 100644
index 00000000..0340b97a
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Scripts/GlowObjectCmd.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 8f97577f7490be846abb026b83b52db0
+timeCreated: 1484547418
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/GlowOutline/Scripts/GlowPrePass.cs b/Assets/Shaders/GlowOutline/Scripts/GlowPrePass.cs
new file mode 100644
index 00000000..dba40e35
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Scripts/GlowPrePass.cs
@@ -0,0 +1,74 @@
+﻿/* 
+ * Copyright (C) SAAB AB
+ *
+ * All rights, including the copyright, to the computer program(s) 
+ * herein belong to Saab AB. The program(s) may be used and/or
+ * copied only with the written permission of Saab AB, or in
+ * accordance with the terms and conditions stipulated in the
+ * agreement/contract under which the program(s) have been
+ * supplied. 
+ * 
+ * Information Class:          COMPANY RESTRICTED
+ * Defence Secrecy:            UNCLASSIFIED
+ * Export Control:             NOT EXPORT CONTROLLED
+ */
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+using UnityEngine;
+
+[RequireComponent(typeof(Camera))]
+public class GlowPrePass : MonoBehaviour
+{
+    
+    private static RenderTexture PrePass;
+    private static RenderTexture Blurred;
+
+    private Material _blurMat;
+
+    [SerializeField] private bool _update;
+    [SerializeField] private Camera _parentCam;
+
+    void OnEnable()
+    {
+        PrePass = new RenderTexture(Screen.width, Screen.height, 24);
+        PrePass.antiAliasing = QualitySettings.antiAliasing;
+        Blurred = new RenderTexture(Screen.width, Screen.height, 16, RenderTextureFormat.ARGB32);
+
+        var camera = GetComponent<Camera>();
+
+        var glowShader = Shader.Find("Hidden/GlowReplace");
+        camera.targetTexture = PrePass;
+        camera.SetReplacementShader(glowShader, "Glowable");
+        Shader.SetGlobalTexture("_GlowPrePassTex", PrePass);
+        Shader.SetGlobalTexture("_GlowBlurredTex", Blurred);
+
+        _blurMat = new Material(Shader.Find("Hidden/Blur"));
+        _blurMat.SetVector("_BlurSize", new Vector2(Blurred.texelSize.x * 1.5f, Blurred.texelSize.y * 1.5f));
+
+        //camera.farClipPlane = BtaApplication.GetConfigValue(@"ForceBelonging/FarClipPlane", 500);
+        //camera.nearClipPlane = BtaApplication.GetConfigValue(@"ForceBelonging/NearClipPlane", 50);
+    }
+
+    void OnRenderImage(RenderTexture src, RenderTexture dst)
+    {
+        Graphics.Blit(src, dst);
+
+        Graphics.SetRenderTarget(Blurred);
+        GL.Clear(false, true, Color.clear);
+
+        Graphics.Blit(src, Blurred);
+
+        for (int i = 0; i < 4; i++)
+        {
+            var temp = RenderTexture.GetTemporary(Blurred.width, Blurred.height);
+            Graphics.Blit(Blurred, temp, _blurMat, 0);
+            Graphics.Blit(temp, Blurred, _blurMat, 1);
+            RenderTexture.ReleaseTemporary(temp);
+        }
+    }
+}
diff --git a/Assets/Shaders/GlowOutline/Scripts/GlowPrePass.cs.meta b/Assets/Shaders/GlowOutline/Scripts/GlowPrePass.cs.meta
new file mode 100644
index 00000000..bd2b0e0d
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Scripts/GlowPrePass.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: a8d6d491c430e2d4ea283009ec2f2794
+timeCreated: 1484547290
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAsset.cs b/Assets/Shaders/GlowOutline/Scripts/Spinner.cs
similarity index 55%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAsset.cs
rename to Assets/Shaders/GlowOutline/Scripts/Spinner.cs
index 3b68d256..e835f920 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAsset.cs
+++ b/Assets/Shaders/GlowOutline/Scripts/Spinner.cs
@@ -13,19 +13,21 @@
  * Export Control:             NOT EXPORT CONTROLLED
  */
 
-using System;
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
 using UnityEngine;
+using System.Collections;
 
-namespace Saab.Foundation.Unity.MapStreamer.Modules
+public class Spinner : MonoBehaviour
 {
-    [CreateAssetMenu(fileName = "TerrainDetailTextureAsset", menuName = "Terrain/DetailTextureAsset")]
-    [Serializable]
-    public class TerrainDetailTextureAsset : ScriptableObject
-    {
-        public MapFeature MatchingFeatures;
-        public Texture2D Albedo;
-        public Texture2D Normal;
-        public Texture2D Displacement;
-        public Texture2D Roughness;
+	public Vector3 EulersPerSecond;
+
+	void Update()
+	{
+		transform.Rotate(EulersPerSecond * Time.deltaTime);
     }
-}
\ No newline at end of file
+}
diff --git a/Assets/Shaders/GlowOutline/Scripts/Spinner.cs.meta b/Assets/Shaders/GlowOutline/Scripts/Spinner.cs.meta
new file mode 100644
index 00000000..18e4ba05
--- /dev/null
+++ b/Assets/Shaders/GlowOutline/Scripts/Spinner.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b8658a114c27e9d44af5783b0a21dc26
+timeCreated: 1484546794
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/GreyScaleSurface.shader b/Assets/Shaders/GreyScaleSurface.shader
new file mode 100644
index 00000000..20d1591b
--- /dev/null
+++ b/Assets/Shaders/GreyScaleSurface.shader
@@ -0,0 +1,50 @@
+﻿Shader "CustomSurface/GreyScale"
+{
+    Properties
+    {
+        _MainTex ("Albedo (RGB)", 2D) = "white" {}
+        _EffectAmount("Effect Amount", Range(0, 1)) = 1.0
+    }
+    SubShader
+    {
+        Tags { "RenderType"="Transparent" "Queue"="Overlay" "ForceNoShadowCasting"="True"}
+        ZWrite Off
+        Cull off
+        LOD 200
+
+        CGPROGRAM
+        // Physically based Standard lighting model, and enable shadows on all light types
+        #pragma surface surf NoLighting alpha nolightmap 
+
+        // Use shader model 3.0 target, to get nicer looking lighting
+        #pragma target 3.0
+
+        sampler2D _MainTex;
+        float _EffectAmount;
+
+        struct Input
+        {
+            float2 uv_MainTex;
+        };
+
+        UNITY_INSTANCING_BUFFER_START(Props)
+        UNITY_INSTANCING_BUFFER_END(Props)
+
+        fixed4 LightingNoLighting(SurfaceOutput s, fixed3 lightDir, fixed atten) 
+        {
+            return fixed4(s.Albedo * 0.5f, s.Alpha);
+        }
+
+        void surf (Input IN, inout SurfaceOutput o)
+        {
+            // Albedo comes from a texture tinted by color
+            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
+            c.rgb = lerp(c.rgb, dot(c.rgb, float3(0.3, 0.59, 0.11)), _EffectAmount);
+
+            o.Albedo = c.rgb;
+            o.Alpha = c.a;
+        }
+        ENDCG
+    }
+    //FallBack "Diffuse"
+}
diff --git a/Assets/Shaders/GreyScaleSurface.shader.meta b/Assets/Shaders/GreyScaleSurface.shader.meta
new file mode 100644
index 00000000..c5fcbe53
--- /dev/null
+++ b/Assets/Shaders/GreyScaleSurface.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: ae81ad50db313904b9c556fc43236957
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Old.meta b/Assets/Shaders/Old.meta
new file mode 100644
index 00000000..c4418716
--- /dev/null
+++ b/Assets/Shaders/Old.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 097085f188673394caa8da91768100b7
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Old/CrossboardRenderer.cs b/Assets/Shaders/Old/CrossboardRenderer.cs
new file mode 100644
index 00000000..6f21e6c8
--- /dev/null
+++ b/Assets/Shaders/Old/CrossboardRenderer.cs
@@ -0,0 +1,83 @@
+﻿/* 
+ * Copyright (C) SAAB AB
+ *
+ * All rights, including the copyright, to the computer program(s) 
+ * herein belong to Saab AB. The program(s) may be used and/or
+ * copied only with the written permission of Saab AB, or in
+ * accordance with the terms and conditions stipulated in the
+ * agreement/contract under which the program(s) have been
+ * supplied. 
+ * 
+ * Information Class:          COMPANY RESTRICTED
+ * Defence Secrecy:            UNCLASSIFIED
+ * Export Control:             NOT EXPORT CONTROLLED
+ */
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+using UnityEngine;
+
+namespace Assets.Crossboard
+{
+    public class CrossboardRenderer : MonoBehaviour
+    {
+        public bool OpaqueCrossboard = false;
+        public bool OpaqueCrossboardCompute = false;
+        public Material DefaultMaterial;
+
+        public virtual void SetCrossboardDataset(CrossboardDataset dataset, Material material)
+        {
+            var mesh = new Mesh();
+            mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
+            mesh.vertices = dataset.POSITION;
+
+            if (OpaqueCrossboard)
+            {
+                mesh.SetUVs(0, dataset.UV0List);
+                mesh.SetUVs(1, dataset.UV1List);
+                mesh.SetUVs(2, dataset.UV2List);
+                mesh.SetUVs(3, dataset.UV3List);
+            }
+            else if (OpaqueCrossboardCompute)
+            {
+                mesh.SetUVs(0, dataset.UV0ListComp);
+                mesh.SetUVs(1, dataset.UV1ListComp);
+            }
+            else
+            {
+                mesh.uv = dataset.UV0;
+                mesh.uv2 = dataset.UV1;
+            }
+
+            mesh.colors = dataset.COLOR;
+
+            var n = dataset.POSITION.Length;
+            var indices = new int[n];
+            for (var i = 0; i < n; ++i)
+            {
+                indices[i] = i;
+            }
+
+            mesh.SetIndices(indices, MeshTopology.Points, 0);
+
+
+            //mesh.bounds = new Bounds(Vector3.zero, new Vector3(100f, 100f, 100f));
+
+            var meshFilter = gameObject.GetComponent<MeshFilter>();
+            if (meshFilter == null)
+                meshFilter = gameObject.AddComponent<MeshFilter>();
+            
+            meshFilter.sharedMesh = mesh;
+
+            var meshRenderer = gameObject.GetComponent<MeshRenderer>();
+            if (meshRenderer == null)
+                meshRenderer = gameObject.AddComponent<MeshRenderer>();
+
+            meshRenderer.sharedMaterial = material ?? DefaultMaterial;
+        }
+    }
+}
diff --git a/Assets/Shaders/Old/CrossboardRenderer.cs.meta b/Assets/Shaders/Old/CrossboardRenderer.cs.meta
new file mode 100644
index 00000000..925cedc9
--- /dev/null
+++ b/Assets/Shaders/Old/CrossboardRenderer.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f040f0985257409458f064f615dc1f93
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Old/CrossboardRenderer_ComputeShader.cs b/Assets/Shaders/Old/CrossboardRenderer_ComputeShader.cs
new file mode 100644
index 00000000..bee3014b
--- /dev/null
+++ b/Assets/Shaders/Old/CrossboardRenderer_ComputeShader.cs
@@ -0,0 +1,224 @@
+﻿/* 
+ * Copyright (C) SAAB AB
+ *
+ * All rights, including the copyright, to the computer program(s) 
+ * herein belong to Saab AB. The program(s) may be used and/or
+ * copied only with the written permission of Saab AB, or in
+ * accordance with the terms and conditions stipulated in the
+ * agreement/contract under which the program(s) have been
+ * supplied. 
+ * 
+ * Information Class:          COMPANY RESTRICTED
+ * Defence Secrecy:            UNCLASSIFIED
+ * Export Control:             NOT EXPORT CONTROLLED
+ */
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using UnityEngine;
+using UnityEngine.Rendering;
+
+namespace Assets.Crossboard
+{
+    public struct CrossboardDataset
+    {
+        public Vector3[] POSITION;
+        public Vector2[] UV0;
+        public Vector2[] UV1;
+
+        // Opaque shader
+        public List<Vector2> UV0List;
+        public List<Vector3> UV1List;
+        public List<Vector3> UV2List;
+        public List<Vector3> UV3List;
+
+        // ************* Opaque shader compute *************
+        public List<Vector4> UV0ListComp;
+        public List<Vector4> UV1ListComp;
+
+        public Color[] COLOR;
+    }
+
+    public class CrossboardRenderer_ComputeShader : CrossboardRenderer
+    {
+        public ComputeShader _computeShader;
+        public ComputeBuffer _inputBuffer;
+        public ComputeBuffer _outputBuffer;
+        public ComputeBuffer _argBuffer;
+
+        private Plane[] _planes = new Plane[6];
+        private float[] _normalsFloat = new float[12];  // 4x3
+        private bool _rendering = false;
+        private CommandBuffer Cb = null;
+        private Camera _cam;
+
+        [SerializeField]
+        private Material _material;
+
+        private int _cullingKernel = -1;
+
+        [StructLayout(LayoutKind.Sequential)]
+        struct instance_data
+        {
+            public Vector3 Position;
+            public float Size;
+            public Vector3 Rotation;
+            public Vector3 Color;
+            public float Offset;
+            public Vector3 PlaneOffset;
+        }
+
+        private void OnDestroy()
+        {
+            _inputBuffer.Release();
+            _outputBuffer.Release();
+            _argBuffer.Release();
+        }
+
+        public override void SetCrossboardDataset(CrossboardDataset dataset, Material material)
+        {
+            var n = dataset.POSITION.Length;
+
+            // instance data is 6 floats (position x,y,z, extents x,y,z)
+            _inputBuffer = new ComputeBuffer(n, Marshal.SizeOf(typeof(instance_data)), ComputeBufferType.Default);
+
+            // render data is 3 floats (position x,y,z)
+            _outputBuffer = new ComputeBuffer(n, Marshal.SizeOf(typeof(instance_data)), ComputeBufferType.Append);
+
+            // n instances
+            var instanceDataArray = new instance_data[n];
+
+            // copy data
+            for (var i = 0; i < n; ++i)
+            {
+                instanceDataArray[i].Position = dataset.POSITION[i];
+                instanceDataArray[i].Size = dataset.UV0ListComp[i].x;
+                instanceDataArray[i].Rotation = new Vector3(dataset.UV0ListComp[i].y, dataset.UV0ListComp[i].z, dataset.UV0ListComp[i].w);
+                instanceDataArray[i].Color = new Vector3(dataset.COLOR[i].r, dataset.COLOR[i].g, dataset.COLOR[i].b);
+
+                instanceDataArray[i].Offset = dataset.UV1ListComp[i].x;
+                instanceDataArray[i].PlaneOffset = new Vector3(dataset.UV1ListComp[i].y, dataset.UV1ListComp[i].z, dataset.UV1ListComp[i].w);
+            }
+
+            // copy data to GPU buffer
+            _inputBuffer.SetData(instanceDataArray);
+
+            // create indirect argument buffer
+            _argBuffer = new ComputeBuffer(4, Marshal.SizeOf(typeof(int)), ComputeBufferType.IndirectArguments);
+
+            // clone the material
+            // _material = Instantiate(material);// Material;// Instantiate(Material);
+            if (_material)
+                Destroy(_material);
+            
+            _material = material ?? DefaultMaterial;
+
+            // get cull kernel
+            _cullingKernel = _computeShader.FindKernel("CS_Cull");
+
+            _computeShader.SetBuffer(_cullingKernel, Shader.PropertyToID("Input"), _inputBuffer);
+            _computeShader.SetBuffer(_cullingKernel, Shader.PropertyToID("Output"), _outputBuffer);
+            _computeShader.SetInt(Shader.PropertyToID("_count"), n);
+
+            int[] args = new int[] { 0, 1, 0, 0 };
+            _argBuffer.SetData(args);
+
+            _material.SetBuffer("_buffer", _outputBuffer);
+        }
+
+        private void OnDisable()
+        {
+            _rendering = false;
+            if (Cb != null && _cam != null)
+            {
+                _cam.RemoveCommandBuffer(CameraEvent.BeforeImageEffectsOpaque, Cb);
+            }
+        }
+
+        private void OnEnable()
+        {
+            _rendering = true;
+        }
+
+        private void StartRender(Camera cam)
+        {
+            if (Cb == null)
+            {
+                Cb = new CommandBuffer();
+                Cb.name = "ComputeShader Trees";
+            }
+            else
+            {
+                cam.RemoveCommandBuffer(CameraEvent.BeforeImageEffectsOpaque, Cb);
+            }
+
+            if ((cam.cullingMask & 1) == 0) return;
+
+            _material.SetMatrix("_LocalToWorld", transform.localToWorldMatrix);
+            var r = _material.SetPass(0);
+            Debug.Assert(r);
+
+            // set buffer
+
+            Cb.Clear();
+            Cb.DrawProceduralIndirect(Matrix4x4.identity, _material, -1, MeshTopology.Points, _argBuffer, 0);
+            cam.AddCommandBuffer(CameraEvent.BeforeImageEffectsOpaque, Cb);
+        }
+
+        private void Update()
+        {
+            if (_cullingKernel == -1) return;
+
+            var cameras = FindObjectsOfType<Camera>();
+            foreach (var camera in cameras)
+            {
+                if (!camera.enabled) continue;
+
+                //var camera = Camera.main;
+                if (camera == null) { return; }
+
+                _cam = camera;
+
+                GeometryUtility.CalculateFrustumPlanes(camera, _planes);
+                //CalculateFrustumPlanes(camera.projectionMatrix * camera.worldToCameraMatrix, ref _planes);
+
+                for (int i = 0; i < 4; i++)
+                {
+                    //Debug.DrawRay(camera.transform.position, _planes[i].normal * 10f, Color.yellow);
+                    _normalsFloat[i + 0] = _planes[i].normal.x;
+                    _normalsFloat[i + 4] = _planes[i].normal.y;
+                    _normalsFloat[i + 8] = _planes[i].normal.z;
+                }
+
+                var camPos = camera.transform.position;
+
+                // reset counter
+                _outputBuffer.SetCounterValue(0);
+
+                // assign shader buffers
+
+                _computeShader.SetFloats("_CameraPos", camPos.x, camPos.y, camPos.z);
+                _computeShader.SetFloats("_CameraFrustumNormals", _normalsFloat);
+                _computeShader.SetMatrix("_ToWorld", transform.localToWorldMatrix);
+
+                // execute the compute shader
+                _computeShader.Dispatch(_cullingKernel, Mathf.CeilToInt(_inputBuffer.count / 64f), 1, 1);
+                //_computeShader.Dispatch(_cullingKernel, _inputBuffer.count, 1, 1);
+
+                // get append buffer counter value
+                ComputeBuffer.CopyCount(_outputBuffer, _argBuffer, 0);
+
+                if (_rendering)
+                {
+                    StartRender(camera);
+                }
+            }
+        }
+    }
+}
diff --git a/Assets/Shaders/Old/CrossboardRenderer_ComputeShader.cs.meta b/Assets/Shaders/Old/CrossboardRenderer_ComputeShader.cs.meta
new file mode 100644
index 00000000..1359f25b
--- /dev/null
+++ b/Assets/Shaders/Old/CrossboardRenderer_ComputeShader.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 50c8cf7a8ebfbe54b87ac44e8d7cfc75
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Old/Instanced_Trees_Opaque_Compute_Crossboard.mat b/Assets/Shaders/Old/Instanced_Trees_Opaque_Compute_Crossboard.mat
new file mode 100644
index 00000000..3704981d
--- /dev/null
+++ b/Assets/Shaders/Old/Instanced_Trees_Opaque_Compute_Crossboard.mat
@@ -0,0 +1,36 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Instanced_Trees_Opaque_Compute_Crossboard
+  m_Shader: {fileID: 4800000, guid: 6cc22e1327a6086419049fb82f479ecb, type: 3}
+  m_ShaderKeywords: LOD
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 0fbcc6e64de97a344984339226a99e3a, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Floats:
+    - _Cutoff: 0.6
+    - _LodFar: 6000
+    - _LodNear: 0
+    - _RandomColor: 1
+    - _TreeAmplitude: 0.001
+    - _UseLod: 1
+    - _WindSpeed: 40
+    - _WindStength: 10
+    m_Colors:
+    - _TrunkColor: {r: 1, g: 1, b: 1, a: 1}
diff --git a/com.saab.map-streamer/Runtime/Assets/DefaultAssetMaterial.mat.meta b/Assets/Shaders/Old/Instanced_Trees_Opaque_Compute_Crossboard.mat.meta
similarity index 79%
rename from com.saab.map-streamer/Runtime/Assets/DefaultAssetMaterial.mat.meta
rename to Assets/Shaders/Old/Instanced_Trees_Opaque_Compute_Crossboard.mat.meta
index 3eaa8f91..7421ff26 100644
--- a/com.saab.map-streamer/Runtime/Assets/DefaultAssetMaterial.mat.meta
+++ b/Assets/Shaders/Old/Instanced_Trees_Opaque_Compute_Crossboard.mat.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 7b3b84139d8f3354e927c3e2d99d2e53
+guid: 944eb49c5272321449bd3fdf804462d9
 NativeFormatImporter:
   externalObjects: {}
   mainObjectFileID: 2100000
diff --git a/Assets/Shaders/Old/Opaque_Crossboard_compute.cginc b/Assets/Shaders/Old/Opaque_Crossboard_compute.cginc
new file mode 100644
index 00000000..4fc6e2fe
--- /dev/null
+++ b/Assets/Shaders/Old/Opaque_Crossboard_compute.cginc
@@ -0,0 +1,295 @@
+//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: Opaque_Crossboard_compute.cginc
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+	// ---------------- Varibles ----------------
+fixed4 _TrunkColor;
+half _RandomColor;
+
+sampler2D _MainTex;
+half _Cutoff;
+
+half _TreeAmplitude;
+half _WindStength;
+half _WindSpeed;
+
+bool _UseLod;
+half _LodFar;
+half _LodNear;
+
+struct InstanceData
+{
+	// local position
+	float3 Point;
+
+	// size of the tree
+	float Size;
+
+	// rotation of the tree (heading, pitch, roll)
+	float3 Rotation;
+
+	// color of the tree
+	float3 Color;
+
+	// Origion.y offset
+	float Offset;
+
+	// Plane Offset
+	float3 PlaneOffset;
+};
+
+StructuredBuffer<InstanceData> _buffer;
+float4x4 _LocalToWorld;
+
+// Tranforms position from object to homogenous space
+inline float4 __UnityObjectToClipPos(in float3 pos)
+{
+	// More efficient than computing M*VP matrix product
+	return mul(UNITY_MATRIX_VP, mul(_LocalToWorld, float4(pos, 1.0)));
+}
+
+struct v2g
+{
+	float4 pos : SV_POSITION;
+	float4 uv : TEXCOORD0;	// size, Heading, Pitch, Roll (will be overiden later)
+	float4 uv1 : TEXCOORD1; // Position offset - Plane offsets.xyz
+
+	float3 color: COLOR0;
+};
+
+struct g2f
+{
+	float4 pos : SV_POSITION;
+	float3 norm : NORMAL;
+	float2 uv : TEXCOORD0;
+
+	float4 diffuseColor : COLOR0;
+	fixed3 diff : COLOR1;
+};
+
+v2g vert(uint id : SV_VertexID)
+{
+	v2g OUT;
+
+	InstanceData data = _buffer[id.x];
+
+	OUT.pos = float4(data.Point, 1);
+	OUT.uv = float4(data.Size, data.Rotation.xyz);
+	OUT.uv1 = float4(data.Offset, data.PlaneOffset.xyz);
+	OUT.color = data.Color;
+
+	return OUT;
+}
+
+void GenerateQuad(inout TriangleStream<g2f> tristream, float3 points[4], float4 color, float2 uv[4], float3 norm)
+{
+	g2f OUT;
+	float3 faceNormal = cross(points[1] - points[0], points[2] - points[0]);
+	for (int i = 0; i < 4; i++)
+	{
+		OUT.pos = __UnityObjectToClipPos(points[i]);
+		OUT.norm = faceNormal;
+		OUT.diffuseColor = color;
+		OUT.uv = uv[i];
+
+		// ---------------- Light ----------------
+		half3 worldNormal = UnityObjectToWorldNormal(norm);
+		half nl = max(0, dot(worldNormal, _WorldSpaceLightPos0.xyz));
+		OUT.diff = nl * _LightColor0.rgb;
+
+		tristream.Append(OUT);
+	}
+	tristream.RestartStrip();
+}
+
+float3 rotate(float degress, float3 vec)
+{
+	float3x3 rotMatrix = float3x3(cos(degress), 0, sin(degress), 0, 1, 0, -sin(degress), 0, cos(degress));
+	return mul(rotMatrix, vec);
+}
+
+[maxvertexcount(12)]
+void geom(point v2g IN[1], inout TriangleStream<g2f> triStream)
+{
+	float size = IN[0].uv.x;
+
+	float dist = length(mul(_LocalToWorld, float4(IN[0].pos.xyz, 1)));
+
+	float _size = (size / 120);
+	float  _Alpha = 0;
+	_size += 0.6;
+	if (_size > 1) { _size = 1; }
+
+
+	int LodFar = _LodFar;
+	int LodNear = _LodNear * _size;
+
+	// ---------------- LODing ----------------
+
+	// TODO: still needs some work
+	if (_UseLod)
+	{
+		if (dist > LodFar || dist < LodNear)
+		{
+			return;
+		}
+		else if (dist > (LodFar - 1000))
+		{
+			_Alpha = 0.5;
+			//_Alpha = (1 / 500) * (dist - (LodFar - 1000));
+		}
+	}
+
+	// --------------------------------------------
+
+	float3 _Offset = float3(0, IN[0].uv1.x, 0);
+	float3 _normalOffset = IN[0].uv1.yzw; //float3(IN[0].uv1.y, IN[0].uv1.z, IN[0].uv1.w);
+
+	float heading = IN[0].uv.y;
+	float pitch = IN[0].uv.z;
+	float roll = IN[0].uv.w;
+
+	float4 color = float4(IN[0].color, _Alpha);
+
+	// ---------------- UV1 size/heading ----------------
+	half height = size;
+	half width = height;
+	half angle = heading;
+
+	// ---------------- UV2 pitch/roll ----------------
+	float3 norm = float3(pitch, 1, roll);
+
+	// --------------------------------------------
+	float3 rot = .5 * (angle * PI);
+
+	float3 perpendicularAngle = rotate(rot, float3(0, 0, 1));
+	_Offset.y *= height;
+
+	// ---------------- orgion base ----------------
+	float3 base = IN[0].pos.xyz - _Offset;
+	float3 top = base + norm * height;
+	float3 mid = base + norm * (height / 2);
+	// ---------------- orgion mid ----------------
+	mid = IN[0].pos.xyz - _Offset;
+	base = mid + norm * (-height / 2);
+	top = mid + norm * (height / 2);
+
+	// ----------------------------------------------------------
+	float3 forwarddir = normalize(float3(0, 0, 0) - mul(_LocalToWorld, float4(IN[0].pos.xyz, 1)));
+	// ----------------------------------------------------------
+
+	float3 rot90 = rotate(PI / 2, perpendicularAngle);
+
+	// ---------------- get angle ----------------
+	float3 dir = norm;
+	float newPitch = dot(dir, forwarddir);
+
+	dir = perpendicularAngle;
+	float yawRight = dot(dir, forwarddir);
+
+	dir = cross(norm, perpendicularAngle);
+	float yawLeft = dot(dir, forwarddir);
+
+	// ---------------- top quad ----------------
+	float3 topOffset = mid + norm * (_normalOffset.y * (height / 2));
+
+	float3 topQuad[4] = { topOffset + (rot90 * 0.5 * width) + (perpendicularAngle * 0.5 * width),
+		topOffset + (rot90 * 0.5 * width) - (perpendicularAngle * 0.5 * width),
+		topOffset - (rot90 * 0.5 * width) + (perpendicularAngle * 0.5 * width),
+		topOffset - (rot90 * 0.5 * width) - (perpendicularAngle * 0.5 * width) };
+
+	float2 top_uv[4] = { float2(0.5,0), float2(1,0), float2(0.5,0.5), float2(1,0.5) };
+	// ---------------- right quad ----------------
+	float3 rightOffset = perpendicularAngle * (_normalOffset.z * (width / 2));;
+
+	float3 rightQuad[4] = { (base + rightOffset) + rot90 * 0.5 * width,
+			(base + rightOffset) - rot90 * 0.5 * width,
+			(top + rightOffset) + rot90 * 0.5 * width,
+			(top + rightOffset) - rot90 * 0.5 * width };
+
+	float2 right_uv[4] = { float2(0.5,0), float2(0,0), float2(0.5,0.5), float2(0,0.5) };
+	// ---------------- forward quad ----------------
+	float3 forwardOffset = rot90 * (_normalOffset.z * (width / 2));
+
+	float3 leftQuad[4] = { ((base + forwardOffset) + perpendicularAngle * 0.5 * width) ,
+			((base + forwardOffset) - perpendicularAngle * 0.5 * width) ,
+			((top + forwardOffset) + perpendicularAngle * 0.5 * width) ,
+			((top + forwardOffset) - perpendicularAngle * 0.5 * width) };
+
+	float2 forward_uv[4] = { float2(0.5,0.5), float2(0,0.5), float2(0.5,1), float2(0,1) };
+
+	// ---------------- alpha ----------------
+
+
+
+	// ---------------- Render ----------------
+
+	//if (yawRight >= 0.5 || yawRight <= -0.5)
+	{
+		GenerateQuad(triStream, rightQuad, color, right_uv, norm);
+	}
+	//if (yawLeft >= 0.5 || yawLeft <= -0.5)
+	{
+		GenerateQuad(triStream, leftQuad, color, forward_uv, norm);
+	}
+	if (newPitch >= 0.3 || newPitch <= -0.3)
+	{
+		GenerateQuad(triStream, topQuad, color, top_uv, norm);
+	}
+}
+
+half3 frag(g2f IN) : SV_TARGET
+{
+	// ---------------- leaf texture ----------------
+	//fixed4 leaf = tex2D(_MainTex, IN.uv) + tex2D(_Mask, IN.uv) * _LeafColor * (_LeafColorModify * IN.diffuseColor);
+
+	float2 cord = IN.uv;
+	cord.x += cord.y * sin(cord.y * _WindStength + _Time.x * _WindSpeed) * _TreeAmplitude;
+
+	// ---------------- trunk texture ----------------
+	fixed4 trunk = tex2D(_MainTex, cord) * _TrunkColor;
+	//************************ 5 ms (2M) ************************
+	trunk = trunk + (trunk * (half4(IN.diffuseColor.rgb,1) * _RandomColor));
+
+	clip(trunk.a - (_Cutoff + IN.diffuseColor.a));
+	// ---------------- lighting color ----------------
+
+	//fixed3 lighting = IN.diff + IN.ambient;
+	//trunk.rgb *= lighting;
+
+
+	return trunk.rgb * (IN.diff); //+_LightColor0.rgb);
+}
\ No newline at end of file
diff --git a/Assets/Shaders/Old/Opaque_Crossboard_compute.cginc.meta b/Assets/Shaders/Old/Opaque_Crossboard_compute.cginc.meta
new file mode 100644
index 00000000..de5f2368
--- /dev/null
+++ b/Assets/Shaders/Old/Opaque_Crossboard_compute.cginc.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: f88b0800064abae4184d8c8e7ee8c2f0
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Old/Opaque_Crossboard_compute.shader b/Assets/Shaders/Old/Opaque_Crossboard_compute.shader
new file mode 100644
index 00000000..d306bbef
--- /dev/null
+++ b/Assets/Shaders/Old/Opaque_Crossboard_compute.shader
@@ -0,0 +1,105 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: Opaque_Crossboard_compute.shader
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+Shader "Instanced/Trees/Opaque/Compute/Crossboard" 
+{
+	Properties
+	{
+		_TrunkColor("Color Trunk", Color) = (1,1,1,1)
+		_RandomColor("Random Color Amount", Range(0,1)) = 1
+
+		_MainTex("Texture", 2D) = "white" {}
+		_Cutoff("Alpha Cutoff", Range(0,2)) = 0.6
+
+		[Toggle(LOD)]
+		_UseLod("Use Lod", Float) = 1
+
+		// settings for the distance to lod out a object is based on its size.
+		// t.ex. a obeject with size 1 will lod out at a distance of 200 m (with the settings below)
+		// and a object with size 10 will instead lod out at a distance of 2000m.
+		_LodFar("Far LodOut Distance", Float) = 6000
+		_LodNear("Near LodOut Distance", Float) = 0 //100  
+
+		// TODO: move to a computeShader which send back a splatmap with the wind info.
+		_TreeAmplitude("Wind Amplitude", Float) = 0.001
+		_WindSpeed("Wind Speed", Float) = 40
+		_WindStength("Wind Strength", Float) = 10
+
+	}
+	SubShader
+	{
+		Cull Off
+		LOD 200
+
+		Tags
+		{
+			"Queue" = "AlphaTest" 
+			"RenderType" = "TransparentCutout" 
+			"LightMode" = "ForwardBase" 
+			//"LightMode" = "Deferred"
+			//"IgnoreProjector" = "True" 
+			//"DisableBatching" = "True"
+		}
+		Pass
+		{
+			//Name "FORWARD_BASE"
+
+			Cull Off
+			//ZWrite On
+			
+		//	Blend SrcAlpha OneMinusSrcAlpha
+
+			CGPROGRAM
+
+			#include "UnityCG.cginc" 
+
+			#define PI 3.1415926535897932384626433832795
+			#include "Lighting.cginc"
+
+			#pragma vertex vert
+			#pragma fragment frag
+			#pragma geometry geom
+
+			#pragma only_renderers d3d11
+			#pragma target 5.0
+
+			#include "Opaque_Crossboard_compute.cginc"
+
+			ENDCG
+		}
+	}
+}
\ No newline at end of file
diff --git a/Assets/Shaders/Old/Opaque_Crossboard_compute.shader.meta b/Assets/Shaders/Old/Opaque_Crossboard_compute.shader.meta
new file mode 100644
index 00000000..d75bb96b
--- /dev/null
+++ b/Assets/Shaders/Old/Opaque_Crossboard_compute.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 16215d9a48816d945845515dd260c5ca
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Old/UnlitBillboard.shader b/Assets/Shaders/Old/UnlitBillboard.shader
new file mode 100644
index 00000000..5ad7f952
--- /dev/null
+++ b/Assets/Shaders/Old/UnlitBillboard.shader
@@ -0,0 +1,82 @@
+﻿Shader "Unlit/Vector(Billboard)"
+{
+	Properties
+	{
+		[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
+		_Color("Tint", Color) = (1,1,1,1)
+		[MaterialToggle] PixelSnap("Pixel snap", Float) = 0
+		[HideInInspector] _RendererColor("RendererColor", Color) = (1,1,1,1)
+		[HideInInspector] _Flip("Flip", Vector) = (1,1,1,1)
+		[PerRendererData] _AlphaTex("External Alpha", 2D) = "white" {}
+		[PerRendererData] _EnableExternalAlpha("Enable External Alpha", Float) = 0
+	}
+
+		SubShader
+		{
+			Tags
+			{
+				"Queue" = "Transparent"
+				"IgnoreProjector" = "True"
+				"RenderType" = "Transparent"
+				"PreviewType" = "Plane"
+				"CanUseSpriteAtlas" = "True"
+			}
+
+			Cull Off
+			Lighting Off
+			ZWrite Off
+			Blend One OneMinusSrcAlpha
+
+			Pass
+			{
+			CGPROGRAM
+				#pragma vertex VectorVert
+				#pragma fragment SpriteFrag
+				#pragma target 2.0
+				#pragma multi_compile_instancing
+				#pragma multi_compile _ PIXELSNAP_ON
+				#pragma multi_compile _ ETC1_EXTERNAL_ALPHA
+				#include "UnitySprites.cginc"
+
+				v2f VectorVert(appdata_t IN)
+				{
+					v2f OUT;
+
+					UNITY_SETUP_INSTANCE_ID(IN);
+					UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
+
+					//OUT.vertex = UnityFlipSprite(IN.vertex, _Flip);
+					//OUT.vertex = UnityObjectToClipPos(OUT.vertex);
+
+					OUT.vertex = mul(UNITY_MATRIX_P,
+						mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0))
+						+ float4(IN.vertex.x, IN.vertex.y, 0.0, 0.0)
+						* float4(1.0, 1.0, 1.0, 1.0));
+
+					OUT.texcoord = IN.texcoord;
+
+
+					// extract x and y scale from object to world transform matrix
+					float2 scale = float2(
+						length(unity_ObjectToWorld._m00_m10_m20),
+						length(unity_ObjectToWorld._m01_m11_m21)
+						);
+
+					#ifdef UNITY_COLORSPACE_GAMMA
+					fixed4 color = IN.color;
+					#else
+					fixed4 color = fixed4(GammaToLinearSpace(IN.color.rgb), IN.color.a);
+					#endif
+
+					OUT.color = color * _Color * _RendererColor;
+
+					#ifdef PIXELSNAP_ON
+					OUT.vertex = UnityPixelSnap(OUT.vertex * scale);
+					#endif
+
+					return OUT;
+				}
+			ENDCG
+			}
+		}
+}
diff --git a/Assets/Shaders/Old/UnlitBillboard.shader.meta b/Assets/Shaders/Old/UnlitBillboard.shader.meta
new file mode 100644
index 00000000..61043486
--- /dev/null
+++ b/Assets/Shaders/Old/UnlitBillboard.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: a0b778401edafc348b331bf96024eb4d
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Old/UnlitBillboardFixSize.shader b/Assets/Shaders/Old/UnlitBillboardFixSize.shader
new file mode 100644
index 00000000..1a4f514b
--- /dev/null
+++ b/Assets/Shaders/Old/UnlitBillboardFixSize.shader
@@ -0,0 +1,113 @@
+﻿Shader "Unlit/Vector(BillboardFixedSize)"
+{
+	Properties
+	{
+		[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
+		_Color("Tint", Color) = (1,1,1,1)
+		[MaterialToggle] PixelSnap("Pixel snap", Float) = 0
+		[MaterialToggle] Scale("Scale By Distance", Float) = 0
+		[MaterialToggle] View("Scale By View", Float) = 0
+		[HideInInspector] _RendererColor("RendererColor", Color) = (1,1,1,1)
+		[HideInInspector] _Flip("Flip", Vector) = (-1,1,1,1)
+		[PerRendererData] _AlphaTex("External Alpha", 2D) = "white" {}
+		[PerRendererData] _EnableExternalAlpha("Enable External Alpha", Float) = 0
+		
+	}
+
+		SubShader
+		{
+			Tags
+			{
+				"Queue" = "Transparent"
+				"IgnoreProjector" = "True"
+				"RenderType" = "Transparent"
+				"PreviewType" = "Plane"
+				"CanUseSpriteAtlas" = "True"
+			}
+
+			Cull Off
+			Lighting Off
+			ZWrite On
+			Blend One OneMinusSrcAlpha
+
+			Pass
+			{
+			CGPROGRAM
+				#pragma vertex VectorVert
+				#pragma fragment SpriteFrag
+				#pragma target 2.0
+				#pragma multi_compile_instancing
+				#pragma multi_compile _ PIXELSNAP_ON
+				#pragma multi_compile _ SCALE_ON
+				#pragma multi_compile _ VIEW_ON
+				#pragma multi_compile _ ETC1_EXTERNAL_ALPHA
+				#include "UnitySprites.cginc"
+
+				v2f VectorVert(appdata_t IN)
+				{
+					v2f OUT;
+
+					UNITY_SETUP_INSTANCE_ID(IN);
+					UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
+
+					// extract world pivot position from object to world transform matrix
+					float3 worldPos = unity_ObjectToWorld._m03_m13_m23;
+
+					// extract x and y scale from object to world transform matrix
+					float2 scale = float2(
+						length(unity_ObjectToWorld._m00_m10_m20),
+						length(unity_ObjectToWorld._m01_m11_m21)
+						);
+
+					// transform pivot position into view space
+					float4 viewPos = mul(UNITY_MATRIX_V, float4(worldPos, 1.0));
+
+					#ifdef SCALE_ON
+						// Adjust scale by distance
+						float z = -viewPos.z;
+						scale = lerp(scale, scale * 0.5, clamp(z / 5000, 0, 1));
+					#endif
+
+					// apply transform scale to xy vertex positions
+					float2 vertex = IN.vertex.xy * scale;
+
+					#ifdef VIEW_ON
+						// multiply by view depth for constant view size scaling
+						vertex *= -viewPos.z;
+					#endif
+
+					// divide by perspective projection matrix [1][1] if you don't want camera FOV to displayed size
+					// the * 0.5 is to make a default quad with a scale of 1 be exactly the height of the view
+
+					vertex /= UNITY_MATRIX_P._m11 * float2(-0.5, 0.5);
+
+					// along with the perspective projection divide by screen height if you want the scale to be in screen pixels
+					// vertex /= _ScreenParams.y;
+
+
+					// add vertex positions to view position pivot
+					viewPos.xy += vertex;
+
+					// transform into clip space
+					OUT.vertex = mul(UNITY_MATRIX_P, viewPos);
+
+					OUT.texcoord = IN.texcoord;
+
+					#ifdef UNITY_COLORSPACE_GAMMA
+						fixed4 color = IN.color;
+					#else
+						fixed4 color = fixed4(GammaToLinearSpace(IN.color.rgb), IN.color.a);
+					#endif
+
+					OUT.color = color * _Color * _RendererColor;
+
+					#ifdef PIXELSNAP_ON
+						OUT.vertex = UnityPixelSnap(OUT.vertex);
+					#endif
+
+					return OUT;
+				}
+			ENDCG
+			}
+		}
+}
diff --git a/Assets/Shaders/Old/UnlitBillboardFixSize.shader.meta b/Assets/Shaders/Old/UnlitBillboardFixSize.shader.meta
new file mode 100644
index 00000000..22c486b6
--- /dev/null
+++ b/Assets/Shaders/Old/UnlitBillboardFixSize.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: a685de7d5dda7a34c9582cd66e711129
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Project.shader b/Assets/Shaders/Project.shader
new file mode 100644
index 00000000..59f14122
--- /dev/null
+++ b/Assets/Shaders/Project.shader
@@ -0,0 +1,56 @@
+﻿Shader "Custom/ProjectorAdditiveTint" 
+{
+    Properties
+    {
+        _Color("Tint Color", Color) = (1,1,1,1)
+        _ShadowTex("Cookie", 2D) = "gray" {}
+    }
+
+    Subshader
+    {
+            Tags {"Queue" = "Transparent+10" "RenderType" = "Transparent"}
+
+
+            Pass 
+            {
+                //ZWrite Off
+                //Offset -1, -1
+                ColorMask RGB
+                Blend SrcAlpha One // Additive blending
+
+                CGPROGRAM
+                #pragma vertex vert
+                #pragma fragment frag
+                #include "UnityCG.cginc"
+
+                struct v2f 
+                {
+                    float4 uvShadow : TEXCOORD0;
+                    float4 pos : SV_POSITION;
+                };
+
+                float4x4 unity_Projector;
+                float4x4 unity_ProjectorClip;
+
+                v2f vert(float4 vertex : POSITION)
+                {
+                    v2f o;
+                    o.pos = UnityObjectToClipPos(vertex);
+                    o.uvShadow = mul(unity_Projector, vertex);
+                    return o;
+                }
+
+                sampler2D _ShadowTex;
+                fixed4 _Color;
+
+                fixed4 frag(v2f i) : SV_Target
+                {
+                    fixed4 texCookie = tex2Dproj(_ShadowTex, UNITY_PROJ_COORD(i.uvShadow));
+                    clip(1 + i.uvShadow.z);
+                    clip(1 - i.uvShadow.z);
+                    return _Color * texCookie.a;
+                }
+                ENDCG
+            }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Shaders/Project.shader.meta b/Assets/Shaders/Project.shader.meta
new file mode 100644
index 00000000..5a699840
--- /dev/null
+++ b/Assets/Shaders/Project.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 09ee015bda5a9224da8b66ef960639ae
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Silhouette-Outlined Diffuse.meta b/Assets/Shaders/Silhouette-Outlined Diffuse.meta
new file mode 100644
index 00000000..48f07e2f
--- /dev/null
+++ b/Assets/Shaders/Silhouette-Outlined Diffuse.meta	
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7cb1c7291a62e294783bd528ce77eca4
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouetteOnly.shader b/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouetteOnly.shader
new file mode 100644
index 00000000..e442fdc6
--- /dev/null
+++ b/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouetteOnly.shader	
@@ -0,0 +1,120 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: SilhouetteOnly.shader
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
+
+Shader "Outlined/Silhouette Only" {
+	Properties{
+		_OutlineColor("Outline Color", Color) = (0,0,0,1)
+		_Outline("Outline width", Range(0.0, 1)) = .5
+	}
+
+		CGINCLUDE
+#include "UnityCG.cginc"
+
+		struct appdata {
+		float4 vertex : POSITION;
+		float3 normal : NORMAL;
+	};
+
+	struct v2f {
+		float4 pos : POSITION;
+		float4 color : COLOR;
+	};
+
+	uniform float _Outline;
+	uniform float4 _OutlineColor;
+
+	v2f vert(appdata v) {
+		// just make a copy of incoming vertex data but scaled according to normal direction
+		v2f o;
+		o.pos = UnityObjectToClipPos(v.vertex);
+
+		float3 norm = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);
+		float2 offset = TransformViewToProjection(norm.xy);
+
+		o.pos.xy += offset * o.pos.z * _Outline;
+		o.color = _OutlineColor;
+		return o;
+	}
+	ENDCG
+
+		SubShader{
+			Tags { "Queue" = "Transparent" }
+
+			Pass {
+				Name "BASE"
+				Cull Back
+				Blend Zero One
+
+		// uncomment this to hide inner details:
+		//Offset -8, -8
+
+		SetTexture[_OutlineColor] {
+			ConstantColor(0,0,0,0)
+			Combine constant
+		}
+	}
+
+		// note that a vertex shader is specified here but its using the one above
+		Pass {
+			Name "OUTLINE"
+			Tags { "LightMode" = "Always" }
+			Cull Front
+
+		// you can choose what kind of blending mode you want for the outline
+		//Blend SrcAlpha OneMinusSrcAlpha // Normal
+		//Blend One One // Additive
+		Blend One OneMinusDstColor // Soft Additive
+		//Blend DstColor Zero // Multiplicative
+		//Blend DstColor SrcColor // 2x Multiplicative
+
+CGPROGRAM
+#pragma vertex vert
+#pragma fragment frag
+
+half4 frag(v2f i) :COLOR {
+	return i.color;
+}
+ENDCG
+		}
+
+
+	}
+
+		Fallback "Diffuse"
+}
\ No newline at end of file
diff --git a/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouetteOnly.shader.meta b/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouetteOnly.shader.meta
new file mode 100644
index 00000000..5132d358
--- /dev/null
+++ b/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouetteOnly.shader.meta	
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 1c39dacc6ec5f924580d843380d92c4c
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouettedBumpDiffuse.shader b/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouettedBumpDiffuse.shader
new file mode 100644
index 00000000..d50c7374
--- /dev/null
+++ b/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouettedBumpDiffuse.shader	
@@ -0,0 +1,168 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: SilhouettedBumpDiffuse.shader
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
+
+Shader "Outlined/Silhouetted Bumped Diffuse" {
+	Properties{
+		_Color("Main Color", Color) = (.5,.5,.5,1)
+		_OutlineColor("Outline Color", Color) = (0,0,0,1)
+		_Outline("Outline width", Range(0.0, 1)) = .5
+		_MainTex("Base (RGB)", 2D) = "white" { }
+		_BumpMap("Bumpmap", 2D) = "bump" {}
+	}
+
+	CGINCLUDE
+	#include "UnityCG.cginc"
+
+	struct appdata {
+		float4 vertex : POSITION;
+		float3 normal : NORMAL;
+	};
+
+	struct v2f {
+		float4 pos : POSITION;
+		float4 color : COLOR;
+	};
+
+	uniform float _Outline;
+	uniform float4 _OutlineColor;
+
+	v2f vert(appdata v) {
+		// just make a copy of incoming vertex data but scaled according to normal direction
+		v2f o;
+		o.pos = UnityObjectToClipPos(v.vertex);
+
+		float3 norm = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);
+		float2 offset = TransformViewToProjection(norm.xy);
+
+		o.pos.xy += offset * o.pos.z * _Outline;
+		o.color = _OutlineColor;
+		return o;
+	}
+	ENDCG
+
+		SubShader{
+			Tags { "Queue" = "Transparent" }
+
+			// note that a vertex shader is specified here but its using the one above
+			Pass {
+				Name "OUTLINE"
+				Tags { "LightMode" = "Always" }
+				Cull Off
+				ZWrite Off
+				ZTest Always
+
+		// you can choose what kind of blending mode you want for the outline
+		Blend SrcAlpha OneMinusSrcAlpha // Normal
+		//Blend One One // Additive
+		//Blend One OneMinusDstColor // Soft Additive
+		//Blend DstColor Zero // Multiplicative
+		//Blend DstColor SrcColor // 2x Multiplicative
+
+CGPROGRAM
+#pragma vertex vert
+#pragma fragment frag
+
+half4 frag(v2f i) : COLOR {
+	return i.color;
+}
+ENDCG
+		}
+
+
+CGPROGRAM
+#pragma surface surf Lambert
+struct Input {
+	float2 uv_MainTex;
+	float2 uv_BumpMap;
+};
+sampler2D _MainTex;
+sampler2D _BumpMap;
+uniform float3 _Color;
+void surf(Input IN, inout SurfaceOutput o) {
+	o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb * _Color;
+	o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
+}
+ENDCG
+
+	}
+
+		SubShader{
+			Tags { "Queue" = "Transparent" }
+
+			Pass {
+				Name "OUTLINE"
+				Tags { "LightMode" = "Always" }
+				Cull Front
+				ZWrite Off
+				ZTest Always
+				Offset 15,15
+
+	// you can choose what kind of blending mode you want for the outline
+	Blend SrcAlpha OneMinusSrcAlpha // Normal
+	//Blend One One // Additive
+	//Blend One OneMinusDstColor // Soft Additive
+	//Blend DstColor Zero // Multiplicative
+	//Blend DstColor SrcColor // 2x Multiplicative
+
+	CGPROGRAM
+	#pragma vertex vert
+	#pragma exclude_renderers gles xbox360 ps3
+	ENDCG
+	SetTexture[_MainTex] { combine primary }
+}
+
+CGPROGRAM
+#pragma surface surf Lambert
+struct Input {
+	float2 uv_MainTex;
+	float2 uv_BumpMap;
+};
+sampler2D _MainTex;
+sampler2D _BumpMap;
+uniform float3 _Color;
+void surf(Input IN, inout SurfaceOutput o) {
+	o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb * _Color;
+	o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
+}
+ENDCG
+
+}
+
+Fallback "Outlined/Silhouetted Diffuse"
+}
\ No newline at end of file
diff --git a/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouettedBumpDiffuse.shader.meta b/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouettedBumpDiffuse.shader.meta
new file mode 100644
index 00000000..f787b99f
--- /dev/null
+++ b/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouettedBumpDiffuse.shader.meta	
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: f460ed5a2bea2a04285a3fc903888153
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouettedDiffuse.shader b/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouettedDiffuse.shader
new file mode 100644
index 00000000..9088bace
--- /dev/null
+++ b/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouettedDiffuse.shader	
@@ -0,0 +1,173 @@
+﻿//******************************************************************************
+//
+// Copyright (C) SAAB AB
+//
+// All rights, including the copyright, to the computer program(s) 
+// herein belong to Saab AB. The program(s) may be used and/or
+// copied only with the written permission of Saab AB, or in
+// accordance with the terms and conditions stipulated in the
+// agreement/contract under which the program(s) have been
+// supplied. 
+//
+//
+// Information Class:	COMPANY UNCLASSIFIED
+// Defence Secrecy:		NOT CLASSIFIED
+// Export Control:		NOT EXPORT CONTROLLED
+//
+//
+// File			: SilhouettedDiffuse.shader
+// Module		:
+// Description	: Shader Code
+// Author		: ALBNI
+// Product		: BTA
+//
+//
+// Revision History...
+//
+// Who	Date	Description
+//
+//
+//******************************************************************************
+
+// ************************** NOTE *********************************************
+//
+//      Stand alone from BTA !!! No BTA code in this !!!
+//
+// *****************************************************************************
+
+// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
+
+Shader "Outlined/Silhouetted Diffuse" {
+	Properties{
+		_Color("Main Color", Color) = (.5,.5,.5,1)
+		_OutlineColor("Outline Color", Color) = (0,0,0,1)
+		_Outline("Outline width", Range(0.0, 1)) = .5
+		_MainTex("Base (RGB)", 2D) = "white" { }
+	}
+
+		CGINCLUDE
+#include "UnityCG.cginc"
+
+		struct appdata {
+		float4 vertex : POSITION;
+		float3 normal : NORMAL;
+	};
+
+	struct v2f {
+		float4 pos : POSITION;
+		float4 color : COLOR;
+	};
+
+	uniform float _Outline;
+	uniform float4 _OutlineColor;
+
+	v2f vert(appdata v) {
+		// just make a copy of incoming vertex data but scaled according to normal direction
+		v2f o;
+		o.pos = UnityObjectToClipPos(v.vertex);
+
+		float3 norm = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);
+		float2 offset = TransformViewToProjection(norm.xy);
+
+		o.pos.xy += offset * o.pos.z * _Outline;
+		o.color = _OutlineColor;
+		return o;
+	}
+	ENDCG
+
+		SubShader{
+			Tags { "Queue" = "Transparent" }
+
+			// note that a vertex shader is specified here but its using the one above
+			Pass {
+				Name "OUTLINE"
+				Tags { "LightMode" = "Always" }
+				Cull Off
+				ZWrite Off
+				ZTest Always
+				ColorMask RGB // alpha not used
+
+				// you can choose what kind of blending mode you want for the outline
+				Blend SrcAlpha OneMinusSrcAlpha // Normal
+				//Blend One One // Additive
+				//Blend One OneMinusDstColor // Soft Additive
+				//Blend DstColor Zero // Multiplicative
+				//Blend DstColor SrcColor // 2x Multiplicative
+
+	CGPROGRAM
+	#pragma vertex vert
+	#pragma fragment frag
+
+	half4 frag(v2f i) :COLOR {
+		return i.color;
+	}
+	ENDCG
+			}
+
+			Pass {
+				Name "BASE"
+				ZWrite On
+				ZTest LEqual
+				Blend SrcAlpha OneMinusSrcAlpha
+				Material {
+					Diffuse[_Color]
+					Ambient[_Color]
+				}
+				Lighting On
+				SetTexture[_MainTex] {
+					ConstantColor[_Color]
+					Combine texture * constant
+				}
+				SetTexture[_MainTex] {
+					Combine previous * primary DOUBLE
+				}
+			}
+	}
+
+		SubShader{
+			Tags { "Queue" = "Transparent" }
+
+			Pass {
+				Name "OUTLINE"
+				Tags { "LightMode" = "Always" }
+				Cull Front
+				ZWrite Off
+				ZTest Always
+				ColorMask RGB
+
+		// you can choose what kind of blending mode you want for the outline
+		Blend SrcAlpha OneMinusSrcAlpha // Normal
+		//Blend One One // Additive
+		//Blend One OneMinusDstColor // Soft Additive
+		//Blend DstColor Zero // Multiplicative
+		//Blend DstColor SrcColor // 2x Multiplicative
+
+		CGPROGRAM
+		#pragma vertex vert
+		#pragma exclude_renderers gles xbox360 ps3
+		ENDCG
+		SetTexture[_MainTex] { combine primary }
+	}
+
+	Pass {
+		Name "BASE"
+		ZWrite On
+		ZTest LEqual
+		Blend SrcAlpha OneMinusSrcAlpha
+		Material {
+			Diffuse[_Color]
+			Ambient[_Color]
+		}
+		Lighting On
+		SetTexture[_MainTex] {
+			ConstantColor[_Color]
+			Combine texture * constant
+		}
+		SetTexture[_MainTex] {
+			Combine previous * primary DOUBLE
+		}
+	}
+	}
+
+		Fallback "Diffuse"
+}
diff --git a/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouettedDiffuse.shader.meta b/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouettedDiffuse.shader.meta
new file mode 100644
index 00000000..26ec4405
--- /dev/null
+++ b/Assets/Shaders/Silhouette-Outlined Diffuse/SilhouettedDiffuse.shader.meta	
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 1297898cde3395248ab2c117ca9f8878
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Terrain.shader b/Assets/Shaders/Terrain.shader
new file mode 100644
index 00000000..42d9baad
--- /dev/null
+++ b/Assets/Shaders/Terrain.shader
@@ -0,0 +1,153 @@
+﻿
+Shader "Custom/Terrain"
+{
+	Properties
+	{
+		[NoScaleOffset] _MainTex("Texture", 2D) = "white" {}
+		[NoScaleOffset] _NormalMap("Default Normal", 2D) = "bump" {}
+		_DefaultTiling("Default Tiling + Offset", Vector) = (30,30,0,0)
+		[NoScaleOffset] _PlacementTex("Placement", 2D) = "white" {}
+
+		_BumpScale("Bump Scale", Float) = 0.6
+		_Tiling("Detail Tiling + Offset", Vector) = (200,200,0,0)
+		_Smoothness("Smoothness", Range(0, 1)) = 0.1
+		[Gamma] _Metallic("Metallic", Range(0, 1)) = 0.0
+
+		_Fade("Fade", float) = 10
+		_FadeAmount("Fade Amount", float) = 10
+
+		[Toggle(BLEND)]
+		_Blend("Don't Blend with terrain", Float) = 0
+
+		[NoScaleOffset] _DetailTexs("Detail Textures", 2DArray) = "white" {}
+		[NoScaleOffset] _NormalTexs("Normal Textures", 2DArray) = "bump" {}
+	}
+		SubShader
+	{
+		Pass
+		{
+			Tags 
+			{
+				"LightMode" = "ForwardBase"
+			}
+
+			CGPROGRAM
+
+			// Compiler definitions
+			#pragma target 3.0
+
+			//#pragma multi_compile_fwdbase
+			#pragma multi_compile _ SHADOWS_SCREEN
+			#pragma multi_compile _ VERTEXLIGHT_ON
+
+			#pragma vertex vert
+			#pragma fragment frag
+			#pragma shader_feature BLEND
+
+			#define FORWARD_BASE_PASS
+			#define BINORMAL_PER_FRAGMENT
+
+			#include "TerrainPass.cginc"
+
+			ENDCG
+		}
+
+		Pass
+		{
+			Tags
+			{
+				"LightMode" = "ForwardAdd"
+			}
+
+			Blend One One
+			ZWrite Off
+
+			CGPROGRAM
+
+			// Compiler definitions
+			#pragma target 3.0
+
+			//#pragma multi_compile DIRECTIONAL POINT SPOT
+			#pragma multi_compile_fwdadd_fullshadows
+
+			#pragma vertex vert
+			#pragma fragment frag
+			#pragma shader_feature BLEND
+
+			#define BINORMAL_PER_FRAGMENT
+
+			#include "TerrainPass.cginc"
+
+			ENDCG
+		}
+
+		Pass 
+		{
+			Tags 
+			{
+				"LightMode" = "ShadowCaster"
+			}
+
+			//ZWrite Off
+
+			CGPROGRAM
+
+			#pragma target 3.0
+
+			#pragma multi_compile_shadowcaster
+
+			#pragma vertex MyShadowVertexProgram
+			#pragma fragment MyShadowFragmentProgram
+
+			#if !defined(MY_SHADOWS_INCLUDED)
+			#define MY_SHADOWS_INCLUDED
+
+			#include "UnityCG.cginc"
+
+			struct VertexData 
+			{
+				float4 position : POSITION;
+				float3 normal : NORMAL;
+			};
+
+				#if defined(SHADOWS_CUBE)
+					struct Interpolators 
+					{
+						float4 position : SV_POSITION;
+						float3 lightVec : TEXCOORD0;
+					};
+
+					Interpolators MyShadowVertexProgram(VertexData v) 
+					{
+						Interpolators i;
+						i.position = UnityObjectToClipPos(v.position);
+						i.lightVec = mul(unity_ObjectToWorld, v.position).xyz - _LightPositionRange.xyz;
+						return i;
+					}
+
+					float4 MyShadowFragmentProgram(Interpolators i) : SV_TARGET
+					{
+						float depth = length(i.lightVec) + unity_LightShadowBias.x;
+						depth *= _LightPositionRange.w;
+						return UnityEncodeCubeShadowDepth(depth);
+					}
+				#else
+					float4 MyShadowVertexProgram(VertexData v) : SV_POSITION 
+					{
+						float4 position = UnityClipSpaceShadowCasterPos(v.position.xyz, v.normal);
+						return UnityApplyLinearShadowBias(position);
+					}
+
+					half4 MyShadowFragmentProgram() : SV_TARGET 
+					{
+						return 0;
+					}
+				#endif
+			#endif
+
+			ENDCG
+		}
+
+	}
+	//Fallback "Diffuse"
+}
diff --git a/Assets/Shaders/Terrain.shader.meta b/Assets/Shaders/Terrain.shader.meta
new file mode 100644
index 00000000..0858d467
--- /dev/null
+++ b/Assets/Shaders/Terrain.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: c99e6a1cd5d508440a64c3f2239924cd
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures.meta b/Assets/Shaders/TerrainDetailTextures.meta
similarity index 77%
rename from com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures.meta
rename to Assets/Shaders/TerrainDetailTextures.meta
index b99615d5..729d686c 100644
--- a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures.meta
+++ b/Assets/Shaders/TerrainDetailTextures.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 523107554ee63d44d867317861df92f8
+guid: 671dbe81d1153bf448c88e3ff7dba2c5
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_Color.jpg b/Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_Color.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_Color.jpg
rename to Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_Color.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_Color.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_Color.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_Color.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_Color.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_Displacement.jpg b/Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_Displacement.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_Displacement.jpg
rename to Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_Displacement.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_Displacement.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_Displacement.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_Displacement.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_Displacement.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_NormalGL.jpg b/Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_NormalGL.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_NormalGL.jpg
rename to Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_NormalGL.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_NormalGL.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_NormalGL.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_NormalGL.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_NormalGL.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_Roughness.jpg b/Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_Roughness.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_Roughness.jpg
rename to Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_Roughness.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_Roughness.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_Roughness.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Asphalt020S_2K_Roughness.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Asphalt020S_2K_Roughness.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Color.jpg b/Assets/Shaders/TerrainDetailTextures/Ground003_2K_Color.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Color.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground003_2K_Color.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Color.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground003_2K_Color.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Color.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground003_2K_Color.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Displacement.jpg b/Assets/Shaders/TerrainDetailTextures/Ground003_2K_Displacement.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Displacement.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground003_2K_Displacement.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Displacement.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground003_2K_Displacement.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Displacement.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground003_2K_Displacement.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Normal.jpg b/Assets/Shaders/TerrainDetailTextures/Ground003_2K_Normal.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Normal.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground003_2K_Normal.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Normal.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground003_2K_Normal.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Normal.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground003_2K_Normal.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Roughness.jpg b/Assets/Shaders/TerrainDetailTextures/Ground003_2K_Roughness.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Roughness.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground003_2K_Roughness.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Roughness.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground003_2K_Roughness.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground003_2K_Roughness.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground003_2K_Roughness.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_Color.jpg b/Assets/Shaders/TerrainDetailTextures/Ground019_2K_Color.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_Color.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground019_2K_Color.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_Color.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground019_2K_Color.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_Color.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground019_2K_Color.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_Displacement.jpg b/Assets/Shaders/TerrainDetailTextures/Ground019_2K_Displacement.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_Displacement.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground019_2K_Displacement.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_Displacement.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground019_2K_Displacement.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_Displacement.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground019_2K_Displacement.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_NormalGL.jpg b/Assets/Shaders/TerrainDetailTextures/Ground019_2K_NormalGL.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_NormalGL.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground019_2K_NormalGL.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_NormalGL.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground019_2K_NormalGL.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_NormalGL.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground019_2K_NormalGL.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_Roughness.jpg b/Assets/Shaders/TerrainDetailTextures/Ground019_2K_Roughness.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_Roughness.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground019_2K_Roughness.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_Roughness.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground019_2K_Roughness.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground019_2K_Roughness.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground019_2K_Roughness.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_AmbientOcclusion.jpg b/Assets/Shaders/TerrainDetailTextures/Ground037_2K_AmbientOcclusion.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_AmbientOcclusion.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground037_2K_AmbientOcclusion.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_AmbientOcclusion.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground037_2K_AmbientOcclusion.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_AmbientOcclusion.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground037_2K_AmbientOcclusion.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Color.jpg b/Assets/Shaders/TerrainDetailTextures/Ground037_2K_Color.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Color.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground037_2K_Color.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Color.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground037_2K_Color.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Color.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground037_2K_Color.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Displacement.jpg b/Assets/Shaders/TerrainDetailTextures/Ground037_2K_Displacement.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Displacement.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground037_2K_Displacement.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Displacement.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground037_2K_Displacement.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Displacement.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground037_2K_Displacement.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Normal.jpg b/Assets/Shaders/TerrainDetailTextures/Ground037_2K_Normal.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Normal.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground037_2K_Normal.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Normal.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground037_2K_Normal.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Normal.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground037_2K_Normal.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Roughness.jpg b/Assets/Shaders/TerrainDetailTextures/Ground037_2K_Roughness.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Roughness.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground037_2K_Roughness.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Roughness.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground037_2K_Roughness.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground037_2K_Roughness.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground037_2K_Roughness.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_Color.jpg b/Assets/Shaders/TerrainDetailTextures/Ground048_2K_Color.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_Color.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground048_2K_Color.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_Color.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground048_2K_Color.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_Color.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground048_2K_Color.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_Displacement.jpg b/Assets/Shaders/TerrainDetailTextures/Ground048_2K_Displacement.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_Displacement.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground048_2K_Displacement.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_Displacement.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground048_2K_Displacement.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_Displacement.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground048_2K_Displacement.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_NormalGL.jpg b/Assets/Shaders/TerrainDetailTextures/Ground048_2K_NormalGL.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_NormalGL.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground048_2K_NormalGL.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_NormalGL.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground048_2K_NormalGL.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_NormalGL.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground048_2K_NormalGL.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_Roughness.jpg b/Assets/Shaders/TerrainDetailTextures/Ground048_2K_Roughness.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_Roughness.jpg
rename to Assets/Shaders/TerrainDetailTextures/Ground048_2K_Roughness.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_Roughness.jpg.meta b/Assets/Shaders/TerrainDetailTextures/Ground048_2K_Roughness.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ground048_2K_Roughness.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/Ground048_2K_Roughness.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_AmbientOcclusion.jpg b/Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_AmbientOcclusion.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_AmbientOcclusion.jpg
rename to Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_AmbientOcclusion.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_AmbientOcclusion.jpg.meta b/Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_AmbientOcclusion.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_AmbientOcclusion.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_AmbientOcclusion.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_Color.jpg b/Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_Color.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_Color.jpg
rename to Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_Color.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_Color.jpg.meta b/Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_Color.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_Color.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_Color.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_Displacement.jpg b/Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_Displacement.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_Displacement.jpg
rename to Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_Displacement.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_Displacement.jpg.meta b/Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_Displacement.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_Displacement.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_Displacement.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_NormalGL.jpg b/Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_NormalGL.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_NormalGL.jpg
rename to Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_NormalGL.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_NormalGL.jpg.meta b/Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_NormalGL.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_NormalGL.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_NormalGL.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_Roughness.jpg b/Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_Roughness.jpg
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_Roughness.jpg
rename to Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_Roughness.jpg
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_Roughness.jpg.meta b/Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_Roughness.jpg.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/RoofingTiles008_2K_Roughness.jpg.meta
rename to Assets/Shaders/TerrainDetailTextures/RoofingTiles008_2K_Roughness.jpg.meta
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/TerrainMaterial.mat b/Assets/Shaders/TerrainDetailTextures/TerrainMaterial.mat
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/TerrainMaterial.mat
rename to Assets/Shaders/TerrainDetailTextures/TerrainMaterial.mat
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/TerrainMaterial.mat.meta b/Assets/Shaders/TerrainDetailTextures/TerrainMaterial.mat.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Assets/Textures/Terrain/TerrainMaterial.mat.meta
rename to Assets/Shaders/TerrainDetailTextures/TerrainMaterial.mat.meta
diff --git a/Assets/Shaders/TerrainDetailTextures/TerrainShader_NormalMap_Deferred_TextureArrays.shader b/Assets/Shaders/TerrainDetailTextures/TerrainShader_NormalMap_Deferred_TextureArrays.shader
new file mode 100644
index 00000000..2cb4d920
--- /dev/null
+++ b/Assets/Shaders/TerrainDetailTextures/TerrainShader_NormalMap_Deferred_TextureArrays.shader
@@ -0,0 +1,325 @@
+Shader "Custom/TerrainShader_NormalMap_Deferred_TextureArrays"
+{
+	Properties
+	{
+		_SplatTex("Splatmap", 2D) = "white" {}
+		_SplatMapDimensions("Splatmap Dimensions", Vector) = (512, 512, 0, 0)
+		_CoarseTexture("Coarse texture", 2D) = "white" {}
+		_Textures("Textures", 2DArray) = "" {}
+		_NormalMaps("Normal maps", 2DArray) = "" {}
+		_HeightMaps("Height maps", 2DArray) = "" {}
+		_RoughnessMaps("Roughness maps", 2DArray) = "" {}
+		_Smoothness("Smoothness", Range(0.0, 1.0)) = 1
+		_SplatVisualization("Splat visualization", Range(0.0, 1.0)) = 1
+
+		_DetailTextureFadeStart("Detail texture fade start distance", Range(0.0, 10000.0)) = 1
+		_DetailTextureFadeZoneLength("Detail texture fade zone length", Range(0.0, 100.0)) = 1
+	}
+
+	SubShader
+	{
+		Pass
+		{
+			Tags{ "LightMode" = "Deferred" }
+			CGPROGRAM
+
+			#pragma vertex VS
+			#pragma fragment FS
+
+			#pragma exclude_renderers nomrt
+			#pragma require 2darray
+
+			#pragma multi_compile_prepassfinal
+
+			#define DEFERRED_PASS
+
+			#include "UnityStandardUtils.cginc"
+			#include "UnityPBSLighting.cginc"
+
+			sampler2D _SplatTex;
+			sampler2D _CoarseTexture;
+			float4 _SplatTex_ST;
+			float _SplatVisualization;
+			float _DetailTextureFadeStart;
+			float _DetailTextureFadeZoneLength;
+
+			float2 _SplatMapDimensions;
+
+			UNITY_DECLARE_TEX2DARRAY(_Textures);
+			UNITY_DECLARE_TEX2DARRAY(_NormalMaps);
+			UNITY_DECLARE_TEX2DARRAY(_HeightMaps);
+			UNITY_DECLARE_TEX2DARRAY(_RoughnessMaps);
+
+			float _Smoothness;
+
+			struct VertexData
+			{
+				float4 position : POSITION;
+				float2 uv : TEXCOORD0;
+				float4 normal : NORMAL;
+				float4 tangent : TANGENT;
+			};
+
+			struct Interpolators
+			{
+				float4 position : SV_POSITION;
+				float2 uv : TEXCOORD0;
+				float2 uvSplat : TEXCOORD1;
+				float3 normal : TEXCOORD2;
+				float4 tangent : TEXCOORD3;
+				float4 worldPos : TEXCOORD4;
+			};
+
+			struct FragmentResult
+			{
+				float4 albedo : SV_Target0;
+				float4 specular : SV_Target1;
+				float4 normal : SV_Target2;
+				float4 ELLR : SV_Target3;
+			};
+
+			Interpolators VS(VertexData v)
+			{
+				Interpolators i;
+
+				i.position = UnityObjectToClipPos(v.position);
+				i.uv = TRANSFORM_TEX(v.uv, _SplatTex);
+				i.uv *= 2;
+				i.uvSplat = v.uv;
+
+				i.normal = UnityObjectToWorldNormal(v.normal);
+				i.tangent = float4(UnityObjectToWorldDir(v.tangent), v.tangent.w);
+
+				i.worldPos = mul(unity_ObjectToWorld, v.position);
+
+				return i;
+			}
+
+			void SampleSplatMap(uint input, float2 uvCoord, float4 fallbackAlbedo, out float4 albedo, out float4 normal, out float height, out float roughness)
+			{
+				bool undefined = input == 1;
+				bool building = input == 6;
+				bool manmadeObject = input == 8;
+				bool grass = input == 21;
+				bool grassBarren = input == 22;
+				bool vegetation = input == 40;
+				bool vegetationOverRoad = input == 47;
+				bool vegetationOverBuilding = input == 48;
+				bool vegetationOverBridge = input == 49;
+				bool waterUnspecified = input == 60;
+				bool waterSwimmingpool = input == 65;
+				bool manmadeSurface = input == 80;
+				bool manmadeSurfacePavedRoad = input == 81;
+				bool manmadeSurfaceDirtRoad = input == 83;
+				bool manmadeSurfaceBridge = input == 86;
+				bool manmadeSurfaceRailBridge = input == 89;
+				bool manmadeSurfaceRail = input == 90;
+				bool manmadeSurfaceRunway = input == 92;
+
+				float textureIndex = (
+					undefined +
+					building * 2 +
+					manmadeObject * 3 +
+					grass * 4 +
+					grassBarren * 5 +
+					vegetation * 6 +
+					vegetationOverRoad * 7 +
+					vegetationOverBuilding * 8 +
+					vegetationOverBridge * 9 +
+					waterUnspecified * 10 +
+					waterSwimmingpool * 11 +
+					manmadeSurface * 12 +
+					manmadeSurfacePavedRoad * 13 +
+					manmadeSurfaceDirtRoad * 14 +
+					manmadeSurfaceBridge * 15 +
+					manmadeSurfaceRailBridge * 16 +
+					manmadeSurfaceRail * 17 +
+					manmadeSurfaceRunway * 18
+				) - 1;
+
+				float3 defaultAlbedo = fallbackAlbedo; //Magenta
+				float4 defaultNormal = float4(1, 0.5, 1, 0.5);
+				float defaultHeight = 0.5;
+				float defaultRoughness = 0;
+
+				bool validSample = (textureIndex != -1);
+
+				albedo = float4(
+					UNITY_SAMPLE_TEX2DARRAY(_Textures, float3(uvCoord, textureIndex)).xyz * validSample +
+					defaultAlbedo * (1 - validSample),
+					1
+				);
+
+				float4 norm1 = UNITY_SAMPLE_TEX2DARRAY(_NormalMaps, float3(uvCoord, textureIndex));
+				float4 norm2 = UNITY_SAMPLE_TEX2DARRAY(_NormalMaps, float3(uvCoord * 2, textureIndex));
+				float4 norm3 = UNITY_SAMPLE_TEX2DARRAY(_NormalMaps, float3(uvCoord * 4, textureIndex));
+
+				float4 normFinal = normalize(norm1 + norm2 * 2 + norm3 * 4);
+
+				normal = normFinal * validSample +
+					defaultNormal * (1 - validSample);
+
+				height = UNITY_SAMPLE_TEX2DARRAY(_HeightMaps, float3(uvCoord, textureIndex)) * validSample +
+					defaultHeight * (1 - validSample);
+
+				roughness = UNITY_SAMPLE_TEX2DARRAY(_RoughnessMaps, float3(uvCoord, textureIndex)) * validSample +
+					defaultRoughness * (1 - validSample);
+			}
+
+			void InterpolateSamplesHeight(
+				float2 t,
+				float4 texs[4],
+				float4 norms[4],
+				float heights[4],
+				float roughnesses[4],
+				out float4 albedo,
+				out float4 normal,
+				out float roughness)
+			{
+				float4 scalarIntermediate1 = lerp(float4(1, 0, 0, 0), float4(0, 1, 0, 0), t.x);
+				float4 scalarIntermediate2 = lerp(float4(0, 0, 1, 0), float4(0, 0, 0, 1), t.x);
+
+				float4 scalars = lerp(scalarIntermediate1, scalarIntermediate2, t.y);
+				float4 height = float4(heights[0], heights[1], heights[2], heights[3]) * scalars;
+
+				bool onDiagonal = (abs(scalars.r - scalars.a) < 0.01) || (abs(scalars.g - scalars.b) < 0.01);
+				bool onEdge = (abs(t.x - 0.5) < 0.01) || (abs(t.y - 0.5) < 0.01);
+
+				float4 strengths = float4(
+					(height.y <= height.x) && (height.z <= height.x) && (height.w <= height.x),
+					(height.x <= height.y) && (height.z <= height.y) && (height.w <= height.y),
+					(height.x <= height.z) && (height.y <= height.z) && (height.w <= height.z),
+					(height.x <= height.w) && (height.y <= height.w) && (height.z <= height.w)
+				);
+
+				strengths = length(strengths) == 0 ? float4(0, 0, 0, 1) : strengths;
+
+				albedo = texs[0] * strengths.x + texs[1] * strengths.y + texs[2] * strengths.z + texs[3] * strengths.w;// +float4(0, 1, 0, 1) * onDiagonal + float4(t.x * t.y, 0, 0, 1) * onEdge;
+				normal = norms[0] * strengths.x + norms[1] * strengths.y + norms[2] * strengths.z + norms[3] * strengths.w;
+				height = heights[0] * strengths.x + heights[1] * strengths.y + heights[2] * strengths.z + heights[3] * strengths.w;
+				roughness = roughnesses[0] * strengths.x + roughnesses[1] * strengths.y + roughnesses[2] * strengths.z + roughnesses[3] * strengths.w;
+			}
+
+			float3 TransformNormal(Interpolators i, float4 normal)
+			{
+				float3 faceNormal = normalize(i.normal);
+				float3 faceTangent = normalize(i.tangent.xyz);
+				float3 faceBinormal = normalize(cross(faceNormal, faceTangent) * (i.tangent.w * unity_WorldTransformParams.w));
+
+				float3 TangentSpaceNormal = UnpackNormal(normal);
+
+				return faceTangent * TangentSpaceNormal.x + faceBinormal * TangentSpaceNormal.y + faceNormal * TangentSpaceNormal.z;
+			}
+
+			FragmentResult FS(Interpolators i)
+			{
+				float2 texelCoordinate = _SplatMapDimensions.xy * i.uvSplat.xy;
+				float2 texelFraction = frac(texelCoordinate);
+				float2 texelCenterOffset = texelFraction - 0.5;
+
+				float2 texelSize = float2(1 / _SplatMapDimensions.x, 1 / _SplatMapDimensions.y);
+
+				float2 minCoord = float2(
+					i.uvSplat.x + (
+						texelCenterOffset.x < 0 ?
+							-texelSize.x :
+							0
+					),
+					i.uvSplat.y + (
+						texelCenterOffset.y < 0 ?
+							-texelSize.y :
+							0
+					)
+				);
+
+				float splat1 = tex2D(_SplatTex, minCoord).r * 255;
+				float splat2 = tex2D(_SplatTex, minCoord + float2(texelSize.x, 0)).r * 255;
+				float splat3 = tex2D(_SplatTex, minCoord + float2(0, texelSize.y)).r * 255;
+				float splat4 = tex2D(_SplatTex, minCoord + float2(texelSize.x, texelSize.y)).r * 255;
+
+				float4 texs[4];
+				float4 norms[4];
+				float heights[4];
+				float roughnesses[4];
+
+				float4 coarseColor = tex2D(_CoarseTexture, i.uvSplat);
+
+				SampleSplatMap((uint)splat1, i.uv, coarseColor, texs[0], norms[0], heights[0], roughnesses[0]);
+				SampleSplatMap((uint)splat2, i.uv, coarseColor, texs[1], norms[1], heights[1], roughnesses[1]);
+				SampleSplatMap((uint)splat3, i.uv, coarseColor, texs[2], norms[2], heights[2], roughnesses[2]);
+				SampleSplatMap((uint)splat4, i.uv, coarseColor, texs[3], norms[3], heights[3], roughnesses[3]);
+
+				float2 t = frac(texelCoordinate - 0.5);
+
+				float4 albedo;
+				float4 normal;
+				float roughnessFinal;
+
+				InterpolateSamplesHeight(t, texs, norms, heights, roughnesses, albedo, normal, roughnessFinal);
+
+				//Tangentspace -> Worldspace
+				float3 worldSpaceNormal = TransformNormal(i, normal);
+
+				float3 specularTint = _LightColor0.rgb;
+
+				FragmentResult result = (FragmentResult)0;
+
+				float smoothnessFinal = _Smoothness * (1 - roughnessFinal);
+
+				float pixelDistance = distance(i.worldPos, _WorldSpaceCameraPos);
+
+				float detailInclusion = 1 - saturate(pixelDistance * (1 / _DetailTextureFadeZoneLength) - (_DetailTextureFadeStart / _DetailTextureFadeZoneLength));;
+
+				result.albedo = coarseColor;//(float4(albedo.rgb, 0) * detailInclusion + coarseColor * _SplatVisualization) / (1 + detailInclusion);// 
+				result.specular = float4(specularTint * smoothnessFinal, smoothnessFinal);
+
+				#ifdef UNITY_COMPILER_HLSL
+					SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0;
+				#else
+					SurfaceOutputStandardSpecular o;
+				#endif
+
+				// Setup lighting environment
+				UnityGI gi;
+				UNITY_INITIALIZE_OUTPUT(UnityGI, gi);
+				gi.indirect.diffuse = 0;
+				gi.indirect.specular = 0;
+				gi.light.color = 0;
+				gi.light.dir = fixed3(0, 1, 0);
+
+				fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
+
+				// Call GI (lightmaps/SH/reflections) lighting function
+				UnityGIInput giInput;
+				UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);
+				giInput.light = gi.light;
+				giInput.worldPos = i.worldPos;
+				giInput.worldViewDir = worldViewDir;
+				giInput.atten = 1;
+				giInput.lightmapUV = 0.0;
+
+				o.Albedo = result.albedo.rgb;
+				o.Emission = 0.0f;
+				o.Alpha = result.albedo.a;
+				o.Occlusion = 1.0f;
+				o.Smoothness = 0.0f;
+				o.Specular = result.specular;
+				//o.Normal = n;
+
+				o.Normal = worldSpaceNormal; // This is used only for ambient occlusion
+
+				// Standard specular global illumination
+				LightingStandardSpecular_GI(o, giInput, gi);
+
+				result.ELLR = LightingStandardSpecular_Deferred(o, worldViewDir, gi, result.albedo, result.specular, result.normal);
+				#ifndef UNITY_HDR_ON
+					result.ELLR.rgb = exp2(-result.ELLR.rgb);
+				#endif
+
+				return result;
+			}
+
+			ENDCG
+		}
+	}
+}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/EnhancedTerrain.shader.meta b/Assets/Shaders/TerrainDetailTextures/TerrainShader_NormalMap_Deferred_TextureArrays.shader.meta
similarity index 100%
rename from com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/EnhancedTerrain.shader.meta
rename to Assets/Shaders/TerrainDetailTextures/TerrainShader_NormalMap_Deferred_TextureArrays.shader.meta
diff --git a/Assets/Shaders/TerrainGen.cs b/Assets/Shaders/TerrainGen.cs
new file mode 100644
index 00000000..d780b898
--- /dev/null
+++ b/Assets/Shaders/TerrainGen.cs
@@ -0,0 +1,122 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using UnityEngine;
+
+namespace Saab.Unity.MapAnalyzer
+{
+    [Serializable]
+    public struct TerrainTextures
+    {
+        public Texture2D Diffuse;
+        public Texture2D Normal;
+        public float Bump;
+    }
+
+    public class TerrainGen : MonoBehaviour
+    {
+        public Material TerrainMaterial;
+        public TerrainTextures[] DetailTextures;
+        // Start is called before the first frame update
+
+        void Awake()
+        {
+
+        #if UNITY_ANDROID
+            var format = TextureFormat.ARGB32;
+            Debug.Log("Tree Use ETC2");
+        #else
+            var format = TextureFormat.DXT5;
+        #endif
+
+            var textures = Create2DArray(DetailTextures, format);
+            var normals = Create2DArray(DetailTextures, format, true);
+            TerrainMaterial.SetTexture("_DetailTexs", textures);
+            TerrainMaterial.SetTexture("_NormalTexs", normals);
+
+            float[] BumpDetail = new float[10];
+
+            for (int i = 0; i < 10; i++)
+            {
+                var value = 0f;
+
+                if(DetailTextures.Count() > i)
+                {
+                    value = DetailTextures[i].Bump;
+                }
+
+                BumpDetail[i] = value;
+            }
+
+            TerrainMaterial.SetFloatArray("BumpDetail", BumpDetail);
+        }
+
+        private static uint NextPowerOfTwo(uint v)
+        {
+            v--;
+            v |= v >> 1;
+            v |= v >> 2;
+            v |= v >> 4;
+            v |= v >> 8;
+            v |= v >> 16;
+
+            return v + 1;
+        }
+
+        public static Texture2DArray Create2DArray(TerrainTextures[] texture, TextureFormat targetFormat, bool normal = false)
+        {
+            var textureCount = texture.Length;
+            var textureResolution = 0;
+
+            if (normal)
+                textureResolution = Math.Max(texture.Max(item => item.Normal.width), texture.Max(item => item.Normal.height));
+            else
+                textureResolution = Math.Max(texture.Max(item => item.Diffuse.width), texture.Max(item => item.Diffuse.height));
+
+
+            textureResolution = (int)NextPowerOfTwo((uint)textureResolution);
+
+            Texture2DArray textureArray;
+
+            textureArray = new Texture2DArray(textureResolution, textureResolution, textureCount, targetFormat, true)
+            {
+                wrapMode = TextureWrapMode.Clamp
+            };
+
+            RenderTexture temporaryRenderTexture = new RenderTexture(textureResolution, textureResolution, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default)
+            {
+                useMipMap = true,
+                antiAliasing = 1
+            };
+
+            for (int i = 0; i < textureCount; i++)
+            {
+                if (normal)
+                    Graphics.Blit(texture[i].Normal, temporaryRenderTexture);
+                else
+                    Graphics.Blit(texture[i].Diffuse, temporaryRenderTexture);
+
+                RenderTexture.active = temporaryRenderTexture;
+
+                //Debug.LogFormat(LogType.Error, LogOption.NoStacktrace, null, "creating 2d texture: {0} x {0}", textureResolution);
+                Texture2D temporaryTexture = new Texture2D(textureResolution, textureResolution, TextureFormat.ARGB32, true);
+
+                temporaryTexture.ReadPixels(new Rect(0, 0, temporaryTexture.width, temporaryTexture.height), 0, 0);
+                RenderTexture.active = null;
+                temporaryTexture.Apply(true);
+                temporaryTexture.Compress(true);
+
+                //TexToFile(temporaryGrassTexture, Application.dataPath + "/../grassTextureArraySaved_" + i + ".png");
+
+                Graphics.CopyTexture(temporaryTexture, 0, textureArray, i);
+                Destroy(temporaryTexture);
+            }
+            textureArray.Apply(false, true);
+
+            Destroy(temporaryRenderTexture);
+
+            return textureArray;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Shaders/TerrainGen.cs.meta b/Assets/Shaders/TerrainGen.cs.meta
new file mode 100644
index 00000000..fecfc474
--- /dev/null
+++ b/Assets/Shaders/TerrainGen.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 02af228d6a5eea34e960904a51da9591
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/TerrainPass.cginc b/Assets/Shaders/TerrainPass.cginc
new file mode 100644
index 00000000..5f4bf16b
--- /dev/null
+++ b/Assets/Shaders/TerrainPass.cginc
@@ -0,0 +1,283 @@
+
+#if !defined(MY_LIGHTING_INCLUDED)
+#define MY_LIGHTING_INCLUDED
+
+	#include "UnityPBSLighting.cginc"
+	#include "AutoLight.cginc"
+
+	struct appdata
+	{
+		float4 vertex : POSITION;
+		float3 normal : NORMAL;
+		float4 tangent : TANGENT;
+		float2 uv : TEXCOORD0;
+	};
+
+	struct v2f
+	{
+		float4 pos : SV_POSITION;
+		float2 uv : TEXCOORD0;
+		float4 worldPos : TEXCOORD1;
+		float3 normal : TEXCOORD2;
+
+		#if defined(BINORMAL_PER_FRAGMENT)
+			float4 tangent : TEXCOORD3;
+		#else
+			float3 tangent : TEXCOORD3;
+			float3 binormal : TEXCOORD4;
+		#endif
+
+		UNITY_SHADOW_COORDS(5)
+
+		#if defined(VERTEXLIGHT_ON)
+			float3 vertexLightColor : TEXCOORD6;
+		#endif
+	};
+
+	void ComputeVertexLightColor(inout v2f i)
+	{
+		#if defined(VERTEXLIGHT_ON)
+			i.vertexLightColor = Shade4PointLights
+			(
+				unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,
+				unity_LightColor[0].rgb, unity_LightColor[1].rgb,
+				unity_LightColor[2].rgb, unity_LightColor[3].rgb,
+				unity_4LightAtten0, i.worldPos, i.normal
+			);
+		#endif
+	}
+
+	float3 CreateBinormal(float3 normal, float3 tangent, float binormalSign) 
+	{
+		return cross(normal, tangent.xyz) * (binormalSign * unity_WorldTransformParams.w);
+	}
+
+	v2f vert(appdata v)
+	{
+		v2f o;
+		UNITY_INITIALIZE_OUTPUT(v2f, o);
+		o.uv = v.uv;
+
+		o.pos = UnityObjectToClipPos(v.vertex);
+		o.worldPos = mul(unity_ObjectToWorld, v.vertex);
+
+		o.normal = UnityObjectToWorldNormal(v.normal);
+
+		#if defined(BINORMAL_PER_FRAGMENT)
+			o.tangent = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
+		#else
+			o.tangent = UnityObjectToWorldDir(v.tangent.xyz);
+			o.binormal = CreateBinormal(o.normal, o.tangent, v.tangent.w);
+		#endif
+
+		UNITY_TRANSFER_SHADOW(o, v.uv);
+		ComputeVertexLightColor(o);
+		return o;
+	}
+
+	sampler2D _MainTex;
+	sampler2D _PlacementTex;
+	sampler2D _NormalMap;
+
+	UNITY_DECLARE_TEX2DARRAY(_DetailTexs);
+	UNITY_DECLARE_TEX2DARRAY(_NormalTexs);
+
+	float BumpDetail[10];
+
+	float4 _SpecularTint;
+	float _Smoothness;
+	float _Metallic;
+	float _BumpScale;
+	float _FadeAmount;
+	float _Fade;
+	float2 _Tiling;
+	float2 _DefaultTiling;
+
+	float FadeAmount(float4 worldPos)
+	{
+		float dist = distance(worldPos, _WorldSpaceCameraPos);
+		float fade = 0;
+
+		if (dist > _Fade && dist < (_Fade + _FadeAmount))
+			fade = ((dist - _Fade) / _FadeAmount);
+		else if (dist > (_Fade + _FadeAmount))
+			fade = 1;
+
+		return fade;
+	}
+
+	void InitializeFragmentNormal(inout v2f i, float3 normal)
+	{
+		float3 tangentSpaceNormal = normal;
+
+		//float3 binormal = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w);
+
+		#if defined(BINORMAL_PER_FRAGMENT)
+			float3 binormal = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w);
+			//float3 binormal = CreateBinormal(i.normal, i.tangent.xyz, i.tangent.w);
+		#else
+			float3 binormal = i.binormal;
+		#endif
+
+		i.normal = normalize
+		(
+			tangentSpaceNormal.x * i.tangent +
+			tangentSpaceNormal.y * binormal +
+			tangentSpaceNormal.z * i.normal
+		);
+	}
+
+	float4 DetailTexturesMix(v2f i, out float3 normal, out bool undefined)
+	{
+		undefined = false;
+		fixed4 placement = tex2D(_PlacementTex, i.uv);
+
+		// *************************************************************** //
+		uint value = (uint)(placement.x * 255) | (uint)(placement.y * 255) << 8 | (uint)(placement.z * 255) << 16;
+
+		bool Grassland = (value >> 0) & 1 || (value >> 1) & 1;
+		bool Buildings = (value >> 2) & 1 || (value >> 3) & 1;
+		bool vegetation = (value >> 4) & 1 || (value >> 5) & 1;
+		bool Water = (value >> 6) & 1 || (value >> 7) & 1;
+
+		bool DirtRoad = (value >> 8) & 1 || (value >> 9) & 1;
+		bool Barren = (value >> 10) & 1 || (value >> 11) & 1;
+		bool ManMadeGround = (value >> 12) & 1 || (value >> 13) & 1;
+		bool AsphaltRoad = (value >> 14) & 1 || (value >> 15) & 1;
+
+		bool Railway = (value >> 16) & 1 || (value >> 17) & 1;
+		bool Runway = (value >> 18) & 1 || (value >> 19) & 1;
+		bool Crops = (value >> 20) & 1 || (value >> 21) & 1;
+
+		// *************************************************************** //
+
+		float2 uv = i.uv * _Tiling;
+
+		// *************************************************************** //
+
+		// Get all indexces to mix
+		normal = float4(1, 1, 1, 1);
+		float totalNormal = 0;
+		float maxNormal = -1;
+		int returnindex = 0;
+		float3 defaultNormal = tex2D(_NormalMap, i.uv * _DefaultTiling).xyz;
+		float3 terrainNormal = defaultNormal;
+
+		for (uint x = 0; x <= 20; x += 2)
+		{
+			if ((value >> x) & 1 || (value >> x + 1) & 1)
+			{
+				uint index = x / 2;
+				fixed4 norm = UNITY_SAMPLE_TEX2DARRAY(_NormalTexs, float3(uv % 1, index));
+				float normLength = dot(norm, terrainNormal);
+
+				if (maxNormal < normLength)
+				{
+					maxNormal = normLength;
+					returnindex = index;
+				}
+
+				totalNormal += normLength;
+			}
+		}
+
+		if (totalNormal == 0)
+			undefined = true;
+
+		float fade = FadeAmount(i.worldPos);
+
+		float4 returnNormal = float4(defaultNormal.xyz, 1);
+		normal = UnpackScaleNormal(returnNormal, _BumpScale);
+		float4 returncolor = UNITY_SAMPLE_TEX2DARRAY(_DetailTexs, float3(uv % 1, returnindex));
+
+		if (!undefined)
+		{
+			float4 normalMix = UNITY_SAMPLE_TEX2DARRAY(_NormalTexs, float3(uv % 1, returnindex));
+			float bump = BumpDetail[returnindex];
+			normalMix.xyz = UnpackScaleNormal(normalMix, bump * (1 - fade));
+
+			float3 blend = BlendNormals(normal.xyz, normalMix.xyz);
+
+		#ifdef BLEND
+			normal = normalMix.xyz;
+		#else
+			normal = blend;
+		#endif
+		}
+
+		return returncolor;
+	}
+
+	UnityIndirect CreateIndirectLight(v2f i, float3 viewDir)
+	{
+		UnityIndirect indirectLight;
+		indirectLight.diffuse = 0;
+		indirectLight.specular = 0;
+
+		#if defined(VERTEXLIGHT_ON)
+			indirectLight.diffuse = i.vertexLightColor;
+		#endif
+
+		#if defined(FORWARD_BASE_PASS)
+			indirectLight.diffuse += max(0, ShadeSH9(float4(i.normal, 1)));
+			float3 reflectionDir = reflect(-viewDir, i.normal);
+			float4 envSample = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, reflectionDir);
+			indirectLight.specular = DecodeHDR(envSample, unity_SpecCube0_HDR);
+		#endif
+
+		return indirectLight;
+	}
+
+	UnityLight CreateLight(v2f i)
+	{
+		UnityLight light;
+
+		#if defined(POINT) || defined(POINT_COOKIE) || defined(SPOT)
+			light.dir = normalize(_WorldSpaceLightPos0.xyz - i.worldPos);
+		#else
+			light.dir = _WorldSpaceLightPos0.xyz;
+		#endif
+
+		UNITY_LIGHT_ATTENUATION(attenuation, i, i.worldPos.xyz);
+
+		light.color = _LightColor0.rgb * attenuation;
+		light.ndotl = DotClamped(i.normal, light.dir);
+
+		return light;
+	}
+
+	fixed4 frag(v2f i) : SV_Target
+	{
+		float3 normal;
+		bool undefined;
+		fixed4 detail = DetailTexturesMix(i, normal, undefined);
+
+		// *************************************************************** //
+
+		fixed4 col = tex2D(_MainTex, i.uv);
+		float fade = FadeAmount(i.worldPos);
+		fixed4 result = col;
+
+		if (!undefined)
+		{
+			result = (col * fade + detail * (1 - fade));
+		}
+
+		InitializeFragmentNormal(i, normal);
+
+		// *************************************************************** //
+
+		float3 viewDir = normalize(_WorldSpaceCameraPos - i.worldPos);
+
+		float3 specularTint;
+		float oneMinusReflectivity;
+		float3 albedo = DiffuseAndSpecularFromMetallic(result.rgb, _Metallic, specularTint, oneMinusReflectivity);
+
+		return UNITY_BRDF_PBS(
+			albedo, specularTint,
+			oneMinusReflectivity, _Smoothness,
+			i.normal, viewDir,
+			CreateLight(i), CreateIndirectLight(i, viewDir)
+		);
+	}
+#endif
\ No newline at end of file
diff --git a/Assets/Shaders/TerrainPass.cginc.meta b/Assets/Shaders/TerrainPass.cginc.meta
new file mode 100644
index 00000000..4d787c34
--- /dev/null
+++ b/Assets/Shaders/TerrainPass.cginc.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: fe9558af6f4449242ab598efa936821f
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/TerrainUnlit.shader b/Assets/Shaders/TerrainUnlit.shader
new file mode 100644
index 00000000..31fa251d
--- /dev/null
+++ b/Assets/Shaders/TerrainUnlit.shader
@@ -0,0 +1,145 @@
+﻿Shader "Unlit/TerrainUnlit"
+{
+    Properties
+    {
+        _MainTex("First Texture", 2D) = "white" {}
+        _SecondTex("Second Texture", 2D) = "white" {}
+        _ThirdTex("Third Texture", 2D) = "white" {}
+        _FadeMain("Fade Main Value", Range(0, 1)) = 0
+        _FadeSecond("Fade Second  Value", Range(0, 1)) = 0
+        _FadeThird("Fade Third Value", Range(0, 1)) = 0
+        _Alpha("Alpha Value", Range(0, 1)) = 1
+    }
+
+    SubShader
+    {
+        Tags { "Queue"="AlphaTest+100" "RenderType"="Transparent" }
+        LOD 200
+
+        Blend SrcAlpha OneMinusSrcAlpha        
+
+        // Front Pass
+        Pass
+        {
+            Cull Front
+
+            CGPROGRAM
+            #pragma vertex vert
+            #pragma fragment frag
+        // make fog work
+        #pragma multi_compile_fog
+
+        #include "UnityCG.cginc"
+
+        struct appdata
+        {
+            float4 vertex : POSITION;
+            float2 uv : TEXCOORD0;
+        };
+
+        struct v2f
+        {
+            float2 uv : TEXCOORD0;
+            UNITY_FOG_COORDS(1)
+            float4 vertex : SV_POSITION;
+        };
+
+        sampler2D _MainTex;
+        sampler2D _SecondTex;
+        sampler2D _ThirdTex;
+
+        float _FadeMain;
+        float _FadeSecond;
+        float _FadeThird;
+
+        float _Alpha;
+
+        float4 _MainTex_ST;
+
+        v2f vert(appdata v)
+        {
+            v2f o;
+            o.vertex = UnityObjectToClipPos(v.vertex);
+            o.uv = TRANSFORM_TEX(v.uv, _MainTex);
+            UNITY_TRANSFER_FOG(o,o.vertex);
+            return o;
+        }
+
+        fixed4 frag(v2f i) : SV_Target
+        {
+            // sample the texture
+            fixed4 col01 = tex2D(_MainTex, i.uv) * _FadeMain;
+            fixed4 col02 = tex2D(_SecondTex, i.uv) * _FadeSecond;
+            fixed4 col03 = tex2D(_ThirdTex, i.uv) * _FadeThird;
+            // apply fog
+            fixed4 col = col01 + col02 + col03;
+            UNITY_APPLY_FOG(i.fogCoord, col);
+            return float4(col.rgb, _Alpha);
+        }
+        ENDCG
+    }
+
+           
+        // Back Pass
+        Pass
+        {
+            ZWrite Off
+            Cull Back
+
+            CGPROGRAM
+            #pragma vertex vert
+            #pragma fragment frag
+            // make fog work
+            #pragma multi_compile_fog
+
+            #include "UnityCG.cginc"
+
+            struct appdata
+            {
+                float4 vertex : POSITION;
+                float2 uv : TEXCOORD0;
+            };
+
+            struct v2f
+            {
+                float2 uv : TEXCOORD0;
+                UNITY_FOG_COORDS(1)
+                float4 vertex : SV_POSITION;
+            };
+
+            sampler2D _MainTex;
+            sampler2D _SecondTex;
+            sampler2D _ThirdTex;
+
+            float _FadeMain;
+            float _FadeSecond;
+            float _FadeThird;
+
+            float _Alpha;
+
+            float4 _MainTex_ST;
+
+            v2f vert(appdata v)
+            {
+                v2f o;
+                o.vertex = UnityObjectToClipPos(v.vertex);
+                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
+                UNITY_TRANSFER_FOG(o,o.vertex);
+                return o;
+            }
+
+            fixed4 frag(v2f i) : SV_Target
+            {
+                // sample the texture
+                fixed4 col01 = tex2D(_MainTex, i.uv) * _FadeMain;
+                fixed4 col02 = tex2D(_SecondTex, i.uv) * _FadeSecond;
+                fixed4 col03 = tex2D(_ThirdTex, i.uv) * _FadeThird;
+                // apply fog
+                fixed4 col = col01 + col02 + col03;
+                UNITY_APPLY_FOG(i.fogCoord, col);
+                return float4(col.rgb, _Alpha);
+            }
+            ENDCG
+        }
+    }
+}
diff --git a/Assets/Shaders/TerrainUnlit.shader.meta b/Assets/Shaders/TerrainUnlit.shader.meta
new file mode 100644
index 00000000..cf209f77
--- /dev/null
+++ b/Assets/Shaders/TerrainUnlit.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: d6c646a15e380864da242b74090be82c
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/DownsampleDepth.mat b/Assets/Shaders/Unlit_GreyScale.mat
similarity index 66%
rename from com.saab.map-streamer/Runtime/Shaders/Foliage/DownsampleDepth.mat
rename to Assets/Shaders/Unlit_GreyScale.mat
index e49cf8e1..a2bffa5a 100644
--- a/com.saab.map-streamer/Runtime/Shaders/Foliage/DownsampleDepth.mat
+++ b/Assets/Shaders/Unlit_GreyScale.mat
@@ -2,19 +2,18 @@
 %TAG !u! tag:unity3d.com,2011:
 --- !u!21 &2100000
 Material:
-  serializedVersion: 8
+  serializedVersion: 6
   m_ObjectHideFlags: 0
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: DownsampleDepth
-  m_Shader: {fileID: 4800000, guid: f59a3846cb375b54c95e5d0a051d31fc, type: 3}
-  m_ValidKeywords: []
-  m_InvalidKeywords: []
+  m_Name: Unlit_GreyScale
+  m_Shader: {fileID: 4800000, guid: ae81ad50db313904b9c556fc43236957, type: 3}
+  m_ShaderKeywords: 
   m_LightmapFlags: 4
   m_EnableInstancingVariants: 0
   m_DoubleSidedGI: 0
-  m_CustomRenderQueue: -1
+  m_CustomRenderQueue: 3000
   stringTagMap: {}
   disabledShaderPasses: []
   m_SavedProperties:
@@ -24,7 +23,6 @@ Material:
         m_Texture: {fileID: 0}
         m_Scale: {x: 1, y: 1}
         m_Offset: {x: 0, y: 0}
-    m_Ints: []
-    m_Floats: []
+    m_Floats:
+    - _EffectAmount: 1
     m_Colors: []
-  m_BuildTextureStacks: []
diff --git a/com.saab.map-streamer/Runtime/Assets/DefaultTerrainMaterial.mat.meta b/Assets/Shaders/Unlit_GreyScale.mat.meta
similarity index 79%
rename from com.saab.map-streamer/Runtime/Assets/DefaultTerrainMaterial.mat.meta
rename to Assets/Shaders/Unlit_GreyScale.mat.meta
index a704e31f..cfaaf969 100644
--- a/com.saab.map-streamer/Runtime/Assets/DefaultTerrainMaterial.mat.meta
+++ b/Assets/Shaders/Unlit_GreyScale.mat.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: e252302673b0b904d9f60572efbe4cb4
+guid: 8c49d90629888234fb9b906f1b53861d
 NativeFormatImporter:
   externalObjects: {}
   mainObjectFileID: 2100000
diff --git a/Assets/Shaders/Weather.meta b/Assets/Shaders/Weather.meta
new file mode 100644
index 00000000..663d8c25
--- /dev/null
+++ b/Assets/Shaders/Weather.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 161f1d6bdcdd5164293c63b5ef50c711
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Weather/Fog.shader b/Assets/Shaders/Weather/Fog.shader
new file mode 100644
index 00000000..ceaa01d7
--- /dev/null
+++ b/Assets/Shaders/Weather/Fog.shader
@@ -0,0 +1,87 @@
+Shader "Weather/Fog"
+{
+    SubShader
+    {
+        Cull Off ZWrite Off ZTest Always
+
+        Pass
+        {
+            HLSLPROGRAM
+            #include "Packages/com.unity.postprocessing/PostProcessing/Shaders/StdLib.hlsl"
+
+            #pragma vertex vert
+            #pragma fragment frag
+
+            struct appdata
+            {
+                float4 vertex : POSITION;
+            };
+
+            struct v2f
+            {
+                float4 vertex : SV_POSITION;
+                float2 texcoord  : TEXCOORD0;
+                float2 texcoordStereo  : TEXCOORD1;
+                float3 worldDirection  : TEXCOORD2;
+            };
+
+            TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);
+            TEXTURE2D_SAMPLER2D(_CameraDepthTexture, sampler_CameraDepthTexture);
+            float _ViewDistance;
+            float _Density;
+            float _MinDensity;
+            float _MaxDensity;
+            float _FogHeight;
+            float4 _Color;
+            float _Ambient;
+            float3 _Forward;
+            uniform float4x4 clipToWorld;
+
+            v2f vert(appdata v)
+            {
+                v2f o;
+                o.vertex = float4(v.vertex.xy, 0.0, 1.0);
+                o.texcoord = TransformTriangleVertexToUV(v.vertex.xy);
+
+#if UNITY_UV_STARTS_AT_TOP
+                o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
+#endif
+                o.texcoordStereo = TransformStereoScreenSpaceTex(o.texcoord, 1.0);
+
+                float4 clip = float4(o.texcoord.xy * 2 - 1, 0.0, 1.0);
+                o.worldDirection = mul(clipToWorld, clip) - _WorldSpaceCameraPos;
+
+                return o;
+            }
+
+            float4 frag(v2f i) : SV_Target
+            {
+                    float4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord);
+                    float nonLinearDepth = SAMPLE_TEXTURE2D(_CameraDepthTexture, sampler_CameraDepthTexture, i.texcoord).r;
+                    float linearDepth = Linear01Depth(nonLinearDepth);
+
+                    float farPlane = _ProjectionParams.z;
+
+                    float3 worldspace = i.worldDirection * LinearEyeDepth(nonLinearDepth) + _WorldSpaceCameraPos;
+                    float mask = 1 - abs(dot(normalize(worldspace), float3(0, 1, 0)));
+
+                    float3 plane = float3(0, -1, 0);
+                    float denominator = dot(normalize(worldspace), plane);
+                    float distPlane = dot(float3(0, _FogHeight, 0) - _WorldSpaceCameraPos, plane) / denominator;
+                    distPlane = clamp(distPlane, 0, farPlane);
+
+                    distPlane = denominator <= 0 ? distPlane : farPlane;
+                    float dist = linearDepth * farPlane;
+
+                    dist = min(dist, distPlane);
+
+                    float depth = 1 - clamp(_ViewDistance / dist, 0, 1);
+
+                    depth = clamp(depth + _MinDensity, 0, _MaxDensity) * (_Density * mask);
+                    return lerp(color, _Color * _Ambient, depth);
+            }
+
+            ENDHLSL
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Shaders/Weather/Fog.shader.meta b/Assets/Shaders/Weather/Fog.shader.meta
new file mode 100644
index 00000000..bd63e1d5
--- /dev/null
+++ b/Assets/Shaders/Weather/Fog.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: f495d04f47de59c418cacc3cdfd52420
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Weather/FogEffect.cs b/Assets/Shaders/Weather/FogEffect.cs
new file mode 100644
index 00000000..d2b627e0
--- /dev/null
+++ b/Assets/Shaders/Weather/FogEffect.cs
@@ -0,0 +1,70 @@
+using System;
+using UnityEngine;
+using UnityEngine.Rendering.PostProcessing;
+
+[Serializable]
+[PostProcess(typeof(FogEffectRenderer), PostProcessEvent.AfterStack, "Weather/Fog")]
+public sealed class FogEffect : PostProcessEffectSettings
+{
+    //public ParameterOverride<ComputeShader> NoiseCompute = new ParameterOverride<ComputeShader>();
+    //public ParameterOverride<RenderTexture> Texture3D = new ParameterOverride<RenderTexture>();
+
+    //public IntParameter Resolution = new IntParameter { value = 128 };
+    //public IntParameter NumberOfCells = new IntParameter { value = 10 };
+
+    [Range(0, 1), Tooltip("Fog density.")]
+    public FloatParameter Density = new FloatParameter { value = 1f };
+
+    [Range(0, 1), Tooltip("min Fog density.")]
+    public FloatParameter MinDensity = new FloatParameter { value = 0.0f };
+
+    [Range(0, 1), Tooltip("max Fog density.")]
+    public FloatParameter MaxDensity = new FloatParameter { value = 1f };
+   
+    [Tooltip("Fog view distance.")]
+    public FloatParameter ViewDistance = new FloatParameter { value = 10000 };
+
+    [Tooltip("Fog Height.")]
+    public FloatParameter FogHeight = new FloatParameter { value = 200 };
+
+    [Tooltip("Fog Color")]
+    public ColorParameter Color = new ColorParameter { value = UnityEngine.Color.white };
+}
+
+[ExecuteAlways]
+public sealed class FogEffectRenderer : PostProcessEffectRenderer<FogEffect>
+{
+    public override void Render(PostProcessRenderContext context)
+    {
+        if (context == null)
+            return;
+
+        var sheet = context.propertySheets.Get(Shader.Find("Weather/Fog"));
+        if(sheet == null)
+        {
+            Debug.LogWarning("could not find shader");
+            return;
+        }
+
+        var camera = context.camera;
+        var p = GL.GetGPUProjectionMatrix(camera.projectionMatrix, false);// Unity flips its 'Y' vector depending on if its in VR, Editor view or game view etc... (facepalm)
+        p[2, 3] = p[3, 2] = 0.0f;
+        p[3, 3] = 1.0f;
+        var clipToWorld = Matrix4x4.Inverse(p * camera.worldToCameraMatrix) * Matrix4x4.TRS(new Vector3(0, 0, -p[2, 2]), Quaternion.identity, Vector3.one);
+        sheet.properties.SetMatrix("clipToWorld", clipToWorld);
+        sheet.properties.SetFloat("_Density", settings.Density);
+
+        sheet.properties.SetFloat("_MinDensity", settings.MinDensity);
+        sheet.properties.SetFloat("_MaxDensity", settings.MaxDensity);
+        sheet.properties.SetFloat("_ViewDistance", settings.ViewDistance);
+        sheet.properties.SetVector("_Forward", context.camera.transform.forward);
+        sheet.properties.SetFloat("_FogHeight", settings.FogHeight);
+        
+        sheet.properties.SetColor("_Color", settings.Color);
+
+        var ambientIntensity = (Vector3.Dot(RenderSettings.sun.transform.forward, Vector3.down) + 1) / 2;
+        sheet.properties.SetFloat("_Ambient", ambientIntensity);
+
+        context.command.BlitFullscreenTriangle(context.source, context.destination, sheet, 0);
+    }
+}
\ No newline at end of file
diff --git a/Assets/Shaders/Weather/FogEffect.cs.meta b/Assets/Shaders/Weather/FogEffect.cs.meta
new file mode 100644
index 00000000..bdc39141
--- /dev/null
+++ b/Assets/Shaders/Weather/FogEffect.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d6a39c3742c18764fbd0edb542c9fb17
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Weather/FogShader.shader b/Assets/Shaders/Weather/FogShader.shader
new file mode 100644
index 00000000..7d96df22
--- /dev/null
+++ b/Assets/Shaders/Weather/FogShader.shader
@@ -0,0 +1,90 @@
+Shader "Weather/NewFog"
+{
+    SubShader
+    {
+        Cull Off ZWrite Off ZTest Always
+
+        Pass
+        {
+            HLSLPROGRAM
+            #include "Packages/com.unity.postprocessing/PostProcessing/Shaders/StdLib.hlsl"
+          
+            #pragma vertex vert
+            #pragma fragment frag
+
+            struct appdata
+            {
+                float4 vertex : POSITION;
+            };
+
+            struct v2f
+            {
+                float4 vertex : SV_POSITION;
+                float2 texcoord  : TEXCOORD0;
+                float2 texcoordStereo  : TEXCOORD1;
+                float3 worldDirection  : TEXCOORD2;
+            };
+
+            TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);
+            TEXTURE2D_SAMPLER2D(_CameraDepthTexture, sampler_CameraDepthTexture);
+            float _ViewDistance;
+            float _Density;
+            float _MinDensity;
+            float _MaxDensity;
+            float _FogHeight;
+            float4 _Color;
+            float3 _Forward;
+            uniform float4x4 clipToWorld;
+
+            v2f vert (appdata v)
+            {
+                v2f o;
+                o.vertex = float4(v.vertex.xy, 0.0, 1.0);
+                o.texcoord = TransformTriangleVertexToUV(v.vertex.xy);
+
+#if UNITY_UV_STARTS_AT_TOP
+                o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
+#endif
+                o.texcoordStereo = TransformStereoScreenSpaceTex(o.texcoord, 1.0);
+
+                float4 clip = float4(o.texcoord.xy * 2 - 1, 0.0, 1.0);
+                o.worldDirection = mul(clipToWorld, clip).xyz - _WorldSpaceCameraPos;
+
+                return o;
+            }
+
+            float4 frag(v2f i) : SV_Target
+            {
+                    float4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord);
+                    float nonLinearDepth = SAMPLE_TEXTURE2D(_CameraDepthTexture, sampler_CameraDepthTexture, i.texcoord).r;
+                    float linearDepth = Linear01Depth(nonLinearDepth);
+
+                    float farPlane = _ProjectionParams.z;
+
+                    float3 worldspace = i.worldDirection * LinearEyeDepth(nonLinearDepth) + _WorldSpaceCameraPos;
+                    float mask = 1 - abs(dot(normalize(worldspace), float3(0, 1, 0)));
+
+                    //return mask;
+                    //return float4(coord.xyz * linearDepth * _ViewDistance, 0);
+
+                    float3 plane = float3(0, -1, 0);
+                    float denominator = dot(normalize(worldspace), plane);
+                    //return denominator;
+                    float distPlane = dot(float3(0, _FogHeight, 0) - _WorldSpaceCameraPos, plane) / denominator;
+                    distPlane = clamp(distPlane, 0, farPlane);
+
+                    distPlane = denominator <= 0 ? distPlane : farPlane;
+                    float dist = linearDepth * farPlane;
+
+                    dist = min(dist, distPlane);
+
+                    float depth = 1 - clamp(_ViewDistance / dist, 0, 1);
+
+                    depth = clamp(depth + _MinDensity, 0, _MaxDensity) * (_Density * mask);
+                    return _Color * depth + (color * (1 - depth));
+            }
+
+            ENDHLSL
+        }
+    }
+}
diff --git a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/TerrainShader.shader.meta b/Assets/Shaders/Weather/FogShader.shader.meta
similarity index 83%
rename from com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/TerrainShader.shader.meta
rename to Assets/Shaders/Weather/FogShader.shader.meta
index 7616a0ca..7aa6081b 100644
--- a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/TerrainShader.shader.meta
+++ b/Assets/Shaders/Weather/FogShader.shader.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 4fba17e32aa778c4f91c0f15aa16e881
+guid: d944902ba5f408a468086a76b2f355f2
 ShaderImporter:
   externalObjects: {}
   defaultTextures: []
diff --git a/Assets/Shaders/Weather/Noise.png b/Assets/Shaders/Weather/Noise.png
new file mode 100644
index 00000000..30c2228e
Binary files /dev/null and b/Assets/Shaders/Weather/Noise.png differ
diff --git a/Assets/Shaders/Weather/Noise.png.meta b/Assets/Shaders/Weather/Noise.png.meta
new file mode 100644
index 00000000..72c3301d
--- /dev/null
+++ b/Assets/Shaders/Weather/Noise.png.meta
@@ -0,0 +1,120 @@
+fileFormatVersion: 2
+guid: 1df2bc37d39dc6349b7d1d23dc1255a7
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 2
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Weather/Rain.shader b/Assets/Shaders/Weather/Rain.shader
new file mode 100644
index 00000000..2e7c59cc
--- /dev/null
+++ b/Assets/Shaders/Weather/Rain.shader
@@ -0,0 +1,123 @@
+Shader "Weather/Rain"
+{
+    SubShader
+    {
+        Cull Off ZWrite Off ZTest Always
+
+        Pass
+        {
+            HLSLPROGRAM
+            #include "Packages/com.unity.postprocessing/PostProcessing/Shaders/StdLib.hlsl"
+
+            #pragma vertex vert
+            #pragma fragment frag
+
+            inline half3 LinearToGammaSpace(half3 linRGB)
+            {
+                linRGB = max(linRGB, half3(0.h, 0.h, 0.h));
+                // An almost-perfect approximation from http://chilliant.blogspot.com.au/2012/08/srgb-approximations-for-hlsl.html?m=1
+                return max(1.055h * pow(linRGB, 0.416666667h) - 0.055h, 0.h);
+            }
+
+            inline half3 GammaToLinearSpace(half3 sRGB)
+            {
+                // Approximate version from http://chilliant.blogspot.com.au/2012/08/srgb-approximations-for-hlsl.html?m=1
+                return sRGB * (sRGB * (sRGB * 0.305306011h + 0.682171111h) + 0.012522878h);
+            }
+
+            float4 GammaToLinear(float4 col)
+            {
+#if UNITY_COLORSPACE_GAMMA
+                return col;
+#endif
+                return float4(LinearToGammaSpace(col.xyz).xyz, col.a);
+            }
+
+            struct appdata
+            {
+                float4 vertex : POSITION;
+            };
+
+            struct v2f
+            {
+                float4 vertex : SV_POSITION;
+                float2 texcoord  : TEXCOORD0;
+                float2 texcoordStereo  : TEXCOORD1;
+                float3 worldDirection  : TEXCOORD2;
+            };
+
+            TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);
+            TEXTURE2D_SAMPLER2D(_NoiseTex, sampler_NoiseTex);
+            TEXTURE2D_SAMPLER2D(_RainTex, sampler_RainTex);
+            TEXTURE2D_SAMPLER2D(_CameraDepthTexture, sampler_CameraDepthTexture);
+            float _ViewDistance;
+            float _Density;
+            float4 _Color;
+            float3 _Forward;
+            float2 _Wind;
+            uniform float4x4 _ClipToWorld;
+
+            v2f vert(appdata v)
+            {
+                v2f o;
+                o.vertex = float4(v.vertex.xy, 0.0, 1.0);
+                o.texcoord = TransformTriangleVertexToUV(v.vertex.xy);
+
+#if UNITY_UV_STARTS_AT_TOP
+                o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
+#endif
+                o.texcoordStereo = TransformStereoScreenSpaceTex(o.texcoord, 1.0);
+
+                float4 clip = float4(o.texcoord.xy * 2 - 1, 0.0, 1.0);
+                o.worldDirection = mul(_ClipToWorld, clip).xyz - _WorldSpaceCameraPos;
+
+                return o;
+            }
+
+            // ********https://www.shadertoy.com/view/stGfDz ********
+
+            float4 frag(v2f i) : SV_Target
+            {
+                    float time = unity_DeltaTime.z;
+                    float farPlane = _ProjectionParams.z;
+                    float2 groundScroll = (_Time.y * normalize(_Wind) * 0.1);
+
+                    float4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord);
+                    float nonLinearDepth = SAMPLE_TEXTURE2D(_CameraDepthTexture, sampler_CameraDepthTexture, i.texcoord).r;
+                    float linearDepth = Linear01Depth(nonLinearDepth);
+
+                    float3 worldspace = i.worldDirection * LinearEyeDepth(nonLinearDepth) + _WorldSpaceCameraPos;
+                    float mask = clamp(dot(worldspace, float3(0, -1, 0)), 0, 1);
+
+                    // ************* Ground Effect *************
+                    float2 groundUV = (worldspace.xz / worldspace.y) * 0.01;
+
+                    float4 groundNoise01 = SAMPLE_TEXTURE2D(_NoiseTex, sampler_NoiseTex, groundUV + groundScroll);
+                    float4 groundNoise02 = SAMPLE_TEXTURE2D(_NoiseTex, sampler_NoiseTex, groundUV * 3 + groundScroll);
+
+                    float4 groundnoise = clamp(groundNoise01 * groundNoise02 * 2, 0, 1) * mask;
+
+                    float4 ground = lerp(GammaToLinear(color), GammaToLinear(_Color), groundnoise.a * _Color.a * 0);
+
+                    //return mask;
+                    //  ************* Rain Effect *************
+
+                    float4 rainTex = SAMPLE_TEXTURE2D(_RainTex, sampler_RainTex, i.texcoord);
+
+                    float4 rain = lerp(GammaToLinear(color), GammaToLinear(_Color), rainTex.a * _Color.a);
+
+#if UNITY_COLORSPACE_GAMMA
+                    return rain;
+#else
+                    return float4(GammaToLinearSpace(rain.xyz).xyz, rain.a);;
+#endif
+
+                    // ************* mix rain Effects *************
+
+                    //return lerp(ground, rain, rainTex.a * _Color.a);
+            }
+
+            ENDHLSL
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Shaders/Weather/Rain.shader.meta b/Assets/Shaders/Weather/Rain.shader.meta
new file mode 100644
index 00000000..30b2e7ba
--- /dev/null
+++ b/Assets/Shaders/Weather/Rain.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 06966467cf260034b8f4c0fa8072c646
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Weather/RainEffect.cs b/Assets/Shaders/Weather/RainEffect.cs
new file mode 100644
index 00000000..7658b302
--- /dev/null
+++ b/Assets/Shaders/Weather/RainEffect.cs
@@ -0,0 +1,169 @@
+﻿using System;
+using UnityEngine;
+using UnityEngine.Rendering.PostProcessing;
+
+[Serializable]
+[PostProcess(typeof(RainEffectRenderer), PostProcessEvent.AfterStack, "Weather/Rain")]
+public sealed class RainEffect : PostProcessEffectSettings
+{
+    [Tooltip("ComputeShader for Generating rain texture")]
+    public ParameterOverride<ComputeShader> RainShader = new ParameterOverride<ComputeShader> { value = null };
+
+    [Tooltip("Noise Texture")]
+    public TextureParameter Noise = new TextureParameter { value = null };
+
+    [Range(0, 10000), Tooltip("Rain density.")]
+    public IntParameter Density = new IntParameter { value = 2000 };
+
+    [Tooltip("Rain Color")]
+    public ColorParameter Color = new ColorParameter { value = new Color(0.8f, 0.8f, 0.8f, 0.5f) };
+
+    [Range(5, 50), Tooltip("Rain speed.")]
+    public FloatParameter Speed = new FloatParameter { value = 8 };
+
+    [Range(0, 10), Tooltip("Rain Fade.")]
+    public FloatParameter Fade = new FloatParameter { value = 5 };
+
+    [Range(0, 5), Tooltip("Rain Radius.")]
+    public FloatParameter Radius = new FloatParameter { value = 1 };
+
+    [Tooltip("Wind")]
+    public Vector2Parameter Wind = new Vector2Parameter { value = Vector2.zero };
+}
+
+public sealed class RainEffectRenderer : PostProcessEffectRenderer<RainEffect>
+{
+    private int _kernel;
+    private int _kernelParticle;
+    private RenderTexture _outputTexture;
+
+    private ComputeBuffer _rainBuffer;
+    private Matrix4x4 _worldToClip;
+    private float _fov;
+    private Vector2Int _screenSize;
+    private int _resolution = 1024;
+
+    public override void Init()
+    {
+        _outputTexture = new RenderTexture(_resolution, _resolution, 24);
+        _outputTexture.enableRandomWrite = true;
+        _outputTexture.Create();
+        ParticleSetup();
+
+        _screenSize = new Vector2Int(Screen.width, Screen.height);
+    }
+
+    public Matrix4x4 GetClipToWorld(Camera camera)
+    {
+        var p = GL.GetGPUProjectionMatrix(camera.projectionMatrix, false);// Unity flips its 'Y' vector depending on if its in VR, Editor view or game view etc... (facepalm)
+        p[2, 3] = p[3, 2] = 0.0f;
+        p[3, 3] = 1.0f;
+        _worldToClip = (p * camera.worldToCameraMatrix) * Matrix4x4.TRS(new Vector3(0, 0, -p[2, 2]), Quaternion.identity, Vector3.one);
+        return Matrix4x4.Inverse(p * camera.worldToCameraMatrix) * Matrix4x4.TRS(new Vector3(0, 0, -p[2, 2]), Quaternion.identity, Vector3.one);
+    }
+
+    public void ParticleSetup()
+    {
+        _kernel = settings.RainShader.value.FindKernel("CSRain");
+        _kernelParticle = settings.RainShader.value.FindKernel("CSRainParticles");
+
+        settings.RainShader.value.SetTexture(_kernel, "Result", _outputTexture);
+
+        if(_rainBuffer == null)
+            _rainBuffer = new ComputeBuffer(10000, sizeof(float) * 3, ComputeBufferType.Default);
+
+        settings.RainShader.value.SetTexture(_kernelParticle, "Result", _outputTexture);
+        settings.RainShader.value.SetBuffer(_kernelParticle, "RainBuffer", _rainBuffer);
+
+        GeneratePoints();
+    }
+
+    private void GeneratePoints()
+    {
+        var setup = settings.RainShader.value.FindKernel("CSCreateParticles");
+        settings.RainShader.value.SetBuffer(setup, "RainBuffer", _rainBuffer);
+
+        int threads = settings.Density.value > 10 ? settings.Density.value / 10 : 1;
+
+        if (settings.Density > 0)
+            settings.RainShader.value.Dispatch(setup, threads, 1, 1);
+
+        RenderTexture rt = RenderTexture.active;
+        RenderTexture.active = _outputTexture;
+        GL.Clear(true, true, Color.clear);
+        RenderTexture.active = rt;
+    }
+
+    public override void Render(PostProcessRenderContext context)
+    {
+        if (context == null) return;
+
+        var height = _resolution;
+        var width = _resolution;
+
+        if (_screenSize.x < Screen.width || _screenSize.y < Screen.height)
+        {
+            GeneratePoints();
+        }
+
+        if (context.camera.fieldOfView != _fov)
+        {        
+            GeneratePoints();
+        }
+
+        _screenSize = new Vector2Int(Screen.width, Screen.height);
+
+        _fov = context.camera.fieldOfView;
+        var clipToWorld = GetClipToWorld(context.camera);
+        Matrix4x4 world2Screen = context.camera.projectionMatrix * context.camera.worldToCameraMatrix;
+
+        settings.RainShader.value.SetVector("Resolution", new Vector2(width, height));
+        settings.RainShader.value.SetInt("ParticlesNum", settings.Density.value);
+        settings.RainShader.value.SetFloat("Speed", settings.Speed.value);
+        settings.RainShader.value.SetFloat("Fade", settings.Fade.value);
+        settings.RainShader.value.SetFloat("Radius", settings.Radius.value);
+        settings.RainShader.value.SetVector("Wind", settings.Wind.value);
+        settings.RainShader.value.SetTextureFromGlobal(_kernel, "DepthTexture", "_CameraDepthTexture");
+        settings.RainShader.value.SetTextureFromGlobal(_kernelParticle, "DepthTexture", "_CameraDepthTexture");
+        settings.RainShader.value.SetMatrix("ClipToWorld", clipToWorld);
+        settings.RainShader.value.SetMatrix("WorldToScreen", world2Screen);
+
+        int threads = settings.Density.value > 10 ? settings.Density.value / 10 : 1;
+
+        _rainBuffer.SetCounterValue(0);
+        settings.RainShader.value.SetBuffer(_kernelParticle, "RainBuffer", _rainBuffer);
+        settings.RainShader.value.Dispatch(_kernelParticle, threads, 1, 1);
+
+        settings.RainShader.value.Dispatch(_kernel, _outputTexture.width / 8, _outputTexture.height / 8, 1);
+
+        var sheet = context.propertySheets.Get(Shader.Find("Weather/Rain"));
+        if (sheet == null)
+        {
+            Debug.LogWarning("could not find shader");
+            return;
+        }
+
+        sheet.properties.SetMatrix("_ClipToWorld", clipToWorld);
+
+        sheet.properties.SetFloat("_Density", settings.Density);
+        sheet.properties.SetVector("_Forward", context.camera.transform.forward);
+        sheet.properties.SetColor("_Color", settings.Color);
+        sheet.properties.SetVector("_Wind", settings.Wind);
+
+        var imageTexture = settings.Noise.value == null ? RuntimeUtilities.whiteTexture : settings.Noise.value;
+        sheet.properties.SetTexture("_NoiseTex", imageTexture);
+        sheet.properties.SetTexture("_RainTex", _outputTexture);
+
+        context.command.BlitFullscreenTriangle(context.source, context.destination, sheet, 0);
+    }
+
+    public override void Release()
+    {
+        if(_outputTexture != null)
+            _outputTexture.Release();
+        //if(_inputTexture != null)
+        //    _inputTexture.Release();
+        if (_rainBuffer.IsValid())
+            _rainBuffer.Release();
+    }
+}
\ No newline at end of file
diff --git a/Assets/Shaders/Weather/RainEffect.cs.meta b/Assets/Shaders/Weather/RainEffect.cs.meta
new file mode 100644
index 00000000..c929ccc2
--- /dev/null
+++ b/Assets/Shaders/Weather/RainEffect.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0ea85088c98091645850e55d316b61b1
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Weather/RainFall.compute b/Assets/Shaders/Weather/RainFall.compute
new file mode 100644
index 00000000..c8165b5f
--- /dev/null
+++ b/Assets/Shaders/Weather/RainFall.compute
@@ -0,0 +1,223 @@
+#pragma kernel CSRain
+#pragma kernel CSRainParticles
+#pragma kernel CSCreateParticles
+#include "UnityCG.cginc"
+
+#define PHI 1.61803398874989484820459
+#define PI  3.14159265359
+
+struct RainDrop
+{
+	float3 Position;
+};
+
+RWStructuredBuffer<RainDrop> RainBuffer;
+RWTexture2D<float4> Result;
+//Texture2D<float4> Input;
+
+float2 Resolution;
+float2 Wind;
+float Speed;
+float Fade;
+float Radius;
+uint ParticlesNum;
+
+uniform float4x4 ClipToWorld;
+uniform float4x4 WorldToScreen;
+
+Texture2D<float4> DepthTexture;
+Texture2D<float4> NoiseTexture;
+
+float Random(float input, float mutator = 0.546, float min = 0.0, float max = 1.0)
+{
+	float value = input % 43758.5453123;
+	float mod = abs(min - max);
+	float random = frac(sin(value + mutator) * 142375.554353);
+	return (random * mod)+min;
+}
+
+float3 World2Screen(float3 worldPos)
+{
+	/*float4 clipCoord = mul(WorldToScreen, float4(worldPos, 1));
+	float4 screenPos = clipCoord / clipCoord.w;
+	screenPos *= float4(Resolution.x, Resolution.y, 1, 1);
+	return uint3(screenPos.x, screenPos.y, screenPos.z);*/
+
+	float4 clipCoord = mul(WorldToScreen, float4(worldPos, 1));
+	float4 screenPos = clipCoord / clipCoord.w;
+
+	screenPos = screenPos * 0.5 + 0.5;
+	screenPos *= float4(Resolution.x, Resolution.y, 1, 1);
+
+	return uint3(screenPos.x, screenPos.y, screenPos.z);
+}
+
+float3 GetWorldPos(float2 uv, float Depth)
+{
+	float4 clip = float4(uv.xy * 2 - 1, 0.0, 1.0);
+	float3 worldDirection = mul(ClipToWorld, clip) - _WorldSpaceCameraPos;
+
+	return worldDirection * Depth + _WorldSpaceCameraPos;
+}
+
+void DrawPixel(float2 pos, float r, float col)
+{
+	float sqr = r * r;
+
+	for (int x = pos.x - r; x < pos.x + r + 1; x++)
+	{
+		for (int y = pos.y - r; y < pos.y + r + 1; y++)
+		{
+			if ((pos.x - x) * (pos.x - x) + (pos.y - y) * (pos.y - y) < sqr)
+			{
+				Result[float2(x, y)] = col;
+			}
+		}
+	}
+}
+
+void DrawLine(float3 from, float mask)
+{
+	float3 rainDir = normalize(float3(Wind.x, -1, Wind.y));
+	rainDir.y = -1;
+
+	float3 to = from + normalize(rainDir) * Speed * unity_DeltaTime.z;
+
+	float2 start = World2Screen(from).xy;
+	float2 end = World2Screen(to).xy;
+
+	// ********** Bresenhams Line **********
+
+	int dx = abs(end.x - start.x);
+	int dy = -abs(end.y - start.y);
+
+	int sx = start.x < end.x ? 1 : -1;
+	int sy = start.y < end.y ? 1 : -1;
+
+	int error = dx + dy;
+
+	int x = start.x;
+	int y = start.y;
+
+	int MaxVal = min(min(max(dx, abs(end.y - start.y)), Resolution.x), Resolution.y);
+
+	//while (true)
+	for (int i = 0; i <= MaxVal; i++)
+	{
+		DrawPixel(float2(x,y), Radius, 1 - mask);
+
+		if (x == end.x && y == end.y)
+			break;
+
+		int e2 = 2 * error;
+
+		if (e2 >= dy)
+		{
+			if (x == end.x) break;
+			error = error + dy;
+			x = x + sx;
+
+		}
+		if (e2 <= dx)
+		{
+			if (y == end.y) break;
+			error = error + dx;
+			y = y + sy;
+		}
+	}
+}
+
+float cbrt(float x)
+{
+	return pow(x, 1.0f / 3.0f);
+}
+
+bool IsPointOutsideSphere(float3 p, float3 center, float radius)
+{
+	float dist = distance(p, center);
+	return dist > radius;
+}
+
+float3 GetPointInSphere(float3 center, float radius, float id)
+{
+	float theta = Random(id.x + _Time.x, 0.952) * 2.0 * PI;
+	float phi = Random(id.x + _Time.x, 0.821) * 2.0 * PI;
+	float r = radius * cbrt(Random(id.x + _Time.x, 0.376));
+
+	float sinTheta = sin(theta);
+	float cosTheta = cos(theta);
+	float sinPhi = sin(phi);
+	float cosPhi = cos(phi);
+
+	float3 randomPoint;
+	randomPoint.x = center.x + r * sinTheta * cosPhi;
+	randomPoint.y = center.y + r * sinTheta * sinPhi;
+	randomPoint.z = center.z + r * cosTheta;
+
+	return randomPoint;
+}
+
+
+[numthreads(10, 1, 1)]
+void CSCreateParticles(uint3 id : SV_DispatchThreadID)
+{
+	if (id.x >= ParticlesNum) { return; }
+
+	float3 screenPos = float3(Random(id.x + _Time.x * PHI, 0.37) * Resolution.x, Random(id.x + _Time.x * PHI, 0.61) * Resolution.y, Random(id.x + _Time.x + id.y * PHI, 0.34));
+	float3 wp = GetWorldPos(float2(screenPos.x / Resolution.x, screenPos.y / Resolution.y), 5 + screenPos.z * 100);
+
+	//float3 wp = GetPointInSphere(_WorldSpaceCameraPos, 100, id.x);
+
+	RainBuffer[id.x].Position = wp;
+}
+
+[numthreads(10, 1, 1)]
+void CSRainParticles(uint3 id : SV_DispatchThreadID)
+{
+	if (id.x >= ParticlesNum) { return; } 
+
+	RainDrop drop = RainBuffer[id.x];
+	float3 screenPos = World2Screen(drop.Position);
+	float farPlane = _ProjectionParams.z;
+
+	// ********** WorldPos **********
+	//float4 depthEye = LinearEyeDepth(DepthTexture[screenPos.xy]);
+	//float3 uv = float3(screenPos.x / Resolution.x, screenPos.y / Resolution.y, screenPos.z / farPlane);
+	// ********** Rain direction **********
+	float3 rainDir = normalize(float3(Wind.x, -1, Wind.y));
+	rainDir.y = -1;
+	float3 wp = drop.Position + normalize(rainDir) * Speed * unity_DeltaTime.z;
+	// ********** Rain Particles **********
+	float dist = length(wp - _WorldSpaceCameraPos);
+	float mask = dist / 100;
+
+	//if (IsPointOutsideSphere(wp, _WorldSpaceCameraPos, 100))
+	//{
+	//	wp = GetPointInSphere(_WorldSpaceCameraPos, 100, id.x);
+	//}
+
+	if (screenPos.x <= 0 || screenPos.x >= Resolution.x || screenPos.y <= 0 || screenPos.y >= Resolution.y || dist > 105)
+	{
+		screenPos = float3(Random(id.x + screenPos.x + unity_DeltaTime.x + screenPos.y * PHI, 0.23) * Resolution.x, Random(id.x + screenPos.x + unity_DeltaTime.x + screenPos.y * PHI, 0.76) * Resolution.y, Random(id.x + screenPos.x + unity_DeltaTime.x + screenPos.y * PHI, 0.16));
+		wp = GetWorldPos(float2(screenPos.x / Resolution.x, screenPos.y / Resolution.y), 5 + screenPos.z * 100);
+	}
+
+	DrawLine(wp, mask.x);
+	RainBuffer[id.x].Position = wp;
+}
+
+[numthreads(8, 8, 1)]
+void CSRain(uint3 screenPos : SV_DispatchThreadID)
+{
+	float4 orgCol = Result[screenPos.xy];
+	
+	// Fade
+	float fade = max(0, orgCol - Fade * unity_DeltaTime.z);
+	Result[screenPos.xy] = fade;
+
+	// ********* random function test *********
+	//Result[screenPos.xy] = Random(screenPos.x + unity_DeltaTime.x + screenPos.y * PHI);
+	//Result[screenPos.xy] = Random(screenPos.x + screenPos.y * PHI);
+}
+
+
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug/DebugUtils.compute.meta b/Assets/Shaders/Weather/RainFall.compute.meta
similarity index 71%
rename from com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug/DebugUtils.compute.meta
rename to Assets/Shaders/Weather/RainFall.compute.meta
index 58b7a3bd..8f87e648 100644
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug/DebugUtils.compute.meta
+++ b/Assets/Shaders/Weather/RainFall.compute.meta
@@ -1,7 +1,8 @@
 fileFormatVersion: 2
-guid: 5bdd83a19020cd2448c015ea62e58228
+guid: 247d17e29d700194aa29f9f616605f85
 ComputeShaderImporter:
   externalObjects: {}
+  currentAPIMask: 4
   preprocessorOverride: 0
   userData: 
   assetBundleName: 
diff --git a/Assets/Shaders/Weather/SkyBox.shader b/Assets/Shaders/Weather/SkyBox.shader
new file mode 100644
index 00000000..364e8291
--- /dev/null
+++ b/Assets/Shaders/Weather/SkyBox.shader
@@ -0,0 +1,194 @@
+Shader "Unlit/SkyBox"
+{
+    Properties
+    {
+        _MainTex ("Texture", 2D) = "white" {}
+        _NightTex("Star Texture", 2D) = "white" {}
+
+        [NoScaleOffset] _StarCubeMap("Star cube map", Cube) = "black" {}
+
+        _SkyBlendPower("Sky Blend", Range(0.05,1)) = 0.3
+        _GroundBlendPower("Ground Blend", Range(0.05,1)) = 0.3
+        _CloudBlendPower("Cloud Blend", Range(0.05,1)) = 0.3
+        _SkyColor("Sky color", Color) = (0, 0.5, 1, 1)
+        _HorizonColor("Horizon color", Color) = (1, 1, 1, 1)
+        _GroundColor("Ground color", Color) = (0.5, 0.5, 0.5, 1)
+        _CloudColor("Cloud color", Color) = (1, 1, 1, 1)
+        _CloudScale("Cloud Scale", Range(0.01,0.5)) = 1
+        _CloudDensity("Cloud Density", Range(0,5)) = 1
+        _CloudIntesity("Cloud Intesity", Range(0,10)) = 1
+        [ShowAsVector2] _Wind("Wind Direction", Vector) = (0,0,0,0)
+        _SunSize("Sun Size", Range(0,1)) = 0.03
+        _SunIntensity("Sun intesity", Range(1,5)) = 1.5
+        _SunAura("Sun Aura", Range(1,25)) = 2
+        _SunriseColor("Sunrise color", Color) = (1, 1, 1, 1)
+        _Warp("warp", Range(0,1)) = 1
+    }
+    SubShader
+    {
+        Tags { "RenderType"="Background" "PreviewType"="Skybox" "LightMode"="ForwardBase"}
+        Blend SrcAlpha OneMinusSrcAlpha
+        LOD 100
+
+        Pass
+        {
+            CGPROGRAM
+            #pragma vertex vert
+            #pragma fragment frag
+            // make fog work
+            #pragma multi_compile_fog
+
+            #include "UnityCG.cginc"
+
+            struct appdata
+            {
+                float4 vertex : POSITION;
+                float2 uv : TEXCOORD0;
+            };
+
+            struct v2f
+            {
+                float2 uv : TEXCOORD0;
+                float4 vertex : SV_POSITION;
+                float4 worldPos : TEXCOORD1;
+            };
+
+            sampler2D _MainTex;
+            sampler2D _NightTex;
+
+            samplerCUBE _StarCubeMap;
+            half4 _StarCubeMap_HDR;
+
+            float4 _MainTex_ST;
+            float _SkyBlendPower;
+            float _GroundBlendPower;
+            float _CloudBlendPower;
+            float _CloudScale;
+            float _CloudDensity;
+            float _CloudIntesity;
+            float _SunIntensity;
+            float _SunSize;
+            float _SunAura;
+
+            float2 _Wind;
+            float _Warp;
+
+            float4 _SkyColor;
+            float4 _HorizonColor;
+            float4 _GroundColor;
+            float4 _CloudColor;
+            float4 _SunriseColor;
+
+            float3 _SunDir;
+            float3 _moonDir;
+
+            v2f vert (appdata v)
+            {
+                v2f o;
+                o.vertex = UnityObjectToClipPos(v.vertex);
+                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
+                o.worldPos = mul(unity_ObjectToWorld, v.vertex);
+                UNITY_TRANSFER_FOG(o,o.vertex);
+                return o;
+            }
+
+            float GetSunMask(float sunViewDot, float sunRadius)
+            {
+                float stepRadius = 1 - sunRadius * sunRadius;
+                return step(stepRadius, sunViewDot);
+            }
+
+            float Random(float value, float mutator = 0.546)
+            {
+                float random = frac(sin(value + mutator) * 143758.5453);
+                return random;
+            }
+
+            float4 GammaToLinear(float4 col)
+            {
+#if UNITY_COLORSPACE_GAMMA
+                return col;
+#endif
+                return float4(LinearToGammaSpace(col.xyz).xyz, col.a);
+            }
+
+            float2 Unity_RadialShear_float(float2 UV, float2 Center, float Strength)
+            {
+                float2 delta = UV - Center;
+                float delta2 = dot(delta.xy, delta.xy);
+                float2 delta_offset = delta2 * Strength;
+                return UV + float2(delta.y, -delta.x) * delta_offset;
+            }
+
+            fixed4 frag(v2f i) : SV_Target
+            {
+
+                float pos = clamp(normalize(i.worldPos).g, -1, 1);
+
+                float maximum = max(pos, 0);
+                float minimum = min(0, pos);
+
+                float sky = pow(maximum, _SkyBlendPower);
+                float ground = pow(minimum * -1, _GroundBlendPower);
+                float horizon = (1 - (sky + ground));
+
+                float2 scroll = (_Time.z * -_Wind);
+
+                float2 uv = i.worldPos.xz / i.worldPos.y;
+                uv = uv * pow(pos, _Warp);
+
+                fixed4 col = GammaToLinear(tex2D(_MainTex, uv * _CloudScale + scroll));
+                fixed4 col1 = GammaToLinear(tex2D(_MainTex, uv * 0.5 * _CloudScale  + scroll));
+                fixed4 col2 = GammaToLinear(tex2D(_MainTex, uv * 2 *  _CloudScale + scroll));
+
+                fixed4 text = clamp((col * col1 * 2 * col2 * 4) * _CloudDensity, 0, 1);
+                //text = pow(text, _CloudIntesity);
+
+                float sunDot = ((dot(_WorldSpaceLightPos0.xyz, normalize(i.worldPos)) + 1) / 2);
+                float sunScattering = lerp((sunDot+1)/2, _SunIntensity, pow(sunDot, 50) * _SunIntensity);
+
+                float nightsky = ((dot(_WorldSpaceLightPos0.xyz, float3(0,1,0)) + 1) / 2);
+                sunScattering = (nightsky) + pow(sunDot, _SunAura) * _SunIntensity;
+
+                float4 cloud = GammaToLinear(_CloudColor) * pow(maximum, _CloudBlendPower) * text;
+                cloud.a = pow(cloud.a, _CloudIntesity);
+
+                float sunMask = GetSunMask(sunDot, _SunSize);
+                float halo = clamp(pow(sunDot, 4/ (_SunSize * _SunSize)) , 0.01, 1);
+                float sun = lerp(GetSunMask(sunDot, _SunSize * 0.2), GetSunMask(sunDot, _SunSize), halo);
+
+                // dont show sun behind clouds
+                sun *= clamp(pow((1-cloud.a)+0.3, 3), 0, 1);
+                // dont show sun on ground
+                sun *= (1 - clamp(pow(minimum * -1, 0.03), 0, 1));
+
+                float sunRise = ((1 - abs(pos)) * pow(sunDot, _SunAura));
+                //return sunRise ;
+                sunRise = 0;
+
+                fixed4 skynight = GammaToLinear(tex2D(_NightTex, uv)) * sky * 3;
+
+                float4 starData = texCUBE(_StarCubeMap, i.worldPos.xyz);
+                float4 starMap = pow(float4(DecodeHDR(starData, _StarCubeMap_HDR).xyz * 2, 1), 3);
+
+                float4 skycol = lerp(GammaToLinear(_SkyColor), skynight, clamp(1 - (nightsky + sunDot), 0, 1));
+
+                float4 skylerp = lerp(sky * skycol, sun * _SunIntensity, sun);
+                float4 horizonlerp = lerp(horizon * GammaToLinear(_HorizonColor * nightsky), horizon * GammaToLinear(_SunriseColor * nightsky), sunRise);
+
+                float4 skybox = skylerp + horizonlerp + ground * GammaToLinear(_GroundColor);
+
+                float4 result = float4(lerp(skybox, (cloud * col2 * 1) * sunScattering, cloud.a).xyz, 1);
+                
+                result = lerp(result, result * _SunriseColor, sunRise);
+
+            #if UNITY_COLORSPACE_GAMMA
+                return result;
+            #else
+                return float4(GammaToLinearSpace(result.xyz).xyz, result.a);;
+            #endif
+            }
+            ENDCG
+        }
+    }
+}
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/DownsampleDepth.shader.meta b/Assets/Shaders/Weather/SkyBox.shader.meta
similarity index 83%
rename from com.saab.map-streamer/Runtime/Shaders/Foliage/DownsampleDepth.shader.meta
rename to Assets/Shaders/Weather/SkyBox.shader.meta
index 706ef12c..2e19bc45 100644
--- a/com.saab.map-streamer/Runtime/Shaders/Foliage/DownsampleDepth.shader.meta
+++ b/Assets/Shaders/Weather/SkyBox.shader.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: f59a3846cb375b54c95e5d0a051d31fc
+guid: 3d2486b4e0dfd5c4e8fc75f1176e65fd
 ShaderImporter:
   externalObjects: {}
   defaultTextures: []
diff --git a/Assets/Shaders/Weather/SpaceTex.png b/Assets/Shaders/Weather/SpaceTex.png
new file mode 100644
index 00000000..4e89c5f8
Binary files /dev/null and b/Assets/Shaders/Weather/SpaceTex.png differ
diff --git a/Assets/Shaders/Weather/SpaceTex.png.meta b/Assets/Shaders/Weather/SpaceTex.png.meta
new file mode 100644
index 00000000..3a15d6de
--- /dev/null
+++ b/Assets/Shaders/Weather/SpaceTex.png.meta
@@ -0,0 +1,92 @@
+fileFormatVersion: 2
+guid: 6c01dd27775156c45b9914ba2f4bbb6e
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/Weather/Unlit_SkyBox.mat b/Assets/Shaders/Weather/Unlit_SkyBox.mat
new file mode 100644
index 00000000..b9810dea
--- /dev/null
+++ b/Assets/Shaders/Weather/Unlit_SkyBox.mat
@@ -0,0 +1,58 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Unlit_SkyBox
+  m_Shader: {fileID: 4800000, guid: 3d2486b4e0dfd5c4e8fc75f1176e65fd, type: 3}
+  m_ValidKeywords: []
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 1df2bc37d39dc6349b7d1d23dc1255a7, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _NightTex:
+        m_Texture: {fileID: 2800000, guid: 6c01dd27775156c45b9914ba2f4bbb6e, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _StarCubeMap:
+        m_Texture: {fileID: 8900000, guid: f57dbde3b4b93e248bf5498bbbb84781, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _CloudBlendPower: 0.05
+    - _CloudDensity: 0.6
+    - _CloudIntesity: 4
+    - _CloudScale: 0.088
+    - _Cutoff: 1
+    - _Gamma: 0
+    - _GroundBlendPower: 0.3
+    - _HorizonBlendPower: 1
+    - _SkyBlendPower: 0.369
+    - _SunAura: 1
+    - _SunIntensity: 2
+    - _SunSize: 0.02
+    - _Warp: 0.6
+    - _ZenithBlendPower: 0
+    m_Colors:
+    - _CloudColor: {r: 0.9150943, g: 0.9150943, b: 0.9150943, a: 1}
+    - _GroundColor: {r: 0.19744839, g: 0.254717, b: 0.06848522, a: 1}
+    - _HorizonColor: {r: 1, g: 1, b: 1, a: 1}
+    - _SkyColor: {r: 0, g: 0.50196075, b: 1, a: 1}
+    - _SunriseColor: {r: 1, g: 0.65330946, b: 0.43867922, a: 1}
+    - _Wind: {r: 0.001, g: 0.001, b: 0, a: 0}
+  m_BuildTextureStacks: []
diff --git a/com.saab.map-streamer/Runtime/Assets/FallbackMaterial.mat.meta b/Assets/Shaders/Weather/Unlit_SkyBox.mat.meta
similarity index 79%
rename from com.saab.map-streamer/Runtime/Assets/FallbackMaterial.mat.meta
rename to Assets/Shaders/Weather/Unlit_SkyBox.mat.meta
index 482a913c..c871576a 100644
--- a/com.saab.map-streamer/Runtime/Assets/FallbackMaterial.mat.meta
+++ b/Assets/Shaders/Weather/Unlit_SkyBox.mat.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: aaa1d8c29d6c5924296633de6b87f492
+guid: 2995ae3933759be4c9275a57ca8e36a6
 NativeFormatImporter:
   externalObjects: {}
   mainObjectFileID: 2100000
diff --git a/tutorial/img/Grass_demo.gif b/Assets/Shaders/Weather/starmap_2020_4k.exr
similarity index 50%
rename from tutorial/img/Grass_demo.gif
rename to Assets/Shaders/Weather/starmap_2020_4k.exr
index 45d40faf..62bb12ba 100644
Binary files a/tutorial/img/Grass_demo.gif and b/Assets/Shaders/Weather/starmap_2020_4k.exr differ
diff --git a/Assets/Shaders/Weather/starmap_2020_4k.exr.meta b/Assets/Shaders/Weather/starmap_2020_4k.exr.meta
new file mode 100644
index 00000000..cc45a417
--- /dev/null
+++ b/Assets/Shaders/Weather/starmap_2020_4k.exr.meta
@@ -0,0 +1,120 @@
+fileFormatVersion: 2
+guid: f57dbde3b4b93e248bf5498bbbb84781
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 2
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Shaders/glTFast.shadervariants b/Assets/Shaders/glTFast.shadervariants
new file mode 100644
index 00000000..9ba8c02d
--- /dev/null
+++ b/Assets/Shaders/glTFast.shadervariants
@@ -0,0 +1,19 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!200 &20000000
+ShaderVariantCollection:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: glTFast
+  m_Shaders:
+  - first: {fileID: 4800000, guid: 430872306259c934ba64e5a62e802522, type: 3}
+    second:
+      variants: []
+  - first: {fileID: 4800000, guid: 37951023f150394459ef1439d8f4c133, type: 3}
+    second:
+      variants: []
+  - first: {fileID: 4800000, guid: be88533d36c29644ca2d789b46dea64c, type: 3}
+    second:
+      variants: []
diff --git a/Assets/Shaders/glTFast.shadervariants.meta b/Assets/Shaders/glTFast.shadervariants.meta
new file mode 100644
index 00000000..74215c0a
--- /dev/null
+++ b/Assets/Shaders/glTFast.shadervariants.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f680bf01716cb98419a793c8ca140a61
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 20000000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/TextMesh Pro.meta b/Assets/TextMesh Pro.meta
new file mode 100644
index 00000000..f9da8b5e
--- /dev/null
+++ b/Assets/TextMesh Pro.meta	
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f54d1bd14bd3ca042bd867b519fee8cc
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/partical.meta b/Assets/partical.meta
new file mode 100644
index 00000000..e47c5dde
--- /dev/null
+++ b/Assets/partical.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 41bd59ff05ab1f648b31c0b86990d4fb
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/DefaultAssetMaterial.mat b/Assets/partical/explod.mat
similarity index 57%
rename from com.saab.map-streamer/Runtime/Assets/DefaultAssetMaterial.mat
rename to Assets/partical/explod.mat
index 767a38d9..82f5343e 100644
--- a/com.saab.map-streamer/Runtime/Assets/DefaultAssetMaterial.mat
+++ b/Assets/partical/explod.mat
@@ -7,18 +7,23 @@ Material:
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: DefaultAssetMaterial
-  m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
+  m_Name: explod
+  m_Shader: {fileID: 211, guid: 0000000000000000f000000000000000, type: 0}
   m_ValidKeywords:
-  - _ALPHATEST_ON
+  - _ALPHABLEND_ON
+  - _COLORADDSUBDIFF_ON
+  - _EMISSION
+  - _FADING_ON
+  - _REQUIRE_UV2
   m_InvalidKeywords: []
-  m_LightmapFlags: 4
-  m_EnableInstancingVariants: 1
+  m_LightmapFlags: 0
+  m_EnableInstancingVariants: 0
   m_DoubleSidedGI: 0
-  m_CustomRenderQueue: 2450
+  m_CustomRenderQueue: 3000
   stringTagMap:
-    RenderType: TransparentCutout
-  disabledShaderPasses: []
+    RenderType: Transparent
+  disabledShaderPasses:
+  - GRABPASS
   m_SavedProperties:
     serializedVersion: 3
     m_TexEnvs:
@@ -43,7 +48,7 @@ Material:
         m_Scale: {x: 1, y: 1}
         m_Offset: {x: 0, y: 0}
     - _MainTex:
-        m_Texture: {fileID: 0}
+        m_Texture: {fileID: 2800000, guid: f3e68c77dcb7aa3479485f1680685ef2, type: 3}
         m_Scale: {x: 1, y: 1}
         m_Offset: {x: 0, y: 0}
     - _MetallicGlossMap:
@@ -60,23 +65,42 @@ Material:
         m_Offset: {x: 0, y: 0}
     m_Ints: []
     m_Floats:
+    - _BlendOp: 0
     - _BumpScale: 1
+    - _CameraFadingEnabled: 0
+    - _CameraFarFadeDistance: 2
+    - _CameraNearFadeDistance: 1
+    - _ColorMode: 1
+    - _Cull: 2
     - _Cutoff: 0.5
     - _DetailNormalMapScale: 1
-    - _DstBlend: 0
+    - _DistortionBlend: 0.5
+    - _DistortionEnabled: 0
+    - _DistortionStrength: 1
+    - _DistortionStrengthScaled: 0.1
+    - _DstBlend: 10
+    - _EmissionEnabled: 1
+    - _FlipbookMode: 1
     - _GlossMapScale: 1
-    - _Glossiness: 0
+    - _Glossiness: 0.5
     - _GlossyReflections: 1
+    - _LightingEnabled: 0
     - _Metallic: 0
-    - _Mode: 1
+    - _Mode: 2
     - _OcclusionStrength: 1
     - _Parallax: 0.02
     - _SmoothnessTextureChannel: 0
+    - _SoftParticlesEnabled: 1
+    - _SoftParticlesFarFadeDistance: 2
+    - _SoftParticlesNearFadeDistance: 0
     - _SpecularHighlights: 1
-    - _SrcBlend: 1
+    - _SrcBlend: 5
     - _UVSec: 0
-    - _ZWrite: 1
+    - _ZWrite: 0
     m_Colors:
-    - _Color: {r: 1, g: 1, b: 1, a: 1}
-    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0}
+    - _Color: {r: 1.5921569, g: 0.9882353, b: 0.41568628, a: 1}
+    - _ColorAddSubDiff: {r: 1, g: 0, b: 0, a: 0}
+    - _EmissionColor: {r: 0.08705505, g: 0.04608797, b: 0.00853481, a: 1}
+    - _SoftParticleFadeParams: {r: 0, g: 0.5, b: 0, a: 0}
   m_BuildTextureStacks: []
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/DownsampleDepth.mat.meta b/Assets/partical/explod.mat.meta
similarity index 79%
rename from com.saab.map-streamer/Runtime/Shaders/Foliage/DownsampleDepth.mat.meta
rename to Assets/partical/explod.mat.meta
index 6ce0162b..7fddc61f 100644
--- a/com.saab.map-streamer/Runtime/Shaders/Foliage/DownsampleDepth.mat.meta
+++ b/Assets/partical/explod.mat.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: ebe65c385a1ee1e40b90aaffc81cc315
+guid: cfeac59cdf62b9e4e8de566ee907f658
 NativeFormatImporter:
   externalObjects: {}
   mainObjectFileID: 2100000
diff --git a/Assets/partical/explosion.prefab b/Assets/partical/explosion.prefab
new file mode 100644
index 00000000..4cb9edb3
--- /dev/null
+++ b/Assets/partical/explosion.prefab
@@ -0,0 +1,4872 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &5487844413025695174
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 41172407708640986}
+  - component: {fileID: 4129605546221760695}
+  - component: {fileID: 5708224531665990525}
+  m_Layer: 0
+  m_Name: explosion
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &41172407708640986
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5487844413025695174}
+  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: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!198 &4129605546221760695
+ParticleSystem:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5487844413025695174}
+  serializedVersion: 8
+  lengthInSec: 2
+  simulationSpeed: 2
+  stopAction: 1
+  cullingMode: 3
+  ringBufferMode: 0
+  ringBufferLoopRange: {x: 0, y: 1}
+  emitterVelocityMode: 1
+  looping: 0
+  prewarm: 0
+  playOnAwake: 1
+  useUnscaledTime: 0
+  autoRandomSeed: 1
+  startDelay:
+    serializedVersion: 2
+    minMaxState: 0
+    scalar: 0
+    minScalar: 0
+    maxCurve:
+      serializedVersion: 2
+      m_Curve:
+      - serializedVersion: 3
+        time: 0
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0.33333334
+        outWeight: 0.33333334
+      - serializedVersion: 3
+        time: 1
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0.33333334
+        outWeight: 0.33333334
+      m_PreInfinity: 2
+      m_PostInfinity: 2
+      m_RotationOrder: 4
+    minCurve:
+      serializedVersion: 2
+      m_Curve:
+      - serializedVersion: 3
+        time: 0
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0.33333334
+        outWeight: 0.33333334
+      - serializedVersion: 3
+        time: 1
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0.33333334
+        outWeight: 0.33333334
+      m_PreInfinity: 2
+      m_PostInfinity: 2
+      m_RotationOrder: 4
+  moveWithTransform: 0
+  moveWithCustomTransform: {fileID: 0}
+  scalingMode: 1
+  randomSeed: 0
+  InitialModule:
+    serializedVersion: 3
+    enabled: 1
+    startLifetime:
+      serializedVersion: 2
+      minMaxState: 3
+      scalar: 1
+      minScalar: 0.5
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    startSpeed:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 5
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    startColor:
+      serializedVersion: 2
+      minMaxState: 0
+      minColor: {r: 1, g: 1, b: 1, a: 1}
+      maxColor: {r: 0, g: 0, b: 0, a: 1}
+      maxGradient:
+        serializedVersion: 2
+        key0: {r: 1, g: 1, b: 1, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 0, g: 0, b: 0, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 0
+        ctime1: 65535
+        ctime2: 0
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 65535
+        atime2: 0
+        atime3: 0
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 2
+      minGradient:
+        serializedVersion: 2
+        key0: {r: 1, g: 1, b: 1, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 0, g: 0, b: 0, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 0
+        ctime1: 65535
+        ctime2: 0
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 65535
+        atime2: 0
+        atime3: 0
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 2
+    startSize:
+      serializedVersion: 2
+      minMaxState: 3
+      scalar: 8
+      minScalar: 4
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    startSizeY:
+      serializedVersion: 2
+      minMaxState: 3
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    startSizeZ:
+      serializedVersion: 2
+      minMaxState: 3
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    startRotationX:
+      serializedVersion: 2
+      minMaxState: 3
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    startRotationY:
+      serializedVersion: 2
+      minMaxState: 3
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    startRotation:
+      serializedVersion: 2
+      minMaxState: 3
+      scalar: 6.283185
+      minScalar: -6.283185
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    randomizeRotationDirection: 0
+    maxNumParticles: 1000
+    customEmitterVelocity: {x: 0, y: 0, z: 0}
+    size3D: 0
+    rotation3D: 0
+    gravityModifier:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+  ShapeModule:
+    serializedVersion: 6
+    enabled: 1
+    type: 0
+    angle: 25
+    length: 5
+    boxThickness: {x: 0, y: 0, z: 0}
+    radiusThickness: 1
+    donutRadius: 0.2
+    m_Position: {x: 0, y: 0, z: 0}
+    m_Rotation: {x: 0, y: 0, z: 0}
+    m_Scale: {x: 1, y: 1, z: 1}
+    placementMode: 0
+    m_MeshMaterialIndex: 0
+    m_MeshNormalOffset: 0
+    m_MeshSpawn:
+      mode: 0
+      spread: 0
+      speed:
+        serializedVersion: 2
+        minMaxState: 0
+        scalar: 1
+        minScalar: 1
+        maxCurve:
+          serializedVersion: 2
+          m_Curve:
+          - serializedVersion: 3
+            time: 0
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0.33333334
+            outWeight: 0.33333334
+          - serializedVersion: 3
+            time: 1
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0.33333334
+            outWeight: 0.33333334
+          m_PreInfinity: 2
+          m_PostInfinity: 2
+          m_RotationOrder: 4
+        minCurve:
+          serializedVersion: 2
+          m_Curve:
+          - serializedVersion: 3
+            time: 0
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0.33333334
+            outWeight: 0.33333334
+          - serializedVersion: 3
+            time: 1
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0.33333334
+            outWeight: 0.33333334
+          m_PreInfinity: 2
+          m_PostInfinity: 2
+          m_RotationOrder: 4
+    m_Mesh: {fileID: 0}
+    m_MeshRenderer: {fileID: 0}
+    m_SkinnedMeshRenderer: {fileID: 0}
+    m_Sprite: {fileID: 0}
+    m_SpriteRenderer: {fileID: 0}
+    m_UseMeshMaterialIndex: 0
+    m_UseMeshColors: 1
+    alignToDirection: 0
+    m_Texture: {fileID: 0}
+    m_TextureClipChannel: 3
+    m_TextureClipThreshold: 0
+    m_TextureUVChannel: 0
+    m_TextureColorAffectsParticles: 1
+    m_TextureAlphaAffectsParticles: 1
+    m_TextureBilinearFiltering: 0
+    randomDirectionAmount: 0
+    sphericalDirectionAmount: 0
+    randomPositionAmount: 0
+    radius:
+      value: 0.35
+      mode: 0
+      spread: 0
+      speed:
+        serializedVersion: 2
+        minMaxState: 0
+        scalar: 1
+        minScalar: 1
+        maxCurve:
+          serializedVersion: 2
+          m_Curve:
+          - serializedVersion: 3
+            time: 0
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0.33333334
+            outWeight: 0.33333334
+          - serializedVersion: 3
+            time: 1
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0.33333334
+            outWeight: 0.33333334
+          m_PreInfinity: 2
+          m_PostInfinity: 2
+          m_RotationOrder: 4
+        minCurve:
+          serializedVersion: 2
+          m_Curve:
+          - serializedVersion: 3
+            time: 0
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0.33333334
+            outWeight: 0.33333334
+          - serializedVersion: 3
+            time: 1
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0.33333334
+            outWeight: 0.33333334
+          m_PreInfinity: 2
+          m_PostInfinity: 2
+          m_RotationOrder: 4
+    arc:
+      value: 360
+      mode: 0
+      spread: 0
+      speed:
+        serializedVersion: 2
+        minMaxState: 0
+        scalar: 1
+        minScalar: 1
+        maxCurve:
+          serializedVersion: 2
+          m_Curve:
+          - serializedVersion: 3
+            time: 0
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0.33333334
+            outWeight: 0.33333334
+          - serializedVersion: 3
+            time: 1
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0.33333334
+            outWeight: 0.33333334
+          m_PreInfinity: 2
+          m_PostInfinity: 2
+          m_RotationOrder: 4
+        minCurve:
+          serializedVersion: 2
+          m_Curve:
+          - serializedVersion: 3
+            time: 0
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0.33333334
+            outWeight: 0.33333334
+          - serializedVersion: 3
+            time: 1
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0.33333334
+            outWeight: 0.33333334
+          m_PreInfinity: 2
+          m_PostInfinity: 2
+          m_RotationOrder: 4
+  EmissionModule:
+    enabled: 1
+    serializedVersion: 4
+    rateOverTime:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 10
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    rateOverDistance:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    m_BurstCount: 1
+    m_Bursts:
+    - serializedVersion: 2
+      time: 0
+      countCurve:
+        serializedVersion: 2
+        minMaxState: 0
+        scalar: 3
+        minScalar: 30
+        maxCurve:
+          serializedVersion: 2
+          m_Curve:
+          - serializedVersion: 3
+            time: 0
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0
+            outWeight: 0
+          - serializedVersion: 3
+            time: 1
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0
+            outWeight: 0
+          m_PreInfinity: 2
+          m_PostInfinity: 2
+          m_RotationOrder: 4
+        minCurve:
+          serializedVersion: 2
+          m_Curve:
+          - serializedVersion: 3
+            time: 0
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0
+            outWeight: 0
+          - serializedVersion: 3
+            time: 1
+            value: 1
+            inSlope: 0
+            outSlope: 0
+            tangentMode: 0
+            weightedMode: 0
+            inWeight: 0
+            outWeight: 0
+          m_PreInfinity: 2
+          m_PostInfinity: 2
+          m_RotationOrder: 4
+      cycleCount: 5
+      repeatInterval: 0.01
+      probability: 1
+  SizeModule:
+    enabled: 0
+    curve:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0
+          outWeight: 0
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 2
+          outSlope: 2
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0
+          outWeight: 0
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    y:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 1
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    z:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 1
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    separateAxes: 0
+  RotationModule:
+    enabled: 0
+    x:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    y:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    curve:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0.7853982
+      minScalar: 0.7853982
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    separateAxes: 0
+  ColorModule:
+    enabled: 1
+    gradient:
+      serializedVersion: 2
+      minMaxState: 1
+      minColor: {r: 1, g: 1, b: 1, a: 1}
+      maxColor: {r: 1, g: 1, b: 1, a: 1}
+      maxGradient:
+        serializedVersion: 2
+        key0: {r: 0, g: 0, b: 0, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 1, g: 1, b: 1, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 42598
+        ctime1: 65535
+        ctime2: 65535
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 47995
+        atime2: 65535
+        atime3: 65535
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 3
+      minGradient:
+        serializedVersion: 2
+        key0: {r: 1, g: 1, b: 1, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 0, g: 0, b: 0, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 0
+        ctime1: 65535
+        ctime2: 0
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 65535
+        atime2: 0
+        atime3: 0
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 2
+  UVModule:
+    serializedVersion: 2
+    enabled: 1
+    mode: 0
+    timeMode: 0
+    fps: 30
+    frameOverTime:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 0.9999
+      minScalar: 0.9999
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 1
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    startFrame:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    speedRange: {x: 0, y: 1}
+    tilesX: 6
+    tilesY: 6
+    animationType: 0
+    rowIndex: 0
+    cycles: 1
+    uvChannelMask: -1
+    rowMode: 1
+    sprites:
+    - sprite: {fileID: 0}
+    flipU: 0
+    flipV: 0
+  VelocityModule:
+    enabled: 0
+    x:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    y:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    z:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    orbitalX:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    orbitalY:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    orbitalZ:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    orbitalOffsetX:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    orbitalOffsetY:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    orbitalOffsetZ:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    radial:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    speedModifier:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    inWorldSpace: 0
+  InheritVelocityModule:
+    enabled: 0
+    m_Mode: 0
+    m_Curve:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+  LifetimeByEmitterSpeedModule:
+    enabled: 0
+    m_Curve:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: -0.8
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0.2
+          inSlope: -0.8
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    m_Range: {x: 0, y: 1}
+  ForceModule:
+    enabled: 0
+    x:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 1
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    y:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 10
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    z:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 1
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    inWorldSpace: 0
+    randomizePerFrame: 0
+  ExternalForcesModule:
+    serializedVersion: 2
+    enabled: 0
+    multiplierCurve:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    influenceFilter: 0
+    influenceMask:
+      serializedVersion: 2
+      m_Bits: 4294967295
+    influenceList: []
+  ClampVelocityModule:
+    enabled: 0
+    x:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    y:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    z:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    magnitude:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    separateAxis: 0
+    inWorldSpace: 0
+    multiplyDragByParticleSize: 1
+    multiplyDragByParticleVelocity: 1
+    dampen: 0
+    drag:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+  NoiseModule:
+    enabled: 0
+    strength:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    strengthY:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    strengthZ:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    separateAxes: 0
+    frequency: 0.5
+    damping: 1
+    octaves: 1
+    octaveMultiplier: 0.5
+    octaveScale: 2
+    quality: 2
+    scrollSpeed:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    remap:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: -1
+          inSlope: 0
+          outSlope: 2
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 2
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    remapY:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: -1
+          inSlope: 0
+          outSlope: 2
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 2
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    remapZ:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: -1
+          inSlope: 0
+          outSlope: 2
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 2
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    remapEnabled: 0
+    positionAmount:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    rotationAmount:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    sizeAmount:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+  SizeBySpeedModule:
+    enabled: 0
+    curve:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 1
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    y:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 1
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    z:
+      serializedVersion: 2
+      minMaxState: 1
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 1
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 1
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    range: {x: 0, y: 1}
+    separateAxes: 0
+  RotationBySpeedModule:
+    enabled: 0
+    x:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    y:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    curve:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0.7853982
+      minScalar: 0.7853982
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    separateAxes: 0
+    range: {x: 0, y: 1}
+  ColorBySpeedModule:
+    enabled: 0
+    gradient:
+      serializedVersion: 2
+      minMaxState: 1
+      minColor: {r: 1, g: 1, b: 1, a: 1}
+      maxColor: {r: 1, g: 1, b: 1, a: 1}
+      maxGradient:
+        serializedVersion: 2
+        key0: {r: 1, g: 1, b: 1, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 0, g: 0, b: 0, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 0
+        ctime1: 65535
+        ctime2: 0
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 65535
+        atime2: 0
+        atime3: 0
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 2
+      minGradient:
+        serializedVersion: 2
+        key0: {r: 1, g: 1, b: 1, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 0, g: 0, b: 0, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 0
+        ctime1: 65535
+        ctime2: 0
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 65535
+        atime2: 0
+        atime3: 0
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 2
+    range: {x: 0, y: 1}
+  CollisionModule:
+    enabled: 0
+    serializedVersion: 4
+    type: 0
+    collisionMode: 0
+    colliderForce: 0
+    multiplyColliderForceByParticleSize: 0
+    multiplyColliderForceByParticleSpeed: 0
+    multiplyColliderForceByCollisionAngle: 1
+    m_Planes: []
+    m_Dampen:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    m_Bounce:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    m_EnergyLossOnCollision:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    minKillSpeed: 0
+    maxKillSpeed: 10000
+    radiusScale: 1
+    collidesWith:
+      serializedVersion: 2
+      m_Bits: 4294967295
+    maxCollisionShapes: 256
+    quality: 0
+    voxelSize: 0.5
+    collisionMessages: 0
+    collidesWithDynamic: 1
+    interiorCollisions: 0
+  TriggerModule:
+    enabled: 0
+    serializedVersion: 2
+    inside: 1
+    outside: 0
+    enter: 0
+    exit: 0
+    colliderQueryMode: 0
+    radiusScale: 1
+    primitives: []
+  SubModule:
+    serializedVersion: 2
+    enabled: 0
+    subEmitters:
+    - serializedVersion: 3
+      emitter: {fileID: 0}
+      type: 0
+      properties: 0
+      emitProbability: 1
+  LightsModule:
+    enabled: 0
+    ratio: 0.18
+    light: {fileID: 0}
+    randomDistribution: 1
+    color: 1
+    range: 1
+    intensity: 1
+    rangeCurve:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    intensityCurve:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 4
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    maxLights: 1
+  TrailModule:
+    enabled: 0
+    mode: 0
+    ratio: 1
+    lifetime:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    minVertexDistance: 0.2
+    textureMode: 0
+    ribbonCount: 1
+    shadowBias: 0.5
+    worldSpace: 0
+    dieWithParticles: 1
+    sizeAffectsWidth: 1
+    sizeAffectsLifetime: 0
+    inheritParticleColor: 1
+    generateLightingData: 0
+    splitSubEmitterRibbons: 0
+    attachRibbonsToTransform: 0
+    colorOverLifetime:
+      serializedVersion: 2
+      minMaxState: 0
+      minColor: {r: 1, g: 1, b: 1, a: 1}
+      maxColor: {r: 1, g: 1, b: 1, a: 1}
+      maxGradient:
+        serializedVersion: 2
+        key0: {r: 1, g: 1, b: 1, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 0, g: 0, b: 0, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 0
+        ctime1: 65535
+        ctime2: 0
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 65535
+        atime2: 0
+        atime3: 0
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 2
+      minGradient:
+        serializedVersion: 2
+        key0: {r: 1, g: 1, b: 1, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 0, g: 0, b: 0, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 0
+        ctime1: 65535
+        ctime2: 0
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 65535
+        atime2: 0
+        atime3: 0
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 2
+    widthOverTrail:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 1
+      minScalar: 1
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 1
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    colorOverTrail:
+      serializedVersion: 2
+      minMaxState: 0
+      minColor: {r: 1, g: 1, b: 1, a: 1}
+      maxColor: {r: 1, g: 1, b: 1, a: 1}
+      maxGradient:
+        serializedVersion: 2
+        key0: {r: 1, g: 1, b: 1, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 0, g: 0, b: 0, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 0
+        ctime1: 65535
+        ctime2: 0
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 65535
+        atime2: 0
+        atime3: 0
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 2
+      minGradient:
+        serializedVersion: 2
+        key0: {r: 1, g: 1, b: 1, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 0, g: 0, b: 0, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 0
+        ctime1: 65535
+        ctime2: 0
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 65535
+        atime2: 0
+        atime3: 0
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 2
+  CustomDataModule:
+    enabled: 0
+    mode0: 0
+    vectorComponentCount0: 4
+    color0:
+      serializedVersion: 2
+      minMaxState: 0
+      minColor: {r: 1, g: 1, b: 1, a: 1}
+      maxColor: {r: 1, g: 1, b: 1, a: 1}
+      maxGradient:
+        serializedVersion: 2
+        key0: {r: 1, g: 1, b: 1, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 0, g: 0, b: 0, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 0
+        ctime1: 65535
+        ctime2: 0
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 65535
+        atime2: 0
+        atime3: 0
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 2
+      minGradient:
+        serializedVersion: 2
+        key0: {r: 1, g: 1, b: 1, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 0, g: 0, b: 0, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 0
+        ctime1: 65535
+        ctime2: 0
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 65535
+        atime2: 0
+        atime3: 0
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 2
+    colorLabel0: Color
+    vector0_0:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    vectorLabel0_0: X
+    vector0_1:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    vectorLabel0_1: Y
+    vector0_2:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    vectorLabel0_2: Z
+    vector0_3:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    vectorLabel0_3: W
+    mode1: 0
+    vectorComponentCount1: 4
+    color1:
+      serializedVersion: 2
+      minMaxState: 0
+      minColor: {r: 1, g: 1, b: 1, a: 1}
+      maxColor: {r: 1, g: 1, b: 1, a: 1}
+      maxGradient:
+        serializedVersion: 2
+        key0: {r: 1, g: 1, b: 1, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 0, g: 0, b: 0, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 0
+        ctime1: 65535
+        ctime2: 0
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 65535
+        atime2: 0
+        atime3: 0
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 2
+      minGradient:
+        serializedVersion: 2
+        key0: {r: 1, g: 1, b: 1, a: 1}
+        key1: {r: 1, g: 1, b: 1, a: 1}
+        key2: {r: 0, g: 0, b: 0, a: 0}
+        key3: {r: 0, g: 0, b: 0, a: 0}
+        key4: {r: 0, g: 0, b: 0, a: 0}
+        key5: {r: 0, g: 0, b: 0, a: 0}
+        key6: {r: 0, g: 0, b: 0, a: 0}
+        key7: {r: 0, g: 0, b: 0, a: 0}
+        ctime0: 0
+        ctime1: 65535
+        ctime2: 0
+        ctime3: 0
+        ctime4: 0
+        ctime5: 0
+        ctime6: 0
+        ctime7: 0
+        atime0: 0
+        atime1: 65535
+        atime2: 0
+        atime3: 0
+        atime4: 0
+        atime5: 0
+        atime6: 0
+        atime7: 0
+        m_Mode: 0
+        m_NumColorKeys: 2
+        m_NumAlphaKeys: 2
+    colorLabel1: Color
+    vector1_0:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    vectorLabel1_0: X
+    vector1_1:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    vectorLabel1_1: Y
+    vector1_2:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    vectorLabel1_2: Z
+    vector1_3:
+      serializedVersion: 2
+      minMaxState: 0
+      scalar: 0
+      minScalar: 0
+      maxCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+      minCurve:
+        serializedVersion: 2
+        m_Curve:
+        - serializedVersion: 3
+          time: 0
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        - serializedVersion: 3
+          time: 1
+          value: 0
+          inSlope: 0
+          outSlope: 0
+          tangentMode: 0
+          weightedMode: 0
+          inWeight: 0.33333334
+          outWeight: 0.33333334
+        m_PreInfinity: 2
+        m_PostInfinity: 2
+        m_RotationOrder: 4
+    vectorLabel1_3: W
+--- !u!199 &5708224531665990525
+ParticleSystemRenderer:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5487844413025695174}
+  m_Enabled: 1
+  m_CastShadows: 0
+  m_ReceiveShadows: 0
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 0
+  m_ReflectionProbeUsage: 0
+  m_RayTracingMode: 0
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: cfeac59cdf62b9e4e8de566ee907f658, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 2
+  m_RenderMode: 0
+  m_MeshDistribution: 0
+  m_SortMode: 1
+  m_MinParticleSize: 0
+  m_MaxParticleSize: 5
+  m_CameraVelocityScale: 0
+  m_VelocityScale: 0
+  m_LengthScale: 2
+  m_SortingFudge: 0
+  m_NormalDirection: 1
+  m_ShadowBias: 0
+  m_RenderAlignment: 0
+  m_Pivot: {x: 0, y: 0, z: 0}
+  m_Flip: {x: 0, y: 0, z: 0}
+  m_UseCustomVertexStreams: 1
+  m_EnableGPUInstancing: 1
+  m_ApplyActiveColorSpace: 0
+  m_AllowRoll: 1
+  m_FreeformStretching: 0
+  m_RotateWithStretchDirection: 1
+  m_VertexStreams: 0003040508
+  m_Mesh: {fileID: 0}
+  m_Mesh1: {fileID: 0}
+  m_Mesh2: {fileID: 0}
+  m_Mesh3: {fileID: 0}
+  m_MeshWeighting: 1
+  m_MeshWeighting1: 1
+  m_MeshWeighting2: 1
+  m_MeshWeighting3: 1
+  m_MaskInteraction: 0
diff --git a/com.saab.map-streamer/package.json.meta b/Assets/partical/explosion.prefab.meta
similarity index 60%
rename from com.saab.map-streamer/package.json.meta
rename to Assets/partical/explosion.prefab.meta
index d693a8af..f6eb8fce 100644
--- a/com.saab.map-streamer/package.json.meta
+++ b/Assets/partical/explosion.prefab.meta
@@ -1,6 +1,6 @@
 fileFormatVersion: 2
-guid: 1af522d2c7b42ab4aa58c80d7227b4dd
-PackageManifestImporter:
+guid: bcc3686037e169a4991ff3ed36d32ec0
+PrefabImporter:
   externalObjects: {}
   userData: 
   assetBundleName: 
diff --git a/Build_x64.bat b/Build_x64.bat
deleted file mode 100644
index d54f7f85..00000000
--- a/Build_x64.bat
+++ /dev/null
@@ -1,53 +0,0 @@
-@echo off
-
-REM Set the root directory to start the search. Change the path as needed.
-set ROOT_DIR=com.saab.map-streamer
-for /r "%ROOT_DIR%" %%i in (*.dll) do (
-        echo Deleting: %%i
-        del "%%i"
-)
-
-REM Define variables
-set SOLUTION_PATH=%~dp0vs17\Install_Gizmo\Install_Gizmo.sln
-echo Solution file path: %SOLUTION_PATH%
-set PLATFORM=x64
-
-REM Define MSBuild path variable
-SET "MSBUILD_PATH="
-
-REM Define the path to vswhere.exe, adjust this to your installation of Visual Studio
-SET "VSWHERE_PATH=C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"
-
-REM Use FOR /F to capture the output of vswhere.exe directly into the MSBUILD_PATH variable
-FOR /F "usebackq tokens=*" %%F IN (`"%VSWHERE_PATH%" -latest -requires Microsoft.Component.MSBuild -property installationPath`) DO (
-    SET "MSBUILD_PATH=%%F\MSBuild\Current\Bin\amd64\msbuild.exe"
-)
-
-REM Check if MSBuild path was found and if so, print it
-IF DEFINED MSBUILD_PATH (
-    ECHO MSBUILD file path: %MSBUILD_PATH%
-) ELSE (
-    ECHO MSBuild was not found. Please make sure you have Visual Studio installed.
-    EXIT /B 1
-)
-
-REM Restore NuGets
-echo Restoring NuGet packages for the solution: %SOLUTION_PATH%
-"%MSBUILD_PATH%" "%SOLUTION_PATH%" /t:Restore /p:RestorePackagesConfig=true
-
-REM Check if the NuGet restore was successful
-IF %ERRORLEVEL% EQU 0 (
-    ECHO NuGet packages were successfully restored.
-) ELSE (
-    ECHO Error occurred during NuGet package restoration.
-    EXIT /B 1
-)
-
-REM Build the solution for Release configuration
-"%MSBUILD_PATH%" "%SOLUTION_PATH%" /t:Clean;Build /p:Configuration=Release /p:Platform=%PLATFORM%
-
-if errorlevel 1 (
-    echo Build failed for Release with exit code %errorlevel%
-    exit /b %errorlevel%
-)
-echo Build succeeded for Release
\ No newline at end of file
diff --git a/Build_x64_d.bat b/Build_x64_d.bat
deleted file mode 100644
index 3696a06f..00000000
--- a/Build_x64_d.bat
+++ /dev/null
@@ -1,53 +0,0 @@
-@echo off
-
-REM Set the root directory to start the search. Change the path as needed.
-set ROOT_DIR=com.saab.map-streamer
-for /r "%ROOT_DIR%" %%i in (*.dll) do (
-        echo Deleting: %%i
-        del "%%i"
-)
-
-REM Define variables
-set SOLUTION_PATH=%~dp0vs17\Install_Gizmo\Install_Gizmo.sln
-echo Solution file path: %SOLUTION_PATH%
-set PLATFORM=x64
-
-REM Define MSBuild path variable
-SET "MSBUILD_PATH="
-
-REM Define the path to vswhere.exe, adjust this to your installation of Visual Studio
-SET "VSWHERE_PATH=C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"
-
-REM Use FOR /F to capture the output of vswhere.exe directly into the MSBUILD_PATH variable
-FOR /F "usebackq tokens=*" %%F IN (`"%VSWHERE_PATH%" -latest -requires Microsoft.Component.MSBuild -property installationPath`) DO (
-    SET "MSBUILD_PATH=%%F\MSBuild\Current\Bin\amd64\msbuild.exe"
-)
-
-REM Check if MSBuild path was found and if so, print it
-IF DEFINED MSBUILD_PATH (
-    ECHO MSBUILD file path: %MSBUILD_PATH%
-) ELSE (
-    ECHO MSBuild was not found. Please make sure you have Visual Studio installed.
-    EXIT /B 1
-)
-
-REM Restore NuGets
-echo Restoring NuGet packages for the solution: %SOLUTION_PATH%
-"%MSBUILD_PATH%" "%SOLUTION_PATH%" /t:Restore /p:RestorePackagesConfig=true
-
-REM Check if the NuGet restore was successful
-IF %ERRORLEVEL% EQU 0 (
-    ECHO NuGet packages were successfully restored.
-) ELSE (
-    ECHO Error occurred during NuGet package restoration.
-    EXIT /B 1
-)
-
-REM Build the solution for Debug configuration
-"%MSBUILD_PATH%" "%SOLUTION_PATH%" /t:Clean;Build /p:Configuration=Debug /p:Platform=%PLATFORM%
-
-if errorlevel 1 (
-    echo Build failed for Debug with exit code %errorlevel%
-    exit /b %errorlevel%
-)
-echo Build succeeded for Debug
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 8083ef8d..00000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,73 +0,0 @@
-# Changelog
-
-All notable changes to this project shall be documented in this file.
-
-The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
-described with adjustments and template in [TSWiki](https://tswiki.corp.saab.se/CHANGELOG.md_Windows_%26_Apps).
-
-## 4.3
-
-### Changed
-
-- Updated to GizmoSDK 2.12.254.1
-
-## 4.2
-
-### Changed
-
-- Updated to GizmoSDK 2.12.230.1
-
-### Fixed
-
-- Fix restore NuGets in local scripts
-
-## 4.1
-
-### Added
-- Shared materials
-- Simple water shading
-
-### Changed
-- Improved foliage culling
-- Better random function in shader
-
-### Fixed
-- hueshift breaking at white/black
-- Wrong foliage placement between Lods
-- ETC2 maps crash
-
-## 4.0
-
-### Added
-- new TerrainShader (with embedded support)
-- Added support for map assets (instancing)
-
-### Removed
-- Removed instrumentation code
-
-### Changed
-- GizmoSDK 2.12.185.1
-- Resources are now released explicitly
-
-### Fixed
-- Various performance/memory fixes for Foliage
-- Improved functionality for builders
-- Lots of generic fixes and improvements
-
-## 1.2
-
-### Changed
-- Updated gizmo to 2.12.143
-- Replaced old vertex/index Buffers with GraphicsBuffer to avoid copying data from gpu to cpu.
-
-## 1.1
-
-### Added
-- Added a new FeatureMap that should be shared independent on loaded map.
-- New module (SkyModule) that handles skybox and more correct ambient light.
-
-### Changed
-- Updated gizmo to 2.13.132.
-
-### Fixed
-- Fixed/improved occlusion culling for foliage.
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index a50cc290..00000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# How to contribute to an Inner Source project or repository
-For smoothest onboarding process, please read through the instructions in this document before you try do your first commit or pull request.
-
-## Prerequisites
-1. You need to have a GitHub account to github.saab.se, which can be requested from [ServiceHub](https://servicehub.saabgroup.com/esc?id=sc_cat_item&table=sc_cat_item&sys_id=1ff61bf4a9fed11045ed9f84a564c0c3)
-2. Once you have an account, reach out to our [Mattermost channel](https://mattermost.corp.saab.se/saab/channels/dev-gizmosdk) and ask for your AD user name to be added as a member to Inner Source organization.
-3. If you haven't already, we recommend setting up a development environment.
-4. Before starting to contribute, it is highly recommended to discuss the topic on which you wish contribute through for example Mattermost. It will give us, the maintainers, a head's up and we and others can also provide valuable info to aid you in your contribution.
-
-## Contributing on an existing repository
-Start by [forking the repository](https://docs.github.com/en/get-started/quickstart/fork-a-repo) you wish to contribute to, and make your changes locally. Contributes to existing repositories are done through Pull Requests. So when you're done with your changes and have committed them to your fork, it's time to do a [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork) back to the original repository. One or more maintainers will have a look at your PR and either reject with comments or approve it before it can be merged to the original repository.
-For faster approval, it's always wise to have an ongoing discussion about the wanted changes in Mattermost, and ping the maintainers once the PR is ready to be reviewed.
-
-## Contributing with a new repository
-If you want to start up a brand new functionality/add-on or a support library, creating a new repository (based on this template repository, see [README.md](README.md) for instructions) is the best way. You will then be the owner of the repository, and can decide on who can contribute, and how they should do it, but we recommend you stick to the same rules as laid out above.
diff --git a/Clean.bat b/Clean.bat
deleted file mode 100644
index 4d6e4523..00000000
--- a/Clean.bat
+++ /dev/null
@@ -1,10 +0,0 @@
-@echo off
-
-REM Set the root directory to start the search. Change the path as needed.
-set ROOT_DIR=com.saab.map-streamer
-for /r "%ROOT_DIR%" %%i in (*.dll) do (
-        echo Deleting: %%i
-        del "%%i"
-)
-
-echo Cleaned for BTA
\ No newline at end of file
diff --git a/InstallPackages/InstallPackages.sln b/InstallPackages/InstallPackages.sln
new file mode 100644
index 00000000..4b2f13c4
--- /dev/null
+++ b/InstallPackages/InstallPackages.sln
@@ -0,0 +1,43 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.31205.134
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InstallPackages", "InstallPackages\InstallPackages.csproj", "{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|ARM = Debug|ARM
+		Debug|ARM64 = Debug|ARM64
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|ARM = Release|ARM
+		Release|ARM64 = Release|ARM64
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Debug|ARM.ActiveCfg = Debug|ARM
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Debug|ARM.Build.0 = Debug|ARM
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Debug|ARM64.ActiveCfg = Debug|ARM64
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Debug|ARM64.Build.0 = Debug|ARM64
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Debug|x64.ActiveCfg = Debug|x64
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Debug|x64.Build.0 = Debug|x64
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Debug|x86.ActiveCfg = Debug|x64
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Debug|x86.Build.0 = Debug|x64
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Release|ARM.ActiveCfg = Release|ARM
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Release|ARM.Build.0 = Release|ARM
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Release|ARM64.ActiveCfg = Release|ARM64
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Release|ARM64.Build.0 = Release|ARM64
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Release|x64.ActiveCfg = Release|x64
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Release|x64.Build.0 = Release|x64
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Release|x86.ActiveCfg = Release|x86
+		{5C1914BC-F43B-4CF6-9B2A-60BC75B006C0}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {97E92766-88BB-45BF-9D3B-FC202DF2034F}
+	EndGlobalSection
+EndGlobal
diff --git a/InstallPackages/InstallPackages/InstallPackages.csproj b/InstallPackages/InstallPackages/InstallPackages.csproj
new file mode 100644
index 00000000..049a7a84
--- /dev/null
+++ b/InstallPackages/InstallPackages/InstallPackages.csproj
@@ -0,0 +1,47 @@
+﻿<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <Platforms>x64;x86;ARM;ARM64</Platforms>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <OutputPath>..\..\Assets\Plugins\x64\</OutputPath>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <OutputPath>..\..\Assets\Plugins\x64\</OutputPath>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'">
+    <OutputPath>..\..\Assets\Plugins\x86\</OutputPath>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
+    <OutputPath>..\..\Assets\Plugins\x86\</OutputPath>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+    <OutputPath>..\..\Assets\Plugins\ARM\</OutputPath>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+    <OutputPath>..\..\Assets\Plugins\ARM\</OutputPath>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+    <OutputPath>..\..\Assets\Plugins\ARM64\</OutputPath>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+    <OutputPath>..\..\Assets\Plugins\ARM64\</OutputPath>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Coordinate" Version="2.12.75.1" />
+    <PackageReference Include="Gizmo3D" Version="2.12.75.1" />
+    <PackageReference Include="GizmoBase" Version="2.12.75.1" />
+    <PackageReference Include="GizmoDistribution" Version="2.12.75.1" />
+  </ItemGroup>
+
+</Project>
diff --git a/vs17/Install_Gizmo/Install.cs b/InstallPackages/InstallPackages/Installer.cs
similarity index 85%
rename from vs17/Install_Gizmo/Install.cs
rename to InstallPackages/InstallPackages/Installer.cs
index 5e40a478..5fa22976 100644
--- a/vs17/Install_Gizmo/Install.cs
+++ b/InstallPackages/InstallPackages/Installer.cs
@@ -1,8 +1,8 @@
 ﻿using System;
 
-namespace Install_Gizmo
+namespace InstallPackages
 {
-    public class Install
+    public class Installer
     {
         public void InstallLibraries()
         {
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index f9dc7986..00000000
--- a/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-Saab inner source license version 1.0 (SISL1.0):
-
-Copyright (C) <YEAR(s)>, <OWNER(s)>.
-All rights reserved.
-
-Companies within the Saab group may, without cost, use, copy, merge, modify,
-distribute, sublicense and/or sell copies of this software asset as a
-stand-alone component and/or part of Saab products.
-
-The software asset may contain and/or depend on third party components and/or
-components funded entirely or partly by third party and/or open source software
-components for which third party’s terms and conditions and/or open source
-software license apply.
-
-THE SOFTWARE ASSET IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE ASSET OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE ASSET.
-
-The above copyright notice, permission notice, disclaimer and this license
-condition shall be included in all copies or substantial portions of the
-software asset.
diff --git a/LICENSE.txt b/LICENSE.txt
deleted file mode 100644
index 37dd1fd7..00000000
--- a/LICENSE.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-//*****************************************************************************
-//
-// Copyright (C) SAAB AB
-//
-// All rights, including the copyright, to the computer program(s)
-// herein belong to SAAB AB. The program(s) may be used and/or
-// copied only with the written permission of SAAB AB, or in
-// accordance with the terms and conditions stipulated in the
-// agreement/contract under which the program(s) have been
-// supplied.
-//
-// Use, copying, merging and distribution of this component, with or
-// without modification, is permitted within Saab group without cost.
-//
-// Distribution and use of this component within sold Saab products
-// is permitted.
-// 
-// The component may depend on third party components for which the
-// third party's terms and conditions and/or open source software
-// licenses will apply. License terms, notices, and acknowledgements,
-// if any, for the third party components is found in 3PPLicenses.txt.
-// 
-// The above copyright and notices as well as the disclaimer below
-// must be retained in sources.
-// 
-// THE COMPONENT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE COMPONENT OR THE USE OR OTHER
-// DEALINGS IN THE COMPONENT.
-//
-// Information Class:	COMPANY UNCLASSIFIED
-// Defence Secrecy:		NOT CLASSIFIED
-// Export Control:		NOT EXPORT CONTROLLED
-//
-//*****************************************************************************
\ No newline at end of file
diff --git a/projects/com.saab.map-streamer/Packages/manifest.json b/Packages/manifest.json
similarity index 81%
rename from projects/com.saab.map-streamer/Packages/manifest.json
rename to Packages/manifest.json
index 6267c64b..55c8a5d4 100644
--- a/projects/com.saab.map-streamer/Packages/manifest.json
+++ b/Packages/manifest.json
@@ -1,16 +1,10 @@
 {
   "dependencies": {
-    "com.saab.map-streamer": "file:../../../com.saab.map-streamer",
-    "com.unity.collab-proxy": "1.17.7",
-    "com.unity.feature.development": "1.0.1",
-    "com.unity.ide.rider": "3.0.18",
     "com.unity.ide.visualstudio": "2.0.17",
     "com.unity.ide.vscode": "1.2.5",
-    "com.unity.test-framework": "1.1.31",
+    "com.unity.postprocessing": "3.2.2",
     "com.unity.textmeshpro": "3.0.6",
-    "com.unity.timeline": "1.6.4",
-    "com.unity.ugui": "1.0.0",
-    "com.unity.visualscripting": "1.8.0",
+    "com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.4",
     "com.unity.modules.ai": "1.0.0",
     "com.unity.modules.androidjni": "1.0.0",
     "com.unity.modules.animation": "1.0.0",
diff --git a/projects/com.saab.map-streamer/Packages/packages-lock.json b/Packages/packages-lock.json
similarity index 76%
rename from projects/com.saab.map-streamer/Packages/packages-lock.json
rename to Packages/packages-lock.json
index e3865a97..21a46d1b 100644
--- a/projects/com.saab.map-streamer/Packages/packages-lock.json
+++ b/Packages/packages-lock.json
@@ -1,57 +1,12 @@
 {
   "dependencies": {
-    "com.saab.map-streamer": {
-      "version": "file:../../../com.saab.map-streamer",
-      "depth": 0,
-      "source": "local",
-      "dependencies": {}
-    },
-    "com.unity.collab-proxy": {
-      "version": "1.17.7",
-      "depth": 0,
-      "source": "registry",
-      "dependencies": {
-        "com.unity.services.core": "1.0.1"
-      },
-      "url": "https://packages.unity.com"
-    },
-    "com.unity.editorcoroutines": {
-      "version": "1.0.0",
-      "depth": 1,
-      "source": "registry",
-      "dependencies": {},
-      "url": "https://packages.unity.com"
-    },
     "com.unity.ext.nunit": {
       "version": "1.0.6",
-      "depth": 1,
+      "depth": 2,
       "source": "registry",
       "dependencies": {},
       "url": "https://packages.unity.com"
     },
-    "com.unity.feature.development": {
-      "version": "1.0.1",
-      "depth": 0,
-      "source": "builtin",
-      "dependencies": {
-        "com.unity.ide.visualstudio": "2.0.17",
-        "com.unity.ide.rider": "3.0.18",
-        "com.unity.ide.vscode": "1.2.5",
-        "com.unity.editorcoroutines": "1.0.0",
-        "com.unity.performance.profile-analyzer": "1.1.1",
-        "com.unity.test-framework": "1.1.31",
-        "com.unity.testtools.codecoverage": "1.2.2"
-      }
-    },
-    "com.unity.ide.rider": {
-      "version": "3.0.18",
-      "depth": 0,
-      "source": "registry",
-      "dependencies": {
-        "com.unity.ext.nunit": "1.0.6"
-      },
-      "url": "https://packages.unity.com"
-    },
     "com.unity.ide.visualstudio": {
       "version": "2.0.17",
       "depth": 0,
@@ -68,41 +23,34 @@
       "dependencies": {},
       "url": "https://packages.unity.com"
     },
-    "com.unity.nuget.newtonsoft-json": {
-      "version": "3.0.2",
-      "depth": 2,
+    "com.unity.postprocessing": {
+      "version": "3.2.2",
+      "depth": 0,
       "source": "registry",
-      "dependencies": {},
+      "dependencies": {
+        "com.unity.modules.physics": "1.0.0"
+      },
       "url": "https://packages.unity.com"
     },
-    "com.unity.performance.profile-analyzer": {
-      "version": "1.1.1",
+    "com.unity.sysroot": {
+      "version": "2.0.5",
       "depth": 1,
       "source": "registry",
       "dependencies": {},
       "url": "https://packages.unity.com"
     },
-    "com.unity.services.core": {
-      "version": "1.7.0",
+    "com.unity.sysroot.linux-x86_64": {
+      "version": "2.0.4",
       "depth": 1,
       "source": "registry",
       "dependencies": {
-        "com.unity.modules.unitywebrequest": "1.0.0",
-        "com.unity.nuget.newtonsoft-json": "3.0.2",
-        "com.unity.modules.androidjni": "1.0.0"
+        "com.unity.sysroot": "2.0.5"
       },
       "url": "https://packages.unity.com"
     },
-    "com.unity.settings-manager": {
-      "version": "1.0.3",
-      "depth": 2,
-      "source": "registry",
-      "dependencies": {},
-      "url": "https://packages.unity.com"
-    },
     "com.unity.test-framework": {
       "version": "1.1.31",
-      "depth": 0,
+      "depth": 1,
       "source": "registry",
       "dependencies": {
         "com.unity.ext.nunit": "1.0.6",
@@ -111,16 +59,6 @@
       },
       "url": "https://packages.unity.com"
     },
-    "com.unity.testtools.codecoverage": {
-      "version": "1.2.2",
-      "depth": 1,
-      "source": "registry",
-      "dependencies": {
-        "com.unity.test-framework": "1.0.16",
-        "com.unity.settings-manager": "1.0.1"
-      },
-      "url": "https://packages.unity.com"
-    },
     "com.unity.textmeshpro": {
       "version": "3.0.6",
       "depth": 0,
@@ -130,37 +68,25 @@
       },
       "url": "https://packages.unity.com"
     },
-    "com.unity.timeline": {
-      "version": "1.6.4",
+    "com.unity.toolchain.win-x86_64-linux-x86_64": {
+      "version": "2.0.4",
       "depth": 0,
       "source": "registry",
       "dependencies": {
-        "com.unity.modules.director": "1.0.0",
-        "com.unity.modules.animation": "1.0.0",
-        "com.unity.modules.audio": "1.0.0",
-        "com.unity.modules.particlesystem": "1.0.0"
+        "com.unity.sysroot": "2.0.5",
+        "com.unity.sysroot.linux-x86_64": "2.0.4"
       },
       "url": "https://packages.unity.com"
     },
     "com.unity.ugui": {
       "version": "1.0.0",
-      "depth": 0,
+      "depth": 1,
       "source": "builtin",
       "dependencies": {
         "com.unity.modules.ui": "1.0.0",
         "com.unity.modules.imgui": "1.0.0"
       }
     },
-    "com.unity.visualscripting": {
-      "version": "1.8.0",
-      "depth": 0,
-      "source": "registry",
-      "dependencies": {
-        "com.unity.ugui": "1.0.0",
-        "com.unity.modules.jsonserialize": "1.0.0"
-      },
-      "url": "https://packages.unity.com"
-    },
     "com.unity.modules.ai": {
       "version": "1.0.0",
       "depth": 0,
diff --git a/projects/com.saab.map-streamer/ProjectSettings/AudioManager.asset b/ProjectSettings/AudioManager.asset
similarity index 86%
rename from projects/com.saab.map-streamer/ProjectSettings/AudioManager.asset
rename to ProjectSettings/AudioManager.asset
index 07ebfb05..4f31e744 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/AudioManager.asset
+++ b/ProjectSettings/AudioManager.asset
@@ -3,7 +3,6 @@
 --- !u!11 &1
 AudioManager:
   m_ObjectHideFlags: 0
-  serializedVersion: 2
   m_Volume: 1
   Rolloff Scale: 1
   Doppler Factor: 1
@@ -16,4 +15,3 @@ AudioManager:
   m_AmbisonicDecoderPlugin: 
   m_DisableAudio: 0
   m_VirtualizeEffects: 1
-  m_RequestedDSPBufferSize: 1024
diff --git a/projects/com.saab.map-streamer/ProjectSettings/ClusterInputManager.asset b/ProjectSettings/ClusterInputManager.asset
similarity index 100%
rename from projects/com.saab.map-streamer/ProjectSettings/ClusterInputManager.asset
rename to ProjectSettings/ClusterInputManager.asset
diff --git a/projects/com.saab.map-streamer/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset
similarity index 83%
rename from projects/com.saab.map-streamer/ProjectSettings/DynamicsManager.asset
rename to ProjectSettings/DynamicsManager.asset
index cdc1f3ea..78992f08 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/DynamicsManager.asset
+++ b/ProjectSettings/DynamicsManager.asset
@@ -3,7 +3,7 @@
 --- !u!55 &1
 PhysicsManager:
   m_ObjectHideFlags: 0
-  serializedVersion: 11
+  serializedVersion: 7
   m_Gravity: {x: 0, y: -9.81, z: 0}
   m_DefaultMaterial: {fileID: 0}
   m_BounceThreshold: 2
@@ -19,8 +19,7 @@ PhysicsManager:
   m_ContactsGeneration: 1
   m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
   m_AutoSimulation: 1
-  m_AutoSyncTransforms: 0
-  m_ReuseCollisionCallbacks: 1
+  m_AutoSyncTransforms: 1
   m_ClothInterCollisionSettingsToggle: 0
   m_ContactPairsMode: 0
   m_BroadphaseType: 0
@@ -28,7 +27,3 @@ PhysicsManager:
     m_Center: {x: 0, y: 0, z: 0}
     m_Extent: {x: 250, y: 250, z: 250}
   m_WorldSubdivisions: 8
-  m_FrictionType: 0
-  m_EnableEnhancedDeterminism: 0
-  m_EnableUnifiedHeightmaps: 1
-  m_DefaultMaxAngluarSpeed: 7
diff --git a/projects/com.saab.map-streamer/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset
similarity index 55%
rename from projects/com.saab.map-streamer/ProjectSettings/EditorBuildSettings.asset
rename to ProjectSettings/EditorBuildSettings.asset
index 0147887e..d4a2af48 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/EditorBuildSettings.asset
+++ b/ProjectSettings/EditorBuildSettings.asset
@@ -4,5 +4,8 @@
 EditorBuildSettings:
   m_ObjectHideFlags: 0
   serializedVersion: 2
-  m_Scenes: []
+  m_Scenes:
+  - enabled: 1
+    path: Assets/Scenes/StreamingMaps.unity
+    guid: 99c9720ab356a0642a771bea13969a05
   m_configObjects: {}
diff --git a/projects/com.saab.map-streamer/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset
similarity index 72%
rename from projects/com.saab.map-streamer/ProjectSettings/EditorSettings.asset
rename to ProjectSettings/EditorSettings.asset
index 1e44a0a1..c8da44ea 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/EditorSettings.asset
+++ b/ProjectSettings/EditorSettings.asset
@@ -3,10 +3,10 @@
 --- !u!159 &1
 EditorSettings:
   m_ObjectHideFlags: 0
-  serializedVersion: 11
+  serializedVersion: 9
   m_ExternalVersionControlSupport: Visible Meta Files
   m_SerializationMode: 2
-  m_LineEndingsForNewScripts: 0
+  m_LineEndingsForNewScripts: 2
   m_DefaultBehaviorMode: 0
   m_PrefabRegularEnvironment: {fileID: 0}
   m_PrefabUIEnvironment: {fileID: 0}
@@ -16,7 +16,7 @@ EditorSettings:
   m_EtcTextureFastCompressor: 1
   m_EtcTextureNormalCompressor: 2
   m_EtcTextureBestCompressor: 4
-  m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref
+  m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp
   m_ProjectGenerationRootNamespace: 
   m_CollabEditorSettings:
     inProgressEnabled: 1
@@ -27,4 +27,9 @@ EditorSettings:
   m_EnterPlayModeOptions: 3
   m_ShowLightmapResolutionOverlay: 1
   m_UseLegacyProbeSampleCount: 0
-  m_SerializeInlineMappingsOnOneLine: 1
+  m_AssetPipelineMode: 1
+  m_CacheServerMode: 0
+  m_CacheServerEndpoint: 
+  m_CacheServerNamespacePrefix: default
+  m_CacheServerEnableDownload: 1
+  m_CacheServerEnableUpload: 1
diff --git a/projects/com.saab.map-streamer/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset
similarity index 62%
rename from projects/com.saab.map-streamer/ProjectSettings/GraphicsSettings.asset
rename to ProjectSettings/GraphicsSettings.asset
index ceebfd7b..9282cc79 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/GraphicsSettings.asset
+++ b/ProjectSettings/GraphicsSettings.asset
@@ -36,66 +36,23 @@ GraphicsSettings:
   - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0}
   - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
   - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 16001, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 4800000, guid: d944902ba5f408a468086a76b2f355f2, type: 3}
+  - {fileID: 4800000, guid: f495d04f47de59c418cacc3cdfd52420, type: 3}
+  - {fileID: 4800000, guid: 06966467cf260034b8f4c0fa8072c646, type: 3}
   m_PreloadedShaders: []
   m_PreloadShadersBatchTimeLimit: -1
-  m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
+  m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000,
+    type: 0}
   m_CustomRenderPipeline: {fileID: 0}
   m_TransparencySortMode: 0
   m_TransparencySortAxis: {x: 0, y: 0, z: 1}
   m_DefaultRenderingPath: 1
   m_DefaultMobileRenderingPath: 1
-  m_TierSettings:
-  - serializedVersion: 5
-    m_BuildTarget: 1
-    m_Tier: 0
-    m_Settings:
-      standardShaderQuality: 2
-      renderingPath: 3
-      hdrMode: 1
-      realtimeGICPUUsage: 25
-      useReflectionProbeBoxProjection: 1
-      useReflectionProbeBlending: 1
-      useHDR: 1
-      useDetailNormalMap: 1
-      useCascadedShadowMaps: 1
-      prefer32BitShadowMaps: 1
-      enableLPPV: 1
-      useDitherMaskForAlphaBlendedShadows: 1
-    m_Automatic: 0
-  - serializedVersion: 5
-    m_BuildTarget: 1
-    m_Tier: 1
-    m_Settings:
-      standardShaderQuality: 2
-      renderingPath: 3
-      hdrMode: 1
-      realtimeGICPUUsage: 25
-      useReflectionProbeBoxProjection: 1
-      useReflectionProbeBlending: 1
-      useHDR: 1
-      useDetailNormalMap: 1
-      useCascadedShadowMaps: 1
-      prefer32BitShadowMaps: 1
-      enableLPPV: 1
-      useDitherMaskForAlphaBlendedShadows: 1
-    m_Automatic: 0
-  - serializedVersion: 5
-    m_BuildTarget: 1
-    m_Tier: 2
-    m_Settings:
-      standardShaderQuality: 2
-      renderingPath: 3
-      hdrMode: 1
-      realtimeGICPUUsage: 50
-      useReflectionProbeBoxProjection: 1
-      useReflectionProbeBlending: 1
-      useHDR: 1
-      useDetailNormalMap: 1
-      useCascadedShadowMaps: 1
-      prefer32BitShadowMaps: 1
-      enableLPPV: 1
-      useDitherMaskForAlphaBlendedShadows: 1
-    m_Automatic: 0
+  m_TierSettings: []
   m_LightmapStripping: 0
   m_FogStripping: 0
   m_InstancingStripping: 0
diff --git a/projects/com.saab.map-streamer/ProjectSettings/InputManager.asset b/ProjectSettings/InputManager.asset
similarity index 99%
rename from projects/com.saab.map-streamer/ProjectSettings/InputManager.asset
rename to ProjectSettings/InputManager.asset
index 17c8f538..f13f8852 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/InputManager.asset
+++ b/ProjectSettings/InputManager.asset
@@ -42,7 +42,7 @@ InputManager:
     descriptiveName: 
     descriptiveNegativeName: 
     negativeButton: 
-    positiveButton: left ctrl
+    positiveButton: 
     altNegativeButton: 
     altPositiveButton: mouse 0
     gravity: 1000
diff --git a/projects/com.saab.map-streamer/ProjectSettings/MemorySettings.asset b/ProjectSettings/MemorySettings.asset
similarity index 100%
rename from projects/com.saab.map-streamer/ProjectSettings/MemorySettings.asset
rename to ProjectSettings/MemorySettings.asset
diff --git a/projects/com.saab.map-streamer/ProjectSettings/NavMeshAreas.asset b/ProjectSettings/NavMeshAreas.asset
similarity index 100%
rename from projects/com.saab.map-streamer/ProjectSettings/NavMeshAreas.asset
rename to ProjectSettings/NavMeshAreas.asset
diff --git a/ProjectSettings/NetworkManager.asset b/ProjectSettings/NetworkManager.asset
new file mode 100644
index 00000000..5dc6a831
--- /dev/null
+++ b/ProjectSettings/NetworkManager.asset
@@ -0,0 +1,8 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!149 &1
+NetworkManager:
+  m_ObjectHideFlags: 0
+  m_DebugLevel: 0
+  m_Sendrate: 15
+  m_AssetToPrefab: {}
diff --git a/projects/com.saab.map-streamer/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset
similarity index 90%
rename from projects/com.saab.map-streamer/ProjectSettings/PackageManagerSettings.asset
rename to ProjectSettings/PackageManagerSettings.asset
index 112a053b..7d65fefc 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/PackageManagerSettings.asset
+++ b/ProjectSettings/PackageManagerSettings.asset
@@ -25,11 +25,12 @@ MonoBehaviour:
     m_Scopes: []
     m_IsDefault: 1
     m_Capabilities: 7
+    m_ConfigSource: 0
   m_UserSelectedRegistryName: 
   m_UserAddingNewScopedRegistry: 0
   m_RegistryInfoDraft:
     m_Modified: 0
     m_ErrorMessage: 
-    m_UserModificationsInstanceId: -830
-    m_OriginalInstanceId: -832
+    m_UserModificationsInstanceId: -836
+    m_OriginalInstanceId: -838
   m_LoadAssets: 0
diff --git a/projects/com.saab.map-streamer/ProjectSettings/Physics2DSettings.asset b/ProjectSettings/Physics2DSettings.asset
similarity index 65%
rename from projects/com.saab.map-streamer/ProjectSettings/Physics2DSettings.asset
rename to ProjectSettings/Physics2DSettings.asset
index 47880b1c..132ee6bc 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/Physics2DSettings.asset
+++ b/ProjectSettings/Physics2DSettings.asset
@@ -3,7 +3,7 @@
 --- !u!19 &1
 Physics2DSettings:
   m_ObjectHideFlags: 0
-  serializedVersion: 4
+  serializedVersion: 3
   m_Gravity: {x: 0, y: -9.81}
   m_DefaultMaterial: {fileID: 0}
   m_VelocityIterations: 8
@@ -19,31 +19,12 @@ Physics2DSettings:
   m_LinearSleepTolerance: 0.01
   m_AngularSleepTolerance: 2
   m_DefaultContactOffset: 0.01
-  m_JobOptions:
-    serializedVersion: 2
-    useMultithreading: 0
-    useConsistencySorting: 0
-    m_InterpolationPosesPerJob: 100
-    m_NewContactsPerJob: 30
-    m_CollideContactsPerJob: 100
-    m_ClearFlagsPerJob: 200
-    m_ClearBodyForcesPerJob: 200
-    m_SyncDiscreteFixturesPerJob: 50
-    m_SyncContinuousFixturesPerJob: 50
-    m_FindNearestContactsPerJob: 100
-    m_UpdateTriggerContactsPerJob: 100
-    m_IslandSolverCostThreshold: 100
-    m_IslandSolverBodyCostScale: 1
-    m_IslandSolverContactCostScale: 10
-    m_IslandSolverJointCostScale: 10
-    m_IslandSolverBodiesPerJob: 50
-    m_IslandSolverContactsPerJob: 50
   m_AutoSimulation: 1
   m_QueriesHitTriggers: 1
   m_QueriesStartInColliders: 1
+  m_ChangeStopsCallbacks: 0
   m_CallbacksOnDisable: 1
-  m_ReuseCollisionCallbacks: 1
-  m_AutoSyncTransforms: 0
+  m_AutoSyncTransforms: 1
   m_AlwaysShowColliders: 0
   m_ShowColliderSleep: 1
   m_ShowColliderContacts: 0
diff --git a/ProjectSettings/PresetManager.asset b/ProjectSettings/PresetManager.asset
new file mode 100644
index 00000000..820e662d
--- /dev/null
+++ b/ProjectSettings/PresetManager.asset
@@ -0,0 +1,27 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1386491679 &1
+PresetManager:
+  m_ObjectHideFlags: 0
+  m_DefaultList:
+  - type:
+      m_NativeTypeID: 108
+      m_ManagedTypePPtr: {fileID: 0}
+      m_ManagedTypeFallback: 
+    defaultPresets:
+    - m_Preset: {fileID: 2655988077585873504, guid: c1cf8506f04ef2c4a88b64b6c4202eea,
+        type: 2}
+  - type:
+      m_NativeTypeID: 1020
+      m_ManagedTypePPtr: {fileID: 0}
+      m_ManagedTypeFallback: 
+    defaultPresets:
+    - m_Preset: {fileID: 2655988077585873504, guid: 0cd792cc87e492d43b4e95b205fc5cc6,
+        type: 2}
+  - type:
+      m_NativeTypeID: 1006
+      m_ManagedTypePPtr: {fileID: 0}
+      m_ManagedTypeFallback: 
+    defaultPresets:
+    - m_Preset: {fileID: 2655988077585873504, guid: 7a99f8aa944efe94cb9bd74562b7d5f9,
+        type: 2}
diff --git a/projects/com.saab.map-streamer/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset
similarity index 83%
rename from projects/com.saab.map-streamer/ProjectSettings/ProjectSettings.asset
rename to ProjectSettings/ProjectSettings.asset
index 1536ba38..26819360 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/ProjectSettings.asset
+++ b/ProjectSettings/ProjectSettings.asset
@@ -3,17 +3,17 @@
 --- !u!129 &1
 PlayerSettings:
   m_ObjectHideFlags: 0
-  serializedVersion: 24
-  productGUID: 0d70ad2ee19fb364cb5386d690090d64
+  serializedVersion: 23
+  productGUID: 6dc8d58211b48034eb9e08b1876fabe4
   AndroidProfiler: 0
   AndroidFilterTouchesWhenObscured: 0
   AndroidEnableSustainedPerformanceMode: 0
-  defaultScreenOrientation: 4
+  defaultScreenOrientation: 3
   targetDevice: 2
   useOnDemandResources: 0
   accelerometerFrequency: 60
-  companyName: DefaultCompany
-  productName: MapStreamer-Demo
+  companyName: Saab AB
+  productName: Streaming_Map_Demo
   defaultCursor: {fileID: 0}
   cursorHotspot: {x: 0, y: 0}
   m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1}
@@ -42,12 +42,12 @@ PlayerSettings:
   m_SplashScreenLogos: []
   m_VirtualRealitySplashScreen: {fileID: 0}
   m_HolographicTrackingLossScreen: {fileID: 0}
-  defaultScreenWidth: 1920
-  defaultScreenHeight: 1080
+  defaultScreenWidth: 1024
+  defaultScreenHeight: 768
   defaultScreenWidthWeb: 960
   defaultScreenHeightWeb: 600
   m_StereoRenderingPath: 0
-  m_ActiveColorSpace: 1
+  m_ActiveColorSpace: 0
   m_MTRendering: 1
   mipStripping: 0
   numberOfMipsStripped: 0
@@ -66,7 +66,7 @@ PlayerSettings:
   disableDepthAndStencilBuffers: 0
   androidStartInFullscreen: 1
   androidRenderOutsideSafeArea: 1
-  androidUseSwappy: 1
+  androidUseSwappy: 0
   androidBlitType: 0
   androidResizableWindow: 0
   androidDefaultWindowWidth: 1920
@@ -76,7 +76,7 @@ PlayerSettings:
   androidFullscreenMode: 1
   defaultIsNativeResolution: 1
   macRetinaSupport: 1
-  runInBackground: 1
+  runInBackground: 0
   captureSingleScreen: 0
   muteOtherAudioSources: 0
   Prepare IOS For Recording: 0
@@ -91,7 +91,7 @@ PlayerSettings:
   resizableWindow: 0
   useMacAppStoreValidation: 0
   macAppStoreCategory: public.app-category.games
-  gpuSkinning: 1
+  gpuSkinning: 0
   xboxPIXTextureCapture: 0
   xboxEnableAvatar: 0
   xboxEnableKinect: 0
@@ -113,7 +113,7 @@ PlayerSettings:
   xboxOneDisableEsram: 0
   xboxOneEnableTypeOptimization: 0
   xboxOnePresentImmediateThreshold: 0
-  switchQueueCommandMemory: 0
+  switchQueueCommandMemory: 1048576
   switchQueueControlMemory: 16384
   switchQueueComputeMemory: 262144
   switchNVNShaderPoolsGranularity: 33554432
@@ -125,7 +125,7 @@ PlayerSettings:
   stadiaTargetFramerate: 0
   vulkanNumSwapchainBuffers: 3
   vulkanEnableSetSRGBWrite: 0
-  vulkanEnablePreTransform: 1
+  vulkanEnablePreTransform: 0
   vulkanEnableLateAcquireNextImage: 0
   vulkanEnableCommandBufferRecycling: 1
   m_SupportedAspectRatios:
@@ -134,7 +134,7 @@ PlayerSettings:
     16:10: 1
     16:9: 1
     Others: 1
-  bundleVersion: 0.1
+  bundleVersion: 1.0
   preloadedAssets: []
   metroInputSource: 0
   wsaTransparentSwapchain: 0
@@ -155,14 +155,15 @@ PlayerSettings:
   androidSupportedAspectRatio: 1
   androidMaxAspectRatio: 2.1
   applicationIdentifier:
-    Standalone: com.DefaultCompany.MapStreamer-Demo
+    Android: com.SaabAB.Streaming_Map_Demo
+    Standalone: com.Saab-AB.Streaming-Map-Demo
   buildNumber:
     Standalone: 0
     iPhone: 0
     tvOS: 0
   overrideDefaultApplicationIdentifier: 0
   AndroidBundleVersionCode: 1
-  AndroidMinSdkVersion: 22
+  AndroidMinSdkVersion: 23
   AndroidTargetSdkVersion: 0
   AndroidPreferredInstallLocation: 1
   aotOptions: 
@@ -174,7 +175,7 @@ PlayerSettings:
   CreateWallpaper: 0
   APKExpansionFiles: 0
   keepLoadedShadersAlive: 0
-  StripUnusedMeshComponents: 1
+  StripUnusedMeshComponents: 0
   VertexChannelCompressionMask: 4054
   iPhoneSdkVersion: 988
   iOSTargetOSVersionString: 11.0
@@ -236,7 +237,7 @@ PlayerSettings:
   appleEnableProMotion: 0
   shaderPrecisionModel: 0
   clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea
-  templatePackageId: com.unity.template.3d@8.1.3
+  templatePackageId: com.unity.3d@1.0.2
   templateDefaultScene: Assets/Scenes/SampleScene.unity
   useCustomMainManifest: 0
   useCustomLauncherManifest: 0
@@ -245,11 +246,11 @@ PlayerSettings:
   useCustomBaseGradleTemplate: 0
   useCustomGradlePropertiesTemplate: 0
   useCustomProguardFile: 0
-  AndroidTargetArchitectures: 1
-  AndroidTargetDevices: 0
+  AndroidTargetArchitectures: 2
+  AndroidTargetDevices: 1
   AndroidSplashScreenScale: 0
   androidSplashScreen: {fileID: 0}
-  AndroidKeystoreName: 
+  AndroidKeystoreName: '{inproject}: '
   AndroidKeyaliasName: 
   AndroidBuildApkPerCpuArchitecture: 0
   AndroidTVCompatibility: 0
@@ -269,76 +270,121 @@ PlayerSettings:
   AndroidMinifyDebug: 0
   AndroidValidateAppBundleSize: 1
   AndroidAppBundleSizeToValidate: 150
-  m_BuildTargetIcons: []
-  m_BuildTargetPlatformIcons: []
-  m_BuildTargetBatching:
-  - m_BuildTarget: Standalone
-    m_StaticBatching: 1
-    m_DynamicBatching: 0
-  - m_BuildTarget: tvOS
-    m_StaticBatching: 1
-    m_DynamicBatching: 0
+  m_BuildTargetIcons:
+  - m_BuildTarget: 
+    m_Icons:
+    - serializedVersion: 2
+      m_Icon: {fileID: 2800000, guid: 507e00e4ee60ef047a2980ffeec77deb, type: 3}
+      m_Width: 128
+      m_Height: 128
+      m_Kind: 0
+  m_BuildTargetPlatformIcons:
   - m_BuildTarget: Android
-    m_StaticBatching: 1
-    m_DynamicBatching: 0
-  - m_BuildTarget: iPhone
-    m_StaticBatching: 1
-    m_DynamicBatching: 0
-  - m_BuildTarget: WebGL
-    m_StaticBatching: 0
-    m_DynamicBatching: 0
+    m_Icons:
+    - m_Textures: []
+      m_Width: 432
+      m_Height: 432
+      m_Kind: 2
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 324
+      m_Height: 324
+      m_Kind: 2
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 216
+      m_Height: 216
+      m_Kind: 2
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 162
+      m_Height: 162
+      m_Kind: 2
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 108
+      m_Height: 108
+      m_Kind: 2
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 81
+      m_Height: 81
+      m_Kind: 2
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 192
+      m_Height: 192
+      m_Kind: 0
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 144
+      m_Height: 144
+      m_Kind: 0
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 96
+      m_Height: 96
+      m_Kind: 0
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 72
+      m_Height: 72
+      m_Kind: 0
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 48
+      m_Height: 48
+      m_Kind: 0
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 36
+      m_Height: 36
+      m_Kind: 0
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 192
+      m_Height: 192
+      m_Kind: 1
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 144
+      m_Height: 144
+      m_Kind: 1
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 96
+      m_Height: 96
+      m_Kind: 1
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 72
+      m_Height: 72
+      m_Kind: 1
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 48
+      m_Height: 48
+      m_Kind: 1
+      m_SubKind: 
+    - m_Textures: []
+      m_Width: 36
+      m_Height: 36
+      m_Kind: 1
+      m_SubKind: 
+  m_BuildTargetBatching: []
   m_BuildTargetShaderSettings: []
   m_BuildTargetGraphicsJobs:
-  - m_BuildTarget: MacStandaloneSupport
-    m_GraphicsJobs: 0
-  - m_BuildTarget: Switch
-    m_GraphicsJobs: 1
-  - m_BuildTarget: MetroSupport
-    m_GraphicsJobs: 1
-  - m_BuildTarget: AppleTVSupport
-    m_GraphicsJobs: 0
-  - m_BuildTarget: BJMSupport
-    m_GraphicsJobs: 1
-  - m_BuildTarget: LinuxStandaloneSupport
-    m_GraphicsJobs: 1
-  - m_BuildTarget: PS4Player
-    m_GraphicsJobs: 1
-  - m_BuildTarget: iOSSupport
-    m_GraphicsJobs: 0
   - m_BuildTarget: WindowsStandaloneSupport
-    m_GraphicsJobs: 1
-  - m_BuildTarget: XboxOnePlayer
-    m_GraphicsJobs: 1
-  - m_BuildTarget: LuminSupport
     m_GraphicsJobs: 0
-  - m_BuildTarget: AndroidPlayer
-    m_GraphicsJobs: 0
-  - m_BuildTarget: WebGLSupport
-    m_GraphicsJobs: 0
-  m_BuildTargetGraphicsJobMode:
-  - m_BuildTarget: PS4Player
-    m_GraphicsJobMode: 0
-  - m_BuildTarget: XboxOnePlayer
-    m_GraphicsJobMode: 0
+  m_BuildTargetGraphicsJobMode: []
   m_BuildTargetGraphicsAPIs:
-  - m_BuildTarget: AndroidPlayer
-    m_APIs: 150000000b000000
-    m_Automatic: 1
   - m_BuildTarget: iOSSupport
     m_APIs: 10000000
     m_Automatic: 1
-  - m_BuildTarget: AppleTVSupport
-    m_APIs: 10000000
-    m_Automatic: 1
-  - m_BuildTarget: WebGLSupport
-    m_APIs: 0b000000
-    m_Automatic: 1
-  m_BuildTargetVRSettings:
-  - m_BuildTarget: Standalone
-    m_Enabled: 0
-    m_Devices:
-    - Oculus
-    - OpenVR
+  - m_BuildTarget: AndroidPlayer
+    m_APIs: 0b00000008000000
+    m_Automatic: 0
+  m_BuildTargetVRSettings: []
   m_DefaultShaderChunkSizeInMB: 16
   m_DefaultShaderChunkCount: 0
   openGLRequireES31: 0
@@ -349,24 +395,12 @@ PlayerSettings:
     Android: 1
     iPhone: 1
     tvOS: 1
-  m_BuildTargetGroupLightmapEncodingQuality:
-  - m_BuildTarget: Android
-    m_EncodingQuality: 1
-  - m_BuildTarget: iPhone
-    m_EncodingQuality: 1
-  - m_BuildTarget: tvOS
-    m_EncodingQuality: 1
+  m_BuildTargetGroupLightmapEncodingQuality: []
   m_BuildTargetGroupLightmapSettings: []
-  m_BuildTargetNormalMapEncoding:
-  - m_BuildTarget: Android
-    m_Encoding: 1
-  - m_BuildTarget: iPhone
-    m_Encoding: 1
-  - m_BuildTarget: tvOS
-    m_Encoding: 1
+  m_BuildTargetNormalMapEncoding: []
   m_BuildTargetDefaultTextureCompressionFormat:
   - m_BuildTarget: Android
-    m_Format: 3
+    m_Format: 2
   playModeTestRunnerEnabled: 0
   runPlayModeTestAsEditModeTest: 0
   actionOnDotNetUnhandledException: 1
@@ -551,7 +585,7 @@ PlayerSettings:
   ps4RemotePlayKeyAssignment: -1
   ps4RemotePlayKeyMappingDir: 
   ps4PlayTogetherPlayerCount: 0
-  ps4EnterButtonAssignment: 1
+  ps4EnterButtonAssignment: 2
   ps4ApplicationParam1: 0
   ps4ApplicationParam2: 0
   ps4ApplicationParam3: 0
@@ -574,7 +608,7 @@ PlayerSettings:
   ps4UseAudio3dBackend: 0
   ps4UseLowGarlicFragmentationMode: 1
   ps4SocialScreenEnabled: 0
-  ps4ScriptOptimizationLevel: 0
+  ps4ScriptOptimizationLevel: 2
   ps4Audio3dVirtualSpeakerCount: 14
   ps4attribCpuUsage: 0
   ps4PatchPkgPath: 
@@ -600,7 +634,7 @@ PlayerSettings:
   splashScreenBackgroundSourcePortrait: {fileID: 0}
   blurSplashScreenBackground: 1
   spritePackerPolicy: 
-  webGLMemorySize: 16
+  webGLMemorySize: 32
   webGLExceptionSupport: 1
   webGLNameFilesAsHashes: 0
   webGLDataCaching: 1
@@ -610,7 +644,7 @@ PlayerSettings:
   webGLTemplate: APPLICATION:Default
   webGLAnalyzeBuildSize: 0
   webGLUseEmbeddedResources: 0
-  webGLCompressionFormat: 1
+  webGLCompressionFormat: 0
   webGLWasmArithmeticExceptions: 0
   webGLLinkerTarget: 1
   webGLThreadsSupport: 0
@@ -620,6 +654,7 @@ PlayerSettings:
     Android: UNITY_POST_PROCESSING_STACK_V2
     EmbeddedLinux: UNITY_POST_PROCESSING_STACK_V2
     GameCoreXboxOne: UNITY_POST_PROCESSING_STACK_V2
+    LinuxHeadlessSimulation: UNITY_POST_PROCESSING_STACK_V2
     Lumin: UNITY_POST_PROCESSING_STACK_V2
     Nintendo Switch: UNITY_POST_PROCESSING_STACK_V2
     PS4: UNITY_POST_PROCESSING_STACK_V2
@@ -632,31 +667,34 @@ PlayerSettings:
     tvOS: UNITY_POST_PROCESSING_STACK_V2
   additionalCompilerArguments: {}
   platformArchitecture: {}
-  scriptingBackend: {}
-  il2cppCompilerConfiguration: {}
+  scriptingBackend:
+    Android: 1
+  il2cppCompilerConfiguration:
+    Android: 0
   managedStrippingLevel: {}
   incrementalIl2cppBuild: {}
   suppressCommonWarnings: 1
-  allowUnsafeCode: 0
+  allowUnsafeCode: 1
   useDeterministicCompilation: 1
   enableRoslynAnalyzers: 1
-  selectedPlatform: 0
+  selectedPlatform: 2
   additionalIl2CppArgs: 
   scriptingRuntimeVersion: 1
-  gcIncremental: 1
+  gcIncremental: 0
   assemblyVersionValidation: 1
   gcWBarrierValidation: 0
-  apiCompatibilityLevelPerPlatform: {}
+  apiCompatibilityLevelPerPlatform:
+    Standalone: 3
   m_RenderingPath: 1
   m_MobileRenderingPath: 1
-  metroPackageName: Template_3D
+  metroPackageName: Streaming_Map_Demo
   metroPackageVersion: 
   metroCertificatePath: 
   metroCertificatePassword: 
   metroCertificateSubject: 
   metroCertificateIssuer: 
   metroCertificateNotAfter: 0000000000000000
-  metroApplicationDescription: Template_3D
+  metroApplicationDescription: Streaming_Map_Demo
   wsaImages: {}
   metroTileShortName: 
   metroTileShowName: 0
@@ -668,7 +706,8 @@ PlayerSettings:
   metroDefaultTileSize: 1
   metroTileForegroundText: 2
   metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0}
-  metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1}
+  metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628,
+    a: 1}
   metroSplashScreenUseBackgroundColor: 0
   platformCapabilities: {}
   metroTargetDeviceFamilies: {}
@@ -704,8 +743,7 @@ PlayerSettings:
   XboxOneOverrideIdentityName: 
   XboxOneOverrideIdentityPublisher: 
   vrEditorSettings: {}
-  cloudServicesEnabled:
-    UNet: 1
+  cloudServicesEnabled: {}
   luminIcon:
     m_Name: 
     m_ModelFolderPath: 
@@ -717,21 +755,16 @@ PlayerSettings:
   luminVersion:
     m_VersionCode: 1
     m_VersionName: 
-  hmiPlayerDataPath: 
-  hmiForceSRGBBlit: 1
-  embeddedLinuxEnableGamepadInput: 1
-  hmiLogStartupTiming: 0
-  hmiCpuConfiguration: 
-  qnxGraphicConfPath: 
   apiCompatibilityLevel: 6
   activeInputHandler: 0
   windowsGamepadBackendHint: 0
-  cloudProjectId: 
+  cloudProjectId: 9adebc36-df3a-459e-a228-0e6097a17fa9
   framebufferDepthMemorylessMode: 0
   qualitySettingsNames: []
-  projectName: 
-  organizationId: 
+  projectName: SBD_Demo
+  organizationId: tooltech
   cloudEnabled: 0
   legacyClampBlendShapeWeights: 0
-  hmiLoadingImage: {fileID: 0}
+  playerDataPath: 
+  forceSRGBBlit: 1
   virtualTexturingSupportEnabled: 0
diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt
new file mode 100644
index 00000000..7597e240
--- /dev/null
+++ b/ProjectSettings/ProjectVersion.txt
@@ -0,0 +1,2 @@
+m_EditorVersion: 2021.3.23f1
+m_EditorVersionWithRevision: 2021.3.23f1 (213b516bf396)
diff --git a/projects/com.saab.map-streamer/ProjectSettings/QualitySettings.asset b/ProjectSettings/QualitySettings.asset
similarity index 98%
rename from projects/com.saab.map-streamer/ProjectSettings/QualitySettings.asset
rename to ProjectSettings/QualitySettings.asset
index d2537f8a..47b42f2e 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/QualitySettings.asset
+++ b/ProjectSettings/QualitySettings.asset
@@ -198,10 +198,10 @@ QualitySettings:
     shadowCascade2Split: 0.33333334
     shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
     shadowmaskMode: 1
-    skinWeights: 4
+    skinWeights: 255
     textureQuality: 0
     anisotropicTextures: 2
-    antiAliasing: 8
+    antiAliasing: 2
     softParticles: 1
     softVegetation: 1
     realtimeReflectionProbes: 1
@@ -224,11 +224,10 @@ QualitySettings:
     excludedTargetPlatforms: []
   m_PerPlatformDefaultQuality:
     Android: 2
-    EmbeddedLinux: 0
+    CloudRendering: 5
     GameCoreScarlett: 5
     GameCoreXboxOne: 5
     Lumin: 5
-    Nintendo 3DS: 5
     Nintendo Switch: 5
     PS4: 5
     PS5: 5
diff --git a/projects/com.saab.map-streamer/ProjectSettings/SceneTemplateSettings.json b/ProjectSettings/SceneTemplateSettings.json
similarity index 100%
rename from projects/com.saab.map-streamer/ProjectSettings/SceneTemplateSettings.json
rename to ProjectSettings/SceneTemplateSettings.json
diff --git a/projects/com.saab.map-streamer/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset
similarity index 95%
rename from projects/com.saab.map-streamer/ProjectSettings/TagManager.asset
rename to ProjectSettings/TagManager.asset
index 1c92a784..17cb8036 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/TagManager.asset
+++ b/ProjectSettings/TagManager.asset
@@ -13,7 +13,7 @@ TagManager:
   - UI
   - 
   - 
-  - 
+  - PostProcessing
   - 
   - 
   - 
diff --git a/projects/com.saab.map-streamer/ProjectSettings/TimeManager.asset b/ProjectSettings/TimeManager.asset
similarity index 80%
rename from projects/com.saab.map-streamer/ProjectSettings/TimeManager.asset
rename to ProjectSettings/TimeManager.asset
index 558a017e..06bcc6d2 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/TimeManager.asset
+++ b/ProjectSettings/TimeManager.asset
@@ -4,6 +4,6 @@
 TimeManager:
   m_ObjectHideFlags: 0
   Fixed Timestep: 0.02
-  Maximum Allowed Timestep: 0.33333334
+  Maximum Allowed Timestep: 0.1
   m_TimeScale: 1
   Maximum Particle Timestep: 0.03
diff --git a/projects/com.saab.map-streamer/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset
similarity index 96%
rename from projects/com.saab.map-streamer/ProjectSettings/UnityConnectSettings.asset
rename to ProjectSettings/UnityConnectSettings.asset
index a88bee0f..699db18c 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/UnityConnectSettings.asset
+++ b/ProjectSettings/UnityConnectSettings.asset
@@ -4,7 +4,7 @@
 UnityConnectSettings:
   m_ObjectHideFlags: 0
   serializedVersion: 1
-  m_Enabled: 0
+  m_Enabled: 1
   m_TestMode: 0
   m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events
   m_EventUrl: https://cdp.cloud.unity3d.com/v1/events
@@ -20,7 +20,7 @@ UnityConnectSettings:
     m_Enabled: 0
     m_TestMode: 0
   UnityAnalyticsSettings:
-    m_Enabled: 0
+    m_Enabled: 1
     m_TestMode: 0
     m_InitializeOnStartup: 1
     m_PackageRequiringCoreStatsPresent: 0
diff --git a/projects/com.saab.map-streamer/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset
similarity index 88%
rename from projects/com.saab.map-streamer/ProjectSettings/VFXManager.asset
rename to ProjectSettings/VFXManager.asset
index 3a95c98b..6e0eaca4 100644
--- a/projects/com.saab.map-streamer/ProjectSettings/VFXManager.asset
+++ b/ProjectSettings/VFXManager.asset
@@ -6,7 +6,6 @@ VFXManager:
   m_IndirectShader: {fileID: 0}
   m_CopyBufferShader: {fileID: 0}
   m_SortShader: {fileID: 0}
-  m_StripUpdateShader: {fileID: 0}
   m_RenderPipeSettingsPath: 
   m_FixedTimeStep: 0.016666668
   m_MaxDeltaTime: 0.05
diff --git a/projects/com.saab.map-streamer/ProjectSettings/VersionControlSettings.asset b/ProjectSettings/VersionControlSettings.asset
similarity index 100%
rename from projects/com.saab.map-streamer/ProjectSettings/VersionControlSettings.asset
rename to ProjectSettings/VersionControlSettings.asset
diff --git a/projects/com.saab.map-streamer/ProjectSettings/XRSettings.asset b/ProjectSettings/XRSettings.asset
similarity index 100%
rename from projects/com.saab.map-streamer/ProjectSettings/XRSettings.asset
rename to ProjectSettings/XRSettings.asset
diff --git a/projects/com.saab.map-streamer/ProjectSettings/boot.config b/ProjectSettings/boot.config
similarity index 100%
rename from projects/com.saab.map-streamer/ProjectSettings/boot.config
rename to ProjectSettings/boot.config
diff --git a/README.md b/README.md
index 81a32232..34d3aa7a 100644
--- a/README.md
+++ b/README.md
@@ -1,55 +1,48 @@
-Streaming Map Demo
-==================
-
-<B>A Saab Dynamics demo of the Streaming Binary Data Architecture</B>
-
-This is a generic streaming API for 3D engines (Unity,Unreal...) that allows fast streaming updates of huge 3D datasets located in cloud, from disc or procedural.
-
-This GIT repository will allow you to take a look at a Unity demo, written by the Open Saab Development community using the GizmoSDK code base from Saab Dynamics, Training & Simulation. Take a look at https://youtu.be/m2NsE8NBrB0
-
-The open source and open documentation in here are to be considered as LGPL code and can be used in your own projects.
-
-The binaries are licensed by Saab Dynamics. If you are interested in using this for commercial purposes, please contact 
-
-anders.moden@saabgroup.com
-
-
-
-
-Setup
-=====
-
-To run, open the Install_Gizmo.sln under directory 'vs17\Install_Gizmo' and select 'debug/release for each x64/ARM64 etc' solution and build. Select only one configration at a time and build this for all platforms. This will fetch nuget packages for all components and update the Assets/Plugin folder with correct binaries. The solution can deploy both Debug and Release versions to be used in development. Only one "deploy" version at a time should be used. Dont mix both Debug and Release versions. To clear the plugin folder, run the script 'cleanup_plugins.bat' that will clean the Assets/Plugin folder. Use VS2019 to build the InstallPackages or use VS2017 and install support for .NET Core 3.1 
-Dont use ARM and ARM64 builds in parallell or rename and configure dlls properly so Unity can select the right ones.
-
-You could also simply just run the corresponding .bat script (build_x64, build_x64_d, etc..) and every thing will be setup correctly.
-
-
-Running the demo
-================
-Open the unity project found under the under directory 'projects\com.saab.map-streamer' and Press the "play" button in the Unity editor. 
-
-<b>keybinds:</b>
-* WASD to move around
-* space, ctrl move up and down
-* Arrow keys to rotate the view
-* shift increase speed of movement
-
-<b><u>Note Win64 only right now</u></b>
-Good Luck !
-
-
-Technology Info
-===============
-
-The demo is based on a 3D scenegraph written in native C++ that manages the logistics for loading/unloading data, LOD levels and transitions between LOD depending on what data is currently loaded. It uses up to 16 parallel threads to load data from multiple URL based datasources dynamically.
-The demo uses a large double precision coordinate system and a ROI (Region Of Interest) subsystem that translates HUGE coordinates into local islands of single precision data. 
-
-The system handles geocentric coordinate systems as well as flat UTM and other conic projections and provides a uniform WGS84 API to control all objects and queries.
-
-The SceneGraph API also allows a fast intersector query to be performed to find ground features and clamp object to the ground.
-
-The demo shows an example of SBD maps (Streaming Binary Data) that are quad or octree based spatial data in 3D. The format allows very large databases (entire globe) to be divided on multiple servers and that can have details down to (mm) in resolution.
-
-![Screenshot](https://gizmosdk.blob.core.windows.net/maps/stock/thumb.png)
-_[A screenshot showing how feature/height data can be used to present trees with accurate position and height]_  
\ No newline at end of file
+Streaming Map Demo
+==================
+
+<B>A Saab Dynamics demo of the Streaming Binary Data Architecture</B>
+
+This is a generic streaming API for 3D engines (Unity,Unreal...) that allows fast streaming updates of huge 3D datasets located in cloud, from disc or procedural.
+
+This GIT repository will allow you to take a look at a Unity demo, written by the Open Saab Development community using the GizmoSDK code base from Saab Dynamics, Training & Simulation. Take a look at https://youtu.be/m2NsE8NBrB0
+
+The open source and open documentation in here are to be considered as LGPL code and can be used in your own projects.
+
+The binaries are licensed by Saab Dynamics. If you are interested in using this for commersial use, please contact 
+
+anders.moden@saabgroup.com
+
+
+
+
+Setup
+=====
+
+To run, open the InstallPackages.sln under directory 'InstallPackages' and select 'debug/release for each x64/ARM64 etc' solution and build. Select only one configration at a time and build this for all platforms. This will fetch nuget packages for all components and update the Assets/Plugin folder with correct binaries. The solution can deploy both Debug and Release versions to be used in development. Only one "deploy" version at a time should be used. Dont mix both Debug and Release versions. To clear the plugin folder, run the script 'cleanup_plugins.bat' that will clean the Assets/Plugin folder. Use VS2019 to build the InstallPackages or use VS2017 and install support for .NET Core 3.1 
+Dont use ARM and ARM64 builds in parallell or rename and configure dlls properly so Unity can select the right ones
+
+
+Running the demo
+================
+
+Press the "play" button in the Unity editor and use the keys 'a' and 'd' for left/right and the keys 'w' and 's' for forward/backward
+Use the arrow keys to rotate the view. 
+<b><u>Note Win64 only right now</u></b>
+Good Luck !
+
+
+Technology Info
+===============
+
+The demo is based on a 3D scenegraph written in native C++ that manages the logistics for loading/unloading data and manages LOD levels and transitions between LOD depending on what data is currently loaded. It uses up to 16 paralell threads to load data from multiple URL based datasources dynamically.
+The demo uses a large double precision coordinate system and a ROI (Region Of Interest) subsystem that translates HUGE coordinates into local islands of single precision data. 
+
+The system handles geocentric coordinate systems as well as flat UTM and other conic projections and provides a uniform WGS84 API to control all objects and queries.
+
+The SceneGraph API also allows a fast intersector query to be performed to find ground features and clamp object to the ground.
+
+The demo shows an example of SBD maps (Streaming Binary Data) that are quad or octree based spatial data in 3D. The format allows very large databases (entire globe) to be divided on multiple servers and that can have details down to (mm) in resolution.
+
+![Screenshot](https://gizmosdk.blob.core.windows.net/maps/stock/thumb.png)
+
diff --git a/SAAB_ID.json b/SAAB_ID.json
deleted file mode 100644
index 44517a83..00000000
--- a/SAAB_ID.json
+++ /dev/null
@@ -1 +0,0 @@
-{"id": "D1A3B2F1-9CC6-48EB-9A1C-6783BEB3A0D5"}
\ No newline at end of file
diff --git a/Saab.Foundation.Map.Manager.Test/UnitTest1.cs b/Saab.Foundation.Map.Manager.Test/UnitTest1.cs
deleted file mode 100644
index 96800d67..00000000
--- a/Saab.Foundation.Map.Manager.Test/UnitTest1.cs
+++ /dev/null
@@ -1,167 +0,0 @@
-﻿using System;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using GizmoSDK.Gizmo3D;
-using GizmoSDK.GizmoBase;
-using GizmoSDK.Coordinate;
-
-
-namespace Saab.Foundation.Map.Test
-{
-    [TestClass]
-    [Ignore] // Right now when we dont have a map purl
-    public class TestLoadMap
-    {
-        static Node _node;
-
-        [AssemblyInitialize]
-        public static void TestInit(TestContext tc)
-        {
-            GizmoSDK.Gizmo3D.Platform.Initialize();
-
-            DbManager.Initialize();
-
-            Message.SetMessageLevel(MessageLevel.DEBUG);
-
-            _node = DbManager.LoadDB("purl:maps,sweden/eksjo/data/map.gzd");
-
-            Assert.IsNotNull(_node);
-            Assert.IsTrue(_node.IsValid());
-        }
-
-        [AssemblyCleanup]
-        public static void TestCleanup()
-        {
-            GizmoSDK.Gizmo3D.Platform.Uninitialize();
-        }
-
-        [TestMethod]
-        public void TestRotations()
-        {
-            Matrix3 mat = Matrix3.CreateFrom_Euler_YXZ(0.5f, 0, 0);
-
-            Vec3 pos = mat * new Vec3(0, 0, 1);
-
-            Quaternion quat = Quaternion.CreateFrom_Euler_YXZ(0.5f,0,0);
-
-        }
-
-        [TestMethod]
-        public void TestUTMMap()
-        {
-            MapControl controller = new MapControl
-            {
-                CurrentMap = _node
-            };
-
-            Assert.IsTrue(controller.MapType == MapType.UTM);
-        }
-
-        [TestMethod]
-        public void TestGroundClamp()
-        {
-
-            MapControl controller = new MapControl
-            {
-                CurrentMap = _node,
-            };
-
-            Assert.IsTrue(controller.GetPosition(new LatPos(1.0084718541, 0.24984267815, 0), out MapPos pos,GroundClampType.GROUND,ClampFlags.WAIT_FOR_DATA));
-
-            controller.LocalToWorld(pos, out LatPos latpos);
-        }
-
-        private static double getElevation(LatPos position)
-        {
-            var adapter = SerializeAdapter.GetURLAdapter("pipe:Elevation?retry=2");
-
-            if (!adapter.IsValid())
-            {
-                return position.Altitude;
-            }
-
-            DynamicType dynlat = position.Latitude;
-            DynamicType dynlon = position.Longitude;
-
-            adapter.Write(2537);
-            adapter.Write(dynlat.GetDataSize() + dynlon.GetDataSize());
-            adapter.Write(dynlat);
-            adapter.Write(dynlon);
-
-            DynamicType res = new DynamicType();
-
-            while (!adapter.HasData())
-            {
-                System.Threading.Thread.Sleep(10);
-                // todo, quit after some time...
-            }
-
-            adapter.Read(res);
-
-            return res.GetNumber();
-        }
-
-
-        [TestMethod]
-        public void TestAltitude()
-        {
-
-            MapControl controller = new MapControl
-            {
-                CurrentMap = _node,
-                //RoiPosition = new GizmoSDK.GizmoBase.Vec3D(0, 0, 0);
-            };
-
-            double altitude=controller.GetAltitude(new LatPos(1.0084718541, 0.24984267815, 0),ClampFlags.WAIT_FOR_DATA|ClampFlags.ISECT_LOD_QUALITY);
-
-            double compareAltitude = getElevation(new LatPos(1.0084718541, 0.24984267815, 0));
-
-            double renaAltitude = getElevation(new LatPos(61.147953* Coordinate.DEG2RAD, 11.392666*Coordinate.DEG2RAD, 0));
-        }
-
-        [TestMethod]
-        public void TestCamera()
-        {
-            
-            Camera cam = new PerspCamera();
-
-            cam.Position = new Vec3D(100, 100, 100);
-            cam.RoiPosition = true;
-
-            MapControl controller = new MapControl
-            {
-                CurrentMap = _node,
-                Camera = cam
-            };
-
-            controller.GetScreenVectors(10, 10, 100, 100, out Vec3D position, out Vec3 direction);
-        }
-
-        [TestMethod]
-        public void TestFrustrumGroundclamp()
-        {
-           
-            Camera cam = new PerspCamera();
-
-            cam.Position = new Vec3D(100, 100, 100);
-            cam.RoiPosition = true;
-
-            MapControl controller = new MapControl
-            {
-                CurrentMap = _node,
-                Camera = cam
-            };
-
-            controller.GetScreenVectors(10, 10, 100, 100, out Vec3D position, out Vec3 direction);
-
-            MapPos pos=controller.GlobalToLocal(position);
-
-            pos.local_orientation = new Matrix3(new Vec3(1, 0, 0), new Vec3(0, 0, -1), new Vec3(0, 1, 0));
-
-            controller.UpdatePosition(pos, GroundClampType.GROUND, ClampFlags.DEFAULT|ClampFlags.WAIT_FOR_DATA);
-
-           // Assert.IsTrue(controller.GetPosition(new LatPos(1.0084718541, 0.24984267815), out MapPos pos, GroundClampType.GROUND, ClampFlags.WAIT_FOR_DATA));
-        }
-        
-
-    }
-}
diff --git a/Tools/UDP Viewer.exe b/Tools/UDP Viewer.exe
new file mode 100644
index 00000000..8c978330
Binary files /dev/null and b/Tools/UDP Viewer.exe differ
diff --git a/Tools/licApp/Qt5Core.dll b/Tools/licApp/Qt5Core.dll
new file mode 100644
index 00000000..72a0f65f
Binary files /dev/null and b/Tools/licApp/Qt5Core.dll differ
diff --git a/Tools/licApp/Qt5Gui.dll b/Tools/licApp/Qt5Gui.dll
new file mode 100644
index 00000000..6eabb5f8
Binary files /dev/null and b/Tools/licApp/Qt5Gui.dll differ
diff --git a/Tools/licApp/Qt5Widgets.dll b/Tools/licApp/Qt5Widgets.dll
new file mode 100644
index 00000000..c934366a
Binary files /dev/null and b/Tools/licApp/Qt5Widgets.dll differ
diff --git a/Tools/licApp/licApp.exe b/Tools/licApp/licApp.exe
new file mode 100644
index 00000000..232d58d7
Binary files /dev/null and b/Tools/licApp/licApp.exe differ
diff --git a/Tools/licApp/licenses.xml b/Tools/licApp/licenses.xml
new file mode 100644
index 00000000..bbc1ace6
--- /dev/null
+++ b/Tools/licApp/licenses.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<licenses>
+  <customer info="License Configuration for Streaming Map Demo" />
+  <license name="GIZMO_LICENSE" feature="1"/>
+</licenses>
diff --git a/Tools/licApp/platforms/qwindows.dll b/Tools/licApp/platforms/qwindows.dll
new file mode 100644
index 00000000..4903ad7d
Binary files /dev/null and b/Tools/licApp/platforms/qwindows.dll differ
diff --git a/Tools/licApp/styles/qwindowsvistastyle.dll b/Tools/licApp/styles/qwindowsvistastyle.dll
new file mode 100644
index 00000000..666a5502
Binary files /dev/null and b/Tools/licApp/styles/qwindowsvistastyle.dll differ
diff --git a/UserSettings/EditorUserSettings.asset b/UserSettings/EditorUserSettings.asset
new file mode 100644
index 00000000..4681d1d2
--- /dev/null
+++ b/UserSettings/EditorUserSettings.asset
@@ -0,0 +1,19 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!162 &1
+EditorUserSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 4
+  m_ConfigSettings:
+    vcSharedLogLevel:
+      value: 0d5e400f0650
+      flags: 0
+  m_VCAutomaticAdd: 1
+  m_VCDebugCom: 0
+  m_VCDebugCmd: 0
+  m_VCDebugOut: 0
+  m_SemanticMergeMode: 2
+  m_VCShowFailedCheckout: 1
+  m_VCOverwriteFailedCheckoutAssets: 1
+  m_VCOverlayIcons: 1
+  m_VCAllowAsyncUpdate: 0
diff --git a/UserSettings/Layouts/CurrentMaximizeLayout.dwlt b/UserSettings/Layouts/CurrentMaximizeLayout.dwlt
new file mode 100644
index 00000000..6201e464
--- /dev/null
+++ b/UserSettings/Layouts/CurrentMaximizeLayout.dwlt
@@ -0,0 +1,972 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &1
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Children:
+  - {fileID: 3}
+  - {fileID: 13}
+  m_Position:
+    serializedVersion: 2
+    x: 0
+    y: 30
+    width: 1920
+    height: 1067
+  m_MinSize: {x: 300, y: 200}
+  m_MaxSize: {x: 24288, y: 16192}
+  vertical: 0
+  controlID: -1
+--- !u!114 &2
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12015, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 200, y: 200}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_TitleContent:
+    m_Text: Game
+    m_Image: {fileID: -6423792434712278376, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 322
+    y: 73
+    width: 1014
+    height: 717
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+  m_SerializedViewNames: []
+  m_SerializedViewValues: []
+  m_PlayModeViewName: GameView
+  m_ShowGizmos: 0
+  m_TargetDisplay: 0
+  m_ClearColor: {r: 0, g: 0, b: 0, a: 0}
+  m_TargetSize: {x: 1014, y: 696}
+  m_TextureFilterMode: 0
+  m_TextureHideFlags: 61
+  m_RenderIMGUI: 1
+  m_EnterPlayModeBehavior: 0
+  m_UseMipMap: 0
+  m_VSyncEnabled: 0
+  m_Gizmos: 0
+  m_Stats: 0
+  m_SelectedSizes: 00000000000000000000000000000000000000000000000000000000000000000000000000000000
+  m_ZoomArea:
+    m_HRangeLocked: 0
+    m_VRangeLocked: 0
+    hZoomLockedByDefault: 0
+    vZoomLockedByDefault: 0
+    m_HBaseRangeMin: -507
+    m_HBaseRangeMax: 507
+    m_VBaseRangeMin: -348
+    m_VBaseRangeMax: 348
+    m_HAllowExceedBaseRangeMin: 1
+    m_HAllowExceedBaseRangeMax: 1
+    m_VAllowExceedBaseRangeMin: 1
+    m_VAllowExceedBaseRangeMax: 1
+    m_ScaleWithWindow: 0
+    m_HSlider: 0
+    m_VSlider: 0
+    m_IgnoreScrollWheelUntilClicked: 0
+    m_EnableMouseInput: 0
+    m_EnableSliderZoomHorizontal: 0
+    m_EnableSliderZoomVertical: 0
+    m_UniformScale: 1
+    m_UpDirection: 1
+    m_DrawArea:
+      serializedVersion: 2
+      x: 0
+      y: 21
+      width: 1014
+      height: 696
+    m_Scale: {x: 1, y: 1}
+    m_Translation: {x: 507, y: 348}
+    m_MarginLeft: 0
+    m_MarginRight: 0
+    m_MarginTop: 0
+    m_MarginBottom: 0
+    m_LastShownAreaInsideMargins:
+      serializedVersion: 2
+      x: -507
+      y: -348
+      width: 1014
+      height: 696
+    m_MinimalGUI: 1
+  m_defaultScale: 1
+  m_LastWindowPixelSize: {x: 1014, y: 717}
+  m_ClearInEditMode: 1
+  m_NoCameraWarning: 1
+  m_LowResolutionForAspectRatios: 01000000000000000000
+  m_XRRenderMode: 0
+  m_RenderTexture: {fileID: 0}
+--- !u!114 &3
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Children:
+  - {fileID: 4}
+  - {fileID: 10}
+  m_Position:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1338
+    height: 1067
+  m_MinSize: {x: 200, y: 200}
+  m_MaxSize: {x: 16192, y: 16192}
+  vertical: 1
+  controlID: -1
+--- !u!114 &4
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Children:
+  - {fileID: 5}
+  - {fileID: 7}
+  m_Position:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1338
+    height: 738
+  m_MinSize: {x: 200, y: 100}
+  m_MaxSize: {x: 16192, y: 8096}
+  vertical: 0
+  controlID: -1
+--- !u!114 &5
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Children: []
+  m_Position:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 322
+    height: 738
+  m_MinSize: {x: 200, y: 200}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_ActualView: {fileID: 6}
+  m_Panes:
+  - {fileID: 6}
+  m_Selected: 0
+  m_LastSelected: 0
+--- !u!114 &6
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12061, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 200, y: 200}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_TitleContent:
+    m_Text: Hierarchy
+    m_Image: {fileID: 7966133145522015247, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 0
+    y: 73
+    width: 321
+    height: 717
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+  m_SceneHierarchy:
+    m_TreeViewState:
+      scrollPos: {x: 0, y: 0}
+      m_SelectedIDs: f8460000
+      m_LastClickedID: 18168
+      m_ExpandedIDs: 00fbffff
+      m_RenameOverlay:
+        m_UserAcceptedRename: 0
+        m_Name: 
+        m_OriginalName: 
+        m_EditFieldRect:
+          serializedVersion: 2
+          x: 0
+          y: 0
+          width: 0
+          height: 0
+        m_UserData: 0
+        m_IsWaitingForDelay: 0
+        m_IsRenaming: 0
+        m_OriginalEventType: 11
+        m_IsRenamingFilename: 0
+        m_ClientGUIView: {fileID: 5}
+      m_SearchString: 
+    m_ExpandedScenes: []
+    m_CurrenRootInstanceID: 0
+    m_LockTracker:
+      m_IsLocked: 0
+    m_CurrentSortingName: TransformSorting
+  m_WindowGUID: e64175bb56e1f874f90f7473823df77e
+--- !u!114 &7
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: GameView
+  m_EditorClassIdentifier: 
+  m_Children: []
+  m_Position:
+    serializedVersion: 2
+    x: 322
+    y: 0
+    width: 1016
+    height: 738
+  m_MinSize: {x: 200, y: 200}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_ActualView: {fileID: 2}
+  m_Panes:
+  - {fileID: 8}
+  - {fileID: 2}
+  - {fileID: 9}
+  m_Selected: 1
+  m_LastSelected: 0
+--- !u!114 &8
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12013, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 200, y: 200}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_TitleContent:
+    m_Text: Scene
+    m_Image: {fileID: 2593428753322112591, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 322
+    y: 73
+    width: 1014
+    height: 717
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData:
+    - dockPosition: 0
+      containerId: overlay-toolbar__top
+      floating: 0
+      collapsed: 0
+      displayed: 1
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: -101, y: -26}
+      snapCorner: 3
+      id: Tool Settings
+      index: 0
+      layout: 1
+    - dockPosition: 0
+      containerId: overlay-toolbar__top
+      floating: 0
+      collapsed: 0
+      displayed: 1
+      snapOffset: {x: -141, y: 149}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 1
+      id: unity-grid-and-snap-toolbar
+      index: 1
+      layout: 1
+    - dockPosition: 1
+      containerId: overlay-toolbar__top
+      floating: 0
+      collapsed: 0
+      displayed: 1
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: unity-scene-view-toolbar
+      index: 0
+      layout: 1
+    - dockPosition: 1
+      containerId: overlay-toolbar__top
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 1
+      id: unity-search-toolbar
+      index: 1
+      layout: 1
+    - dockPosition: 0
+      containerId: overlay-container--left
+      floating: 0
+      collapsed: 0
+      displayed: 1
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: unity-transform-toolbar
+      index: 0
+      layout: 2
+    - dockPosition: 0
+      containerId: overlay-container--left
+      floating: 0
+      collapsed: 0
+      displayed: 1
+      snapOffset: {x: 0, y: 197}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: unity-component-tools
+      index: 1
+      layout: 2
+    - dockPosition: 0
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 1
+      snapOffset: {x: 67.5, y: 86}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Orientation
+      index: 0
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Light Settings
+      index: 0
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Camera
+      index: 1
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Cloth Constraints
+      index: 2
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Cloth Collisions
+      index: 3
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Navmesh Display
+      index: 4
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Agent Display
+      index: 5
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Obstacle Display
+      index: 6
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Occlusion Culling
+      index: 7
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Physics Debugger
+      index: 8
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Scene Visibility
+      index: 9
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: -231, y: -197}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 3
+      id: Scene View/Particles
+      index: 10
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Tilemap
+      index: 11
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Tilemap Palette Helper
+      index: 12
+      layout: 4
+  m_WindowGUID: 3bff119de1f0705498258c381511cfb2
+  m_Gizmos: 1
+  m_OverrideSceneCullingMask: 6917529027641081856
+  m_SceneIsLit: 1
+  m_SceneLighting: 1
+  m_2DMode: 0
+  m_isRotationLocked: 0
+  m_PlayAudio: 0
+  m_AudioPlay: 0
+  m_Position:
+    m_Target: {x: 1014.7286, y: 651.0632, z: 112.927155}
+    speed: 2
+    m_Value: {x: 1014.7286, y: 651.0632, z: 112.927155}
+  m_RenderMode: 0
+  m_CameraMode:
+    drawMode: 0
+    name: Shaded
+    section: Shading Mode
+  m_ValidateTrueMetals: 0
+  m_DoValidateTrueMetals: 0
+  m_ExposureSliderValue: 0
+  m_SceneViewState:
+    m_AlwaysRefresh: 0
+    showFog: 1
+    showSkybox: 1
+    showFlares: 1
+    showImageEffects: 1
+    showParticleSystems: 1
+    showVisualEffectGraphs: 1
+    m_FxEnabled: 1
+  m_Grid:
+    xGrid:
+      m_Fade:
+        m_Target: 0
+        speed: 2
+        m_Value: 0
+      m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4}
+      m_Pivot: {x: 0, y: 0, z: 0}
+      m_Size: {x: 0, y: 0}
+    yGrid:
+      m_Fade:
+        m_Target: 1
+        speed: 2
+        m_Value: 1
+      m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4}
+      m_Pivot: {x: 0, y: 0, z: 0}
+      m_Size: {x: 1, y: 1}
+    zGrid:
+      m_Fade:
+        m_Target: 0
+        speed: 2
+        m_Value: 0
+      m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4}
+      m_Pivot: {x: 0, y: 0, z: 0}
+      m_Size: {x: 1, y: 1}
+    m_ShowGrid: 1
+    m_GridAxis: 1
+    m_gridOpacity: 0.5
+  m_Rotation:
+    m_Target: {x: -0.045127872, y: -0.08920916, z: 0.0039052907, w: -0.99501944}
+    speed: 2
+    m_Value: {x: -0.04512621, y: -0.089205876, z: 0.0039051468, w: -0.9949828}
+  m_Size:
+    m_Target: 110.44119
+    speed: 2
+    m_Value: 110.44119
+  m_Ortho:
+    m_Target: 0
+    speed: 2
+    m_Value: 0
+  m_CameraSettings:
+    m_Speed: 1
+    m_SpeedNormalized: 0.5
+    m_SpeedMin: 0.01
+    m_SpeedMax: 2
+    m_EasingEnabled: 1
+    m_EasingDuration: 0.4
+    m_AccelerationEnabled: 1
+    m_FieldOfViewHorizontalOrVertical: 60
+    m_NearClip: 0.03
+    m_FarClip: 10000
+    m_DynamicClip: 1
+    m_OcclusionCulling: 0
+  m_LastSceneViewRotation: {x: -0.42810407, y: -0.3283806, z: 0.17031872, w: -0.8245956}
+  m_LastSceneViewOrtho: 0
+  m_ReplacementShader: {fileID: 0}
+  m_ReplacementString: 
+  m_SceneVisActive: 1
+  m_LastLockedObject: {fileID: 0}
+  m_ViewIsLockedToObject: 0
+--- !u!114 &9
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12111, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 400, y: 100}
+  m_MaxSize: {x: 2048, y: 2048}
+  m_TitleContent:
+    m_Text: Asset Store
+    m_Image: {fileID: -8693916549880196297, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 322
+    y: 80
+    width: 1014
+    height: 717
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+--- !u!114 &10
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: ProjectBrowser
+  m_EditorClassIdentifier: 
+  m_Children: []
+  m_Position:
+    serializedVersion: 2
+    x: 0
+    y: 738
+    width: 1338
+    height: 329
+  m_MinSize: {x: 231, y: 271}
+  m_MaxSize: {x: 10001, y: 10021}
+  m_ActualView: {fileID: 11}
+  m_Panes:
+  - {fileID: 11}
+  - {fileID: 12}
+  m_Selected: 0
+  m_LastSelected: 1
+--- !u!114 &11
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12014, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 230, y: 250}
+  m_MaxSize: {x: 10000, y: 10000}
+  m_TitleContent:
+    m_Text: Project
+    m_Image: {fileID: -5467254957812901981, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 0
+    y: 811
+    width: 1337
+    height: 308
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+  m_SearchFilter:
+    m_NameFilter: 
+    m_ClassNames: []
+    m_AssetLabels: []
+    m_AssetBundleNames: []
+    m_VersionControlStates: []
+    m_SoftLockControlStates: []
+    m_ReferencingInstanceIDs: 
+    m_SceneHandles: 
+    m_ShowAllHits: 0
+    m_SkipHidden: 0
+    m_SearchArea: 1
+    m_Folders:
+    - Assets
+    m_Globs: []
+    m_OriginalText: 
+  m_ViewMode: 1
+  m_StartGridSize: 64
+  m_LastFolders:
+  - Assets
+  m_LastFoldersGridSize: -1
+  m_LastProjectPath: C:\Source\BTA\source\application\Streaming_Map_Demo
+  m_LockTracker:
+    m_IsLocked: 0
+  m_FolderTreeState:
+    scrollPos: {x: 0, y: 0}
+    m_SelectedIDs: 6c480000
+    m_LastClickedID: 18540
+    m_ExpandedIDs: 000000006c4800006e480000704800007248000000ca9a3bffffff7f
+    m_RenameOverlay:
+      m_UserAcceptedRename: 0
+      m_Name: 
+      m_OriginalName: 
+      m_EditFieldRect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 0
+        height: 0
+      m_UserData: 0
+      m_IsWaitingForDelay: 0
+      m_IsRenaming: 0
+      m_OriginalEventType: 11
+      m_IsRenamingFilename: 1
+      m_ClientGUIView: {fileID: 0}
+    m_SearchString: 
+    m_CreateAssetUtility:
+      m_EndAction: {fileID: 0}
+      m_InstanceID: 0
+      m_Path: 
+      m_Icon: {fileID: 0}
+      m_ResourceFile: 
+  m_AssetTreeState:
+    scrollPos: {x: 0, y: 0}
+    m_SelectedIDs: 
+    m_LastClickedID: 0
+    m_ExpandedIDs: 000000006c4800006e4800007048000072480000
+    m_RenameOverlay:
+      m_UserAcceptedRename: 0
+      m_Name: 
+      m_OriginalName: 
+      m_EditFieldRect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 0
+        height: 0
+      m_UserData: 0
+      m_IsWaitingForDelay: 0
+      m_IsRenaming: 0
+      m_OriginalEventType: 11
+      m_IsRenamingFilename: 1
+      m_ClientGUIView: {fileID: 0}
+    m_SearchString: 
+    m_CreateAssetUtility:
+      m_EndAction: {fileID: 0}
+      m_InstanceID: 0
+      m_Path: 
+      m_Icon: {fileID: 0}
+      m_ResourceFile: 
+  m_ListAreaState:
+    m_SelectedInstanceIDs: f8460000
+    m_LastClickedInstanceID: 18168
+    m_HadKeyboardFocusLastEvent: 0
+    m_ExpandedInstanceIDs: c6230000
+    m_RenameOverlay:
+      m_UserAcceptedRename: 0
+      m_Name: 
+      m_OriginalName: 
+      m_EditFieldRect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 0
+        height: 0
+      m_UserData: 0
+      m_IsWaitingForDelay: 0
+      m_IsRenaming: 0
+      m_OriginalEventType: 11
+      m_IsRenamingFilename: 1
+      m_ClientGUIView: {fileID: 10}
+    m_CreateAssetUtility:
+      m_EndAction: {fileID: 0}
+      m_InstanceID: 0
+      m_Path: 
+      m_Icon: {fileID: 0}
+      m_ResourceFile: 
+    m_NewAssetIndexInList: -1
+    m_ScrollPosition: {x: 0, y: 0}
+    m_GridSize: 64
+  m_SkipHiddenPackages: 0
+  m_DirectoriesAreaWidth: 290
+--- !u!114 &12
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12003, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 100, y: 100}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_TitleContent:
+    m_Text: Console
+    m_Image: {fileID: -4327648978806127646, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 0
+    y: 811
+    width: 1337
+    height: 308
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+--- !u!114 &13
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: InspectorWindow
+  m_EditorClassIdentifier: 
+  m_Children: []
+  m_Position:
+    serializedVersion: 2
+    x: 1338
+    y: 0
+    width: 582
+    height: 1067
+  m_MinSize: {x: 275, y: 50}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_ActualView: {fileID: 14}
+  m_Panes:
+  - {fileID: 14}
+  - {fileID: 15}
+  m_Selected: 0
+  m_LastSelected: 1
+--- !u!114 &14
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12019, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 275, y: 50}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_TitleContent:
+    m_Text: Inspector
+    m_Image: {fileID: -2667387946076563598, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 1338
+    y: 73
+    width: 581
+    height: 1046
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+  m_ObjectsLockedBeforeSerialization: []
+  m_InstanceIDsLockedBeforeSerialization: 
+  m_PreviewResizer:
+    m_CachedPref: 160
+    m_ControlHash: -371814159
+    m_PrefName: Preview_InspectorPreview
+  m_LastInspectedObjectInstanceID: -1
+  m_LastVerticalScrollValue: 0
+  m_GlobalObjectId: 
+  m_InspectorMode: 0
+  m_LockTracker:
+    m_IsLocked: 0
+  m_PreviewWindow: {fileID: 0}
+--- !u!114 &15
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 13854, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 310, y: 200}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_TitleContent:
+    m_Text: Project Settings
+    m_Image: {fileID: -5712115415447495865, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 1175
+    y: 73
+    width: 744
+    height: 1046
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+  m_PosLeft: {x: 0, y: 0}
+  m_PosRight: {x: 0, y: 0}
+  m_Scope: 1
+  m_SplitterFlex: 0.2
+  m_SearchText: 
+  m_TreeViewState:
+    scrollPos: {x: 0, y: 0}
+    m_SelectedIDs: 53336be2
+    m_LastClickedID: -496290989
+    m_ExpandedIDs: a01a5fa600000000c53aba5a
+    m_RenameOverlay:
+      m_UserAcceptedRename: 0
+      m_Name: 
+      m_OriginalName: 
+      m_EditFieldRect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 0
+        height: 0
+      m_UserData: 0
+      m_IsWaitingForDelay: 0
+      m_IsRenaming: 0
+      m_OriginalEventType: 11
+      m_IsRenamingFilename: 0
+      m_ClientGUIView: {fileID: 0}
+    m_SearchString: 
diff --git a/UserSettings/Layouts/default-2021.dwlt b/UserSettings/Layouts/default-2021.dwlt
new file mode 100644
index 00000000..092f81f0
--- /dev/null
+++ b/UserSettings/Layouts/default-2021.dwlt
@@ -0,0 +1,1106 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &1
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12004, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_PixelRect:
+    serializedVersion: 2
+    x: 0
+    y: 43.2
+    width: 1536
+    height: 780.8
+  m_ShowMode: 4
+  m_Title: Game
+  m_RootView: {fileID: 2}
+  m_MinSize: {x: 875, y: 300}
+  m_MaxSize: {x: 10000, y: 10000}
+  m_Maximized: 1
+--- !u!114 &2
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12008, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Children:
+  - {fileID: 3}
+  - {fileID: 5}
+  - {fileID: 4}
+  m_Position:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1536
+    height: 780.8
+  m_MinSize: {x: 875, y: 300}
+  m_MaxSize: {x: 10000, y: 10000}
+  m_UseTopView: 1
+  m_TopViewHeight: 30
+  m_UseBottomView: 1
+  m_BottomViewHeight: 20
+--- !u!114 &3
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12011, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Children: []
+  m_Position:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1536
+    height: 30
+  m_MinSize: {x: 0, y: 0}
+  m_MaxSize: {x: 0, y: 0}
+  m_LastLoadedLayoutName: 
+--- !u!114 &4
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12042, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Children: []
+  m_Position:
+    serializedVersion: 2
+    x: 0
+    y: 760.8
+    width: 1536
+    height: 20
+  m_MinSize: {x: 0, y: 0}
+  m_MaxSize: {x: 0, y: 0}
+--- !u!114 &5
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Children:
+  - {fileID: 6}
+  - {fileID: 11}
+  m_Position:
+    serializedVersion: 2
+    x: 0
+    y: 30
+    width: 1536
+    height: 730.8
+  m_MinSize: {x: 300, y: 200}
+  m_MaxSize: {x: 24288, y: 16192}
+  vertical: 0
+  controlID: 27
+--- !u!114 &6
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Children:
+  - {fileID: 7}
+  - {fileID: 10}
+  m_Position:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1070.4
+    height: 730.8
+  m_MinSize: {x: 200, y: 200}
+  m_MaxSize: {x: 16192, y: 16192}
+  vertical: 1
+  controlID: 28
+--- !u!114 &7
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Children:
+  - {fileID: 8}
+  - {fileID: 9}
+  m_Position:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1070.4
+    height: 504.8
+  m_MinSize: {x: 200, y: 100}
+  m_MaxSize: {x: 16192, y: 8096}
+  vertical: 0
+  controlID: 29
+--- !u!114 &8
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Children: []
+  m_Position:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 257.6
+    height: 504.8
+  m_MinSize: {x: 200, y: 200}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_ActualView: {fileID: 14}
+  m_Panes:
+  - {fileID: 14}
+  m_Selected: 0
+  m_LastSelected: 0
+--- !u!114 &9
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: SceneView
+  m_EditorClassIdentifier: 
+  m_Children: []
+  m_Position:
+    serializedVersion: 2
+    x: 257.6
+    y: 0
+    width: 812.80005
+    height: 504.8
+  m_MinSize: {x: 202, y: 221}
+  m_MaxSize: {x: 4002, y: 4021}
+  m_ActualView: {fileID: 15}
+  m_Panes:
+  - {fileID: 15}
+  - {fileID: 13}
+  - {fileID: 16}
+  m_Selected: 0
+  m_LastSelected: 1
+--- !u!114 &10
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: ProjectBrowser
+  m_EditorClassIdentifier: 
+  m_Children: []
+  m_Position:
+    serializedVersion: 2
+    x: 0
+    y: 504.8
+    width: 1070.4
+    height: 226
+  m_MinSize: {x: 231, y: 271}
+  m_MaxSize: {x: 10001, y: 10021}
+  m_ActualView: {fileID: 17}
+  m_Panes:
+  - {fileID: 17}
+  - {fileID: 18}
+  m_Selected: 0
+  m_LastSelected: 1
+--- !u!114 &11
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: InspectorWindow
+  m_EditorClassIdentifier: 
+  m_Children: []
+  m_Position:
+    serializedVersion: 2
+    x: 1070.4
+    y: 0
+    width: 465.59998
+    height: 730.8
+  m_MinSize: {x: 275, y: 50}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_ActualView: {fileID: 19}
+  m_Panes:
+  - {fileID: 19}
+  - {fileID: 20}
+  - {fileID: 12}
+  m_Selected: 0
+  m_LastSelected: 1
+--- !u!114 &12
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 12079, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 390, y: 390}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_TitleContent:
+    m_Text: Lighting
+    m_Image: {fileID: -1477008817101679558, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 1338
+    y: 73
+    width: 581
+    height: 1046
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+    m_OverlaysVisible: 1
+--- !u!114 &13
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12015, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 200, y: 200}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_TitleContent:
+    m_Text: Game
+    m_Image: {fileID: 4621777727084837110, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 257.6
+    y: 73.6
+    width: 810.80005
+    height: 483.8
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+    m_OverlaysVisible: 1
+  m_SerializedViewNames: []
+  m_SerializedViewValues: []
+  m_PlayModeViewName: GameView
+  m_ShowGizmos: 0
+  m_TargetDisplay: 0
+  m_ClearColor: {r: 0, g: 0, b: 0, a: 0}
+  m_TargetSize: {x: 810.80005, y: 462.8}
+  m_TextureFilterMode: 0
+  m_TextureHideFlags: 61
+  m_RenderIMGUI: 1
+  m_EnterPlayModeBehavior: 0
+  m_UseMipMap: 0
+  m_VSyncEnabled: 0
+  m_Gizmos: 0
+  m_Stats: 1
+  m_SelectedSizes: 00000000000000000000000000000000000000000000000000000000000000000000000000000000
+  m_ZoomArea:
+    m_HRangeLocked: 0
+    m_VRangeLocked: 0
+    hZoomLockedByDefault: 0
+    vZoomLockedByDefault: 0
+    m_HBaseRangeMin: -324.32004
+    m_HBaseRangeMax: 324.32004
+    m_VBaseRangeMin: -185.12
+    m_VBaseRangeMax: 185.12
+    m_HAllowExceedBaseRangeMin: 1
+    m_HAllowExceedBaseRangeMax: 1
+    m_VAllowExceedBaseRangeMin: 1
+    m_VAllowExceedBaseRangeMax: 1
+    m_ScaleWithWindow: 0
+    m_HSlider: 0
+    m_VSlider: 0
+    m_IgnoreScrollWheelUntilClicked: 0
+    m_EnableMouseInput: 0
+    m_EnableSliderZoomHorizontal: 0
+    m_EnableSliderZoomVertical: 0
+    m_UniformScale: 1
+    m_UpDirection: 1
+    m_DrawArea:
+      serializedVersion: 2
+      x: 0
+      y: 21
+      width: 810.80005
+      height: 462.8
+    m_Scale: {x: 1, y: 1}
+    m_Translation: {x: 405.40002, y: 231.4}
+    m_MarginLeft: 0
+    m_MarginRight: 0
+    m_MarginTop: 0
+    m_MarginBottom: 0
+    m_LastShownAreaInsideMargins:
+      serializedVersion: 2
+      x: -405.40002
+      y: -231.4
+      width: 810.80005
+      height: 462.8
+    m_MinimalGUI: 1
+  m_defaultScale: 1
+  m_LastWindowPixelSize: {x: 1013.50006, y: 604.75}
+  m_ClearInEditMode: 1
+  m_NoCameraWarning: 1
+  m_LowResolutionForAspectRatios: 01000000000000000000
+  m_XRRenderMode: 0
+  m_RenderTexture: {fileID: 0}
+--- !u!114 &14
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12061, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 200, y: 200}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_TitleContent:
+    m_Text: Hierarchy
+    m_Image: {fileID: -3734745235275155857, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 0
+    y: 73.6
+    width: 256.6
+    height: 483.8
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+    m_OverlaysVisible: 1
+  m_SceneHierarchy:
+    m_TreeViewState:
+      scrollPos: {x: 0, y: 0}
+      m_SelectedIDs: 
+      m_LastClickedID: 0
+      m_ExpandedIDs: 00fbffff
+      m_RenameOverlay:
+        m_UserAcceptedRename: 0
+        m_Name: 
+        m_OriginalName: 
+        m_EditFieldRect:
+          serializedVersion: 2
+          x: 0
+          y: 0
+          width: 0
+          height: 0
+        m_UserData: 0
+        m_IsWaitingForDelay: 0
+        m_IsRenaming: 0
+        m_OriginalEventType: 11
+        m_IsRenamingFilename: 0
+        m_ClientGUIView: {fileID: 8}
+      m_SearchString: 
+    m_ExpandedScenes: []
+    m_CurrenRootInstanceID: 0
+    m_LockTracker:
+      m_IsLocked: 0
+    m_CurrentSortingName: TransformSorting
+  m_WindowGUID: e64175bb56e1f874f90f7473823df77e
+--- !u!114 &15
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12013, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 200, y: 200}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_TitleContent:
+    m_Text: Scene
+    m_Image: {fileID: 8634526014445323508, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 257.6
+    y: 73.6
+    width: 810.80005
+    height: 483.8
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData:
+    - dockPosition: 0
+      containerId: overlay-toolbar__top
+      floating: 0
+      collapsed: 0
+      displayed: 1
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: -100, y: -25.600006}
+      snapCorner: 3
+      id: Tool Settings
+      index: 0
+      layout: 1
+    - dockPosition: 0
+      containerId: overlay-toolbar__top
+      floating: 0
+      collapsed: 0
+      displayed: 1
+      snapOffset: {x: -141, y: 149}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 1
+      id: unity-grid-and-snap-toolbar
+      index: 1
+      layout: 1
+    - dockPosition: 1
+      containerId: overlay-toolbar__top
+      floating: 0
+      collapsed: 0
+      displayed: 1
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: unity-scene-view-toolbar
+      index: 0
+      layout: 1
+    - dockPosition: 1
+      containerId: overlay-toolbar__top
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 1
+      id: unity-search-toolbar
+      index: 1
+      layout: 1
+    - dockPosition: 0
+      containerId: overlay-container--left
+      floating: 0
+      collapsed: 0
+      displayed: 1
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: unity-transform-toolbar
+      index: 0
+      layout: 2
+    - dockPosition: 0
+      containerId: overlay-container--left
+      floating: 0
+      collapsed: 0
+      displayed: 1
+      snapOffset: {x: 0, y: 197}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: unity-component-tools
+      index: 1
+      layout: 2
+    - dockPosition: 0
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 1
+      snapOffset: {x: 67.5, y: 86}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Orientation
+      index: 0
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Light Settings
+      index: 0
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Camera
+      index: 1
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Cloth Constraints
+      index: 2
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Cloth Collisions
+      index: 3
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Navmesh Display
+      index: 4
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Agent Display
+      index: 5
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Obstacle Display
+      index: 6
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Occlusion Culling
+      index: 7
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Physics Debugger
+      index: 8
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Scene Visibility
+      index: 9
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: -231, y: -197}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 3
+      id: Scene View/Particles
+      index: 10
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Tilemap
+      index: 11
+      layout: 4
+    - dockPosition: 1
+      containerId: overlay-container--right
+      floating: 0
+      collapsed: 0
+      displayed: 0
+      snapOffset: {x: 0, y: 0}
+      snapOffsetDelta: {x: 0, y: 0}
+      snapCorner: 0
+      id: Scene View/Tilemap Palette Helper
+      index: 12
+      layout: 4
+    m_OverlaysVisible: 1
+  m_WindowGUID: 3bff119de1f0705498258c381511cfb2
+  m_Gizmos: 1
+  m_OverrideSceneCullingMask: 6917529027641081856
+  m_SceneIsLit: 1
+  m_SceneLighting: 1
+  m_2DMode: 0
+  m_isRotationLocked: 0
+  m_PlayAudio: 0
+  m_AudioPlay: 0
+  m_Position:
+    m_Target: {x: 785.0064, y: 616.1729, z: 145.13019}
+    speed: 2
+    m_Value: {x: 785.0064, y: 616.1729, z: 145.13019}
+  m_RenderMode: 0
+  m_CameraMode:
+    drawMode: 0
+    name: Shaded
+    section: Shading Mode
+  m_ValidateTrueMetals: 0
+  m_DoValidateTrueMetals: 0
+  m_ExposureSliderValue: 0
+  m_SceneViewState:
+    m_AlwaysRefresh: 0
+    showFog: 1
+    showSkybox: 1
+    showFlares: 1
+    showImageEffects: 1
+    showParticleSystems: 1
+    showVisualEffectGraphs: 1
+    m_FxEnabled: 1
+  m_Grid:
+    xGrid:
+      m_Fade:
+        m_Target: 0
+        speed: 2
+        m_Value: 0
+      m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4}
+      m_Pivot: {x: 0, y: 0, z: 0}
+      m_Size: {x: 0, y: 0}
+    yGrid:
+      m_Fade:
+        m_Target: 1
+        speed: 2
+        m_Value: 1
+      m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4}
+      m_Pivot: {x: 0, y: 0, z: 0}
+      m_Size: {x: 1, y: 1}
+    zGrid:
+      m_Fade:
+        m_Target: 0
+        speed: 2
+        m_Value: 0
+      m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4}
+      m_Pivot: {x: 0, y: 0, z: 0}
+      m_Size: {x: 1, y: 1}
+    m_ShowGrid: 1
+    m_GridAxis: 1
+    m_gridOpacity: 0.5
+  m_Rotation:
+    m_Target: {x: -0.00181522, y: -0.069854796, z: -0.000008405676, w: -0.9975928}
+    speed: 2
+    m_Value: {x: -0.0018151525, y: -0.069852196, z: -0.000008405364, w: -0.99755573}
+  m_Size:
+    m_Target: 186.08702
+    speed: 2
+    m_Value: 186.08702
+  m_Ortho:
+    m_Target: 0
+    speed: 2
+    m_Value: 0
+  m_CameraSettings:
+    m_Speed: 1
+    m_SpeedNormalized: 0.5
+    m_SpeedMin: 0.01
+    m_SpeedMax: 2
+    m_EasingEnabled: 1
+    m_EasingDuration: 0.4
+    m_AccelerationEnabled: 1
+    m_FieldOfViewHorizontalOrVertical: 60
+    m_NearClip: 0.03
+    m_FarClip: 10000
+    m_DynamicClip: 1
+    m_OcclusionCulling: 0
+  m_LastSceneViewRotation: {x: -0.42810407, y: -0.3283806, z: 0.17031872, w: -0.8245956}
+  m_LastSceneViewOrtho: 0
+  m_ReplacementShader: {fileID: 0}
+  m_ReplacementString: 
+  m_SceneVisActive: 1
+  m_LastLockedObject: {fileID: 0}
+  m_ViewIsLockedToObject: 0
+--- !u!114 &16
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12111, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 400, y: 100}
+  m_MaxSize: {x: 2048, y: 2048}
+  m_TitleContent:
+    m_Text: Asset Store
+    m_Image: {fileID: -7444545952099596278, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 322
+    y: 80
+    width: 1014
+    height: 717
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+    m_OverlaysVisible: 1
+--- !u!114 &17
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12014, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 230, y: 250}
+  m_MaxSize: {x: 10000, y: 10000}
+  m_TitleContent:
+    m_Text: Project
+    m_Image: {fileID: -5179483145760003458, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 0
+    y: 578.4
+    width: 1069.4
+    height: 205
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+    m_OverlaysVisible: 1
+  m_SearchFilter:
+    m_NameFilter: 
+    m_ClassNames: []
+    m_AssetLabels: []
+    m_AssetBundleNames: []
+    m_VersionControlStates: []
+    m_SoftLockControlStates: []
+    m_ReferencingInstanceIDs: 
+    m_SceneHandles: 
+    m_ShowAllHits: 0
+    m_SkipHidden: 0
+    m_SearchArea: 1
+    m_Folders:
+    - Assets
+    m_Globs: []
+    m_OriginalText: 
+  m_ViewMode: 1
+  m_StartGridSize: 64
+  m_LastFolders:
+  - Assets
+  m_LastFoldersGridSize: -1
+  m_LastProjectPath: C:\Source\Streaming_Map_Demo_Source
+  m_LockTracker:
+    m_IsLocked: 0
+  m_FolderTreeState:
+    scrollPos: {x: 0, y: 64}
+    m_SelectedIDs: b6480000
+    m_LastClickedID: 18614
+    m_ExpandedIDs: 00000000b6480000b8480000ba480000bc480000be480000c0480000c2480000c4480000c6480000c8480000ca480000cc480000ce480000d0480000d2480000d448000000ca9a3b
+    m_RenameOverlay:
+      m_UserAcceptedRename: 0
+      m_Name: 
+      m_OriginalName: 
+      m_EditFieldRect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 0
+        height: 0
+      m_UserData: 0
+      m_IsWaitingForDelay: 0
+      m_IsRenaming: 0
+      m_OriginalEventType: 11
+      m_IsRenamingFilename: 1
+      m_ClientGUIView: {fileID: 0}
+    m_SearchString: 
+    m_CreateAssetUtility:
+      m_EndAction: {fileID: 0}
+      m_InstanceID: 0
+      m_Path: 
+      m_Icon: {fileID: 0}
+      m_ResourceFile: 
+  m_AssetTreeState:
+    scrollPos: {x: 0, y: 0}
+    m_SelectedIDs: 
+    m_LastClickedID: 0
+    m_ExpandedIDs: 00000000b6480000b8480000ba480000bc480000be480000c0480000c2480000c4480000c6480000c8480000ca480000cc480000ce480000d0480000d2480000d4480000
+    m_RenameOverlay:
+      m_UserAcceptedRename: 0
+      m_Name: 
+      m_OriginalName: 
+      m_EditFieldRect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 0
+        height: 0
+      m_UserData: 0
+      m_IsWaitingForDelay: 0
+      m_IsRenaming: 0
+      m_OriginalEventType: 11
+      m_IsRenamingFilename: 1
+      m_ClientGUIView: {fileID: 0}
+    m_SearchString: 
+    m_CreateAssetUtility:
+      m_EndAction: {fileID: 0}
+      m_InstanceID: 0
+      m_Path: 
+      m_Icon: {fileID: 0}
+      m_ResourceFile: 
+  m_ListAreaState:
+    m_SelectedInstanceIDs: 
+    m_LastClickedInstanceID: 0
+    m_HadKeyboardFocusLastEvent: 0
+    m_ExpandedInstanceIDs: c6230000
+    m_RenameOverlay:
+      m_UserAcceptedRename: 0
+      m_Name: 
+      m_OriginalName: 
+      m_EditFieldRect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 0
+        height: 0
+      m_UserData: 0
+      m_IsWaitingForDelay: 0
+      m_IsRenaming: 0
+      m_OriginalEventType: 11
+      m_IsRenamingFilename: 1
+      m_ClientGUIView: {fileID: 10}
+    m_CreateAssetUtility:
+      m_EndAction: {fileID: 0}
+      m_InstanceID: 0
+      m_Path: 
+      m_Icon: {fileID: 0}
+      m_ResourceFile: 
+    m_NewAssetIndexInList: -1
+    m_ScrollPosition: {x: 0, y: 0}
+    m_GridSize: 64
+  m_SkipHiddenPackages: 0
+  m_DirectoriesAreaWidth: 290
+--- !u!114 &18
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12003, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 100, y: 100}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_TitleContent:
+    m_Text: Console
+    m_Image: {fileID: -4950941429401207979, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 0
+    y: 811
+    width: 1337
+    height: 308
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+    m_OverlaysVisible: 1
+--- !u!114 &19
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 1
+  m_Script: {fileID: 12019, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 275, y: 50}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_TitleContent:
+    m_Text: Inspector
+    m_Image: {fileID: -440750813802333266, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 1070.4
+    y: 73.6
+    width: 464.59998
+    height: 709.8
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+    m_OverlaysVisible: 1
+  m_ObjectsLockedBeforeSerialization: []
+  m_InstanceIDsLockedBeforeSerialization: 
+  m_PreviewResizer:
+    m_CachedPref: 273
+    m_ControlHash: -371814159
+    m_PrefName: Preview_InspectorPreview
+  m_LastInspectedObjectInstanceID: -1
+  m_LastVerticalScrollValue: 0
+  m_GlobalObjectId: 
+  m_InspectorMode: 0
+  m_LockTracker:
+    m_IsLocked: 0
+  m_PreviewWindow: {fileID: 0}
+--- !u!114 &20
+MonoBehaviour:
+  m_ObjectHideFlags: 52
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 13854, guid: 0000000000000000e000000000000000, type: 0}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_MinSize: {x: 310, y: 200}
+  m_MaxSize: {x: 4000, y: 4000}
+  m_TitleContent:
+    m_Text: Project Settings
+    m_Image: {fileID: 866346219090771560, guid: 0000000000000000d000000000000000,
+      type: 0}
+    m_Tooltip: 
+  m_Pos:
+    serializedVersion: 2
+    x: 1338
+    y: 73
+    width: 581
+    height: 1046
+  m_ViewDataDictionary: {fileID: 0}
+  m_OverlayCanvas:
+    m_LastAppliedPresetName: Default
+    m_SaveData: []
+    m_OverlaysVisible: 1
+  m_PosLeft: {x: 0, y: 0}
+  m_PosRight: {x: 0, y: 0}
+  m_Scope: 1
+  m_SplitterFlex: 0.2
+  m_SearchText: 
+  m_TreeViewState:
+    scrollPos: {x: 0, y: 0}
+    m_SelectedIDs: 53336be2
+    m_LastClickedID: -496290989
+    m_ExpandedIDs: 00000000c53aba5a
+    m_RenameOverlay:
+      m_UserAcceptedRename: 0
+      m_Name: 
+      m_OriginalName: 
+      m_EditFieldRect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 0
+        height: 0
+      m_UserData: 0
+      m_IsWaitingForDelay: 0
+      m_IsRenaming: 0
+      m_OriginalEventType: 11
+      m_IsRenamingFilename: 0
+      m_ClientGUIView: {fileID: 0}
+    m_SearchString: 
diff --git a/UserSettings/Search.settings b/UserSettings/Search.settings
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/UserSettings/Search.settings
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
deleted file mode 100644
index 8ca3d5cd..00000000
--- a/azure-pipelines.yml
+++ /dev/null
@@ -1,48 +0,0 @@
-trigger:
-- master
-- develop 
-
-pool:
- name: TS-Windows
-
-variables:
-  ArticleFull: '8866027201'
-  ProjectID: 'MapStreamer'
-  Major: '4'
-  Minor: '3'
-
-workspace:
-  clean: all
-
-# Build number format
-name: $(ArticleFull).$(Major).$(Minor).$(rev:r)
-
-steps:
-- checkout: self 
-  lfs: true
-  clean: true 
-  submodules: recursive
-  persistCredentials: true
-
-- task: GitBuildInformation@0
-  displayName: 'Create build information for repository - branch master or PR to master'
-  condition: or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['System.PullRequest.TargetBranch'], 'refs/heads/master'))
-  inputs:
-    outputFile: 'BuildInfo'
-    branchFilterRegex: '^(origin\/master|origin\/release\/+)'
-    branchApprovedRegex: '^(origin\/master|origin\/release\/+)'
-  continueOnError: false
-
-- task: set-version-variables@1
-  displayName: 'Set version variables according to BuildNumber'
-  inputs:
-    setProductVersionVariable: true
-    setMajorVariable: true
-    setMinorVariable: true
-    setBuildVariable: true
-    setRevisionVariable: true
-    failOnVersionSyntax: true
-    defineCustomizedVariable: false 
-
-- script: echo Version = $(Build_ProductVersion)
-  displayName: 'Pipeline for setting component version and change history'
\ No newline at end of file
diff --git a/cleanup_plugins.bat b/cleanup_plugins.bat
new file mode 100644
index 00000000..f9d6d463
--- /dev/null
+++ b/cleanup_plugins.bat
@@ -0,0 +1,11 @@
+rem ---- Run this to clean plugin folders --------------------------------
+rem ---- Then build Packages project with correct platform and configuration  ---
+
+del /S /Q /F Assets\Plugins\*.dll
+del /S /Q /F Assets\Plugins\*.so
+del /S /Q /F Assets\Plugins\*.pdb
+del /S /Q /F Assets\Plugins\*.lib
+
+
+
+
diff --git a/com.saab.map-streamer/.gitignore b/com.saab.map-streamer/.gitignore
deleted file mode 100644
index cec1d901..00000000
--- a/com.saab.map-streamer/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-!*.meta
-!Debug
-!Release
-[pP]lugins/
-*.dll
-*.xml
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime.meta b/com.saab.map-streamer/Runtime.meta
deleted file mode 100644
index 728328aa..00000000
--- a/com.saab.map-streamer/Runtime.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 02d2981502b4966428cffdab763383d8
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/DefaultTerrainMaterial.mat b/com.saab.map-streamer/Runtime/Assets/DefaultTerrainMaterial.mat
deleted file mode 100644
index 6364e514..00000000
--- a/com.saab.map-streamer/Runtime/Assets/DefaultTerrainMaterial.mat
+++ /dev/null
@@ -1,112 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!21 &2100000
-Material:
-  serializedVersion: 8
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_Name: DefaultTerrainMaterial
-  m_Shader: {fileID: 4800000, guid: 4fba17e32aa778c4f91c0f15aa16e881, type: 3}
-  m_ValidKeywords: []
-  m_InvalidKeywords: []
-  m_LightmapFlags: 4
-  m_EnableInstancingVariants: 1
-  m_DoubleSidedGI: 0
-  m_CustomRenderQueue: -1
-  stringTagMap: {}
-  disabledShaderPasses: []
-  m_SavedProperties:
-    serializedVersion: 3
-    m_TexEnvs:
-    - _BumpMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _DetailAlbedoMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _DetailMask:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _DetailNormalMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _EmissionMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _FeatureMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _HeightMaps:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _MainTex:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _MetallicGlossMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _NormalMaps:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _OcclusionMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _ParallaxMap:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _RoughnessMaps:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    - _Textures:
-        m_Texture: {fileID: 0}
-        m_Scale: {x: 1, y: 1}
-        m_Offset: {x: 0, y: 0}
-    m_Ints: []
-    m_Floats:
-    - _BumpScale: 1
-    - _Cutoff: 0.5
-    - _Detail: 0.25
-    - _DetailBumpScale: 1
-    - _DetailNormalMapScale: 1
-    - _DetailTextureFadeStart: 1
-    - _DetailTextureFadeZoneLength: 1
-    - _DstBlend: 0
-    - _GlossMapScale: 1
-    - _Glossiness: 0.5
-    - _GlossyReflections: 1
-    - _HueShiftInclusion: 1
-    - _Metallic: 0
-    - _Mode: 0
-    - _NormalPower: 1
-    - _OcclusionStrength: 1
-    - _Parallax: 0.02
-    - _RoughnessFallback: 1
-    - _SecondaryNormalIntensity: 1
-    - _Smoothness: 0
-    - _SmoothnessTextureChannel: 0
-    - _SpecularHighlights: 1
-    - _SrcBlend: 1
-    - _TertiaryNormalIntensity: 1
-    - _UVSec: 0
-    - _WaterSmoothness: 0.3
-    - _ZWrite: 1
-    m_Colors:
-    - _Color: {r: 1, g: 1, b: 1, a: 1}
-    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
-    - _SplatMapDimensions: {r: 512, g: 512, b: 0, a: 0}
-  m_BuildTextureStacks: []
diff --git a/com.saab.map-streamer/Runtime/Assets/FoliageSet.meta b/com.saab.map-streamer/Runtime/Assets/FoliageSet.meta
deleted file mode 100644
index 52d0241a..00000000
--- a/com.saab.map-streamer/Runtime/Assets/FoliageSet.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: cb33fb532d7927a4d90a8d93c38e8dcb
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/FoliageSet/DemoGrassSet.asset b/com.saab.map-streamer/Runtime/Assets/FoliageSet/DemoGrassSet.asset
deleted file mode 100644
index 5e238a5e..00000000
--- a/com.saab.map-streamer/Runtime/Assets/FoliageSet/DemoGrassSet.asset
+++ /dev/null
@@ -1,25 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!114 &11400000
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 0}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 82f397700e6a04f429c81d3628c3cfd4, type: 3}
-  m_Name: DemoGrassSet
-  m_EditorClassIdentifier: 
-  Assets:
-  - Foliage: {fileID: 11400000, guid: 71ed269e601695b4caea6bbe0a97284d, type: 2}
-    Weight: 0
-  - Foliage: {fileID: 11400000, guid: 7b8e910c815e3eb419f29cfa93c36608, type: 2}
-    Weight: 0
-  - Foliage: {fileID: 11400000, guid: 4c3604037580ad84b9abb147085e591a, type: 2}
-    Weight: 0
-  - Foliage: {fileID: 11400000, guid: d652826759d75c149908ecda4f58ad43, type: 2}
-    Weight: 0
-  - Foliage: {fileID: 11400000, guid: 82e167656bc22194f919f103ab490571, type: 2}
-    Weight: 0
diff --git a/com.saab.map-streamer/Runtime/Assets/FoliageSet/DemoVegetationSet.asset b/com.saab.map-streamer/Runtime/Assets/FoliageSet/DemoVegetationSet.asset
deleted file mode 100644
index d303ecec..00000000
--- a/com.saab.map-streamer/Runtime/Assets/FoliageSet/DemoVegetationSet.asset
+++ /dev/null
@@ -1,25 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!114 &11400000
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 0}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 82f397700e6a04f429c81d3628c3cfd4, type: 3}
-  m_Name: DemoVegetationSet
-  m_EditorClassIdentifier: 
-  Assets:
-  - Foliage: {fileID: 11400000, guid: da57b986d7b25e0428db808f07d390cf, type: 2}
-    Weight: 0
-  - Foliage: {fileID: 11400000, guid: 73f36aba0294abd40813c3c17fe2d82f, type: 2}
-    Weight: 0
-  - Foliage: {fileID: 11400000, guid: 7f2f7682ea667bc4cbb3af6d7a852a56, type: 2}
-    Weight: 0
-  - Foliage: {fileID: 11400000, guid: cf930c10eaf61584ab165e6fa1d5c36c, type: 2}
-    Weight: 0
-  - Foliage: {fileID: 11400000, guid: c8b018727f8739145a2b49f4b478543a, type: 2}
-    Weight: 0
diff --git a/com.saab.map-streamer/Runtime/Assets/Grass.meta b/com.saab.map-streamer/Runtime/Assets/Grass.meta
deleted file mode 100644
index 2b2d5088..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Grass.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: da31ea5c7cc07e64a9cc676c43ffd932
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass03.asset.meta b/com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass03.asset.meta
deleted file mode 100644
index 2138280f..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Grass/MeadowGrass03.asset.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 82e167656bc22194f919f103ab490571
-NativeFormatImporter:
-  externalObjects: {}
-  mainObjectFileID: 11400000
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Grass/deadGrass01.asset.meta b/com.saab.map-streamer/Runtime/Assets/Grass/deadGrass01.asset.meta
deleted file mode 100644
index 569555d1..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Grass/deadGrass01.asset.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 71ed269e601695b4caea6bbe0a97284d
-NativeFormatImporter:
-  externalObjects: {}
-  mainObjectFileID: 11400000
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Grass/deadGrass02.asset b/com.saab.map-streamer/Runtime/Assets/Grass/deadGrass02.asset
deleted file mode 100644
index 7792060a..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Grass/deadGrass02.asset
+++ /dev/null
@@ -1,26 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!114 &11400000
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 0}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 0fbe837a22ffe434381219dee0818311, type: 3}
-  m_Name: deadGrass02
-  m_EditorClassIdentifier: 
-  MainTexture: {fileID: 2800000, guid: d6929f302024f9d47bdc77dc30d504e8, type: 3}
-  AutumnTexture: {fileID: 0}
-  WinterTexture: {fileID: 0}
-  Normal: {fileID: 0}
-  Mesh: {fileID: 0}
-  MeshMaterial: {fileID: 0}
-  MaxMin: {x: 0.1, y: 0.4}
-  Offset: {x: 0, y: 0.02}
-  Weight: 0.2
-  Feature: 1
-  Biome: 0
-  TextureMode: 0
diff --git a/com.saab.map-streamer/Runtime/Assets/Grass/deadGrass02.asset.meta b/com.saab.map-streamer/Runtime/Assets/Grass/deadGrass02.asset.meta
deleted file mode 100644
index 38d5a792..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Grass/deadGrass02.asset.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 7b8e910c815e3eb419f29cfa93c36608
-NativeFormatImporter:
-  externalObjects: {}
-  mainObjectFileID: 11400000
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Terrain.meta b/com.saab.map-streamer/Runtime/Assets/Terrain.meta
deleted file mode 100644
index d6d5f696..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Terrain.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: cf640317d1fa34f45b6dc90ad7e68b9f
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Terrain/Asphalt.asset b/com.saab.map-streamer/Runtime/Assets/Terrain/Asphalt.asset
deleted file mode 100644
index 4c8af089..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Terrain/Asphalt.asset
+++ /dev/null
@@ -1,19 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!114 &11400000
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 0}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 294b89e81f1027842ae8d67c0ebfb8fb, type: 3}
-  m_Name: Asphalt
-  m_EditorClassIdentifier: 
-  MatchingFeatures: 2097920
-  Albedo: {fileID: 2800000, guid: 130bece99fb2ba84d9804578461589df, type: 3}
-  Normal: {fileID: 2800000, guid: 5b39f670d9d0cd740b59635e47de49af, type: 3}
-  Displacement: {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
-  Roughness: {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
diff --git a/com.saab.map-streamer/Runtime/Assets/Terrain/Asphalt.asset.meta b/com.saab.map-streamer/Runtime/Assets/Terrain/Asphalt.asset.meta
deleted file mode 100644
index f7846f60..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Terrain/Asphalt.asset.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 1f6694de18ad00e4a8b2fec6068d4d23
-NativeFormatImporter:
-  externalObjects: {}
-  mainObjectFileID: 11400000
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Terrain/Grass.asset b/com.saab.map-streamer/Runtime/Assets/Terrain/Grass.asset
deleted file mode 100644
index 5954727a..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Terrain/Grass.asset
+++ /dev/null
@@ -1,19 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!114 &11400000
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 0}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 294b89e81f1027842ae8d67c0ebfb8fb, type: 3}
-  m_Name: Grass
-  m_EditorClassIdentifier: 
-  MatchingFeatures: 17
-  Albedo: {fileID: 2800000, guid: 576ce2cb3b9416648b5a6c12a7b82071, type: 3}
-  Normal: {fileID: 2800000, guid: c1cac4bf4a8504e4dbab23fea896ccf7, type: 3}
-  Displacement: {fileID: 2800000, guid: 1909481ecdfd7f542b4096715c9025b3, type: 3}
-  Roughness: {fileID: 2800000, guid: a488394948220814d8ae734d917ca1a5, type: 3}
diff --git a/com.saab.map-streamer/Runtime/Assets/Terrain/Grass.asset.meta b/com.saab.map-streamer/Runtime/Assets/Terrain/Grass.asset.meta
deleted file mode 100644
index ef96a5c8..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Terrain/Grass.asset.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 8edc1370de3f8384780d2d029e3ea8d9
-NativeFormatImporter:
-  externalObjects: {}
-  mainObjectFileID: 11400000
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Terrain/RoofingTiles.asset b/com.saab.map-streamer/Runtime/Assets/Terrain/RoofingTiles.asset
deleted file mode 100644
index 32ab9338..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Terrain/RoofingTiles.asset
+++ /dev/null
@@ -1,19 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!114 &11400000
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 0}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 294b89e81f1027842ae8d67c0ebfb8fb, type: 3}
-  m_Name: RoofingTiles
-  m_EditorClassIdentifier: 
-  MatchingFeatures: 19
-  Albedo: {fileID: 2800000, guid: 851c4f977709cfa44a64fd06b1038103, type: 3}
-  Normal: {fileID: 2800000, guid: 0ae31176c715c464abb0ea7675df97e8, type: 3}
-  Displacement: {fileID: 2800000, guid: 545c61b7df5822549ba10d00bfbe4e5f, type: 3}
-  Roughness: {fileID: 2800000, guid: d0a94f68019aeeb499bf1f9a6561f005, type: 3}
diff --git a/com.saab.map-streamer/Runtime/Assets/Terrain/RoofingTiles.asset.meta b/com.saab.map-streamer/Runtime/Assets/Terrain/RoofingTiles.asset.meta
deleted file mode 100644
index e08d1337..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Terrain/RoofingTiles.asset.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 873a9a0ff92953f49b3c7b8f9eea4638
-NativeFormatImporter:
-  externalObjects: {}
-  mainObjectFileID: 11400000
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Terrain/Vegetation.asset b/com.saab.map-streamer/Runtime/Assets/Terrain/Vegetation.asset
deleted file mode 100644
index c9917dd6..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Terrain/Vegetation.asset
+++ /dev/null
@@ -1,19 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!114 &11400000
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 0}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 294b89e81f1027842ae8d67c0ebfb8fb, type: 3}
-  m_Name: Vegetation
-  m_EditorClassIdentifier: 
-  MatchingFeatures: 2080
-  Albedo: {fileID: 2800000, guid: bb168c5650579a345a47c12d5c480e51, type: 3}
-  Normal: {fileID: 2800000, guid: 5b39f670d9d0cd740b59635e47de49af, type: 3}
-  Displacement: {fileID: 2800000, guid: 9d7fe0a932dc05a4f869baf5b7a0da12, type: 3}
-  Roughness: {fileID: 2800000, guid: 7e59a6ffbf40e174e90bb59ff1008bc5, type: 3}
diff --git a/com.saab.map-streamer/Runtime/Assets/Terrain/Vegetation.asset.meta b/com.saab.map-streamer/Runtime/Assets/Terrain/Vegetation.asset.meta
deleted file mode 100644
index a67ca97d..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Terrain/Vegetation.asset.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 32b3b8382e9d7bc4a80bf2dcb81c9038
-NativeFormatImporter:
-  externalObjects: {}
-  mainObjectFileID: 11400000
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Terrain/WaterIce.asset b/com.saab.map-streamer/Runtime/Assets/Terrain/WaterIce.asset
deleted file mode 100644
index 4765627a..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Terrain/WaterIce.asset
+++ /dev/null
@@ -1,19 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!114 &11400000
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 0}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 294b89e81f1027842ae8d67c0ebfb8fb, type: 3}
-  m_Name: WaterIce
-  m_EditorClassIdentifier: 
-  MatchingFeatures: 128
-  Albedo: {fileID: 2800000, guid: cadaefe98e7e39e45ab177f89cf9f054, type: 3}
-  Normal: {fileID: 2800000, guid: 2cda7ea2c16e328479f8016c3718dee2, type: 3}
-  Displacement: {fileID: 2800000, guid: 2e09a13c6014c6d4db6a5a2519cdc883, type: 3}
-  Roughness: {fileID: 2800000, guid: 70d7df2c2fe3c9d44bbe3f95bd1137f0, type: 3}
diff --git a/com.saab.map-streamer/Runtime/Assets/Terrain/WaterIce.asset.meta b/com.saab.map-streamer/Runtime/Assets/Terrain/WaterIce.asset.meta
deleted file mode 100644
index 9bf48933..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Terrain/WaterIce.asset.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 5c7de1e372a51df45bb51fe18cbea052
-NativeFormatImporter:
-  externalObjects: {}
-  mainObjectFileID: 11400000
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/TerrainSet.meta b/com.saab.map-streamer/Runtime/Assets/TerrainSet.meta
deleted file mode 100644
index 86eb832c..00000000
--- a/com.saab.map-streamer/Runtime/Assets/TerrainSet.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 10298b09870fa0d4398c42a1ad57dbe8
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/TerrainSet/TestSet.asset b/com.saab.map-streamer/Runtime/Assets/TerrainSet/TestSet.asset
deleted file mode 100644
index 59fb5f2f..00000000
--- a/com.saab.map-streamer/Runtime/Assets/TerrainSet/TestSet.asset
+++ /dev/null
@@ -1,23 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!114 &11400000
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 0}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 6abce6760cf4f044a9f484b68011a0f3, type: 3}
-  m_Name: TestSet
-  m_EditorClassIdentifier: 
-  Textures:
-  - Asset: {fileID: 11400000, guid: 32b3b8382e9d7bc4a80bf2dcb81c9038, type: 2}
-    Mapping: 1047660
-  - Asset: {fileID: 11400000, guid: 5c7de1e372a51df45bb51fe18cbea052, type: 2}
-    Mapping: 128
-  - Asset: {fileID: 11400000, guid: 8edc1370de3f8384780d2d029e3ea8d9, type: 2}
-    Mapping: 19
-  - Asset: {fileID: 11400000, guid: 1f6694de18ad00e4a8b2fec6068d4d23, type: 2}
-    Mapping: 2097920
diff --git a/com.saab.map-streamer/Runtime/Assets/TerrainSet/TestSet.asset.meta b/com.saab.map-streamer/Runtime/Assets/TerrainSet/TestSet.asset.meta
deleted file mode 100644
index 91537baf..00000000
--- a/com.saab.map-streamer/Runtime/Assets/TerrainSet/TestSet.asset.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 123682dc7f3baf442b16516cbb951b61
-NativeFormatImporter:
-  externalObjects: {}
-  mainObjectFileID: 11400000
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Grass.meta b/com.saab.map-streamer/Runtime/Assets/Textures/Grass.meta
deleted file mode 100644
index a25a0f34..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Textures/Grass.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 9a5a91674938bb04d99adfa0e80f038c
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain.meta b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain.meta
deleted file mode 100644
index d8ff8b66..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 02625eb6ac016da4ea74e46e76ff3801
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Color.jpg b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Color.jpg
deleted file mode 100644
index a9a6809b..00000000
Binary files a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Color.jpg and /dev/null differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Displacement.jpg b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Displacement.jpg
deleted file mode 100644
index 6855b535..00000000
Binary files a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Displacement.jpg and /dev/null differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_NormalDX.jpg b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_NormalDX.jpg
deleted file mode 100644
index 64f37a95..00000000
Binary files a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_NormalDX.jpg and /dev/null differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_NormalGL.jpg b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_NormalGL.jpg
deleted file mode 100644
index c86b6f83..00000000
Binary files a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_NormalGL.jpg and /dev/null differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Roughness.jpg b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Roughness.jpg
deleted file mode 100644
index b4f91cb5..00000000
Binary files a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/Ice002_2K_Roughness.jpg and /dev/null differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal.jpeg b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal.jpeg
deleted file mode 100644
index aec3658c..00000000
Binary files a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal.jpeg and /dev/null differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal2.png b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal2.png
deleted file mode 100644
index 74b10740..00000000
Binary files a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal2.png and /dev/null differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal3 1.png b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal3 1.png
deleted file mode 100644
index b8b14fd6..00000000
Binary files a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal3 1.png and /dev/null differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal3 1.png.meta b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal3 1.png.meta
deleted file mode 100644
index 1319b3b5..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal3 1.png.meta	
+++ /dev/null
@@ -1,135 +0,0 @@
-fileFormatVersion: 2
-guid: e8ba38effad15c04e957feddbc21a0d7
-TextureImporter:
-  internalIDToNameTable: []
-  externalObjects: {}
-  serializedVersion: 12
-  mipmaps:
-    mipMapMode: 0
-    enableMipMap: 1
-    sRGBTexture: 0
-    linearTexture: 0
-    fadeOut: 0
-    borderMipMap: 0
-    mipMapsPreserveCoverage: 0
-    alphaTestReferenceValue: 0.5
-    mipMapFadeDistanceStart: 1
-    mipMapFadeDistanceEnd: 3
-  bumpmap:
-    convertToNormalMap: 0
-    externalNormalMap: 0
-    heightScale: 0.25
-    normalMapFilter: 0
-  isReadable: 0
-  streamingMipmaps: 0
-  streamingMipmapsPriority: 0
-  vTOnly: 0
-  ignoreMasterTextureLimit: 0
-  grayScaleToAlpha: 0
-  generateCubemap: 6
-  cubemapConvolution: 0
-  seamlessCubemap: 0
-  textureFormat: 1
-  maxTextureSize: 2048
-  textureSettings:
-    serializedVersion: 2
-    filterMode: 1
-    aniso: 1
-    mipBias: 0
-    wrapU: 0
-    wrapV: 0
-    wrapW: 0
-  nPOTScale: 1
-  lightmap: 0
-  compressionQuality: 50
-  spriteMode: 0
-  spriteExtrude: 1
-  spriteMeshType: 1
-  alignment: 0
-  spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
-  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
-  spriteGenerateFallbackPhysicsShape: 1
-  alphaUsage: 1
-  alphaIsTransparency: 0
-  spriteTessellationDetail: -1
-  textureType: 1
-  textureShape: 1
-  singleChannelComponent: 0
-  flipbookRows: 1
-  flipbookColumns: 1
-  maxTextureSizeSet: 0
-  compressionQualitySet: 0
-  textureFormatSet: 0
-  ignorePngGamma: 0
-  applyGammaDecoding: 0
-  cookieLightType: 0
-  platformSettings:
-  - serializedVersion: 3
-    buildTarget: DefaultTexturePlatform
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: Standalone
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: Server
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: EmbeddedLinux
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  spriteSheet:
-    serializedVersion: 2
-    sprites: []
-    outline: []
-    physicsShape: []
-    bones: []
-    spriteID: 
-    internalID: 0
-    vertices: []
-    indices: 
-    edges: []
-    weights: []
-    secondaryTextures: []
-    nameFileIdTable: {}
-  spritePackingTag: 
-  pSDRemoveMatte: 0
-  pSDShowRemoveMatteOption: 0
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal4.png b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal4.png
deleted file mode 100644
index 15655f67..00000000
Binary files a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal4.png and /dev/null differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal4.png.meta b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal4.png.meta
deleted file mode 100644
index d00af56c..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal4.png.meta
+++ /dev/null
@@ -1,135 +0,0 @@
-fileFormatVersion: 2
-guid: 4246e5dd66b1ee640a2b8d3923f0f1fb
-TextureImporter:
-  internalIDToNameTable: []
-  externalObjects: {}
-  serializedVersion: 12
-  mipmaps:
-    mipMapMode: 0
-    enableMipMap: 1
-    sRGBTexture: 0
-    linearTexture: 0
-    fadeOut: 0
-    borderMipMap: 0
-    mipMapsPreserveCoverage: 0
-    alphaTestReferenceValue: 0.5
-    mipMapFadeDistanceStart: 1
-    mipMapFadeDistanceEnd: 3
-  bumpmap:
-    convertToNormalMap: 0
-    externalNormalMap: 0
-    heightScale: 0.25
-    normalMapFilter: 0
-  isReadable: 0
-  streamingMipmaps: 0
-  streamingMipmapsPriority: 0
-  vTOnly: 0
-  ignoreMasterTextureLimit: 0
-  grayScaleToAlpha: 0
-  generateCubemap: 6
-  cubemapConvolution: 0
-  seamlessCubemap: 0
-  textureFormat: 1
-  maxTextureSize: 2048
-  textureSettings:
-    serializedVersion: 2
-    filterMode: 1
-    aniso: 1
-    mipBias: 0
-    wrapU: 0
-    wrapV: 0
-    wrapW: 0
-  nPOTScale: 1
-  lightmap: 0
-  compressionQuality: 50
-  spriteMode: 0
-  spriteExtrude: 1
-  spriteMeshType: 1
-  alignment: 0
-  spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
-  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
-  spriteGenerateFallbackPhysicsShape: 1
-  alphaUsage: 1
-  alphaIsTransparency: 0
-  spriteTessellationDetail: -1
-  textureType: 1
-  textureShape: 1
-  singleChannelComponent: 0
-  flipbookRows: 1
-  flipbookColumns: 1
-  maxTextureSizeSet: 0
-  compressionQualitySet: 0
-  textureFormatSet: 0
-  ignorePngGamma: 0
-  applyGammaDecoding: 0
-  cookieLightType: 0
-  platformSettings:
-  - serializedVersion: 3
-    buildTarget: DefaultTexturePlatform
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: Standalone
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: Server
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: EmbeddedLinux
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  spriteSheet:
-    serializedVersion: 2
-    sprites: []
-    outline: []
-    physicsShape: []
-    bones: []
-    spriteID: 
-    internalID: 0
-    vertices: []
-    indices: 
-    edges: []
-    weights: []
-    secondaryTextures: []
-    nameFileIdTable: {}
-  spritePackingTag: 
-  pSDRemoveMatte: 0
-  pSDShowRemoveMatteOption: 0
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal5.png b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal5.png
deleted file mode 100644
index 83ce10f8..00000000
Binary files a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal5.png and /dev/null differ
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal5.png.meta b/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal5.png.meta
deleted file mode 100644
index 7464941c..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Textures/Terrain/waterNormal5.png.meta
+++ /dev/null
@@ -1,135 +0,0 @@
-fileFormatVersion: 2
-guid: 2cda7ea2c16e328479f8016c3718dee2
-TextureImporter:
-  internalIDToNameTable: []
-  externalObjects: {}
-  serializedVersion: 12
-  mipmaps:
-    mipMapMode: 0
-    enableMipMap: 1
-    sRGBTexture: 0
-    linearTexture: 0
-    fadeOut: 0
-    borderMipMap: 0
-    mipMapsPreserveCoverage: 0
-    alphaTestReferenceValue: 0.5
-    mipMapFadeDistanceStart: 1
-    mipMapFadeDistanceEnd: 3
-  bumpmap:
-    convertToNormalMap: 0
-    externalNormalMap: 0
-    heightScale: 0.25
-    normalMapFilter: 0
-  isReadable: 0
-  streamingMipmaps: 0
-  streamingMipmapsPriority: 0
-  vTOnly: 0
-  ignoreMasterTextureLimit: 0
-  grayScaleToAlpha: 0
-  generateCubemap: 6
-  cubemapConvolution: 0
-  seamlessCubemap: 0
-  textureFormat: 1
-  maxTextureSize: 2048
-  textureSettings:
-    serializedVersion: 2
-    filterMode: 1
-    aniso: 1
-    mipBias: 0
-    wrapU: 0
-    wrapV: 0
-    wrapW: 0
-  nPOTScale: 1
-  lightmap: 0
-  compressionQuality: 50
-  spriteMode: 0
-  spriteExtrude: 1
-  spriteMeshType: 1
-  alignment: 0
-  spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
-  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
-  spriteGenerateFallbackPhysicsShape: 1
-  alphaUsage: 1
-  alphaIsTransparency: 0
-  spriteTessellationDetail: -1
-  textureType: 1
-  textureShape: 1
-  singleChannelComponent: 0
-  flipbookRows: 1
-  flipbookColumns: 1
-  maxTextureSizeSet: 0
-  compressionQualitySet: 0
-  textureFormatSet: 0
-  ignorePngGamma: 0
-  applyGammaDecoding: 0
-  cookieLightType: 0
-  platformSettings:
-  - serializedVersion: 3
-    buildTarget: DefaultTexturePlatform
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: Standalone
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: Server
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: EmbeddedLinux
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  spriteSheet:
-    serializedVersion: 2
-    sprites: []
-    outline: []
-    physicsShape: []
-    bones: []
-    spriteID: 
-    internalID: 0
-    vertices: []
-    indices: 
-    edges: []
-    weights: []
-    secondaryTextures: []
-    nameFileIdTable: {}
-  spritePackingTag: 
-  pSDRemoveMatte: 0
-  pSDShowRemoveMatteOption: 0
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Textures/Trees.meta b/com.saab.map-streamer/Runtime/Assets/Textures/Trees.meta
deleted file mode 100644
index a4e0532d..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Textures/Trees.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 679869eecaeaaca4ea6928459f8bb3f5
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Vegetation.meta b/com.saab.map-streamer/Runtime/Assets/Vegetation.meta
deleted file mode 100644
index bcf677ba..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Vegetation.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: ddee3787e09b00146928ad96f774bb06
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Vegetation/Deciduous.meta b/com.saab.map-streamer/Runtime/Assets/Vegetation/Deciduous.meta
deleted file mode 100644
index d4e118a6..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Vegetation/Deciduous.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: d3ab58149b84ecb4d8a9f4fa55225f02
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen.meta b/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen.meta
deleted file mode 100644
index ff7318d2..00000000
--- a/com.saab.map-streamer/Runtime/Assets/Vegetation/Evergreen.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 9f2f0d23708dd35468ba5ecf94d1c094
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/MAPSTREAMER.asmdef b/com.saab.map-streamer/Runtime/MAPSTREAMER.asmdef
deleted file mode 100644
index b4e1ffe7..00000000
--- a/com.saab.map-streamer/Runtime/MAPSTREAMER.asmdef
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "name": "MAPSTREAMER",
-    "rootNamespace": "MAPSTREAMER",
-    "references": [],
-    "includePlatforms": [],
-    "excludePlatforms": [],
-    "allowUnsafeCode": false,
-    "overrideReferences": false,
-    "precompiledReferences": [],
-    "autoReferenced": false,
-    "defineConstraints": [],
-    "versionDefines": [],
-    "noEngineReferences": false
-}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/MAPSTREAMER.asmdef.meta b/com.saab.map-streamer/Runtime/MAPSTREAMER.asmdef.meta
deleted file mode 100644
index c8b8548c..00000000
--- a/com.saab.map-streamer/Runtime/MAPSTREAMER.asmdef.meta
+++ /dev/null
@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 3087ea34bbce2f44aa16d74d964a08ca
-AssemblyDefinitionImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Map.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Map.meta
deleted file mode 100644
index 65c062d0..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Map.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 385d95ffdd4543545b90428dcacd74a8
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity.meta
deleted file mode 100644
index e2829891..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: b428b4d422915e54b91c1cf84490bae4
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules.meta
deleted file mode 100644
index af5477cc..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 7def10848f0dc1242bc72ae367d8b753
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug.meta
deleted file mode 100644
index 8f05496b..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: ddc2a34c5debe764e86207d02d1efc76
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug/DebugUtils.compute b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug/DebugUtils.compute
deleted file mode 100644
index e3694647..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug/DebugUtils.compute
+++ /dev/null
@@ -1,51 +0,0 @@
-#pragma kernel CSTransferToTexture
-
-StructuredBuffer<int> Input;
-RWTexture2D<float4> Output;
-
-float2 FOV;
-float2 Dimensions;
-
-[numthreads(8, 8, 1)]
-void CSTransferToTexture(uint3 id : SV_DispatchThreadID)
-{    
-    Output[id.xy] = 0;
-    
-    // If outside your texture bounds, return
-    if (id.x >= Dimensions.x || id.y >= Dimensions.y)
-        return;
-
-    // 1) Convert pixel index => normalized device coords => angle
-    float2 uv = (float2) id.xy / (float2) Dimensions.xy; // [0..1]
-    float2 ndc = 2.0 * uv - 1.0; // [-1..1]
-    
-    // 2) Suppose the final image is meant to cover the same fov.x/fov.y 
-    float halfFovX = radians(FOV.x * 0.5);
-    float halfFovY = radians(FOV.y * 0.5);
-
-    // 3) Reconstruct a direction in camera space:
-    // Typically, for a pinhole camera, x = tan(horizontalAngle), etc.
-    float xCam = tan(halfFovX) * ndc.x;
-    float yCam = tan(halfFovY) * ndc.y;
-    float zCam = 1.0;
-    float3 dir = normalize(float3(xCam, yCam, zCam));
-
-    // 4) Convert dir => equirectangular coords
-    float yawAngle = degrees(atan2(dir.x, dir.z)); // [-fov.x/2.. +fov.x/2]
-    float pitchAngle = degrees(asin(dir.y)); // [-fov.y/2.. +fov.y/2]
-    float normalizedYaw = saturate((yawAngle + (FOV.x * 0.5)) / FOV.x);
-    float normalizedPitch = saturate((pitchAngle + (FOV.y * 0.5)) / FOV.y);
-
-    // 5) Lookup in your culling buffer
-    uint yawIndex = (uint) (normalizedYaw * (Dimensions.x - 1));
-    uint pitchIndex = (uint) (normalizedPitch * (Dimensions.x - 1));
-    uint eqIndex = pitchIndex * Dimensions.x + yawIndex;
-    
-    uint newDepth = (uint) Input[eqIndex];
-    
-    if (newDepth < 25000)
-        Output[id.xy] = float4(1, 0, 0, 0.2);
-    else
-        Output[id.xy] = float4(0, 0, 1, 0.2);
-
-}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug/DebugUtils.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug/DebugUtils.cs
deleted file mode 100644
index 7baeb666..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Debug/DebugUtils.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-using UnityEngine;
-
-namespace Saab.Foundation.Unity.MapStreamer.Modules
-{
-    public static class DebugUtils
-    {
-        public static RenderTexture LastCopiedBuffer { get; set; }
-
-        public static ComputeShader CopyShader { get; set; }
-
-        public static bool BufferToRenderTexture(RenderTexture rt, ComputeShader cs, ComputeBuffer buffer, Vector2Int dimensions, Vector2 fov)
-        {
-            int threads = 8;
-
-            if (dimensions.x == 0 || dimensions.y == 0)
-                return false; //TODO: Log message
-
-            if (rt.width != dimensions.x || rt.height != dimensions.y)
-                return false; //TODO: Log message
-
-            if (buffer.stride != sizeof(int))
-                return false; //TODO: Log message
-
-            var kernel = cs.FindKernel("CSTransferToTexture");
-
-            cs.SetVector("FOV", fov);
-            cs.SetVector("Dimensions", (Vector2)dimensions);
-            cs.SetTexture(kernel, "Output", rt);
-            cs.SetBuffer(kernel, "Input", buffer);
-
-            var groupx = Mathf.CeilToInt((float)dimensions.x / threads);
-            var groupy = Mathf.CeilToInt((float)dimensions.y / threads);
-            cs.Dispatch(kernel, groupx, groupy, 1);
-
-            LastCopiedBuffer = rt;
-
-            return true;
-        }
-
-        public static bool BufferToRenderTexture(ComputeBuffer buffer, Vector2Int dimensions, Vector2 fov)
-        {
-            if (CopyShader == null)
-                return false;
-
-            var rt = LastCopiedBuffer;
-
-            if (LastCopiedBuffer != null)
-            {
-                rt = RenderTexture.GetTemporary(dimensions.x, dimensions.y); //TODO: RELEASE
-                rt.enableRandomWrite = true;
-            }
-            rt = LastCopiedBuffer;
-
-            return BufferToRenderTexture(rt, CopyShader, buffer, dimensions, fov);
-        }
-    }
-}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage.meta
deleted file mode 100644
index 6e47978b..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: f0477971f3bb687419e9a9da1ef93e04
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageFeature.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageFeature.cs
deleted file mode 100644
index 03869498..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageFeature.cs
+++ /dev/null
@@ -1,435 +0,0 @@
-﻿/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-using UnityEngine;
-using System.Collections.Generic;
-using System;
-using GizmoSDK.GizmoBase;
-using System.Linq;
-
-using ProfilerMarker = global::Unity.Profiling.ProfilerMarker;
-using ProfilerCategory = global::Unity.Profiling.ProfilerCategory;
-
-namespace Saab.Foundation.Unity.MapStreamer.Modules
-{
-    public struct FoliagePoint
-    {
-        Vector3 Position;
-        Vector3 Color;
-        float Height;
-        float Random;
-        float Visibility;
-    }
-
-    public struct FeatureData : IDisposable
-    {
-        public GameObject Object { get; private set; }
-        public ComputeBuffer PlacementMatrix { get; private set; }
-        public Vector2 NodeOffset { get; private set; }
-        //public ComputeBuffer MinXY { get; private set; }
-        public ComputeBuffer TerrainPoints;
-        public Texture2D FeatureMap;
-        public Texture2D Texture;
-        public Texture surfaceHeight;
-        public RenderTexture HeightMap;
-
-        public FeatureData(GameObject gameObject, Matrix3D matrix, float density, uint maxSide, float scale = 1000)
-        {
-            Object = gameObject;
-
-            var stepsize = (1 / density) * 10;
-
-            PlacementMatrix = new ComputeBuffer(9, sizeof(float), ComputeBufferType.Default);
-            float[] data = {
-                (float)matrix.v11, (float)matrix.v12, (float)((matrix.v13) % stepsize),
-                (float)matrix.v21, (float)matrix.v22, (float)((matrix.v23) % stepsize),
-                (float)matrix.v31, (float)matrix.v32, (float)matrix.v33
-            };
-
-            NodeOffset = new Vector2((float)(matrix.v13 + matrix.v11) % scale, (float)(matrix.v23 + matrix.v22) % scale);
-            PlacementMatrix.SetData(data);
-
-            HeightMap = null;
-            surfaceHeight = null;
-            Texture = null;
-            TerrainPoints = null;
-            FeatureMap = null;
-        }
-
-        public void Dispose()
-        {
-            if (surfaceHeight is RenderTexture rt)
-                rt?.Release();    
-            TerrainPoints?.Release();
-            PlacementMatrix?.Release();
-            HeightMap?.Release();
-        }
-    }
-
-    public class FoliageFeature : IDisposable
-    {
-        // list of all instances currently being rendered
-        private readonly List<FeatureData> _items = new List<FeatureData>(128);
-        // if a go exists in the render list, it exists in this lookup, used to avoid searching the list
-        private readonly HashSet<GameObject> _itemLookup = new HashSet<GameObject>();
-
-        private Vector2 _resolution;
-        private readonly ComputeShader _placement;
-        private readonly int _kernelCull;
-        private readonly int _kernelClear;
-        private readonly int _kernelPlacement;
-        private readonly float _density;
-        private readonly float _scale = 10000;
-
-        // *********** buffers ***********
-        private ComputeBuffer _mappingBuffer;
-        private Vector2 _fov;
-        private readonly ComputeBuffer _pointCloud;
-
-        private readonly ComputeBuffer _pointCloudCulled;
-        private readonly ComputeBuffer _angleDepth;
-        private readonly int _KernelPreCull;
-        private readonly int _kernelPostCull;
-        private const float _depthBufferScale = 2.5f;
-
-        public int FoliageCount
-        {
-            get { return _items.Count; }
-        }
-
-        public FoliageFeature(int BufferSize, float density, int[] map, ComputeShader computeShader)
-        {
-            _placement = computeShader;
-            _kernelCull = _placement.FindKernel("CSCull");
-            _kernelClear = _placement.FindKernel("CSClear");
-            _kernelPlacement = _placement.FindKernel("CSPlacement");
-            _kernelPostCull = _placement.FindKernel("CSPostCull");
-            _KernelPreCull = _placement.FindKernel("CSPreCull");
-
-
-            _placement.SetFloat(PlacementParameterID.AngleResolutionScale, _depthBufferScale);
-            _angleDepth = new ComputeBuffer(Mathf.CeilToInt(180 * _depthBufferScale * 180 * _depthBufferScale), sizeof(uint));
-
-            _density = density;
-            _pointCloud = new ComputeBuffer(BufferSize <= 0 ? 1 : BufferSize, sizeof(float) * 8, ComputeBufferType.Append);
-            _pointCloudCulled = new ComputeBuffer(BufferSize <= 0 ? 1 : BufferSize, sizeof(float) * 8, ComputeBufferType.Append);
-            _mappingBuffer = new ComputeBuffer(map.Length, sizeof(int));
-            _mappingBuffer.SetData(map);
-        }
-
-        public bool AddFoliage(GameObject go, NodeHandle node, RenderTexture heightMap, Texture surfaceHeight = null)
-        {
-            if (heightMap == null)
-                return false;
-
-            Texture2D featureMap = node.feature;
-            if (featureMap == null)
-                return false;
-
-            Texture height = node.surfaceHeight ?? surfaceHeight;
-            if (height == null)
-                return false;
-
-            var size = FindBufferSize(featureMap);
-            if (size >= ushort.MaxValue * 128)
-                return false;
-
-            _resolution = new Vector2((float)node.featureInfo.v11, (float)node.featureInfo.v22);
-            var maxside = Mathf.Max(featureMap.width, featureMap.height);
-
-            Texture2D texture = node.texture;
-            var data = new FeatureData(go, node.featureInfo, _density, (uint)maxside, _scale)
-            {
-                FeatureMap = featureMap,
-                Texture = texture,
-                surfaceHeight = height,
-                HeightMap = heightMap
-            };
-
-            data.TerrainPoints = new ComputeBuffer(size < 1 ? 1 : size, sizeof(float) * 9, ComputeBufferType.Append);
-
-            FeaturePlacement(data);
-
-            _items.Add(data);
-            _itemLookup.Add(go);
-
-            return true;
-        }
-        public void RemoveFoliage(GameObject gameObj)
-        {
-            if (!_itemLookup.Contains(gameObj))
-                return;
-
-            _itemLookup.Remove(gameObj);
-
-            for (var i = 0; i < _items.Count; ++i)
-            {
-                if (_items[i].Object != gameObj)
-                    continue;
-
-                ClearFeature(_items[i]);
-
-                if ((i + 1) < _items.Count)
-                    _items[i] = _items[_items.Count - 1];
-
-                _items.RemoveAt(_items.Count - 1);
-
-                return;
-            }
-        }
-        public void Dispose()
-        {
-            _pointCloud?.Release();
-            _pointCloudCulled?.Release();
-            _mappingBuffer?.Release();
-            _angleDepth?.Release();
-
-            for (var i = 0; i < _items.Count; ++i)
-            {
-                ClearFeature(_items[i]);
-            }
-            _items.Clear();
-        }
-
-        // needed to clear old valid tree data from gpu memory, if skipped when frustum culling old trees might get valid/visable
-        private void ClearFeature(in FeatureData data)
-        {
-            _placement.SetBuffer(_kernelClear, PlacementParameterID.TerrainPoints, data.TerrainPoints);
-            _placement.SetInt(PlacementParameterID.BufferCount, data.TerrainPoints.count);
-            if (data.TerrainPoints.count > 0)
-                _placement.Dispatch(_kernelClear, Mathf.CeilToInt(data.TerrainPoints.count / 128f), 1, 1);
-
-            data.Dispose();
-        }
-
-        private int FindBufferSize(Texture2D featureMap)
-        {
-            var maxSize =
-                Mathf.CeilToInt(featureMap.width * _resolution.x * _density) *
-                Mathf.CeilToInt(featureMap.height * _resolution.y * _density);
-
-            return Mathf.CeilToInt(maxSize) < 1 ? 1 : Mathf.CeilToInt(maxSize);
-
-            //// ################## find minimum memory needed for buffer ##################
-            //
-            //
-            //var bufferKernel = _placement.FindKernel("CSFindBufferSize");
-            //var result = new uint[1];
-            //
-            //var sizeBuffer = new ComputeBuffer(1, sizeof(uint), ComputeBufferType.Default);
-            //sizeBuffer.SetData(result);
-            //
-            //_placement.SetBuffer(bufferKernel, "BufferSize", sizeBuffer);
-            //_placement.SetTexture(bufferKernel, "SplatMap", node.feature);
-            //_placement.SetBuffer(bufferKernel, "FeatureMap", _mappingBuffer);
-            //
-            //int threadsX = Mathf.CeilToInt((node.feature.width) / (float)8);
-            //int threadsY = Mathf.CeilToInt((node.feature.height) / (float)8);
-            //
-            //_placement.Dispatch(bufferKernel, threadsX, threadsY, 1);
-            //
-            //sizeBuffer.GetData(result);
-            //var percentage = result[0] / (float)(node.feature.width * node.feature.height);
-            //
-            ////var maxMem = maxSize * sizeof(float) * 8;
-            ////var savedMem = maxSize * (1 - percentage) * sizeof(float) * 8;
-            ////Debug.Log($"worst case {maxMem} Bytes saved memory {savedMem} Bytes");
-            //
-            //sizeBuffer.Release();
-            //return Mathf.CeilToInt(maxSize * percentage) < 1 ? 1 : Mathf.CeilToInt(maxSize * percentage);
-
-        }
-        // used for debuging the min and max height of the node
-        private void GetMinMax(string node, Texture2D heightmap)
-        {
-            var buff = new ComputeBuffer(2, sizeof(uint), ComputeBufferType.Default);
-            uint[] max = { 255, 0 };
-            buff.SetData(max);
-
-            var maxmin = _placement.FindKernel("CSFindMinMax");
-            _placement.SetBuffer(maxmin, "MinXY", buff);
-            _placement.SetTexture(maxmin, "HeightSurface", heightmap);
-
-            int threadsX = Mathf.CeilToInt((heightmap.width) / (float)8);
-            int threadsY = Mathf.CeilToInt((heightmap.height) / (float)8);
-
-            _placement.Dispatch(maxmin, threadsX, threadsY, 1);
-
-            var tmp = new uint[2];
-            buff.GetData(tmp);
-
-            Debug.LogError($"MinMax: {tmp[0]}, {tmp[1]}");
-            buff.Release();
-        }
-
-        private void FeaturePlacement(FeatureData node)
-        {
-            _placement.SetTexture(_kernelPlacement, PlacementParameterID.SplatMap, node.FeatureMap);
-            _placement.SetTexture(_kernelPlacement, PlacementParameterID.Texture, node.Texture);
-            _placement.SetTexture(_kernelPlacement, PlacementParameterID.HeightMap, node.HeightMap);
-            _placement.SetTexture(_kernelPlacement, PlacementParameterID.HeightSurface, node.surfaceHeight);
-
-            _placement.SetVector(PlacementParameterID.heightResolution, new Vector2(node.surfaceHeight.width, node.surfaceHeight.height));
-            _placement.SetBuffer(_kernelPlacement, PlacementParameterID.TerrainPoints, node.TerrainPoints);
-            _placement.SetBuffer(_kernelPlacement, PlacementParameterID.PixelToWorld, node.PlacementMatrix);
-
-            // we need to set this everytime
-            _placement.SetBuffer(_kernelPlacement, PlacementParameterID.FeatureMap, _mappingBuffer);
-
-            int threadsX = Mathf.CeilToInt(node.FeatureMap.width / 4f);
-            int threadsY = Mathf.CeilToInt(node.FeatureMap.height / 4f);
-
-            node.TerrainPoints.SetCounterValue(0);
-            _placement.Dispatch(_kernelPlacement, threadsX < 1 ? 1 : threadsX, threadsY < 1 ? 1 : threadsY, 1);
-        }
-
-        public Matrix4x4 GetClipToWorld(Camera camera)
-        {
-            var p = GL.GetGPUProjectionMatrix(camera.projectionMatrix, false);// Unity flips its 'Y' vector depending on if its in VR, Editor view or game view etc... (facepalm)
-            p[2, 3] = p[3, 2] = 0.0f;
-            p[3, 3] = 1.0f;
-            //_worldToClip = (p * camera.worldToCameraMatrix) * Matrix4x4.TRS(new Vector3(0, 0, -p[2, 2]), UnityEngine.Quaternion.identity, Vector3.one);
-            return Matrix4x4.Inverse(p * camera.worldToCameraMatrix) * Matrix4x4.TRS(new Vector3(0, 0, -p[2, 2]), UnityEngine.Quaternion.identity, Vector3.one);
-        }
-
-        private static class PlacementParameterID
-        {
-            public static readonly int DepthTexture = Shader.PropertyToID("DepthTexture");
-            public static readonly int WorldToScreen = Shader.PropertyToID("WorldToScreen");
-            public static readonly int maxHeight = Shader.PropertyToID("maxHeight");
-            public static readonly int OutputBuffer = Shader.PropertyToID("OutputBuffer");
-            public static readonly int CameraPosition = Shader.PropertyToID("CameraPosition");
-            public static readonly int CameraRightVector = Shader.PropertyToID("CameraRightVector");
-            public static readonly int CameraForwardVector = Shader.PropertyToID("CameraForwardVector");
-            public static readonly int frustumPlanes = Shader.PropertyToID("frustumPlanes");
-            public static readonly int InputBuffer = Shader.PropertyToID("InputBuffer");
-            public static readonly int ObjToWorld = Shader.PropertyToID("ObjToWorld");
-            public static readonly int TerrainPoints = Shader.PropertyToID("TerrainPoints");
-            public static readonly int BufferCount = Shader.PropertyToID("BufferCount");
-            public static readonly int SplatMap = Shader.PropertyToID("SplatMap");
-            public static readonly int Texture = Shader.PropertyToID("Texture");
-            public static readonly int HeightMap = Shader.PropertyToID("HeightMap");
-            public static readonly int HeightSurface = Shader.PropertyToID("HeightSurface");
-            public static readonly int heightResolution = Shader.PropertyToID("heightResolution");
-            public static readonly int PixelToWorld = Shader.PropertyToID("PixelToWorld");
-            public static readonly int FeatureMap = Shader.PropertyToID("FeatureMap");
-            public static readonly int FoliageData = Shader.PropertyToID("FoliageData");
-            public static readonly int AngleDepth = Shader.PropertyToID("AngleDepth");
-            public static readonly int FoliageCount = Shader.PropertyToID("FoliageCount");
-            public static readonly int ScreenCoverage = Shader.PropertyToID("ScreenCoverage");
-            public static readonly int AngleResolutionScale = Shader.PropertyToID("AngleResolutionScale");
-        }
-
-        private void PostCull()
-        {            
-           _placement.SetBuffer(_kernelPostCull, PlacementParameterID.AngleDepth, _angleDepth);
-           int groups = Mathf.CeilToInt(_angleDepth.count / 256f);
-           _placement.Dispatch(_kernelPostCull, groups < 1 ? 1 : groups, 1, 1);
-        }
-
-        private void PreCull()
-        {
-            for (var i = 0; i < _items.Count; ++i)
-            {
-                var item = _items[i];
-                var go = item.Object;
-
-                // don't cull disabled objects
-                if (!go.activeInHierarchy)
-                    continue;
-
-                int itemPoints = item.TerrainPoints.count;
-                int groups = Mathf.CeilToInt(itemPoints / 128f);
-
-                _placement.SetBuffer(_KernelPreCull, PlacementParameterID.AngleDepth, _angleDepth);
-                _placement.SetBuffer(_KernelPreCull, PlacementParameterID.InputBuffer, item.TerrainPoints);
-                _placement.SetMatrix(PlacementParameterID.ObjToWorld, go.transform.localToWorldMatrix);
-
-                _placement.Dispatch(_KernelPreCull, groups < 1 ? 1 : groups, 1, 1);
-            }
-
-            // ********* DEBUG CODE *********
-            //var dimensions = new Vector2Int(Mathf.CeilToInt(180 * _depthBufferScale), Mathf.CeilToInt(180 * _depthBufferScale));
-            //DebugUtils.BufferToRenderTexture(_angleDepth, dimensions, _fov);
-        }
-
-        private static readonly ProfilerMarker _profilerMarker = new ProfilerMarker(ProfilerCategory.Render, "Foliage-Cull");
-
-        public ComputeBuffer Cull(Vector4[] frustum, Camera camera, float maxHeight, RenderTexture Depth, FeatureSet set)
-        {
-            _profilerMarker.Begin();
-
-            _pointCloud.SetCounterValue(0);     // only once every frame
-
-            Matrix4x4 world2Screen = camera.projectionMatrix * camera.worldToCameraMatrix;
-
-            _placement.SetTexture(_kernelCull, PlacementParameterID.DepthTexture, Depth);
-            _placement.SetTexture(_KernelPreCull, PlacementParameterID.DepthTexture, Depth);
-
-            _placement.SetMatrix(PlacementParameterID.WorldToScreen, world2Screen);
-            _placement.SetFloat(PlacementParameterID.maxHeight, maxHeight);
-            _placement.SetVector(PlacementParameterID.CameraPosition, camera.transform.position);
-            _placement.SetVector(PlacementParameterID.CameraRightVector, camera.transform.right);
-            _placement.SetVector(PlacementParameterID.CameraForwardVector, camera.transform.forward);          
-            _placement.SetVectorArray(PlacementParameterID.frustumPlanes, frustum);
-
-            float verticalView = camera.fieldOfView;
-            float horizontalView = Camera.VerticalToHorizontalFieldOfView(verticalView, camera.aspect);
-            float fovTolerance = 3f;
-            _fov = new Vector2(horizontalView + fovTolerance, verticalView + fovTolerance);
-            _placement.SetVector("Fov", _fov);
-
-            // we need to set this everytime
-            _placement.SetBuffer(_kernelCull, PlacementParameterID.OutputBuffer, _pointCloud);
-            _placement.SetBuffer(_kernelCull, PlacementParameterID.FoliageData, set.FoliageData);
-            _placement.SetBuffer(_KernelPreCull, PlacementParameterID.FoliageData, set.FoliageData);
-            _placement.SetInt(PlacementParameterID.FoliageCount, set.FoliageData.count);
-            _placement.SetFloat(PlacementParameterID.ScreenCoverage, set.ScreenCoverage);
-
-            var count = 0;
-            var points = 0;
-
-            PreCull();
-
-            for (var i = 0; i < _items.Count; ++i)
-            {
-                var item = _items[i];
-                var go = item.Object;
-
-                // don't cull disabled objects
-                if (!go.activeInHierarchy)
-                    continue;
-
-                count++;
-
-                int itemPoints = item.TerrainPoints.count;
-                points += itemPoints;
-                int groups = Mathf.CeilToInt(itemPoints / 128f);
-
-                _placement.SetBuffer(_kernelCull, PlacementParameterID.AngleDepth, _angleDepth);
-                _placement.SetBuffer(_kernelCull, PlacementParameterID.InputBuffer, item.TerrainPoints);
-                _placement.SetMatrix(PlacementParameterID.ObjToWorld, go.transform.localToWorldMatrix);
-
-                _placement.Dispatch(_kernelCull, groups < 1 ? 1 : groups, 1, 1);
-            }
-
-            PostCull();
-
-            _profilerMarker.End();
-
-            return _pointCloud;
-        }
-    }
-}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageModule.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageModule.cs
deleted file mode 100644
index 7b3e96c3..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageModule.cs
+++ /dev/null
@@ -1,643 +0,0 @@
-﻿/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-using GizmoSDK.Coordinate;
-using GizmoSDK.GizmoBase;
-using Saab.Foundation.Map;
-using Saab.Utility.GfxCaps;
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
-using Unity.Collections;
-using Unity.Collections.LowLevel.Unsafe;
-using UnityEngine;
-
-using ProfilerMarker = global::Unity.Profiling.ProfilerMarker;
-using ProfilerCategory = global::Unity.Profiling.ProfilerCategory;
-
-namespace Saab.Foundation.Unity.MapStreamer.Modules
-{
-
-    [Serializable]
-    public class FeatureSet
-    {
-        public SettingsFeatureType SettingsType;
-        public MapFeature mapFeature;
-        public FoliageSet FoliageSet;
-        public bool Enabled;
-        [Header("Main Settings")]
-        public int BufferSize;
-        [Range(0.001f, 1)]
-        public float ScreenCoverage = 0.001f;
-        public float Density;
-        /// <summary>
-        /// Node LOD's larger than this will not use features from this set.
-        /// </summary>
-        public uint NodeMaxWidth;
-        public bool Shadows;
-        public bool Crossboard;
-        [Header("calculated drawDistance")]
-        public float DrawDistance;
-
-        public FoliageFeature FoliageFeature;
-        public ComputeBuffer InderectBuffer;
-        public ComputeBuffer FoliageData;
-
-        public float MaxHeight { get; set; }
-
-        public Material FoliageMaterial { get; set; }
-
-        public void Dispose()
-        {
-            FoliageFeature?.Dispose();
-            InderectBuffer?.Dispose();
-            FoliageData?.Dispose();
-        }
-    }
-
-    public class FoliageModule : MonoBehaviour
-    {
-        public SceneManager SceneManager;
-        public ComputeShader ComputeShader;
-        public Shader FoliageShader;
-
-        //_PerlinNoise
-        public Texture2D PerlinNoise;
-
-        [Header("Debug Settings")]
-        public bool DebugPrintCount = false;
-        public bool Disabled = false;
-        public bool DebugNoDraw = false;
-        public bool NativeLeakDetection = false;
-        public bool Occlusion = true;
-        public Material DownsampleMaterial;
-
-        [Header("Foliage Draw")]
-        public List<FeatureSet> Features = new List<FeatureSet>();
-
-        private Vector4[] _frustum = new Vector4[6];
-        private float _maxHeight;
-        private int[] _mappingTable;
-
-        // **************** Generate HeightMap ****************
-        private RenderTexture _heightMap;
-        private RenderTexture _surfaceheightMap;
-        private ComputeBuffer _minXY;
-        private RenderTexture _depthMap;
-        private bool _hasDepthTexture = false;
-
-        private Queue<FoliageJob> _futurePool = new Queue<FoliageJob>();
-        private Dictionary<SettingsFeatureType, SettingsFeature> _settingsCache = new Dictionary<SettingsFeatureType, SettingsFeature>();
-
-        private static class PlacementParameterID
-        {
-            public static readonly int FoliageData = Shader.PropertyToID("_foliageData");
-            public static readonly int TerrainResolution = Shader.PropertyToID("terrainResolution");
-            public static readonly int TerrainSize = Shader.PropertyToID("terrainSize");
-            public static readonly int NodeOffset = Shader.PropertyToID("NodeOffset");
-            public static readonly int Resolution = Shader.PropertyToID("Resolution");
-            public static readonly int ObjToWorld = Shader.PropertyToID("ObjToWorld");
-            public static readonly int IndexCount = Shader.PropertyToID("indexCount");
-            public static readonly int UvCount = Shader.PropertyToID("uvCount");
-            public static readonly int FrameCount = Shader.PropertyToID("FrameCount");
-            public static readonly int Occlusion = Shader.PropertyToID("Occlusion");
-            public static readonly int DownscaleFactor = Shader.PropertyToID("DownscaleFactor");
-            public static readonly int HeightMap = Shader.PropertyToID("HeightMap");
-            public static readonly int IndexBuffer = Shader.PropertyToID("IndexBuffer");
-            public static readonly int VertexBuffer = Shader.PropertyToID("VertexBuffer");
-            public static readonly int MeshBoundsMax = Shader.PropertyToID("MeshBoundsMax");
-            public static readonly int VertexBufferStride = Shader.PropertyToID("VertexBufferStride");
-            public static readonly int TexcoordOffset = Shader.PropertyToID("TexcoordOffset");
-            public static readonly int PositionOffset = Shader.PropertyToID("PositionOffset");
-            public static readonly int SurfaceHeightMap = Shader.PropertyToID("SurfaceHeightMap");
-            public static readonly int Texture = Shader.PropertyToID("Texture");
-            public static readonly int Density = Shader.PropertyToID("Density");
-
-            // Material
-            public static readonly int IsToggled = Shader.PropertyToID("_isToggled");
-            public static readonly int PerlinNoise = Shader.PropertyToID("_PerlinNoise");
-            public static readonly int FoliageCount = Shader.PropertyToID("_foliageCount");
-            public static readonly int MainTexArray = Shader.PropertyToID("_MainTexArray");
-            public static readonly int PointBuffer = Shader.PropertyToID("_PointBuffer");
-
-            public static readonly string CROSSBOARD_ON = "CROSSBOARD_ON";
-
-        }
-        public int GetFoliageCount
-        {
-            get
-            {
-                var count = 0;
-                foreach (var feature in Features)
-                {
-                    count += feature.FoliageFeature.FoliageCount;
-                }
-                return count;
-            }
-        }
-
-        // Start is called before the first frame update
-        void Start()
-        {
-            _mappingTable = TerrainMapping.MapFeatureData();
-
-            StartCoroutine(WaitForDepth());
-            SceneManager.OnNewTerrain += SceneManager_OnNewTerrain;
-            SceneManager.OnPostTraverse += SceneManager_OnPostTraverse;
-            SceneManager.OnRemoveTerrain += SceneManager_OnRemoveTerrain;
-
-            _minXY = new ComputeBuffer(2, sizeof(uint), ComputeBufferType.Default);
-
-            for (int i = 0; i < Features.Count; i++)
-            {
-                var featureSet = Features[i];
-                var settings = GetSettings(featureSet.SettingsType);
-                featureSet.Enabled = settings.Enabled;
-
-                featureSet.FoliageFeature = new FoliageFeature(Mathf.CeilToInt(featureSet.BufferSize * settings.Density), featureSet.Density * settings.Density, TerrainMapping.FeatureTruthTable(_mappingTable, featureSet.mapFeature), ComputeShader);
-
-                var inderectBuffer = new ComputeBuffer(4, sizeof(uint), ComputeBufferType.IndirectArguments);
-                inderectBuffer.SetData(new uint[] { 0, 1, 0, 0 });
-                featureSet.InderectBuffer = inderectBuffer;
-                featureSet.FoliageMaterial = new Material(FoliageShader);
-
-                //TODO: use to create a random noise
-                featureSet.FoliageMaterial.SetTexture(PlacementParameterID.PerlinNoise, PerlinNoise);
-
-                if (featureSet.Crossboard)
-                {
-                    featureSet.FoliageMaterial.SetFloat(PlacementParameterID.IsToggled, 0);
-                    featureSet.FoliageMaterial.EnableKeyword(PlacementParameterID.CROSSBOARD_ON);
-                }
-                else
-                {
-                    featureSet.FoliageMaterial.SetFloat(PlacementParameterID.IsToggled, 1);
-                    featureSet.FoliageMaterial.DisableKeyword(PlacementParameterID.CROSSBOARD_ON);
-                }
-                featureSet.MaxHeight = featureSet.FoliageSet.GetMaxHeight;
-
-                SetupFoliage(featureSet);
-            }
-        }
-
-        struct FoliageShaderData
-        {
-            public Vector2 MaxMin;
-            public Vector2 Offset;
-            public float Weight;
-        };
-
-        private SettingsFeature GetSettings(SettingsFeatureType settingsType)
-        {
-            if (!_settingsCache.TryGetValue(settingsType, out var settings))
-            {
-                settings = GfxCaps.GetFoliageSettings(settingsType);
-                _settingsCache[settingsType] = settings;
-            }
-            return settings;
-        }
-
-        private void SetupFoliage(FeatureSet featureSet)
-        {
-#if UNITY_ANDROID
-            var format = TextureFormat.ETC2_RGBA8;
-            Debug.Log("foliage Use ETC2");
-#else
-            var format = TextureFormat.DXT5;
-#endif           
-            var foliageTypes = featureSet.FoliageSet.GetFoliageList;
-            var mainTexs = Create2DArray(foliageTypes, format);
-
-            featureSet.FoliageMaterial.SetInt(PlacementParameterID.FoliageCount, foliageTypes.Count);
-            featureSet.FoliageMaterial.SetTexture(PlacementParameterID.MainTexArray, mainTexs);
-
-            var data = new FoliageShaderData[foliageTypes.Count];
-            for (int i = 0; i < foliageTypes.Count; i++)
-            {
-                var foliage = foliageTypes[i];
-                _maxHeight = Mathf.Max(_maxHeight, foliage.MaxMin.y);
-
-                var item = new FoliageShaderData()
-                {
-                    MaxMin = foliage.MaxMin,
-                    Offset = foliage.Offset,
-                    Weight = foliage.Weight,
-                };
-                data[i] = item;
-            }
-
-            if (featureSet.FoliageData != null)
-                featureSet.FoliageData.Release();
-
-            featureSet.FoliageData = new ComputeBuffer(foliageTypes.Count, sizeof(float) * 5, ComputeBufferType.Default);
-            featureSet.FoliageData.SetData(data);
-            featureSet.FoliageMaterial.SetBuffer(PlacementParameterID.FoliageData, featureSet.FoliageData);
-        }
-        private static uint NextPowerOfTwo(uint v)
-        {
-            v--;
-            v |= v >> 1;
-            v |= v >> 2;
-            v |= v >> 4;
-            v |= v >> 8;
-            v |= v >> 16;
-
-            return v + 1;
-        }
-        public Texture2DArray Create2DArray(List<Foliage> foliages, TextureFormat targetFormat)
-        {
-            var textureCount = foliages.Count;
-            var textureResolution = Mathf.Max(foliages.Max(item => item.MainTexture.width), foliages.Max(item => item.MainTexture.height));
-            textureResolution = (int)NextPowerOfTwo((uint)textureResolution);
-
-            Texture2DArray textureArray;
-
-            textureArray = new Texture2DArray(textureResolution, textureResolution, textureCount, targetFormat, true)
-            {
-                wrapMode = TextureWrapMode.Clamp
-            };
-
-            RenderTexture temporaryRenderTexture = new RenderTexture(textureResolution, textureResolution, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default)
-            {
-                useMipMap = true,
-                antiAliasing = 1,
-                name = "foliagemodule - temporaryRenderTexture - 2dArray"
-            };
-
-            for (int i = 0; i < textureCount; i++)
-            {
-                //Debug.LogWarning($"graphic format: {foliages[i].MainTexture.graphicsFormat} format: {foliages[i].MainTexture.format}");
-                Graphics.Blit(foliages[i].MainTexture, temporaryRenderTexture);
-                RenderTexture.active = temporaryRenderTexture;
-
-                Texture2D temporaryTexture = new Texture2D(textureResolution, textureResolution, TextureFormat.ARGB32, true);
-                temporaryTexture.ReadPixels(new Rect(0, 0, temporaryTexture.width, temporaryTexture.height), 0, 0);
-                RenderTexture.active = null;
-                temporaryTexture.Apply(true);
-                temporaryTexture.Compress(true);
-                Graphics.CopyTexture(temporaryTexture, 0, textureArray, i);
-
-                DestroyImmediate(temporaryTexture);
-            }
-            textureArray.Apply(false, true);
-
-            temporaryRenderTexture.Release();
-            DestroyImmediate(temporaryRenderTexture);
-
-            return textureArray;
-        }
-
-        private readonly Plane[] _frustrumPlanes = new Plane[6];
-        private void GenerateFrustumPlane(UnityEngine.Camera camera)
-        {
-            GeometryUtility.CalculateFrustumPlanes(camera, _frustrumPlanes);
-
-            for (int i = 0; i < 6; i++)
-            {
-                Vector3 normal = _frustrumPlanes[i].normal;
-                _frustum[i].x = normal.x;
-                _frustum[i].y = normal.y;
-                _frustum[i].z = normal.z;
-                _frustum[i].w = _frustrumPlanes[i].distance;
-            }
-        }
-        private void SceneManager_OnRemoveTerrain(GameObject go)
-        {
-            foreach (var set in Features)
-            {
-                set.FoliageFeature?.RemoveFoliage(go);
-            }
-        }
-
-        struct FoliageJob
-        {
-            public GameObject gameObject { get; set; }
-            public int FrameCount { get; set; }
-        }
-
-        private void SceneManager_OnNewTerrain(GameObject go, bool isAsset)
-        {
-            if (isAsset)
-                return;
-
-            AddJob(go);
-        }
-
-        private readonly Coordinate _coordConverter = new Coordinate();
-
-        private void AddJob(GameObject go)
-        {
-            if (Disabled || !go.activeInHierarchy)
-                return;
-
-            if (!go.TryGetComponent<MeshFilter>(out var meshFilter))
-                return;
-
-            var mesh = meshFilter.sharedMesh;
-            if (!mesh)
-                return;
-
-            if (!go.TryGetComponent<NodeHandle>(out var nodeHandle))
-                return;
-
-            if (!nodeHandle.texture || !nodeHandle.feature)
-                return;
-
-            var featureInfo = nodeHandle.featureInfo;
-
-            var pixelSize = new Vector2((float)featureInfo.v11, (float)featureInfo.v22);
-            float scale = 1000;
-
-            var nodeOffset = new Vector2(
-                (float)(featureInfo.v13 + featureInfo.v11) % scale,
-                (float)(featureInfo.v23 + featureInfo.v22) % scale);
-
-            var tex = nodeHandle.texture;
-            var texSize = new Vector2(tex.width, tex.height);
-
-            var fullNodeSize = pixelSize * texSize;
-            var nodeSide = Mathf.Max(fullNodeSize.x, fullNodeSize.y);
-
-            if (nodeSide > 2048)
-                return;
-
-            ComputeShader.SetVector(PlacementParameterID.TerrainResolution, texSize);
-            ComputeShader.SetVector(PlacementParameterID.TerrainSize, mesh.bounds.size);
-            ComputeShader.SetVector(PlacementParameterID.NodeOffset, nodeOffset);
-            ComputeShader.SetVector(PlacementParameterID.Resolution, pixelSize);
-            ComputeShader.SetMatrix(PlacementParameterID.ObjToWorld, go.transform.localToWorldMatrix);
-
-            var meshCenter = nodeHandle.node.BoundaryCenter;
-
-            MapControl.SystemMap.GlobalToWorld(meshCenter, out GizmoSDK.Coordinate.CartPos cartPos);
-
-            _coordConverter.SetCartPos(cartPos);
-            _coordConverter.GetUTMPos(out var utmPos);
-
-            var topLeftCorner = nodeHandle.featureInfo * new Vec3D(0, 0, 1);
-
-            var nodeSize = (texSize * pixelSize);
-            var nodeOffsetDiff = nodeSize - new Vector2(mesh.bounds.size.x, mesh.bounds.size.z);
-            var centerOffset = new Vec3D(topLeftCorner.x - utmPos.Easting, 0, topLeftCorner.y - utmPos.Northing);
-
-            if (Math.Abs(centerOffset.x) < nodeSize.x / 2)
-                nodeOffsetDiff.x *= -1;
-
-            if (Math.Abs(centerOffset.y) > nodeSize.y / 2)
-                nodeOffsetDiff.y *= -1;
-
-            centerOffset.x += nodeOffsetDiff.x;
-            centerOffset.y += nodeOffsetDiff.y;
-
-            var heightmap = GenerateHeight(texSize, pixelSize, mesh, centerOffset);
-
-            RenderTexture surface = null;
-            if (nodeHandle.surfaceHeight == null)
-                surface = GenerateSurfaceHeight(tex);
-
-            bool requireCleanup = true;
-
-            foreach (var set in Features)
-            {
-                if (!set.Enabled)
-                    continue;
-
-                var setting = GetSettings(set.SettingsType);
-                ComputeShader.SetFloat(PlacementParameterID.Density, set.Density * setting.Density);
-
-                if (nodeSide < set.NodeMaxWidth)
-                {
-                    set.FoliageFeature.AddFoliage(go, nodeHandle, heightmap, surface);
-                }
-
-                requireCleanup = false;
-            }
-
-            if (requireCleanup)
-            {
-                heightmap?.Release();
-                surface?.Release();
-            }
-        }
-
-        private void OnDestroy()
-        {
-            _minXY?.Release();
-
-            foreach (var set in Features)
-            {
-                set?.Dispose();
-            }
-
-            _heightMap?.Release();
-            _surfaceheightMap?.Release();
-            _depthMap?.Release();
-        }
-
-        private RenderTexture GenerateSurfaceHeight(UnityEngine.Texture texture)
-        {
-            // ************* Generate surface Height Map  ************* //
-
-            _surfaceheightMap = new RenderTexture(texture.width, texture.height, 24, RenderTextureFormat.RFloat);
-            _surfaceheightMap.enableRandomWrite = true;
-            _surfaceheightMap.name = "foliagemodule - surfaceheightMap";
-            _surfaceheightMap.Create();
-
-            var kernel = ComputeShader.FindKernel("CSSurfaceHeightMap");
-            ComputeShader.SetTexture(kernel, PlacementParameterID.Texture, texture);
-            ComputeShader.SetTexture(kernel, PlacementParameterID.SurfaceHeightMap, _surfaceheightMap);
-
-            var threadx = Mathf.CeilToInt(texture.width / 8f) < 1 ? 1 : Mathf.CeilToInt(texture.width / 8f);
-            var thready = Mathf.CeilToInt(texture.height / 8f) < 1 ? 1 : Mathf.CeilToInt(texture.height / 8f);
-
-            ComputeShader.Dispatch(kernel, threadx, thready, 1);
-
-            return _surfaceheightMap;
-        }
-
-        private RenderTexture GenerateHeight(Vector2 texSize, Vector2 pixelSize, Mesh mesh, Vec3D offset)
-        {
-
-            ComputeShader.SetVector(PlacementParameterID.Resolution, pixelSize);
-
-            // according to documentation vertexBufferTarget should not be able to be a structured but it works
-            // if any future problems occur test doing the same as indexBuffer -> indexbufferGpuCopy
-            mesh.vertexBufferTarget |= GraphicsBuffer.Target.Structured;
-            mesh.indexBufferTarget |= GraphicsBuffer.Target.CopySource;
-
-            var vertexBuffer = mesh.GetVertexBuffer(0);
-            var indexBuffer = mesh.GetIndexBuffer();
-
-            var indexbufferGpuCopy = new GraphicsBuffer(GraphicsBuffer.Target.CopyDestination | GraphicsBuffer.Target.Raw, Mathf.CeilToInt(indexBuffer.count / 2f), sizeof(uint));
-            Graphics.CopyBuffer(indexBuffer, indexbufferGpuCopy);
-
-            var stride = mesh.GetVertexBufferStride(0);
-            var texOffset = mesh.GetVertexAttributeOffset(UnityEngine.Rendering.VertexAttribute.TexCoord0);
-            var posOffset = mesh.GetVertexAttributeOffset(UnityEngine.Rendering.VertexAttribute.Position);
-
-            ComputeShader.SetInt(PlacementParameterID.PositionOffset, posOffset / 4);
-            ComputeShader.SetInt(PlacementParameterID.TexcoordOffset, texOffset / 4);
-            ComputeShader.SetInt(PlacementParameterID.VertexBufferStride, stride / 4);
-
-            var indicesCount = mesh.GetIndexCount(0);
-            ComputeShader.SetInt(PlacementParameterID.UvCount, vertexBuffer.count);
-
-            // ************* find node corners ************* //
-
-            //var nodeTexCenter = mesh.bounds.center + new Vector3((float)offset.x + mesh.bounds.extents.x, (float)offset.y, (float)offset.z + mesh.bounds.extents.z);
-            //var nodeExtents = new Vector3((texSize.x - 2) * pixelSize.x / 2, mesh.bounds.size.y, texSize.y * pixelSize.y / 2);
-            //var nodeTexTopLeft = nodeTexTopLeft + nodeExtents;
-            var nodeTexTopLeft = mesh.bounds.center - new Vector3((float)offset.x + (texSize.x * pixelSize.x), (float)offset.y, (float)offset.z);
-            ComputeShader.SetVector(PlacementParameterID.MeshBoundsMax, nodeTexTopLeft);
-
-            // ************* Generate Height Map  ************* //
-
-            var kernelHeight = ComputeShader.FindKernel("CSHeightMap");
-
-            if (_heightMap != null)
-                _heightMap.Release();
-
-            _heightMap = new RenderTexture((int)texSize.x, (int)texSize.y, 24, RenderTextureFormat.RFloat);
-            _heightMap.enableRandomWrite = true;
-            _heightMap.name = "foliagemodule - HeightMap";
-            _heightMap.Create();
-
-            var triangleCount = Mathf.CeilToInt(indicesCount / 3f);
-
-            ComputeShader.SetInt(PlacementParameterID.IndexCount, triangleCount);
-
-            ComputeShader.SetBuffer(kernelHeight, PlacementParameterID.VertexBuffer, vertexBuffer);
-            ComputeShader.SetBuffer(kernelHeight, PlacementParameterID.IndexBuffer, indexbufferGpuCopy);
-            ComputeShader.SetTexture(kernelHeight, PlacementParameterID.HeightMap, _heightMap);
-
-            var threads = Mathf.CeilToInt(triangleCount / 4f) < 1 ? 1 : Mathf.CeilToInt(triangleCount / 4f);
-            ComputeShader.Dispatch(kernelHeight, threads, 1, 1);
-
-            indexBuffer.Dispose();
-            vertexBuffer.Dispose();
-            indexbufferGpuCopy.Dispose();
-
-            return _heightMap;
-        }
-
-        private IEnumerator WaitForDepth()
-        {
-            yield return new WaitUntil(() => Shader.GetGlobalTexture("_CameraDepthTexture") != null);
-            _hasDepthTexture = true;
-        }
-
-        private void DownscaleDepth(int downscale)
-        {
-            if (_depthMap == null)
-            {
-                _depthMap = new RenderTexture(Screen.width / downscale, Screen.height / downscale, 0, RenderTextureFormat.RFloat);
-                _depthMap.name = "foliagemodule - depthmap";
-                _depthMap.enableRandomWrite = true;
-                _depthMap.filterMode = FilterMode.Point;
-                _depthMap.useMipMap = false;
-                _depthMap.Create();
-            }
-
-            Graphics.Blit(null, _depthMap, DownsampleMaterial);
-            DownsampleMaterial.mainTexture = _depthMap;
-            ComputeShader.SetInt(PlacementParameterID.DownscaleFactor, downscale);
-        }
-
-        float CalculateDesiredDistance(UnityEngine.Camera camera, float objectHeight, float coverage)
-        {
-            // Convert FOV from degrees to radians and halve it
-            float halfFov = camera.fieldOfView * 0.5f * Mathf.Deg2Rad;
-
-            // Calculate the desired distance so that the object covers the desired percentage of the screen
-            float desiredDistance = objectHeight / (2.0f * Mathf.Tan(halfFov) * coverage);
-
-            return desiredDistance;
-        }
-
-        private static readonly ProfilerMarker _profilerMarker = new ProfilerMarker(ProfilerCategory.Render, "Foliage-Render");
-
-        private void SceneManager_OnPostTraverse(bool locked)
-        {
-            _profilerMarker.Begin();
-
-            Render();
-
-            _profilerMarker.End();
-        }
-
-        private void Render()
-        {
-            if (Disabled || !_hasDepthTexture)
-                return;
-
-            if (NativeLeakDetection)
-                UnsafeUtility.SetLeakDetectionMode(NativeLeakDetectionMode.EnabledWithStackTrace);
-            else
-                UnsafeUtility.SetLeakDetectionMode(NativeLeakDetectionMode.Disabled);
-
-            var cam = SceneManager.SceneManagerCamera.Camera;
-            GenerateFrustumPlane(cam);
-
-            if (cam.depthTextureMode != DepthTextureMode.Depth)
-                cam.depthTextureMode = cam.depthTextureMode | DepthTextureMode.Depth;
-
-            ComputeShader.SetBool(PlacementParameterID.Occlusion, Occlusion);
-            ComputeShader.SetInt(PlacementParameterID.FrameCount, UnityEngine.Time.frameCount);
-
-            DownscaleDepth(4);
-
-            foreach (var set in Features)
-            {
-                var settings = GetSettings(set.SettingsType);
-                if (!settings.Enabled || !set.Enabled)
-                    continue;
-
-                if (set.FoliageMaterial == null)
-                {
-                    Debug.LogError($"FoliageMaterial for {set.mapFeature} can't be NULL!");
-                    continue;
-                }
-
-                var dist = CalculateDesiredDistance(cam, set.MaxHeight, set.ScreenCoverage);
-                set.DrawDistance = dist * settings.DrawDistance;
-                _frustum[5].w = set.DrawDistance;  // draw distance
-
-                // Render all points
-                var buffer = set.FoliageFeature.Cull(_frustum, cam, _maxHeight, _depthMap, set);
-                set.FoliageMaterial.SetBuffer(PlacementParameterID.PointBuffer, buffer);
-
-                // ------- Render -------
-                ComputeBuffer.CopyCount(buffer, set.InderectBuffer, 0);
-                if (DebugPrintCount)
-                {
-                    int[] array = new int[4];
-                    set.InderectBuffer.GetData(array);
-                    UnityEngine.Debug.LogFormat(LogType.Warning, LogOption.NoStacktrace, null, "{2} :: {0}/{1}", array[0].ToString(), buffer.count, set.FoliageSet.name);
-                }
-
-                if (DebugNoDraw)
-                    return;
-
-                var renderBounds = new Bounds(Vector3.zero, new Vector3(set.DrawDistance, set.DrawDistance, set.DrawDistance));
-                Graphics.DrawProceduralIndirect(set.FoliageMaterial, renderBounds, MeshTopology.Points, set.InderectBuffer, 0, null, null, settings.Shadows ? UnityEngine.Rendering.ShadowCastingMode.On : UnityEngine.Rendering.ShadowCastingMode.Off);
-            }
-
-            DebugPrintCount = false;
-
-
-        }
-    }
-}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageSet.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageSet.cs
deleted file mode 100644
index 907060db..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageSet.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-namespace Saab.Foundation.Unity.MapStreamer.Modules
-{
-    [CreateAssetMenu(fileName = "FoliageSet", menuName = "Terrain/FoliageSet")]
-    public class FoliageSet : ScriptableObject
-    {
-        [SerializeField]
-        public List<MappedFoliageAsset> Assets;
-
-        private List<Foliage> _foliages = new List<Foliage>();
-        public List<Foliage> GetFoliageList
-        { 
-            get 
-            {
-                _foliages.Clear();
-                foreach (var item in Assets)
-                {
-                    _foliages.Add(item.Foliage);
-                }
-                return _foliages; 
-            } 
-        }
-
-        public float GetMaxHeight
-        {
-            get
-            {
-                float max = 0;
-                foreach (var item in Assets)
-                {
-                    max = MathF.Max(item.Foliage.MaxMin.y, max);
-                }
-                return max;
-            }
-        }
-
-    }
-
-    [Serializable]
-    public struct MappedFoliageAsset
-    {
-        [SerializeField]
-        public Foliage Foliage;
-        [SerializeField]
-        public float Weight;
-    }
-}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageSetEditor.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageSetEditor.cs
deleted file mode 100644
index a1b973fd..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/Foliage/FoliageSetEditor.cs
+++ /dev/null
@@ -1,214 +0,0 @@
-/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-using System.Linq;
-using System;
-
-#if UNITY_EDITOR
-using UnityEditor;
-
-namespace Saab.Foundation.Unity.MapStreamer.Modules
-{
-    [CustomEditor(typeof(FoliageSet))]
-    public class FoliageSetEditor : Editor
-    {
-        private static MapFeature _feature;
-
-        public override void OnInspectorGUI()
-        {
-            FoliageSet set = (FoliageSet)target;
-            if (set == null) return;
-
-            //Calculate layout information
-            var availableSpace = EditorGUIUtility.currentViewWidth;
-            var numColumns = (int)Math.Floor((availableSpace - 50) / 100);
-            numColumns = Math.Max(1, numColumns);
-
-            BuildUI(set, numColumns);
-        }
-
-        private static void BuildUI(FoliageSet set, int numColumns)
-        {
-            EditorGUILayout.BeginHorizontal();
-
-            if (set.Assets == null)
-                set.Assets = new List<MappedFoliageAsset>();
-
-            //Asset list
-            for (int i = 0; i < set.Assets.Count; i++)
-            {
-                HandleRowChange(numColumns, i);
-                CreateTextureAssetField(set, i);
-            }
-
-            EditorGUILayout.EndHorizontal();
-
-            _feature = (MapFeature)EditorGUILayout.EnumPopup("Feature", _feature);
-
-            EditorGUILayout.BeginHorizontal();
-            CreateAddButton(set.Assets);
-            CreateAutoFillButton(set.Assets, _feature);
-            CreateClearButton(set.Assets);
-            EditorGUILayout.EndHorizontal();
-
-            CreateErrorBox(set.Assets);
-
-            EditorUtility.SetDirty(set);
-        }
-
-        private static void HandleRowChange(int numColumns, int fieldCounter)
-        {
-            if (fieldCounter != 0 && (fieldCounter % numColumns) == 0)
-            {
-                EditorGUILayout.EndHorizontal();
-                EditorGUILayout.BeginHorizontal();
-            }
-        }
-
-        private static void CreateTextureAssetField(FoliageSet set, int index)
-        {
-            var style = new GUIStyle(GUI.skin.label);
-            style.alignment = TextAnchor.UpperCenter;
-            style.fixedWidth = 100;
-
-            GUILayout.BeginVertical(style);
-
-            GUILayout.Label("Detail asset " + index.ToString());
-
-            var result = (Foliage)EditorGUILayout.ObjectField(set.Assets[index].Foliage, typeof(Foliage), false, GUILayout.Width(100), GUILayout.Height(EditorGUIUtility.singleLineHeight));
-
-            if (result == set.Assets[index].Foliage)
-                set.Assets[index] = new MappedFoliageAsset() { Foliage = result, Weight = 0 };
-            else
-                set.Assets[index] = new MappedFoliageAsset() { Foliage = result, Weight = result.Weight };
-
-            if (result != null && result.MainTexture != null)
-                GUILayout.Box(result.MainTexture, GUILayout.Width(100), GUILayout.Height(100));
-
-            CreateDeleteButton(set.Assets, index);
-            GUILayout.EndVertical();
-        }
-
-        private static void CreateDeleteButton(List<MappedFoliageAsset> foliage, int index)
-        {
-            if (GUILayout.Button(new GUIContent("Delete"), GUILayout.Height(EditorGUIUtility.singleLineHeight)))
-            {
-                foliage.RemoveAt(index);
-            }
-        }
-
-        private static void CreateAddButton(List<MappedFoliageAsset> foliage)
-        {
-            var style = new GUIStyle(GUI.skin.label);
-            style.alignment = TextAnchor.UpperCenter;
-            style.fixedWidth = 100;
-            GUILayout.BeginVertical(style, GUILayout.Width(100));
-
-            if (GUILayout.Button(new GUIContent("Add"), GUILayout.Height(50)))
-            {
-                foliage.Add(new MappedFoliageAsset() { Foliage = null, Weight = 0 });
-            }
-
-            GUILayout.EndVertical();
-        }
-
-        private static void CreateClearButton(List<MappedFoliageAsset> foliage)
-        {
-            var style = new GUIStyle(GUI.skin.label);
-            style.alignment = TextAnchor.UpperCenter;
-            style.fixedWidth = 100;
-            GUILayout.BeginVertical(style, GUILayout.Width(100));
-
-            if (GUILayout.Button(new GUIContent("Clear"), GUILayout.Height(50)))
-            {
-                foliage.Clear();
-            }
-
-            GUILayout.EndVertical();
-        }
-
-        private static void CreateAutoFillButton(List<MappedFoliageAsset> foliage, MapFeature mapFeature)
-        {
-            var style = new GUIStyle(GUI.skin.label);
-            style.alignment = TextAnchor.UpperCenter;
-            style.fixedWidth = 100;
-            GUILayout.BeginVertical(style, GUILayout.Width(100));
-
-            if (GUILayout.Button(new GUIContent("Auto Fill"), GUILayout.Height(50)))
-            {
-                FindAssets(mapFeature, foliage);
-            }
-
-            GUILayout.EndVertical();
-        }
-
-        private static void CreateErrorBox(List<MappedFoliageAsset> foliage)
-        {
-            var errorString = "";
-            var showError = false;
-
-            // check for duplicates
-            if (foliage.GroupBy(asset => asset.Foliage).Any(match => match.Count() > 1))
-            {
-                showError = true;
-                var duplicateGroups = foliage.GroupBy(asset => asset.Foliage).Where(match => match.Count() > 1);
-                errorString = "There is duplicates of foliage in set:\n";
-
-                foreach (var group in duplicateGroups)
-                {
-                    foreach (var asset in group)
-                    {
-                        if (asset.Foliage != null)
-                            errorString += $"{asset.Foliage.name}\n";
-                        else
-                            errorString += "multiple undefiend in set\n";
-                        break;
-                    }
-                }
-            }
-            // check for undefiend
-            if (foliage.Any(asset => asset.Foliage == null))
-            {
-                showError = true;
-                errorString += "There is undefiend foliage in set";
-            }
-            // Draw error box
-            if(showError)
-                EditorGUILayout.HelpBox(errorString, MessageType.Warning);
-        }
-
-        private static void FindAssets(MapFeature features, List<MappedFoliageAsset> assets)
-        {
-            var result = AssetDatabase.FindAssets($"t: {typeof(Foliage).Name}").ToList()
-                      .Select(AssetDatabase.GUIDToAssetPath)
-                      .Select(AssetDatabase.LoadAssetAtPath<Foliage>)
-                      .ToList();
-
-            result = result.Where(f => f.Feature.HasFlag(features)).ToList();
-
-            foreach (var foliage in result)
-            {
-                if (!assets.Any(asset => asset.Foliage == foliage))
-                {
-                    assets.Add(new MappedFoliageAsset() { Foliage = foliage, Weight = foliage.Weight });
-                }
-            }
-        }
-    }
-}
-#endif
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail.meta
deleted file mode 100644
index 949a2060..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: fb16251bae1ba0448ac0460ed5f78ca7
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/MapShadingModule.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/MapShadingModule.cs
deleted file mode 100644
index d17f0305..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/MapShadingModule.cs
+++ /dev/null
@@ -1,305 +0,0 @@
-﻿/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-using UnityEngine;
-using Saab.Utility.GfxCaps;
-using System.Linq;
-using System.Collections.Generic;
-using System;
-using Saab.Foundation.Unity.MapStreamer.Utils;
-
-namespace Saab.Foundation.Unity.MapStreamer.Modules
-{
-    public struct TerrainData : IDisposable
-    {
-        public Material Material;
-        public ComputeBuffer NormalBuffer;
-        public GameObject Object;
-
-        public void GenerateNormal(Mesh mesh, ComputeShader normalComputeShader)
-        {
-            // Extract vertex positions and indices from the mesh
-            Vector3[] vertices = mesh.vertices;
-            int[] triangles = mesh.triangles;
-
-            // Create and initialize compute buffers
-            var vertexBuffer = new ComputeBuffer(vertices.Length, sizeof(float) * 3);
-            var indexBuffer = new ComputeBuffer(triangles.Length / 3, sizeof(int) * 3);
-            NormalBuffer = new ComputeBuffer(vertices.Length, sizeof(float) * 3);
-
-            vertexBuffer.SetData(vertices);
-            indexBuffer.SetData(triangles);
-
-            // Set compute shader parameters
-            normalComputeShader.SetBuffer(0, "vertexPositions", vertexBuffer);
-            normalComputeShader.SetBuffer(0, "triangleIndices", indexBuffer);
-            normalComputeShader.SetBuffer(0, "vertexNormals", NormalBuffer);
-            normalComputeShader.SetInt("numVertices", vertices.Length);
-            normalComputeShader.SetInt("triangleIndicesLength", triangles.Length);
-
-            // Dispatch the compute shader
-            int threadGroups = Mathf.CeilToInt(vertices.Length / 64.0f);
-            normalComputeShader.Dispatch(0, threadGroups, 1, 1);
-
-            vertexBuffer.Release();
-            indexBuffer.Release();
-        }
-
-        public TerrainData(Material material, GameObject go)
-        {
-            Object = go;
-            Material = material;
-            NormalBuffer = null;
-        }
-
-        public void Dispose()
-        {
-            NormalBuffer?.Release();
-        }
-    }
-
-    public class MapShadingModule : MonoBehaviour
-    {
-        public SceneManager SceneManager;
-
-        public bool EnableDetailedTextures
-        {
-            get
-            {
-                return _enableDetailedTextures;
-            }
-            set
-            {
-                _enableDetailedTextures = value;
-            }
-        }
-        public float HueShiftInclusion
-        {
-            get
-            {
-                return _hueShiftInclusion;
-            }
-            set
-            {
-                _hueShiftInclusion = value;
-            }
-        }
-        public bool GenerateNormals
-        {
-            get
-            {
-                return _generateNormals;
-            }
-            set
-            {
-                _generateNormals = value;
-            }
-        }
-        public TerrainDetailTextureAssetSet DetailTextureSet
-        {
-            get
-            {
-                return _detailTextureSet;
-            }
-            set
-            {
-                _detailTextureSet = value;
-            }
-        }
-        public ComputeShader NormalComputeShader
-        {
-            get
-            {
-                return _normalComputeShader;
-            }
-            set
-            {
-                _normalComputeShader = value;
-            }
-        }
-
-        [Header("Main Settings")]
-        [SerializeField] private bool _enableDetailedTextures = true;
-        [Range(0, 1)]
-        [SerializeField] private float _hueShiftInclusion = 0.4f;
-        [SerializeField] private Color _targetHue = new Color(70f / 256f, 140f / 256f, 70f / 256f);
-
-        [Header("Module Settings")]
-        [SerializeField] private TerrainDetailTextureAssetSet _detailTextureSet;
-
-        private ComputeBuffer _mappingBuffer;
-        private Texture2DArray _textureArray;
-        private Texture2DArray _normalMapArray;
-
-        [Header("Normal Generation")]
-        [SerializeField] private bool _generateNormals = false;
-        [SerializeField] private ComputeShader _normalComputeShader;
-
-        private readonly Dictionary<GameObject, TerrainData> _terrainData = new Dictionary<GameObject, TerrainData>();
-
-        private void Awake()
-        {
-            if (SceneManager == null)
-                return;
-
-            _enableDetailedTextures = GfxCaps.CurrentCaps.HasFlag(Capability.UseTerrainDetailTextures);
-            InitializeModule();
-            RefreshSettings();
-        }
-
-        private static class MaterialParameterID
-        {
-            public static readonly int NormalBuffer = Shader.PropertyToID("_NormalBuffer");
-            public static readonly int FeatureMap = Shader.PropertyToID("_FeatureMap");
-            public static readonly int Textures = Shader.PropertyToID("_Textures");
-            public static readonly int NormalMaps = Shader.PropertyToID("_NormalMaps");
-        }
-
-        private void OnDestroy()
-        {
-            if (_mappingBuffer != null)
-                _mappingBuffer.Release();
-        }
-
-        public void InitializeModule()
-        {
-            if (SceneManager && _enableDetailedTextures)
-            {
-                InitMapModules();
-                InitDetailTexturing();
-            }
-        }
-
-        private void InitMapModules()
-        {
-            SceneManager.OnNewTerrain += SceneManager_OnNewTerrain;
-            SceneManager.OnRemoveTerrain += SceneManager_OnRemoveTerrain;
-        }
-
-        private void InitDetailTexturing()
-        {
-            if (!_enableDetailedTextures || !_detailTextureSet)
-                return;
-
-            // TODO: look if we can do this on build instead in runtime (decrease load time)
-
-            var mapping = TerrainMapping.MapFeatureData();
-            var mapResult = new int[256];
-
-            if (!_textureArray)
-            {
-                if (_detailTextureSet.Textures == null || _detailTextureSet.Textures.Count < 1)
-                    return;
-
-                int width = _detailTextureSet.Textures[0].Asset.Albedo.width;
-                int height = _detailTextureSet.Textures[0].Asset.Albedo.height;
-
-                List<int> resolved = new List<int>();
-                for (int i = 0; i < _detailTextureSet.Textures.Count; i++)
-                {
-                    var textureAsset = _detailTextureSet.Textures[i];
-
-                    var map = TerrainMapping.FeatureTruthTable(mapping, textureAsset.Mapping);
-
-                    for (int j = 0; j < map.Length; j++)
-                    {
-                        var index = map[j];
-                        if (index == 1)
-                            mapResult[j] = i + 1;
-                    }
-                }
-
-#if UNITY_ANDROID
-            var format = TextureFormat.ETC2_RGBA8;
-            Debug.Log("foliage Use ETC2");
-#else
-                var format = TextureFormat.DXT5;
-#endif
-
-                List<Texture2D> albedo = _detailTextureSet.Textures.Select(t => t.Asset.Albedo).ToList();
-                List<Texture2D> normal = _detailTextureSet.Textures.Select(t => t.Asset.Normal).ToList();
-
-                _textureArray = TextureUtility.Create2DArray(albedo, format);
-                _normalMapArray = TextureUtility.Create2DArray(normal, format); ;
-            }
-
-            if (_mappingBuffer == null)
-            {
-                _mappingBuffer = new ComputeBuffer(mapResult.Length, sizeof(int));
-                _mappingBuffer.SetData(mapResult);
-            }
-        }
-
-        private void SceneManager_OnNewTerrain(GameObject go, bool isAsset)
-        {
-            if (!go.TryGetComponent<NodeHandle>(out var nodehandle))
-                return;
-
-            if (!nodehandle.feature || !nodehandle.texture)
-                return;
-
-            if (!go.TryGetComponent<MeshRenderer>(out var meshRenderer))
-                return;
-
-            if (!go.TryGetComponent<MeshFilter>(out var meshFilter))
-                return;
-
-            var material = meshRenderer.sharedMaterial;
-
-            // todo: validate that this material uses correct shader
-            if (!material)
-                return;
-
-            var data = new TerrainData(material, go);
-            material.SetKeyword(new UnityEngine.Rendering.LocalKeyword(material.shader, "NORMAL_TEXTURES_ON"), _generateNormals);
-
-            if (_generateNormals)
-            {
-                data.GenerateNormal(meshFilter.mesh, _normalComputeShader);
-                material.SetBuffer(MaterialParameterID.NormalBuffer, data.NormalBuffer);
-            }
-
-            material.SetTexture(MaterialParameterID.FeatureMap, nodehandle.feature);
-            material.SetTexture(MaterialParameterID.Textures, _textureArray);
-            material.SetTexture(MaterialParameterID.NormalMaps, _normalMapArray);
-
-            material.SetBuffer("_MappingBuffer", _mappingBuffer);
-            material.SetInt("_WaterIndex", 60);
-
-            _terrainData.Add(go, data);
-        }
-
-        private void SceneManager_OnRemoveTerrain(GameObject go)
-        {
-            RemoveTerrain(go);
-        }
-
-        private void RemoveTerrain(GameObject go)
-        {
-            _terrainData.Remove(go);
-        }
-
-        private void OnValidate()
-        {
-            RefreshSettings();
-        }
-
-        public void RefreshSettings()
-        {
-            Shader.SetGlobalColor("_TargetTerrainColor", _targetHue);
-            Shader.SetGlobalFloat("_HueShift", _hueShiftInclusion);
-        }
-    }
-}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAsset.cs.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAsset.cs.meta
deleted file mode 100644
index 3ba8574c..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAsset.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 294b89e81f1027842ae8d67c0ebfb8fb
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetEditor.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetEditor.cs
deleted file mode 100644
index 61c0b94e..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetEditor.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-﻿/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-using UnityEngine;
-#if UNITY_EDITOR
-using UnityEditor;
-
-namespace Saab.Foundation.Unity.MapStreamer.Modules
-{
-    [CustomEditor(typeof(TerrainDetailTextureAsset))]
-    public class TerrainDetailTextureAssetEditor : Editor
-    {
-        public override void OnInspectorGUI()
-        {
-            TerrainDetailTextureAsset asset = (TerrainDetailTextureAsset)target;
-            if (asset == null)
-                return;
-
-            CreateFeaturePicker(asset, out MapFeature result);
-            asset.MatchingFeatures = result;
-
-            EditorGUILayout.BeginHorizontal();
-
-            asset.Albedo = TextureField("Albedo", asset.Albedo);
-            asset.Normal = TextureField("Normal", asset.Normal);
-            asset.Displacement = TextureField("Displacement", asset.Displacement);
-            asset.Roughness = TextureField("Roughness", asset.Roughness);
-
-            EditorGUILayout.EndHorizontal();
-
-            EditorUtility.SetDirty(asset);
-        }
-
-        private static void CreateFeaturePicker(TerrainDetailTextureAsset asset, out MapFeature result)
-        {
-            var currentFlags = asset.MatchingFeatures;
-            GUILayout.Label("Matching features");
-            result = (MapFeature)EditorGUILayout.EnumFlagsField(currentFlags);
-        }
-
-        private static Texture2D TextureField(string name, Texture2D texture)
-        {
-            GUILayout.BeginVertical();
-            var style = new GUIStyle(GUI.skin.label);
-            style.alignment = TextAnchor.UpperCenter;
-            style.fixedWidth = 100;
-            GUILayout.Label(name, style);
-            var result = (Texture2D)EditorGUILayout.ObjectField(texture, typeof(Texture2D), false, GUILayout.Width(100), GUILayout.Height(100));
-            GUILayout.EndVertical();
-            return result;
-        }
-    }
-}
-#endif
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetEditor.cs.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetEditor.cs.meta
deleted file mode 100644
index 22602859..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetEditor.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 0995b204e3bb3c34f9b28c59301d601e
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetSet.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetSet.cs
deleted file mode 100644
index 15b28b53..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetSet.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-﻿/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-using System;
-using System.Collections.Generic;
-using UnityEngine;
-
-namespace Saab.Foundation.Unity.MapStreamer.Modules
-{
-    [CreateAssetMenu(fileName = "TerrainDetailTextureAssetSet", menuName = "Terrain/DetailTextureAssetSet")]
-    [Serializable]
-    public class TerrainDetailTextureAssetSet : ScriptableObject
-    {
-        [SerializeField]
-        public List<MappedDetailTextureAsset> Textures;
-    }
-
-    [Serializable]
-    public struct MappedDetailTextureAsset
-    {
-        [SerializeField]
-        public TerrainDetailTextureAsset Asset;
-        [SerializeField]
-        public MapFeature Mapping;
-    }
-}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetSet.cs.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetSet.cs.meta
deleted file mode 100644
index c1b4ff7a..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetSet.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 6abce6760cf4f044a9f484b68011a0f3
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetSetEditor.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetSetEditor.cs
deleted file mode 100644
index f3898e20..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetSetEditor.cs
+++ /dev/null
@@ -1,220 +0,0 @@
-﻿/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using UnityEngine;
-#if UNITY_EDITOR
-using UnityEditor;
-
-namespace Saab.Foundation.Unity.MapStreamer.Modules
-{
-    [CustomEditor(typeof(TerrainDetailTextureAssetSet))]
-    public class TerrainDetailTextureAssetSetEditor : Editor
-    {
-        public override void OnInspectorGUI()
-        {
-            TerrainDetailTextureAssetSet asset = (TerrainDetailTextureAssetSet)target;
-            if (asset == null)
-                return;
-
-            //Calculate layout information
-            var availableSpace = EditorGUIUtility.currentViewWidth;
-            var numColumns = (int)Math.Floor((availableSpace - 50) / 100);
-            numColumns = Math.Max(1, numColumns);
-
-            BuildUI(asset, numColumns);
-        }
-
-        private static void BuildUI(TerrainDetailTextureAssetSet asset, int numColumns)
-        {
-            EditorGUILayout.BeginHorizontal();
-
-            if (asset.Textures == null)
-                asset.Textures = new List<MappedDetailTextureAsset>();
-
-            //Asset list
-            for (int i = 0; i < asset.Textures.Count; i++)
-            {
-                HandleRowChange(numColumns, i);
-
-                CreateTextureAssetField(asset, i);
-            }
-
-            EditorGUILayout.EndHorizontal();
-
-            CreateAddButton(asset.Textures);
-
-            CreateErrorBox(asset);
-
-            EditorUtility.SetDirty(asset);
-        }
-
-        private static void HandleRowChange(int numColumns, int fieldCounter)
-        {
-            if (fieldCounter != 0 && (fieldCounter % numColumns) == 0)
-            {
-                EditorGUILayout.EndHorizontal();
-                EditorGUILayout.BeginHorizontal();
-            }
-        }
-
-        private static void CreateTextureAssetField(TerrainDetailTextureAssetSet asset, int index)
-        {
-            var style = new GUIStyle(GUI.skin.label);
-            style.alignment = TextAnchor.UpperCenter;
-            style.fixedWidth = 100;
-
-            GUILayout.BeginVertical(style);
-
-            GUILayout.Label("Detail asset " + index.ToString());
-
-            var result = (TerrainDetailTextureAsset)EditorGUILayout.ObjectField(asset.Textures[index].Asset, typeof(TerrainDetailTextureAsset), false, GUILayout.Width(100), GUILayout.Height(EditorGUIUtility.singleLineHeight));
-
-            CreateFeaturePicker(asset, index, out MapFeature featureResult);
-
-            if (result == asset.Textures[index].Asset)
-                asset.Textures[index] = new MappedDetailTextureAsset() { Asset = result, Mapping = featureResult };
-            else if (result == null)
-                asset.Textures[index] = new MappedDetailTextureAsset() { Asset = null, Mapping = MapFeature.None };
-            else
-                asset.Textures[index] = new MappedDetailTextureAsset() { Asset = result, Mapping = result.MatchingFeatures };
-
-            if (result != null && result.Albedo != null)
-                GUILayout.Box(result.Albedo, GUILayout.Width(100), GUILayout.Height(100));
-
-            CreateDeleteButton(asset.Textures, index);
-
-            GUILayout.EndVertical();
-        }
-
-        private static void CreateFeaturePicker(TerrainDetailTextureAssetSet asset, int index, out MapFeature result)
-        {
-            var currentFlags = asset.Textures[index].Mapping;
-            GUILayout.Label("Assigned to");
-            result = (MapFeature)EditorGUILayout.EnumFlagsField(currentFlags);
-        }
-
-        private static void CreateAddButton(List<MappedDetailTextureAsset> textures)
-        {
-            var style = new GUIStyle(GUI.skin.label);
-            style.alignment = TextAnchor.UpperCenter;
-            style.fixedWidth = 100;
-            GUILayout.BeginVertical(style, GUILayout.Width(100));
-
-            if (GUILayout.Button(new GUIContent("Add"), GUILayout.Height(100)))
-            {
-                textures.Add(new MappedDetailTextureAsset() { Asset = null, Mapping = MapFeature.None });
-            }
-
-            GUILayout.EndVertical();
-        }
-
-        private static void CreateDeleteButton(List<MappedDetailTextureAsset> textures, int index)
-        {
-            if (GUILayout.Button(new GUIContent("Delete"), GUILayout.Height(EditorGUIUtility.singleLineHeight)))
-            {
-                textures.RemoveAt(index);
-            }
-        }
-
-        private static void CreateErrorBox(TerrainDetailTextureAssetSet asset)
-        {
-            Dictionary<MapFeature, int> foundFeatures = CountFeatures(asset);
-
-            var errorString = "";
-
-            CheckForAssignmentsErrors(foundFeatures, ref errorString);
-            CheckForAssetsWithMissingTextures(asset, ref errorString);
-            CheckForEmptyOrUnmappedAssets(asset, ref errorString);
-
-            if (!string.IsNullOrEmpty(errorString))
-                EditorGUILayout.HelpBox(errorString, MessageType.Warning);
-        }
-
-        private static void CheckForAssignmentsErrors(Dictionary<MapFeature, int> foundFeatures, ref string errorString)
-        {
-            foreach (var kvp in foundFeatures)
-            {
-                if (kvp.Value == 0)
-                {
-                    errorString += $"Feature \"{kvp.Key}\" has no detail texture asset assigned.\n";
-                }
-                else if (kvp.Value > 1)
-                {
-                    errorString += $"Feature \"{kvp.Key}\" has multiple detail texture assets assigned.\n";
-                }
-            }
-        }
-
-        private static void CheckForAssetsWithMissingTextures(TerrainDetailTextureAssetSet asset, ref string errorString)
-        {
-            for (int i = 0; i < asset.Textures.Count; i++)
-            {
-                var textureAsset = asset.Textures[i];
-
-                if (textureAsset.Asset == null)
-                    continue;
-
-                if (textureAsset.Asset.Albedo == null ||
-                    textureAsset.Asset.Displacement == null ||
-                    textureAsset.Asset.Normal == null ||
-                    textureAsset.Asset.Roughness == null)
-                {
-                    errorString += $"Detail asset {i} is missing one or more of its textures.";
-                }
-            }
-        }
-
-        private static void CheckForEmptyOrUnmappedAssets(TerrainDetailTextureAssetSet asset, ref string errorString)
-        {
-            if (asset.Textures.Any(t => t.Asset == null))
-            {
-                errorString += "There are empty assets in the set.\n";
-            }
-
-            if (asset.Textures.Any(t => t.Mapping == 0))
-            {
-                errorString += "There are unmapped assets in the set.\n";
-            }
-        }
-
-        private static Dictionary<MapFeature, int> CountFeatures(TerrainDetailTextureAssetSet asset)
-        {
-            var features = (MapFeature[])Enum.GetValues(typeof(MapFeature));
-
-            //Remove the "None" entry as this is not a valid feature.
-            features = features.Where(f => f != MapFeature.None).ToArray();
-
-            //Dictionary with feature as key and 0 as initial value.
-            var foundFeatures = features.ToDictionary(f => f, f => 0);
-
-            //Start counting feature occurences.
-            foreach (var textureAsset in asset.Textures)
-            {
-                var mappedFlags = TerrainMapping.ExtractFlags(textureAsset.Mapping).Where(f => f != MapFeature.None);
-
-                foreach (var flag in mappedFlags)
-                {
-                    foundFeatures[flag]++;
-                }
-            }
-
-            return foundFeatures;
-        }
-    }
-}
-#endif
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetSetEditor.cs.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetSetEditor.cs.meta
deleted file mode 100644
index 130c62f6..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainDetail/TerrainDetailTextureAssetSetEditor.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 8fbb45fa06f097c43af5419d3403f624
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainMapping.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainMapping.cs
deleted file mode 100644
index 3aa595a5..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainMapping.cs
+++ /dev/null
@@ -1,311 +0,0 @@
-/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace Saab.Foundation.Unity.MapStreamer.Modules
-{
-    [Flags]
-    public enum MapFeature
-    {
-        None = 0,
-        // ****** ****** Ground types  ****** ******
-        // both a Ground type and a foliage
-        Grass = 1 << 0,
-        // for mountainous terrain or other types of rocky terrain
-        Rock = 1 << 1,
-        // needed for year around snow covered terrain (mountain peaks)
-        Snow = 1 << 2,
-        Sand = 1 << 3,
-        Gravel = 1 << 4,
-        Dirt = 1 << 5,
-        Barren = 1 << 6,
-        Water = 1 << 7,
-        Concrete = 1 << 8,
-        // ****** Transport ******
-        PavedRoad = 1 << 9,
-        DirtRoad = 1 << 10,
-        // ****** Foliage ******
-        // unknown foliage (bushes + trees)
-        Vegetation = 1 << 11,
-        GrassLawn = 1 << 12,
-        GrassWildFlowers = 1 << 13,
-        GrassTall = 1 << 14,
-        CropField = 1 << 15,
-        Bushes = 1 << 16,
-        // unknown tree (Evergreen + Deciduous)
-        Trees = 1 << 17,
-        Evergreen = 1 << 18,
-        Deciduous = 1 << 19,
-        Swamp = 1 << 20,
-        Asphalt = 1 << 21,
-    }
-
-    public static class TerrainMapping
-    {
-        private static Dictionary<int, MapFeature> _XLSToFeature = new Dictionary<int, MapFeature>
-        {
-            {0, MapFeature.None},                   // shadow_void
-            {10, MapFeature.Sand},                  // sand_void
-            {11, MapFeature.Sand},                  // sand_low_grass_sparse
-            {12, MapFeature.Sand},                  // sand_low_grass_dense
-            {13, MapFeature.Sand},                  // sand_high_grass_sparse
-            {14, MapFeature.Sand},                  // sand_high_grass_dense
-            {15, MapFeature.Sand},                  // sand_rocks_sparse
-            {16, MapFeature.Sand},                  // sand_rocks_dense
-            {20, MapFeature.Barren},                // barren_void
-            {21, MapFeature.Barren},                // barren_low_grass_sparse
-            {22, MapFeature.Barren},                // barren_low_grass_dense
-            {23, MapFeature.Barren},                // barren_high_grass_sparse
-            {24, MapFeature.Barren},                // barren_high_grass_dense
-            {25, MapFeature.Barren},                // barren_rocks_sparse
-            {26, MapFeature.Barren},                // barren_rocks_dense
-            {30, MapFeature.Rock},                  // rock_void
-            {31, MapFeature.Rock},                  // stone_void
-            {32, MapFeature.Rock},                  // browncoal_void
-            {40, MapFeature.GrassLawn},             // grass_lawn
-            {41, MapFeature.GrassWildFlowers},      // grass_grazing
-            {42, MapFeature.Grass},                 // grass_low
-            {43, MapFeature.GrassTall},             // grass_high
-            {50, MapFeature.Grass},                 // heath_sparse
-            {51, MapFeature.Grass},                 // heath_dense
-            {60, MapFeature.Bushes},                // bush_low_sparse
-            {61, MapFeature.Bushes},                // bush_low_dense
-            {62, MapFeature.Bushes},                // bush_medium_sparse
-            {63, MapFeature.Bushes},                // bush_medium_dense
-            {64, MapFeature.Bushes},                // bush_high_sparse
-            {65, MapFeature.Bushes},                // bush_high_dense
-            {70, MapFeature.Evergreen},             // forest_coniferous_moss_sparse
-            {71, MapFeature.Evergreen},             // forest_coniferous_moss_dense
-            {72, MapFeature.Evergreen},             // forest_coniferous_fern_sparse
-            {73, MapFeature.Evergreen},             // forest_coniferous_fern_dense
-            {74, MapFeature.Evergreen},             // forest_coniferous_brush_sparse
-            {75, MapFeature.Evergreen},             // forest_coniferous_brush_dense
-            {80, MapFeature.Deciduous},             // forest_deciduous_moss_sparse
-            {81, MapFeature.Deciduous},             // forest_deciduous_moss_dense
-            {82, MapFeature.Deciduous},             // forest_deciduous_fern_sparse
-            {83, MapFeature.Deciduous},             // forest_deciduous_fern_dense
-            {84, MapFeature.Deciduous},             // forest_deciduous_brush_sparse
-            {85, MapFeature.Deciduous},             // forest_deciduous_brush_dense
-            {90, MapFeature.Trees},                 // forest_mixed_moss_sparse
-            {91, MapFeature.Trees},                 // forest_mixed_moss_dense
-            {92, MapFeature.Trees},                 // forest_mixed_fern_spars
-            {93, MapFeature.Trees},                 // forest_mixed_fern_dense
-            {94, MapFeature.Trees},                 // forest_mixed_brush_sparse
-            {95, MapFeature.Trees},                 // forest_mixed_brush_dense
-            {100, MapFeature.CropField},            // crop_ploughed
-            {101, MapFeature.CropField},            // crop_corn    
-            {102, MapFeature.CropField},            // crop_coleseed
-            {103, MapFeature.CropField},            // crop_maize
-            {104, MapFeature.CropField},            // crop_cowl
-            {105, MapFeature.CropField},            // crop_potato
-            {106, MapFeature.CropField},            // crop_hop
-            {107, MapFeature.CropField},            // crop_fruit_plant
-            {108, MapFeature.CropField},            // crop_fruit_tree
-            {109, MapFeature.CropField},            // crop_wine
-            {110, MapFeature.CropField},            // crop_unknown
-            {120, MapFeature.Dirt},                 // hydrosoil_sand
-            {121, MapFeature.Dirt},                 // hydrosoil_rock
-            {122, MapFeature.Dirt},                 // hydrosoil_dirt
-            {123, MapFeature.Dirt},                 // hydrosoil_sparse_veg
-            {124, MapFeature.Dirt},                 // hydrosoil_dense_veg
-            {130, MapFeature.Concrete},             // concrete_void
-            {131, MapFeature.Concrete},             // concrete_dirt
-            {140, MapFeature.Asphalt},              // asphalt_void
-            {141, MapFeature.Asphalt},              // asphalt_dirt
-            {150, MapFeature.PavedRoad},            // paved_roadway
-            {151, MapFeature.PavedRoad},            // paved_pedestrian
-            {160, MapFeature.Gravel},               // gravel_void
-            {161, MapFeature.Gravel},               // gravel_dirt
-            {162, MapFeature.Gravel},               // gravel_rocks
-            {170, MapFeature.Concrete},             // built-up_void
-            {171, MapFeature.Sand},                 // built-up_sand
-            {172, MapFeature.Barren},               // built-up_barren
-            {173, MapFeature.Concrete},             // built-up_concrete
-            {180, MapFeature.Swamp},                // swamp_void
-            {181, MapFeature.Swamp},                // swamp_low_grass_sparse
-            {182, MapFeature.Swamp},                // swamp_low_grass_dense
-            {183, MapFeature.Swamp},                // swamp_high_grass_sparse
-            {184, MapFeature.Swamp},                // swamp_high_grass_dense
-            {241, MapFeature.Barren},               // barren_void
-            {242, MapFeature.Barren},               // barren_void
-            {243, MapFeature.Barren},               // barren_void
-            {244, MapFeature.Barren},               // barren_void
-            {245, MapFeature.Barren},               // barren_void
-            {246, MapFeature.Barren},               // barren_void
-            {254, MapFeature.Barren},               // barren_void
-            {255, MapFeature.Barren}                // barren_void
-        };
-
-        private static Dictionary<int, MapFeature> _maxarToFeature = new Dictionary<int, MapFeature>
-        {
-            {0, MapFeature.None },          // Nodata
-            {1, MapFeature.None },          // Undefined
-            {6, MapFeature.Concrete},       // Building
-            {8, MapFeature.Concrete },      // Manmade object
-            {21, MapFeature.Grass},         // Ground grass
-            {22, MapFeature.Barren},        // Ground barren
-            {40, MapFeature.Vegetation},    // Vegetation
-            {47, MapFeature.DirtRoad},      // Vegetation over road
-            {48, MapFeature.None },         // Vegetation over building
-            {49, MapFeature.None },         // Vegetation over bridge
-            {60, MapFeature.Water},         // Water unspecified
-            {65, MapFeature.Water},         // Water swimmingpool
-            {80, MapFeature.Concrete},      // Man-made surface
-            {81, MapFeature.PavedRoad},     // Man-made surface paved road
-            {83, MapFeature.DirtRoad},      // Man-made surface dirt road
-            {86, MapFeature.None},          // Man-made surface bridge
-            {89, MapFeature.None},          // Man-made surface railbridge
-            {90, MapFeature.Concrete},      // Man-made surface rail
-            {82, MapFeature.Asphalt},       // Man-made surface runway
-        };
-
-        private static Dictionary<int, MapFeature> _gzFeature = new Dictionary<int, MapFeature>
-        {
-            {0, MapFeature.None },              // Nodata
-            {1, MapFeature.None },              // Undefined
-            {6, MapFeature.Concrete},           // Building
-            {8, MapFeature.Concrete },          // Manmade object
-            {21, MapFeature.Grass},             // Ground grass
-            {22, MapFeature.Barren},            // Ground barren
-            {23, MapFeature.Sand},              // Ground sand
-            {24, MapFeature.Rock},              // Ground hydro soil
-            {25, MapFeature.Dirt},              // Ground rock
-            {26, MapFeature.Gravel},            // Ground Gravel
-            {27, MapFeature.CropField},         // Ground Crops
-            {28, MapFeature.Swamp},             // Ground Swamp
-            {29, MapFeature.GrassWildFlowers},  // Ground heath
-
-            {40, MapFeature.Vegetation},        // Vegetation
-            {47, MapFeature.DirtRoad},          // Vegetation over road
-            {48, MapFeature.None },             // Vegetation over building
-            {49, MapFeature.None },             // Vegetation over bridge
-
-            {60, MapFeature.Water},             // Water unspecified
-            {65, MapFeature.Water},             // Water swimmingpool
-
-            {80, MapFeature.Concrete},          // Man-made surface
-            {81, MapFeature.PavedRoad},         // Man-made surface paved road
-            {83, MapFeature.DirtRoad},          // Man-made surface dirt road
-            {86, MapFeature.None},              // Man-made surface bridge
-            {89, MapFeature.None},              // Man-made surface railbridge
-            {90, MapFeature.Concrete},          // Man-made surface rail
-            {92, MapFeature.Asphalt},           // Man-made surface runway
-        };
-
-
-        static private MapFeature MapXLSData(int label)
-        {
-            if (_XLSToFeature.TryGetValue(label, out var feature))
-            {
-                return feature;
-            }
-            else
-            {
-                return MapFeature.None;
-            }
-        }
-
-        static private MapFeature MapMaxarData(int label)
-        {
-            if (_maxarToFeature.TryGetValue(label, out var feature))
-            {
-                return feature;
-            }
-            else
-            {
-                return MapFeature.None;
-            }
-        }
-
-        static private MapFeature MapgzData(int label)
-        {
-            if (_gzFeature.TryGetValue(label, out var feature))
-            {
-                return feature;
-            }
-            else
-            {
-                return MapFeature.None;
-            }
-        }
-
-        public static int BinaryToIndex(int binaryValue)
-        {
-            if (binaryValue == 0)
-                return 0;
-
-            int index = 1;
-            while ((binaryValue & 1) != 1)
-            {
-                binaryValue >>= 1;
-                index++;
-            }
-            return index;
-        }
-
-        public static int[] MapFeatureData()
-        {
-            return MapFeatureData(MapgzData);
-        }
-
-        public static int[] MapFeatureData(Func<int, MapFeature> Mapping)
-        {
-            int[] labels = new int[256];
-
-            for (int i = 0; i < 256; i++)
-            {
-                labels[i] = BinaryToIndex((int)Mapping(i));
-            }
-            return labels;
-        }
-
-        public static int[] FeatureTruthTable(int[] labels, MapFeature features)
-        {
-            var truthTable = new int[labels.Length];
-
-            for (int i = 0; i < labels.Length; i++)
-            {
-                MapFeature feature = (MapFeature)(1 << (labels[i] - 1));
-                truthTable[i] = features.HasFlag(feature) ? 1 : 0;
-            }
-
-            return truthTable;
-        }
-
-        public static MapFeature[] ExtractFlags(MapFeature flags, bool includeZero = false)
-        {
-            var values = Enum.GetValues(typeof(MapFeature));
-            List<MapFeature> foundFlags = new List<MapFeature>();
-
-            foreach (var value in values)
-            {
-                var flag = (MapFeature)value;
-
-                if (flags.HasFlag(flag) && (includeZero || flag != 0))
-                    foundFlags.Add(flag);
-            }
-
-            return foundFlags.ToArray();
-        }
-
-        public static int[] ExtractFlagsAsIndices(MapFeature flags)
-        {
-            return ExtractFlags(flags).Select(a => BinaryToIndex((int)a)).ToArray();
-        }
-    }
-}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainMapping.cs.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainMapping.cs.meta
deleted file mode 100644
index 727b6599..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TerrainMapping.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 8f0c94dfa0d055540b6f82dc52fa4382
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TextureUtility.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TextureUtility.cs
deleted file mode 100644
index 50c0a36f..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TextureUtility.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-
-using System.Collections.Generic;
-using System.Linq;
-using UnityEngine;
-
-namespace Saab.Foundation.Unity.MapStreamer.Utils
-{
-    public static class TextureUtility
-    {
-        private static uint NextPowerOfTwo(uint v)
-        {
-            v--;
-            v |= v >> 1;
-            v |= v >> 2;
-            v |= v >> 4;
-            v |= v >> 8;
-            v |= v >> 16;
-
-            return v + 1;
-        }
-
-        public static Texture2DArray Create2DArray(List<Texture2D> Textures, TextureFormat targetFormat)
-        {
-            var textureCount = Textures.Count;
-            var textureResolution = Mathf.Max(Textures.Max(item => item.width), Textures.Max(item => item.height));
-            textureResolution = (int)NextPowerOfTwo((uint)textureResolution);
-
-            Texture2DArray textureArray;
-
-            textureArray = new Texture2DArray(textureResolution, textureResolution, textureCount, targetFormat, true)
-            {
-                wrapMode = TextureWrapMode.Clamp
-            };
-
-            //RenderTexture temporaryRenderTexture = new RenderTexture(textureResolution, textureResolution, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default)
-            //{
-            //    useMipMap = true,
-            //    antiAliasing = 1
-            //};
-
-            RenderTexture temporaryRenderTexture = RenderTexture.GetTemporary(textureResolution, textureResolution, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default, 1);
-
-
-            for (int i = 0; i < textureCount; i++)
-            {
-                //Debug.LogWarning($"graphic format: {foliages[i].MainTexture.graphicsFormat} format: {foliages[i].MainTexture.format}");
-                Graphics.Blit(Textures[i], temporaryRenderTexture);
-                RenderTexture.active = temporaryRenderTexture;
-
-                Texture2D temporaryTexture = new Texture2D(textureResolution, textureResolution, TextureFormat.ARGB32, true);
-                temporaryTexture.ReadPixels(new Rect(0, 0, temporaryTexture.width, temporaryTexture.height), 0, 0);
-                RenderTexture.active = null;
-                temporaryTexture.Apply(true);
-                temporaryTexture.Compress(true);
-                Graphics.CopyTexture(temporaryTexture, 0, textureArray, i);
-
-                RenderTexture.ReleaseTemporary(temporaryRenderTexture);
-            }
-            textureArray.Apply(false, true);
-
-            RenderTexture.ReleaseTemporary(temporaryRenderTexture);
-
-            return textureArray;
-        }
-    }
-}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TextureUtility.cs.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TextureUtility.cs.meta
deleted file mode 100644
index 0d6ea0b0..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.Modules/TextureUtility.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: f2f56d817ce160a4bb68f5074ed98443
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.meta
deleted file mode 100644
index 89af18cc..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: d1a3e511ebbba484dbbc239547af7e13
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/AssetInstanceBuilder.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/AssetInstanceBuilder.cs
deleted file mode 100644
index ef0db8ee..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/AssetInstanceBuilder.cs
+++ /dev/null
@@ -1,170 +0,0 @@
-//******************************************************************************
-//
-// Copyright (C) SAAB AB
-//
-// All rights, including the copyright, to the computer program(s) 
-// herein belong to Saab AB. The program(s) may be used and/or
-// copied only with the written permission of Saab AB, or in
-// accordance with the terms and conditions stipulated in the
-// agreement/contract under which the program(s) have been
-// supplied. 
-//
-//
-// Information Class:	COMPANY UNCLASSIFIED
-// Defence Secrecy:		NOT CLASSIFIED
-// Export Control:		NOT EXPORT CONTROLLED
-//
-//
-// File			: AssetInstanceBuilder.cs
-// Module		:
-// Description	: Helper class for vertice updates
-// Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
-//
-// NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
-//			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
-//			usage in Game or VisSim development.
-//
-//
-// Revision History...
-//
-// Who	Date	Description
-//
-// ZJP	240827	Created file                                        (2.12.171)
-//
-//******************************************************************************
-
-using GizmoSDK.Gizmo3D;
-using System;
-using System.Collections.Generic;
-using UnityEngine;
-
-namespace Saab.Foundation.Unity.MapStreamer
-{
-    /// <summary>
-    /// Internal builder used for RefNode (shared assets), during asset traversal geometry nodes are registered
-    /// as prefabs using AddAssetPrefab() and SceneManager will use the AssetInstanceBuilder when traversing RefNode
-    /// scenegraphs, if the geometry node has been registered the mesh and material will be reused and the NodeHandle
-    /// will be marked as shared.
-    /// </summary>
-    internal class AssetInstanceBuilder : INodeBuilder
-    {
-        public PoolObjectFeature Feature => throw new NotSupportedException();
-
-        // we create instances across multiple frames by default to reduce the running time of our main render method
-        public BuildPriority Priority => BuildPriority.Low;
-
-        // maps a native node address to the managed handle
-        private readonly Dictionary<IntPtr, NodeHandle> _assetPrefabs = new Dictionary<IntPtr, NodeHandle>();
-
-        /// <summary>
-        /// Maps a Geometry node to a built gameobject
-        /// </summary>
-        /// <param name="geo"></param>
-        /// <param name="nodeHandle"></param>
-        public void AddAssetPrefab(Geometry geo, NodeHandle nodeHandle)
-        {
-            _assetPrefabs.Add(geo.GetNativeReference(), nodeHandle);
-        }
-        
-        public bool Build(NodeHandle nodeHandle, NodeHandle activeStateNode)
-        {
-            if (!_assetPrefabs.TryGetValue(nodeHandle.node.GetNativeReference(), out NodeHandle assetPrefab))
-            {
-                Debug.LogError("no asset prefab found for geometry node during instancing pass");
-                return false;
-            }
-
-            System.Diagnostics.Debug.Assert(nodeHandle.node.GetNativeReference() == assetPrefab.node.GetNativeReference());
-            CreateInstanceFromPrefab(nodeHandle, assetPrefab);
-            return true;
-        }
-
-        public void BuiltObjectReturnedToPool(GameObject gameObject, bool sharedAsset)
-        {
-            System.Diagnostics.Debug.Assert(sharedAsset);
-
-            if (gameObject.TryGetComponent<MeshRenderer>(out var renderer))
-            {
-                renderer.enabled = false;
-                renderer.sharedMaterial = null;
-            }
-            if (gameObject.TryGetComponent<MeshFilter>(out var filter))
-                filter.sharedMesh = null;
-        }
-
-        public void InitPoolObject(GameObject gameObject)
-        {
-            gameObject.AddComponent<MeshRenderer>();
-            gameObject.AddComponent<MeshFilter>();
-        }
-
-        public bool CanBuild(Node node, TraversalState traversalState, IntersectMaskValue intersectMask)
-        {
-            // SceneManager will manually control when this builder runs
-            throw new NotSupportedException();
-        }
-
-        public void SetTextureManager(TextureManager textureManager)
-        {
-            // nop
-        }
-
-        public void SetMaterialManager(MaterialManager textureManager)
-        {
-            // nop
-        }
-
-        public void Reset()
-        {
-            foreach (var kvp in _assetPrefabs)
-            {
-                var prefabNodeHandle = kvp.Value;
-                if (prefabNodeHandle.TryGetComponent<MeshFilter>(out var meshFilter))
-                {
-                    GameObject.Destroy(meshFilter.sharedMesh);
-                    meshFilter.sharedMesh = null;
-                }
-                if (prefabNodeHandle.TryGetComponent<MeshRenderer>(out var meshRenderer))
-                {
-                    GameObject.Destroy(meshRenderer.sharedMaterial);
-                    meshRenderer.sharedMaterial = null;
-                }
-            }
-
-            _assetPrefabs.Clear();
-        }
-
-        private void CreateInstanceFromPrefab(NodeHandle clone, NodeHandle src)
-        {
-            // copy mesh renderer and assign shared material instance
-            CopyMeshRenderer(src.gameObject, clone.gameObject);
-
-            // copy mesh filter and assign shared mesh instance
-            CopyMeshFilter(src.gameObject, clone.gameObject);
-        }
-
-        private static void CopyMeshRenderer(GameObject from, GameObject to)
-        {
-            if (!from.TryGetComponent<MeshRenderer>(out var src))
-                return;
-
-            if (!to.TryGetComponent<MeshRenderer>(out var dst))
-                dst = to.AddComponent<MeshRenderer>();
-
-            dst.sharedMaterial = src.sharedMaterial;
-            dst.enabled = true;
-        }
-
-        private static void CopyMeshFilter(GameObject from, GameObject to)
-        {
-            if (!from.TryGetComponent<MeshFilter>(out var src))
-                return;
-
-            if (!to.TryGetComponent<MeshFilter>(out var dst))
-                dst = to.AddComponent<MeshFilter>();
-
-            dst.sharedMesh = src.sharedMesh;
-        }
-    }
-}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/AssetInstanceBuilder.cs.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/AssetInstanceBuilder.cs.meta
deleted file mode 100644
index bffdf690..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/AssetInstanceBuilder.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 11b545c0782e8a140a8c0c6a5bf9087e
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/AssetNodeBuilder.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/AssetNodeBuilder.cs
deleted file mode 100644
index 49a6eb0b..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/AssetNodeBuilder.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-//******************************************************************************
-//
-// Copyright (C) SAAB AB
-//
-// All rights, including the copyright, to the computer program(s) 
-// herein belong to Saab AB. The program(s) may be used and/or
-// copied only with the written permission of Saab AB, or in
-// accordance with the terms and conditions stipulated in the
-// agreement/contract under which the program(s) have been
-// supplied. 
-//
-//
-// Information Class:	COMPANY UNCLASSIFIED
-// Defence Secrecy:		NOT CLASSIFIED
-// Export Control:		NOT EXPORT CONTROLLED
-//
-//
-// File			: NodeGeometryHelper.cs
-// Module		:
-// Description	: Helper class for vertice updates
-// Author		: Anders Mod�n
-// Product		: Gizmo3D 2.12.185
-//
-// NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
-//			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
-//			usage in Game or VisSim development.
-//
-//
-// Revision History...
-//
-// Who	Date	Description
-//
-// ZJP	240821	Created file                                        (2.12.171)
-//
-//******************************************************************************
-
-using UnityEngine;
-
-namespace Saab.Foundation.Unity.MapStreamer
-{
-    public class AssetNodeBuilder : GeometryBuilderBase
-    {
-        public override PoolObjectFeature Feature => PoolObjectFeature.StaticMesh;
-
-        protected override bool CreateStateNodeResources(NodeHandle stateNode)
-        {
-            // check if the state has already been loaded
-            if (stateNode.stateLoadInfo.HasFlag(StateLoadInfo.Texture))
-                return true;
-
-            var state = stateNode.node.State;
-
-            if (!StateHelper.Build(state, out Texture2D buildOutput, _textureManager))
-            {
-                state.ReleaseAlreadyLocked();
-                return false;
-            }
-
-            stateNode.stateLoadInfo |= StateLoadInfo.Texture;
-            stateNode.texture = buildOutput;
-
-            state.ReleaseAlreadyLocked();
-            return true;
-        }
-    }
-}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/AssetNodeBuilder.cs.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/AssetNodeBuilder.cs.meta
deleted file mode 100644
index c7fb0f9c..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/AssetNodeBuilder.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 25734977c93f1f341b6ba330af04bd14
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/GeometryBuilder.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/GeometryBuilder.cs
deleted file mode 100644
index ad0064cc..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/GeometryBuilder.cs
+++ /dev/null
@@ -1,244 +0,0 @@
-﻿//******************************************************************************
-//
-// Copyright (C) SAAB AB
-//
-// All rights, including the copyright, to the computer program(s) 
-// herein belong to Saab AB. The program(s) may be used and/or
-// copied only with the written permission of Saab AB, or in
-// accordance with the terms and conditions stipulated in the
-// agreement/contract under which the program(s) have been
-// supplied. 
-//
-//
-// Information Class:	COMPANY UNCLASSIFIED
-// Defence Secrecy:		NOT CLASSIFIED
-// Export Control:		NOT EXPORT CONTROLLED
-//
-//
-// File			: GeometryBuilder.cs
-// Module		:
-// Description	: Special class for geometry builder
-// Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
-//
-// NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
-//			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
-//			usage in Game or VisSim development.
-//
-//
-// Revision History...
-//
-// Who	Date	Description
-//
-// ZJP	200625	Created file                                        (2.10.6)
-// AMO  230113  Added Feature Maps from texture 1                   (2.12.43)
-//
-//******************************************************************************
-
-// Unity
-using UnityEngine;
-
-// GizmoSDK
-using GizmoSDK.Gizmo3D;
-using Unity.Profiling;
-using System.Collections.Generic;
-
-namespace Saab.Foundation.Unity.MapStreamer
-{
-    public abstract class NodeBuilderBase : MonoBehaviour, INodeBuilder
-    {
-        [SerializeField]
-        private BuildPriority _mode = BuildPriority.Immediate;
-
-        protected TextureManager _textureManager;
-        protected MaterialManager _materialManager;
-
-        public abstract PoolObjectFeature Feature { get; }
-
-        public BuildPriority Priority => _mode;
-
-        public abstract bool Build(NodeHandle nodeHandle, NodeHandle activeStateNode);
-
-        public abstract void BuiltObjectReturnedToPool(GameObject gameObject, bool sharedAsset);
-        public abstract void InitPoolObject(GameObject gameObject);
-
-        public abstract bool CanBuild(Node node, TraversalState traversalState, IntersectMaskValue intersectMask);
-
-        public void SetTextureManager(TextureManager textureManager)
-        {
-            _textureManager = textureManager;
-        }
-
-        public void SetMaterialManager(MaterialManager materialManager)
-        {
-            _materialManager = materialManager;
-        }
-
-        public virtual void Reset()
-        {
-            // NOP
-        }
-    }
-
-    public abstract class GeometryBuilderBase : NodeBuilderBase
-    {
-        [SerializeField]
-        [Tooltip("Material to use when state is missing")]
-        protected Material _fallbackMaterial;
-
-        [SerializeField]
-        [Tooltip("Material to use when building geometry")]
-        protected Material _material;
-
-        [SerializeField]
-        [Tooltip("Only nodes with a matching intersection mask will be processed by this builder")]
-        protected IntersectMaskValue _mask;
-
-        [SerializeField]
-        [Tooltip("Ignore state information and always use the fallback material")]
-        private bool _forceFallbackMaterial;
-
-
-        private static readonly ProfilerMarker _profilerBuild = new ProfilerMarker(ProfilerCategory.Render, "SM-Geometry-Build");
-
-        public override bool CanBuild(Node node, TraversalState traversalState, IntersectMaskValue intersectMask)
-        {
-            return (intersectMask & _mask) != IntersectMaskValue.NOTHING && node is Geometry;
-        }
-
-        public override bool Build(NodeHandle nodeHandle, NodeHandle activeStateNode)
-        {
-            _profilerBuild.Begin();
-            var geo = (Geometry)nodeHandle.node;
-            
-            var go = nodeHandle.gameObject;
-            
-            // MeshRenderer component
-            if (!go.TryGetComponent<MeshRenderer>(out var meshRenderer))
-                meshRenderer = go.AddComponent<MeshRenderer>();
-
-            // MeshFilter component
-            if (!go.TryGetComponent<MeshFilter>(out var meshFilter))
-                meshFilter = go.AddComponent<MeshFilter>();
-
-            if (!GeometryHelper.Build(geo, out Mesh mesh, out Color uniformColor))
-            {
-#if DEBUG
-                Debug.LogError("failed to generate mesh, no geometry was built");
-#endif
-
-                Destroy(mesh);
-                meshFilter.sharedMesh = null;
-                meshRenderer.enabled = false;
-                return false;
-            }
-
-            Material material;
-            if (_forceFallbackMaterial)
-            {
-                 // Todo: reuse material if texture match
-                material = Instantiate(_fallbackMaterial);
-            }
-            else
-            {
-                if (activeStateNode != null)
-                {
-                    if (CreateStateNodeResources(activeStateNode))
-                    {
-                        material = CreateMaterialFromState(activeStateNode);
-                        material.color = uniformColor;
-                    }
-                    else
-                    {
-#if DEBUG
-                        Debug.LogError("failed to create resources from state, using fallback material");
-#endif
-                        // Todo: reuse material if texture match
-                        material = Instantiate(_fallbackMaterial);
-                    }
-                }
-                else
-                {
-#if DEBUG
-                    Debug.LogError("missing state, using fallback material");
-#endif
-                    // Todo: reuse material if texture match
-                    material = Instantiate(_fallbackMaterial);
-                }
-            }
-
-            meshFilter.sharedMesh = mesh;
-            meshRenderer.sharedMaterial = material;
-            meshRenderer.enabled = true;
-            _profilerBuild.End();
-
-            return true;
-        }
-
-        public override void BuiltObjectReturnedToPool(GameObject gameObject, bool sharedAsset)
-        {
-            if (sharedAsset)
-            {
-                if (gameObject.TryGetComponent<MeshRenderer>(out var renderer))
-                {
-                    renderer.enabled = false;
-                    renderer.sharedMaterial = null;
-                }
-                if (gameObject.TryGetComponent<MeshFilter>(out var meshFilter))
-                    meshFilter.sharedMesh = null;
-            }
-            else
-            {
-                // release material & mesh resources
-                if (gameObject.TryGetComponent<MeshRenderer>(out var renderer))
-                {
-                    _materialManager.Free(renderer.sharedMaterial);
-                    //Destroy(renderer.sharedMaterial);
-                    renderer.sharedMaterial = null;
-                    renderer.enabled = false;
-                }
-                if (gameObject.TryGetComponent<MeshFilter>(out var meshFilter))
-                {
-                    Destroy(meshFilter.sharedMesh);
-                    meshFilter.sharedMesh = null;
-                }
-            }
-        }
-
-        public override void InitPoolObject(GameObject gameObject)
-        {
-            gameObject.AddComponent<MeshRenderer>();
-            gameObject.AddComponent<MeshFilter>();
-        }
-
-        /// <summary>
-        /// Loads resources from a state and stores on the node for future reference
-        /// </summary>
-        /// <param name="stateNode">scenegraph rendering state</param>
-        /// <returns>true if resources was loaded from the state correctly</returns>
-        protected abstract bool CreateStateNodeResources(NodeHandle stateNode);
-
-        /// <summary>
-        /// Creates and setups a material instance from a scenegraph rendering state, uses fallback material if state is not valid
-        /// </summary>
-        /// <param name="stateNode">scenegraph rendering state</param>
-        /// <returns>new material instance</returns>
-        protected virtual Material CreateMaterialFromState(NodeHandle stateNode)
-        {
-            if (!stateNode.texture)
-                return Instantiate(_fallbackMaterial);
-
-            var id = stateNode.texture.GetInstanceID();
-            Material material = null;
-
-            if (!_materialManager.TryGet(id, out material))
-            {
-                material = Instantiate(_material);
-                material.mainTexture = stateNode.texture;
-                _materialManager.TryAdd(id, material);
-            }
-    
-            return material;
-        }
-    }
-}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/MaterialManager.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/MaterialManager.cs
deleted file mode 100644
index aca75756..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/MaterialManager.cs
+++ /dev/null
@@ -1,124 +0,0 @@
-//******************************************************************************
-//
-// Copyright (C) SAAB AB
-//
-// All rights, including the copyright, to the computer program(s) 
-// herein belong to Saab AB. The program(s) may be used and/or
-// copied only with the written permission of Saab AB, or in
-// accordance with the terms and conditions stipulated in the
-// agreement/contract under which the program(s) have been
-// supplied. 
-//
-//
-// Information Class:	COMPANY UNCLASSIFIED
-// Defence Secrecy:		NOT CLASSIFIED
-// Export Control:		NOT EXPORT CONTROLLED
-//
-//
-// File			: MaterialManager.cs
-// Module		:
-// Description	: Helper for Material and state uploads
-// Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
-//
-// NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
-//			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
-//			usage in Game or VisSim development.
-//
-//
-// Revision History...
-//
-// Who	Date	Description
-//
-// Albni 250326	Created file                                        
-//
-//******************************************************************************
-
-// Framework
-using System;
-using System.Collections.Generic;
-
-// Unity
-using UnityEngine;
-
-// GizmoSDK
-
-namespace Saab.Foundation.Unity.MapStreamer
-{
-    public class MaterialManager
-    {
-        private struct MaterialCacheItem
-        {
-            public Material Material;
-            public int RefCount;
-        }
-
-        private readonly Dictionary<int, MaterialCacheItem> _MaterialCache = new Dictionary<int, MaterialCacheItem>();
-        private readonly Dictionary<Material, int> _lookup = new Dictionary<Material, int>();
-
-        public bool TryAdd(int key, Material value)
-        {
-            if (_MaterialCache.TryAdd(key, new MaterialCacheItem() { Material = value, RefCount = 1 }))
-            {
-                // add a reverse lookup to support the free operation
-                _lookup.Add(value, key);
-                return true;
-            }
-
-            // resource already existed, no operation performed
-            return false;
-        }
-
-        public bool TryGet(int key, out Material value)
-        {
-            if (_MaterialCache.TryGetValue(key, out MaterialCacheItem item))
-            {
-                // item existed in the cache, increase the ref count and return the resource
-                item.RefCount++;
-                _MaterialCache[key] = item;
-
-                value = item.Material;
-                return true;
-            }
-
-            // failed to find the given resource
-            value = null;
-            return false;
-        }
-
-        public bool Free(Material Material)
-        {
-            if (_lookup.TryGetValue(Material, out int key))
-            {
-                MaterialCacheItem item = _MaterialCache[key];
-                item.RefCount--;
-
-                // check if this was the last reference
-                if (item.RefCount > 0)
-                {
-                    // simply update the ref counter
-                    _MaterialCache[key] = item;
-                    return true;
-                }
-
-                // this was the last reference for the Material, we should release it
-                _lookup.Remove(Material);
-                _MaterialCache.Remove(key);
-                GameObject.Destroy(Material);
-                return true;
-            }
-
-            // failed to find the given resource, no operation performed
-            return false;
-        }
-
-        public void Clear()
-        {
-            foreach (var kvp in _lookup)
-                GameObject.Destroy(kvp.Key);
-
-            _lookup.Clear();
-            _MaterialCache.Clear();
-        }
-    }
-}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/MaterialManager.cs.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/MaterialManager.cs.meta
deleted file mode 100644
index c361f4c7..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/MaterialManager.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 11830de664d63774f9643bb1723b1aab
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeBuilder.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeBuilder.cs
deleted file mode 100644
index 6096a67d..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/NodeBuilder.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-﻿//******************************************************************************
-//
-// Copyright (C) SAAB AB
-//
-// All rights, including the copyright, to the computer program(s) 
-// herein belong to Saab AB. The program(s) may be used and/or
-// copied only with the written permission of Saab AB, or in
-// accordance with the terms and conditions stipulated in the
-// agreement/contract under which the program(s) have been
-// supplied. 
-//
-//
-// Information Class:	COMPANY UNCLASSIFIED
-// Defence Secrecy:		NOT CLASSIFIED
-// Export Control:		NOT EXPORT CONTROLLED
-//
-//
-// File			: NodeBuilder.cs
-// Module		:
-// Description	: Generic Builder Interface
-// Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
-//
-// NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
-//			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
-//			usage in Game or VisSim development.
-//
-//
-// Revision History...
-//
-// Who	Date	Description
-//
-// ZJP	200625	Created file                                        (2.10.6)
-//
-//******************************************************************************
-
-using UnityEngine;
-using GizmoSDK.Gizmo3D;
-
-namespace Saab.Foundation.Unity.MapStreamer
-{
-    public enum BuildPriority
-    {
-        Immediate,
-        Low,
-    }
-
-    public interface INodeBuilder
-    {
-        PoolObjectFeature Feature { get; }
-
-         BuildPriority Priority { get; }
-
-        /// <summary>
-        /// Invoked by the SceneManager to determine if the provided node together with additional info
-        /// is a valid build target for this builder
-        /// </summary>
-        /// <param name="node">Node</param>
-        /// <param name="traversalState">Current traversal state</param>
-        /// <param name="intersectMask">Current intersector mask</param>
-        /// <returns></returns>
-        bool CanBuild(Node node, TraversalState traversalState, IntersectMaskValue intersectMask);
-
-        /// <summary>
-        /// Builds the object from a native node using the provided state information
-        /// </summary>
-        /// <param name="nodeHandle">NodeHandle</param>
-        /// <param name="activeStateNode">Current active state, such as texture and color information</param>
-        /// <returns></returns>
-        bool Build(NodeHandle nodeHandle, NodeHandle activeStateNode);
-
-        /// <summary>
-        /// Invoked when an object built by this builder is recycled
-        /// </summary>
-        /// <param name="gameObject">object that was recycled</param>
-        /// <param name="sharedAsset">true if the object was was sharing resources</param>
-        void BuiltObjectReturnedToPool(GameObject gameObject, bool sharedAsset);
-
-        /// <summary>
-        /// Invoked when allocating new objects for this builder instance, allowing the builder
-        /// to add all required components
-        /// </summary>
-        /// <param name="gameObject">GameObject to decorate</param>
-        void InitPoolObject(GameObject gameObject);
-
-        /// <summary>
-        /// Assigns the texture manager instance that the builder should use when working with textures
-        /// </summary>
-        /// <param name="textureManager">Assigned TextureManager instance</param>
-        void SetTextureManager(TextureManager textureManager);
-
-        /// <summary>
-        /// Assigns the Material manager instance that the builder should use when working with Materials
-        /// </summary>
-        /// <param name="materialManager">Assigned MaterialManager instance</param>
-        void SetMaterialManager(MaterialManager materialManager);
-
-        /// <summary>
-        /// Invoked as a result of reset, builder should clear any state
-        /// </summary>
-        void Reset();
-    }
-}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/SceneManager.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/SceneManager.cs
deleted file mode 100644
index ad0c651e..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/SceneManager.cs
+++ /dev/null
@@ -1,1719 +0,0 @@
-﻿//******************************************************************************
-//
-// Copyright (C) SAAB AB
-//
-// All rights, including the copyright, to the computer program(s) 
-// herein belong to Saab AB. The program(s) may be used and/or
-// copied only with the written permission of Saab AB, or in
-// accordance with the terms and conditions stipulated in the
-// agreement/contract under which the program(s) have been
-// supplied. 
-//
-//
-// Information Class:	COMPANY UNCLASSIFIED
-// Defence Secrecy:		NOT CLASSIFIED
-// Export Control:		NOT EXPORT CONTROLLED
-//
-//
-// File			: SceneManager.cs
-// Module		:
-// Description	: Management of dynamic asset loader from GizmoSDK
-// Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
-//
-// NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
-//			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
-//			usage in Game or VisSim development.
-//
-//
-// Revision History...
-//
-// Who	Date	Description
-//
-// AMO	180607	Created file        (2.9.1)
-// AMO  200304  Updated SceneManager with events for external users     (2.10.1)
-// AMO  221130  Updated SM with new locking and camera sync             (2.12.35)
-//
-//******************************************************************************
-
-//#define DEBUG_CAMERA
-
-// Unity Managed classes
-using UnityEngine;
-
-// Gizmo Managed classes
-using GizmoSDK.GizmoBase;
-using GizmoSDK.Gizmo3D;
-
-// Fix some conflicts between unity and Gizmo namespaces
-using gzCamera = GizmoSDK.Gizmo3D.Camera;
-using gzTransform = GizmoSDK.Gizmo3D.Transform;
-using gzTexture = GizmoSDK.Gizmo3D.Texture;
-
-
-// Map utility
-using Saab.Foundation.Map;
-using Saab.Unity.Extensions;
-using Saab.Utility.Unity.NodeUtils;
-using Saab.Utility.GfxCaps;
-
-// Fix unity conflicts
-using unTransform = UnityEngine.Transform;
-
-// System
-using System.Collections.Generic;
-using System;
-using System.Collections;
-using UnityEngine.Networking;
-using System.Linq;
-
-using ProfilerMarker = global::Unity.Profiling.ProfilerMarker;
-using ProfilerCategory = global::Unity.Profiling.ProfilerCategory;
-
-namespace Saab.Foundation.Unity.MapStreamer
-{
-    // The SceneManager behaviour takes a unity camera and follows that to populate the current scene with GameObjects in a scenegraph hierarchy
-
-    public interface ISceneManagerCamera
-    {
-        UnityEngine.Camera Camera { get; }
-        Vec3D GlobalPosition { get; set; }           // Position in Global coordinate system
-
-        Vector3 Up { get; }                         // Get up vector in global coordinate system for current position
-        Vector3 North { get; }                      // Get north vector in global coordinate system for current position
-
-        void PreTraverse(bool locked);              // Executed before scene is traversed and updated with new transform and new geometry
-
-        void PostTraverse(bool locked);             // Executed after nodes are repositioned with new transforms and correct activations
-
-        double UpdateCamera(double renderTime);     // Executed just before camera transform is used. Update you cam animation in this
-
-        void MapChanged();                          // Executed when map is changed
-
-        float LodFactor { get; }                    // Current lod factor
-    }
-
-    /// <summary>
-    /// Options for configuring SceneManager runtime behaviour
-    /// </summary>
-    [Flags]
-    public enum SceneManagerOptions
-    {
-        None = 0,
-
-        /// <summary>
-        /// Render during component update, disable to manually control when render is performed
-        /// </summary>
-        RenderInUpdate = 1 << 0,
-        
-        /// <summary>
-        /// Skip asset loading and ignore RefNodes
-        /// </summary>
-        DisableInstancing = 1 << 1,
-
-        LazyLoadAssets = 1 << 2,
-    }
-
-    /// <summary>
-    /// Flags used during traversal to keep track of state
-    /// </summary>
-    [Flags]
-    public enum TraversalState
-    {
-        None,
-        /// <summary>
-        /// Set when traversing an asset subgraph i.e. /Resources
-        /// </summary>
-        Asset = 0x01,
-
-        /// <summary>
-        /// Set when traversing a gzRefNode subgraph
-        /// </summary>
-        AssetInstance = 0x02,
-    }
-
-
-    [Serializable]
-    public struct SceneManagerSettings
-    {
-        public double   MaxBuildTime;                       // Max time to spend in frame to build objects
-        public double   MinBuildTime;                       // Min time to spend in frame to build objects
-        public byte     DynamicLoaders;
-        public IntersectMaskValue IntersectMask;
-        public SceneManagerOptions Options;
-
-        public static readonly SceneManagerSettings Default = new SceneManagerSettings
-        {
-            MaxBuildTime = 0.012,       // 12ms
-            MinBuildTime = 0.004,       // 4ms == 16 ms, 60fps
-            DynamicLoaders = 4,
-            IntersectMask = IntersectMaskValue.ALL,
-            Options = SceneManagerOptions.RenderInUpdate,
-        };
-    }
-
-
-    public class SceneManager : MonoBehaviour
-    {
-        public SceneManagerSettings Settings = SceneManagerSettings.Default;
-        public ISceneManagerCamera  SceneManagerCamera;
-        public string               MapUrl;
-        public NodeBuilderBase[] Builders;
-
-        // Events ----------------------------------------------------------
-
-        public delegate void EventHandler_OnGameObject(GameObject o, bool isAsset);
-        public delegate void EventHandler_OnGameObjectFree(GameObject o);
-        public delegate void EventHandler_OnNode(Node node);
-        public delegate void EventHandler_OnUpdateCamera(double renderTime);
-        public delegate void EventHandler_OnMapLoadError(ref string url,string errorString,SerializeAdapter.AdapterError errorType,ref bool retry);
-
-        // Notifications for external users that wants to add components to created game objects. Be swift as we are in edit lock
-
-        public event EventHandler_OnGameObject      OnNewTerrain;       // GameObject with mesh (feature == Terrain)
-        public event EventHandler_OnGameObject      OnNewGeometry;      // GameObject with mesh (feature == Static Mesh)
-        public event EventHandler_OnGameObject      OnNewCrossboard;    // CrossBoard/tree placement 
-        public event EventHandler_OnGameObject      OnNewLod;           // GameObject that toggles on off dep on distance
-        public event EventHandler_OnGameObject      OnNewLoader;        // GameObject that works like a dynamic loader
-        public event EventHandler_OnGameObjectFree  OnEnterPool;        // Moving GO to pool
-        public event EventHandler_OnGameObjectFree  OnRemoveGeometry;   // Removing GO from Scene
-        public event EventHandler_OnGameObjectFree  OnRemoveTerrain;   // Removing GO from Scene
-
-        public delegate void EventHandler_Traverse(bool locked);    // Pre and Post traversal in locked or unlocked mode (edit)
-
-        public event EventHandler_Traverse          OnPreTraverse;  // Called before SceneManagerCamera is updated
-        public event EventHandler_Traverse          OnPostTraverse; // Called after SceneManagerCamera is updated
-        public event EventHandler_OnNode            OnMapChanged;
-        public event EventHandler_OnMapLoadError    OnMapLoadError;
-        public event EventHandler_OnUpdateCamera    OnUpdateCamera; // Called after SceneManagerCamera is updated
-
-        #region ------------- Privates ----------------
-
-        private Scene _native_scene;
-        private gzCamera _native_camera;
-        private Context _native_context;
-        private CullTraverseAction _native_traverse_action;
-        private GameObject _root;
-
-        private NodeAction _actionReceiver;
-
-        private readonly string ID = "Saab.Foundation.Unity.MapStreamer.SceneManager";
-
-        //#pragma warning disable 414
-        //private UnityPluginInitializer _plugin_initializer;
-        //#pragma warning restore 414
-
-        #endregion
-
-
-        private static readonly ProfilerMarker _profilerMarkerRender = new ProfilerMarker(ProfilerCategory.Render, "SM-Render");
-        private static readonly ProfilerMarker _profilerMarkerCull = new ProfilerMarker(ProfilerCategory.Render, "SM-Cull");
-        private static readonly ProfilerMarker _profilerMarkerTraverse = new ProfilerMarker(ProfilerCategory.Render, "SM-Traverse");
-        private static readonly ProfilerMarker _profilerFree = new ProfilerMarker(ProfilerCategory.Render, "SM-Free");
-
-
-        struct NodeLoadInfo
-        {
-            public NodeLoadInfo(DynamicLoadingState _state, DynamicLoader _loader, Node _node)
-            {
-                state = _state;
-                loader = _loader;
-                node = _node;
-            }
-
-            public DynamicLoadingState state;
-            public DynamicLoader loader;
-            public Node node;
-
-        };
-
-        // The activation struct carries information about the state of a native node (loaded/unloaded)
-        struct ActivationInfo
-        {
-            public ActivationInfo(NodeActionEvent _state, Node _node)
-            {
-                state = _state;
-                node = _node;
-            }
-
-            public NodeActionEvent state;
-            public Node node;
-        };
-
-        
-        // AssetLoadInfo carries info about loading an asset
-        struct AssetLoadInfo
-        {
-            public AssetLoadInfo(GameObject _parent, string _res_url, string _obj_id)
-            {
-                parent = _parent;
-                resource_url = _res_url;
-                object_id = _obj_id;
-            }
-
-            public GameObject parent;
-            public string resource_url;
-            public string object_id;
-        };
-
-        // stores information for a pending build job
-        struct BuildInfo
-        {
-            public INodeBuilder Builder;
-            public NodeHandle NodeHandle;
-            public NodeHandle ActiveStateNode;
-            public byte Version;
-        }
-
-        private bool _initialized;
-
-        // A queue for new pending loads/unloads
-        private readonly List<NodeLoadInfo> pendingLoaders = new List<NodeLoadInfo>(100);
-        private readonly Dictionary<IntPtr,NodeLoadInfo> activePendingLoaders = new Dictionary<IntPtr, NodeLoadInfo>();
-
-        // A queue for pending activations/deactivations
-        private readonly List<ActivationInfo> pendingActivations = new List<ActivationInfo>(100);
-  
-        // A queue for post build work
-        private readonly Queue<BuildInfo> pendingBuilds = new Queue<BuildInfo>(1000);
-
-        // A queue for AssetLoading
-        private readonly Stack<AssetLoadInfo> pendingAssetLoads = new Stack<AssetLoadInfo>(100);
-
-        // The current active asset bundles
-        private readonly Dictionary<string, AssetBundle> currentAssetBundles = new Dictionary<string, AssetBundle>();
-
-        // Linked List for nodes that needs updates on update
-        private readonly LinkedList<GameObject> updateNodeObjects = new LinkedList<GameObject>();
-        
-        // List of all registered builds, builders must currently be registered before initialize
-        private readonly List<INodeBuilder> _builders = new List<INodeBuilder>();
-
-        // Used during lazy asset loading to defer the traversal of shared assets until first use
-        private readonly Dictionary<uint, AssetTraversalFuture> _deferredAssetLoads = new Dictionary<uint, AssetTraversalFuture>();
-
-        // special dedicated builder used when instancing gzRefNodes
-        private readonly AssetInstanceBuilder _assetInstanceBuilder = new AssetInstanceBuilder();
-
-        // Used by builders to share and manage texture resources
-        private readonly TextureManager _textureManager = new TextureManager();
-
-        // Used by builders to share and manage Material resources
-        private readonly MaterialManager _materialManager = new MaterialManager();
-
-        // Pools of pre allocated and recycled node objects, used to avoid runtime allocations and instead recycle game objects
-        private readonly Stack<NodeHandle>[] _free = new Stack<NodeHandle>[byte.MaxValue];
-
-        // Prefab when allocating node handles for specific pools
-        private readonly NodeHandle[] _poolPrefabs = new NodeHandle[byte.MaxValue];
-
-        // Stores objects that have been unloaded but not yet freed, objects will eventually be returned to the free list,
-        // this is to reduce the time spent freeing nodes in a single frame
-        private readonly Stack<unTransform> _pendingFrees = new Stack<unTransform>();
-
-        // Used during pre allocation to spread allocations evenly across pools
-        private readonly Queue<byte> _preAllocationRoundRobinQueue = new Queue<byte>();
-
-        // Stores traversal state data during a traversal pass, passed by reference to reduce parameter passing
-        private struct TraversalStateData
-        {
-            public NodeHandle NodeHandle;
-            public NodeHandle ActiveStateNode;
-            public TraversalState TraversalStateFlags;
-            public IntersectMaskValue IntersectMask;
-        }
-
-        // stores traversal information to allow continutation of a traversal at a later time, currently used for lazy load
-        private struct AssetTraversalFuture
-        {
-            public Node AssetNode;
-            public TraversalStateData TraversalState;
-        }
-
-        public void AddBuilder(INodeBuilder builder)
-        {
-            if (_initialized)
-                throw new InvalidOperationException("builders must be registered before init");
-            
-            _builders.Add(builder);
-        }
-
-        public void RemoveBuilder(INodeBuilder builder)
-        {
-            _builders.Remove(builder);
-        }
-
-        private INodeBuilder GetBuilderForNode(Node node, in TraversalStateData data)
-        {
-            // performance critical, do not change to foreach
-            for (var i = 0; i < _builders.Count; ++i)
-            {
-                var builder = _builders[i];
-
-                if (!builder.CanBuild(node, data.TraversalStateFlags, data.IntersectMask))
-                    continue;
-
-                return builder;
-            }
-
-            return null;
-        }
-
-        private void BuildNode(INodeBuilder builder, in TraversalStateData data)
-        {
-            var priority = builder.Priority;
-            
-            // force immediate mode during asset phase (we might change this later, but for now it makes life simpler)
-            //if ((data.TraversalStateFlags & TraversalState.Asset) == TraversalState.Asset)
-            //    priority = BuildPriority.Immediate;
-
-            switch (priority)
-            {
-                case BuildPriority.Immediate:
-                    if (builder.Build(data.NodeHandle, data.ActiveStateNode))
-                        data.NodeHandle.builder = builder;
-                    break;
-                case BuildPriority.Low:
-
-                    // defer the build so that we can distribute the build process across multiple frames
-                    pendingBuilds.Enqueue(new BuildInfo()
-                    {
-                        Builder = builder,
-                        NodeHandle = data.NodeHandle,
-                        ActiveStateNode = data.ActiveStateNode,
-                        // when a node is recycled, the version is increased, we store the current version so that
-                        // we can detect if the node has already been removed when scheduled for build
-                        Version = data.NodeHandle.version,
-                    });
-                    break;
-                default:
-                    throw new NotImplementedException();
-            }
-        }
-
-        private static void ProcessTransform(gzTransform node, unTransform transform)
-        {
-            // Check if transform is Active and not unit (1)
-            if (!node.IsActive())
-                return;
-
-            // todo (opt): GetTransform(out matrix, out active) to reduce P/INVOKE calls by 50%
-            node.GetTransform(out Matrix4 mat4);
-
-            transform.localPosition = mat4.Translation().ToVector3();
-            transform.localScale = mat4.Scale().ToVector3();
-            transform.localRotation = mat4.Quaternion().ToQuaternion();
-        }
-
-        private void ProcessDynamicLoader(DynamicLoader node, in TraversalStateData data)
-        {
-            // earlier impl allowed this and would return the registered node, this seems wrong but I should verify this with AMO
-            System.Diagnostics.Debug.Assert(!NodeUtils.HasGameObjectsUnsafe(node.GetNativeReference()));
-
-            //// Possibly we can add action interfaces for dyn load childs as they will get traversable if they have node actons
-            //if (NodeUtils.FindGameObjectsUnsafe(node.GetNativeReference(), out List<GameObject> list))
-            //{
-            //    return list[0];
-            //}
-            
-            // Add to registry
-            NodeUtils.AddGameObjectReferenceUnsafe(node.GetNativeReference(), data.NodeHandle.gameObject);
-            data.NodeHandle.inNodeUtilsRegistry = true;
-
-            OnNewLoader?.Invoke(data.NodeHandle.gameObject, false);
-
-            // gzDynamicLoader is gzGroup
-            // ProcessGroup(node, in data, false);
-        }
-
-        private void ProcessLod(Lod node, in TraversalStateData data)
-        {
-            // gzLod is gzGroup
-            ProcessGroup(node, in data, true);
-
-            OnNewLod?.Invoke(data.NodeHandle.gameObject, data.TraversalStateFlags.HasFlag(TraversalState.Asset));
-        }
-
-        private void ProcessRoi(Roi node, in TraversalStateData data)
-        {
-            RegisterNodeForUpdate(data.NodeHandle);
-
-            // gzRoi is gzTransform
-            ProcessTransform(node, data.NodeHandle.transform);
-
-            // gzRoi is gzGroup
-            ProcessGroup(node, in data, true);
-        }
-
-        private void ProcessRoiNode(RoiNode node, in TraversalStateData data)
-        {
-            RegisterNodeForUpdate(data.NodeHandle);
-
-            // gzRoiNode is gzTransform
-            ProcessTransform(node, data.NodeHandle.transform);
-            
-            // gzRoiNode is gzGroup
-            ProcessGroup(node, in data, false);
-        }
-
-        private void RegisterNodeForUpdate(NodeHandle nodeHandle)
-        {
-            nodeHandle.updateTransform = true;
-            nodeHandle.inNodeUpdateList = true;
-            updateNodeObjects.AddLast(nodeHandle.gameObject);
-        }
-
-        private GameObject ProcessRefNode(RefNode refNode, in TraversalStateData data)
-        {
-            // mostly for debug purposes, will allow us to skip asset instancing
-            if (Settings.Options.HasFlag(SceneManagerOptions.DisableInstancing))
-                return null;
-
-            // copy the state so that we can write to it
-            TraversalStateData state = data;
-
-            // we dont expect RefNodes when traversing asset subtree or during instancing (i.e. nested assets)
-            System.Diagnostics.Debug.Assert(!state.TraversalStateFlags.HasFlag(TraversalState.Asset));
-            System.Diagnostics.Debug.Assert(!state.TraversalStateFlags.HasFlag(TraversalState.AssetInstance));
-
-            if (Settings.Options.HasFlag(SceneManagerOptions.LazyLoadAssets))
-            {
-                if (_deferredAssetLoads.TryGetValue(refNode.ReferenceNodeID, out AssetTraversalFuture assetTraverseFuture))
-                {
-                    _deferredAssetLoads.Remove(refNode.ReferenceNodeID);
-
-                    var assetState = assetTraverseFuture.TraversalState;
-                    var asset = TraverseInternal(assetTraverseFuture.AssetNode, ref assetState);
-                    asset.transform.SetParent(assetTraverseFuture.TraversalState.NodeHandle.transform);
-                }
-            }
-
-            // instruct native side to construct the instance
-            refNode.AttachNode();
-
-            // create a node handle for the ref node instance
-            state.NodeHandle = CreateNodeHandle(refNode, PoolObjectFeature.None);
-
-            // continue traversal with the instance flag set
-            state.TraversalStateFlags |= TraversalState.AssetInstance;
-
-            // traverse down the subgraph
-            ProcessGroup(refNode, in state, false);
-
-            // return the created gameobject for this instance
-            return state.NodeHandle.gameObject;
-        }
-
-        private GameObject ProcessGeometry(Geometry geo, in TraversalStateData data)
-        {
-            TraversalStateData state = data;
-
-            bool isAssetInstance = (data.TraversalStateFlags & TraversalState.AssetInstance) == TraversalState.AssetInstance;
-            if (isAssetInstance)
-            {
-                // allocate node handle from the mesh pool and set node handle instance flag
-                state.NodeHandle = CreateNodeHandle(geo, PoolObjectFeature.StaticMesh);
-                state.NodeHandle.stateFlags |= NodeStateFlags.AssetInstance;
-
-                // build the geometry using the instance builder that will share mesh/material from prefab asset
-                BuildNode(_assetInstanceBuilder, state);
-            }
-            else
-            {
-                // find a builder for this type of geometry object
-                var builder = GetBuilderForNode(geo, in state);
-                if (builder != null)
-                {
-                    // allocate node handle using the builders pool
-                    state.NodeHandle = CreateNodeHandle(geo, builder.Feature);
-
-                    // check for individual state on the geometry node
-                    if (geo.HasState())
-                        state.ActiveStateNode = state.NodeHandle;
-
-                    // build the geometry, this can either be deferred or immediate
-                    BuildNode(builder, state);
-                }
-                else
-                {
-                    // we didnt find a geometry builder for this node, simply create an empty placeholder node
-                    state.NodeHandle = CreateNodeHandle(geo, PoolObjectFeature.None);
-                }
-
-                // if we are currently building an asset prefab, register this node so that the asset builder can
-                // use mesh/material when creating new instances
-                if ((state.TraversalStateFlags & TraversalState.Asset) == TraversalState.Asset)
-                    _assetInstanceBuilder.AddAssetPrefab(geo, state.NodeHandle);
-            }
-
-            // notify external systems about the new geometry node
-            switch (state.NodeHandle.featureKey)
-            {
-                case PoolObjectFeature.Terrain:
-                    OnNewTerrain?.Invoke(state.NodeHandle.gameObject, state.TraversalStateFlags.HasFlag(TraversalState.Asset));
-                    break;
-                case PoolObjectFeature.StaticMesh:
-                    OnNewGeometry?.Invoke(state.NodeHandle.gameObject, state.TraversalStateFlags.HasFlag(TraversalState.Asset));
-                    break;
-                default:
-                    break;
-            }
-            
-            
-
-            return state.NodeHandle.gameObject;
-        }
-
-        private GameObject ProcessCrossboard(Crossboard crossboard, in TraversalStateData data)
-        {
-            OnNewCrossboard?.Invoke(data.NodeHandle.gameObject, data.TraversalStateFlags.HasFlag(TraversalState.Asset));
-            return null;
-        }
-
-        // Process and connect a node hierarchy to a GameObject hierarchy
-        private void ProcessGroup(Group node, in TraversalStateData data, bool addActionInterfaces = false)
-        {
-            var parent = data.NodeHandle.transform;
-
-            TraversalStateData state;
-
-            // use addActionInterface if we shall be able to enable/disable part of the tree using action callbacks
-            if (addActionInterfaces)        
-            {
-                foreach (var child in node)
-                {
-                    state = data;
-                    var gameObject = TraverseInternal(child, ref state);
-
-                    if (gameObject == null)
-                        continue;
-
-                    var childNodeHandle = gameObject.GetComponent<NodeHandle>();
-
-                    var childPtr = child.GetNativeReference();
-                    if (!NodeUtils.HasGameObjectsUnsafe(childPtr))
-                    {
-                        NodeUtils.AddGameObjectReferenceUnsafe(childPtr, gameObject);
-
-                        childNodeHandle.inNodeUtilsRegistry = true;
-                        child.AddActionInterface(_actionReceiver, NodeActionEvent.IS_TRAVERSABLE); 
-                        child.AddActionInterface(_actionReceiver, NodeActionEvent.IS_NOT_TRAVERSABLE);
-                    }
-
-                    gameObject.transform.SetParent(parent, false);
-                }
-                
-                return;
-            }
-
-            foreach (var child in node)
-            {
-                state = data;
-                var gameObject = TraverseInternal(child, ref state);
-
-                if (gameObject == null)
-                    continue;
-
-                gameObject.transform.SetParent(parent, false);
-            }
-        }
-
-        private NodeHandle CreateNodeHandle(Node node, PoolObjectFeature feature)
-        {
-            var nodeHandle = Allocate(feature, node);
-            // we only use the name inside editor to avoid allocations in runtime
-#if UNITY_EDITOR
-            nodeHandle.name = node.Name;
-            
-            if (string.IsNullOrEmpty(nodeHandle.name))
-                nodeHandle.name = node.GetType().Name;
-#endif
-            return nodeHandle;
-        }
-
-        private GameObject BeginTraverse(Node node,bool dynloaded=false)
-        {
-            System.Diagnostics.Debug.Assert(node != null && node.IsValid());
-
-            // We must be called in edit lock
-
-            // if dynloaded we should add actions for traverse here as we can be toggled on/off by loader (fancier look)
-
-            var data = new TraversalStateData()
-            {
-                IntersectMask = node.IntersectMask,
-            };
-
-            return TraverseInternal(node, ref data);
-        }
-
-        private GameObject TraverseInternal(Node node, ref TraversalStateData data)
-        {
-            var nodeMask = node.IntersectMask;
-
-            // make sure asset resource nodes does not zero the mask since we rely on it when selecting builders
-            if (nodeMask != IntersectMaskValue.NOTHING)
-                data.IntersectMask &= nodeMask;
-
-            // mostly for debug purposes, will limit what type of node we traverse
-            // (would be much better if this type of culling was a setting on gzCamera so that we didnt even consider the objects)
-            if ((data.IntersectMask & Settings.IntersectMask) == IntersectMaskValue.NOTHING)
-                return null;
-
-            // Check for asset top node
-            if ((data.TraversalStateFlags & (TraversalState.Asset | TraversalState.AssetInstance)) == TraversalState.None
-                && node.HasNodeID())
-            {
-                // mostly for debug purposes, will allow us to skip asset loading
-                if (Settings.Options.HasFlag(SceneManagerOptions.DisableInstancing))
-                    return null;
-
-                // we do not expect RefNodes during asset traversal
-                Debug.Assert(!data.TraversalStateFlags.HasFlag(TraversalState.AssetInstance));
-
-                // Set instancing copy flags so that we share mesh and material between instances
-                node.CopyMode = (CopyMode)(CopyModeNode.SHARE_GEOMETRY | CopyModeNode.SHARE_STATE | CopyModeNode.SHARE_TEXTURE);
-
-                // continue traversal with the asset flag set
-                data.TraversalStateFlags |= TraversalState.Asset;
-
-                if (Settings.Options.HasFlag(SceneManagerOptions.LazyLoadAssets))
-                {
-                    // only we dont, we delay this traversal until a refnode references us
-                    _deferredAssetLoads.Add(node.NodeID, new AssetTraversalFuture()
-                    {
-                        AssetNode = node,
-                        TraversalState = data,
-                    });
-
-                    return null;
-                }
-            }
-
-            // --------------------------- Add game object ---------------------------------------
-
-            // builder nodes
-            switch (node)
-            {
-                case RefNode refNode:
-                    return ProcessRefNode(refNode, in data);
-                case Geometry geom:
-                    return ProcessGeometry(geom, in data);
-                case Crossboard crossboard:
-                    return ProcessCrossboard(crossboard, in data);
-                default:
-                    break;
-            }
-
-            data.NodeHandle = CreateNodeHandle(node, PoolObjectFeature.None);
-
-            if (node.HasState())
-                data.ActiveStateNode = data.NodeHandle;
-
-            var activeGo = data.NodeHandle.gameObject;
-
-            // -------------- Check if asset objects --------------------------------------------
-            if (node.CullMask == CullMaskValue.ALL)     // Not redered or intersected
-            {
-                activeGo.SetActive(false);            // Lets deactivate the object but build it as ordinary
-            }
-
-            switch (node)
-            {
-                case Roi roi:
-                    ProcessRoi(roi, in data);
-                    break;
-                case RoiNode roiNode:
-                    ProcessRoiNode(roiNode, in data);
-                    break;
-                case gzTransform tr:
-                    ProcessTransform(tr, activeGo.transform);
-                    ProcessGroup(tr, in data, false);
-                    break;
-                case DynamicLoader dl:
-                    ProcessDynamicLoader(dl, in data);
-                    break;
-                case Lod ld:
-                    ProcessLod(ld, in data);
-                    break;
-                case Group group:
-                    ProcessGroup(group, in data, false);
-                    break;
-                case ExtRef extRef:
-                    var info = new AssetLoadInfo(activeGo, extRef.ResourceURL, extRef.ObjectID);
-                    pendingAssetLoads.Push(info);
-                    break;
-                default:
-                    break;
-            }
-
-            return activeGo;
-        }
-
-        private IEnumerator AssetLoader()
-        {
-            while (true)
-            {
-                if (pendingAssetLoads.Count > 0)
-                {
-                    AssetLoadInfo info = pendingAssetLoads.Pop();
-
-                    AssetBundle assetBundle;
-
-                    if (!currentAssetBundles.TryGetValue(info.resource_url, out assetBundle))
-                    {
-                        UnityEngine.Networking.UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(info.resource_url, 0);
-
-                        yield return request.SendWebRequest();
-
-                        assetBundle = DownloadHandlerAssetBundle.GetContent(request);
-
-                        if (assetBundle)
-                            currentAssetBundles.Add(info.resource_url, assetBundle);
-                    }
-
-                    if (assetBundle != null)
-                    {
-
-                        GameObject extRefObject = assetBundle.LoadAsset<GameObject>(info.object_id);
-
-                        if (extRefObject != null)
-                        {
-                            GameObject instance = Instantiate(extRefObject);
-
-                            if (instance != null)
-                            {
-                                instance.name = info.object_id;
-                                instance.transform.SetParent(info.parent.transform, false);
-                            }
-                        }
-                    }
-                }
-
-                yield return null;
-            }
-        }
-
-        // The LoadMap function takes an URL and loads the map into GizmoSDK native db
-        public bool LoadMap(string mapURL)
-        {
-            NodeLock.WaitLockEdit();      // We assume we do all editing from main thread and to allow render we assume we edit in edit mode
-
-            try // We are now locked in edit
-            {
-
-                if (!ResetMap())
-                    return false;
-
-                Node node = null;
-
-                while (true)
-                {
-                    if (string.IsNullOrEmpty(mapURL))
-                        break;
-
-                    string errorString = "";
-                    SerializeAdapter.AdapterError errorType = SerializeAdapter.AdapterError.NO_ERROR;
-                    bool retry = false;
-
-                    node = DbManager.LoadDB(mapURL, ref errorString, ref errorType);
-
-                    if (node == null || !node.IsValid())
-                    {
-                        Message.Send(ID, MessageLevel.WARNING, $"Failed to load map {mapURL}");
-
-                        OnMapLoadError?.Invoke(ref mapURL, errorString, errorType, ref retry);
-
-                        if (retry)
-                            continue;
-
-                        return false;
-                    }
-
-                    break;
-                }
-
-                MapUrl = mapURL;
-
-                MapControl.SystemMap.NodeURL = mapURL;
-                MapControl.SystemMap.CurrentMap = node;
-
-                
-
-                if (node != null)
-                {
-                    _native_scene.AddNode(MapControl.SystemMap.CurrentMap);
-#if DEBUG
-                    _native_scene.Debug();
-#endif
-
-                    _root = new GameObject("root");
-                    GameObject scene = BeginTraverse(MapControl.SystemMap.CurrentMap);
-
-                    if (scene != null)
-                        scene.transform.SetParent(_root.transform, false);
-
-                    // As GizmoSDK has a flipped Z axis going out of the screen we need a top transform to flip Z
-                    _root.transform.localScale = new Vector3(1, 1, -1);
-                }
-                
-                
-
-                //// Add example object under ROI --------------------------------------------------------------
-
-                //MapPos mapPos;
-
-                //GetMapPosition(new LatPos(1.0084718541, 0.24984267815, 300), out mapPos, GroundClampType.GROUND, true);
-
-                //_test = GameObject.CreatePrimitive(PrimitiveType.Sphere);
-
-                //_test.transform.parent = FindFirstGameObjectTransform(mapPos.roiNode);
-                //_test.transform.localPosition = mapPos.position.ToVector3();
-                //_test.transform.localScale = new Vector3(10, 10, 10);
-
-                if (SceneManagerCamera != null)
-                    SceneManagerCamera.MapChanged();
-
-                OnMapChanged?.Invoke(node);
-            }
-            finally
-            {
-                NodeLock.UnLock();
-            }
-
-            return true;
-        }
-
-        public bool ResetMap()
-        {
-            //MapUrl = null;
-
-            NodeLock.WaitLockEdit();
-
-            try // We are now locked in edit
-            {
-
-                foreach (var p in pendingLoaders)
-                {
-                    p.loader?.Dispose();
-                    p.node?.Dispose();
-                }
-
-                pendingLoaders.Clear();
-                activePendingLoaders.Clear();
-
-                foreach (var p in pendingActivations)
-                {
-                    p.node?.Dispose();
-                }
-
-                pendingActivations.Clear();
-
-                // allow builders to perform custom clean up
-                foreach (var builder in _builders)
-                    builder.Reset();
-
-                _assetInstanceBuilder.Reset();
-
-                if (_root)
-                {
-                    UnloadHierarchy(_root.transform);
-                    Free(_root.transform);
-                    FreeFromPendingQueue(int.MaxValue);
-                    _root = null;
-                }
-
-                _native_scene?.RemoveAllNodes();
-
-                _textureManager.Clear();
-                _materialManager.Clear();
-
-                // clear all pending asset loads
-                _deferredAssetLoads.Clear();
-
-                // clear any pending builds
-                pendingBuilds.Clear();
-
-                MapControl.SystemMap.Reset();
-            }
-            finally
-            {
-                NodeLock.UnLock();
-            }
-
-            return true;
-        }
-
-        private void AddDefaultBuilders()
-        {
-            // initialize node builders
-            foreach (var builder in Builders)
-                _builders.Add(builder);
-
-            if (_builders.Count == 0)
-                Message.Send("SceneManager", MessageLevel.WARNING, "no node builder registered");
-            
-
-            // ************* [Deprecated] *************
-            //if (GfxCaps.CurrentCaps.HasFlag(Capability.UseTreeCrossboards))
-            //AddBuilder(new CrossboardNodeBuilder(Settings.CrossboardShader, Settings.ComputeShader));
-        }
-
-
-        public bool InitializeInternal()        
-        {
-            // Initialize streamer APIs
-            if (!GizmoSDK.Gizmo3D.Platform.Initialize())
-                return false;
-
-            // Initialize formats
-            DbManager.Initialize();
-
-            GizmoSDK.GizmoBase.Message.Send("SceneManager", MessageLevel.DEBUG, "Initialize Graph Streaming");
-
-            // Add builder for registered types
-            AddDefaultBuilders();
-
-            // init object pooling
-            _free[(byte)PoolObjectFeature.None] = new Stack<NodeHandle>(65000);
-            
-            // init allocator prefab for logical objects
-            _poolPrefabs[0] = CreateAllocatorPrefabForBuilder(null);
-
-            foreach (var builder in _builders)
-            {
-                var idx = (byte)builder.Feature;
-                if (_free[idx] == null)
-                {
-                    _free[idx] = new Stack<NodeHandle>(65000);
-                    _poolPrefabs[idx] = CreateAllocatorPrefabForBuilder(builder);
-                }
-
-                builder.SetTextureManager(_textureManager);
-                builder.SetMaterialManager(_materialManager);
-            }
-
-            var pools = _free.Where(p => p != null).ToArray();
-            foreach (byte poolId in pools.Select(p => (byte)Array.IndexOf(_free, p)))
-                _preAllocationRoundRobinQueue.Enqueue(poolId);
-
-            if (_poolPrefabs[(int)PoolObjectFeature.StaticMesh] == null)
-            {
-                Settings.Options |= SceneManagerOptions.DisableInstancing;
-                Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "disabling instancing, no builder for StaticMesh feature");
-            }
-
-        
-
-
-            // Setup internal subscription events
-            _actionReceiver = new NodeAction("DynamicLoadManager");
-            _actionReceiver.OnAction += ActionReceiver_OnAction;
-
-            DynamicLoader.OnDynamicLoad += DynamicLoader_OnDynamicLoad;
-
-            
-            NodeLock.WaitLockEdit();
-
-            try // We are now locked in edit
-            {
-                // Camera setup
-                _native_camera = new PerspCamera("Test");
-                _native_camera.RoiPosition = true;
-                MapControl.SystemMap.Camera = _native_camera;
-
-                // Top scene
-                _native_scene = new Scene("Scene");
-                _native_camera.Scene = _native_scene;
-
-                // Top context
-                _native_context = new Context();
-
-#if DEBUG_CAMERA
-
-                // If we want to visualize debug 3D
-                _native_camera.Debug(_native_context);      // Enable to debug view
-
-#endif // DEBUG_CAMERA
-
-                // Default travrser
-                _native_traverse_action = new CullTraverseAction();
-
-                // _native_traverse_action.SetOmniTraverser(true);  // To skip camera cull and use LOD in omni directions
-
-
-            }
-            finally
-            {
-
-                NodeLock.UnLock();
-            }
-
-            // Set up dynamic loading
-            DynamicLoader.UsePreCache(true);                    // Enable use of mipmap creation on dynamic loading
-            DynamicLoaderManager.SetNumberOfActiveLoaders(Settings.DynamicLoaders);   // Lets start with 4 parallell threads
-            DynamicLoaderManager.StartManager();
-
-            // Start coroutines for asset loading
-            StartCoroutine(AssetLoader());
-
-            return true;
-        }
-
-        private NodeHandle CreateAllocatorPrefabForBuilder(INodeBuilder builder)
-        {
-            var feature = builder != null ? builder.Feature : PoolObjectFeature.None;
-
-            var prefab = new GameObject();
-            prefab.SetActive(false);
-#if UNITY_EDITOR
-            prefab.hideFlags = HideFlags.HideInHierarchy;
-#endif
-            var nh = prefab.AddComponent<NodeHandle>();
-            nh.featureKey = feature;
-            builder?.InitPoolObject(prefab);
-
-            return nh;
-        }
-
-        public bool Uninitialize()
-        {
-            if (!_initialized)
-                   return false;
-
-            // Stop manager
-            DynamicLoaderManager.StopManager();
-
-            ResetMap();
-
-            // Remove actions
-            DynamicLoader.OnDynamicLoad -= DynamicLoader_OnDynamicLoad;
-            _actionReceiver.OnAction -= ActionReceiver_OnAction;
-
-            NodeLock.WaitLockEdit();
-
-            try // We are now locked in edit
-            {
-
-                _native_camera.Debug(_native_context, false);
-                _native_camera.Dispose();
-                _native_camera = null;
-
-                _native_context.Dispose();
-                _native_context = null;
-
-                _native_scene.Dispose();
-                _native_scene = null;
-
-
-                _actionReceiver.Dispose();
-                _actionReceiver = null;
-
-            }
-            finally
-            {
-                NodeLock.UnLock();
-            }
-
-            // Dont do this as Unity wants to keep modules loaded
-            //// Drop platform streamer
-            //GizmoSDK.Gizmo3D.Platform.Uninitialize();
-
-            _initialized = false;
-
-            return true;
-        }
-
-        public bool Init(bool loadMap = true)
-        {
-            if (_initialized)
-                return true;
-
-            _initialized = true;
-           
-            // Initialize this manager
-            if (!InitializeInternal())
-                return false;
-
-            // Load the map
-            if (loadMap && !LoadMap(MapUrl))
-                return false;
-
-            return true;
-        }
-
-
-        private void ActionReceiver_OnAction(NodeAction sender, NodeActionEvent action, Context context, NodeActionProvider trigger, TraverseAction traverser, IntPtr userdata)
-        {
-            // Locked in edit or render (render) by caller
-
-            if ((action == NodeActionEvent.IS_TRAVERSABLE) || 
-                (action == NodeActionEvent.IS_NOT_TRAVERSABLE))
-            {
-                pendingActivations.Add(new ActivationInfo(action, trigger as Node));
-            }
-            else
-                trigger?.ReleaseNoDelete();      // We are getting ref counts on objects in scene graph and these need to be released immediately
-
-            traverser?.ReleaseNoDelete();
-            context?.ReleaseNoDelete();
-        }
-
-        private void Start()
-        {
-            Init();
-        }
-
-        private void OnEnable()
-        {
-            // important that we do not run Init() from OnEable() since that will run during AddComponent(),
-            // and in BTA we need to control when the map is loaded.
-            if (!_initialized)
-                return;
-
-            Init();
-        }
-
-        private void OnApplicationQuit()
-        {
-            Uninitialize();
-        }
-
-        private void OnDisable()
-        {
-            // We add Unitialize and shut down threads here as this routine gets called by an edit in code
-            Uninitialize();
-        }
-               
-        private void DynamicLoader_OnDynamicLoad(DynamicLoadingState state, DynamicLoader loader, Node node)
-        {
-            // Locked in edit or render (render) by caller
-
-            if (state == DynamicLoadingState.LOADED || state == DynamicLoadingState.UNLOADED)
-            {
-                if (!activePendingLoaders.ContainsKey(loader.GetNativeReference()))
-                {
-                    NodeLoadInfo info = new NodeLoadInfo(state, loader, node);
-
-                    pendingLoaders.Add(info);       // Sorted order
-                    activePendingLoaders.Add(loader.GetNativeReference(), info);    // Lookup
-                }
-                else
-                {
-                    // Balanced add/remove that will cancel traversal or delete
-
-                    for (int i = pendingLoaders.Count - 1; i >= 0; i--)
-                    {
-                        if (pendingLoaders[i].loader.GetNativeReference() == loader.GetNativeReference())
-                        {
-                            pendingLoaders.RemoveAt(i);
-                            break;
-                        }
-                    }
-
-                    // remove reference
-                    activePendingLoaders.Remove(loader.GetNativeReference());
-                }
-
-            }
-            //else if (state == DynamicLoadingState.REQUEST_LOAD || state == DynamicLoadingState.REQUEST_UNLOAD || state == DynamicLoadingState.REQUEST_LOAD_CANCEL || state == DynamicLoadingState.REQUEST_LOAD_CANCEL)
-            //{
-            //    loader?.ReleaseNoDelete();      // Same here. We are getting refs to objects in scene graph that we shouldnt release in GC
-            //    node?.ReleaseNoDelete();
-            //}
-            //else if (state == DynamicLoadingState.IN_LOADING)
-            //{
-            //    loader?.ReleaseNoDelete();      // Same here. We are getting refs to objects in scene graph that we shouldnt release in GC
-            //    node?.ReleaseNoDelete();
-            //}
-            else
-            {
-                loader?.ReleaseNoDelete();      // Same here. We are getting refs to objects in scene graph that we shouldnt release in GC
-                node?.ReleaseNoDelete();
-            }
-        }
-
-        private void ProcessPendingUpdatesPreTraversal()
-        {
-            // We must be called in edit lock
-
-            // Process changes of the scenegraph
-            _profilerMarkerTraverse.Begin();
-            ProcessPendingLoaders();
-            _profilerMarkerTraverse.End();
-        }
-
-        private void ProcessPendingUpdatesPostTraversal()
-        {
-            // We must be called in edit lock
-
-            #region Activate/Deactivate GameObjects based on scenegraph -----------------------------------------------------
-
-            ProcessPendingActivations();
-
-            #endregion
-
-            #region Update slow loading assets ------------------------------------------------------------------------------
-
-            // free up to a maximum number of nodes
-            FreeFromPendingQueue(1000);
-
-            // make sure we have available nodes in our pools
-            PreAllocateNodeHandle(10000, TimeSpan.FromMilliseconds(1));
-
-
-            var remainingBuildTime = TimeSpan.FromSeconds(Settings.MaxBuildTime) - _renderTimer.Elapsed;
-            if (remainingBuildTime < TimeSpan.FromSeconds(Settings.MinBuildTime))
-                remainingBuildTime = TimeSpan.FromSeconds(Settings.MinBuildTime);
-
-            ProcessPendingBuilders(remainingBuildTime);
-
-            #endregion
-        }
-
-        private void ProcessPendingLoaders()
-        {
-            foreach (NodeLoadInfo nodeLoadInfo in pendingLoaders)
-            {
-                if (nodeLoadInfo.state == DynamicLoadingState.LOADED)   // We got a callback from dyn loader that we were loaded or unloaded
-                {
-                    unTransform transform = NodeUtils.FindFirstGameObjectTransformUnsafe(nodeLoadInfo.loader.GetNativeReference());
-
-                    if (transform == null)              // We have been unloaded or not registered
-                        continue;
-
-                    if (transform.childCount != 0)       // We have already a child and our sub graph was loaded
-                        continue;
-
-                    // TODO: Active state node can be further up the tree and should be located and passed here
-                    GameObject go = BeginTraverse(nodeLoadInfo.node,true);       // Build sub graph as result of dynamic loader
-
-                    if (go != null)
-                        go.transform.SetParent(transform, false);               // Connect to our parent
-
-                }
-                else if (nodeLoadInfo.state == DynamicLoadingState.UNLOADED)
-                {
-                    if (NodeUtils.FindGameObjectsUnsafe(
-                        nodeLoadInfo.loader.GetNativeReference(), out List<GameObject> list))
-                    {
-                        foreach (var go in list)
-                        {
-                            var tr = go.transform;
-                            for (var i = tr.childCount - 1; i >= 0; i--)
-                            {
-                                var child = tr.GetChild(i);
-                                //We need to unload all linked go in hierarchy
-                                UnloadHierarchy(child);
-                                Free(child);
-                            }
-                        }
-                    }
-                }
-            }
-
-            pendingLoaders.Clear();         // Clear List
-            activePendingLoaders.Clear();   // Clear index
-        }
-
-        private void ProcessPendingActivations()
-        {
-            foreach (ActivationInfo activationInfo in pendingActivations)
-            {
-                List<GameObject> list;  // We need to activate the correct nodes
-
-                if (NodeUtils.FindGameObjectsUnsafe(activationInfo.node.GetNativeReference(), out list))
-                {
-                    foreach (GameObject obj in list)
-                    {
-                        if (activationInfo.state == NodeActionEvent.IS_TRAVERSABLE)
-                            obj.SetActive(true);
-                        else if (activationInfo.state == NodeActionEvent.IS_NOT_TRAVERSABLE)
-                            obj.SetActive(false);
-                    }
-                }
-                else 
-                {
-                    Message.Send(ID, MessageLevel.DEBUG, $"Got Activation {activationInfo.state} for missing node");
-                }
-            }
-
-            pendingActivations.Clear();
-        }
-
-        private void ProcessPendingBuilders(TimeSpan maxBuildTime)
-        {
-            var timer = System.Diagnostics.Stopwatch.StartNew();
-            
-            while ((pendingBuilds.Count > 0) && (timer.Elapsed < maxBuildTime))
-            {
-                var buildInfo = pendingBuilds.Dequeue();
-
-                var nodeHandle = buildInfo.NodeHandle;
-                if (buildInfo.Version != nodeHandle.version)
-                    continue;
-
-                var activeStateNode = buildInfo.ActiveStateNode;
-                if (activeStateNode != null && activeStateNode.node == null)
-                    continue;
-
-                if (buildInfo.Builder.Build(nodeHandle, activeStateNode))
-                    buildInfo.NodeHandle.builder = buildInfo.Builder;
-                else
-                {
-#if DEBUG
-                    Debug.LogError("build failed");
-#endif
-                }
-            }
-        }
-        
-        private void UpdateNodeInternals()
-        {
-            // Only called if SceneManagerCamera is not null
-            foreach (GameObject go in updateNodeObjects)
-            {
-                NodeHandle h = go.GetComponent<NodeHandle>();
-
-                h.UpdateNodeInternals();
-            }
-        }
-
-        // Update is called once per frame
-        private void Update()
-        {
-            if (Settings.Options.HasFlag(SceneManagerOptions.RenderInUpdate))
-                Render();
-        }
-
-        private readonly System.Diagnostics.Stopwatch _renderTimer = new System.Diagnostics.Stopwatch();
-
-        public void Render()
-        {
-            _renderTimer.Restart();
-
-            // Check if global world camera is present -----------------------
-            if (SceneManagerCamera == null)
-                return;
-
-            _profilerMarkerRender.Begin();
-
-            RenderInternal();
-
-            _profilerMarkerRender.End();
-            
-            // -------------------------------------------------------------
-            SceneManagerCamera.PostTraverse(false);
-            OnPostTraverse?.Invoke(false);
-        }
-
-        private void RenderInternal()
-        {
-            // Check if local unity camera is present ------------------------
-            var unityCamera = SceneManagerCamera.Camera;
-            if (unityCamera == null)
-                return;
-
-            // Check if local native camera is present ------------------------
-            if (_native_camera == null)
-                return;
-
-            // Lets try to build a scenegraph from pending changes from previous pass
-            if (!NodeLock.TryLockEdit(30))      // 30 msek allow latency of other pending editor
-            {
-                Message.Send(ID, MessageLevel.DEBUG, "Lock contention detected! NodeLock::TryLockEdit() FRAME LOST");
-
-                // We failed to refresh scene in reasonable time but we still need to issue updates;
-                SceneManagerCamera.PreTraverse(false);
-                OnPreTraverse?.Invoke(false);
-                return;
-            }
-
-            // Signal the world camera we are in pre traverse locked
-            SceneManagerCamera.PreTraverse(true);
-
-            // Signal the SM we are in pre traverse locked
-            OnPreTraverse?.Invoke(true);
-
-            // Builds a scenegraph from changes from previous frame
-            ProcessPendingUpdatesPreTraversal();
-
-            if (!NodeLock.ChangeToRenderLock())
-            {
-                NodeLock.UnLock();
-                Message.Send(ID, MessageLevel.DEBUG, "Failed to change into RenderLock");
-            }
-
-            if (!NodeLock.IsLockedRender())
-                return;
-
-
-            if (activePendingLoaders.Count > 0) // Check if we got a mismatch in updates
-            {
-                NodeLock.UnLock(); // Unlock render
-                Message.Send(ID, MessageLevel.FATAL, "Mismatch in virtual context (loaded/unloaded data)");
-                return;
-            }
-
-            // We are now locked in Render
-            _profilerMarkerCull.Begin();
-            RenderInternal(unityCamera);
-            _profilerMarkerCull.End();
-
-            if (!NodeLock.ChangeToEditLock())
-            {
-                NodeLock.UnLock();
-                Message.Send(ID, MessageLevel.DEBUG, "Failed to change into EditLock");
-            }
-
-            if (!NodeLock.IsLockedByMe())
-                return;
-
-            // Builds a scenegraph from changes from previous frame
-            ProcessPendingUpdatesPostTraversal();
-
-            NodeLock.UnLock();
-
-            // Unlocked updates
-            UpdateNodeInternals();
-        }
-
-        private void RenderInternal(UnityEngine.Camera UnityCamera)
-        {
-            // We are now locked in Render
-
-            // Setup LOD
-
-            // lod bias
-            var lodFactor = SceneManagerCamera.LodFactor;
-            Lod.SetLODFactor(_native_context, lodFactor);
-            MapControl.SystemMap.LodFactor = lodFactor;
-
-            // Transfer camera parameters
-
-            PerspCamera perspCamera = _native_camera as PerspCamera;
-
-            // Right now we use system time as render time but this can be controlled externally in the future
-            var renderTime = GizmoSDK.GizmoBase.Time.SystemSeconds;
-
-            // Syncronized update. You should use the rendertime
-            renderTime = SceneManagerCamera.UpdateCamera(renderTime);
-            OnUpdateCamera?.Invoke(renderTime);
-
-            // Use this time in render
-            _native_context.CurrentRenderTime = renderTime;
-
-            if (perspCamera != null)
-            {
-                perspCamera.VerticalFOV = UnityCamera.fieldOfView;
-                perspCamera.HorizontalFOV = 2 * Mathf.Atan(Mathf.Tan(UnityCamera.fieldOfView * Mathf.Deg2Rad / 2) * UnityCamera.aspect) * Mathf.Rad2Deg; ;
-                perspCamera.NearClipPlane = UnityCamera.nearClipPlane;
-                perspCamera.FarClipPlane = UnityCamera.farClipPlane;
-            }
-
-            Matrix4x4 unity_camera_transform = UnityCamera.transform.worldToLocalMatrix;
-
-            _native_camera.Transform = unity_camera_transform.ToZFlippedMatrix4();
-
-            _native_camera.Position = SceneManagerCamera.GlobalPosition;
-
-            _native_camera.Render(_native_context, 1000, 1000, 1000, _native_traverse_action);
-
-#if DEBUG_CAMERA
-                     _native_camera.DebugRefresh();
-#endif
-        }
-
-        private NodeHandle Allocate(PoolObjectFeature featureKey, Node node)
-        {
-            var idx = (byte)featureKey;
-            var pool = _free[idx];               
-
-            if (pool.Count == 0)
-                FreeFromPendingQueue(100);
-            
-            if (pool.Count > 0)
-            {
-                var res = pool.Pop();
-                res.node = node;
-
-                // init
-                res.gameObject.SetActive(true);             // <-- stupid slow
-#if UNITY_EDITOR
-                res.gameObject.hideFlags = HideFlags.None;
-#endif
-
-                return res;
-            }
-
-            var nh = Instantiate(_poolPrefabs[idx]);
-            nh.node = node;
-            nh.gameObject.SetActive(true);
-            return nh;
-        }
-
-        private void Free(unTransform transform)
-        {
-            transform.parent = null;
-            transform.gameObject.SetActive(false);
-#if UNITY_EDITOR
-            transform.hideFlags = HideFlags.HideInHierarchy;
-#endif
-            
-            _pendingFrees.Push(transform);
-        }
-
-        private void UnloadHierarchy(unTransform transform)
-        {
-            if (transform.TryGetComponent<NodeHandle>(out var nodeHandle))
-            {
-                // remove from update list
-                if (nodeHandle.inNodeUpdateList)
-                    updateNodeObjects.Remove(transform.gameObject);
-
-                // remove from registry
-                if (nodeHandle.inNodeUtilsRegistry)
-                    NodeUtils.RemoveGameObjectReferenceUnsafe(nodeHandle.node.GetNativeReference(), transform.gameObject);
-
-                // invalidate any pending builds for this node handle
-                nodeHandle.version++;
-            }
-            
-            // recurse down the hierarchy
-            for (var i = 0; i < transform.childCount; ++i)
-                UnloadHierarchy(transform.GetChild(i));
-        }
-
-        private void FreeFromPendingQueue(int count)
-        {
-            _profilerFree.Begin();
-            while (_pendingFrees.Count > 0 && count > 0)
-            {
-                var free = _pendingFrees.Pop();
-        
-                // orphan all children and put them on the free frontier
-                for (var i = free.childCount - 1; i >= 0; --i)
-                    Free(free.GetChild(i));
-        
-                FreeInternal(free);
-        
-                --count;
-            }
-            _profilerFree.End();
-        }
-
-        private void PreAllocateNodeHandle(int count, TimeSpan timeBudget)
-        {
-            if (_preAllocationRoundRobinQueue.Count == 0)
-                return;
-
-            var timer = System.Diagnostics.Stopwatch.StartNew();
-
-            var fullyAllocatedPools = 0;
-
-            while (timer.Elapsed < timeBudget && fullyAllocatedPools < _preAllocationRoundRobinQueue.Count)
-            {
-                var poolId = _preAllocationRoundRobinQueue.Dequeue();
-                _preAllocationRoundRobinQueue.Enqueue(poolId);
-                
-                var pool = _free[poolId];
-
-                // do in batches of 100
-                var remaining = count - pool.Count;
-                if (remaining > 100)
-                    remaining = 100;
-
-                if (pool.Count < count)
-                    AllocateNodeHandleForPool(poolId, remaining);
-                else
-                    fullyAllocatedPools++;
-            }
-        }
-
-        private void AllocateNodeHandleForPool(byte poolId, int count)
-        {
-            for (var i = 0; i < count; ++i)
-            {
-                var nh = Instantiate(_poolPrefabs[poolId]);
-#if UNITY_EDITOR
-                nh.gameObject.hideFlags = HideFlags.HideInHierarchy;
-#endif
-                _free[poolId].Push(nh);
-            }
-        }
-        
-
-        private void FreeInternal(unTransform transform)
-        {
-            if (transform.TryGetComponent<NodeHandle>(out var nodeHandle))
-                FreeHandle(nodeHandle);
-            else
-                Destroy(transform.gameObject);
-        }
-
-        private void FreeHandle(NodeHandle nodeHandle)
-        {
-            // get pool managing this type of node
-            var pool = _free[(byte)nodeHandle.featureKey];
-
-            // return the handle to the pool
-            pool.Push(nodeHandle);
-
-            var go = nodeHandle.gameObject;
-            
-            var tr = go.transform;
-            //tr.parent = null;
-            tr.localPosition = Vector3.zero;
-            tr.localRotation = UnityEngine.Quaternion.identity;
-            tr.localScale = Vector3.one;
-
-            var node = nodeHandle.node;
-
-            if (nodeHandle.builder != null)
-            {
-                bool sharedNode = nodeHandle.stateFlags.HasFlag(NodeStateFlags.AssetInstance);
-                nodeHandle.builder.BuiltObjectReturnedToPool(go, sharedNode);
-            }
-
-            if (node is Geometry)
-            {
-                switch (nodeHandle.featureKey)
-                {
-                    case PoolObjectFeature.Terrain:
-                        OnRemoveTerrain?.Invoke(go);
-                        break;
-                    case PoolObjectFeature.StaticMesh:
-                        OnRemoveGeometry?.Invoke(go);
-                        break;
-                    default:
-                        break;
-                }
-            }
-
-            nodeHandle.Recycle(_textureManager);
-
-            OnEnterPool?.Invoke(go);
-        }
-    }
-
-    [Flags]
-    public enum PoolObjectFeature : byte
-    {
-        //
-        None = 0,
-
-        // Terrain
-        Terrain = 1 << 0,
-
-        //
-        StaticMesh = 1 << 1,
-
-        //
-        Crossboard = 1 << 2,
-    }
-
-
-}
-
-
-
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/TerrainNodeBuilder.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/TerrainNodeBuilder.cs
deleted file mode 100644
index 31166bd9..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/TerrainNodeBuilder.cs
+++ /dev/null
@@ -1,112 +0,0 @@
-//******************************************************************************
-//
-// Copyright (C) SAAB AB
-//
-// All rights, including the copyright, to the computer program(s) 
-// herein belong to Saab AB. The program(s) may be used and/or
-// copied only with the written permission of Saab AB, or in
-// accordance with the terms and conditions stipulated in the
-// agreement/contract under which the program(s) have been
-// supplied. 
-//
-//
-// Information Class:	COMPANY UNCLASSIFIED
-// Defence Secrecy:		NOT CLASSIFIED
-// Export Control:		NOT EXPORT CONTROLLED
-//
-//
-// File			: TerrainNodeBuilder.cs
-// Module		:
-// Description	: Helper class for vertice updates
-// Author		: Anders Modén
-// Product		: Gizmo3D 2.12.185
-//
-// NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
-//			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
-//			usage in Game or VisSim development.
-//
-//
-// Revision History...
-//
-// Who	Date	Description
-//
-// ZJP	240821	Created file                                        (2.12.171)
-//
-//******************************************************************************
-
-using GizmoSDK.Gizmo3D;
-using System.Collections.Generic;
-using UnityEngine;
-
-namespace Saab.Foundation.Unity.MapStreamer
-{
-    public class TerrainNodeBuilder : GeometryBuilderBase
-    {
-        public override PoolObjectFeature Feature => PoolObjectFeature.Terrain;
-
-        public override bool CanBuild(Node node, TraversalState traversalState, IntersectMaskValue intersectMask)
-        {
-            return (traversalState == TraversalState.None) && 
-                base.CanBuild(node, traversalState, intersectMask);
-        }
-
-        protected override bool CreateStateNodeResources(NodeHandle stateNode)
-        {
-            // check if the state has already been loaded
-            if (stateNode.stateLoadInfo.HasFlag(StateLoadInfo.Texture))
-                return true;
-
-            var state = stateNode.node.State;
-
-            if (!StateHelper.Build(state, out StateBuildOutput buildOutput, _textureManager))
-            {
-                state.ReleaseAlreadyLocked();
-                return false;
-            }
-
-            stateNode.stateLoadInfo |= StateLoadInfo.Texture;
-            stateNode.texture = buildOutput.Texture;
-            stateNode.feature = buildOutput.Feature;
-            stateNode.surfaceHeight = buildOutput.SurfaceHeight;
-            stateNode.featureInfo = buildOutput.Feature_homography;
-
-            state.ReleaseAlreadyLocked();
-            return true;
-        }
-
-        private readonly Dictionary<int, Material> _materials = new Dictionary<int, Material>();
-
-        protected override Material CreateMaterialFromState(NodeHandle stateNode)
-        {
-            // use fallback if no texture is available
-            if (!stateNode.texture)
-                return Instantiate(_fallbackMaterial);
-
-            var id = stateNode.texture.GetInstanceID();
-            if (!_materials.TryGetValue(id, out var material))
-            {
-                material = Instantiate(_material);
-                _materials.Add(id, material);
-            }
-
-            // Todo: reuse material if texture match
-            //var material = Instantiate(_material);
-
-            // main texture
-            material.mainTexture = stateNode.texture;
-
-            // feature
-            if (stateNode.feature != null)
-            {
-                material.SetTexture("feature", stateNode.feature);
-                material.EnableKeyword("feature");
-            }
-            else
-            {
-                material.DisableKeyword("feature");
-            }
-
-            return material;
-        }
-    }
-}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/TerrainNodeBuilder.cs.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/TerrainNodeBuilder.cs.meta
deleted file mode 100644
index 475698e5..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/TerrainNodeBuilder.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 5c84d1050450b9341a37c586429c0448
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/TextureManager.cs b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/TextureManager.cs
deleted file mode 100644
index 9712ffbb..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/TextureManager.cs
+++ /dev/null
@@ -1,127 +0,0 @@
-//******************************************************************************
-//
-// Copyright (C) SAAB AB
-//
-// All rights, including the copyright, to the computer program(s) 
-// herein belong to Saab AB. The program(s) may be used and/or
-// copied only with the written permission of Saab AB, or in
-// accordance with the terms and conditions stipulated in the
-// agreement/contract under which the program(s) have been
-// supplied. 
-//
-//
-// Information Class:	COMPANY UNCLASSIFIED
-// Defence Secrecy:		NOT CLASSIFIED
-// Export Control:		NOT EXPORT CONTROLLED
-//
-//
-// File			: TextureManager.cs
-// Module		:
-// Description	: Helper for texture and state uploads
-// Author		: Anders Mod�n
-// Product		: Gizmo3D 2.12.185
-//
-// NOTE:	Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
-//			C++ toolkit for Linux, Mac OS X, Windows, Android, iOS and HoloLens for  
-//			usage in Game or VisSim development.
-//
-//
-// Revision History...
-//
-// Who	Date	Description
-//
-// ZJP	240902	Created file                                        (2.12.179)
-//
-//******************************************************************************
-
-// Framework
-using System;
-using System.Collections.Generic;
-
-// Unity
-using UnityEngine;
-
-// GizmoSDK
-
-namespace Saab.Foundation.Unity.MapStreamer
-{
-    public class TextureManager
-    {
-        private struct TextureCacheItem
-        {
-            public Texture Texture;
-            public TextureImageInfo Info;
-            public int RefCount;
-        }
-
-        private readonly Dictionary<IntPtr, TextureCacheItem> _textureCache = new Dictionary<IntPtr, TextureCacheItem>();
-        private readonly Dictionary<Texture, IntPtr> _lookup = new Dictionary<Texture, IntPtr>();
-
-        public bool TryAdd(IntPtr key, Texture value, TextureImageInfo info)
-        {
-            if (_textureCache.TryAdd(key, new TextureCacheItem() { Texture = value, Info = info, RefCount = 1 }))
-            {
-                // add a reverse lookup to support the free operation
-                _lookup.Add(value, key);
-                return true;
-            }
-
-            // resource already existed, no operation performed
-            return false;
-        }
-
-        public bool TryGet(IntPtr key, out Texture value, out TextureImageInfo info)
-        {
-            if (_textureCache.TryGetValue(key, out TextureCacheItem item))
-            {
-                // item existed in the cache, increase the ref count and return the resource
-                item.RefCount++;
-                _textureCache[key] = item;
-                
-                value = item.Texture;
-                info = item.Info;
-                return true;
-            }
-
-            // failed to find the given resource
-            value = null;
-            info = null;
-            return false;
-        }
-
-        public bool Free(Texture texture)
-        {
-            if (_lookup.TryGetValue(texture, out IntPtr key))
-            {
-                TextureCacheItem item = _textureCache[key];
-                item.RefCount--;
-
-                // check if this was the last reference
-                if (item.RefCount > 0)
-                {
-                    // simply update the ref counter
-                    _textureCache[key] = item;
-                    return true;
-                }
-
-                // this was the last reference for the texture, we should release it
-                _lookup.Remove(texture);
-                _textureCache.Remove(key);
-                GameObject.Destroy(texture);
-                return true;
-            }
-
-            // failed to find the given resource, no operation performed
-            return false;
-        }
-
-        public void Clear()
-        {
-            foreach (var kvp in _lookup)
-                GameObject.Destroy(kvp.Key);
-            
-            _lookup.Clear();
-            _textureCache.Clear();
-        }
-    }
-}
diff --git a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/TextureManager.cs.meta b/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/TextureManager.cs.meta
deleted file mode 100644
index 1eb35d0d..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Foundation.Unity/Saab.Foundation.Unity.MapStreamer/TextureManager.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: a372a0990d72ca142a2b0f034a71c0ab
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Unity.meta b/com.saab.map-streamer/Runtime/Saab.Unity.meta
deleted file mode 100644
index 7679c39c..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Unity.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: fe8913fc60fa4744c84082cf11140145
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Saab.Unity/Saab.Unity.Initializer.meta b/com.saab.map-streamer/Runtime/Saab.Unity/Saab.Unity.Initializer.meta
deleted file mode 100644
index d7af400a..00000000
--- a/com.saab.map-streamer/Runtime/Saab.Unity/Saab.Unity.Initializer.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: c0aa53b7616f2594cbcf5051839b8e53
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/16x9.png b/com.saab.map-streamer/Runtime/Shaders/Foliage/16x9.png
deleted file mode 100644
index 760f4281..00000000
Binary files a/com.saab.map-streamer/Runtime/Shaders/Foliage/16x9.png and /dev/null differ
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/8x5.png b/com.saab.map-streamer/Runtime/Shaders/Foliage/8x5.png
deleted file mode 100644
index ac20578c..00000000
Binary files a/com.saab.map-streamer/Runtime/Shaders/Foliage/8x5.png and /dev/null differ
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/8x5.png.meta b/com.saab.map-streamer/Runtime/Shaders/Foliage/8x5.png.meta
deleted file mode 100644
index 4a783f09..00000000
--- a/com.saab.map-streamer/Runtime/Shaders/Foliage/8x5.png.meta
+++ /dev/null
@@ -1,135 +0,0 @@
-fileFormatVersion: 2
-guid: dd20c60cde740824b9805d38719499f9
-TextureImporter:
-  internalIDToNameTable: []
-  externalObjects: {}
-  serializedVersion: 12
-  mipmaps:
-    mipMapMode: 0
-    enableMipMap: 1
-    sRGBTexture: 1
-    linearTexture: 0
-    fadeOut: 0
-    borderMipMap: 0
-    mipMapsPreserveCoverage: 0
-    alphaTestReferenceValue: 0.5
-    mipMapFadeDistanceStart: 1
-    mipMapFadeDistanceEnd: 3
-  bumpmap:
-    convertToNormalMap: 0
-    externalNormalMap: 0
-    heightScale: 0.25
-    normalMapFilter: 0
-  isReadable: 0
-  streamingMipmaps: 0
-  streamingMipmapsPriority: 0
-  vTOnly: 0
-  ignoreMasterTextureLimit: 0
-  grayScaleToAlpha: 0
-  generateCubemap: 6
-  cubemapConvolution: 0
-  seamlessCubemap: 0
-  textureFormat: 1
-  maxTextureSize: 2048
-  textureSettings:
-    serializedVersion: 2
-    filterMode: 1
-    aniso: 1
-    mipBias: 0
-    wrapU: 0
-    wrapV: 0
-    wrapW: 0
-  nPOTScale: 1
-  lightmap: 0
-  compressionQuality: 50
-  spriteMode: 0
-  spriteExtrude: 1
-  spriteMeshType: 1
-  alignment: 0
-  spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
-  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
-  spriteGenerateFallbackPhysicsShape: 1
-  alphaUsage: 1
-  alphaIsTransparency: 0
-  spriteTessellationDetail: -1
-  textureType: 0
-  textureShape: 1
-  singleChannelComponent: 0
-  flipbookRows: 1
-  flipbookColumns: 1
-  maxTextureSizeSet: 0
-  compressionQualitySet: 0
-  textureFormatSet: 0
-  ignorePngGamma: 0
-  applyGammaDecoding: 0
-  cookieLightType: 0
-  platformSettings:
-  - serializedVersion: 3
-    buildTarget: DefaultTexturePlatform
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: Standalone
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: Server
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: Android
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 1
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
-  spriteSheet:
-    serializedVersion: 2
-    sprites: []
-    outline: []
-    physicsShape: []
-    bones: []
-    spriteID: 
-    internalID: 0
-    vertices: []
-    indices: 
-    edges: []
-    weights: []
-    secondaryTextures: []
-    nameFileIdTable: {}
-  spritePackingTag: 
-  pSDRemoveMatte: 0
-  pSDShowRemoveMatteOption: 0
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/DownsampleDepth.shader b/com.saab.map-streamer/Runtime/Shaders/Foliage/DownsampleDepth.shader
deleted file mode 100644
index 3c0294ce..00000000
--- a/com.saab.map-streamer/Runtime/Shaders/Foliage/DownsampleDepth.shader
+++ /dev/null
@@ -1,51 +0,0 @@
-Shader "Hidden/DownsampleDepth"
-{
-    Properties
-    {
-        _MainTex ("Dummy", 2D) = "white" {}
-    }
-    SubShader
-    {
-        Pass
-        {
-            ZTest Always Cull Off ZWrite Off
-
-            CGPROGRAM
-            #pragma vertex vert
-            #pragma fragment frag
-            #include "UnityCG.cginc"
-
-            sampler2D _CameraDepthTexture;
-            float4 _MainTex_TexelSize;
-
-            struct v2f {
-                float4 pos : SV_POSITION;
-                float2 uv : TEXCOORD0;
-            };
-
-            v2f vert(appdata_base v) {
-                v2f o;
-                o.pos = UnityObjectToClipPos(v.vertex);
-                o.uv = v.texcoord;
-                return o;
-            }
-
-            float frag(v2f i) : SV_Target
-            {
-                //float raw = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);
-                //return LinearEyeDepth(raw);
-
-                float2 uvBase = i.uv - 0.5 * _MainTex_TexelSize * 2; //shift to cover 2�2 block
-
-                float d00 = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uvBase));
-                float d10 = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uvBase + float2(_MainTex_TexelSize.x, 0)));
-                float d01 = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uvBase + float2(0, _MainTex_TexelSize.y)));
-                float d11 = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uvBase + _MainTex_TexelSize.xy));
-
-                return max(max(d00, d10), max(d01, d11));
-
-            }
-            ENDCG
-        }
-    }
-}
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/FoliagePlacement.compute b/com.saab.map-streamer/Runtime/Shaders/Foliage/FoliagePlacement.compute
deleted file mode 100644
index bd8ad17b..00000000
--- a/com.saab.map-streamer/Runtime/Shaders/Foliage/FoliagePlacement.compute
+++ /dev/null
@@ -1,1011 +0,0 @@
-/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-#pragma kernel CSPlacement
-#pragma kernel CSSurfaceHeightMap
-#pragma kernel CSHeightMap
-#pragma kernel CSCull
-#pragma kernel CSPreCull
-#pragma kernel CSPostCull
-#pragma kernel CSFindBufferSize
-#pragma kernel CSFindMinUv
-#pragma kernel CSFindMinMax
-//#pragma kernel CSDownscaleDepth
-#pragma kernel CSClear
-
-#include "UnityCG.cginc"
-
-struct FoliagePoint
-{
-    float3 Position;
-    float3 Color;
-    float Height;
-    float Random;
-    float Visibility;
-};
-
-struct FoliageShaderData
-{
-    float2 MaxMin;
-    float2 Offset;
-    float Weight;
-};
-
-// mesh buffers
-
-#define PI 3.14159265358979323846264338327950
-#define RAD2DEG 57.2957795
-#define DEG2RAD 0.01745329251994329576923690768489
-
-StructuredBuffer<float> VertexBuffer; // Adjust data types based on your mesh format
-ByteAddressBuffer IndexBuffer;
-uint PositionOffset;
-uint TexcoordOffset;
-uint VertexBufferStride;
-
-
-RWStructuredBuffer<uint> BufferSize;
-RWStructuredBuffer<uint> MinXY;
-
-StructuredBuffer<bool> FeatureMap; // feature map => int[255] 
-
-AppendStructuredBuffer<FoliagePoint> TerrainPoints;     // Calculated points for one mesh
-RWStructuredBuffer<FoliagePoint> InputBuffer;           // buffer with all points
-StructuredBuffer<float> PixelToWorld;                   // matrix pixel to world (worldpixel coord)VertexBuffer
-AppendStructuredBuffer<FoliagePoint> OutputBuffer;      // buffer with all (frustum) culled points 
-
-RWStructuredBuffer<uint> AngleDepth;
-
-// textures input
-Texture2D<unorm float> SplatMap;
-Texture2D<float4> Texture;
-Texture2D<unorm float> HeightSurface;
-RWTexture2D<float> SurfaceHeightMap;
-RWTexture2D<float> HeightMap;
-Texture2D<float> DepthTexture;
-
-uint DownscaleFactor;
-Texture2D<float> DepthTextureLowRes;
-
-int FrameCount;
-
-// Camera
-float2 Fov;
-float3 CameraPosition; // camera position in worldPos
-float4 frustumPlanes[6]; // Frustum planes (6 planes * 4 floats: [ normal.x, normal.y, normal.z, distance ])
-uniform float4x4 WorldToScreen; // World to clipPos
-float3 CameraRightVector; // The right vector of the camera
-float3 CameraForwardVector; // The right vector of the camera
-
-// Global Variables
-float AngleResolutionScale;
-uint BufferCount;
-bool Occlusion;
-uint Scale;
-float2 DownscaleSize; // size of screen in pixels (for depthtexture)
-float2 NodeOffset; // botom left corner of node in "world" space
-float maxHeight; // max size of foliage in meters
-uint indexCount; // mesh index count
-uint uvCount; // the size of surfaceUVs buffer
-float2 terrainResolution; // Resolution of texture/feauture texture
-float2 heightResolution; // Resolution of height texture
-float3 terrainSize; // size of terrain (mesh) size
-float2 Resolution; // the size of each pixel in meters
-float Density; // density of trees
-float3 MeshBoundsMax; // Mesh offset
-float4x4 ObjToWorld; // Local To World
-float ScreenCoverage;
-
-uint FoliageCount;
-StructuredBuffer<FoliageShaderData> FoliageData;
-
-// ************* Inside triangle check ************* //
-bool InsideTriangle(float2 p, float2 A, float2 B, float2 C)
-{
-    float area = 0.5 * (-B.y * C.x + A.y * (-B.x + C.x) + A.x * (B.y - C.y) + B.x * C.y);
-    float sign = area < 0 ? -1 : 1;
-
-    float s = (A.y * C.x - A.x * C.y + (C.y - A.y) * p.x + (A.x - C.x) * p.y) * sign;
-    float t = (A.x * B.y - A.y * B.x + (A.y - B.y) * p.x + (B.x - A.x) * p.y) * sign;
-
-    return s >= 0 && t >= 0 && (s + t) <= 2 * area * sign;
-}
-
-// ************* Plane Intersect ************* //
-float PlaneIntersect(float3 origin, float3 ray, float3 planeNormal, float3 planeCoord, out bool success)
-{
-    success = true;
-    // calculate plane
-    float distance = dot(planeNormal, planeCoord);
-
-    // avoid divide by zero
-    if (dot(planeNormal, ray) == 0)
-    {
-        success = false;
-        return 0;
-    }
-
-    // Compute the t value for the directed line ray intersecting the plane
-    float t = (distance - dot(planeNormal, origin)) / dot(planeNormal, ray);
-
-    // scale the ray by t
-    float3 newRay = ray * t;
-
-    // calc contact point
-    float3 contact = origin + newRay;
-
-    return contact.y;
-}
-
-float GetHeightOfPlaneAtXZ(float3 planeNormal, float3 pointInPlane, float2 xz, out bool success)
-{
-    success = true;
-    
-    //Probably not necessary since terrain triangles should never be perfectly vertical.
-    if (planeNormal.y == 0)
-    {
-        success = false;
-        return 0;
-    }
-    
-    float yByX = -planeNormal.x / planeNormal.y;
-    float yByZ = -planeNormal.z / planeNormal.y;
-    
-    float diffX = xz.x - pointInPlane.x;
-    float diffZ = xz.y - pointInPlane.z;
-    
-    return pointInPlane.y + diffX * yByX + diffZ * yByZ;
-}
-
-float3 GetPixelCoord(float2 uv, float height = 0)
-{
-    // z-coordinate is negative because of the infamous BTA Z-flip	
-    float3 coord = float3(uv.x * Resolution.x + MeshBoundsMax.x, height, -uv.y * Resolution.y + MeshBoundsMax.z);
-    return coord;
-}
-
-float Random(float input, float mutator = 0.546)
-{
-    float nonInteger = 43758.5453; // A different constant to avoid common factors with typical inputs
-    float seed = input + mutator * nonInteger;
-    return frac(sin(seed) * 12345.6789);
-}
-
-float Random2D(float2 input, float mutator = 0.546)
-{
-    float i = (input.x * 131.071) + (input.y * 655.37);
-    return Random(i, mutator);
-}
-
-float BilinearHeight(int2 texCoord, float2 frac)
-{
-    float dl, dr, ul, ur;
-
-    dl = HeightMap[texCoord].r;
-    dr = HeightMap[int2(texCoord.x + 1, texCoord.y)].r;
-    ul = HeightMap[int2(texCoord.x, texCoord.y + 1)].r;
-    ur = HeightMap[int2(texCoord.x + 1, texCoord.y + 1)].r;
-
-    float dx = lerp(dl, dr, frac.x);
-    float ux = lerp(ul, ur, frac.x);
-
-    return lerp(ux, dx, frac.y);
-}
-
-float2 GetWorldCoord(uint2 texCoord, float3x3 worldToTexCoord, float2 nodeCoord)
-{
-    float stepsize = 1 / Density;
-    float3 worldCoord = mul(worldToTexCoord, float3(texCoord.xy, 1));
-
-    float2 nodeOffset = worldCoord / stepsize;
-
-    float wpx = ceil(nodeOffset.x) * stepsize;
-    float wpy = ceil(nodeOffset.y) * stepsize;
-
-    float2 foliageOffset = float2(fmod((wpx - worldCoord.x - Resolution.x), stepsize), fmod((wpy - worldCoord.y - Resolution.y), stepsize));
-
-    float2 WorldPixelCoord = nodeCoord + (texCoord * Resolution);
-    return WorldPixelCoord + foliageOffset;
-}
-
-float2 MapUv(float2 uv, float2 size = float2(1, 1))
-{
-    float2 coord = uv;
-    
-#ifdef UNITY_HALF_TEXEL_OFFSET
-        coord -= float2(0.5 / size.x, 0.5 / size.y);
-#endif
-            
-#if UNITY_UV_STARTS_AT_TOP
-        coord.y = 1.0 - (coord.y / size.y); // Flip the y-coordinate if UVs start at the top
-#endif
-    
-    return coord;
-}
-
-float3 GetPosition(uint index)
-{
-    uint actualIndex = index * VertexBufferStride + PositionOffset;
-    float x = VertexBuffer[actualIndex];
-    float y = VertexBuffer[actualIndex + 1];
-    float z = VertexBuffer[actualIndex + 2];
-    
-    return float3(x, y, z);
-}
-
-float2 GetTexCoord(uint index)
-{
-    uint actualIndex = index * VertexBufferStride + TexcoordOffset;
-    float x = VertexBuffer[actualIndex];
-    float y = VertexBuffer[actualIndex + 1];
-    
-    return float2(x, y);
-}
-
-// ************* Handle foliage Height ************* //
-
-int WeightedRandomHeight(float random, float height)
-{
-    float weightSum = 0;
-    for (int index = 0; index < FoliageCount; index++)
-    {
-        float heightWeight = FoliageData[index].MaxMin.x > height ? 0 : 1;
-        weightSum += FoliageData[index].Weight * heightWeight;
-    }
-
-    float r = random * weightSum;
-
-    for (int i = 0; i < FoliageCount; i++)
-    {
-        float heightWeight = FoliageData[i].MaxMin.x > height ? 0 : 1;
-        r -= (FoliageData[i].Weight * heightWeight);
-        if (r >= 0)
-            continue;
-
-        if (heightWeight == 0)
-            return -1;
-
-        return i;
-    }
-    return -1;
-}
-
-float GetFoliageHeight(FoliagePoint data, FoliageShaderData foliageData)
-{
-    float random = data.Random;
-    float surfaceHeight = data.Height;
-
-    float2 minMaxHeight = foliageData.MaxMin;
-    float2 offset = foliageData.Offset;
-    float weight = foliageData.Weight;
-
-    // ********************* ***************  ********************* //
-    float foliageHeight = minMaxHeight.x + ((minMaxHeight.y - minMaxHeight.x) * Random(random, 0.321f));
-    foliageHeight = clamp(foliageHeight, minMaxHeight.x, surfaceHeight);
-    return foliageHeight;
-}
-
-// ************* Find min uv value ************* //
-[numthreads(32, 1, 1)]
-void CSFindMinUv(uint3 id : SV_DispatchThreadID)
-{
-    if (id.x >= uvCount)
-        return;
-
-    InterlockedMin(MinXY[0], (uint) (GetTexCoord(id.x).x * terrainResolution));
-    InterlockedMin(MinXY[1], (uint) (GetTexCoord(id.x).y * terrainResolution));
-}
-
-[numthreads(8, 8, 1)]
-void CSFindMinMax(uint3 id : SV_DispatchThreadID)
-{
-    float height = HeightSurface[id.xy] * 255;
-
-    InterlockedMin(MinXY[0], (uint) (height));
-    InterlockedMax(MinXY[1], (uint) (height));
-}
-
-// ************* Generate Placement ************* //
-[numthreads(8, 8, 1)]
-void CSFindBufferSize(uint3 id : SV_DispatchThreadID)
-{
-    uint feature = uint(SplatMap[id.xy] * 255.0);
-    if (FeatureMap[feature])
-    {
-        InterlockedAdd(BufferSize[0], 1);
-    }
-}
-
-// ************* surfaceHeight Map Gen ************* //
-[numthreads(8, 8, 1)]
-void CSSurfaceHeightMap(uint3 id : SV_DispatchThreadID)
-{
-    float3 color = Texture[id.xy];
-    SurfaceHeightMap[id.xy] = 3 + length(color) / 3 * 18;
-}
-
-uint3 loadTriangleIndices(uint nTriangle)
-{
-    uint offsetBytes = nTriangle * 6;
-    uint dwordAlignedOffset = offsetBytes & ~3;
-    uint2 four16BitIndices = IndexBuffer.Load2(dwordAlignedOffset);
-    uint3 indices;
-    if (dwordAlignedOffset == offsetBytes)
-    {
-        indices.x = four16BitIndices.x & 0xffff;
-        indices.y = (four16BitIndices.x >> 16) & 0xffff;
-        indices.z = four16BitIndices.y & 0xffff;
-    }
-    else
-    {
-        indices.x = (four16BitIndices.x >> 16) & 0xffff;
-        indices.y = four16BitIndices.y & 0xffff;
-        indices.z = (four16BitIndices.y >> 16) & 0xffff;
-    }
-    return indices;
-}
-
-// ************* Height Map Gen ************* //
-[numthreads(4, 4, 4)]
-void CSHeightMap(uint3 id : SV_DispatchThreadID)
-{
-    if (id.x >= indexCount)
-    {
-        return;
-    }
-
-    uint3 indexIndices = loadTriangleIndices(id.x);
-
-    // Vertices for one triangle
-    float3 v1 = GetPosition(indexIndices.x);
-    float3 v2 = GetPosition(indexIndices.y);
-    float3 v3 = GetPosition(indexIndices.z);
-
-    float maxVert = max(max(v1.y, v2.y), v3.y);
-
-    // pixelcoords for one triangle
-    float2 uv1 = GetTexCoord(indexIndices.x) * terrainResolution;
-    float2 uv2 = GetTexCoord(indexIndices.y) * terrainResolution;
-    float2 uv3 = GetTexCoord(indexIndices.z) * terrainResolution;
-    
-    // triangle normal
-    float3 planeNormal = normalize(cross(v2 - v1, v3 - v1));
-
-    // pixel grid to work
-    uint Xmax = max(max(uv1.x, uv2.x), uv3.x);
-    uint Xmin = min(min(uv1.x, uv2.x), uv3.x);
-    uint Ymax = max(max(uv1.y, uv2.y), uv3.y);
-    uint Ymin = min(min(uv1.y, uv2.y), uv3.y);
-
-    float height = maxVert;
-
-    // divide the for loop in 4x4 threads
-    // TODO: WHY + 2?!?!
-    uint offsetX = ceil((Xmax - Xmin + 2) / 4);
-    uint startX = Xmin + (id.y * offsetX);
-    uint endX = Xmin + ((id.y + 1) * offsetX);
-    endX = min(Xmax, endX);
-
-    uint offsetY = ceil((Ymax - Ymin + 2) / 4);
-    uint startY = Ymin + (id.z * offsetY);
-    uint endY = Ymin + ((id.z + 1) * offsetY);
-    endY = min(Ymax, endY);
-
-    bool success = true;
-
-    for (uint x = startX; x <= endX; x++)
-    {
-        for (uint y = startY; y <= endY; y++)
-        {
-            float2 uv = float2(x, y);
-
-            if (InsideTriangle(uv, round(uv1), round(uv2), round(uv3)))
-            {
-                float3 pixelCoord = GetPixelCoord(uv, 1024);
-                height = GetHeightOfPlaneAtXZ(planeNormal, v1, pixelCoord.xz, success);
-
-                if (!success)
-                    height = maxVert;
-
-                HeightMap[uv] = height;
-            }
-        }
-    }
-}
-
-// ************* Generate Placement ************* //
-[numthreads(4, 4, 4)]
-void CSPlacement(uint3 id : SV_DispatchThreadID)
-{
-    float3x3 ToWorldTexCoord =
-    {
-        PixelToWorld[0], PixelToWorld[1], PixelToWorld[2],
-        PixelToWorld[3], PixelToWorld[4], PixelToWorld[5],
-        PixelToWorld[6], PixelToWorld[7], PixelToWorld[8],
-    };
-
-    float stepsize = (1 / Density);
-    uint xCount = ceil(max(Resolution.x * Density, Resolution.x));
-    uint yCount = ceil(max(Resolution.y * Density, Resolution.y));
-
-    float subPixelX = (1.0 / xCount);
-    float subPixelY = (1.0 / yCount);
-    float2 subPixel = float2(subPixelX, subPixelY);
-
-    uint2 uv = id.xy;
-    uint feature = uint(SplatMap[uv] * 255);
-    float2 pixelOverLap = float2(2, 0);
-
-    if (FeatureMap[feature])
-    {
-        // divide the for loop in 4 threads
-        uint threadx = ceil(xCount / 4.0);
-        uint start = id.z * threadx;
-        uint end = start + threadx;
-        end = min(end, xCount);
-
-        // loop throgh all potential points in pixel
-        for (uint x = start; x < end; x++)
-        {
-            for (uint y = 0; y < yCount; y++)
-            {
-                float2 pixelOffset = subPixel * float2(x, y);
-                float3 worldCoord = mul(ToWorldTexCoord, float3(uv.xy + pixelOffset.xy, 1));
-
-                float2 nodeOffset = worldCoord.xy / stepsize;
-                float wpx = ceil(nodeOffset.x) * stepsize;
-                float wpy = ceil(nodeOffset.y) * stepsize;
-
-                float offsetX = (wpx - worldCoord.x);
-                float offsetY = (wpy - worldCoord.y);
-
-                float2 foliagePoint = float2(GetPixelCoord(uv + pixelOffset + pixelOverLap).x + offsetX, GetPixelCoord(uv + pixelOffset + pixelOverLap).z - offsetY); //- (Resolution.y - offsetY));
-
-                float2 randoffset = fmod(GetWorldCoord(uv, ToWorldTexCoord, NodeOffset), 1000);
-                float2 rand = randoffset * 0.001;
-                rand += Random(rand.x + rand.y);
-
-                float angle = (Random2D(rand, 3.731) * 2 - 1) * 3.141592;
-                float2 randDir = float2(cos(angle), sin(angle));
-                
-                float distance = Random2D(rand, 12.243) * (stepsize * 0.5) * 1.5;
-                float2 randomPoint = randDir * distance;
-                float2 uvfrac = frac(randomPoint / Resolution);
-                float2 uvOffset = floor(randomPoint / Resolution);
-                uvOffset.y *= -1;
-
-                // check if uv coord is valid (handle pixel Overlap)
-                if (any((uv + uvOffset) > (terrainResolution - float2(2, 2))) || any((uv + uvOffset) < float2(1, 1)))
-                    continue;
-
-                feature = uint(SplatMap[uv + uvOffset] * 255);
-                float height = BilinearHeight(uv + uvOffset, uvfrac);
-
-                if (offsetX < (Resolution.x * subPixelX) && offsetY < (Resolution.y * subPixelY) && FeatureMap[feature])
-                {
-                    float3 color = Texture[uv + uvOffset].xyz;
-                    float2 corrd = float2(clamp((uv + uvOffset).x - 1, 0, terrainResolution.x - 2), clamp((uv + uvOffset).y - 1, 0, terrainResolution.y - 2));
-
-                    float2 uvHeight = (corrd / (terrainResolution.xy)) * heightResolution.xy;
-
-                    float surfaceHeight = HeightSurface[uvHeight] * 255;
-
-                    // Check if surfaceHeight is "Undefined" give random value as in CSSurfaceHeightMap
-                    if (surfaceHeight <= 0)
-                    {
-                        surfaceHeight = (3 + length(color) / 3 * 18) * 255;
-                    }
-                                                    
-                    float3 coord = float3(foliagePoint.x + randomPoint.x, height, foliagePoint.y + randomPoint.y);
-
-                    FoliagePoint res;
-                    res.Position = coord.xyz;
-                    res.Color = color;
-                    res.Random = Random2D(rand);
-                    res.Height = surfaceHeight;
-                    res.Visibility = 1;
-                    
-                    TerrainPoints.Append(res);
-                }
-            }
-        }
-    }
-}
-
-// ************* Terrain frustum culling ************* //
-inline bool IsInFrustum(float3 positionAfterProjection, float threshold)
-{
-    return (dot(normalize(frustumPlanes[0].xyz), positionAfterProjection) >= threshold &&
-        dot(normalize(frustumPlanes[1].xyz), positionAfterProjection) >= threshold &&
-        dot(normalize(frustumPlanes[2].xyz), positionAfterProjection) >= threshold &&
-        dot(normalize(frustumPlanes[3].xyz), positionAfterProjection) >= threshold);
-}
-
-float3 GetScreenPos(float3 pos)
-{
-    float4 clipCoord = mul(WorldToScreen, float4(pos.xyz, 1));
-    float DepthPos = clipCoord.z;
-    float2 screenPos = clipCoord.xy / clipCoord.w; // converts to a range (-1) - 1
-    screenPos = screenPos * 0.5 + 0.5; // convert to a range 0- 1
-    screenPos *= _ScreenParams.xy; // convert to pixel coordiantes
-    
-    // clamp screenPos to always be in screen
-    screenPos.xy = clamp(screenPos.xy, float2(0, 0), _ScreenParams.xy - 1);
-    
-    return float3(screenPos.xy, DepthPos);
-}
-
-bool IsHidden(float3 worldPos, float height, float3 toFoliage)
-{
-    // Get projected screen-space positions
-    float3 mid = GetScreenPos(worldPos + float3(0, height * 0.5, 0) - toFoliage * height);
-    float3 topRight = GetScreenPos(worldPos + CameraRightVector * 0.5f * height * 0.2 + float3(0, height * 0.8, 0));
-    float3 bottomLeft = GetScreenPos(worldPos - CameraRightVector * 0.5f * height * 0.2);
-    
-    float depth = mid.z - 0.01;
-    
-    int2 downscale = int2(DownscaleFactor, DownscaleFactor);
-    int2 screenSize = int2(_ScreenParams.xy);
-    int2 lowResSize = floor(screenSize / (float)downscale);
-    
-    int2 minXY = int2(floor(min(bottomLeft.xy, topRight.xy) / (float)downscale));
-    int2 maxXY = int2(ceil(max(bottomLeft.xy, topRight.xy) / (float)downscale));
-    
-    // 1-pixel safety margin
-    minXY -= 1;
-    maxXY += 1;
-    
-    // Clamp to screen bounds
-    minXY = clamp(minXY, int2(0, 0), lowResSize.xy - 1);
-    maxXY = clamp(maxXY, int2(0, 0), lowResSize.xy - 1);
-    
-    for (int y = minXY.y; y < maxXY.y; y += 2)
-    {
-        int offset = y % 2;
-        for (int x = minXY.x + offset; x < maxXY.x; x += 2)
-        {
-            int2 lowResPixel = int2(x, y);
-            float sceneDepth = DepthTexture.Load(int3(lowResPixel, 0)); // point sampling
-            
-            // Early out if any pixel shows visible geometry
-            if (sceneDepth > depth + 0.02f) // tweak based on scene scale
-                return false; // visible
-        }
-    }
-    
-    return true;
-}
-
-float CalculateDesiredDistance(float vFov, float objectHeight, float coverage)
-{
-    float halfFov = vFov * 0.5 * DEG2RAD;
-    
-    return objectHeight / (2.0 * tan(halfFov) * coverage);
-}
-
-uint2 UnpackIndex(uint index, uint bufferWidth)
-{
-   
-    // Recover pitchIndex and yawIndex from the single 'index'
-    uint pitchIndex = index / bufferWidth;
-    uint yawIndex = index % bufferWidth;
-    
-    return uint2(yawIndex, pitchIndex);
-}
-
-float2 IndexToAngle(uint index, float2 fov)
-{
-    // Use the same resolution and FOV parameters as in AngleIndex
-    float resolutionScale = AngleResolutionScale;
-    uint bufferWidth = (uint) (180.0 * resolutionScale);
-
-    // Recover pitchIndex and yawIndex from the single 'index'
-    uint pitchIndex = index / bufferWidth;
-    uint yawIndex = index % bufferWidth;
-
-    // Convert discrete indices back to normalized [0..1]
-    float normalizedYaw = (float) yawIndex / (float) (bufferWidth - 1);
-    float normalizedPitch = (float) pitchIndex / (float) (bufferWidth - 1);
-
-    // Convert normalized [0..1] back to angles in degrees:
-    //   0   -> -fov/2
-    //   1   -> +fov/2
-    float yawAngle = normalizedYaw * fov.x - (fov.x * 0.5);
-    float pitchAngle = normalizedPitch * fov.y - (fov.y * 0.5);
-
-    return float2(yawAngle, pitchAngle);
-}
-
-float2 GetAngle(float3 toPoint, float3 cameraForward, float3 cameraRight, float3 cameraUp, float2 fov, uint bufferWidth)
-{
-    // Normalize the direction vector
-    float3 dir = normalize(toPoint);
-   
-    // Compute camera space coordinates
-    // x: right, y: up, z: forward
-    float x = dot(dir, cameraRight);
-    float y = dot(dir, cameraUp);
-    float z = dot(dir, cameraForward);
-    
-    if (z <= 0.001)
-        z = 0;
-    
-    // Compute yaw and pitch in degrees.
-    // atan2 returns the angle (in radians) between the z-axis and the projection onto the x-z or y-z plane.
-    float yawAngle = degrees(atan2(x, z)); // horizontal angle
-    float pitchAngle = degrees(asin(y));
-           
-    return float2(yawAngle, pitchAngle);
-}
-
-uint GetIndex(float2 yawPitch, uint bufferWidth, float2 fov)
-{
-    // Remap the angles from camera space to a normalized [0, 1] range.
-    // The fov vector contains (horizontalFOV, verticalFOV)
-    // Here, we assume the center of the view is 0 deg, with -fov/2 to +fov/2 covering the full fov.
-    float normalizedYaw = saturate((yawPitch.x + (fov.x * 0.5)) / fov.x);
-    float normalizedPitch = saturate((yawPitch.y + (fov.y * 0.5)) / fov.y);
-
-    // Scale the normalized values into our discrete grid.
-    // Multiplying by (bufferWidth - 1) ensures that bottom-left is index 0 and top-right is (bufferWidth - 1).
-    uint yawIndex = (uint) (normalizedYaw * (bufferWidth - 1));
-    uint pitchIndex = (uint) (normalizedPitch * (bufferWidth - 1));
-
-    // Pack into a single index (row-major order):
-    uint index = pitchIndex * bufferWidth + yawIndex;
-    return index;
-}
-
-uint AngleIndex(float3 toPoint, float3 cameraForward, float3 cameraRight, float3 cameraUp, float2 fov, out float2 yawPitch)
-{
-    // resolutionScale is defined somewhere in your shader
-    uint bufferWidth = (uint) (180.0 * AngleResolutionScale);
-        
-    // Compute yaw and pitch in degrees.
-    yawPitch = GetAngle(toPoint, cameraForward, cameraRight, cameraUp, fov, bufferWidth);
-    return GetIndex(yawPitch, bufferWidth, fov);
-}
-
-int GetRectangleWidth(uint minIndex, uint maxIndex, uint bufferWidth)
-{
-    int minX = minIndex % bufferWidth;
-    int maxX = maxIndex % bufferWidth;
-    
-    return (maxX - minX);
-}
-
-void FillSkewedRectangleInterlockedMin(uint minIndex, uint maxIndex, float distance, float2 minYawPitch, float2 maxYawPitch, float tilt)
-{
-    uint bufferWidth = (uint) (180.0 * AngleResolutionScale);
-    
-    int rWidth = GetRectangleWidth(minIndex, maxIndex, bufferWidth);
-    uint index = minIndex;
-    uint rows = floor((float)(maxIndex - minIndex) / (float)bufferWidth);
-    uint currentRow = 0;
-    
-    while (index < maxIndex)
-    {
-        uint rowStart = floor((float)index / (float)bufferWidth) * bufferWidth;
-        uint rowEnd = ceil((float)index / (float)bufferWidth) * bufferWidth;
-        int skew = (float)currentRow * tilt;
-        
-        int startIndex = index + skew;
-        uint endIndex = startIndex + rWidth;
-        
-        for (uint x = max(rowStart, startIndex); x <= min(rowEnd, endIndex); x++)
-        {
-            InterlockedMin(AngleDepth[x], (uint) ceil(distance));
-        }
-        
-        index += bufferWidth;
-        currentRow++;
-    }
-}
-
-void SetIndex(float3 toPoint, float3 forward, float3 right, float3 up, float distance)
-{
-    float2 YawPitch;
-    uint index = AngleIndex(toPoint, forward, right, up, Fov, YawPitch);
-    InterlockedMin(AngleDepth[index], (uint) ceil(distance));
-}
-
-bool PointInTriangle(float2 pt, float2 v0, float2 v1, float2 v2)
-{
-    // Barycentric technique
-    float2 v0v1 = v1 - v0;
-    float2 v0v2 = v2 - v0;
-    float2 v0pt = pt - v0;
-
-    float d00 = dot(v0v1, v0v1);
-    float d01 = dot(v0v1, v0v2);
-    float d11 = dot(v0v2, v0v2);
-    float d20 = dot(v0pt, v0v1);
-    float d21 = dot(v0pt, v0v2);
-    float denom = d00 * d11 - d01 * d01;
-
-    if (denom == 0.0f)
-        return false;
-
-    float u = (d11 * d20 - d01 * d21) / denom;
-    float v = (d00 * d21 - d01 * d20) / denom;
-
-    return (u >= 0) && (v >= 0) && (u + v <= 1);
-}
-
-void FillIndices(float3 bottomleft, float3 topRight, float3 bottomRight, float3 topLeft, float3 forward, float3 right, float3 up, float distance)
-{
-    const uint bufferWidth = (uint) (180.0 * AngleResolutionScale);
-    const float2 halfFov = Fov * 0.5f;
-
-    // Get yaw/pitch angles (in degrees)
-    float2 bl = GetAngle(bottomleft, forward, right, up, Fov, bufferWidth);
-    float2 br = GetAngle(bottomRight, forward, right, up, Fov, bufferWidth);
-    float2 tl = GetAngle(topLeft, forward, right, up, Fov, bufferWidth);
-    float2 tr = GetAngle(topRight, forward, right, up, Fov, bufferWidth);
-
-    // Angle-space bounds
-    float2 minAngle = min(min(bl, br), min(tl, tr));
-    float2 maxAngle = max(max(bl, br), max(tl, tr));
-
-    // Convert to index-space bounds (but don't round yet)
-    float2 minNorm = saturate((minAngle + halfFov) / Fov);
-    float2 maxNorm = saturate((maxAngle + halfFov) / Fov);
-
-    uint2 minIdx = (uint2) (minNorm * (bufferWidth - 1));
-    uint2 maxIdx = (uint2) (maxNorm * (bufferWidth - 1));
-
-    for (uint py = minIdx.y; py <= maxIdx.y; py++)
-    {
-        for (uint px = minIdx.x; px <= maxIdx.x; px++)
-        {
-            // Convert back to yaw/pitch angle (center of pixel)
-            float2 norm = float2(px + 0.5f, py + 0.5f) / (float) (bufferWidth - 1);
-            float2 angle = norm * Fov - halfFov;
-
-            // Point-in-triangle in angle space
-            if (PointInTriangle(angle, bl, tl, tr) || PointInTriangle(angle, bl, tr, br))
-            {
-                uint index = py * bufferWidth + px;
-                InterlockedMin(AngleDepth[index], (uint) ceil(distance));
-            }
-        }
-    }
-}
-
-void SetIndices(float3 toBottomLeft, float3 toTopRight, float3 forward, float3 right, float3 up, float distance, float height = 0)
-{
-    float2 minYawPitch, maxYawPitch;
-    uint minIndex = AngleIndex(toBottomLeft, forward, right, up, Fov, minYawPitch);
-    uint maxIndex = AngleIndex(toTopRight, forward, right, up, Fov, maxYawPitch);
-    
-    FillSkewedRectangleInterlockedMin(minIndex, maxIndex, distance, minYawPitch, maxYawPitch, -0.5);
-}
-
-uint GetIndex(float3 toFoliage, float3 forward, float3 right, float3 up)
-{
-    float2 t1;
-    return AngleIndex(toFoliage, forward, right, up, Fov, t1);
-}
-
-bool GetRandomizedData(FoliagePoint data, out FoliageShaderData output)
-{
-    float random = data.Random;
-    float surfaceHeight = data.Height;
-    
-    int type = floor(random * FoliageCount);
-    type = WeightedRandomHeight(random, surfaceHeight);
-    if (type < 0)
-        return false;
-    
-    output = FoliageData[type];
-    return true;
-}
-
-bool HiddenCheck(uint depth, float distance, float height)
-{
-    return depth <= distance - (height * 0.5);
-}
-
-// ************* Cull Points ************* //
-[numthreads(128, 1, 1)]
-void CSCull(uint3 id : SV_DispatchThreadID)
-{
-    FoliagePoint data = InputBuffer[id.x]; 
-            
-    // handle points with no value. (allocated points in buffer is by default float3(0,0,0))
-    if (dot(data.Position, data.Position) == 0)
-        return;
-    
-    float3 forward = CameraForwardVector;
-    float3 right = CameraRightVector;
-    float3 up = normalize(cross(forward, right));
-    
-    FoliageShaderData foliageData = (FoliageShaderData)0;
-    bool dataFound = GetRandomizedData(data, foliageData);
-    
-    if (!dataFound)
-        return;
-    
-    float height = GetFoliageHeight(data, foliageData);
-    
-    if (height == 0)
-        return;
-    
-    float3 worldUp = float3(0, 1, 0);
-    float3 topPadding = worldUp * height * 0.1;
-    float3 topOffset = worldUp * (height - foliageData.Offset.y * height) - topPadding;
-    float3 pos = mul(ObjToWorld, float4(data.Position.xyz, 1)).xyz;
-    
-    
-    float3 FoliageMid = pos + topOffset * 0.45;
-    float3 FoliageTop = pos + topOffset * 0.85;
-    float3 toFoliageMid = FoliageMid - CameraPosition;
-    float3 toFoliageTop = FoliageTop - CameraPosition;
-    
-    float3 foliageRight = normalize(cross(up, FoliageMid)) * height * 0.5;
-    
-    float3 FoliageRight = FoliageMid + foliageRight * 0.02;
-    float3 FoliageLeft = FoliageMid - foliageRight * 0.02;
-    float3 toFoliageRight = FoliageRight - CameraPosition;
-    float3 toFoliageLeft = FoliageLeft - CameraPosition;
-    
-    float distance = length(toFoliageMid);
-    float desiredDistance = CalculateDesiredDistance(Fov.y/*This includes padding for shadows, but should maybe not*/, height, ScreenCoverage);
-    
-    if (desiredDistance < distance)
-        return;
-  
-    // ****** falloff ******
-    if (distance > desiredDistance * 0.50)
-    {
-        float seed = data.Random;
-    
-        float percentage = (distance - (desiredDistance * 0.50)) / (frustumPlanes[5].w * 0.5);
-        if (percentage > seed)
-            return;
-    }
-
-    if (IsInFrustum(toFoliageMid, -height))
-    {
-        if (FrameCount % 2 == id.x % 2)
-        {   
-            uint indexMid = GetIndex(toFoliageMid, forward, right, up);
-            uint indexTop = GetIndex(toFoliageTop, forward, right, up);
-            uint indexRight = GetIndex(toFoliageRight, forward, right, up);
-            uint indexLeft = GetIndex(toFoliageLeft, forward, right, up);
-            
-            uint midDepth = AngleDepth[indexMid];
-            uint topDepth = AngleDepth[indexTop];
-            uint rightDepth = AngleDepth[indexRight];
-            uint leftDepth = AngleDepth[indexLeft];
-        
-            bool midHidden = HiddenCheck(midDepth, distance, height);
-            bool topHidden = HiddenCheck(topDepth, distance, height);
-            bool rightHidden = HiddenCheck(rightDepth, distance, height);
-            bool leftHidden = HiddenCheck(leftDepth, distance, height);
-                                         
-            if (midHidden && topHidden && rightHidden && leftHidden)
-            {
-                //return;
-            }
-             //******** occlussion culling ******** 
-            else if (Occlusion && IsHidden(pos, height, normalize(toFoliageMid)))
-            {
-                //return;
-            }
-            else
-            {
-                if (data.Visibility <= 1)
-                    data.Visibility += 0.25;
-            }
-        }
-        
-        if (data.Visibility <= 0)
-            return;
-        else
-            data.Visibility -= 0.01;
-        
-        InputBuffer[id.x] = data;
-        
-        data.Position = pos;
-        OutputBuffer.Append(data);
-    }
-}
-
-[numthreads(256, 1, 1)]
-void CSPostCull(uint3 id : SV_DispatchThreadID)
-{
-    int index = id.x;
-    AngleDepth[index] = 0xffffffff;
-}
-
-[numthreads(128, 1, 1)]
-void CSPreCull(uint3 id : SV_DispatchThreadID)
-{
-    FoliagePoint data = InputBuffer[id.x];
-    
-    // handle points with no value. (allocated points in buffer is by default float3(0,0,0)) 
-    if (dot(data.Position, data.Position) == 0)
-        return;
-    
-    float3 pos = mul(ObjToWorld, float4(data.Position.xyz, 1)).xyz;
-    FoliageShaderData foliageData = (FoliageShaderData)0;
-    bool dataFound = GetRandomizedData(data, foliageData);
-    
-    if (!dataFound)
-        return;
-    
-    float height = GetFoliageHeight(data, foliageData);
-    float halfheight = height * 0.5;
-    
-    //TODO: Skip this intermediate center-calculation and calculate corners directly?
-    float3 centerOffset = float3(0, 0.5, 0) * height;
-    float3 midPos = pos + centerOffset;
-    float3 toFoliageMid = (midPos - CameraPosition);
-    
-    if (!IsInFrustum(toFoliageMid, -height))
-        return;
-    
-    float distance = length(toFoliageMid);
-    if (distance > frustumPlanes[5].w)
-        return;
-    
-    float3 forward = CameraForwardVector;
-    float3 right = CameraRightVector;
-    float3 up = normalize(cross(forward, right));
-   
-    if (dot(toFoliageMid, forward) < 0) // Don't draw trees that are behind the camera.
-        return;
-
-    toFoliageMid = normalize(toFoliageMid);
-    float3 worldUp = float3(0, 1, 0);
-          
-    float3 toFoliageRight = normalize(cross(up, toFoliageMid));
-
-    float scale = 0.02;
-    float3 topPadding = worldUp * height * 0.1;
-    
-    float3 rightOffset = toFoliageRight * height * 0.5 * scale;
-    float3 topOffset = worldUp * (height - foliageData.Offset.y * height) - topPadding;
-    
-    float3 foliageBottomLeft = pos - rightOffset;
-    float3 foliageTopRight = pos + rightOffset + topOffset;
-    float3 foliageBottomRight = pos + rightOffset;
-    float3 foliageTopLeft = pos - rightOffset + topOffset;
-    
-    float3 toFoliageBottomLeft = foliageBottomLeft - CameraPosition;
-    float3 toFoliageTopRight = foliageTopRight - CameraPosition;
-    float3 toFoliageBottomRight = foliageBottomRight - CameraPosition;
-    float3 toFoliageTopLeft = foliageTopLeft - CameraPosition;
-    
-    FillIndices(toFoliageBottomLeft, toFoliageTopRight, toFoliageBottomRight, toFoliageTopLeft, forward, right, up, distance);
-    //SetIndices(toFoliageBottomLeft, toFoliageTopRight, forward, right, up, distance, data.Height);
-}
-
-[numthreads(128, 1, 1)]
-void CSClear(uint3 id : SV_DispatchThreadID)
-{
-    if (id.x >= BufferCount)
-        return;
-    
-    FoliagePoint res;
-    res.Position = float3(0, 0, 0);
-    res.Color = float3(0, 0, 0);
-    res.Random = 0;
-    res.Height = 0;
-    res.Visibility = 0;
-    
-    TerrainPoints.Append(res);
-}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Shaders/Foliage/Geometry.cginc b/com.saab.map-streamer/Runtime/Shaders/Foliage/Geometry.cginc
deleted file mode 100644
index 64958101..00000000
--- a/com.saab.map-streamer/Runtime/Shaders/Foliage/Geometry.cginc
+++ /dev/null
@@ -1,413 +0,0 @@
-/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-void AppendVertex(inout FS_INPUT pin, float3 wp, float3 center, float radius, float3 uv, float3 normal, float3 color, float alpha)
-{
-	pin.pos = UnityObjectToClipPos(wp);
-	pin.wp = wp;
-	pin.center = center;
-	pin.radius = radius;
-	pin.tex0 = uv;
-	pin.normal = normal;
-	pin.color = color;
-    pin.alpha = alpha;
-}
-
-float Random(float input, float mutator = 0.546)
-{
-    float nonInteger = 43758.5453; // A different constant to avoid common factors with typical inputs
-    float seed = input + mutator * nonInteger;
-    return frac(sin(seed) * 12345.6789);
-}
-
-float Random2D(float2 input, float mutator = 0.546)
-{
-	float i = (input.x * 131.071) + (input.y * 655.37);
-	return Random(i, mutator);
-}
-
-int WeightedRandomHeight(float random, float height)
-{
-	float weightSum = 0;
-	for (int index = 0; index < _foliageCount; index++)
-	{
-		float heightWeight = _foliageData[index].MaxMin.x > height ? 0 : 1;
-		weightSum += _foliageData[index].Weight * heightWeight;
-	}
-
-	float r = random * weightSum;
-
-	for (int i = 0; i < _foliageCount; i++)
-	{
-		float heightWeight = _foliageData[i].MaxMin.x > height ? 0 : 1;
-		r -= (_foliageData[i].Weight * heightWeight);
-		if (r >= 0)
-			continue;
-
-		if (heightWeight == 0)
-			return -1;
-
-		return i;
-	}
-	return -1;
-}
-
-int WeightedRandom(float random)
-{
-	float weightSum = 0;
-	for (int index = 0; index < _foliageCount; index++)
-	{
-		weightSum += _foliageData[index].Weight;
-	}
-
-	float r = random * weightSum;
-
-	for (int i = 0; i < _foliageCount; i++)
-	{
-		r -= _foliageData[i].Weight;
-		if (r >= 0)
-			continue;
-
-		return i;
-	}
-	return -1;
-}
-
-// Geometry Shader Billboard
-[maxvertexcount(4)]
-void Billboard(point uint p[1] : TEXCOORD, inout TriangleStream<FS_INPUT> triStream)
-{
-	// ********************* point cloud data  ********************* //
-
-	float3 pos = _PointBuffer[p[0]].Position;
-	float3 color = _PointBuffer[p[0]].Color;
-	float height = _PointBuffer[p[0]].Height;
-	float random = _PointBuffer[p[0]].Random;
-    float visibility = _PointBuffer[p[0]].Visibility;
-
-	// ********************* MaxMin height  ********************* //
-	
-	float foliageFactor = 0.2f;
-	float maxHorizonHeight = height * (1 + foliageFactor);
-	float minHorizonHeight = height * (1 - foliageFactor);
-
-	// ********************* foliage type data  ********************* //
-
-	int type = floor(random * _foliageCount);
-	type = WeightedRandomHeight(random, height);
-	if (type < 0)
-		return;
-
-	float2 minMaxHeight = _foliageData[type].MaxMin;
-	float2 offset = _foliageData[type].Offset;
-	float weight = _foliageData[type].Weight;
-
-	// ********************* ***************  ********************* //
-
-	float foliageHeight = minMaxHeight.x + ((minMaxHeight.y - minMaxHeight.x) * Random(random, 0.321f));
-	foliageHeight = clamp(foliageHeight, minMaxHeight.x, height);
-	height = foliageHeight + _AdditiveSize;
-	pos.y -= offset.y * height;		// offset to handle Roots
-
-	float3 up = float3(0, 1, 0);
-	float3 look = float3(1, 1, 1);
-
-	float halfS = 0.5f * height;
-	float3 center = pos + up * halfS;
-
-#ifdef SHADOW_BILLBOARD
-	look = _WorldSpaceLightPos0;
-#else
-	look = _WorldSpaceCameraPos - pos;
-#endif
-
-	look.y = 0;
-	look = normalize(look);
-	float3 right = cross(up, look);
-
-	float4 v[4];
-	v[0] = float4(pos + halfS * right, 1.0f);
-	v[1] = float4(pos + halfS * right + height * up, 1.0f);
-	v[2] = float4(pos - halfS * right, 1.0f);
-	v[3] = float4(pos - halfS * right + height * up, 1.0f);
-
-	float3 uv0 = float3(1.0f, 0.0f, type);
-	float3 uv1 = float3(1.0f, 1.0f, type);
-	float3 uv2 = float3(0.0f, 0.0f, type);
-	float3 uv3 = float3(0.0f, 1.0f, type);
-
-#ifdef CROSSBOARD
-	uv0 = float3(0.5f, 0.0f, type);
-	uv1 = float3(0.5f, 0.5f, type);
-	uv2 = float3(0.0f, 0.0f, type);
-	uv3 = float3(0.0f, 0.5f, type);
-#endif
-
-	FS_INPUT pIn;
-
-    AppendVertex(pIn, v[0], center, halfS, uv0, -look, color, visibility);
-	triStream.Append(pIn);
-
-    AppendVertex(pIn, v[1], center, halfS, uv1, -look, color, visibility);
-	triStream.Append(pIn);
-
-    AppendVertex(pIn, v[2], center, halfS, uv2, -look, color, visibility);
-	triStream.Append(pIn);
-
-    AppendVertex(pIn, v[3], center, halfS, uv3, -look, color, visibility);
-	triStream.Append(pIn);
-}
-
-// Geometry Shader CrossBoard
-[maxvertexcount(12)]
-void Crossboard(point uint p[1] : TEXCOORD, inout TriangleStream<FS_INPUT> triStream)
-{
-	// ********************* point cloud data  ********************* //
-
-	float3 pos = _PointBuffer[p[0]].Position;
-	float3 color = _PointBuffer[p[0]].Color;
-	float height = _PointBuffer[p[0]].Height;
-	float random = _PointBuffer[p[0]].Random;
-    float visibility = _PointBuffer[p[0]].Visibility;
-
-	// ********************* MaxMin height  ********************* //
-
-	float foliageFactor = 0.2f;
-	float maxHorizonHeight = height * (1 + foliageFactor);
-	float minHorizonHeight = height * (1 - foliageFactor);
-
-	// ********************* foliage type data  ********************* //
-
-	int type = floor(random * _foliageCount);	// calculate the foliage (index) to place down
-	type = WeightedRandomHeight(random, height);
-	if (type < 0)
-		return;
-
-	float2 minMaxHeight = _foliageData[type].MaxMin;
-	float2 offset = _foliageData[type].Offset;
-	float weight = _foliageData[type].Weight;
-
-	// ********************* ***************  ********************* //
-
-	float foliageHeight = minMaxHeight.x + ((minMaxHeight.y - minMaxHeight.x) * Random(random, 0.321f));
-	foliageHeight = clamp(foliageHeight, minMaxHeight.x, height);
-	height = foliageHeight + _AdditiveSize;
-	pos.y -= offset.y * height;		// offset to handle Roots
-
-	float3 up = normalize(float3(0, 1, 0));
-	float angle = (Random(random, 0.131f) * 2 - 1) * 3.141592;
-	float3 randDir = float3(cos(angle), 0, sin(angle));
-
-	float3 right = randDir;
-	float3 front = normalize(-cross(up, right));
-
-	float halfS = 0.5f * height;
-	float3 center = pos + up * halfS;
-
-	float3 wind = float3(0, 0, 0);
-
-    float3 WorldPos = _WorldOffset * 2 + pos;
-    float curve = tex2Dlod(_WindTexture, float4(WorldPos.xz * 0.0005 - _Time.x * _WindVector.xy * _WindVector.z * 0.1, 1, 1)).r;
-    curve = saturate(curve + (_WindVector.z / 100)) * 0.01;
-	
-    if (length(_WindVector.xy) > 0)
-	{
-        float2 windDir = normalize(_WindVector.xy);
-        wind = float3(windDir.x, 0, windDir.y) * curve * _WindVector.z * foliageHeight;
-    }
-
-	// *********** front points ***********
-
-	float4 f[4];
-	f[0] = float4(pos + halfS * right, 1.0f);
-	f[1] = float4(pos + halfS * right + height * up + wind, 1.0f);
-	f[2] = float4(pos - halfS * right, 1.0f);
-	f[3] = float4(pos - halfS * right + height * up + wind, 1.0f);
-
-	// *********** Right points ***********
-
-	float4 r[4];
-	r[0] = float4(pos + halfS * front, 1.0f);
-	r[1] = float4(pos + halfS * front + height * up + wind, 1.0f);
-	r[2] = float4(pos - halfS * front, 1.0f);
-	r[3] = float4(pos - halfS * front + height * up + wind, 1.0f);
-
-	// *********** Top points ***********
-
-	float4 t[4];
-	t[0] = float4(center + halfS * right - halfS * front + wind * 0.5, 1.0f);
-	t[1] = float4(center + halfS * right + halfS * front + wind * 0.5, 1.0f);
-	t[2] = float4(center - halfS * right - halfS * front + wind * 0.5, 1.0f);
-	t[3] = float4(center - halfS * right + halfS * front + wind * 0.5, 1.0f);
-
-	// *********** Crossboards ***********
-
-	FS_INPUT pIn;
-
-	// *********** front face ***********
-
-    AppendVertex(pIn, f[0], center, halfS, float3(0.5f, 0.0f, type), normalize(front), color, visibility);
-	triStream.Append(pIn);
-
-    AppendVertex(pIn, f[1], center, halfS, float3(0.5f, 0.5f, type), normalize(front), color, visibility);
-	triStream.Append(pIn);
-
-    AppendVertex(pIn, f[2], center, halfS, float3(0.0f, 0.0f, type), normalize(front), color, visibility);
-	triStream.Append(pIn);
-
-    AppendVertex(pIn, f[3], center, halfS, float3(0.0f, 0.5f, type), normalize(front), color, visibility);
-	triStream.Append(pIn);
-
-	// *********** right face ***********
-
-	triStream.RestartStrip();
-
-    AppendVertex(pIn, r[0], center, halfS, float3(0.5f, 0.5f, type), normalize(right), color, visibility);
-	triStream.Append(pIn);
-
-    AppendVertex(pIn, r[1], center, halfS, float3(0.5f, 1.0f, type), normalize(right), color, visibility);
-	triStream.Append(pIn);
-
-    AppendVertex(pIn, r[2], center, halfS, float3(0.0f, 0.5f, type), normalize(right), color, visibility);
-	triStream.Append(pIn);
-
-    AppendVertex(pIn, r[3], center, halfS, float3(0.0f, 1.0f, type), normalize(right), color, visibility);
-	triStream.Append(pIn);
-
-	// *********** top face ***********
-
-	triStream.RestartStrip();
-
-    AppendVertex(pIn, t[0], center, halfS, float3(1.0f, 0.0f, type), normalize(up), color, visibility);
-	triStream.Append(pIn);
-
-    AppendVertex(pIn, t[1], center, halfS, float3(1.0f, 0.5f, type), normalize(up), color, visibility);
-	triStream.Append(pIn);
-
-    AppendVertex(pIn, t[2], center, halfS, float3(0.5f, 0.0f, type), normalize(up), color, visibility);
-	triStream.Append(pIn);
-
-    AppendVertex(pIn, t[3], center, halfS, float3(0.5f, 0.5f, type), normalize(up), color, visibility);
-	triStream.Append(pIn);
-}
-
-// Geometry Shader Grass
-[maxvertexcount(48)]
-void Grass(point uint p[1] : TEXCOORD, inout TriangleStream<FS_INPUT> triStream)
-{
-	// ********************* point cloud data  ********************* //
-
-	float3 pos = _PointBuffer[p[0]].Position;
-	float3 color = _PointBuffer[p[0]].Color;
-	float height = _PointBuffer[p[0]].Height;
-	float random = _PointBuffer[p[0]].Random;
-    float visibility = _PointBuffer[p[0]].Visibility;
-
-	// ********************* foliage type data  ********************* //
-
-	int type = floor(random * _foliageCount);	// calculate the foliage (index) to place down
-	
-    type = WeightedRandomHeight(random, height);
-	//type = WeightedRandom(random);
-
-	float2 minMaxHeight = _foliageData[type].MaxMin;
-	float2 offset = _foliageData[type].Offset;
-	float weight = _foliageData[type].Weight;
-
-	// *********** billboard ***********
-	float3 up = normalize(float3(0, 1, 0));
-	float3 center = pos;
-
-	//float distance = clamp((length(_WorldSpaceCameraPos - pos) / 20), 0, 1);
-
-	for (uint i = 0; i < 12; i++)
-	{
-		float rand = Random(random + i, 0.912);
-		float angle = (rand * 2 - 1) * 3.141592;
-		float3 randDir = float3(cos(angle), 0, sin(angle));
-		float3 pos = center + randDir * rand * 1.5;
-
-		float rand02 = Random(random + i, 0.643);
-		angle = (rand02 * 2 - 1) * 3.141592;
-		randDir = float3(cos(angle), 0, sin(angle));
-
-		float3 camDir = _WorldSpaceCameraPos - pos;
-		float blend = normalize(camDir).y;
-		camDir = normalize(camDir);
-
-		float3 billboardRight = cross(up, camDir);
-		float rotateDir = sign(dot(billboardRight, randDir));
-
-		float3 right = lerp(billboardRight * rotateDir, randDir, blend);
-		float3 front = normalize(-cross(up, right));
-
-		float side = sign(dot(camDir, front));
-
-		float foliageHeight = minMaxHeight.x + ((minMaxHeight.y - minMaxHeight.x) * Random(random, 0.321f));
-		float h = foliageHeight;
-		float halfS = 0.5f * h;
-		pos.y -= offset.y * h;					// offset to handle Roots
-
-		float3 wind = float3(0, 0, 0);
-
-        float3 WorldPos = _WorldOffset * 2 + pos;
-        float curve = tex2Dlod(_WindTexture, float4(WorldPos.xz * 0.0005 - _Time.x * _WindVector.xy * _WindVector.z * 0.1, 1, 1)).r;
-		
-        curve = saturate(curve + (_WindVector.z / 100)) * 0.1;
-		
-		if (length(_WindVector.xy) > 0)
-		{
-			float2 windDir = normalize(_WindVector.xy);
-            wind = float3(windDir.x, 0, windDir.y) * curve * _WindVector.z * h;
-        }
-
-		float4 f[4];
-		// right bottom
-		f[0] = float4(pos + halfS * right, 1.0f);
-		// right top
-		f[1] = float4(pos + halfS * right + h * up + wind, 1.0f);
-		// left bottom
-		f[2] = float4(pos - halfS * right, 1.0f);
-		// left top
-		f[3] = float4(pos - halfS * right + h * up + wind, 1.0f);
-
-		FS_INPUT pIn;
-
-		// right bottom
-        AppendVertex(pIn, f[0], center, height, float3(1.0f, 0.0f, type), normalize(front * side + right + up * 0.5), color, visibility);
-		triStream.Append(pIn);
-		// right top
-        AppendVertex(pIn, f[1], center, height, float3(1.0f + (rand * 0.2f), 1.0f + (rand02 * 0.2f), type), normalize(up + right), color, visibility);
-		triStream.Append(pIn);
-		// left bottom
-        AppendVertex(pIn, f[2], center, height, float3(0.0f, 0.0f, type), normalize(front * side - right + up * 0.5), color, visibility);
-		triStream.Append(pIn);
-		// left top
-        AppendVertex(pIn, f[3], center, height, float3(0.0f + (rand02 * 0.2f), 1.0f + (rand * 0.2f), type), normalize(up + right), color, visibility);
-		triStream.Append(pIn);
-
-		triStream.RestartStrip();
-	}
-}
-
-[maxvertexcount(48)]
-void geo(point uint p[1] : TEXCOORD, inout TriangleStream<FS_INPUT> triStream)
-{
-#ifdef CROSSBOARD_ON
-	Crossboard(p, triStream);
-#else
-	Grass(p, triStream);
-#endif
-}
diff --git a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/AssetShader.shader b/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/AssetShader.shader
deleted file mode 100644
index ffd60c96..00000000
--- a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/AssetShader.shader
+++ /dev/null
@@ -1,157 +0,0 @@
-Shader "Custom/AssetShader"
-{
-    Properties
-    {
-		[NoScaleOffset] _MainTex("Satellite / Coarse texture", 2D) = "white" {}
-    }
-    SubShader
-    {
-       Name "Deferred"
-		Tags
-		{ 
-			"Queue" = "Geometry" 
-			"RenderType" = "Opaque"
-			"LightMode" = "Deferred"
-		}
-
-		Cull Back
-		Blend Off
-        LOD 100
-
-        CGINCLUDE
-
-		#include "UnityCG.cginc"
-
-		#include "UnityGBuffer.cginc"
-		#include "UnityStandardUtils.cginc"
-		#include "UnityPBSLighting.cginc"
-
-		#pragma exclude_renderers nomrt
-		#pragma multi_compile __ NORMAL_TEXTURES_ON
-
-		#pragma target 5.0
-		#pragma multi_compile_prepassfinal noshadowmask nodynlightmap nodirlightmap nolightmap noshadow 
-
-        struct appdata
-        {
-            float4 position : POSITION;
-			float2 uv : TEXCOORD0;
-			float3 normal : NORMAL;
-			uint vertexID : SV_VertexID;  // System value for vertex ID
-        };
-
-        struct v2f
-        {
-            float4 position : SV_POSITION;
-			float2 uv : TEXCOORD0;
-			float3 normal : TEXCOORD2;
-			float4 worldPos : TEXCOORD3;
-        };
-
-		sampler2D _MainTex;
-		StructuredBuffer<float3> _NormalBuffer;
-
-        ENDCG
-
-        Pass
-        {
-            CGPROGRAM
-            #pragma vertex vert
-            #pragma fragment frag
-
-            v2f vert (appdata v)
-            {
-                v2f o;
-				o.position = UnityObjectToClipPos(v.position);
-				o.uv = v.uv;
-				o.normal = UnityObjectToWorldNormal(v.normal);
-				#ifdef NORMAL_TEXTURES_ON
-					o.normal = _NormalBuffer[v.vertexID];
-				#endif
-				o.worldPos = mul(unity_ObjectToWorld, v.position);
-                return o;
-            }
-
-			void frag(v2f i, out half4 outGBuffer0 : SV_Target0, out half4 outGBuffer1 : SV_Target1, out half4 outGBuffer2 : SV_Target2, out half4 outEmission : SV_Target3)
-			{
-				float4 satellite = tex2D(_MainTex, i.uv);
-				fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
-
-				clip(satellite.a - 0.5);
-
-				// ************ Set Deferred Buffer ************
-				
-				#ifdef UNITY_COMPILER_HLSL
-					SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0;
-				#else
-					SurfaceOutputStandardSpecular o;
-				#endif
-
-				o.Albedo = satellite.rgb;
-				o.Emission = 0.0f;
-				o.Alpha = satellite.a;
-				o.Occlusion = 1.0f;
-				o.Smoothness = 0.0f;
-				o.Specular = 0.0f;
-				o.Normal = i.normal;
-
-				// Setup lighting environment
-				UnityGI gi;
-				UNITY_INITIALIZE_OUTPUT(UnityGI, gi);
-				gi.indirect.diffuse = 0;
-				gi.indirect.specular = 0;
-				gi.light.color = 0;
-				gi.light.dir = fixed3(0, 1, 0);
-
-				// Call GI (lightmaps/SH/reflections) lighting function
-				UnityGIInput giInput;
-				UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);
-				giInput.light = gi.light;
-				giInput.worldPos = i.worldPos;
-				giInput.worldViewDir = worldViewDir;
-				giInput.atten = 1;
-				giInput.lightmapUV = 0.0;
-
-
-				#if UNITY_SHOULD_SAMPLE_SH
-					//giInput.ambient = IN.sh;
-				#else
-					giInput.ambient.rgb = 0.0;
-				#endif
-
-				giInput.probeHDR[0] = unity_SpecCube0_HDR;
-				giInput.probeHDR[1] = unity_SpecCube1_HDR;
-
-				#if defined( UNITY_SPECCUBE_BLENDING ) || defined( UNITY_SPECCUBE_BOX_PROJECTION )
-					giInput.boxMin[0] = unity_SpecCube0_BoxMin; // .w holds lerp value for blending
-				#endif
-
-				#ifdef UNITY_SPECCUBE_BOX_PROJECTION
-					giInput.boxMax[0] = unity_SpecCube0_BoxMax;
-					giInput.probePosition[0] = unity_SpecCube0_ProbePosition;
-					giInput.boxMax[1] = unity_SpecCube1_BoxMax;
-					giInput.boxMin[1] = unity_SpecCube1_BoxMin;
-					giInput.probePosition[1] = unity_SpecCube1_ProbePosition;
-				#endif
-
-				// Standard specular global illumination
-				LightingStandardSpecular_GI(o, giInput, gi);
-
-				// Call lighting function to output g-buffer
-				outEmission = LightingStandardSpecular_Deferred(o, worldViewDir, gi, outGBuffer0, outGBuffer1, outGBuffer2);
-				outGBuffer2.w = 0;
-
-				#ifndef UNITY_HDR_ON
-					outEmission.rgb = exp2(-outEmission.rgb);
-				#endif
-				
-			}
-
-            ENDCG
-        }
-
-		// ********* SHADOW CASTER PASS *********	
-
-		UsePass "Standard/SHADOWCASTER"
-    }
-}
diff --git a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/EnhancedTerrain.shader b/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/EnhancedTerrain.shader
deleted file mode 100644
index 84c78d51..00000000
--- a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/EnhancedTerrain.shader
+++ /dev/null
@@ -1,378 +0,0 @@
-/* 
- * Copyright (C) SAAB AB
- *
- * All rights, including the copyright, to the computer program(s) 
- * herein belong to Saab AB. The program(s) may be used and/or
- * copied only with the written permission of Saab AB, or in
- * accordance with the terms and conditions stipulated in the
- * agreement/contract under which the program(s) have been
- * supplied. 
- * 
- * Information Class:          COMPANY RESTRICTED
- * Defence Secrecy:            UNCLASSIFIED
- * Export Control:             NOT EXPORT CONTROLLED
- */
-
-Shader "Custom/EnhancedTerrain"
-{
-	Properties
-	{
-		_FeatureMap("Splatmap", 2D) = "white" {}
-		_SplatMapDimensions("Splatmap Dimensions", Vector) = (512, 512, 0, 0)
-		_MainTex("Satellite / Coarse texture", 2D) = "white" {}
-		_Textures("Textures", 2DArray) = "" {}
-		_NormalMaps("Normal maps", 2DArray) = "" {}
-		_HeightMaps("Height maps", 2DArray) = "" {}
-		_RoughnessMaps("Roughness maps", 2DArray) = "" {}
-		_Smoothness("Smoothness", Range(0.0, 1.0)) = 0
-		_RoughnessFallback("RoughnessFallback", Range(0.0, 1.0)) = 1
-		_HueShiftInclusion("HueShiftInclusion", Range(0.0, 1.0)) = 1
-		_SecondaryNormalIntensity("SecondaryNormalIntensity", Range(0.0, 1.0)) = 1
-		_TertiaryNormalIntensity("TertiaryNormalIntensity", Range(0.0, 1.0)) = 1
-
-		_DetailTextureFadeStart("Detail texture fade start distance", Range(0.0, 10000.0)) = 1
-		_DetailTextureFadeZoneLength("Detail texture fade zone length", Range(0.0, 100.0)) = 1
-	}
-
-	SubShader
-	{
-		Pass
-		{
-			Tags{ "LightMode" = "Deferred" }
-			CGPROGRAM
-
-			#pragma vertex VS
-			#pragma fragment FS
-
-			#pragma exclude_renderers nomrt
-			#pragma require 2darray
-
-			#pragma multi_compile __ DETAIL_TEXTURES_ON
-
-			#pragma multi_compile_prepassfinal
-
-			#define DEFERRED_PASS
-			#define PI 3.14159265358979323846264338327950
-
-			#include "UnityStandardUtils.cginc"
-			#include "UnityPBSLighting.cginc"
-
-			sampler2D _MainTex;
-			float _Smoothness;
-
-#ifdef DETAIL_TEXTURES_ON
-			sampler2D _FeatureMap;
-			float4 _FeatureMap_ST;
-			float _DetailTextureFadeStart;
-			float _DetailTextureFadeZoneLength;
-
-			StructuredBuffer<int> _MappingBuffer;
-
-			float2 _SplatMapDimensions;
-
-			UNITY_DECLARE_TEX2DARRAY(_Textures);
-			UNITY_DECLARE_TEX2DARRAY(_NormalMaps);
-			UNITY_DECLARE_TEX2DARRAY(_HeightMaps);
-			UNITY_DECLARE_TEX2DARRAY(_RoughnessMaps);
-
-			float _RoughnessFallback;
-			float _HueShiftInclusion;
-
-			float _SecondaryNormalIntensity;
-			float _TertiaryNormalIntensity;
-#endif
-
-			struct VertexData
-			{
-				float4 position : POSITION;
-				float2 uv : TEXCOORD0;
-				float4 normal : NORMAL;
-				float4 tangent : TANGENT;
-			};
-
-			struct Interpolators
-			{
-				float4 position : SV_POSITION;
-				float2 uv : TEXCOORD0;
-				float2 featureUV : TEXCOORD1;
-				float3 normal : TEXCOORD2;
-				float4 tangent : TEXCOORD3;
-				float4 worldPos : TEXCOORD4;
-			};
-
-			struct FragmentResult
-			{
-				float4 albedo : SV_Target0;
-				float4 specular : SV_Target1;
-				float4 normal : SV_Target2;
-				float4 ELLR : SV_Target3;
-			};
-
-			Interpolators VS(VertexData v)
-			{
-				Interpolators i;
-
-				i.position = UnityObjectToClipPos(v.position);
-#ifdef DETAIL_TEXTURES_ON
-				i.uv = TRANSFORM_TEX(v.uv, _FeatureMap);
-				i.uv *= 2;
-#endif
-
-				i.featureUV = v.uv;
-				i.normal = UnityObjectToWorldNormal(v.normal);
-				i.tangent = float4(UnityObjectToWorldDir(v.tangent), v.tangent.w);
-				i.worldPos = mul(unity_ObjectToWorld, v.position);
-
-				return i;
-			}
-
-#ifdef DETAIL_TEXTURES_ON
-			void SampleSplatMap(uint input, float2 uvCoord, float4 fallbackAlbedo, out float4 albedo, out float4 normal, out float height, out float roughness)
-			{
-				float textureIndex = _MappingBuffer[input] - 1;
-
-				float3 defaultAlbedo = fallbackAlbedo;
-				float4 defaultNormal = float4(1, 0.5, 1, 0.5);
-				float defaultHeight = 0.5;
-				float defaultRoughness = _RoughnessFallback;
-
-				//validSample = Use detail texture
-				//invalidSample = Use default values/satellite image
-				bool validSample = (textureIndex != -1);
-				bool invalidSample = !validSample;
-
-				float4 norm1 = UNITY_SAMPLE_TEX2DARRAY(_NormalMaps, float3(uvCoord, textureIndex));
-				float4 norm2 = UNITY_SAMPLE_TEX2DARRAY(_NormalMaps, float3(uvCoord * 2, textureIndex));
-				float4 norm3 = UNITY_SAMPLE_TEX2DARRAY(_NormalMaps, float3(uvCoord * 4, textureIndex));
-
-				float4 normalCombination = normalize(norm1 + (norm2 * 2 * _SecondaryNormalIntensity) + (norm3 * 4 * _TertiaryNormalIntensity));
-
-				albedo = float4(
-					validSample * UNITY_SAMPLE_TEX2DARRAY(_Textures, float3(uvCoord, textureIndex)).xyz +
-					invalidSample * defaultAlbedo,
-					1
-				);
-
-				normal =
-					validSample		* normalCombination +
-					invalidSample	* defaultNormal;
-
-				height =
-					validSample		* UNITY_SAMPLE_TEX2DARRAY(_HeightMaps, float3(uvCoord, textureIndex)) +
-					invalidSample	* defaultHeight;
-
-				roughness =
-					validSample		* UNITY_SAMPLE_TEX2DARRAY(_RoughnessMaps, float3(uvCoord, textureIndex)) +
-					invalidSample	* defaultRoughness;
-			}
-
-			void InterpolateSamplesHeight(
-				float2 interpolationFactor,
-				float4 texs[4],
-				float4 norms[4],
-				float heights[4],
-				float roughnesses[4],
-				out float4 albedo,
-				out float4 normal,
-				out float roughness)
-			{
-				float4 scalarIntermediate1 = lerp(float4(1, 0, 0, 0), float4(0, 1, 0, 0), interpolationFactor.x);
-				float4 scalarIntermediate2 = lerp(float4(0, 0, 1, 0), float4(0, 0, 0, 1), interpolationFactor.x);
-
-				float4 scalars = lerp(scalarIntermediate1, scalarIntermediate2, interpolationFactor.y);
-				float4 height = float4(heights[0], heights[1], heights[2], heights[3]) * scalars;
-
-				float4 strengths = float4(
-					(height.y <= height.x) && (height.z <= height.x) && (height.w <= height.x),
-					(height.x <= height.y) && (height.z <= height.y) && (height.w <= height.y),
-					(height.x <= height.z) && (height.y <= height.z) && (height.w <= height.z),
-					(height.x <= height.w) && (height.y <= height.w) && (height.z <= height.w)
-				);
-
-				strengths = length(strengths) == 0 ? float4(0, 0, 0, 1) : strengths;
-
-				albedo = texs[0] * strengths.x + texs[1] * strengths.y + texs[2] * strengths.z + texs[3] * strengths.w;
-				normal = norms[0] * strengths.x + norms[1] * strengths.y + norms[2] * strengths.z + norms[3] * strengths.w;
-				height = heights[0] * strengths.x + heights[1] * strengths.y + heights[2] * strengths.z + heights[3] * strengths.w;
-				roughness = roughnesses[0] * strengths.x + roughnesses[1] * strengths.y + roughnesses[2] * strengths.z + roughnesses[3] * strengths.w;
-			}
-
-			float3 TransformNormal(Interpolators i, float4 normal)
-			{
-				float3 faceNormal = normalize(i.normal);
-				float3 faceTangent = normalize(i.tangent.xyz);
-				float3 faceBinormal = normalize(cross(faceNormal, faceTangent) * (i.tangent.w * unity_WorldTransformParams.w));
-
-				float3 TangentSpaceNormal = UnpackNormal(normal);
-
-				return faceTangent * TangentSpaceNormal.x + faceBinormal * TangentSpaceNormal.y + faceNormal * TangentSpaceNormal.z;
-			}
-
-			// ********** using YIQ to shift **********
-			float3 HueShift(float3 col, float hueShift, float targetHue)
-			{
-				float3x3 RGB_YIQ = float3x3(
-					0.299, 0.587, 0.114,
-					0.5959, -0.2746, -0.3213,
-					0.2115, -0.5227, 0.3112
-				);
-
-				float3x3 YIQ_RGB = float3x3(
-					1, 0.956, 0.619,
-					1, -0.272, -0.647,
-					1, -1.106, 1.703
-				);
-
-				float brightness = 0;
-				float saturation = 1.5;
-
-				float3 YIQ = mul(RGB_YIQ, col);
-				float hue = atan2(YIQ.z, YIQ.y);
-
-				float shiftAmount = 1 - pow(saturate(YIQ.z), 10);
-				hueShift *= shiftAmount;
-
-				float hueDiff = targetHue - hue;
-
-				if (hueDiff > 0 || hueDiff < PI)
-					hueShift *= -1;
-
-				hue += hueShift;
-
-				// black and white
-				float chroma = length(float2(YIQ.y, YIQ.z)) * saturation;
-
-				float Y = YIQ.x + brightness;
-				float I = chroma * cos(hue);
-				float Q = chroma * sin(hue);
-
-				float3 shiftYIQ = float3(Y, I, Q);
-
-				return mul(YIQ_RGB, shiftYIQ);
-			}
-#endif
-
-			FragmentResult BuildFragmentResult(float4 detail, float3 specularTint, float smoothnessFinal, Interpolators i, float3 worldSpaceNormal)
-			{
-				FragmentResult result = (FragmentResult)0;
-
-				result.albedo = detail;
-				result.specular = float4(specularTint * smoothnessFinal, smoothnessFinal);
-
-#ifdef UNITY_COMPILER_HLSL
-				SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0;
-#else
-				SurfaceOutputStandardSpecular o;
-#endif
-
-				// Setup lighting environment
-				UnityGI gi;
-				UNITY_INITIALIZE_OUTPUT(UnityGI, gi);
-				gi.indirect.diffuse = 0;
-				gi.indirect.specular = 0;
-				gi.light.color = 0;
-				gi.light.dir = fixed3(0, 1, 0);
-
-				fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
-
-				// Call GI (lightmaps/SH/reflections) lighting function
-				UnityGIInput giInput;
-				UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);
-				giInput.light = gi.light;
-				giInput.worldPos = i.worldPos;
-				giInput.worldViewDir = worldViewDir;
-				giInput.atten = 1;
-				giInput.lightmapUV = 0.0;
-
-				o.Albedo = result.albedo.rgb;
-				o.Emission = 0.0f;
-				o.Alpha = result.albedo.a;
-				o.Occlusion = 1.0f;
-				o.Smoothness = 0.0f;
-				o.Specular = result.specular;
-
-				o.Normal = worldSpaceNormal;
-
-				// Standard specular global illumination
-				LightingStandardSpecular_GI(o, giInput, gi);
-
-				result.ELLR = LightingStandardSpecular_Deferred(o, worldViewDir, gi, result.albedo, result.specular, result.normal);
-#ifndef UNITY_HDR_ON
-				result.ELLR.rgb = exp2(-result.ELLR.rgb);
-#endif
-				return result;
-			}
-
-			float2 SnapToBottomLeftFeatureTexel(float2 featureCoordinate, float2 texelCoordinate, float2 texelSize)
-			{
-				float2 texelFraction = frac(texelCoordinate);
-				float2 texelCenterOffset = texelFraction - 0.5;
-				
-				return float2(
-					featureCoordinate.x + (
-						texelCenterOffset.x < 0 ?
-						-texelSize.x :
-						0
-					),
-					featureCoordinate.y + (
-						texelCenterOffset.y < 0 ?
-						-texelSize.y :
-						0
-					)
-				);
-			}
-
-			FragmentResult FS(Interpolators i)
-			{
-#ifdef DETAIL_TEXTURES_ON
-				float2 texelSize = float2(1 / _SplatMapDimensions.x, 1 / _SplatMapDimensions.y);
-				float2 texelCoordinate = _SplatMapDimensions.xy * i.featureUV.xy;
-
-				float2 bottomLeftTexel = SnapToBottomLeftFeatureTexel(i.featureUV, texelCoordinate, texelSize);
-
-				float splat1 = tex2D(_FeatureMap, bottomLeftTexel).r * 255;
-				float splat2 = tex2D(_FeatureMap, bottomLeftTexel + float2(texelSize.x, 0)).r * 255;
-				float splat3 = tex2D(_FeatureMap, bottomLeftTexel + float2(0, texelSize.y)).r * 255;
-				float splat4 = tex2D(_FeatureMap, bottomLeftTexel + float2(texelSize.x, texelSize.y)).r * 255;
-
-				float4 albedoSamples[4];
-				float4 normalSamples[4];
-				float heightSamples[4];
-				float roughnessSamples[4];
-#endif
-
-				float4 coarseColor = tex2D(_MainTex, i.featureUV);
-
-#ifdef DETAIL_TEXTURES_ON
-				SampleSplatMap((uint)splat1, i.uv, float4(1, 0, 1, 1), albedoSamples[0], normalSamples[0], heightSamples[0], roughnessSamples[0]);
-				SampleSplatMap((uint)splat2, i.uv, float4(1, 0, 1, 1), albedoSamples[1], normalSamples[1], heightSamples[1], roughnessSamples[1]);
-				SampleSplatMap((uint)splat3, i.uv, float4(1, 0, 1, 1), albedoSamples[2], normalSamples[2], heightSamples[2], roughnessSamples[2]);
-				SampleSplatMap((uint)splat4, i.uv, float4(1, 0, 1, 1), albedoSamples[3], normalSamples[3], heightSamples[3], roughnessSamples[3]);
-
-				float2 interpolationFactor = frac(texelCoordinate - 0.5);
-
-				float4 albedo;
-				float4 normal;
-				float roughnessFinal;
-
-				InterpolateSamplesHeight(interpolationFactor, albedoSamples, normalSamples, heightSamples, roughnessSamples, albedo, normal, roughnessFinal);
-
-				float smoothnessFinal = _Smoothness * (1 - roughnessFinal);
-
-				//Tangentspace -> Worldspace
-				float3 worldSpaceNormal = TransformNormal(i, normal);
-
-				// ********* Hue shift *********
-				float4 hue = float4(HueShift(coarseColor, PI / 4, 0), 1);
-				float4 detail = lerp(lerp(coarseColor, hue, albedo.g), coarseColor, 1 - _HueShiftInclusion);
-
-				return BuildFragmentResult(detail, _LightColor0.rgb, smoothnessFinal, i, worldSpaceNormal);
-#else
-				return BuildFragmentResult(coarseColor, _LightColor0.rgb, _Smoothness, i, float3(0, 1, 0));
-#endif
-			}
-
-			ENDCG
-		}
-	}
-}
\ No newline at end of file
diff --git a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/NormalMapGenerator.compute b/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/NormalMapGenerator.compute
deleted file mode 100644
index 1ee05631..00000000
--- a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/NormalMapGenerator.compute
+++ /dev/null
@@ -1,76 +0,0 @@
-// Compute Shader to Calculate Normals Per Vertex
-
-#pragma kernel CSMain
-
-// Structured buffer to hold vertex positions (float3)
-StructuredBuffer<float3> vertexPositions;
-
-// Structured buffer to hold triangle indices (int3)
-StructuredBuffer<int3> triangleIndices;
-
-// RWBuffer for storing calculated vertex normals
-RWStructuredBuffer<float3> vertexNormals;
-
-int numVertices;
-int triangleIndicesLength;
-
-// Helper function to compute the normal for a triangle
-float3 CalculateTriangleNormal(float3 v0, float3 v1, float3 v2)
-{
-    float3 edge1 = v1 - v0;
-    float3 edge2 = v2 - v0;
-    return normalize(cross(edge1, edge2));
-}
-
-[numthreads(64, 1, 1)]
-void CSMain(uint id : SV_DispatchThreadID)
-{
-    if (id >= numVertices)
-    {
-        return;
-    }
-
-    // Initialize normal sum and adjacent triangle counter
-    float3 normalSum = float3(0.0f, 0.0f, 0.0f);
-    int adjacentTriangles = 0;
-    
-    // Angle threshold to filter out steep angles (30 degrees in this example)
-    float angleThreshold = cos(radians(30.0f));
-
-    // Loop through all triangles to find those that use this vertex
-    for (int i = 0; i < triangleIndicesLength; i++)
-    {
-        int3 indices = triangleIndices[i];
-
-        // Check if the current vertex ID is one of the vertices of this triangle
-        if (indices.x == id || indices.y == id || indices.z == id)
-        {
-            // Read the corresponding vertex positions using the indices
-            float3 v0 = vertexPositions[indices.x];
-            float3 v1 = vertexPositions[indices.y];
-            float3 v2 = vertexPositions[indices.z];
-
-            // Compute the normal for this triangle
-            float3 triangleNormal = CalculateTriangleNormal(v0, v1, v2);
-
-            // Calculate the angle between the triangle normal and the accumulated normal sum
-            if (adjacentTriangles == 0 || dot(normalize(triangleNormal), normalize(normalSum)) > angleThreshold)
-            {
-                // Add the triangle normal to the normal sum
-                normalSum += triangleNormal;
-                adjacentTriangles++;
-            }
-            
-
-        }
-    }
-
-    float3 finalNormal = float3(1.0f, 0.0f, 0.0f);
-    
-    // Normalize the final normal
-    if (adjacentTriangles != 0)
-        finalNormal = normalize(normalSum / adjacentTriangles);
-
-    // Store the final normal in the output buffer
-    vertexNormals[id] = finalNormal;
-}
diff --git a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/TerrainShader.shader b/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/TerrainShader.shader
deleted file mode 100644
index 3969e7ca..00000000
--- a/com.saab.map-streamer/Runtime/Shaders/TerrainDetailTextures/TerrainShader.shader
+++ /dev/null
@@ -1,404 +0,0 @@
-Shader "Custom/TerrainShader"
-{
-    Properties
-    {
-        [NoScaleOffset] _FeatureMap("Splatmap", 2D) = "black" {}
-		[NoScaleOffset] _MainTex("Satellite / Coarse texture", 2D) = "white" {}
-
-		_BumpScale("Main Bump scale", float) = 10
-		_WaterSmoothness("Water Smoothness", float) = 0.96
-		_DetailBumpScale("Detail Bump scale", float) = 10
-		_Detail("Texture Detail (tieling)", float) = 0.07
-    }
-    SubShader
-    {
-       Name "Deferred"
-		Tags
-		{ 
-			"Queue" = "Geometry" 
-			"RenderType" = "Opaque"
-			"LightMode" = "Deferred"
-		}
-
-		Cull Back
-		Blend Off
-        LOD 100
-
-        CGINCLUDE
-
-		#include "UnityCG.cginc"
-		#include "UnityGBuffer.cginc"
-		#include "UnityStandardUtils.cginc"
-		#include "UnityPBSLighting.cginc"
-
-        #define PI 3.14159265358979323846264338327950
-
-		#pragma multi_compile __ NORMAL_TEXTURES_ON
-
-		#pragma exclude_renderers nomrt addshadow
-		#pragma require 2darray
-
-		#pragma target 5.0
-		#pragma multi_compile_prepassfinal noshadowmask nodynlightmap nodirlightmap nolightmap noshadow 
-
-        struct appdata
-        {
-            float4 position : POSITION;
-			float2 uv : TEXCOORD0;
-			float3 normal : NORMAL;
-			float4 tangent : TANGENT;
-			uint vertexID : SV_VertexID;  // System value for vertex ID
-        };
-
-        struct v2f
-        {
-            float4 position : SV_POSITION;
-			float2 uv : TEXCOORD0;
-			float3 normal : TEXCOORD2;
-			float4 tangent : TEXCOORD3;
-			float4 worldPos : TEXCOORD4;
-        };
-
-		struct FragmentResult
-		{
-			float4 albedo : SV_Target0;
-			float4 specular : SV_Target1;
-			float4 normal : SV_Target2;
-			float4 ELLR : SV_Target3;
-		};
-
-		// ********** using YIQ to shift **********
-		// Using YIQ to shift hue
-		float3 HueShift(float3 col, float hueShift, float targetHue)
-		{
-			// Convert RGB to YIQ
-			float3x3 RGB_YIQ = float3x3(
-				0.299, 0.587, 0.114,
-				0.595716, -0.274453, -0.321263,
-				0.211456, -0.522591, 0.311135
-			);
-
-			// Convert YIQ to RGB
-			float3x3 YIQ_RGB = float3x3(
-				1.0, 0.9563, 0.6210,
-				1.0, -0.2721, -0.6474,
-				1.0, -1.1070, 1.7046
-			);
-
-			// Compute the YIQ values from the RGB input
-			float3 YIQ = mul(RGB_YIQ, col);
-			float hue = atan2(YIQ.z, YIQ.y);
-
-			// Shift hue towards target hue
-			float hueDiff = targetHue - hue;
-
-			// Correct hue wrap-around if Q is negative
-			if (YIQ.z > 0) {
-				if (hueDiff > 3.14159)
-					hueDiff -= 2 * 3.14159;
-				else if (hueDiff < -3.14159)
-					hueDiff += 2 * 3.14159;
-			}
-
-			// Apply hue shift without overshooting target hue
-			hue += hueShift * sign(hueDiff) * min(abs(hueDiff), abs(hueShift));
-
-			// Ensure hue wraps around properly
-			hue = fmod(hue + 2 * 3.14159, 2 * 3.14159);
-
-			// Recompute I and Q based on the new hue and original chroma
-			float chroma = length(float2(YIQ.y, YIQ.z));
-			float Y = YIQ.x; // Preserving brightness
-			float I = chroma * cos(hue);
-			float Q = chroma * sin(hue);
-
-			// Convert back to RGB
-			float3 shiftYIQ = float3(Y, I, Q);
-			return mul(YIQ_RGB, shiftYIQ);
-		}
-
-		float3 HueShiftColor(float3 col, float hueShift, float3 targetColor)
-		{
-			if(length(targetColor) <= 0.01 || length(targetColor) >= 1.7)
-				return col;
-
-			// Convert RGB to YIQ for both source and target colors
-			float3x3 RGB_YIQ = float3x3(
-				0.299, 0.587, 0.114,
-				0.595716, -0.274453, -0.321263,
-				0.211456, -0.522591, 0.311135
-			);
-
-			float3x3 YIQ_RGB = float3x3(
-				1.0, 0.9563, 0.6210,
-				1.0, -0.2721, -0.6474,
-				1.0, -1.1070, 1.7046
-			);
-
-			// Compute the YIQ values from the RGB input and target
-			float3 YIQ = mul(RGB_YIQ, col);
-			float3 targetYIQ = mul(RGB_YIQ, targetColor);
-
-			// Extract hue and saturation from YIQ
-			float hue = atan2(YIQ.z, YIQ.y);
-			float targetHue = atan2(targetYIQ.z, targetYIQ.y);
-			float saturation = length(float2(YIQ.y, YIQ.z));
-			float targetSaturation = length(float2(targetYIQ.y, targetYIQ.z));
-
-			// Avoid shifting hue when saturation is too low (grayscale colors)
-			if (saturation > 0.001 && YIQ.z < 0)
-			{
-				// Compute hue and saturation differences
-				float hueDiff = targetHue - hue;
-				float satDiff = targetSaturation - saturation;
-
-				// Correct for wrap-around
-				if (hueDiff > PI) hueDiff -= 2.0 * PI;
-				else if (hueDiff < -PI) hueDiff += 2.0 * PI;
-
-				// Apply hue shift smoothly
-				hue += hueShift * hueDiff / (abs(hueDiff) + 1e-5); // Prevent division by zero
-				saturation = lerp(saturation, targetSaturation, 0.1); // Smooth transition
-
-				// Ensure hue wraps around properly and saturation is clamped
-				hue = fmod(hue + 2.0 * PI, 2.0 * PI);
-				saturation = clamp(saturation, 0.0, 1.0);
-			}
-			else
-			{
-				// If saturation is too low, avoid shifting and keep I/Q minimal
-				hue = 0.0;
-				saturation = 0.0;
-			}
-
-			// Recompute I and Q based on the new hue and adjusted saturation
-			float I = saturation * cos(hue);
-			float Q = saturation * sin(hue);
-			float Y = YIQ.x;  // Preserve brightness
-
-			// Convert back to RGB
-			float3 shiftYIQ = float3(Y, I, Q);
-			return mul(YIQ_RGB, shiftYIQ);
-		}
-
-		float3 TransformNormal(v2f i, float3 normal)
-		{
-			float3 faceNormal = normalize(i.normal);
-			float3 faceTangent = normalize(i.tangent.xyz);
-			float3 faceBinormal = normalize(cross(faceNormal, faceTangent) * (i.tangent.w * unity_WorldTransformParams.w));
-
-			float3 TangentSpaceNormal = normal;// UnpackNormal(normal);
-
-			return faceTangent * TangentSpaceNormal.x + faceBinormal * TangentSpaceNormal.y + faceNormal * TangentSpaceNormal.z;
-		}
-
-		sampler2D _FeatureMap;
-		sampler2D _MainTex;
-	
-		float3 _WorldOffset;
-		float4 _TargetTerrainColor;
-
-		float _BumpScale, _DetailBumpScale, _Detail;
-		float _HueShift;
-		float _WaterSmoothness;
-
-		StructuredBuffer<int> _MappingBuffer;
-		StructuredBuffer<float3> _NormalBuffer;
-
-		int _WaterIndex;
-		float3 _Ambient;
-		float3 _WindVector;
-
-        UNITY_DECLARE_TEX2DARRAY(_Textures);
-		UNITY_DECLARE_TEX2DARRAY(_NormalMaps);
-
-        ENDCG
-
-        Pass
-        {
-            CGPROGRAM
-            #pragma vertex vert
-            #pragma fragment frag
-
-            v2f vert (appdata v)
-            {
-                v2f o;
-				o.position = UnityObjectToClipPos(v.position);
-				o.uv = v.uv;
-				o.normal = UnityObjectToWorldNormal(v.normal);
-				#ifdef NORMAL_TEXTURES_ON
-					o.normal = _NormalBuffer[v.vertexID];
-				#endif
-				o.tangent = float4(UnityObjectToWorldDir(v.tangent), v.tangent.w);
-				o.worldPos = mul(unity_ObjectToWorld, v.position);
-                return o;
-            }
-
-			void frag(v2f i, out half4 outGBuffer0 : SV_Target0, out half4 outGBuffer1 : SV_Target1, out half4 outGBuffer2 : SV_Target2, out half4 outEmission : SV_Target3)
-			{
-				float3 worldPos = (i.worldPos + _WorldOffset) % 1024;
-
-				uint feature = (uint)(tex2D(_FeatureMap, i.uv) * 255.0);
-
-				float2 textureScrolling = 0;
-
-				float3 satellite = tex2D(_MainTex, i.uv);
-
-				float3 color = HueShiftColor(satellite.rgb, _HueShift, _TargetTerrainColor.rgb);
-				
-
-				int mappingIndex = _MappingBuffer[feature];
-				if(mappingIndex == 0)
-				{
-					// invalid pixel skip 
-				}
-				else
-				{
-					mappingIndex -= 1;
-				}
-
-				if(feature == _WaterIndex)
-				{
-					textureScrolling = _Time.y * _WindVector.xy * _WindVector.z * 0.005 + 0.1;
-				}
-
-				fixed4 col = UNITY_SAMPLE_TEX2DARRAY(_Textures, float3(abs(0.005 * worldPos.xz + textureScrolling ) % 1, mappingIndex));
-				float3 finalColor = lerp(satellite.rgb, color.rgb, saturate(col.g * 2));
-
-				float scale = 1 - (length(i.worldPos) / _ProjectionParams.z);
-				
-				if(feature == _WaterIndex)
-				{
-					//-------- enhanced Water stuff... --------
-					color = HueShiftColor(satellite.rgb, _HueShift, float3(0.45,0.79,0.95));
-
-					float brightness = (0.299 * satellite.r + 0.587 * satellite.g + 0.114 * satellite.b) * 0.5 + 0.5;
-
-					float3 lightblue = brightness * float3(0.14, 0.42, 0.46);
-					float3 darkblue = brightness * float3(0.05 ,0.26, 0.45);
-					float3 waterColor = lerp(darkblue.rgb, lightblue.rgb, saturate(col.g * (_SinTime.z * 0.3 + 0.70) * 3));
-					
-					//finalColor = waterColor;
-					finalColor =  lerp(waterColor, satellite.rgb, 0.96);
-
-					_Detail = _Detail * 0.75;
-					_BumpScale *= 0.5;
-					_DetailBumpScale *= 0.5;
-				}
-
-				fixed3 normalDetail = UnpackScaleNormal(UNITY_SAMPLE_TEX2DARRAY(_NormalMaps, float3(abs(_Detail * worldPos.xz * 0.134  + textureScrolling) % 1, mappingIndex)), _DetailBumpScale);
-				fixed3 normalMain = UnpackScaleNormal(UNITY_SAMPLE_TEX2DARRAY(_NormalMaps, float3(abs(_Detail * worldPos.xz + textureScrolling * 0.0015 ) % 1, mappingIndex)), _BumpScale);
-				
-				float3 normalBlend = BlendNormals(normalMain, normalDetail);
-
-				if(feature == _WaterIndex)
-				{
-					fixed3 normalExtra = UnpackScaleNormal(UNITY_SAMPLE_TEX2DARRAY(_NormalMaps, float3(abs(_Detail * worldPos.xz * 0.005 + textureScrolling * 2) % 1, mappingIndex)), 0.02);
-					normalBlend =BlendNormals(normalBlend, normalExtra);
-				}
-
-				float3 finalnormal = TransformNormal(i, normalize(normalBlend));
-				fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
-
-				float3 viewDir = normalize(_WorldSpaceCameraPos - i.worldPos);
-				float fresnel = pow(1.0 - saturate(dot(viewDir, finalnormal)), 5.0);
-				fresnel = lerp(0, 0.1, fresnel); // Limits range of effect
-				//o.Specular += fresnel * _FresnelStrength;
-
-
-				float3 sunDir = normalize(_WorldSpaceLightPos0.xyz);
-				float sunHeight = saturate(sunDir.y); // 0 = horizon, 1 = directly overhead
-				float sunFade = smoothstep(0.05, 0.15, sunHeight); // Fades in above horizon
-				sunFade = clamp(0.01, 1, sunFade);
-				float3 halfVector = normalize(sunDir + viewDir);
-
-				float spec = pow(saturate(dot(finalnormal, halfVector)), 900); // Try 400�1000
-				float glint = spec * sunFade * 1; // Try 1.0�3.0
-	
-				// ************ Set Deferred Buffer ************
-				
-				#ifdef UNITY_COMPILER_HLSL
-					SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0;
-				#else
-					SurfaceOutputStandardSpecular o;
-				#endif
-
-				o.Albedo = finalColor;
-				o.Emission = 0;
-				o.Alpha = col.a;
-				o.Occlusion = 1.0f;
-				o.Smoothness = 0.0f;
-				o.Specular = 0.0f;
-				if(feature == _WaterIndex)
-				{
-					// -------- enhanced Water stuff... --------
-					o.Specular = float3(0.02, 0.02, 0.02) + fresnel; // Realistic base reflectance for water
-					o.Smoothness = _WaterSmoothness;
-
-					o.Specular *= sunFade;
-					o.Smoothness *= sunFade;
-
-					o.Emission = glint;
-				}			
-				o.Normal = finalnormal;
-
-				// Setup lighting environment
-				UnityGI gi;
-				UNITY_INITIALIZE_OUTPUT(UnityGI, gi);
-				gi.indirect.diffuse = 0;
-				gi.indirect.specular = 0;
-				gi.light.color = 0;
-				gi.light.dir = fixed3(0, 1, 0);
-
-				// Call GI (lightmaps/SH/reflections) lighting function
-				UnityGIInput giInput;
-				UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);
-				giInput.light = gi.light;
-				giInput.worldPos = i.worldPos;
-				giInput.worldViewDir = worldViewDir;
-				giInput.atten = 1;
-				giInput.lightmapUV = 0.0;
-
-
-				#if UNITY_SHOULD_SAMPLE_SH
-					//giInput.ambient = IN.sh;
-				#else
-					giInput.ambient.rgb = 0.0;
-				#endif
-
-				giInput.probeHDR[0] = unity_SpecCube0_HDR;
-				giInput.probeHDR[1] = unity_SpecCube1_HDR;
-
-				#if defined( UNITY_SPECCUBE_BLENDING ) || defined( UNITY_SPECCUBE_BOX_PROJECTION )
-					giInput.boxMin[0] = unity_SpecCube0_BoxMin; // .w holds lerp value for blending
-				#endif
-
-				#ifdef UNITY_SPECCUBE_BOX_PROJECTION
-					giInput.boxMax[0] = unity_SpecCube0_BoxMax;
-					giInput.probePosition[0] = unity_SpecCube0_ProbePosition;
-					giInput.boxMax[1] = unity_SpecCube1_BoxMax;
-					giInput.boxMin[1] = unity_SpecCube1_BoxMin;
-					giInput.probePosition[1] = unity_SpecCube1_ProbePosition;
-				#endif
-
-				// Standard specular global illumination
-				LightingStandardSpecular_GI(o, giInput, gi);
-
-				// Call lighting function to output g-buffer
-				outEmission = LightingStandardSpecular_Deferred(o, worldViewDir, gi, outGBuffer0, outGBuffer1, outGBuffer2);
-				outGBuffer2.w = 0;
-
-				#ifndef UNITY_HDR_ON
-					outEmission.rgb = exp2(-outEmission.rgb);
-				#endif
-				
-			}
-
-            ENDCG
-        }
-
-		// ********* SHADOW CASTER PASS *********	
-
-		UsePass "Standard/SHADOWCASTER"
-    }
-}
diff --git a/com.saab.map-streamer/package.json b/com.saab.map-streamer/package.json
deleted file mode 100644
index 393cb9c3..00000000
--- a/com.saab.map-streamer/package.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "name": "com.saab.map-streamer",
-  "version": "0.1.0",
-  "displayName": "map-streamer",
-  "description": "todo",
-  "unity": "2023.3",
-  "author": {
-    "name": "SAAB AB"
-  }
-}
\ No newline at end of file
diff --git a/config.xml b/config.xml
new file mode 100644
index 00000000..cfff6ca9
--- /dev/null
+++ b/config.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generic Configuration for Unity -->
+<Unity>
+  <GfxCaps>
+    <!-- *********************************************
+            UseGeneralShaders           => 1    
+            UseTreeCrossboards          => 2
+            UseDynamicTreeCrossboards   => 4 
+            UseDynamicGrassCrossboards  => 8
+            UseFoliageCrossboards       => 16
+        ***********************************************-->
+        <CurrentCaps>48</CurrentCaps>
+        <Grass>
+            <Density info="Density of Dynamic grass (distance in meters)">0.15</Density>
+            <DrawDistance info="DrawDistance for grass">250</DrawDistance>
+        </Grass>
+        <Tree>
+            <Density info="Density of Dynamic Tree (distance in meters)">15.0</Density>
+            <DrawDistance info="DrawDistance for Tree">4000</DrawDistance>
+        </Tree>
+        <Foliage>
+            <Density info="Density of Foliage">0.15</Density>
+            <DrawDistance info="DrawDistance for Tree">5000</DrawDistance>
+            <Shadows info="foliage cast shadows">true</Shadows>
+        </Foliage>
+  </GfxCaps>
+
+  <!--<SceneManager>
+    <MapUrl>C:\Maps\3D\map.gzd</MapUrl>
+  </SceneManager>-->
+
+  <GizmoSDK>
+    <!-- GIZMO_PATH is a comma (,) or semi (;) separated list with abs or relative directories -->
+    <GIZMO_PATH>.;textures</GIZMO_PATH>
+
+    <!-- GIZMO_CACHE_PATH is an absolute directory -->
+    <!--<GIZMO_CACHE_PATH>c:\GizmoCache</GIZMO_CACHE_PATH>-->
+  </GizmoSDK>
+
+</Unity>
\ No newline at end of file
diff --git a/junction_libs.bat b/junction_libs.bat
new file mode 100644
index 00000000..f6a5968b
--- /dev/null
+++ b/junction_libs.bat
@@ -0,0 +1,37 @@
+rem ---- DONT RUN THIS as a GIT USER, No need --------------------------------
+rem ---- Set up all paths in the project as relative paths - Saab Dev Only ---
+
+rmdir /S /Q Assets\Saab
+mkdir Assets\Saab
+
+
+mkdir Assets\Saab\Foundation
+mkdir Assets\Saab\Utility
+
+
+rem ---- Added a specific folder in Unity projects to reflect our architecture ---
+
+mkdir Assets\Saab\Unity\Foundation
+mkdir Assets\Saab\Unity\Utility
+
+rem ------------- End of GizmoSDK dependencies -------------------
+
+mklink /J Assets\Saab\Foundation\Saab.Foundation.Map.Manager 	%BTA%\source\foundation\Saab.Foundation.Map\Saab.Foundation.Map.Manager
+mklink /J Assets\Saab\Utility\Saab.Utility.GfxCaps		%BTA%\source\utility\Saab.Utility.GfxCaps
+
+rem ---------------- Link in Unity projects -----------------------------
+
+mklink /J Assets\Saab\Unity\Foundation\Saab.Foundation.Unity.Mapstreamer 		%BTA%\Source\Foundation\Unity\Saab.Foundation.Unity.Mapstreamer
+mklink /J Assets\Saab\Unity\Foundation\Saab.Foundation.Unity.Mapstreamer.Modules	%BTA%\Source\Foundation\Unity\Saab.Foundation.Unity.Mapstreamer.Modules
+mklink /J Assets\Saab\Unity\Foundation\Saab.Foundation.Unity.NodeProperties 		%BTA%\Source\Foundation\Unity\Saab.Foundation.Unity.NodeProperties
+mklink /J Assets\Saab\Unity\Utility\Saab.Utility.Unity.NodeUtils 			%BTA%\source\Utility\Unity\Saab.Utility.Unity.NodeUtils
+
+
+rem ---------------- Shaders -------------------------------------------------
+
+rmdir /S / Q Assets\Shaders
+mklink /J Assets\Shaders 							%BTA%\resources\shaders
+
+
+exit
+
diff --git a/junction_libs_debug.bat b/junction_libs_debug.bat
new file mode 100644
index 00000000..345dfa17
--- /dev/null
+++ b/junction_libs_debug.bat
@@ -0,0 +1,52 @@
+rem ---- DONT RUN THIS as a GIT USER, No need --------------------------------
+rem ---- Set up all paths in the project as relative paths - Saab Dev Only ---
+
+rmdir /S /Q Assets\Saab
+mkdir Assets\Saab
+
+rem ------------- runtime dlls -----------------------------------------------
+
+REM rmdir /S /Q Assets\Plugins\x86
+REM rmdir /S /Q Assets\Plugins\x86_64
+rmdir /S /Q Assets\Plugins\Android\Libs
+
+mkdir Assets\Plugins\Android\Libs
+
+rem ............. plugin selections -----------------------------------------
+
+REM mklink /J Assets\Plugins\x86                	%GIZMOSDK%\build\ws\vs16\GizmoSDK_Unity_Libs\Debug
+REM mklink /J Assets\Plugins\x86_64                	%GIZMOSDK%\build\ws\vs16\GizmoSDK_Unity_Libs\x64\Debug
+REM mklink /J Assets\Plugins\Android\Libs\armeabi-v7a 	%GIZMOSDK%\build\ws\vs16\GizmoSDK_Unity_Libs\ARM\Debug
+REM mklink /J Assets\Plugins\Android\Libs\arm64-v8a     %GIZMOSDK%\build\ws\vs16\GizmoSDK\ARM64\Debug
+REM mklink /J Assets\Plugins\Android\Libs\x86         	%GIZMOSDK%\build\ws\vs16\GizmoSDK_Unity_Libs\x86\Debug
+
+mkdir Assets\Saab\Foundation
+mkdir Assets\Saab\Utility
+
+
+rem ---- Added a specific folder in Unity projects to reflect our architecture ---
+
+mkdir Assets\Saab\Unity\Foundation
+mkdir Assets\Saab\Unity\Utility
+
+rem ------------- End of GizmoSDK dependencies -------------------
+
+mklink /J Assets\Saab\Foundation\Saab.Foundation.Map.Manager 			%BTA%\source\foundation\Saab.Foundation.Map\Saab.Foundation.Map.Manager
+mklink /J Assets\Saab\Utility\Saab.Utility.GfxCaps				%BTA%\source\utility\Saab.Utility.GfxCaps
+
+rem ---------------- Link in Unity projects -----------------------------
+
+mklink /J Assets\Saab\Unity\Foundation\Saab.Foundation.Unity.Mapstreamer 		%BTA%\Source\Foundation\Unity\Saab.Foundation.Unity.Mapstreamer
+mklink /J Assets\Saab\Unity\Foundation\Saab.Foundation.Unity.Mapstreamer.Modules	%BTA%\Source\Foundation\Unity\Saab.Foundation.Unity.Mapstreamer.Modules
+mklink /J Assets\Saab\Unity\Foundation\Saab.Foundation.Unity.NodeProperties 		%BTA%\Source\Foundation\Unity\Saab.Foundation.Unity.NodeProperties
+mklink /J Assets\Saab\Unity\Utility\Saab.Utility.Unity.NodeUtils 			%BTA%\source\Utility\Unity\Saab.Utility.Unity.NodeUtils
+
+
+rem ---------------- Shaders -------------------------------------------------
+
+rmdir /S / Q Assets\Shaders
+mklink /J Assets\Shaders 							%BTA%\resources\shaders
+
+
+exit
+
diff --git a/maps.txt b/maps.txt
new file mode 100644
index 00000000..daab8338
--- /dev/null
+++ b/maps.txt
@@ -0,0 +1,12 @@
+http://gizmosdk.blob.core.windows.net/maps/skillingaryd/map.gzd?nic=${wlan0}
+http://gizmosdk.blob.core.windows.net/maps/eksjo/map.gzd
+http://gizmosdk.blob.core.windows.net/maps/stock/map.gzd (new)
+
+// Other resources
+purl:maps?nic=${wlan0},sweden\eksjo\data\map.gzd
+purl:maps?nic=${wlan0},sweden\smaland\data\rapid.gzd
+
+// Local files
+Maps/jkg_small/roi.gzl
+Maps\Sweden\Eksjo\data\map.gzd
+C:\Maps\swe_kungsangen_eval\vricon_3d_terrain_model_collada\processed\map.gzd
\ No newline at end of file
diff --git a/projects/com.saab.map-streamer/.gitignore b/projects/com.saab.map-streamer/.gitignore
deleted file mode 100644
index 77f34058..00000000
--- a/projects/com.saab.map-streamer/.gitignore
+++ /dev/null
@@ -1,70 +0,0 @@
-# This .gitignore file should be placed at the root of your Unity project directory
-
-!*.meta
-
-!/[Pp]ackages/*
-/[Ll]ibrary/
-/[Tt]emp/
-/[Oo]bj/
-/[Bb]uild/
-/[Bb]uilds/
-/[Ll]ogs/
-/[Rr]esults/
-/[Uu]ser[Ss]ettings/
-
-# MemoryCaptures can get excessive in size.
-# They also could contain extremely sensitive data
-/[Mm]emoryCaptures/
-
-# Uncomment this line if you wish to ignore the asset store tools plugin
-# /[Aa]ssets/AssetStoreTools*
-
-# Autogenerated Jetbrains Rider plugin
-/[Aa]ssets/Plugins/Editor/JetBrains*
-
-# Visual Studio cache directory
-.vs/
-
-# Gradle cache directory
-.gradle/
-
-# Autogenerated VS/MD/Consulo solution and project files
-ExportedObj/
-.consulo/
-*.csproj
-*.unityproj
-*.sln
-*.suo
-*.tmp
-*.user
-*.userprefs
-*.pidb
-*.booproj
-*.svd
-*.pdb
-*.mdb
-*.opendb
-*.VC.db
-
-# Unity3D generated meta files
-*.pidb.meta
-*.pdb.meta
-*.mdb.meta
-
-# Unity3D generated file on crash reports
-sysinfo.txt
-
-# Builds
-*.apk
-*.aab
-*.unitypackage
-
-# Crashlytics generated file
-crashlytics-build.properties
-
-# Packed Addressables
-/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin*
-
-# Temporary auto-generated Android Assets
-/[Aa]ssets/[Ss]treamingAssets/aa.meta
-/[Aa]ssets/[Ss]treamingAssets/aa/*
diff --git a/projects/com.saab.map-streamer/Assets/Scenes/ExampleScene.unity b/projects/com.saab.map-streamer/Assets/Scenes/ExampleScene.unity
deleted file mode 100644
index 62bf522a..00000000
--- a/projects/com.saab.map-streamer/Assets/Scenes/ExampleScene.unity
+++ /dev/null
@@ -1,522 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!29 &1
-OcclusionCullingSettings:
-  m_ObjectHideFlags: 0
-  serializedVersion: 2
-  m_OcclusionBakeSettings:
-    smallestOccluder: 5
-    smallestHole: 0.25
-    backfaceThreshold: 100
-  m_SceneGUID: 00000000000000000000000000000000
-  m_OcclusionCullingData: {fileID: 0}
---- !u!104 &2
-RenderSettings:
-  m_ObjectHideFlags: 0
-  serializedVersion: 9
-  m_Fog: 0
-  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
-  m_FogMode: 3
-  m_FogDensity: 0.01
-  m_LinearFogStart: 0
-  m_LinearFogEnd: 300
-  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
-  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
-  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
-  m_AmbientIntensity: 1
-  m_AmbientMode: 0
-  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
-  m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
-  m_HaloStrength: 0.5
-  m_FlareStrength: 1
-  m_FlareFadeSpeed: 3
-  m_HaloTexture: {fileID: 0}
-  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
-  m_DefaultReflectionMode: 0
-  m_DefaultReflectionResolution: 128
-  m_ReflectionBounces: 1
-  m_ReflectionIntensity: 1
-  m_CustomReflection: {fileID: 0}
-  m_Sun: {fileID: 705507994}
-  m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1}
-  m_UseRadianceAmbientProbe: 0
---- !u!157 &3
-LightmapSettings:
-  m_ObjectHideFlags: 0
-  serializedVersion: 12
-  m_GIWorkflowMode: 1
-  m_GISettings:
-    serializedVersion: 2
-    m_BounceScale: 1
-    m_IndirectOutputScale: 1
-    m_AlbedoBoost: 1
-    m_EnvironmentLightingMode: 0
-    m_EnableBakedLightmaps: 1
-    m_EnableRealtimeLightmaps: 0
-  m_LightmapEditorSettings:
-    serializedVersion: 12
-    m_Resolution: 2
-    m_BakeResolution: 40
-    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: 1
-    m_PVRSampling: 1
-    m_PVRDirectSampleCount: 32
-    m_PVRSampleCount: 500
-    m_PVRBounces: 2
-    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_PVRFilteringAtrousPositionSigmaDirect: 0.5
-    m_PVRFilteringAtrousPositionSigmaIndirect: 2
-    m_PVRFilteringAtrousPositionSigmaAO: 1
-    m_ExportTrainingData: 0
-    m_TrainingDataDestination: TrainingData
-    m_LightProbeSampleCountMultiplier: 4
-  m_LightingDataAsset: {fileID: 0}
-  m_LightingSettings: {fileID: 0}
---- !u!196 &4
-NavMeshSettings:
-  serializedVersion: 2
-  m_ObjectHideFlags: 0
-  m_BuildSettings:
-    serializedVersion: 2
-    agentTypeID: 0
-    agentRadius: 0.5
-    agentHeight: 2
-    agentSlope: 45
-    agentClimb: 0.4
-    ledgeDropHeight: 0
-    maxJumpAcrossDistance: 0
-    minRegionArea: 2
-    manualCellSize: 0
-    cellSize: 0.16666667
-    manualTileSize: 0
-    tileSize: 256
-    accuratePlacement: 0
-    maxJobWorkers: 0
-    preserveTilesOutsideBounds: 0
-    debug:
-      m_Flags: 0
-  m_NavMeshData: {fileID: 0}
---- !u!1 &44396058
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 44396061}
-  - component: {fileID: 44396060}
-  - component: {fileID: 44396059}
-  - component: {fileID: 44396063}
-  - component: {fileID: 44396062}
-  m_Layer: 0
-  m_Name: SceneManager
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!114 &44396059
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 44396058}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 4247e51c3496f4042a0b4726f65a39a6, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  Settings:
-    MaxBuildTime: 0.016
-    MinBuildTime: 0.004
-    DynamicLoaders: 4
-    IntersectMask: -1
-    Options: 5
-  MapUrl: 
-  Builders:
-  - {fileID: 44396063}
-  - {fileID: 44396062}
---- !u!114 &44396060
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 44396058}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: a284ca71ed695f84385934cf4c567931, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
---- !u!4 &44396061
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 44396058}
-  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: 3
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!114 &44396062
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 44396058}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 25734977c93f1f341b6ba330af04bd14, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  _mode: 1
-  _fallbackMaterial: {fileID: 2100000, guid: aaa1d8c29d6c5924296633de6b87f492, type: 2}
-  _material: {fileID: 2100000, guid: 7b3b84139d8f3354e927c3e2d99d2e53, type: 2}
-  _mask: 2056
-  _forceFallbackMaterial: 0
---- !u!114 &44396063
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 44396058}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 5c84d1050450b9341a37c586429c0448, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  _mode: 0
-  _fallbackMaterial: {fileID: 2100000, guid: aaa1d8c29d6c5924296633de6b87f492, type: 2}
-  _material: {fileID: 2100000, guid: e252302673b0b904d9f60572efbe4cb4, type: 2}
-  _mask: 6
-  _forceFallbackMaterial: 0
---- !u!1 &705507993
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 705507995}
-  - component: {fileID: 705507994}
-  m_Layer: 0
-  m_Name: Directional Light
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!108 &705507994
-Light:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 705507993}
-  m_Enabled: 1
-  serializedVersion: 10
-  m_Type: 1
-  m_Shape: 0
-  m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
-  m_Intensity: 1
-  m_Range: 10
-  m_SpotAngle: 30
-  m_InnerSpotAngle: 21.80208
-  m_CookieSize: 10
-  m_Shadows:
-    m_Type: 2
-    m_Resolution: -1
-    m_CustomResolution: -1
-    m_Strength: 1
-    m_Bias: 0.05
-    m_NormalBias: 0.4
-    m_NearPlane: 0.2
-    m_CullingMatrixOverride:
-      e00: 1
-      e01: 0
-      e02: 0
-      e03: 0
-      e10: 0
-      e11: 1
-      e12: 0
-      e13: 0
-      e20: 0
-      e21: 0
-      e22: 1
-      e23: 0
-      e30: 0
-      e31: 0
-      e32: 0
-      e33: 1
-    m_UseCullingMatrixOverride: 0
-  m_Cookie: {fileID: 0}
-  m_DrawHalo: 0
-  m_Flare: {fileID: 0}
-  m_RenderMode: 0
-  m_CullingMask:
-    serializedVersion: 2
-    m_Bits: 4294967295
-  m_RenderingLayerMask: 1
-  m_Lightmapping: 1
-  m_LightShadowCasterMode: 0
-  m_AreaSize: {x: 1, y: 1}
-  m_BounceIntensity: 1
-  m_ColorTemperature: 6570
-  m_UseColorTemperature: 0
-  m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
-  m_UseBoundingSphereOverride: 0
-  m_UseViewFrustumForShadowCasterCull: 1
-  m_ShadowRadius: 0
-  m_ShadowAngle: 0
---- !u!4 &705507995
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 705507993}
-  m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
-  m_LocalPosition: {x: 0, y: 3, z: 0}
-  m_LocalScale: {x: 1, y: 1, z: 1}
-  m_ConstrainProportionsScale: 0
-  m_Children: []
-  m_Father: {fileID: 0}
-  m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
---- !u!1 &963194225
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 963194228}
-  - component: {fileID: 963194227}
-  - component: {fileID: 963194226}
-  - component: {fileID: 963194229}
-  m_Layer: 0
-  m_Name: Main Camera
-  m_TagString: MainCamera
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!81 &963194226
-AudioListener:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 963194225}
-  m_Enabled: 1
---- !u!20 &963194227
-Camera:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 963194225}
-  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_SensorSize: {x: 36, y: 24}
-  m_LensShift: {x: 0, y: 0}
-  m_FocalLength: 50
-  m_NormalizedViewPortRect:
-    serializedVersion: 2
-    x: 0
-    y: 0
-    width: 1
-    height: 1
-  near clip plane: 0.3
-  far clip plane: 100000
-  field of view: 60
-  orthographic: 0
-  orthographic size: 5
-  m_Depth: -1
-  m_CullingMask:
-    serializedVersion: 2
-    m_Bits: 4294967295
-  m_RenderingPath: -1
-  m_TargetTexture: {fileID: 0}
-  m_TargetDisplay: 0
-  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
---- !u!4 &963194228
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 963194225}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
-  m_LocalPosition: {x: 0, y: 1, z: -10}
-  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!114 &963194229
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 963194225}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 0283285cec50a434eac1ca6d49af4bb6, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  Speed: 100
-  ShiftMultiplier: 5
-  RotSpeed: 20
-  X: 0
-  Y: 80
-  Z: 0
---- !u!1 &1692271381
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 1692271384}
-  - component: {fileID: 1692271382}
-  - component: {fileID: 1692271385}
-  m_Layer: 0
-  m_Name: Modules
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!114 &1692271382
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1692271381}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 0848deeba0da44043a72f971b1879eb9, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  SceneManager: {fileID: 44396059}
-  _enableDetailedTextures: 1
-  _hueShiftInclusion: 0.4
-  _targetHue: {r: 0.2546725, g: 0.5566038, b: 0.2546725, a: 1}
-  _detailTextureSet: {fileID: 11400000, guid: 123682dc7f3baf442b16516cbb951b61, type: 2}
-  _generateNormals: 1
-  _normalComputeShader: {fileID: 7200000, guid: 0e24b78a0e19e3745900ce3fc73a93c1, type: 3}
---- !u!4 &1692271384
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1692271381}
-  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: 2
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!114 &1692271385
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1692271381}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 2c6e0776126240d4995d868b86fa45a1, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  SceneManager: {fileID: 44396059}
-  ComputeShader: {fileID: 7200000, guid: 658d4304a9fd9fe49bd7d3b0ede75fb1, type: 3}
-  FoliageShader: {fileID: 4800000, guid: 068e6fbc052d17648b666532b330a5a7, type: 3}
-  PerlinNoise: {fileID: 0}
-  DebugPrintCount: 0
-  Disabled: 0
-  DebugNoDraw: 0
-  NativeLeakDetection: 0
-  Occlusion: 0
-  DownsampleMaterial: {fileID: 2100000, guid: ebe65c385a1ee1e40b90aaffc81cc315, type: 2}
-  Features:
-  - SettingsType: 0
-    mapFeature: 2048
-    FoliageSet: {fileID: 11400000, guid: a41238585ae0397468f576c11c14ce64, type: 2}
-    Enabled: 1
-    BufferSize: 2000000
-    ScreenCoverage: 0.005
-    Density: 0.15
-    NodeMaxWidth: 2048
-    Shadows: 1
-    Crossboard: 1
-    DrawDistance: 0
-  - SettingsType: 1
-    mapFeature: 2049
-    FoliageSet: {fileID: 11400000, guid: da5ccc4a63dfdc540afefcd1b3990158, type: 2}
-    Enabled: 1
-    BufferSize: 2000000
-    ScreenCoverage: 0.005
-    Density: 1
-    NodeMaxWidth: 500
-    Shadows: 0
-    Crossboard: 0
-    DrawDistance: 0
diff --git a/projects/com.saab.map-streamer/ProjectSettings/PresetManager.asset b/projects/com.saab.map-streamer/ProjectSettings/PresetManager.asset
deleted file mode 100644
index 67a94dae..00000000
--- a/projects/com.saab.map-streamer/ProjectSettings/PresetManager.asset
+++ /dev/null
@@ -1,7 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!1386491679 &1
-PresetManager:
-  m_ObjectHideFlags: 0
-  serializedVersion: 2
-  m_DefaultPresets: {}
diff --git a/projects/com.saab.map-streamer/ProjectSettings/ProjectVersion.txt b/projects/com.saab.map-streamer/ProjectSettings/ProjectVersion.txt
deleted file mode 100644
index 4e41aca1..00000000
--- a/projects/com.saab.map-streamer/ProjectSettings/ProjectVersion.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-m_EditorVersion: 2021.3.17f1
-m_EditorVersionWithRevision: 2021.3.17f1 (68be192f8259)
diff --git a/projects/com.saab.map-streamer/config.xml b/projects/com.saab.map-streamer/config.xml
deleted file mode 100644
index f46b14f8..00000000
--- a/projects/com.saab.map-streamer/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generic Configuration for Unity -->
-<Unity>
-    <GfxCaps>
-		<CurrentCaps info="Which graphics capabilities to use">48</CurrentCaps>
-		<Foliage>
-         <!-- ****** disable by setting drawdistance or density to 0.0 ****** -->
-          <Trees>
-            <Density info="Density percentage modifier">1</Density>
-            <DrawDistance info="DrawDistance percentage modifier">1</DrawDistance>
-            <Shadows info="foliage cast shadows">true</Shadows>
-          </Trees>
-          <Grass>
-            <Density info="Density percentage modifier">1</Density>
-            <DrawDistance info="DrawDistance percentage modifier">1</DrawDistance>
-            <Shadows info="foliage cast shadows">false</Shadows>
-          </Grass>
-        </Foliage>
-    </GfxCaps>
-
-    <SceneManager>
-		<SceneCleanupTime>10</SceneCleanupTime> <!-- seconds -->
-		<DynamicLoaders>4</DynamicLoaders>
-		<MapUrl>http://gizmosdk.blob.core.windows.net/maps/stock/map.gzd</MapUrl>
-    </SceneManager>
-</Unity>
\ No newline at end of file
diff --git a/tutorial/AddFoliage.md b/tutorial/AddFoliage.md
deleted file mode 100644
index 92c7bffa..00000000
--- a/tutorial/AddFoliage.md
+++ /dev/null
@@ -1,96 +0,0 @@
-<b>Foliage Module</b>
-==================
-
-<b>Introduction</b>
-
-
-Foliage module handles the placement of foliage in our streaming maps, which it does through the use of the feature/height data found in our maps. It also handles the foliage interactions with the world, currently just the Wind. 
-
-![](img/Grass_demo.gif)
-
-<b>Usage</b>
-
-The foliage module takes in some basic settings like which camera it should render to and which shaders to use, but most importantly it controls which foliage should be drawn where and when.
-This behavior is defined by features.
-
-![Screenshot](img/FolaigeModule.jpg)
-
-<b>Features</b>
-
-A feature associates a [foliage set](#foliageSet) with information about how its members should be distributed and rendered. The distribution is controlled by the map feature setting which defines where the members of the foliage set are allowed to be placed, as well as their density and boundary radius.
-
-![Screenshot](img/Foliage_module_feature.jpg)
-
-
-
-The distribution settings you can define are: 
--
-- **Density**
-    - defines how closely the foliage assets are placed in the world.
-- **Boundary Radius**
-    - defines the maximum size of the map node (in meters) that the feature should be rendered at. You can think of this as a kind of LOD system. 
-
-<font color="purple"><b>Note</b></font>
--   The distribution can also be affected by the individual settings of foliage asset in your foliage set. Like for example its valid height range which would stop it from being place if the heightdata does not return a value inside that range.  
-
-The rendering settings you can define are:
--
-
-- **Buffer size**
-    - Defines the maximum amount of foliage assets that can be rendered each frame (in the current feature), lower is better but too small will cause problems (even hard crashes). The amount you set here should be based on how much you want to render (foliage density and draw distance).    
-- **Screen coverage** (threshold for removing things which only covers a very small part of the screen)
-    - The draw distance is not defined as a range but rather based on how many percent of the screen the largest foliage asset in the feature covers. This allows the level of detail to automatically increase when zooming in.
-- **Shadows**
-    - this is pretty self explanatory, on or off.
-- **Crossboards**
-    - Defines whether the feature set will render the foliage assets as a crossboard (three faces: front, right, top) or as a billboard (one face, always facing the camera). Crossboards are better for bigger objects, like trees and bushes, but might be "overkill" for grass.
-
-![](img/billboard_crossboard.jpg)
-
-_[Left billboard, right crossboard]_
-
-<font color="red"><b>Warning!</b></font>
--
-
-- The current implementation of billboards actually creates a random cluster of 8 billboards in a 1x1 meter area. (when density is 1)
-
-Foliage
-==================
-
-<b>Create</b>
-
-To create a foliage asset you simply right click in the directory you want your asset to be created and select "Create -> Terrain -> Foliage" and give it a name.
-
-![](img/foliage_create.gif)
-
-<b>Configure</b>
-
-When configuring a new tree the most important settings is the main texture, min/max height, ground offset and weight. Everything else is either not used, or used simply for sorting and/or previewing.
-
-The height settings define the accepted interval of the foliage asset, this is used to give the foliage a height variation but it is also used for placement validation. For example, when placing a tree in a forest, if the height data says that the height there is just 2 meters it would be odd to draw an old oak thats just 2 meters tall, but a young spruce might be okay.
-
-![](img/foliage_config.gif)
-
-Ground offset is used when the images you want to use for your foliage is misaligned with the ground and needs to be offset. The red line in the preview symbolizes the ground.
-
-The mode option changes how the preview interprets the image.
-- If your image is made to be used with a billboard, select "Single".
-- If it is made to be used with a crossboard, select "Atlas".
-This only affects the preview, and not how the asset is actually rendered in the world.
-
-![](img/atlas.jpg)
-
-The weight defines how common the foliage is.
-This value is used to determine how dominant a type of foliage is in relation to others in the same set.
-Using this dominance-value, the appropriate amount of assets can then be placed in the world.
-
-<font color="purple"><b>Note</b></font>
--
-- In a future update the weight will be moved to the feature set instead.
-
-
-<b id="foliageSet">Foliage Set</b>
-
-A foliage set is a collection of foliage assets. It's created in the same manner as a foliage asset. You can see it as the palette for the feature. You should avoid mixing foliage with too different sizes as it could lead to a lot of unnecessary foliage being rendered. Using both crossboards and billboards in the same set is also a bad idea.
-
-![](img/foliage_set.jpg)
\ No newline at end of file
diff --git a/tutorial/img/FolaigeModule.jpg b/tutorial/img/FolaigeModule.jpg
deleted file mode 100644
index dfe1abfa..00000000
Binary files a/tutorial/img/FolaigeModule.jpg and /dev/null differ
diff --git a/tutorial/img/Foliage_module_feature.jpg b/tutorial/img/Foliage_module_feature.jpg
deleted file mode 100644
index c7df55fd..00000000
Binary files a/tutorial/img/Foliage_module_feature.jpg and /dev/null differ
diff --git a/tutorial/img/atlas.jpg b/tutorial/img/atlas.jpg
deleted file mode 100644
index 79def3bc..00000000
Binary files a/tutorial/img/atlas.jpg and /dev/null differ
diff --git a/tutorial/img/billboard_crossboard.jpg b/tutorial/img/billboard_crossboard.jpg
deleted file mode 100644
index a578e1d7..00000000
Binary files a/tutorial/img/billboard_crossboard.jpg and /dev/null differ
diff --git a/tutorial/img/foliage_config.gif b/tutorial/img/foliage_config.gif
deleted file mode 100644
index eb89a128..00000000
Binary files a/tutorial/img/foliage_config.gif and /dev/null differ
diff --git a/tutorial/img/foliage_create.gif b/tutorial/img/foliage_create.gif
deleted file mode 100644
index bd58251b..00000000
Binary files a/tutorial/img/foliage_create.gif and /dev/null differ
diff --git a/tutorial/img/foliage_set.jpg b/tutorial/img/foliage_set.jpg
deleted file mode 100644
index 1cb0e517..00000000
Binary files a/tutorial/img/foliage_set.jpg and /dev/null differ
diff --git a/vs17/Install_Gizmo/Install_Gizmo.csproj b/vs17/Install_Gizmo/Install_Gizmo.csproj
deleted file mode 100644
index 55f639a7..00000000
--- a/vs17/Install_Gizmo/Install_Gizmo.csproj
+++ /dev/null
@@ -1,24 +0,0 @@
-﻿<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
-    <Platforms>x64</Platforms>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <PackageReference Include="Coordinate" Version="2.12.254.1" />
-    <PackageReference Include="Gizmo3D" Version="2.12.254.1" />
-    <PackageReference Include="GizmoBase" Version="2.12.254.1" />
-    <PackageReference Include="GizmoDistribution" Version="2.12.254.1" />
-  </ItemGroup>
-
-  <Target Name="CopyFilesAfterBuild" AfterTargets="Build" DependsOnTargets="CustomPostbuildTarget">
-    <ItemGroup>
-      <FilesToCopy Include="bin\$(Platform)\$(Configuration)\netstandard2.0\gz*.dll" />
-      <FilesToCopy Include="bin\$(Platform)\$(Configuration)\netstandard2.0\Gizmo*.dll" />
-      <FilesToCopy Include="bin\$(Platform)\$(Configuration)\netstandard2.0\Coordinate.dll" />
-    </ItemGroup>
-
-    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(SolutionDir)..\..\com.saab.map-streamer\Plugins\$(Configuration)\x86_64\" />  
-  </Target>
-</Project>
diff --git a/vs17/Install_Gizmo/Install_Gizmo.sln b/vs17/Install_Gizmo/Install_Gizmo.sln
deleted file mode 100644
index cbcdee77..00000000
--- a/vs17/Install_Gizmo/Install_Gizmo.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.6.33829.357
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Install_Gizmo", "Install_Gizmo.csproj", "{7336AA4C-022B-4AFE-A36A-AD999458EBE6}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|x64 = Debug|x64
-		Release|x64 = Release|x64
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{7336AA4C-022B-4AFE-A36A-AD999458EBE6}.Debug|x64.ActiveCfg = Debug|x64
-		{7336AA4C-022B-4AFE-A36A-AD999458EBE6}.Debug|x64.Build.0 = Debug|x64
-		{7336AA4C-022B-4AFE-A36A-AD999458EBE6}.Release|x64.ActiveCfg = Release|x64
-		{7336AA4C-022B-4AFE-A36A-AD999458EBE6}.Release|x64.Build.0 = Release|x64
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-		SolutionGuid = {44B8BE13-7C0E-473E-B445-4CD1E2BFFBE6}
-	EndGlobalSection
-EndGlobal
