meta xr, auto fix, occlusion additions

This commit is contained in:
Timur Nizamov
2025-12-09 21:37:52 +02:00
parent 647d247c81
commit 1f500f31d4
164 changed files with 1314 additions and 508 deletions
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,124 @@
fileFormatVersion: 2
guid: 0a872fd50be2db447a17fb4bc7ae6e6f
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 12
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Server
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,27 @@
fileFormatVersion: 2
guid: 99296f87424cb724baddf545125501a2
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,227 @@
studio.plugins.registerPluginDescription("MetaXRAudio Spatializer", {
companyName: "Meta",
productName: "MetaXRAudio Source",
parameters: {
"Acoustics": { displayName: "Enable Acoustics" },
"Reverb Send": { displayName: "Reverb Send" },
"HRTF Intensity": { displayName: "HRTF Intensity" },
"V. Radius": { displayName: "Volumetric Radius" },
"Refl. Send": { displayName: "Early Reflections Send" },
"Directivity": { displayName: "Directivity Pattern", enumeration: ["None", "Human Voice"], },
"Dtv. Intensity": { displayName: "Directivity Intensity" },
"Direct Enabled": { displayName: "Direct Enabled" },
"Reverb Reach": { displayName: "Reverb Reach" },
"Occl. Intensity": { displayName: "Occlusion Intensity" },
"Medium Absrp.": { displayName: "Medium Absorption" },
},
deckUi: {
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.HBoxLayout,
spacing: 8,
items: [
{
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.HBoxLayout,
contentsMargins: { left: 6, right: 6 },
spacing: 2,
items: [
{
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.GridLayout,
contentsMargins: { left: 6, right: 6 },
spacing: 2,
items: [
{
deckWidgetType: studio.ui.deckWidgetType.DistanceRolloffGraph,
row: 0,
column: 0,
columnSpan: 2,
minimumDistanceBinding: 'Atten. Min',
maximumDistanceBinding: 'Atten. Max',
rolloffTypeBinding: 'Atten. Mode',
rolloffTypes: {
0: studio.project.distanceRolloffType.LinearSquared,
1: studio.project.distanceRolloffType.Linear,
2: studio.project.distanceRolloffType.Inverse,
3: studio.project.distanceRolloffType.InverseTapered,
4: studio.project.distanceRolloffType.Custom,
},
},
{
deckWidgetType: studio.ui.deckWidgetType.Button,
binding: "Acoustics",
row: 1,
column: 0,
},
{
deckWidgetType: studio.ui.deckWidgetType.Dial,
binding: "Reverb Send",
row: 1,
column: 1,
},
],
},
{
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.HBoxLayout,
contentsMargins: { left: 0, right: 14 },
isFramed: true,
items: [
{
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.VBoxLayout,
contentsMargins: { left: 6, right: 10 },
items: [
{
deckWidgetType: studio.ui.deckWidgetType.Label,
text: "Experimental Controls:",
},
{
deckWidgetType: studio.ui.deckWidgetType.Pixmap,
filePath: __dirname + "/MetaLogo.png",
},
{
deckWidgetType: studio.ui.deckWidgetType.Dropdown, binding: "Directivity",
},
],
},
{
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.VBoxLayout,
contentsMargins: { left: 6, right: 10 },
spacing: 14,
items: [
{
deckWidgetType: studio.ui.deckWidgetType.Dial, binding: "Dtv. Intensity",
},
{
deckWidgetType: studio.ui.deckWidgetType.Button, binding: "Medium Absrp.",
},
],
},
{
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.GridLayout,
contentsMargins: { left: 30, right: 30 },
spacing: 14,
items: [
{
deckWidgetType: studio.ui.deckWidgetType.Dial, binding: "Refl. Send",
row: 0,
column: 0,
},
{
deckWidgetType: studio.ui.deckWidgetType.Dial, binding: "V. Radius",
row: 1,
column: 0,
},
],
},
{
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.VBoxLayout,
contentsMargins: { left: 6, right: 10 },
spacing: 14,
items: [
{
deckWidgetType: studio.ui.deckWidgetType.Dial, binding: "HRTF Intensity",
row: 1,
column: 1,
},
{
deckWidgetType: studio.ui.deckWidgetType.Button, binding: "Direct Enabled",
},
],
},
{
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.VBoxLayout,
contentsMargins: { left: 6, right: 10 },
spacing: 14,
items: [
{
deckWidgetType: studio.ui.deckWidgetType.Dial, binding: "Reverb Reach",
},
{
deckWidgetType: studio.ui.deckWidgetType.Dial, binding: "Occl. Intensity",
},
],
},
],
},
],
},
{ deckWidgetType: studio.ui.deckWidgetType.OutputMeter, },
],
},
});
studio.plugins.registerPluginDescription("MetaXRAudio Ambisonics", {
companyName: "Meta",
productName: "MetaXRAudio Ambisonics",
parameters: {},
deckUi: {
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.VBoxLayout,
contentsMargins: { left: 6, right: 6, top: 6 },
spacing: 40,
items: [
{ deckWidgetType: studio.ui.deckWidgetType.Pixmap, filePath: __dirname + "/MetaLogo.png", },
],
}
});
studio.plugins.registerPluginDescription("MetaXRAudio Reflections", {
companyName: "Meta",
productName: "MetaXRAudio Reflections",
parameters: {
"Early Refl.": { displayName: "Early Reflections Enabled" },
"Reverb Enabled": { displayName: "Reverb Enabled" },
"Reverb Level": { displayName: "Reverb Level" },
"Voice Limit": { displayName: "Voice Limit" },
},
deckUi: {
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.HBoxLayout,
contentsMargins: { left: 6, right: 6 },
spacing: 12,
items: [
{ deckWidgetType: studio.ui.deckWidgetType.Pixmap, filePath: __dirname + "/MetaLogo.png" },
{
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.HBoxLayout,
contentsMargins: { left: 0, right: 14 },
spacing: 8,
items: [
{
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.VBoxLayout,
contentsMargins: { left: 0, right: 20 },
spacing: 14,
items: [
{ deckWidgetType: studio.ui.deckWidgetType.Button, binding: "Early Refl.", },
{ deckWidgetType: studio.ui.deckWidgetType.Button, binding: "Reverb Enabled", },
]
},
{
deckWidgetType: studio.ui.deckWidgetType.Layout,
layout: studio.ui.layoutType.VBoxLayout,
contentsMargins: { left: 0, right: 0 },
spacing: 14,
items: [
{ deckWidgetType: studio.ui.deckWidgetType.Dial, binding: "Reverb Level", },
{ deckWidgetType: studio.ui.deckWidgetType.NumberBox, binding: "Voice Limit", },
]
},
],
},
{ deckWidgetType: studio.ui.deckWidgetType.OutputMeter, },
],
}
});
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ab37959ba9271d444953f8895308ff56
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: cea7bca5f2b0981489443a1ab4b97e7f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 2af207a59ff0c77449a495a5ff852a9f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -24,6 +24,9 @@ public class CarDrivingRoutine : NetworkBehaviour
private bool stopSoundPlayed = false;
private float stopThreshold = 0.05f; // consider speed "0" when below this
private bool isBeingStoppedByPlayer = false;
[Header("Tires")]
public List<GameObject> FrontTires;
public List<GameObject> BackTires;
@@ -54,25 +57,26 @@ public class CarDrivingRoutine : NetworkBehaviour
rollTires(); // Just an aesthetic improvement.
if (Quaternion.Angle(transform.rotation, desiredRotation) > 1f) // If the car is turning.
if (!isBeingStoppedByPlayer)
{
if (!isTurning)
if (Quaternion.Angle(transform.rotation, desiredRotation) > 1f)
{
AudioController.SetRPM(1300); //set externally in CarAudioController.cs
setTireRotation(tireTurnAngle);
if (!isTurning)
{
setTireRotation(tireTurnAngle);
AudioController.SetRPM(1300);
}
isTurning = true;
}
isTurning = true;
}
if (Quaternion.Angle(transform.rotation, desiredRotation) <= 1f) // Reset the turn value.
{
if (isTurning)
else
{
AudioController.SetRPM(1450);
setTireRotation(-tireTurnAngle);
if (isTurning)
{
setTireRotation(-tireTurnAngle);
AudioController.SetRPM(1450);
}
isTurning = false;
}
isTurning = false;
}
// Check if close enough to the waypoint
@@ -85,12 +89,14 @@ public class CarDrivingRoutine : NetworkBehaviour
if (StraightSpeed <= stopThreshold && !stopSoundPlayed)
{
stopSoundPlayed = true;
// Play the sound normally from your audio controller
//AudioController.SetRPM(475);
AudioController.PlayStopSound();
float currentRPM = AudioController.GetCurrentRPM();
//Debug.LogError(currentRPM);
if (currentRPM <= 550f) // confirms we are in the correct engine state
{
stopSoundPlayed = true;
AudioController.PlayStopSound();
//Debug.LogError("piiks");
}
}
}
@@ -120,29 +126,29 @@ public class CarDrivingRoutine : NetworkBehaviour
}
private void OnTriggerEnter(Collider other)
{;
{
if (other.GetComponentInParent<XRPlayerMirror>() == null) return;
StartCoroutine(SmoothAdjustSpeed(0, 0, haltspeed)); // Smoothly halt in 1 second
//_tireSound.Stop();
//_stopSound.Play();
isBeingStoppedByPlayer = true;
StartCoroutine(SmoothAdjustSpeed(0, 0, haltspeed));
AudioController.SetRPM(475);
//AudioController.PlayStopSound();
}
private void OnTriggerExit(Collider other)
{
if (other.GetComponentInParent<XRPlayerMirror>() == null) return;
StartCoroutine(SmoothAdjustSpeed(targetSpeed, targetRotationSpeed, haltspeed)); // Smoothly resume speed in 1 second
//_stopSound.Stop();
//_tireSound.Play();
isBeingStoppedByPlayer = false;
StartCoroutine(SmoothAdjustSpeed(targetSpeed, targetRotationSpeed, haltspeed));
AudioController.SetRPM(1450);
stopSoundPlayed = false;
}
private IEnumerator SmoothAdjustSpeed(float targetStraightSpeed, float targetRotationSpeed, float duration)
{
float initialStraightSpeed = StraightSpeed;
@@ -4,6 +4,7 @@ using FMOD.Studio;
public class CarAudioController : MonoBehaviour
{
private EventInstance carMovementInstance;
private EventInstance carStopInstance;
private FirstPersonOcclusion occlusion;
private void Awake()
@@ -15,13 +16,21 @@ public class CarAudioController : MonoBehaviour
//Debug.LogError("Car Simple Driving:");
//Debug.LogError(FMODEvents.Instance.BoltCarSimpleDriving);
carMovementInstance = AudioManager.Instance.CreateInstance(FMODEvents.Instance.CarModulatedDriving);
carStopInstance = AudioManager.Instance.CreateInstance(FMODEvents.Instance.BoltCarStopSound);
carMovementInstance.setParameterByName("RPM", 1450);
carMovementInstance.setParameterByName("Load", 0);
carMovementInstance.set3DAttributes(FMODUnity.RuntimeUtils.To3DAttributes(gameObject));
carStopInstance.set3DAttributes(FMODUnity.RuntimeUtils.To3DAttributes(gameObject));
occlusion = GetComponent<FirstPersonOcclusion>();
if (occlusion != null)
occlusion.InitialiseWithInstance(carMovementInstance);
{
occlusion.InitialiseWithInstance(carMovementInstance); // main looping engine sound
occlusion.AddInstance(carStopInstance); // additional sound
}
}
private void Start()
@@ -34,6 +43,7 @@ public class CarAudioController : MonoBehaviour
{
// Always update 3D position to follow the car model transform
carMovementInstance.set3DAttributes(FMODUnity.RuntimeUtils.To3DAttributes(gameObject));
carStopInstance.set3DAttributes(FMODUnity.RuntimeUtils.To3DAttributes(gameObject));
}
// These methods are called externally by CarDrivingRoutine
@@ -44,8 +54,13 @@ public class CarAudioController : MonoBehaviour
public void PlayStopSound()
{
AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.BoltCarStopSound, gameObject);
carStopInstance.start();
//AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.BoltCarStopSound, gameObject);
}
public float GetCurrentRPM()
{
carMovementInstance.getParameterByName("RPM", out float value);
return value;
}
}
Binary file not shown.
@@ -2,6 +2,7 @@ using UnityEngine;
using FMODUnity;
using FMOD.Studio;
using System.Collections;
using System.Collections.Generic; // ADDED
public class FirstPersonOcclusion : MonoBehaviour
{
@@ -26,6 +27,10 @@ public class FirstPersonOcclusion : MonoBehaviour
private bool initialisedExternally = false;
// ADDED: now stores ALL event instances that must be occluded
private List<EventInstance> managedInstances = new List<EventInstance>();
public void InitialiseWithInstance(EventInstance instance)
{
AudioOccluded = instance;
@@ -37,9 +42,28 @@ public class FirstPersonOcclusion : MonoBehaviour
GetComponent<Rigidbody>()
);
managedInstances.Add(AudioOccluded); // ADDED
AudioOccluded.getDescription(out AudioDes);
AudioDes.getMinMaxDistance(out float min, out MaxDistance);
}
// ADDED: allows adding extra FMOD instances for occlusion
public void AddInstance(EventInstance instance)
{
if (instance.isValid())
{
RuntimeManager.AttachInstanceToGameObject(
instance,
gameObject,
GetComponent<Rigidbody>()
);
managedInstances.Add(instance);
}
}
private IEnumerator Start()
{
// If already initialised, skip internal creation
@@ -47,13 +71,18 @@ public class FirstPersonOcclusion : MonoBehaviour
if (!initialisedExternally)
{
AudioOccluded = RuntimeManager.CreateInstance(SelectAudio);
// 2. Attaching Instance
RuntimeManager.AttachInstanceToGameObject(AudioOccluded, gameObject);
// 3. Starting Audio
AudioOccluded.start();
// 4. Releasing Instance (This allows the event to self-manage its lifetime, which is fine)
AudioOccluded.release();
managedInstances.Add(AudioOccluded); // ADDED
// 5. Getting Event Description and Max Distance
AudioDes = RuntimeManager.GetEventDescription(SelectAudio);
AudioDes.getMinMaxDistance(out float minDistance, out MaxDistance);
@@ -64,6 +93,7 @@ public class FirstPersonOcclusion : MonoBehaviour
Listener = FindObjectOfType<StudioListener>();
}
private void FixedUpdate()
{
if (Listener == null) return;
@@ -82,6 +112,7 @@ public class FirstPersonOcclusion : MonoBehaviour
lineCastHitCount = 0f;
}
private void OccludeBetween(Vector3 sound, Vector3 listener)
{
// 9. Calculate Points (Log only a few to avoid clutter)
@@ -117,6 +148,7 @@ public class FirstPersonOcclusion : MonoBehaviour
SetParameter();
}
private Vector3 CalculatePoint(Vector3 a, Vector3 b, float m, bool posOrneg)
{
float n = Vector3.Distance(new Vector3(a.x, 0f, a.z), new Vector3(b.x, 0f, b.z));
@@ -139,9 +171,11 @@ public class FirstPersonOcclusion : MonoBehaviour
return new Vector3(x, a.y, z);
}
private void CastLine(Vector3 Start, Vector3 End)
{
RaycastHit hit;
// 11. Raycast result
bool isHit = Physics.Linecast(Start, End, out hit, OcclusionLayer);
@@ -156,10 +190,18 @@ public class FirstPersonOcclusion : MonoBehaviour
}
}
private void SetParameter()
{
float occlusionValue = lineCastHitCount / 11;
// 12. Final Parameter Value
AudioOccluded.setParameterByName("Occlusion", occlusionValue);
foreach (var inst in managedInstances)
{
if (inst.isValid())
{
inst.setParameterByName("Occlusion", occlusionValue);
}
}
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More