implement accessibility options

This commit is contained in:
Cat Flynn 2021-01-09 05:32:47 +00:00
parent 7db7866a1d
commit e02b3b49bd
21 changed files with 691 additions and 201 deletions

View File

@ -0,0 +1,25 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c271cfa846431634db54fa41238b7b35, type: 3}
m_Name: Accessibility Options
m_EditorClassIdentifier:
_mode: 2
_calm:
_tunnel: {fileID: 0}
_vibe:
_tunnel: {fileID: 0}
_party:
_tunnel: {fileID: 0}
_intensitySettings:
- _tunnel: {fileID: 0}
- _tunnel: {fileID: 0}
- _tunnel: {fileID: 0}

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a96923938dea0d542aa804067d5b5e81
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 399618523f73e624688f86b01b832ae9
guid: bf3eaf632c32d8c4c9eef99f2d40d8aa
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -10,7 +10,7 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a918b83cb0f52b445bf4975f41eaf321, type: 3}
m_Name: Audio Visualiser Settings
m_Name: Audio Visualiser
m_EditorClassIdentifier:
_fractalAnimations:
- name: _Fractality
@ -18,14 +18,6 @@ MonoBehaviour:
channel: 0
sample: 525
_tunnelAnimations:
- name: _OverallPower
multiplier: -1000
channel: 0
sample: 173
- name: _OverallPower
multiplier: -1000
channel: 0
sample: 173
- name: _ShakeStrength
multiplier: 2
channel: 0
@ -35,3 +27,4 @@ MonoBehaviour:
multiplier: 3703.2
channel: 1
sample: 874
_accessibility: {fileID: 11400000, guid: a96923938dea0d542aa804067d5b5e81, type: 2}

View File

@ -20,7 +20,7 @@ Material:
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Tunnel
m_Name: Tunnel_Safe
m_Shader: {fileID: 4800000, guid: 9d7afb8f866fe8a4cbbf660a52c17084, type: 3}
m_ShaderKeywords:
m_LightmapFlags: 4
@ -102,6 +102,7 @@ Material:
m_Offset: {x: 0, y: 0}
m_Floats:
- _AlphaClip: 0
- _BarsWeight: 0
- _Blend: 0
- _BumpScale: 1
- _ClearCoatMask: 0
@ -112,10 +113,19 @@ Material:
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _EnvironmentReflections: 1
- _FractalInner: 0.3
- _FractalPower: 1
- _FractalRotateSpeed: 20
- _FractalScale: 6
- _FractalWeight: 0
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Intensity: 1
- _Metallic: 0
- _Nebula1Power: 1
- _Nebula2Power: 1
- _NebulaWeight: 0
- _OcclusionStrength: 1
- _OverallPower: 1
- _Parallax: 0.005
@ -126,10 +136,12 @@ Material:
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _StarsWeight: 0.1
- _Surface: 0
- _WorkflowMode: 1
- _ZWrite: 1
m_Colors:
- _BackgroundColor: {r: 0.09794411, g: 0.27564344, b: 0.2924528, a: 0}
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

View File

@ -0,0 +1,152 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-825856505695050074
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier:
version: 4
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Tunnel_Safe 1
m_Shader: {fileID: 4800000, guid: 9d7afb8f866fe8a4cbbf660a52c17084, type: 3}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _FractalMap:
m_Texture: {fileID: 8400000, guid: 410a70db0834e924c9bff4b2f170f423, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NebulaMap:
m_Texture: {fileID: 2800000, guid: 76b8a8711756f0244a896b7e1c505583, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _StarMap:
m_Texture: {fileID: 2800000, guid: c58c631a5672d3442b2210c8883b9bba, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _AlphaClip: 0
- _BarsWeight: 0
- _Blend: 0
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _EnvironmentReflections: 1
- _FractalInner: 0.3
- _FractalPower: 1
- _FractalRotateSpeed: 20
- _FractalScale: 6
- _FractalWeight: 0
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Intensity: 1
- _Metallic: 0
- _Nebula1Power: 1
- _Nebula2Power: 1
- _NebulaWeight: 0
- _OcclusionStrength: 1
- _OverallPower: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _ShakeStrength: 0
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _StarsWeight: 0.1
- _Surface: 0
- _WorkflowMode: 1
- _ZWrite: 1
m_Colors:
- _BackgroundColor: {r: 0.09794411, g: 0.27564344, b: 0.2924528, a: 0}
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _FractalColor: {r: 1.3876811, g: 1.0683917, b: 2.3455496, a: 1}
- _NebulaColor1: {r: 0, g: 0.67775345, b: 1, a: 1}
- _NebulaColor2: {r: 0.54217625, g: 0.25, b: 1, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 439b4d6018bd23e4e91136d099c5b815
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,152 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-825856505695050074
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier:
version: 4
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Tunnel_Safe 1
m_Shader: {fileID: 4800000, guid: 9d7afb8f866fe8a4cbbf660a52c17084, type: 3}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _FractalMap:
m_Texture: {fileID: 8400000, guid: 410a70db0834e924c9bff4b2f170f423, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NebulaMap:
m_Texture: {fileID: 2800000, guid: 76b8a8711756f0244a896b7e1c505583, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _StarMap:
m_Texture: {fileID: 2800000, guid: c58c631a5672d3442b2210c8883b9bba, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _AlphaClip: 0
- _BarsWeight: 0
- _Blend: 0
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _EnvironmentReflections: 1
- _FractalInner: 0.3
- _FractalPower: 1
- _FractalRotateSpeed: 20
- _FractalScale: 6
- _FractalWeight: 0
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Intensity: 1
- _Metallic: 0
- _Nebula1Power: 1
- _Nebula2Power: 1
- _NebulaWeight: 0
- _OcclusionStrength: 1
- _OverallPower: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _ShakeStrength: 0
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _StarsWeight: 0.1
- _Surface: 0
- _WorkflowMode: 1
- _ZWrite: 1
m_Colors:
- _BackgroundColor: {r: 0.09794411, g: 0.27564344, b: 0.2924528, a: 0}
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _FractalColor: {r: 1.3876811, g: 1.0683917, b: 2.3455496, a: 1}
- _NebulaColor1: {r: 0, g: 0.67775345, b: 1, a: 1}
- _NebulaColor2: {r: 0.54217625, g: 0.25, b: 1, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9429becea685bce4fa7b6595601ea615
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -408,7 +408,7 @@ MeshRenderer:
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 735a92a62479ffd458216009452fec2b, type: 2}
- {fileID: 2100000, guid: 439b4d6018bd23e4e91136d099c5b815, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
@ -502,10 +502,11 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 3832fa92b7c91804697fe9f4f858b5d4, type: 3}
m_Name:
m_EditorClassIdentifier:
_ship: {fileID: 0}
_fractal: {fileID: 3397488660425852632}
_tunnel: {fileID: 3397488660842926088}
_channel: 0
_sample: 0
_system: {fileID: 11400000, guid: 65b0561f3154c9f438c3a1e1b443d03d, type: 2}
_accessibility: {fileID: 11400000, guid: a96923938dea0d542aa804067d5b5e81, type: 2}
--- !u!1 &3397488661354499722
GameObject:
m_ObjectHideFlags: 0

View File

@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using Unity.Collections;
using UnityEngine;
[Serializable]
public enum AccessibilityMode
{
Calm,
Vibe,
Party
}
[CreateAssetMenu]
public class AccessibilityOptions : ScriptableObject
{
public AccessibilityMode Mode
{
get => _mode;
set => _mode = value;
}
[SerializeField] private AccessibilityMode _mode;
[Serializable]
public struct IntensitySetting
{
public Material Tunnel => _tunnel;
[SerializeField] private Material _tunnel;
}
public IntensitySetting Intensity => this[_mode];
[SerializeField] private IntensitySetting _calm;
[SerializeField] private IntensitySetting _vibe;
[SerializeField] private IntensitySetting _party;
public IntensitySetting this[AccessibilityMode mode]
{
get
{
switch (mode)
{
case AccessibilityMode.Calm: return _calm;
case AccessibilityMode.Vibe: return _vibe;
case AccessibilityMode.Party: return _party;
default: return default;
}
}
}
// [SerializeField] private IntensitySetting[] _intensitySettings;
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a918b83cb0f52b445bf4975f41eaf321
guid: c271cfa846431634db54fa41238b7b35
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -1,41 +1,89 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using FMODUnity;
using NUnit.Framework;
using TMPro;
using FMOD;
using UnityEngine;
using UnityEngine.Rendering.Universal;
using INITFLAGS = FMOD.Studio.INITFLAGS;
public class AudioVisualizer : MonoBehaviour
[CreateAssetMenu(menuName = "Audio Visualizer Settings")]
public class AudioVisualizer : ScriptableObject
{
[SerializeField] private Renderer _ship;
[SerializeField] private Renderer _fractal;
[SerializeField] private Renderer _tunnel;
[SerializeField] private AudioVisualizerSettings _settings;
// https://qa.fmod.com/t/getting-spectrum-of-master-channel-in-unity/12579/2
// private FMOD.Studio.EventInstance _event;
private FMOD.DSP _fft;
private float _initialPower;
private void Start()
[Serializable]
private struct ShaderPropertyAnimation
{
// _event = RuntimeManager.CreateInstance("event:/Music");
public string name;
public float multiplier;
[UnityEngine.Range(0, 5)]
public int channel;
[UnityEngine.Range(0, 2048)]
public int sample;
RuntimeManager.CoreSystem.createDSPByType(FMOD.DSP_TYPE.FFT, out _fft);
RuntimeManager.CoreSystem.getMasterChannelGroup(out var channelGroup);
channelGroup.addDSP(FMOD.CHANNELCONTROL_DSP_INDEX.HEAD, _fft);
_settings.Initialise(_fractal.material, _tunnel.material, _ship.material);
public float Initial { get; set; }
}
private void LateUpdate()
// private Material _fractal;
// private Material _tunnel;
// private Material _ship;
[SerializeField] private ShaderPropertyAnimation[] _fractalAnimations;
[SerializeField] private ShaderPropertyAnimation[] _tunnelAnimations;
[SerializeField] private ShaderPropertyAnimation[] _shipAnimations;
[SerializeField] private AccessibilityOptions _accessibility;
public void Initialise(Material fractal, Material tunnel, Material ship)
{
_settings.Update(_fft, _fractal, _tunnel, _ship);
// _fractal = fractal;
// _tunnel = tunnel;
// _ship = ship;
InitialiseAnimations(_fractalAnimations, fractal);
InitialiseAnimations(_tunnelAnimations, tunnel);
InitialiseAnimations(_shipAnimations, ship);
}
private void InitialiseAnimations(ShaderPropertyAnimation[] animations, Material material)
{
for (int i = 0; i < animations.Length; i++)
{
var anim = animations[i];
anim.Initial = material.GetFloat(anim.name);
animations[i] = anim;
}
}
public void Update(DSP fft, Renderer fractal, Renderer tunnel, Renderer ship)
{
fft.getParameterData((int) FMOD.DSP_FFT.SPECTRUMDATA, out var unmanagedData, out var length);
var fftData = (FMOD.DSP_PARAMETER_FFT) Marshal.PtrToStructure(unmanagedData, typeof(FMOD.DSP_PARAMETER_FFT));
var spectrum = fftData.spectrum;
var l = spectrum.Length;
if (l == 0) return;
for (int i = 0; i < _fractalAnimations.Length; i++)
{
var anim = _fractalAnimations[i];
var a = spectrum[anim.channel][anim.sample];
fractal.material.SetFloat(anim.name, anim.Initial + anim.multiplier * a);
}
for (int i = 0; i < _tunnelAnimations.Length; i++)
{
var anim = _tunnelAnimations[i];
var a = spectrum[anim.channel][anim.sample];
tunnel.material.SetFloat(anim.name, anim.Initial + anim.multiplier * a);
}
UpdateAnimations(spectrum, _shipAnimations, ship);
}
private void UpdateAnimations(float[][] spectrum, ShaderPropertyAnimation[] animations, Renderer renderer)
{
for (int i = 0; i < animations.Length; i++)
{
var anim = animations[i];
var a = spectrum[anim.channel][anim.sample];
renderer.material.SetFloat(anim.name, anim.Initial + anim.multiplier * a);
}
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 3832fa92b7c91804697fe9f4f858b5d4
guid: a918b83cb0f52b445bf4975f41eaf321
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -0,0 +1,43 @@
using System;
using FMODUnity;
using UnityEngine;
public class AudioVisualizerRuntime : MonoBehaviour
{
[SerializeField] private Renderer _ship;
[SerializeField] private Renderer _fractal;
[SerializeField] private Renderer _tunnel;
[SerializeField] private AudioVisualizer _system;
[SerializeField] private AccessibilityOptions _accessibility;
// https://qa.fmod.com/t/getting-spectrum-of-master-channel-in-unity/12579/2
// private FMOD.Studio.EventInstance _event;
private FMOD.DSP _fft;
private float _initialPower;
private void Awake()
{
// pick correct materials for accessibility
// _ship.material = _accessibility.Intensity.Ship;
_tunnel.material = new Material(_accessibility.Intensity.Tunnel);
}
private void Start()
{
// _event = RuntimeManager.CreateInstance("event:/Music");
RuntimeManager.CoreSystem.createDSPByType(FMOD.DSP_TYPE.FFT, out _fft);
RuntimeManager.CoreSystem.getMasterChannelGroup(out var channelGroup);
channelGroup.addDSP(FMOD.CHANNELCONTROL_DSP_INDEX.HEAD, _fft);
_system.Initialise(_fractal.material, _tunnel.material, _ship.material);
}
private void LateUpdate()
{
_system.Update(_fft, _fractal, _tunnel, _ship);
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3832fa92b7c91804697fe9f4f858b5d4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,81 +0,0 @@
using System;
using System.Runtime.InteropServices;
using FMOD;
using UnityEngine;
using INITFLAGS = FMOD.Studio.INITFLAGS;
[CreateAssetMenu(menuName = "Audio Visualizer Settings")]
public class AudioVisualizerSettings : ScriptableObject
{
[Serializable]
private struct ShaderPropertyAnimation
{
public string name;
public float multiplier;
[UnityEngine.Range(0, 5)]
public int channel;
[UnityEngine.Range(0, 2048)]
public int sample;
public float Initial { get; set; }
}
[SerializeField] private ShaderPropertyAnimation[] _fractalAnimations;
[SerializeField] private ShaderPropertyAnimation[] _tunnelAnimations;
[SerializeField] private ShaderPropertyAnimation[] _shipAnimations;
public void Initialise(Material fractal, Material tunnel, Material ship)
{
InitialiseAnimations(_fractalAnimations, fractal);
InitialiseAnimations(_tunnelAnimations, tunnel);
InitialiseAnimations(_shipAnimations, ship);
}
private void InitialiseAnimations(ShaderPropertyAnimation[] animations, Material material)
{
for (int i = 0; i < animations.Length; i++)
{
var anim = animations[i];
anim.Initial = material.GetFloat(anim.name);
animations[i] = anim;
}
}
public void Update(DSP fft, Renderer fractal, Renderer tunnel, Renderer ship)
{
fft.getParameterData((int) FMOD.DSP_FFT.SPECTRUMDATA, out var unmanagedData, out var length);
var fftData = (FMOD.DSP_PARAMETER_FFT) Marshal.PtrToStructure(unmanagedData, typeof(FMOD.DSP_PARAMETER_FFT));
var spectrum = fftData.spectrum;
var l = spectrum.Length;
if (l == 0) return;
for (int i = 0; i < _fractalAnimations.Length; i++)
{
var anim = _fractalAnimations[i];
var a = spectrum[anim.channel][anim.sample];
fractal.material.SetFloat(anim.name, anim.Initial + anim.multiplier * a);
}
for (int i = 0; i < _tunnelAnimations.Length; i++)
{
var anim = _tunnelAnimations[i];
var a = spectrum[anim.channel][anim.sample];
tunnel.material.SetFloat(anim.name, anim.Initial + anim.multiplier * a);
}
UpdateAnimations(spectrum, _shipAnimations, ship);
}
private void UpdateAnimations(float[][] spectrum, ShaderPropertyAnimation[] animations, Renderer renderer)
{
for (int i = 0; i < animations.Length; i++)
{
var anim = animations[i];
var a = spectrum[anim.channel][anim.sample];
renderer.material.SetFloat(anim.name, anim.Initial + anim.multiplier * a);
}
}
}

View File

@ -5,17 +5,31 @@ Shader "custom/tunnel"
// called Base Map.
Properties
{
_BackgroundColor("Background Color", Color) = (0,0,0,0)
[HDR] _NebulaColor1("Nebula Color 1", Color) = (1,1,1,1)
[HDR] _NebulaColor2("Nebula Color 2", Color) = (1,1,1,1)
[HDR] _FractalColor("Fractal Color", Color) = (1,1,1,1)
_FractalWeight("Fractal Weight", Range(0.0,1.0)) = 1.0
_NebulaWeight("Nebula Weight", Range(0.0,1.0)) = 1.0
_BarsWeight("Bars Weight", Range(0.0,1.0)) = 1.0
_StarsWeight("Stars Weight", Range(0.0,1.0)) = 1.0
_FractalScale("Fractal Scale", Float) = 6.0
_FractalRotateSpeed("Fractal Rotate Speed", Float) = 20.0
_FractalPower("Fractal Power", Float) = 1.0
_FractalInner("Fractal Inner", Float) = 0.2
_Nebula1Power("Nebula 1 Power", Float) = 1.0
_Nebula2Power("Nebula 2 Power", Float) = 1.0
_NebulaMap("Nebula Map", 2D) = "black"
_StarMap("Star Map", 2D) = "black"
_FractalMap("Fractal Map", 2D) = "black"
_ShakeStrength("Shake Strength", Float) = 0.01
_OverallPower("Overall Power", Float) = 1.0
_Intensity("Intensity", Float) = 1.0
}
SubShader
@ -46,14 +60,27 @@ Shader "custom/tunnel"
float2 uv : TEXCOORD0;
};
float4 _BackgroundColor;
float4 _NebulaColor1;
float4 _NebulaColor2;
float4 _FractalColor;
float _FractalScale = 6.0;
float _FractalRotateSpeed = 20.0;
float _FractalPower = 1.0;
float _FractalInner = 0.2;
float _FractalWeight = 1.0;
float _Nebula1Power = 1.0;
float _Nebula2Power = 1.0;
float _NebulaWeight = 1.0;
float _BarsWeight;
float _StarsWeight;
float _Intensity;
float _ShakeStrength;
float _OverallPower;
TEXTURE2D(_NebulaMap);
SAMPLER(sampler_NebulaMap);
TEXTURE2D(_StarMap);
@ -88,8 +115,84 @@ Shader "custom/tunnel"
);
}
float4 nebula(float r, float a)
{
// sample nebula 1
float n1_stretch = 1.0/50.0;
float n1_speed = 20.0;
float n1_spin = 10.0;
// float n1_power = 2.0;
float n1_cutoff = 0.5;
half4 frag(Varyings IN) : SV_Target
float2 nuv1;
nuv1.x = n1_stretch/(r*r) + _Time * n1_speed;
nuv1.y = a/PI + _Time * n1_spin;
half4 nebula1 = SAMPLE_TEXTURE2D(_NebulaMap, sampler_NebulaMap, nuv1);
nebula1 *= _NebulaColor1;
nebula1 *= max(0,_Nebula1Power*r-n1_cutoff);
// sample nebula 2 - same as nebula 1 but in another direction
float n2_stretch = 1.0/100.0;
float n2_speed = 30.0;
float n2_spin = -5.0;
// float n2_power = 4.0;
float n2_cutoff = 0.5;
float2 nuv2;
nuv2.x = n2_stretch/(r*r) + _Time * n2_speed;
nuv2.y = a/PI + _Time * n2_spin;
half4 nebula2 = SAMPLE_TEXTURE2D(_NebulaMap, sampler_NebulaMap, nuv2.yx);
nebula2 *= _NebulaColor2;
nebula2 *= max(0,_Nebula2Power*r - n2_cutoff);
return (nebula1 + nebula2) * _Intensity * _NebulaWeight;
}
float4 stars(float r, float a)
{
// sample stars
float starStretch = 1.0/100.0;
float starSpeed = 10.0 * _Intensity;
float starWrap = 3.5f;
// star uv
float2 suv;
// use the root to make them into radial lines instead of a tunnel
suv.x = starStretch/sqrt(r) + _Time * starSpeed;
suv.y = (float)starWrap*a/PI;
half4 star = SAMPLE_TEXTURE2D(_StarMap, sampler_StarMap, suv);
star *= r * r * 2.0;
return star * _Intensity * _StarsWeight;
}
// same as fractals but calling it from a function turns them into bars??
float4 bars(float r, float p)
{
// fractal uv
float2 fuv1 = p / _FractalScale + float2(0.5,0.5);
fuv1 = rotateUV(fuv1,_Time*_FractalRotateSpeed);
half4 fractal1 = SAMPLE_TEXTURE2D(_FractalMap, sampler_FractalMap, fuv1);
fractal1 *= _FractalColor;
fractal1 *= max(0, r-_FractalInner);
fractal1 *= _FractalPower;
// fractal 2
float2 fuv2 = p / _FractalScale + float2(0.5,0.5);
fuv2 = rotateUV(fuv2,-_Time*_FractalRotateSpeed*3.561);
fuv2.x=1.0-fuv2.x;
half4 fractal2 = SAMPLE_TEXTURE2D(_FractalMap, sampler_FractalMap, fuv2);
fractal2 *= _FractalColor * sin(_Time*3);
fractal2 *= max(0, r-_FractalInner);
fractal2 *= _FractalPower;
half4 fractal = max(fractal1,fractal2) * _Intensity;
return fractal * _Intensity * _BarsWeight;
}
float4 frag(Varyings IN) : SV_Target
{
float2 res = _ScreenParams;
float2 p = -1.0+2.0*IN.positionHCS.xy/res.xy;
@ -100,87 +203,42 @@ Shader "custom/tunnel"
cameraShake.x = cos(shake*12.3341)+sin(shake*19.231057);
cameraShake.y = cos(shake*17.12311)+sin(shake*14.2315165);
cameraShake*=_ShakeStrength;
p += cameraShake;
// p += cameraShake;
// shared tunnel vars
float r = length(p);
float a = atan(p.y/p.x);
// sample nebula 1
float n1_stretch = 1.0/50.0;
float n1_speed = 20.0;
float n1_spin = 10.0;
float n1_power = 2.0;
float n1_cutoff = 0.5;
float2 nuv1;
nuv1.x = n1_stretch/(r*r) + _Time * n1_speed;
nuv1.y = a/PI + _Time * n1_spin;
half4 nebula1 = SAMPLE_TEXTURE2D(_NebulaMap, sampler_NebulaMap, nuv1);
nebula1 *= _NebulaColor1;
nebula1 *= max(0,n1_power*r-n1_cutoff);
// sample nebula 2 - same as nebula 1 but in another direction
float n2_stretch = 1.0/100.0;
float n2_speed = 30.0;
float n2_spin = -5.0;
float n2_power = 4.0;
float n2_cutoff = 0.5;
float2 nuv2;
nuv2.x = n2_stretch/(r*r) + _Time * n2_speed;
nuv2.y = a/PI + _Time * n2_spin;
half4 nebula2 = SAMPLE_TEXTURE2D(_NebulaMap, sampler_NebulaMap, nuv2.yx);
nebula2 *= _NebulaColor2;
nebula2 *= max(0,n2_power*r - n2_cutoff);
// sample stars
float starStretch = 1.0/100.0;
float starSpeed = 10.0;
int starWrap = 3;
// star uv
float2 suv;
// use the root to make them into radial lines instead of a tunnel
suv.x = starStretch/sqrt(r) + _Time * starSpeed;
suv.y = (float)starWrap*a/PI;
half4 star = SAMPLE_TEXTURE2D(_StarMap, sampler_StarMap, suv);
star *= r * r * 2.0;
// sample fractal
float fractalScale = 6.0;
float fractalRotateSpeed = 20.0;
float fractalPower = 1.0;
float fractal_inner = 0.2;
// fractal uv
float2 fuv1 = p / fractalScale + float2(0.5,0.5);
fuv1 = rotateUV(fuv1,_Time*fractalRotateSpeed);
// for some reason trying to sample the fractal in a function turns it into bars
// looks cool but no idea why it happens so these fractals are inline
float2 fuv1 = p / _FractalScale + float2(0.5,0.5);
fuv1 = rotateUV(fuv1,_Time*_FractalRotateSpeed);
half4 fractal1 = SAMPLE_TEXTURE2D(_FractalMap, sampler_FractalMap, fuv1);
fractal1 *= _FractalColor;
fractal1 *= max(0, r-fractal_inner);
fractal1 *= fractalPower*0.5;
fractal1 *= max(0, r-_FractalInner);
fractal1 *= _FractalWeight;
fractal1 *= _Intensity;
// fractal 2
float2 fuv2 = rotateUV(fuv1,-_Time*fractalRotateSpeed*3.561);
float2 fuv2 = p / _FractalScale + float2(0.5,0.5);
fuv2 = rotateUV(fuv2,-_Time*_FractalRotateSpeed*3.561);
fuv2.x=1.0-fuv2.x;
half4 fractal2 = SAMPLE_TEXTURE2D(_FractalMap, sampler_FractalMap, fuv2);
fractal2 *= _FractalColor * sin(_Time*3);
fractal2 *= max(0, r-fractal_inner);
fractal2 *= fractalPower*0.5;
fractal2 *= max(0, r-_FractalInner);
fractal2 *= _FractalWeight;
fractal2 *= _Intensity;
half4 fractal = max(fractal1,fractal2);
float4 color = _BackgroundColor;
color += nebula(r, a);
color += bars(r, p);
color += fractal1;
color += fractal2;
color += stars(r, a);
half4 color = half4(0,0,0,0);
color += nebula1;
color += nebula2;
color += fractal;
// color += fractal1;
// color += fractal2;
color += star;
// bars, nebula, fractal,
// average across all fx
color = saturate(color);
color *= _OverallPower;
return color;
}