1
0
forked from cgvr/DeltaVR

fix shapescanner incorrect ray counting and make asynchronous

This commit is contained in:
2026-03-16 11:28:58 +02:00
parent 717964affd
commit db60947749
6 changed files with 42 additions and 21 deletions

View File

@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using TMPro;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;
@@ -99,13 +99,7 @@ public class ShapeScanner : MonoBehaviour
private void InitializeConfiguration(ShapeScannerConfiguration configuration)
{
// Recreate all existing rays
foreach (ShapeScannerRay ray in existingRays)
{
Destroy(ray.gameObject);
}
existingRays.Clear();
// Create rays
int rayRowCount = configuration.rows.Count;
for (int i = 0; i < rayRowCount; i++)
{
@@ -133,13 +127,14 @@ public class ShapeScanner : MonoBehaviour
totalRayCount = configuration.rows.SelectMany(row => row.cells).Count();
correctRayCount = configuration.rows.SelectMany(row => row.cells).Count(cell => !cell);
float percentage = calculateCorrectPercentage();
float percentage = CalculateCorrectPercentage();
UpdateDisplay(percentage);
}
private void OnConfigurationComplete()
{
HashSet<GameObject> allCollidingObjects = new HashSet<GameObject>();
// Destroy colliding scannable objects
HashSet<GameObject> allCollidingObjects = new();
foreach (ShapeScannerRay ray in existingRays)
{
allCollidingObjects.UnionWith(ray.GetCollidingObjects());
@@ -161,20 +156,28 @@ public class ShapeScanner : MonoBehaviour
Destroy(collidingObject);
}
// Destroy all existing rays
foreach (ShapeScannerRay ray in existingRays)
{
Destroy(ray.gameObject);
}
existingRays.Clear();
// Play sound effect and emit particles
AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.ShapeScannerSuccess, gameObject);
if (!particles.isPlaying) particles.Play();
particles.Emit(100);
}
private float calculateCorrectPercentage()
private float CalculateCorrectPercentage()
{
return (float) correctRayCount / totalRayCount * 100;
}
public void IncrementCorrectRayCount()
public async void IncrementCorrectRayCount()
{
correctRayCount++;
float correctPercentage = calculateCorrectPercentage();
float correctPercentage = CalculateCorrectPercentage();
UpdateDisplay(correctPercentage);
if (isCompleted)
{
@@ -183,6 +186,8 @@ public class ShapeScanner : MonoBehaviour
if (correctPercentage >= configurations[currentConfiguration].requiredCorrectPercentage)
{
OnConfigurationComplete();
await Task.Delay(1000);
UpdateCurrentConfigurationDisplay(currentConfiguration + 1);
if (currentConfiguration + 1 < configurations.Count)
{
@@ -202,12 +207,11 @@ public class ShapeScanner : MonoBehaviour
public void DecrementCorrectRayCount()
{
correctRayCount--;
UpdateDisplay(calculateCorrectPercentage());
UpdateDisplay(CalculateCorrectPercentage());
}
private void UpdateDisplay(float percentage)
{
Debug.Log("updating display to: " + percentage);
correctPercentageDisplay.text = Mathf.Round(percentage).ToString() + " %";
}