private static bool CheckSurfaceAgainstMask(SpatialUnderstandingDll.Imports.RaycastResult.SurfaceTypes surface, SurfaceMask mask) { if (surface != SpatialUnderstandingDll.Imports.RaycastResult.SurfaceTypes.Invalid) { switch (surface) { case SpatialUnderstandingDll.Imports.RaycastResult.SurfaceTypes.Other: return(mask.Other); case SpatialUnderstandingDll.Imports.RaycastResult.SurfaceTypes.Floor: return(mask.Floor); case SpatialUnderstandingDll.Imports.RaycastResult.SurfaceTypes.FloorLike: return(mask.FloorLike); case SpatialUnderstandingDll.Imports.RaycastResult.SurfaceTypes.Platform: return(mask.Platform); case SpatialUnderstandingDll.Imports.RaycastResult.SurfaceTypes.Ceiling: return(mask.Ceiling); case SpatialUnderstandingDll.Imports.RaycastResult.SurfaceTypes.WallExternal: return(mask.WallExternal); case SpatialUnderstandingDll.Imports.RaycastResult.SurfaceTypes.WallLike: return(mask.WallLike); default: return(false); } } else { return(false); } }
private void CreateSurfaceHitFX(GameObject hitObject, Vector3 hitPoint, Vector3 hitNormal) { if (hitObject.CompareTag(Layers.Instance.surfacePlaneTag)) { ParticleEffectsManager.Instance.CreateBulletImpact(hitPoint, hitNormal); HoloToolkit.Unity.SpatialMapping.SurfacePlane plane = hitObject.GetComponent <HoloToolkit.Unity.SpatialMapping.SurfacePlane>(); switch (plane.PlaneType) { case HoloToolkit.Unity.SpatialMapping.PlaneTypes.Wall: ParticleEffectsManager.Instance.CreateBulletImpactDebris(hitPoint, hitNormal, 0.1f, 3, 0); ParticleEffectsManager.Instance.CreateBulletHole(hitPoint, hitNormal, plane); break; case HoloToolkit.Unity.SpatialMapping.PlaneTypes.Floor: ParticleEffectsManager.Instance.CreateLingeringFireball(hitPoint, hitNormal, 0); //ParticleEffectsManager.Instance.CreateCrater(hitPoint, hitNormal); break; default: break; } } else { ParticleEffectsManager.Instance.CreateBulletImpact(hitPoint, hitNormal); SpatialUnderstandingDll.Imports.RaycastResult.SurfaceTypes surfaceType = PlayspaceManager.Instance.QuerySurfaceType(hitPoint, hitNormal); Debug.Log("hitNormal=" + hitNormal + ", hitPoint=" + hitPoint); float cos80 = 0.1736f; if (Mathf.Abs(Vector3.Dot(hitNormal, Vector3.right)) > cos80 && Mathf.Abs(Vector3.Dot(hitNormal, Vector3.up)) > cos80 && Mathf.Abs(Vector3.Dot(hitNormal, Vector3.forward)) > cos80) { PlayRicochetSound(); } else if (surfaceType == SpatialUnderstandingDll.Imports.RaycastResult.SurfaceTypes.WallExternal) //else if (Mathf.Abs(hitNormal.y) < 0.05f) { // Must have hit a wall //TODO: for spatial understanding, we should raycast and determine whether we actually hit a real wall ParticleEffectsManager.Instance.CreateBulletImpactDebris(hitPoint, hitNormal, 0.1f, 3, 0); ParticleEffectsManager.Instance.CreateBulletHole(hitPoint, hitNormal); } else if (surfaceType == SpatialUnderstandingDll.Imports.RaycastResult.SurfaceTypes.Floor) //else if (hitNormal.y > 0.95f) { // Must have hit the floor //TODO: raycast spatial understanding ParticleEffectsManager.Instance.CreateLingeringFireball(hitPoint, hitNormal, 0); } } /* * if (Vector3.Angle(hitNormal, Vector3.up) < 10) * { * // Lingering fireball only when hitting the ground * ParticleEffectsManager.Instance.CreateLingeringFireball(hitPoint, hitNormal, 0); * } * else if (Mathf.Abs(90 - Vector3.Angle(hitNormal, Vector3.up)) < 10) * { * // Debris when hitting walls * //TODO: wall detection should actually involve testing against detected wall planes * ParticleEffectsManager.Instance.CreateBulletImpactDebris(hitPoint, hitNormal, 0.1f, 3, 0); * } */ }
public RaycastHit_SU(float _distance, Vector3 _point, SpatialUnderstandingDll.Imports.RaycastResult.SurfaceTypes _surfaceType) { distance = _distance; point = _point; surfaceType = _surfaceType; }