155 lines
4.5 KiB
C#
155 lines
4.5 KiB
C#
using UnityEngine;
|
|
using System.Diagnostics;
|
|
using System.Runtime.InteropServices;
|
|
using System.Collections.Generic;
|
|
|
|
|
|
public class Player : MonoBehaviour
|
|
{
|
|
public VoxelTreeManager voxelManager;
|
|
|
|
public bool EnableDebug = false;
|
|
|
|
int totalCastDone = 0;
|
|
|
|
public float longitudeStep = 45f;
|
|
public float lateralStep = 45f;
|
|
|
|
int rayCount;
|
|
|
|
// Start is called once before the first execution of Update after the MonoBehaviour is created
|
|
void Start()
|
|
{
|
|
InitPrebuildArray();
|
|
|
|
VoxelRaycastGPU.Ray[] rays = new VoxelRaycastGPU.Ray[rayCount];
|
|
FillRaysArray(rays);
|
|
voxelManager.gpuRayCaster.Init(rayCount, rays, 3);
|
|
}
|
|
|
|
void Cast( ref VoxelRaycastGPU.BatchData[] batchData, int batchCount, int iIteration )
|
|
{
|
|
Stopwatch sw = Stopwatch.StartNew();
|
|
totalCastDone += batchCount * rayCount;
|
|
VoxelRaycastGPU.BatchData[] hits = voxelManager.CastGpuRay(in batchData, batchCount);
|
|
|
|
/**
|
|
for( int i = 0; i < hits.Length; i++ )
|
|
{
|
|
GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
|
|
sphere.transform.position = hits[i].origin;
|
|
sphere.transform.localScale = Vector3.one * 0.5f;
|
|
}
|
|
*/
|
|
|
|
sw.Stop();
|
|
}
|
|
|
|
Vector3[] prebuildArrayDirection;
|
|
|
|
void InitPrebuildArray()
|
|
{
|
|
var dirs = new List<Vector3>();
|
|
|
|
const float EPS = 1e-6f;
|
|
|
|
// Elevation (longitude in your naming): from -90 to +90 inclusive
|
|
for (float lonDeg = -90f; lonDeg <= 90f + 1e-6f; lonDeg += longitudeStep)
|
|
{
|
|
float lonRad = lonDeg * Mathf.Deg2Rad;
|
|
float cosLon = Mathf.Cos(lonRad);
|
|
float sinLon = Mathf.Sin(lonRad);
|
|
|
|
// If cosLon is ~0, we are at a pole: all azimuths collapse to the same vector.
|
|
if (Mathf.Abs(cosLon) < EPS)
|
|
{
|
|
// Add a single pole direction (north or south)
|
|
dirs.Add(new Vector3(0f, sinLon, 0f));
|
|
continue; // skip azimuth loop for this elevation
|
|
}
|
|
|
|
// Otherwise loop over azimuth (lateral)
|
|
for (float latDeg = 0f; latDeg < 360f - 1e-6f; latDeg += lateralStep)
|
|
{
|
|
float latRad = latDeg * Mathf.Deg2Rad;
|
|
float cosLat = Mathf.Cos(latRad);
|
|
float sinLat = Mathf.Sin(latRad);
|
|
|
|
Vector3 dir = new Vector3(
|
|
cosLon * cosLat,
|
|
sinLon,
|
|
cosLon * sinLat
|
|
);
|
|
|
|
dirs.Add(dir.normalized);
|
|
}
|
|
}
|
|
|
|
prebuildArrayDirection = dirs.ToArray();
|
|
rayCount = dirs.Count;
|
|
}
|
|
|
|
void FillRaysArray( VoxelRaycastGPU.Ray[] rays )
|
|
{
|
|
for (int i = 0; i < prebuildArrayDirection.Length; i++)
|
|
{
|
|
rays[i].direction = prebuildArrayDirection[i];
|
|
}
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void Update()
|
|
{
|
|
if (Input.GetKeyDown(KeyCode.R))
|
|
{
|
|
//VoxelTreeRaycaster.HitInfo outHit;
|
|
|
|
Vector3 origin = GetComponent<Transform>().position;
|
|
|
|
UnityEngine.Debug.Log(origin);
|
|
|
|
//int iNbCast = 0;
|
|
|
|
/*Stopwatch sw = Stopwatch.StartNew();
|
|
|
|
for (float el = -90f; el <= 90f; el += elStep)
|
|
{
|
|
for (float az = 0f; az < 360f; az += azStep)
|
|
{
|
|
float elRad = el * Mathf.Deg2Rad;
|
|
float azRad = az * Mathf.Deg2Rad;
|
|
|
|
Vector3 dir = new Vector3(
|
|
Mathf.Cos(elRad) * Mathf.Cos(azRad),
|
|
Mathf.Sin(elRad),
|
|
Mathf.Cos(elRad) * Mathf.Sin(azRad)
|
|
).normalized;
|
|
|
|
iNbCast++;
|
|
bool hit = voxelManager.CastRay(origin, dir, 100f, out outHit);
|
|
}
|
|
}
|
|
|
|
sw.Stop();
|
|
|
|
UnityEngine.Debug.Log($"RayCast done in {sw.Elapsed.TotalMilliseconds}ms for {iNbCast} casts");*/
|
|
|
|
Stopwatch sw = Stopwatch.StartNew();
|
|
|
|
totalCastDone = 0;
|
|
|
|
VoxelRaycastGPU.Ray[] rays = new VoxelRaycastGPU.Ray[rayCount];
|
|
VoxelRaycastGPU.BatchData[] batchDatas = new VoxelRaycastGPU.BatchData[1];
|
|
|
|
batchDatas[0].origin = origin;
|
|
batchDatas[0].maxDistance = 300;
|
|
|
|
Cast(ref batchDatas, 1, 0);
|
|
sw.Stop();
|
|
|
|
UnityEngine.Debug.Log($"Gpu RayCast done in {sw.Elapsed.TotalMilliseconds}ms for {totalCastDone} casts");
|
|
|
|
}
|
|
}
|
|
}
|