diff --git a/.gitignore b/.gitignore
index b6e96188d..421b8f675 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@ crest/[Oo]bj/
crest/[Bb]uild/
crest/[Bb]uilds/
crest/[Ll]ogs/
+crest/[Pp]ackages/*/
crest/Assets/AssetStoreTools*
# Visual Studio 2015 cache directory
diff --git a/crest/packages.config b/crest/packages.config
new file mode 100644
index 000000000..ae8b31cd0
--- /dev/null
+++ b/crest/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/docs/.gitignore b/docs/.gitignore
index d5e31999b..f945fd570 100644
--- a/docs/.gitignore
+++ b/docs/.gitignore
@@ -132,6 +132,9 @@ pythonenv*
# Rope project settings
.ropeproject
+# Visual Studio Code project settings
+.vscode
+
# mkdocs documentation
/site
diff --git a/docs/api/Crest.md b/docs/api/Crest.md
new file mode 100644
index 000000000..b7fc47fe8
--- /dev/null
+++ b/docs/api/Crest.md
@@ -0,0 +1,1824 @@
+
+# Crest
+
+## Contents
+
+- [BoatProbes](#T-Crest-BoatProbes 'Crest.BoatProbes')
+- [BuildCommandBuffer](#T-Crest-BuildCommandBuffer 'Crest.BuildCommandBuffer')
+ - [BuildAndExecute()](#M-Crest-BuildCommandBuffer-BuildAndExecute 'Crest.BuildCommandBuffer.BuildAndExecute')
+- [BuildCommandBufferBase](#T-Crest-BuildCommandBufferBase 'Crest.BuildCommandBufferBase')
+ - [_lastUpdateFrame](#F-Crest-BuildCommandBufferBase-_lastUpdateFrame 'Crest.BuildCommandBufferBase._lastUpdateFrame')
+- [CollProviderNull](#T-Crest-CollProviderNull 'Crest.CollProviderNull')
+- [CrestSortedList\`2](#T-Crest-CrestSortedList`2 'Crest.CrestSortedList`2')
+- [DuplicateKeyComparer\`1](#T-Crest-DuplicateKeyComparer`1 'Crest.DuplicateKeyComparer`1')
+- [EditorHelpers](#T-Crest-EditorHelpers-EditorHelpers 'Crest.EditorHelpers.EditorHelpers')
+ - [GetActiveSceneViewCamera()](#M-Crest-EditorHelpers-EditorHelpers-GetActiveSceneViewCamera 'Crest.EditorHelpers.EditorHelpers.GetActiveSceneViewCamera')
+- [EmbeddedAssetEditor](#T-Crest-EditorHelpers-EmbeddedAssetEditor 'Crest.EditorHelpers.EmbeddedAssetEditor')
+ - [#ctor()](#M-Crest-EditorHelpers-EmbeddedAssetEditor-#ctor 'Crest.EditorHelpers.EmbeddedAssetEditor.#ctor')
+ - [OnChanged](#F-Crest-EditorHelpers-EmbeddedAssetEditor-OnChanged 'Crest.EditorHelpers.EmbeddedAssetEditor.OnChanged')
+ - [OnCreateEditor](#F-Crest-EditorHelpers-EmbeddedAssetEditor-OnCreateEditor 'Crest.EditorHelpers.EmbeddedAssetEditor.OnCreateEditor')
+ - [m_CreateButtonGUIContent](#F-Crest-EditorHelpers-EmbeddedAssetEditor-m_CreateButtonGUIContent 'Crest.EditorHelpers.EmbeddedAssetEditor.m_CreateButtonGUIContent')
+ - [DrawEditorCombo()](#M-Crest-EditorHelpers-EmbeddedAssetEditor-DrawEditorCombo-System-String,System-String,System-String,System-String,System-Boolean,UnityEditor-SerializedProperty- 'Crest.EditorHelpers.EmbeddedAssetEditor.DrawEditorCombo(System.String,System.String,System.String,System.String,System.Boolean,UnityEditor.SerializedProperty)')
+ - [OnDisable()](#M-Crest-EditorHelpers-EmbeddedAssetEditor-OnDisable 'Crest.EditorHelpers.EmbeddedAssetEditor.OnDisable')
+- [FloatingObjectBase](#T-Crest-FloatingObjectBase 'Crest.FloatingObjectBase')
+- [FloatingOrigin](#T-Crest-FloatingOrigin 'Crest.FloatingOrigin')
+ - [MoveOriginDisablePhysics()](#M-Crest-FloatingOrigin-MoveOriginDisablePhysics 'Crest.FloatingOrigin.MoveOriginDisablePhysics')
+ - [MoveOriginOcean()](#M-Crest-FloatingOrigin-MoveOriginOcean-UnityEngine-Vector3- 'Crest.FloatingOrigin.MoveOriginOcean(UnityEngine.Vector3)')
+ - [MoveOriginParticles()](#M-Crest-FloatingOrigin-MoveOriginParticles-UnityEngine-Vector3- 'Crest.FloatingOrigin.MoveOriginParticles(UnityEngine.Vector3)')
+ - [MoveOriginTransforms()](#M-Crest-FloatingOrigin-MoveOriginTransforms-UnityEngine-Vector3- 'Crest.FloatingOrigin.MoveOriginTransforms(UnityEngine.Vector3)')
+- [FlowProviderNull](#T-Crest-FlowProviderNull 'Crest.FlowProviderNull')
+- [ICollProvider](#T-Crest-ICollProvider 'Crest.ICollProvider')
+ - [CleanUp()](#M-Crest-ICollProvider-CleanUp 'Crest.ICollProvider.CleanUp')
+ - [Query(i_ownerHash,i_minSpatialLength,i_queryPoints,o_resultHeights,o_resultNorms,o_resultVels)](#M-Crest-ICollProvider-Query-System-Int32,System-Single,UnityEngine-Vector3[],System-Single[],UnityEngine-Vector3[],UnityEngine-Vector3[]- 'Crest.ICollProvider.Query(System.Int32,System.Single,UnityEngine.Vector3[],System.Single[],UnityEngine.Vector3[],UnityEngine.Vector3[])')
+ - [Query(i_ownerHash,i_minSpatialLength,i_queryPoints,o_resultDisps,o_resultNorms,o_resultVels)](#M-Crest-ICollProvider-Query-System-Int32,System-Single,UnityEngine-Vector3[],UnityEngine-Vector3[],UnityEngine-Vector3[],UnityEngine-Vector3[]- 'Crest.ICollProvider.Query(System.Int32,System.Single,UnityEngine.Vector3[],UnityEngine.Vector3[],UnityEngine.Vector3[],UnityEngine.Vector3[])')
+ - [RetrieveSucceeded()](#M-Crest-ICollProvider-RetrieveSucceeded-System-Int32- 'Crest.ICollProvider.RetrieveSucceeded(System.Int32)')
+ - [UpdateQueries()](#M-Crest-ICollProvider-UpdateQueries 'Crest.ICollProvider.UpdateQueries')
+- [IFloatingOrigin](#T-Crest-IFloatingOrigin 'Crest.IFloatingOrigin')
+ - [SetOrigin()](#M-Crest-IFloatingOrigin-SetOrigin-UnityEngine-Vector3- 'Crest.IFloatingOrigin.SetOrigin(UnityEngine.Vector3)')
+- [IFlowProvider](#T-Crest-IFlowProvider 'Crest.IFlowProvider')
+ - [CleanUp()](#M-Crest-IFlowProvider-CleanUp 'Crest.IFlowProvider.CleanUp')
+ - [Query(i_ownerHash,i_minSpatialLength,i_queryPoints,o_resultVels)](#M-Crest-IFlowProvider-Query-System-Int32,System-Single,UnityEngine-Vector3[],UnityEngine-Vector3[]- 'Crest.IFlowProvider.Query(System.Int32,System.Single,UnityEngine.Vector3[],UnityEngine.Vector3[])')
+ - [RetrieveSucceeded()](#M-Crest-IFlowProvider-RetrieveSucceeded-System-Int32- 'Crest.IFlowProvider.RetrieveSucceeded(System.Int32)')
+ - [UpdateQueries()](#M-Crest-IFlowProvider-UpdateQueries 'Crest.IFlowProvider.UpdateQueries')
+- [IPropertyWrapper](#T-Crest-IPropertyWrapper 'Crest.IPropertyWrapper')
+- [ITimeProvider](#T-Crest-ITimeProvider 'Crest.ITimeProvider')
+- [LodDataMgr](#T-Crest-LodDataMgr 'Crest.LodDataMgr')
+- [LodDataMgrAnimWaves](#T-Crest-LodDataMgrAnimWaves 'Crest.LodDataMgrAnimWaves')
+ - [_shapeCombinePass](#F-Crest-LodDataMgrAnimWaves-_shapeCombinePass 'Crest.LodDataMgrAnimWaves._shapeCombinePass')
+ - [SuggestDataLOD()](#M-Crest-LodDataMgrAnimWaves-SuggestDataLOD-UnityEngine-Rect- 'Crest.LodDataMgrAnimWaves.SuggestDataLOD(UnityEngine.Rect)')
+- [LodDataMgrClipSurface](#T-Crest-LodDataMgrClipSurface 'Crest.LodDataMgrClipSurface')
+- [LodDataMgrDynWaves](#T-Crest-LodDataMgrDynWaves 'Crest.LodDataMgrDynWaves')
+- [LodDataMgrFlow](#T-Crest-LodDataMgrFlow 'Crest.LodDataMgrFlow')
+- [LodDataMgrFoam](#T-Crest-LodDataMgrFoam 'Crest.LodDataMgrFoam')
+- [LodDataMgrPersistent](#T-Crest-LodDataMgrPersistent 'Crest.LodDataMgrPersistent')
+ - [SetAdditionalSimParams()](#M-Crest-LodDataMgrPersistent-SetAdditionalSimParams-Crest-IPropertyWrapper- 'Crest.LodDataMgrPersistent.SetAdditionalSimParams(Crest.IPropertyWrapper)')
+- [LodDataMgrSeaFloorDepth](#T-Crest-LodDataMgrSeaFloorDepth 'Crest.LodDataMgrSeaFloorDepth')
+- [LodDataMgrShadow](#T-Crest-LodDataMgrShadow 'Crest.LodDataMgrShadow')
+- [LodTransform](#T-Crest-LodTransform 'Crest.LodTransform')
+- [MultiPropertyAttribute](#T-Crest-MultiPropertyAttribute 'Crest.MultiPropertyAttribute')
+ - [BuildLabel()](#M-Crest-MultiPropertyAttribute-BuildLabel-UnityEngine-GUIContent- 'Crest.MultiPropertyAttribute.BuildLabel(UnityEngine.GUIContent)')
+ - [GetPropertyHeight()](#M-Crest-MultiPropertyAttribute-GetPropertyHeight-UnityEditor-SerializedProperty,UnityEngine-GUIContent- 'Crest.MultiPropertyAttribute.GetPropertyHeight(UnityEditor.SerializedProperty,UnityEngine.GUIContent)')
+ - [OnGUI()](#M-Crest-MultiPropertyAttribute-OnGUI-UnityEngine-Rect,UnityEditor-SerializedProperty,UnityEngine-GUIContent,Crest-EditorHelpers-MultiPropertyDrawer- 'Crest.MultiPropertyAttribute.OnGUI(UnityEngine.Rect,UnityEditor.SerializedProperty,UnityEngine.GUIContent,Crest.EditorHelpers.MultiPropertyDrawer)')
+- [ObjectWaterInteraction](#T-Crest-ObjectWaterInteraction 'Crest.ObjectWaterInteraction')
+- [OceanBuilder](#T-Crest-OceanBuilder 'Crest.OceanBuilder')
+- [OceanChunkRenderer](#T-Crest-OceanChunkRenderer 'Crest.OceanChunkRenderer')
+- [OceanDepthCache](#T-Crest-OceanDepthCache 'Crest.OceanDepthCache')
+- [OceanPlanarReflection](#T-Crest-OceanPlanarReflection 'Crest.OceanPlanarReflection')
+ - [RefreshPerFrames](#F-Crest-OceanPlanarReflection-RefreshPerFrames 'Crest.OceanPlanarReflection.RefreshPerFrames')
+ - [_frameRefreshOffset](#F-Crest-OceanPlanarReflection-_frameRefreshOffset 'Crest.OceanPlanarReflection._frameRefreshOffset')
+ - [ForceDistanceCulling(farClipPlane)](#M-Crest-OceanPlanarReflection-ForceDistanceCulling-System-Single- 'Crest.OceanPlanarReflection.ForceDistanceCulling(System.Single)')
+- [OceanRenderer](#T-Crest-OceanRenderer 'Crest.OceanRenderer')
+ - [CollisionProvider](#P-Crest-OceanRenderer-CollisionProvider 'Crest.OceanRenderer.CollisionProvider')
+ - [CurrentLodCount](#P-Crest-OceanRenderer-CurrentLodCount 'Crest.OceanRenderer.CurrentLodCount')
+ - [MaxHorizDisplacement](#P-Crest-OceanRenderer-MaxHorizDisplacement 'Crest.OceanRenderer.MaxHorizDisplacement')
+ - [MaxVertDisplacement](#P-Crest-OceanRenderer-MaxVertDisplacement 'Crest.OceanRenderer.MaxVertDisplacement')
+ - [Scale](#P-Crest-OceanRenderer-Scale 'Crest.OceanRenderer.Scale')
+ - [ScaleCouldDecrease](#P-Crest-OceanRenderer-ScaleCouldDecrease 'Crest.OceanRenderer.ScaleCouldDecrease')
+ - [ScaleCouldIncrease](#P-Crest-OceanRenderer-ScaleCouldIncrease 'Crest.OceanRenderer.ScaleCouldIncrease')
+ - [SeaLevel](#P-Crest-OceanRenderer-SeaLevel 'Crest.OceanRenderer.SeaLevel')
+ - [ViewerAltitudeLevelAlpha](#P-Crest-OceanRenderer-ViewerAltitudeLevelAlpha 'Crest.OceanRenderer.ViewerAltitudeLevelAlpha')
+ - [ViewerHeightAboveWater](#P-Crest-OceanRenderer-ViewerHeightAboveWater 'Crest.OceanRenderer.ViewerHeightAboveWater')
+ - [ReportMaxDisplacementFromShape()](#M-Crest-OceanRenderer-ReportMaxDisplacementFromShape-System-Single,System-Single,System-Single- 'Crest.OceanRenderer.ReportMaxDisplacementFromShape(System.Single,System.Single,System.Single)')
+- [OceanWaveSpectrum](#T-Crest-OceanWaveSpectrum 'Crest.OceanWaveSpectrum')
+ - [GenerateWaveData()](#M-Crest-OceanWaveSpectrum-GenerateWaveData-System-Int32,System-Single[]@,System-Single[]@- 'Crest.OceanWaveSpectrum.GenerateWaveData(System.Int32,System.Single[]@,System.Single[]@)')
+- [PatchType](#T-Crest-OceanBuilder-PatchType 'Crest.OceanBuilder.PatchType')
+ - [Count](#F-Crest-OceanBuilder-PatchType-Count 'Crest.OceanBuilder.PatchType.Count')
+ - [Fat](#F-Crest-OceanBuilder-PatchType-Fat 'Crest.OceanBuilder.PatchType.Fat')
+ - [FatX](#F-Crest-OceanBuilder-PatchType-FatX 'Crest.OceanBuilder.PatchType.FatX')
+ - [FatXOuter](#F-Crest-OceanBuilder-PatchType-FatXOuter 'Crest.OceanBuilder.PatchType.FatXOuter')
+ - [FatXSlimZ](#F-Crest-OceanBuilder-PatchType-FatXSlimZ 'Crest.OceanBuilder.PatchType.FatXSlimZ')
+ - [FatXZ](#F-Crest-OceanBuilder-PatchType-FatXZ 'Crest.OceanBuilder.PatchType.FatXZ')
+ - [FatXZOuter](#F-Crest-OceanBuilder-PatchType-FatXZOuter 'Crest.OceanBuilder.PatchType.FatXZOuter')
+ - [Interior](#F-Crest-OceanBuilder-PatchType-Interior 'Crest.OceanBuilder.PatchType.Interior')
+ - [SlimX](#F-Crest-OceanBuilder-PatchType-SlimX 'Crest.OceanBuilder.PatchType.SlimX')
+ - [SlimXFatZ](#F-Crest-OceanBuilder-PatchType-SlimXFatZ 'Crest.OceanBuilder.PatchType.SlimXFatZ')
+ - [SlimXZ](#F-Crest-OceanBuilder-PatchType-SlimXZ 'Crest.OceanBuilder.PatchType.SlimXZ')
+- [PredicatedFieldAttribute](#T-Crest-PredicatedFieldAttribute 'Crest.PredicatedFieldAttribute')
+ - [#ctor(propertyName,inverted,disableIfValueIs)](#M-Crest-PredicatedFieldAttribute-#ctor-System-String,System-Boolean,System-Int32- 'Crest.PredicatedFieldAttribute.#ctor(System.String,System.Boolean,System.Int32)')
+- [QueryBase](#T-Crest-QueryBase 'Crest.QueryBase')
+ - [CalculateVelocities()](#M-Crest-QueryBase-CalculateVelocities-System-Int32,UnityEngine-Vector3[]- 'Crest.QueryBase.CalculateVelocities(System.Int32,UnityEngine.Vector3[])')
+ - [CompactQueryStorage()](#M-Crest-QueryBase-CompactQueryStorage 'Crest.QueryBase.CompactQueryStorage')
+ - [DataArrived()](#M-Crest-QueryBase-DataArrived-UnityEngine-Rendering-AsyncGPUReadbackRequest- 'Crest.QueryBase.DataArrived(UnityEngine.Rendering.AsyncGPUReadbackRequest)')
+ - [RemoveQueryPoints()](#M-Crest-QueryBase-RemoveQueryPoints-System-Int32- 'Crest.QueryBase.RemoveQueryPoints(System.Int32)')
+ - [RetrieveResults()](#M-Crest-QueryBase-RetrieveResults-System-Int32,UnityEngine-Vector3[],System-Single[],UnityEngine-Vector3[]- 'Crest.QueryBase.RetrieveResults(System.Int32,UnityEngine.Vector3[],System.Single[],UnityEngine.Vector3[])')
+ - [UpdateQueryPoints()](#M-Crest-QueryBase-UpdateQueryPoints-System-Int32,System-Single,UnityEngine-Vector3[],UnityEngine-Vector3[]- 'Crest.QueryBase.UpdateQueryPoints(System.Int32,System.Single,UnityEngine.Vector3[],UnityEngine.Vector3[])')
+- [QueryDisplacements](#T-Crest-QueryDisplacements 'Crest.QueryDisplacements')
+- [QueryFlow](#T-Crest-QueryFlow 'Crest.QueryFlow')
+- [RayTraceHelper](#T-Crest-RayTraceHelper 'Crest.RayTraceHelper')
+ - [#ctor()](#M-Crest-RayTraceHelper-#ctor-System-Single,System-Single- 'Crest.RayTraceHelper.#ctor(System.Single,System.Single)')
+ - [Init(i_rayOrigin,i_rayDirection)](#M-Crest-RayTraceHelper-Init-UnityEngine-Vector3,UnityEngine-Vector3- 'Crest.RayTraceHelper.Init(UnityEngine.Vector3,UnityEngine.Vector3)')
+ - [Trace(o_distance)](#M-Crest-RayTraceHelper-Trace-System-Single@- 'Crest.RayTraceHelper.Trace(System.Single@)')
+- [RegisterAnimWavesInput](#T-Crest-RegisterAnimWavesInput 'Crest.RegisterAnimWavesInput')
+- [RegisterClipSurfaceInput](#T-Crest-RegisterClipSurfaceInput 'Crest.RegisterClipSurfaceInput')
+- [RegisterDynWavesInput](#T-Crest-RegisterDynWavesInput 'Crest.RegisterDynWavesInput')
+- [RegisterFlowInput](#T-Crest-RegisterFlowInput 'Crest.RegisterFlowInput')
+- [RegisterFoamInput](#T-Crest-RegisterFoamInput 'Crest.RegisterFoamInput')
+- [RegisterLodDataInputBase](#T-Crest-RegisterLodDataInputBase 'Crest.RegisterLodDataInputBase')
+- [RegisterLodDataInput\`1](#T-Crest-RegisterLodDataInput`1 'Crest.RegisterLodDataInput`1')
+- [RegisterSeaFloorDepthInput](#T-Crest-RegisterSeaFloorDepthInput 'Crest.RegisterSeaFloorDepthInput')
+- [RegisterShadowInput](#T-Crest-RegisterShadowInput 'Crest.RegisterShadowInput')
+- [RenderAlphaOnSurface](#T-Crest-RenderAlphaOnSurface 'Crest.RenderAlphaOnSurface')
+- [RenderWireFrame](#T-RenderWireFrame 'RenderWireFrame')
+- [SampleFlowHelper](#T-Crest-SampleFlowHelper 'Crest.SampleFlowHelper')
+ - [Init(i_queryPos,i_minLength)](#M-Crest-SampleFlowHelper-Init-UnityEngine-Vector3,System-Single- 'Crest.SampleFlowHelper.Init(UnityEngine.Vector3,System.Single)')
+ - [Sample()](#M-Crest-SampleFlowHelper-Sample-UnityEngine-Vector2@- 'Crest.SampleFlowHelper.Sample(UnityEngine.Vector2@)')
+- [SampleHeightHelper](#T-Crest-SampleHeightHelper 'Crest.SampleHeightHelper')
+ - [Init(i_queryPos,i_minLength,allowMultipleCallsPerFrame)](#M-Crest-SampleHeightHelper-Init-UnityEngine-Vector3,System-Single,System-Boolean,UnityEngine-Object- 'Crest.SampleHeightHelper.Init(UnityEngine.Vector3,System.Single,System.Boolean,UnityEngine.Object)')
+ - [Sample()](#M-Crest-SampleHeightHelper-Sample-System-Single@- 'Crest.SampleHeightHelper.Sample(System.Single@)')
+- [ScriptableObjectUtility](#T-Crest-EditorHelpers-ScriptableObjectUtility 'Crest.EditorHelpers.ScriptableObjectUtility')
+ - [CreateAt()](#M-Crest-EditorHelpers-ScriptableObjectUtility-CreateAt-System-Type,System-String- 'Crest.EditorHelpers.ScriptableObjectUtility.CreateAt(System.Type,System.String)')
+ - [CreateAt\`\`1()](#M-Crest-EditorHelpers-ScriptableObjectUtility-CreateAt``1-System-String- 'Crest.EditorHelpers.ScriptableObjectUtility.CreateAt``1(System.String)')
+- [SegmentRegistrar](#T-Crest-QueryBase-SegmentRegistrar 'Crest.QueryBase.SegmentRegistrar')
+- [SegmentRegistrarRingBuffer](#T-Crest-QueryBase-SegmentRegistrarRingBuffer 'Crest.QueryBase.SegmentRegistrarRingBuffer')
+- [ShapeGerstner](#T-Crest-ShapeGerstner 'Crest.ShapeGerstner')
+ - [MinWavelength()](#M-Crest-ShapeGerstner-MinWavelength-System-Int32- 'Crest.ShapeGerstner.MinWavelength(System.Int32)')
+- [ShapeGerstnerBatched](#T-Crest-ShapeGerstnerBatched 'Crest.ShapeGerstnerBatched')
+ - [UpdateBatch()](#M-Crest-ShapeGerstnerBatched-UpdateBatch-System-Int32,System-Int32,System-Int32,Crest-ShapeGerstnerBatched-GerstnerBatch- 'Crest.ShapeGerstnerBatched.UpdateBatch(System.Int32,System.Int32,System.Int32,Crest.ShapeGerstnerBatched.GerstnerBatch)')
+- [ShapeGerstnerSplineHandling](#T-Crest-ShapeGerstnerSplineHandling 'Crest.ShapeGerstnerSplineHandling')
+- [SimSettingsAnimatedWaves](#T-Crest-SimSettingsAnimatedWaves 'Crest.SimSettingsAnimatedWaves')
+ - [CreateCollisionProvider()](#M-Crest-SimSettingsAnimatedWaves-CreateCollisionProvider 'Crest.SimSettingsAnimatedWaves.CreateCollisionProvider')
+- [SimSettingsBase](#T-Crest-SimSettingsBase 'Crest.SimSettingsBase')
+- [SimpleFloatingObject](#T-Crest-SimpleFloatingObject 'Crest.SimpleFloatingObject')
+ - [FixedUpdateOrientation()](#M-Crest-SimpleFloatingObject-FixedUpdateOrientation-UnityEngine-Vector3- 'Crest.SimpleFloatingObject.FixedUpdateOrientation(UnityEngine.Vector3)')
+- [SphereWaterInteraction](#T-Crest-SphereWaterInteraction 'Crest.SphereWaterInteraction')
+- [Spline](#T-Crest-Spline-Spline 'Crest.Spline.Spline')
+- [SplineInterpolation](#T-Crest-Spline-SplineInterpolation 'Crest.Spline.SplineInterpolation')
+ - [GenerateCubicSplineHull(splinePoints,splinePointsAndTangents)](#M-Crest-Spline-SplineInterpolation-GenerateCubicSplineHull-Crest-Spline-SplinePoint[],UnityEngine-Vector3[],System-Boolean- 'Crest.Spline.SplineInterpolation.GenerateCubicSplineHull(Crest.Spline.SplinePoint[],UnityEngine.Vector3[],System.Boolean)')
+ - [InterpolateCubicPosition(splinePointCount,splinePointsAndTangents,t,position)](#M-Crest-Spline-SplineInterpolation-InterpolateCubicPosition-System-Single,UnityEngine-Vector3[],System-Single,UnityEngine-Vector3@- 'Crest.Spline.SplineInterpolation.InterpolateCubicPosition(System.Single,UnityEngine.Vector3[],System.Single,UnityEngine.Vector3@)')
+ - [InterpolateLinearPosition(points,t,position)](#M-Crest-Spline-SplineInterpolation-InterpolateLinearPosition-UnityEngine-Vector3[],System-Single,UnityEngine-Vector3@- 'Crest.Spline.SplineInterpolation.InterpolateLinearPosition(UnityEngine.Vector3[],System.Single,UnityEngine.Vector3@)')
+- [SplinePoint](#T-Crest-Spline-SplinePoint 'Crest.Spline.SplinePoint')
+- [TimeProviderCustom](#T-Crest-TimeProviderCustom 'Crest.TimeProviderCustom')
+- [TimeProviderDefault](#T-Crest-TimeProviderDefault 'Crest.TimeProviderDefault')
+- [UnderwaterEffect](#T-Crest-UnderwaterEffect 'Crest.UnderwaterEffect')
+- [VisualiseCollisionArea](#T-Crest-VisualiseCollisionArea 'Crest.VisualiseCollisionArea')
+- [VisualiseRayTrace](#T-Crest-VisualiseRayTrace 'Crest.VisualiseRayTrace')
+- [WaterBody](#T-Crest-WaterBody 'Crest.WaterBody')
+
+
+## BoatProbes `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Boat physics by sampling at multiple probe points.
+
+
+## BuildCommandBuffer `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+The default builder for the ocean update command buffer which takes care of updating all ocean-related data, for
+example rendering animated waves and advancing sims. This runs in LateUpdate after the Default bucket, after the ocean
+system been moved to an up to date position and frame processing is done.
+
+
+### BuildAndExecute() `method`
+
+##### Summary
+
+Construct the command buffer and attach it to the camera so that it will be executed in the render.
+
+##### Parameters
+
+This method has no parameters.
+
+
+## BuildCommandBufferBase `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Base class for the command buffer builder, which takes care of updating all ocean-related data. If you wish to provide your
+own update logic, you can create a new component that inherits from this class and attach it to the same GameObject as the
+OceanRenderer script. The new component should be set to update after the Default bucket, similar to BuildCommandBuffer.
+
+
+### _lastUpdateFrame `constants`
+
+##### Summary
+
+Used to validate update order
+
+
+## CollProviderNull `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Gives a flat, still ocean.
+
+
+## CrestSortedList\`2 `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+This is a list this is meant to be similar in behaviour to the C#
+ SortedList, but without allocations when used directly in a foreach loop.
+
+ It works by using a regular list as as backing and ensuring that it is
+ sorted when the enumerator is accessed and used. This is a simple approach
+ that means we avoid sorting each time an element is added, and helps us
+ avoid having to develop our own more complex data structure.
+
+
+## DuplicateKeyComparer\`1 `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Comparer that always returns less or greater, never equal, to get work around unique key constraint
+
+
+## EditorHelpers `type`
+
+##### Namespace
+
+Crest.EditorHelpers
+
+##### Summary
+
+Provides general helper functions for the editor.
+
+
+### GetActiveSceneViewCamera() `method`
+
+##### Summary
+
+Returns the scene view camera if the scene view is focused.
+
+##### Parameters
+
+This method has no parameters.
+
+
+## EmbeddedAssetEditor `type`
+
+##### Namespace
+
+Crest.EditorHelpers
+
+##### Summary
+
+Helper for drawing embedded asset editors
+
+
+### #ctor() `constructor`
+
+##### Summary
+
+Create in OnEnable()
+
+##### Parameters
+
+This constructor has no parameters.
+
+
+### OnChanged `constants`
+
+##### Summary
+
+Called when the asset being edited was changed by the user.
+
+
+### OnCreateEditor `constants`
+
+##### Summary
+
+Called after the asset editor is created, in case it needs
+to be customized
+
+
+### m_CreateButtonGUIContent `constants`
+
+##### Summary
+
+Customize this after creation if you want
+
+
+### DrawEditorCombo() `method`
+
+##### Summary
+
+Call this from OnInspectorGUI. Will draw the asset reference field, and
+the embedded editor, or a Create Asset button, if no asset is set.
+
+##### Parameters
+
+This method has no parameters.
+
+
+### OnDisable() `method`
+
+##### Summary
+
+Free the resources in OnDisable()
+
+##### Parameters
+
+This method has no parameters.
+
+
+## FloatingObjectBase `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Base class for objects that float on water.
+
+
+## FloatingOrigin `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+This script translates all objects in the world to keep the camera near the origin in order to prevent spatial jittering due to limited
+floating-point precision. The script detects when the camera is further than 'threshold' units from the origin in one or more axes, at which
+point it moves everything so that the camera is back at the origin. There is also an option to disable physics beyond a certain point. This
+script should normally be attached to the viewpoint, typically the main camera.
+
+
+### MoveOriginDisablePhysics() `method`
+
+##### Summary
+
+Disable physics outside radius
+
+##### Parameters
+
+This method has no parameters.
+
+
+### MoveOriginOcean() `method`
+
+##### Summary
+
+Notify ocean of origin shift
+
+##### Parameters
+
+This method has no parameters.
+
+
+### MoveOriginParticles() `method`
+
+##### Summary
+
+Move all particles that are simulated in world space
+
+##### Parameters
+
+This method has no parameters.
+
+
+### MoveOriginTransforms() `method`
+
+##### Summary
+
+Move transforms to recenter around new origin
+
+##### Parameters
+
+This method has no parameters.
+
+
+## FlowProviderNull `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Gives a stationary ocean (no horizontal flow).
+
+
+## ICollProvider `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Interface for an object that returns ocean surface displacement and height.
+
+
+### CleanUp() `method`
+
+##### Summary
+
+On destroy, to cleanup resources
+
+##### Parameters
+
+This method has no parameters.
+
+
+### Query(i_ownerHash,i_minSpatialLength,i_queryPoints,o_resultHeights,o_resultNorms,o_resultVels) `method`
+
+##### Summary
+
+Query water physical data at a set of points. Pass in null to any out parameters that are not required.
+
+##### Parameters
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| i_ownerHash | [System.Int32](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Int32 'System.Int32') | Unique ID for calling code. Typically acquired by calling GetHashCode(). |
+| i_minSpatialLength | [System.Single](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Single 'System.Single') | The min spatial length of the object, such as the width of a boat. Useful for filtering out detail when not needed. Set to 0 to get full available detail. |
+| i_queryPoints | [UnityEngine.Vector3[]](#T-UnityEngine-Vector3[] 'UnityEngine.Vector3[]') | The world space points that will be queried. |
+| o_resultHeights | [System.Single[]](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Single[] 'System.Single[]') | Float array of water heights at the query positions. Pass null if this information is not required. |
+| o_resultNorms | [UnityEngine.Vector3[]](#T-UnityEngine-Vector3[] 'UnityEngine.Vector3[]') | Water normals at the query positions. Pass null if this information is not required. |
+| o_resultVels | [UnityEngine.Vector3[]](#T-UnityEngine-Vector3[] 'UnityEngine.Vector3[]') | Water surface velocities at the query positions. Pass null if this information is not required. |
+
+
+### Query(i_ownerHash,i_minSpatialLength,i_queryPoints,o_resultDisps,o_resultNorms,o_resultVels) `method`
+
+##### Summary
+
+Query water physical data at a set of points. Pass in null to any out parameters that are not required.
+
+##### Parameters
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| i_ownerHash | [System.Int32](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Int32 'System.Int32') | Unique ID for calling code. Typically acquired by calling GetHashCode(). |
+| i_minSpatialLength | [System.Single](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Single 'System.Single') | The min spatial length of the object, such as the width of a boat. Useful for filtering out detail when not needed. Set to 0 to get full available detail. |
+| i_queryPoints | [UnityEngine.Vector3[]](#T-UnityEngine-Vector3[] 'UnityEngine.Vector3[]') | The world space points that will be queried. |
+| o_resultDisps | [UnityEngine.Vector3[]](#T-UnityEngine-Vector3[] 'UnityEngine.Vector3[]') | Displacement vectors for water surface points that will displace to the XZ coordinates of the query points. Water heights are given by sea level plus the y component of the displacement. |
+| o_resultNorms | [UnityEngine.Vector3[]](#T-UnityEngine-Vector3[] 'UnityEngine.Vector3[]') | Water normals at the query positions. Pass null if this information is not required. |
+| o_resultVels | [UnityEngine.Vector3[]](#T-UnityEngine-Vector3[] 'UnityEngine.Vector3[]') | Water surface velocities at the query positions. Pass null if this information is not required. |
+
+
+### RetrieveSucceeded() `method`
+
+##### Summary
+
+Check if query results could be retrieved successfully using return code from Query() function
+
+##### Parameters
+
+This method has no parameters.
+
+
+### UpdateQueries() `method`
+
+##### Summary
+
+Per frame update callback
+
+##### Parameters
+
+This method has no parameters.
+
+
+## IFloatingOrigin `type`
+
+##### Namespace
+
+Crest
+
+
+### SetOrigin() `method`
+
+##### Summary
+
+Set a new origin. This is equivalent to subtracting the new origin position from any world position state.
+
+##### Parameters
+
+This method has no parameters.
+
+
+## IFlowProvider `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Interface for an object that returns ocean surface displacement and height.
+
+
+### CleanUp() `method`
+
+##### Summary
+
+On destroy, to cleanup resources
+
+##### Parameters
+
+This method has no parameters.
+
+
+### Query(i_ownerHash,i_minSpatialLength,i_queryPoints,o_resultVels) `method`
+
+##### Summary
+
+Query water flow data (horizontal motion) at a set of points.
+
+##### Parameters
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| i_ownerHash | [System.Int32](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Int32 'System.Int32') | Unique ID for calling code. Typically acquired by calling GetHashCode(). |
+| i_minSpatialLength | [System.Single](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Single 'System.Single') | The min spatial length of the object, such as the width of a boat. Useful for filtering out detail when not needed. Set to 0 to get full available detail. |
+| i_queryPoints | [UnityEngine.Vector3[]](#T-UnityEngine-Vector3[] 'UnityEngine.Vector3[]') | The world space points that will be queried. |
+| o_resultVels | [UnityEngine.Vector3[]](#T-UnityEngine-Vector3[] 'UnityEngine.Vector3[]') | Water surface flow velocities at the query positions. |
+
+
+### RetrieveSucceeded() `method`
+
+##### Summary
+
+Check if query results could be retrieved successfully using return code from Query() function
+
+##### Parameters
+
+This method has no parameters.
+
+
+### UpdateQueries() `method`
+
+##### Summary
+
+Per frame update callback
+
+##### Parameters
+
+This method has no parameters.
+
+
+## IPropertyWrapper `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Unified interface for setting properties on both materials and material property blocks
+
+
+## ITimeProvider `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Base class for scripts that provide the time to the ocean system. See derived classes for examples.
+
+
+## LodDataMgr `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Base class for data/behaviours created on each LOD.
+
+
+## LodDataMgrAnimWaves `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Captures waves/shape that is drawn kinematically - there is no frame-to-frame state. The Gerstner
+ waves are drawn in this way. There are two special features of this particular LodData.
+
+ * A combine pass is done which combines downwards from low detail LODs down into the high detail LODs (see OceanScheduler).
+ * The textures from this LodData are passed to the ocean material when the surface is drawn (by OceanChunkRenderer).
+ * LodDataDynamicWaves adds its results into this LodData. The dynamic waves piggy back off the combine
+ pass and subsequent assignment to the ocean material (see OceanScheduler).
+
+ The RGB channels are the XYZ displacement from a rest plane at sea level to the corresponding displaced position on the
+ surface. The A channel holds the variance/energy in all the smaller wavelengths that are too small to go into the cascade
+ slice. This is used as a statistical measure for the missing waves and is used to ensure foam is generated everywhere.
+
+
+### _shapeCombinePass `constants`
+
+##### Summary
+
+Turn shape combine pass on/off. Debug only - ifdef'd out in standalone
+
+
+### SuggestDataLOD() `method`
+
+##### Summary
+
+Returns index of lod that completely covers the sample area, and contains wavelengths that repeat no more than twice across the smaller
+spatial length. If no such lod available, returns -1. This means high frequency wavelengths are filtered out, and the lod index can
+be used for each sample in the sample area.
+
+##### Parameters
+
+This method has no parameters.
+
+
+## LodDataMgrClipSurface `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Drives ocean surface clipping (carving holes). 0-1 values, surface clipped when > 0.5.
+
+
+## LodDataMgrDynWaves `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+A dynamic shape simulation that moves around with a displacement LOD.
+
+
+## LodDataMgrFlow `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+A persistent flow simulation that moves around with a displacement LOD. The input is fully combined water surface shape.
+
+
+## LodDataMgrFoam `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+A persistent foam simulation that moves around with a displacement LOD. The input is fully combined water surface shape.
+
+
+## LodDataMgrPersistent `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+A persistent simulation that moves around with a displacement LOD.
+
+
+### SetAdditionalSimParams() `method`
+
+##### Summary
+
+Set any sim-specific shader params.
+
+##### Parameters
+
+This method has no parameters.
+
+
+## LodDataMgrSeaFloorDepth `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Renders depth of the ocean (height of sea level above ocean floor), by rendering the relative height of tagged objects from top down.
+
+
+## LodDataMgrShadow `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Stores shadowing data to use during ocean shading. Shadowing is persistent and supports sampling across
+many frames and jittered sampling for (very) soft shadows.
+
+
+## LodTransform `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+This script is attached to the parent GameObject of each LOD. It provides helper functionality related to each LOD.
+
+
+## MultiPropertyAttribute `type`
+
+##### Namespace
+
+Crest
+
+
+### BuildLabel() `method`
+
+##### Summary
+
+Override this method to customise the label.
+
+##### Parameters
+
+This method has no parameters.
+
+
+### GetPropertyHeight() `method`
+
+##### Summary
+
+Override this method to specify how tall the GUI for this field is in pixels.
+
+##### Parameters
+
+This method has no parameters.
+
+
+### OnGUI() `method`
+
+##### Summary
+
+Override this method to make your own IMGUI based GUI for the property.
+
+##### Parameters
+
+This method has no parameters.
+
+
+## ObjectWaterInteraction `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Drives object/water interaction - sets parameters each frame on material that renders into the dynamic wave sim.
+
+
+## OceanBuilder `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Instantiates all the ocean geometry, as a set of tiles.
+
+
+## OceanChunkRenderer `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Sets shader parameters for each geometry tile/chunk.
+
+
+## OceanDepthCache `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Renders terrain height / ocean depth once into a render target to cache this off and avoid rendering it every frame.
+This should be used for static geometry, dynamic objects should be tagged with the Render Ocean Depth component.
+
+
+## OceanPlanarReflection `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Attach to a camera to generate a reflection texture which can be sampled in the ocean shader.
+
+
+### RefreshPerFrames `constants`
+
+##### Summary
+
+Refresh reflection every x frames(1-every frame)
+
+
+### _frameRefreshOffset `constants`
+
+##### Summary
+
+To relax OceanPlanarReflection refresh to different frames need to set different values for each script
+
+
+### ForceDistanceCulling(farClipPlane) `method`
+
+##### Summary
+
+Limit render distance for reflection camera for first 32 layers
+
+##### Parameters
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| farClipPlane | [System.Single](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Single 'System.Single') | reflection far clip distance |
+
+
+## OceanRenderer `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+The main script for the ocean system. Attach this to a GameObject to create an ocean. This script initializes the various data types and systems
+and moves/scales the ocean based on the viewpoint. It also hosts a number of global settings that can be tweaked here.
+
+
+### CollisionProvider `property`
+
+##### Summary
+
+Provides ocean shape to CPU.
+
+
+### CurrentLodCount `property`
+
+##### Summary
+
+The number of LODs/scales that the ocean is currently using.
+
+
+### MaxHorizDisplacement `property`
+
+##### Summary
+
+The maximum horizontal distance that the shape scripts are displacing the shape.
+
+
+### MaxVertDisplacement `property`
+
+##### Summary
+
+The maximum height that the shape scripts are displacing the shape.
+
+
+### Scale `property`
+
+##### Summary
+
+Current ocean scale (changes with viewer altitude).
+
+
+### ScaleCouldDecrease `property`
+
+##### Summary
+
+Could the ocean horizontal scale decrease (for e.g. if the viewpoint drops in altitude). Will be false if ocean already at minimum scale.
+
+
+### ScaleCouldIncrease `property`
+
+##### Summary
+
+Could the ocean horizontal scale increase (for e.g. if the viewpoint gains altitude). Will be false if ocean already at maximum scale.
+
+
+### SeaLevel `property`
+
+##### Summary
+
+Sea level is given by y coordinate of GameObject with OceanRenderer script.
+
+
+### ViewerAltitudeLevelAlpha `property`
+
+##### Summary
+
+The ocean changes scale when viewer changes altitude, this gives the interpolation param between scales.
+
+
+### ViewerHeightAboveWater `property`
+
+##### Summary
+
+Vertical offset of camera vs water surface.
+
+
+### ReportMaxDisplacementFromShape() `method`
+
+##### Summary
+
+User shape inputs can report in how far they might displace the shape horizontally and vertically. The max value is
+saved here. Later the bounding boxes for the ocean tiles will be expanded to account for this potential displacement.
+
+##### Parameters
+
+This method has no parameters.
+
+
+## OceanWaveSpectrum `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Ocean shape representation - power values for each octave of wave components.
+
+
+### GenerateWaveData() `method`
+
+##### Summary
+
+Samples spectrum to generate wave data. Wavelengths will be in ascending order.
+
+##### Parameters
+
+This method has no parameters.
+
+
+## PatchType `type`
+
+##### Namespace
+
+Crest.OceanBuilder
+
+
+### Count `constants`
+
+##### Summary
+
+Number of patch types
+
+
+### Fat `constants`
+
+##### Summary
+
+Adds a full skirt all of the way around a patch
+
+ -------------
+ | | | | |
+ 1 -------------
+ | | | | |
+ z -------------
+ | | | | |
+ 0 -------------
+ | | | | |
+ -------------
+ 0 1
+x
+
+
+### FatX `constants`
+
+##### Summary
+
+Adds a skirt on the right hand side of the patch
+
+ 1 ----------
+ | | | |
+ z ----------
+ | | | |
+ 0 ----------
+ 0 1
+ x
+
+
+### FatXOuter `constants`
+
+##### Summary
+
+Outer most side - this adds an extra skirt on the left hand side of the patch,
+ which will point outwards and be extended to Zfar
+
+ 1 --------------------------------------------------------------------------------------
+ | | | |
+ z --------------------------------------------------------------------------------------
+ | | | |
+ 0 --------------------------------------------------------------------------------------
+ 0 1
+ x
+
+
+### FatXSlimZ `constants`
+
+##### Summary
+
+Adds a skirt on the right hand side of the patch, removes skirt from top
+
+
+### FatXZ `constants`
+
+##### Summary
+
+Adds skirts at the top and right sides of the patch
+
+
+### FatXZOuter `constants`
+
+##### Summary
+
+Adds skirts at the top and right sides of the patch and pushes them to horizon
+
+
+### Interior `constants`
+
+##### Summary
+
+Adds no skirt. Used in interior of highest detail LOD (0)
+
+ 1 -------
+ | | |
+ z -------
+ | | |
+ 0 -------
+ 0 1
+ x
+
+
+### SlimX `constants`
+
+##### Summary
+
+One less set of verts in x direction
+
+
+### SlimXFatZ `constants`
+
+##### Summary
+
+One less set of verts in x direction, extra verts at start of z direction
+
+ ----
+ | |
+ 1 ----
+ | |
+ z ----
+ | |
+ 0 ----
+ 0 1
+ x
+
+
+### SlimXZ `constants`
+
+##### Summary
+
+One less set of verts in both x and z directions
+
+
+## PredicatedFieldAttribute `type`
+
+##### Namespace
+
+Crest
+
+
+### #ctor(propertyName,inverted,disableIfValueIs) `constructor`
+
+##### Summary
+
+The field with this attribute will be drawn enabled/disabled based on another field. For example can be used
+to disable a field if a toggle is false. Limitation - conflicts with other property drawers such as Range().
+
+##### Parameters
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| propertyName | [System.String](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.String 'System.String') | The name of the other property whose value dictates whether this field is enabled or not. |
+| inverted | [System.Boolean](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Boolean 'System.Boolean') | Flip behaviour - for example disable if a bool field is set to true (instead of false). |
+| disableIfValueIs | [System.Int32](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Int32 'System.Int32') | If the field has this value, disable the GUI (or enable if inverted is true). |
+
+
+## QueryBase `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Provides heights and other physical data about the water surface. Works by uploading query positions to GPU and computing
+the data and then transferring back the results asynchronously. An exception to this is water surface velocities - these can
+not be computed on the GPU and are instead computed on the CPU by retaining last frames' query results and computing finite diffs.
+
+
+### CalculateVelocities() `method`
+
+##### Summary
+
+Compute time derivative of the displacements by calculating difference from last query. More complicated than it would seem - results
+may not be available in one or both of the results, or the query locations in the array may change.
+
+##### Parameters
+
+This method has no parameters.
+
+
+### CompactQueryStorage() `method`
+
+##### Summary
+
+Remove air bubbles from the query array. Currently this lazily just nukes all the registered
+query IDs so they'll be recreated next time (generating garbage).
+
+##### Parameters
+
+This method has no parameters.
+
+
+### DataArrived() `method`
+
+##### Summary
+
+Called when a compute buffer has been read back from the GPU to the CPU.
+
+##### Parameters
+
+This method has no parameters.
+
+
+### RemoveQueryPoints() `method`
+
+##### Summary
+
+Signal that we're no longer servicing queries. Note this leaves an air bubble in the query buffer.
+
+##### Parameters
+
+This method has no parameters.
+
+
+### RetrieveResults() `method`
+
+##### Summary
+
+Copy out displacements, heights, normals. Pass null if info is not required.
+
+##### Parameters
+
+This method has no parameters.
+
+
+### UpdateQueryPoints() `method`
+
+##### Summary
+
+Takes a unique request ID and some world space XZ positions, and computes the displacement vector that lands at this position,
+to a good approximation. The world space height of the water at that position is then SeaLevel + displacement.y.
+
+##### Parameters
+
+This method has no parameters.
+
+
+## QueryDisplacements `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Samples water surface shape - displacement, height, normal, velocity.
+
+
+## QueryFlow `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Samples horizontal motion of water volume
+
+
+## RayTraceHelper `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Helper to trace a ray against the ocean surface, by sampling at a set of points along the ray and interpolating the
+intersection location.
+
+
+### #ctor() `constructor`
+
+##### Summary
+
+Constructor. The length of the ray and the step size must be given here. The smaller the step size, the greater the accuracy.
+
+##### Parameters
+
+This constructor has no parameters.
+
+
+### Init(i_rayOrigin,i_rayDirection) `method`
+
+##### Summary
+
+Call this each frame to initialize the trace.
+
+##### Parameters
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| i_rayOrigin | [UnityEngine.Vector3](#T-UnityEngine-Vector3 'UnityEngine.Vector3') | World space position of ray origin |
+| i_rayDirection | [UnityEngine.Vector3](#T-UnityEngine-Vector3 'UnityEngine.Vector3') | World space ray direction |
+
+
+### Trace(o_distance) `method`
+
+##### Summary
+
+Call this once each frame to do the query, after calling Init().
+
+##### Returns
+
+True if the results have come back from the GPU, and if the ray intersects the water surface.
+
+##### Parameters
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| o_distance | [System.Single@](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Single@ 'System.Single@') | The distance along the ray to the first intersection with the water surface. |
+
+
+## RegisterAnimWavesInput `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Registers a custom input to the wave shape. Attach this GameObjects that you want to render into the displacmeent textures to affect ocean shape.
+
+
+## RegisterClipSurfaceInput `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Registers a custom input to the clip surface simulation. Attach this to GameObjects that you want to use to
+clip the surface of the ocean.
+
+
+## RegisterDynWavesInput `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Registers a custom input to the dynamic wave simulation. Attach this GameObjects that you want to influence the sim to add ripples etc.
+
+
+## RegisterFlowInput `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Registers a custom input to the flow data. Attach this GameObjects that you want to influence the horizontal flow of the water volume.
+
+
+## RegisterFoamInput `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Registers a custom input to the foam simulation. Attach this GameObjects that you want to influence the foam simulation, such as depositing foam on the surface.
+
+
+## RegisterLodDataInputBase `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Base class for scripts that register input to the various LOD data types.
+
+
+## RegisterLodDataInput\`1 `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Registers input to a particular LOD data.
+
+
+## RegisterSeaFloorDepthInput `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Tags this object as an ocean depth provider. Renders depth every frame and should only be used for dynamic objects.
+For static objects, use an Ocean Depth Cache.
+
+
+## RegisterShadowInput `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Registers a custom input for shadow data. Attach this to GameObjects that you want use to override shadows.
+
+
+## RenderAlphaOnSurface `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Helper script for alpha geometry rendering on top of ocean surface. This is required to select the best
+LOD and assign the shape texture to the material.
+
+
+## RenderWireFrame `type`
+
+##### Namespace
+
+
+
+##### Summary
+
+Triggers the scene render to happen in wireframe. Unfortunately this currently affects the GUI elements as well.
+
+
+## SampleFlowHelper `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Helper to obtain the flow data (horizontal water motion) at a single location. This is not particularly efficient to sample a single height,
+but is a fairly common case.
+
+
+### Init(i_queryPos,i_minLength) `method`
+
+##### Summary
+
+Call this to prime the sampling
+
+##### Parameters
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| i_queryPos | [UnityEngine.Vector3](#T-UnityEngine-Vector3 'UnityEngine.Vector3') | World space position to sample |
+| i_minLength | [System.Single](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Single 'System.Single') | The smallest length scale you are interested in. If you are sampling data for boat physics,
+pass in the boats width. Larger objects will filter out detailed flow information. |
+
+
+### Sample() `method`
+
+##### Summary
+
+Call this to do the query. Can be called only once after Init().
+
+##### Parameters
+
+This method has no parameters.
+
+
+## SampleHeightHelper `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Helper to obtain the ocean surface height at a single location per frame. This is not particularly efficient to sample a single height,
+but is a fairly common case.
+
+
+### Init(i_queryPos,i_minLength,allowMultipleCallsPerFrame) `method`
+
+##### Summary
+
+Call this to prime the sampling. The SampleHeightHelper is good for one query per frame - if it is called multiple times in one frame
+it will throw a warning. Calls from FixedUpdate are an exception to this - pass true as the last argument to disable the warning.
+
+##### Parameters
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| i_queryPos | [UnityEngine.Vector3](#T-UnityEngine-Vector3 'UnityEngine.Vector3') | World space position to sample |
+| i_minLength | [System.Single](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Single 'System.Single') | The smallest length scale you are interested in. If you are sampling data for boat physics,
+pass in the boats width. Larger objects will ignore small wavelengths. |
+| allowMultipleCallsPerFrame | [System.Boolean](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Boolean 'System.Boolean') | Pass true if calling from FixedUpdate(). This will omit a warning when there on multipled-FixedUpdate frames. |
+
+
+### Sample() `method`
+
+##### Summary
+
+Call this to do the query. Can be called only once after Init().
+
+##### Parameters
+
+This method has no parameters.
+
+
+## ScriptableObjectUtility `type`
+
+##### Namespace
+
+Crest.EditorHelpers
+
+
+### CreateAt() `method`
+
+##### Summary
+
+Create a scriptable object asset
+
+##### Parameters
+
+This method has no parameters.
+
+
+### CreateAt\`\`1() `method`
+
+##### Summary
+
+Create a scriptable object asset
+
+##### Parameters
+
+This method has no parameters.
+
+
+## SegmentRegistrar `type`
+
+##### Namespace
+
+Crest.QueryBase
+
+##### Summary
+
+Holds information about all query points. Maps from unique hash code to position in point array.
+
+
+## SegmentRegistrarRingBuffer `type`
+
+##### Namespace
+
+Crest.QueryBase
+
+##### Summary
+
+Since query results return asynchronously and may not return at all (in theory), we keep a ringbuffer
+of the registrars of the last frames so that when data does come back it can be interpreted correctly.
+
+
+## ShapeGerstner `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Gerstner ocean waves.
+
+
+### MinWavelength() `method`
+
+##### Summary
+
+Min wavelength for a cascade in the wave buffer. Does not depend on viewpoint.
+
+##### Parameters
+
+This method has no parameters.
+
+
+## ShapeGerstnerBatched `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Support script for Gerstner wave ocean shapes.
+Generates a number of batches of Gerstner waves.
+
+
+### UpdateBatch() `method`
+
+##### Summary
+
+Computes Gerstner params for a set of waves, for the given lod idx. Writes shader data to the given property.
+Returns number of wave components rendered in this batch.
+
+##### Parameters
+
+This method has no parameters.
+
+
+## ShapeGerstnerSplineHandling `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Generates mesh suitable for rendering gerstner waves from a spline
+
+
+## SimSettingsAnimatedWaves `type`
+
+##### Namespace
+
+Crest
+
+
+### CreateCollisionProvider() `method`
+
+##### Summary
+
+Provides ocean shape to CPU.
+
+##### Parameters
+
+This method has no parameters.
+
+
+## SimSettingsBase `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Base class for simulation settings.
+
+
+## SimpleFloatingObject `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Applies simple approximation of buoyancy force - force based on submerged depth and torque based on alignment
+to water normal.
+
+
+### FixedUpdateOrientation() `method`
+
+##### Summary
+
+Align to water normal. One normal by default, but can use a separate normal based on boat length vs width. This gives
+varying rotations based on boat dimensions.
+
+##### Parameters
+
+This method has no parameters.
+
+
+## SphereWaterInteraction `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+This script and associated shader approximate the interaction between a sphere and the water. Multiple
+spheres can be used to model the interaction of a non-spherical shape.
+
+
+## Spline `type`
+
+##### Namespace
+
+Crest.Spline
+
+##### Summary
+
+Simple spline object. Spline points are child gameobjects.
+
+
+## SplineInterpolation `type`
+
+##### Namespace
+
+Crest.Spline
+
+##### Summary
+
+Support functions for interpolating a spline
+
+
+### GenerateCubicSplineHull(splinePoints,splinePointsAndTangents) `method`
+
+##### Summary
+
+Takes user-placed spline points and generates an array of points and generates an array of positions and tangents
+suitable for plugging into cubic interpolation
+
+##### Parameters
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| splinePoints | [Crest.Spline.SplinePoint[]](#T-Crest-Spline-SplinePoint[] 'Crest.Spline.SplinePoint[]') | Input user-placed spline positions |
+| splinePointsAndTangents | [UnityEngine.Vector3[]](#T-UnityEngine-Vector3[] 'UnityEngine.Vector3[]') | Generated spline points and tangents |
+
+
+### InterpolateCubicPosition(splinePointCount,splinePointsAndTangents,t,position) `method`
+
+##### Summary
+
+Cubic interpolation of spline points
+
+##### Parameters
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| splinePointCount | [System.Single](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Single 'System.Single') | Number of user placed spline points (not including tangent points) |
+| splinePointsAndTangents | [UnityEngine.Vector3[]](#T-UnityEngine-Vector3[] 'UnityEngine.Vector3[]') | The spline handle points and tangent points |
+| t | [System.Single](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Single 'System.Single') | 0-1 parameter along entire spline |
+| position | [UnityEngine.Vector3@](#T-UnityEngine-Vector3@ 'UnityEngine.Vector3@') | Result position |
+
+
+### InterpolateLinearPosition(points,t,position) `method`
+
+##### Summary
+
+Linearly interpolate between spline points
+
+##### Parameters
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| points | [UnityEngine.Vector3[]](#T-UnityEngine-Vector3[] 'UnityEngine.Vector3[]') | The spline points |
+| t | [System.Single](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Single 'System.Single') | 0-1 parameter along entire spline |
+| position | [UnityEngine.Vector3@](#T-UnityEngine-Vector3@ 'UnityEngine.Vector3@') | Result position |
+
+
+## SplinePoint `type`
+
+##### Namespace
+
+Crest.Spline
+
+##### Summary
+
+Spline point, intended to be child of Spline object
+
+
+## TimeProviderCustom `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+This time provider fixes the ocean time at a custom value which is usable for testing/debugging.
+
+
+## TimeProviderDefault `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Default time provider - sets the ocean time to Unity's game time.
+
+
+## UnderwaterEffect `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Handles effects that need to track the water surface. Feeds in wave data and disables rendering when
+not close to water.
+
+
+## VisualiseCollisionArea `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Debug draw crosses in an area around the GameObject on the water surface.
+
+
+## VisualiseRayTrace `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Debug draw a line trace from this gameobjects position, in this gameobjects forward direction.
+
+
+## WaterBody `type`
+
+##### Namespace
+
+Crest
+
+##### Summary
+
+Demarcates an AABB area where water is present in the world. If present, ocean tiles will be
+culled if they don't overlap any WaterBody.
diff --git a/docs/conf.py b/docs/conf.py
index 3a1953f1e..577c93f72 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -12,6 +12,7 @@
import os
import sys
+
sys.path.insert(0, os.path.abspath('./extensions'))
# -- Project information -----------------------------------------------------
@@ -20,6 +21,37 @@
copyright = '2021, Wave Harmonic & Contributors'
author = 'Wave Harmonic & Contributors'
+# -- Create API copy DefaultDocumentation -----------------------------------
+
+import subprocess
+
+if not (os.path.exists('api/') and os.path.isdir('api/')):
+ os.mkdir('api/')
+
+try:
+ vswhere_cmd = subprocess.run(['vswhere', '-latest', '-requires', 'Microsoft.Component.MSBuild', '-find', 'MSBuild\\**\\Bin\\MsBuild.exe'], check=True, stdout=subprocess.PIPE)
+ msbuild_path = vswhere_cmd.stdout.strip()
+ csproj_path = os.path.abspath('../crest/Crest.csproj')
+ xml_path = os.path.abspath('./api/api.xml')
+ print(xml_path)
+
+ msbuild_cmd = subprocess.run([msbuild_path, '-p:DocumentationFile=' + xml_path, csproj_path], stdout=subprocess.DEVNULL)
+except:
+ print("Unable to build API from source. Continuing...")
+# try:
+# files = [file for file in os.listdir("../crest/Temp/bin/Debug") if file.endswith('.md')]
+# if not (os.path.exists('api/') and os.path.isdir('api/')):
+# os.mkdir('api/')
+# if len(files) == 0:
+# raise FileNotFoundError("No .md files were found in ../crest/Temp/bin/Debug/")
+
+# import shutil
+# for file_name in files:
+# shutil.copyfile(os.path.abspath('../crest/Temp/bin/Debug/' + file_name), os.path.abspath('api/' + file_name))
+# except FileNotFoundError as e:
+# print(e)
+# print('Assuming .md files are already present in docs/api/')
+
# -- General configuration ---------------------------------------------------
@@ -34,6 +66,9 @@
"furo",
+ "recommonmark",
+ "sphinx_markdown_tables",
+
# Local packages
"youtube",
"variables",
@@ -45,6 +80,11 @@
"sphinx_search.extension",
]
+source_suffix = {
+ '.rst': 'restructuredtext',
+ '.md': 'markdown',
+}
+
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
diff --git a/docs/index.rst b/docs/index.rst
index a79cc09e1..bc654897d 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -112,6 +112,7 @@ User Guide
user/performance
user/technical-information
user/faq
+ api/Crest
.. user/quickstart
.. user/support
diff --git a/docs/requirements.txt b/docs/requirements.txt
index d15f54ec2..6d373a5a9 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -15,6 +15,7 @@ Pygments==2.8.0
pyparsing==2.4.7
pytz==2021.1
readthedocs-sphinx-search==0.1.0
+recommonmark==0.7.1
requests==2.25.1
six==1.15.0
snowballstemmer==2.1.0
@@ -24,6 +25,7 @@ sphinx-autobuild==2020.9.1
sphinx-hoverxref==0.5b1
sphinx-inline-tabs @ git+https://github.com/daleeidd/sphinx-inline-tabs@e70a7d08f11df10df1011c575d73d6f296b62cfc
sphinx-issues==1.2.0
+sphinx-markdown-tables==0.0.15
sphinx-panels==0.5.2
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
diff --git a/docs/vswhere.exe b/docs/vswhere.exe
new file mode 100644
index 000000000..582e82868
Binary files /dev/null and b/docs/vswhere.exe differ