diff options
author | tylermurphy534 <tylermurphy534@gmail.com> | 2022-11-06 15:12:42 -0500 |
---|---|---|
committer | tylermurphy534 <tylermurphy534@gmail.com> | 2022-11-06 15:12:42 -0500 |
commit | eb84bb298d2b95aec7b2ae12cbf25ac64f25379a (patch) | |
tree | efd616a157df06ab661c6d56651853431ac6b08b /VRCSDK3Worlds/Assets/Bakery/examples/scripts | |
download | unityprojects-eb84bb298d2b95aec7b2ae12cbf25ac64f25379a.tar.gz unityprojects-eb84bb298d2b95aec7b2ae12cbf25ac64f25379a.tar.bz2 unityprojects-eb84bb298d2b95aec7b2ae12cbf25ac64f25379a.zip |
move to self host
Diffstat (limited to 'VRCSDK3Worlds/Assets/Bakery/examples/scripts')
6 files changed, 214 insertions, 0 deletions
diff --git a/VRCSDK3Worlds/Assets/Bakery/examples/scripts/BakeryVolumeReceiver.cs b/VRCSDK3Worlds/Assets/Bakery/examples/scripts/BakeryVolumeReceiver.cs new file mode 100644 index 00000000..5ba2fb51 --- /dev/null +++ b/VRCSDK3Worlds/Assets/Bakery/examples/scripts/BakeryVolumeReceiver.cs @@ -0,0 +1,48 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +// Example script, a counterpart to BakeryVolumeTrigger.cs (see that script for more info) +// +public class BakeryVolumeReceiver : MonoBehaviour +{ + public bool forceUsage = false; + + // used by triggers + internal int enterCounter = 0; + internal BakeryVolumeTrigger movableTrigger = null; + + Renderer[] renderers; + MaterialPropertyBlock current; + + // Cache renderers affected by volumes + void Awake() + { + if (renderers == null) renderers = GetComponentsInChildren<Renderer>() as Renderer[]; + if (forceUsage) + { + // HDRP can sometimes (?) fail to use globally set volumes when SRP batching is enabled, so disable it for this object. + SetPropertyBlock(new MaterialPropertyBlock()); + } + } + + // Called by triggers + public void SetPropertyBlock(MaterialPropertyBlock mb) + { + if (renderers == null) renderers = GetComponentsInChildren<Renderer>() as Renderer[]; + for(int i=0; i<renderers.Length; i++) + { + renderers[i].SetPropertyBlock(mb); + } + current = mb; + } + + // Update shader properties here if the volume is moving + void LateUpdate() + { + if (movableTrigger == null) return; + + movableTrigger.UpdateBounds(); + SetPropertyBlock(current); + } +} diff --git a/VRCSDK3Worlds/Assets/Bakery/examples/scripts/BakeryVolumeReceiver.cs.meta b/VRCSDK3Worlds/Assets/Bakery/examples/scripts/BakeryVolumeReceiver.cs.meta new file mode 100644 index 00000000..22ef58d9 --- /dev/null +++ b/VRCSDK3Worlds/Assets/Bakery/examples/scripts/BakeryVolumeReceiver.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2b3f9409bbd2d70498366efc67277202 +timeCreated: 1605956660 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/Bakery/examples/scripts/BakeryVolumeTrigger.cs b/VRCSDK3Worlds/Assets/Bakery/examples/scripts/BakeryVolumeTrigger.cs new file mode 100644 index 00000000..1be7f78d --- /dev/null +++ b/VRCSDK3Worlds/Assets/Bakery/examples/scripts/BakeryVolumeTrigger.cs @@ -0,0 +1,78 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +// Example volume switching script +// +// The high-level logic is following: +// +// - Volumes overlap each other a bit, so we don't need blending! The size of the overlap is the size of your largest dynamic object. +// - As object enters the volume, set volume data to it. Increment the counter. +// - As object leaves the volume, decrement the counter. If it equals 0, use global volume (set empty property block). +// - If the volume is moving, set volume data every frame, in LateUpdate. +// +public class BakeryVolumeTrigger : MonoBehaviour +{ + public bool movable; + + BakeryVolume vol; + MaterialPropertyBlock mb; // current volume shader properties + + static MaterialPropertyBlock mbEmpty; // default empty block, no values (will revert to global volume) + static int mVolumeMin, mVolumeInvSize; // shader property IDs + + void Awake() + { + if (mbEmpty == null) mbEmpty = new MaterialPropertyBlock(); + + // Create a MaterialPropertyBlock with Volume parameters for future use + vol = GetComponent<BakeryVolume>(); + mb = new MaterialPropertyBlock(); + if (vol.bakedTexture0 != null) + { + mb.SetTexture("_Volume0", vol.bakedTexture0); + mb.SetTexture("_Volume1", vol.bakedTexture1); + mb.SetTexture("_Volume2", vol.bakedTexture2); + if (vol.bakedTexture3 != null) mb.SetTexture("_Volume3", vol.bakedTexture3); + } + if (vol.bakedMask != null) mb.SetTexture("_VolumeMask", vol.bakedMask); + if (mVolumeMin == 0) mVolumeMin = Shader.PropertyToID("_VolumeMin"); + if (mVolumeInvSize == 0) mVolumeInvSize = Shader.PropertyToID("_VolumeInvSize"); + mb.SetVector(mVolumeMin, vol.GetMin()); + mb.SetVector(mVolumeInvSize, vol.GetInvSize()); + if (vol.supportRotationAfterBake) mb.SetMatrix("_VolumeMatrix", vol.GetMatrix()); + } + + // Apply MaterialPropertyBlock to renderers entering the trigger + void OnTriggerEnter(Collider c) + { + var rcv = c.GetComponent<BakeryVolumeReceiver>(); + if (rcv == null) return; + + Debug.Log(c.name + " entered " + this.name); + + rcv.enterCounter++; + rcv.movableTrigger = movable ? this : null; + rcv.SetPropertyBlock(mb); + } + + // Handle exiting the trigger + void OnTriggerExit(Collider c) + { + var rcv = c.GetComponent<BakeryVolumeReceiver>(); + if (rcv == null) return; + + Debug.Log(c.name + " exited " + this.name); + + // Only set empty property block, if the counter is 0 (= exited ALL volumes) + rcv.enterCounter--; + if (rcv.enterCounter == 0) rcv.SetPropertyBlock(mbEmpty); + } + + public void UpdateBounds() + { + vol.UpdateBounds(); + mb.SetVector(mVolumeMin, vol.GetMin()); + mb.SetVector(mVolumeInvSize, vol.GetInvSize()); + } +} diff --git a/VRCSDK3Worlds/Assets/Bakery/examples/scripts/BakeryVolumeTrigger.cs.meta b/VRCSDK3Worlds/Assets/Bakery/examples/scripts/BakeryVolumeTrigger.cs.meta new file mode 100644 index 00000000..3261b37d --- /dev/null +++ b/VRCSDK3Worlds/Assets/Bakery/examples/scripts/BakeryVolumeTrigger.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 88131403915d92648ac25dbc4ffb0e1b +timeCreated: 1605889761 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VRCSDK3Worlds/Assets/Bakery/examples/scripts/VolumeTestScene2.cs b/VRCSDK3Worlds/Assets/Bakery/examples/scripts/VolumeTestScene2.cs new file mode 100644 index 00000000..80d91b79 --- /dev/null +++ b/VRCSDK3Worlds/Assets/Bakery/examples/scripts/VolumeTestScene2.cs @@ -0,0 +1,52 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class VolumeTestScene2 : MonoBehaviour +{ + public Transform secondFloor; + public BakeryVolumeTrigger[] secondFloorVolumes; + public float secondFloorHeight; + public bool randomizeLastRoom; + public Transform baseRoom; + public Transform alternativeRoom; + + void SwapRooms() + { + var tmp = alternativeRoom.position; + alternativeRoom.position = baseRoom.position; + baseRoom.position = tmp; + } + + void UpdateRooms() + { + for(int i=0; i<secondFloorVolumes.Length; i++) + { + secondFloorVolumes[i].UpdateBounds(); + } + } + + void Start() + { + if (randomizeLastRoom) + { + if (Random.Range(0,2) == 1) + { + SwapRooms(); + } + } + + secondFloor.position += Vector3.up * secondFloorHeight; + + UpdateRooms(); + } + + void Update() + { + if (Input.GetKeyDown(KeyCode.Space)) + { + SwapRooms(); + UpdateRooms(); + } + } +} diff --git a/VRCSDK3Worlds/Assets/Bakery/examples/scripts/VolumeTestScene2.cs.meta b/VRCSDK3Worlds/Assets/Bakery/examples/scripts/VolumeTestScene2.cs.meta new file mode 100644 index 00000000..3f3a7897 --- /dev/null +++ b/VRCSDK3Worlds/Assets/Bakery/examples/scripts/VolumeTestScene2.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f7a6f035f96fb254a92088728f6ac9f7 +timeCreated: 1605889761 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: |