Advertisement
Staggart

River Modeler DWP2 integration

Dec 19th, 2024
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.22 KB | None | 0 0
  1. using System;
  2. using UnityEngine;
  3. using NWH.DWP2.WaterObjects;
  4. using sc.modeling.river.runtime;
  5.  
  6. namespace NWH.DWP2.WaterData
  7. {
  8.     public class RiverWaterDataProvider : RaycastWaterDataProvider
  9.     {
  10.         [Min(0)]
  11.         [Space]
  12.         public float baseFlowStrength = 5f;
  13.        
  14.         private RiverModeler river;
  15.         private int prevRiverHash;
  16.        
  17.         public override void Awake()
  18.         {
  19.             base.Awake();
  20.             Physics.IgnoreLayerCollision(waterLayer, objectLayer);
  21.             _rayDirection = -Vector3.up;
  22.             _rayStartOffset = -_rayDirection * raycastDistance * 0.5f;
  23.             _prevDataSize = -1;
  24.         }
  25.  
  26.         private void Reset()
  27.         {
  28.             river = FindObjectOfType<RiverModeler>();
  29.  
  30.             if (river) waterLayer = river.gameObject.layer;
  31.         }
  32.  
  33.         public override bool SupportsWaterFlowQueries()
  34.         {
  35.             return true;
  36.         }
  37.  
  38.         private Vector2[] meshFlowData;
  39.         private int[] meshTriangles;
  40.        
  41.         public override void GetWaterFlows(WaterObject waterObject, ref Vector3[] points, ref Vector3[] waterFlows)
  42.         {
  43.             _flow = Vector3.zero;
  44.            
  45.             bool queriesHitBackfaces = Physics.queriesHitBackfaces;
  46.             Physics.queriesHitBackfaces = false;
  47.            
  48.             _ray.origin = waterObject.transform.position + _rayStartOffset;
  49.             _ray.direction = _rayDirection;
  50.            
  51.             if (Physics.Raycast(_ray, out _hit, raycastDistance, _layerMask, QueryTriggerInteraction.Ignore) && _hit.collider != null)
  52.             {
  53.                 river = _hit.collider.GetComponent<RiverModeler>();
  54.                
  55.                 if (river && river.settings.uv.flowVectors)
  56.                 {
  57.                     _mesh = river.meshFilter.sharedMesh;
  58.                    
  59.                     //Check if the river being evaluated is the same as in last query
  60.                     int hashCode = river.GetHashCode();
  61.                     if (hashCode != prevRiverHash)
  62.                     {
  63.                         //Debug.Log($"[DWP2] Now sampling {river.gameObject.name}");
  64.                        
  65.                         prevRiverHash = hashCode;
  66.  
  67.                         //Cache the Mesh data arrays, as accessing it directly from the mesh incurs unwanted allocations.
  68.                         meshFlowData = _mesh.uv3;
  69.                         meshTriangles = _mesh.triangles;
  70.                     }
  71.                    
  72.                     _vertIndex = meshTriangles[_hit.triangleIndex * 3];
  73.                     _uv4 = meshFlowData[_vertIndex];
  74.                    
  75.                     _vertDir.x = _uv4.x;
  76.                     _vertDir.y = 0;
  77.                     _vertDir.z = _uv4.y;
  78.                    
  79.                     _flow.x = _vertDir.x * baseFlowStrength;
  80.                     _flow.y = 0;
  81.                     _flow.z = _vertDir.z * baseFlowStrength;
  82.                 }
  83.                
  84.                 for (int d = 0; d < waterFlows.Length; d++)
  85.                 {
  86.                     waterFlows[d] = _flow;
  87.                 }
  88.             }
  89.            
  90.             Physics.queriesHitBackfaces = queriesHitBackfaces;
  91.         }
  92.     }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement