init unity project

master
uc-hoba 8 years ago
parent db32d97aac
commit 0361b5e8d0
  1. 40
      Unity_2018_Frozen/.gitignore
  2. 10
      Unity_2018_Frozen/Assets/FluidSim3D.meta
  3. 532
      Unity_2018_Frozen/Assets/FluidSim3D/FireFluid.unity
  4. 4
      Unity_2018_Frozen/Assets/FluidSim3D/FireFluid.unity.meta
  5. 5
      Unity_2018_Frozen/Assets/FluidSim3D/Materials.meta
  6. 29
      Unity_2018_Frozen/Assets/FluidSim3D/Materials/FireRayCast.mat
  7. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Materials/FireRayCast.mat.meta
  8. 27
      Unity_2018_Frozen/Assets/FluidSim3D/Materials/Plane.mat
  9. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Materials/Plane.mat.meta
  10. 39
      Unity_2018_Frozen/Assets/FluidSim3D/Materials/SmokeRayCast.mat
  11. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Materials/SmokeRayCast.mat.meta
  12. 5
      Unity_2018_Frozen/Assets/FluidSim3D/Prefabs.meta
  13. 123
      Unity_2018_Frozen/Assets/FluidSim3D/Prefabs/FireFluidSim.prefab
  14. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Prefabs/FireFluidSim.prefab.meta
  15. 119
      Unity_2018_Frozen/Assets/FluidSim3D/Prefabs/SmokeFluidSim.prefab
  16. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Prefabs/SmokeFluidSim.prefab.meta
  17. 5
      Unity_2018_Frozen/Assets/FluidSim3D/Scripts.meta
  18. 464
      Unity_2018_Frozen/Assets/FluidSim3D/Scripts/FireFluidSim.cs
  19. 8
      Unity_2018_Frozen/Assets/FluidSim3D/Scripts/FireFluidSim.cs.meta
  20. 436
      Unity_2018_Frozen/Assets/FluidSim3D/Scripts/SmokeFluidSim.cs
  21. 8
      Unity_2018_Frozen/Assets/FluidSim3D/Scripts/SmokeFluidSim.cs.meta
  22. 5
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders.meta
  23. 244
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ApplyAdvection.compute
  24. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ApplyAdvection.compute.meta
  25. 47
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ApplyBuoyancy.compute
  26. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ApplyBuoyancy.compute.meta
  27. 58
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ApplyImpulse.compute
  28. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ApplyImpulse.compute.meta
  29. 44
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ComputeConfinement.compute
  30. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ComputeConfinement.compute.meta
  31. 49
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ComputeDivergence.compute
  32. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ComputeDivergence.compute.meta
  33. 65
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ComputeJacobi.compute
  34. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ComputeJacobi.compute.meta
  35. 47
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ComputeObstacles.compute
  36. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ComputeObstacles.compute.meta
  37. 76
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ComputeProjection.compute
  38. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ComputeProjection.compute.meta
  39. 37
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ComputeVorticity.compute
  40. 4
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/ComputeVorticity.compute.meta
  41. 193
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/FireRayCast.shader
  42. 5
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/FireRayCast.shader.meta
  43. 183
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/SmokeRayCast.shader
  44. 5
      Unity_2018_Frozen/Assets/FluidSim3D/Shaders/SmokeRayCast.shader.meta
  45. 399
      Unity_2018_Frozen/Assets/FluidSim3D/SmokeFluid.unity
  46. 4
      Unity_2018_Frozen/Assets/FluidSim3D/SmokeFluid.unity.meta
  47. 5
      Unity_2018_Frozen/Assets/FluidSim3D/Textures.meta
  48. BIN
      Unity_2018_Frozen/Assets/FluidSim3D/Textures/FireGradient.png
  49. 45
      Unity_2018_Frozen/Assets/FluidSim3D/Textures/FireGradient.png.meta
  50. 10
      Unity_2018_Frozen/Assets/FluidSimControl.meta
  51. 67
      Unity_2018_Frozen/Assets/FluidSimControl/FluidSimInputController.cs
  52. 13
      Unity_2018_Frozen/Assets/FluidSimControl/FluidSimInputController.cs.meta
  53. 21
      Unity_2018_Frozen/Assets/FluidSimControl/SmokeFluidSimUniforms.asset
  54. 10
      Unity_2018_Frozen/Assets/FluidSimControl/SmokeFluidSimUniforms.asset.meta
  55. 26
      Unity_2018_Frozen/Assets/FluidSimControl/SmokeFluidSimUniforms.cs
  56. 13
      Unity_2018_Frozen/Assets/FluidSimControl/SmokeFluidSimUniforms.cs.meta
  57. 10
      Unity_2018_Frozen/Assets/Frozen.meta
  58. 1279
      Unity_2018_Frozen/Assets/Frozen/Frozen.unity
  59. 9
      Unity_2018_Frozen/Assets/Frozen/Frozen.unity.meta
  60. 10
      Unity_2018_Frozen/Assets/KinectOpticalFlow.meta
  61. 64
      Unity_2018_Frozen/Assets/KinectOpticalFlow/ClearKinectBufferShader.compute
  62. 9
      Unity_2018_Frozen/Assets/KinectOpticalFlow/ClearKinectBufferShader.compute.meta
  63. 199
      Unity_2018_Frozen/Assets/KinectOpticalFlow/KinectOpticalFlow.cs
  64. 12
      Unity_2018_Frozen/Assets/KinectOpticalFlow/KinectOpticalFlow.cs.meta
  65. 78
      Unity_2018_Frozen/Assets/KinectOpticalFlow/KinectOpticalFlowDebugMaterial.mat
  66. 9
      Unity_2018_Frozen/Assets/KinectOpticalFlow/KinectOpticalFlowDebugMaterial.mat.meta
  67. 94
      Unity_2018_Frozen/Assets/KinectOpticalFlow/KinectOpticalFlowDebugShader.shader
  68. 9
      Unity_2018_Frozen/Assets/KinectOpticalFlow/KinectOpticalFlowDebugShader.shader.meta
  69. 33
      Unity_2018_Frozen/Assets/KinectOpticalFlow/KinectRenderTexturePosition.renderTexture
  70. 9
      Unity_2018_Frozen/Assets/KinectOpticalFlow/KinectRenderTexturePosition.renderTexture.meta
  71. 33
      Unity_2018_Frozen/Assets/KinectOpticalFlow/KinectRenderTextureVelocity.renderTexture
  72. 9
      Unity_2018_Frozen/Assets/KinectOpticalFlow/KinectRenderTextureVelocity.renderTexture.meta
  73. 72
      Unity_2018_Frozen/Assets/KinectOpticalFlow/KinectUpdateShader.compute
  74. 9
      Unity_2018_Frozen/Assets/KinectOpticalFlow/KinectUpdateShader.compute.meta
  75. 10
      Unity_2018_Frozen/Assets/Klak.meta
  76. 10
      Unity_2018_Frozen/Assets/Klak/Chromatics.meta
  77. 89
      Unity_2018_Frozen/Assets/Klak/Chromatics/CosineGradient.cs
  78. 12
      Unity_2018_Frozen/Assets/Klak/Chromatics/CosineGradient.cs.meta
  79. 9
      Unity_2018_Frozen/Assets/Klak/Chromatics/Editor.meta
  80. 192
      Unity_2018_Frozen/Assets/Klak/Chromatics/Editor/CosineGradientEditor.cs
  81. 13
      Unity_2018_Frozen/Assets/Klak/Chromatics/Editor/CosineGradientEditor.cs.meta
  82. 46
      Unity_2018_Frozen/Assets/Klak/Chromatics/Editor/Preview.shader
  83. 9
      Unity_2018_Frozen/Assets/Klak/Chromatics/Editor/Preview.shader.meta
  84. 113726
      Unity_2018_Frozen/Assets/MainEvaMapping.unity
  85. 9
      Unity_2018_Frozen/Assets/MainEvaMapping.unity.meta
  86. 10
      Unity_2018_Frozen/Assets/Material.meta
  87. 77
      Unity_2018_Frozen/Assets/Material/AtmosphereSkybox.mat
  88. 10
      Unity_2018_Frozen/Assets/Material/AtmosphereSkybox.mat.meta
  89. 10
      Unity_2018_Frozen/Assets/ParticleWorks.meta
  90. 16
      Unity_2018_Frozen/Assets/ParticleWorks/CosineGradient.asset
  91. 10
      Unity_2018_Frozen/Assets/ParticleWorks/CosineGradient.asset.meta
  92. 10
      Unity_2018_Frozen/Assets/ParticleWorks/Material.meta
  93. 76
      Unity_2018_Frozen/Assets/ParticleWorks/Material/Ground.mat
  94. 10
      Unity_2018_Frozen/Assets/ParticleWorks/Material/Ground.mat.meta
  95. 76
      Unity_2018_Frozen/Assets/ParticleWorks/Material/Mirror.mat
  96. 8
      Unity_2018_Frozen/Assets/ParticleWorks/Material/Mirror.mat.meta
  97. 78
      Unity_2018_Frozen/Assets/ParticleWorks/Material/ParticleViewerInstanced.mat
  98. 10
      Unity_2018_Frozen/Assets/ParticleWorks/Material/ParticleViewerInstanced.mat.meta
  99. 78
      Unity_2018_Frozen/Assets/ParticleWorks/Material/ParticleViewerMesh.mat
  100. 10
      Unity_2018_Frozen/Assets/ParticleWorks/Material/ParticleViewerMesh.mat.meta
  101. Some files were not shown because too many files have changed in this diff Show More

@ -0,0 +1,40 @@
# Created by https://www.gitignore.io/api/unity
### Unity ###
/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/Assets/AssetStoreTools*
# Visual Studio 2015 cache directory
/.vs/
# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
# Unity3D generated meta files
*.pidb.meta
# Unity3D Generated File On Crash Reports
sysinfo.txt
# Builds
*.apk
*.unitypackage
# End of https://www.gitignore.io/api/unity

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 8bdf519f8f30b6c479411fed445191a4
folderAsset: yes
timeCreated: 1519695581
licenseType: Free
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,532 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 8
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
m_LinearFogStart: 0
m_LinearFogEnd: 300
m_AmbientSkyColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
m_AmbientEquatorColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
m_AmbientIntensity: 1
m_AmbientMode: 3
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 0}
m_HaloStrength: 0.5
m_FlareStrength: 1
m_FlareFadeSpeed: 3
m_HaloTexture: {fileID: 0}
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
m_DefaultReflectionMode: 0
m_DefaultReflectionResolution: 128
m_ReflectionBounces: 1
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
--- !u!157 &4
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 11
m_GIWorkflowMode: 1
m_GISettings:
serializedVersion: 2
m_BounceScale: 1
m_IndirectOutputScale: 1
m_AlbedoBoost: 1
m_TemporalCoherenceThreshold: 1
m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 1
m_EnableRealtimeLightmaps: 0
m_LightmapEditorSettings:
serializedVersion: 9
m_Resolution: 1
m_BakeResolution: 50
m_TextureWidth: 1024
m_TextureHeight: 1024
m_AO: 1
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_Padding: 2
m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1
m_TextureCompression: 0
m_FinalGather: 0
m_FinalGatherFiltering: 1
m_FinalGatherRayCount: 256
m_ReflectionCompression: 2
m_MixedBakeMode: 1
m_BakeBackend: 0
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 500
m_PVRBounces: 2
m_PVRFiltering: 0
m_PVRFilteringMode: 1
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousColorSigma: 1
m_PVRFilteringAtrousNormalSigma: 1
m_PVRFilteringAtrousPositionSigma: 1
m_LightingDataAsset: {fileID: 0}
m_UseShadowmask: 0
--- !u!196 &5
NavMeshSettings:
serializedVersion: 2
m_ObjectHideFlags: 0
m_BuildSettings:
serializedVersion: 2
agentTypeID: 0
agentRadius: 0.5
agentHeight: 2
agentSlope: 45
agentClimb: 0.4
ledgeDropHeight: 0
maxJumpAcrossDistance: 0
minRegionArea: 2
manualCellSize: 0
cellSize: 0.16666666
manualTileSize: 0
tileSize: 256
accuratePlacement: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &410104090
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 100000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
m_PrefabInternal: {fileID: 1685451357}
serializedVersion: 5
m_Component:
- component: {fileID: 410104094}
- component: {fileID: 410104093}
- component: {fileID: 410104092}
- component: {fileID: 410104091}
m_Layer: 0
m_Name: FireFluidSim
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &410104091
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 11400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02,
type: 2}
m_PrefabInternal: {fileID: 1685451357}
m_GameObject: {fileID: 410104090}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 164869986c15313419bf6ec021c90430, type: 3}
m_Name:
m_EditorClassIdentifier:
m_denstyAdvectionType: 1
m_reactionAdvectionType: 1
m_width: 64
m_height: 128
m_depth: 64
m_iterations: 10
m_vorticityStrength: 1
m_densityAmount: 1
m_densityDissipation: 0.999
m_densityBuoyancy: 1
m_densityWeight: 0.0125
m_temperatureAmount: 10
m_temperatureDissipation: 0.995
m_reactionAmount: 1
m_reactionDecay: 0.001
m_reactionExtinguishment: 0.01
m_velocityDissipation: 0.995
m_inputRadius: 0.04
m_inputPos: {x: 0.5, y: 0.1, z: 0.5, w: 0}
m_applyImpulse: {fileID: 7200000, guid: a080c25e6daeb0d4e88fced65f9959ce, type: 3}
m_applyAdvect: {fileID: 7200000, guid: 411cedf0db0a1904693c77b97afbf915, type: 3}
m_computeVorticity: {fileID: 7200000, guid: 62b5b102c778bbd4682f63bf0a9bd2fe, type: 3}
m_computeDivergence: {fileID: 7200000, guid: e25212f321912c44ab6d9430762d37b6, type: 3}
m_computeJacobi: {fileID: 7200000, guid: cebd12b982d79674aab2ed65879e49d0, type: 3}
m_computeProjection: {fileID: 7200000, guid: aa1de4528a2c0d24983dce181ecd63af, type: 3}
m_computeConfinement: {fileID: 7200000, guid: 4b0055f0edf774c4ea97ac8cd62e6158,
type: 3}
m_computeObstacles: {fileID: 7200000, guid: 6a49b38e37bae7a4ab2903fbdde8e4ac, type: 3}
m_applyBuoyancy: {fileID: 7200000, guid: 0d7710a16db583e418df13bddb0be43d, type: 3}
--- !u!23 &410104092
MeshRenderer:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 2300000, guid: 254356bdfdadcdd4aafdd4454a3d8f02,
type: 2}
m_PrefabInternal: {fileID: 1685451357}
m_GameObject: {fileID: 410104090}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_MotionVectors: 1
m_LightProbeUsage: 0
m_ReflectionProbeUsage: 1
m_Materials:
- {fileID: 2100000, guid: 2006b3393d311dc49ab782b940924419, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!33 &410104093
MeshFilter:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 3300000, guid: 254356bdfdadcdd4aafdd4454a3d8f02,
type: 2}
m_PrefabInternal: {fileID: 1685451357}
m_GameObject: {fileID: 410104090}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!4 &410104094
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
m_PrefabInternal: {fileID: 1685451357}
m_GameObject: {fileID: 410104090}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 4.001, z: 12}
m_LocalScale: {x: 4, y: 8, z: 4}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1470411171
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 100004, guid: 9d4133d5d30b644bd87802a347eaccbe, type: 2}
m_PrefabInternal: {fileID: 0}
serializedVersion: 5
m_Component:
- component: {fileID: 1470411177}
- component: {fileID: 1470411176}
- component: {fileID: 1470411175}
m_Layer: 0
m_Name: Main Camera
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!92 &1470411175
Behaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 9200000, guid: 9d4133d5d30b644bd87802a347eaccbe,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1470411171}
m_Enabled: 1
--- !u!20 &1470411176
Camera:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 2000000, guid: 9d4133d5d30b644bd87802a347eaccbe,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1470411171}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 1
m_BackGroundColor: {r: 0.42647058, g: 0.42647058, b: 0.42647058, a: 1}
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 60
field of view: 40
orthographic: 0
orthographic size: 100
m_Depth: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294966527
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 0
m_AllowMSAA: 1
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
m_StereoMirrorMode: 0
--- !u!4 &1470411177
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 400004, guid: 9d4133d5d30b644bd87802a347eaccbe, type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1470411171}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 2, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &1685451357
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_LocalPosition.y
value: 4.00099993
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_LocalPosition.z
value: 12
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 11400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_width
value: 64
objectReference: {fileID: 0}
- target: {fileID: 11400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_depth
value: 64
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_LocalScale.x
value: 4
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_LocalScale.z
value: 4
objectReference: {fileID: 0}
- target: {fileID: 11400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_reactionDecay
value: .00100000005
objectReference: {fileID: 0}
- target: {fileID: 11400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_reactionAdvectionType
value: 1
objectReference: {fileID: 0}
- target: {fileID: 11400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_reactionExtinguishment
value: .00999999978
objectReference: {fileID: 0}
- target: {fileID: 11400000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
propertyPath: m_densityDissipation
value: .999000013
objectReference: {fileID: 0}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: 254356bdfdadcdd4aafdd4454a3d8f02, type: 2}
m_RootGameObject: {fileID: 410104090}
m_IsPrefabParent: 0
--- !u!1 &1803253977
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
serializedVersion: 5
m_Component:
- component: {fileID: 1803253979}
- component: {fileID: 1803253978}
m_Layer: 0
m_Name: Directional light
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!108 &1803253978
Light:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1803253977}
m_Enabled: 1
serializedVersion: 8
m_Type: 1
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_Intensity: 1
m_Range: 10
m_SpotAngle: 30
m_CookieSize: 10
m_Shadows:
m_Type: 0
m_Resolution: -1
m_CustomResolution: -1
m_Strength: 1
m_Bias: 0.05
m_NormalBias: 0.4
m_NearPlane: 0.2
m_Cookie: {fileID: 0}
m_DrawHalo: 0
m_Flare: {fileID: 0}
m_RenderMode: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_Lightmapping: 1
m_AreaSize: {x: 1, y: 1}
m_BounceIntensity: 1
m_FalloffTable:
m_Table[0]: 0
m_Table[1]: 0
m_Table[2]: 0
m_Table[3]: 0
m_Table[4]: 0
m_Table[5]: 0
m_Table[6]: 0
m_Table[7]: 0
m_Table[8]: 0
m_Table[9]: 0
m_Table[10]: 0
m_Table[11]: 0
m_Table[12]: 0
m_ColorTemperature: 6570
m_UseColorTemperature: 0
m_ShadowRadius: 0
m_ShadowAngle: 0
--- !u!4 &1803253979
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1803253977}
m_LocalRotation: {x: 0.40821794, y: -0.23456973, z: 0.10938166, w: 0.8754261}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &2140950347
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
serializedVersion: 5
m_Component:
- component: {fileID: 2140950351}
- component: {fileID: 2140950350}
- component: {fileID: 2140950349}
- component: {fileID: 2140950348}
m_Layer: 0
m_Name: Plane
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!23 &2140950348
MeshRenderer:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 2140950347}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_MotionVectors: 1
m_LightProbeUsage: 0
m_ReflectionProbeUsage: 1
m_Materials:
- {fileID: 2100000, guid: 0d538acbbf71af343b5efaa45bd9af35, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!64 &2140950349
MeshCollider:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 2140950347}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 1
serializedVersion: 2
m_Convex: 0
m_InflateMesh: 0
m_SkinWidth: 0.01
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
--- !u!33 &2140950350
MeshFilter:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 2140950347}
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
--- !u!4 &2140950351
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 2140950347}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 8, y: 8, z: 8}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: 405ae8807e9bbb141953d785d46979aa
DefaultImporter:
userData:

@ -0,0 +1,5 @@
fileFormatVersion: 2
guid: f6db2bc76e7b3754886e1b8e79996ff0
folderAsset: yes
DefaultImporter:
userData:

@ -0,0 +1,29 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: FireRayCast
m_Shader: {fileID: 4800000, guid: ce7e14398ee00d84193a82fb0174f3f6, type: 3}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _FireGradient:
m_Texture: {fileID: 2800000, guid: ac2c4961e13090042b382bb1c186bc31, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _FireAbsorption: 30
- _SmokeAbsorption: 60
m_Colors:
- _SmokeColor: {r: 0, g: 0, b: 0, a: 1}

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: 2006b3393d311dc49ab782b940924419
NativeFormatImporter:
userData:

@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: Plane
m_Shader: {fileID: 7, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats: []
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: 0d538acbbf71af343b5efaa45bd9af35
NativeFormatImporter:
userData:

@ -0,0 +1,39 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: SmokeRayCast
m_Shader: {fileID: 4800000, guid: edf7886cf7d957f4c8416e250df7367c, type: 3}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _FireGradient:
m_Texture: {fileID: 2800000, guid: ac2c4961e13090042b382bb1c186bc31, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _Noise:
m_Texture: {fileID: 2800000, guid: 4c7152dd0f6e54d46952f29abb57d4d5, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SmokeGradient:
m_Texture: {fileID: 2800000, guid: e0a2b0af0d77f45478f599c74d453d6f, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _Absorption: 60
- _FireAbsorption: 40
- _SmokeAbsorption: 60
m_Colors:
- _Color: {r: 0, g: 0, b: 0, a: 1}
- _SmokeColor: {r: 0, g: 0, b: 0, a: 1}

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: dfd547b8d6e669e43901fd5e9e8632f1
NativeFormatImporter:
userData:

@ -0,0 +1,5 @@
fileFormatVersion: 2
guid: fd9ac0e19d371c4468b5b921ab7d92a3
folderAsset: yes
DefaultImporter:
userData:

@ -0,0 +1,123 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &100000
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
serializedVersion: 5
m_Component:
- component: {fileID: 400000}
- component: {fileID: 3300000}
- component: {fileID: 2300000}
- component: {fileID: 11400000}
m_Layer: 0
m_Name: FireFluidSim
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &400000
Transform:
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 100000}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 4.001, z: 24}
m_LocalScale: {x: 4, y: 8, z: 4}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!23 &2300000
MeshRenderer:
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 100000}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_MotionVectors: 1
m_LightProbeUsage: 0
m_ReflectionProbeUsage: 1
m_Materials:
- {fileID: 2100000, guid: 2006b3393d311dc49ab782b940924419, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!33 &3300000
MeshFilter:
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 100000}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 100000}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 164869986c15313419bf6ec021c90430, type: 3}
m_Name:
m_EditorClassIdentifier:
m_denstyAdvectionType: 1
m_reactionAdvectionType: 1
m_width: 128
m_height: 128
m_depth: 128
m_iterations: 10
m_vorticityStrength: 1
m_densityAmount: 1
m_densityDissipation: 0.999
m_densityBuoyancy: 1
m_densityWeight: 0.0125
m_temperatureAmount: 10
m_temperatureDissipation: 0.995
m_reactionAmount: 1
m_reactionDecay: 0.001
m_reactionExtinguishment: 0.01
m_velocityDissipation: 0.995
m_inputRadius: 0.04
m_inputPos: {x: 0.5, y: 0.1, z: 0.5, w: 0}
m_applyImpulse: {fileID: 7200000, guid: a080c25e6daeb0d4e88fced65f9959ce, type: 3}
m_applyAdvect: {fileID: 7200000, guid: 411cedf0db0a1904693c77b97afbf915, type: 3}
m_computeVorticity: {fileID: 7200000, guid: 62b5b102c778bbd4682f63bf0a9bd2fe, type: 3}
m_computeDivergence: {fileID: 7200000, guid: e25212f321912c44ab6d9430762d37b6, type: 3}
m_computeJacobi: {fileID: 7200000, guid: cebd12b982d79674aab2ed65879e49d0, type: 3}
m_computeProjection: {fileID: 7200000, guid: aa1de4528a2c0d24983dce181ecd63af, type: 3}
m_computeConfinement: {fileID: 7200000, guid: 4b0055f0edf774c4ea97ac8cd62e6158,
type: 3}
m_computeObstacles: {fileID: 7200000, guid: 6a49b38e37bae7a4ab2903fbdde8e4ac, type: 3}
m_applyBuoyancy: {fileID: 7200000, guid: 0d7710a16db583e418df13bddb0be43d, type: 3}
--- !u!1001 &100100000
Prefab:
m_ObjectHideFlags: 1
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications: []
m_RemovedComponents: []
m_ParentPrefab: {fileID: 0}
m_RootGameObject: {fileID: 100000}
m_IsPrefabParent: 1

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: 254356bdfdadcdd4aafdd4454a3d8f02
NativeFormatImporter:
userData:

@ -0,0 +1,119 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &100000
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
serializedVersion: 5
m_Component:
- component: {fileID: 400000}
- component: {fileID: 3300000}
- component: {fileID: 2300000}
- component: {fileID: 11400000}
m_Layer: 0
m_Name: SmokeFluidSim
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &400000
Transform:
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 100000}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 4.001, z: 24}
m_LocalScale: {x: 4, y: 8, z: 4}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!23 &2300000
MeshRenderer:
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 100000}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_MotionVectors: 1
m_LightProbeUsage: 0
m_ReflectionProbeUsage: 1
m_Materials:
- {fileID: 2100000, guid: dfd547b8d6e669e43901fd5e9e8632f1, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!33 &3300000
MeshFilter:
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 100000}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 100000}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a924471615937564f81ebb1540cd8b36, type: 3}
m_Name:
m_EditorClassIdentifier:
m_advectionType: 1
m_width: 64
m_height: 128
m_depth: 64
m_iterations: 10
m_vorticityStrength: 1
m_densityAmount: 1
m_densityDissipation: 0.999
m_densityBuoyancy: 1
m_densityWeight: 0.0125
m_temperatureAmount: 10
m_temperatureDissipation: 0.995
m_velocityDissipation: 0.995
m_inputRadius: 0.04
m_inputPos: {x: 0.5, y: 0.1, z: 0.5, w: 0}
m_applyImpulse: {fileID: 7200000, guid: a080c25e6daeb0d4e88fced65f9959ce, type: 3}
m_applyAdvect: {fileID: 7200000, guid: 411cedf0db0a1904693c77b97afbf915, type: 3}
m_computeVorticity: {fileID: 7200000, guid: 62b5b102c778bbd4682f63bf0a9bd2fe, type: 3}
m_computeDivergence: {fileID: 7200000, guid: e25212f321912c44ab6d9430762d37b6, type: 3}
m_computeJacobi: {fileID: 7200000, guid: cebd12b982d79674aab2ed65879e49d0, type: 3}
m_computeProjection: {fileID: 7200000, guid: aa1de4528a2c0d24983dce181ecd63af, type: 3}
m_computeConfinement: {fileID: 7200000, guid: 4b0055f0edf774c4ea97ac8cd62e6158,
type: 3}
m_computeObstacles: {fileID: 7200000, guid: 6a49b38e37bae7a4ab2903fbdde8e4ac, type: 3}
m_applyBuoyancy: {fileID: 7200000, guid: 0d7710a16db583e418df13bddb0be43d, type: 3}
--- !u!1001 &100100000
Prefab:
m_ObjectHideFlags: 1
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications: []
m_RemovedComponents: []
m_ParentPrefab: {fileID: 0}
m_RootGameObject: {fileID: 100000}
m_IsPrefabParent: 1

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: 0b40c0b4ea4208b4792d95085b850676
NativeFormatImporter:
userData:

@ -0,0 +1,5 @@
fileFormatVersion: 2
guid: 0f670c9ec84a88d4cab33481a41f9b00
folderAsset: yes
DefaultImporter:
userData:

@ -0,0 +1,464 @@
using UnityEngine;
using System.Collections;
namespace FluidSim3DProject
{
public class FireFluidSim : MonoBehaviour
{
//DONT CHANGE THESE
const int READ = 0;
const int WRITE = 1;
const int PHI_N_HAT = 0;
const int PHI_N_1_HAT = 1;
public enum ADVECTION { NORMAL = 1, BFECC = 2, MACCORMACK = 3 };
//You can change this but you must change the same value in all the compute shader's to the same
//Must be a pow2 number
const int NUM_THREADS = 8;
//You can change this or even use Time.DeltaTime but large time steps can cause numerical errors
const float TIME_STEP = 0.1f;
public ADVECTION m_denstyAdvectionType = ADVECTION.NORMAL;
public ADVECTION m_reactionAdvectionType = ADVECTION.NORMAL;
public int m_width = 128;
public int m_height = 128;
public int m_depth = 128;
public int m_iterations = 10;
public float m_vorticityStrength = 1.0f;
public float m_densityAmount = 1.0f;
public float m_densityDissipation = 0.999f;
public float m_densityBuoyancy = 1.0f;
public float m_densityWeight = 0.0125f;
public float m_temperatureAmount = 10.0f;
public float m_temperatureDissipation = 0.995f;
public float m_reactionAmount = 1.0f;
public float m_reactionDecay = 0.001f;
public float m_reactionExtinguishment = 0.01f;
public float m_velocityDissipation = 0.995f;
public float m_inputRadius = 0.04f;
public Vector4 m_inputPos = new Vector4(0.5f,0.1f,0.5f,0.0f);
float m_ambientTemperature = 0.0f;
public ComputeShader m_applyImpulse, m_applyAdvect, m_computeVorticity;
public ComputeShader m_computeDivergence, m_computeJacobi, m_computeProjection;
public ComputeShader m_computeConfinement, m_computeObstacles, m_applyBuoyancy;
Vector4 m_size;
ComputeBuffer[] m_density, m_velocity, m_pressure, m_temperature, m_phi, m_reaction;
ComputeBuffer m_temp3f, m_obstacles;
void Start ()
{
//Dimension sizes must be pow2 numbers
m_width = Mathf.ClosestPowerOfTwo(m_width);
m_height = Mathf.ClosestPowerOfTwo(m_height);
m_depth = Mathf.ClosestPowerOfTwo(m_depth);
//Put all dimension sizes in a vector for easy parsing to shader and also prevents user changing
//dimension sizes during play
m_size = new Vector4(m_width, m_height, m_depth, 0.0f);
//Create all the buffers needed
int SIZE = m_width*m_height*m_depth;
m_density = new ComputeBuffer[2];
m_density[READ] = new ComputeBuffer(SIZE, sizeof(float));
m_density[WRITE] = new ComputeBuffer(SIZE, sizeof(float));
m_temperature = new ComputeBuffer[2];
m_temperature[READ] = new ComputeBuffer(SIZE, sizeof(float));
m_temperature[WRITE] = new ComputeBuffer(SIZE, sizeof(float));
m_reaction = new ComputeBuffer[2];
m_reaction[READ] = new ComputeBuffer(SIZE, sizeof(float));
m_reaction[WRITE] = new ComputeBuffer(SIZE, sizeof(float));
m_phi = new ComputeBuffer[2];
m_phi[READ] = new ComputeBuffer(SIZE, sizeof(float));
m_phi[WRITE] = new ComputeBuffer(SIZE, sizeof(float));
m_velocity = new ComputeBuffer[2];
m_velocity[READ] = new ComputeBuffer(SIZE, sizeof(float)*3);
m_velocity[WRITE] = new ComputeBuffer(SIZE, sizeof(float)*3);
m_pressure = new ComputeBuffer[2];
m_pressure[READ] = new ComputeBuffer(SIZE, sizeof(float));
m_pressure[WRITE] = new ComputeBuffer(SIZE, sizeof(float));
m_obstacles = new ComputeBuffer(SIZE, sizeof(float));
m_temp3f = new ComputeBuffer(SIZE, sizeof(float)*3);
//Any areas that are obstacles need to be masked of in the obstacle buffer
//At the moment is only the border around the edge of the buffers to enforce non-slip boundary conditions
ComputeObstacles();
}
void Swap(ComputeBuffer[] buffer)
{
ComputeBuffer tmp = buffer[READ];
buffer[READ] = buffer[WRITE];
buffer[WRITE] = tmp;
}
void ComputeObstacles()
{
m_computeObstacles.SetVector("_Size", m_size);
m_computeObstacles.SetBuffer(0, "_Write", m_obstacles);
m_computeObstacles.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
}
void ApplyImpulse(float dt, float amount, ComputeBuffer[] buffer)
{
m_applyImpulse.SetVector("_Size", m_size);
m_applyImpulse.SetFloat("_Radius", m_inputRadius);
m_applyImpulse.SetFloat("_Amount", amount);
m_applyImpulse.SetFloat("_DeltaTime", dt);
m_applyImpulse.SetVector("_Pos", m_inputPos);
m_applyImpulse.SetBuffer(0, "_Read", buffer[READ]);
m_applyImpulse.SetBuffer(0, "_Write", buffer[WRITE]);
m_applyImpulse.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(buffer);
}
void ApplyExtinguishmentImpulse(float dt, float amount, ComputeBuffer[] buffer)
{
m_applyImpulse.SetVector("_Size", m_size);
m_applyImpulse.SetFloat("_Radius", m_inputRadius);
m_applyImpulse.SetFloat("_Amount", amount);
m_applyImpulse.SetFloat("_DeltaTime", dt);
m_applyImpulse.SetVector("_Pos", m_inputPos);
m_applyImpulse.SetFloat("_Extinguishment", m_reactionExtinguishment);
m_applyImpulse.SetBuffer(1, "_Read", buffer[READ]);
m_applyImpulse.SetBuffer(1, "_Write", buffer[WRITE]);
m_applyImpulse.SetBuffer(1, "_Reaction", m_reaction[READ]);
m_applyImpulse.Dispatch(1, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(buffer);
}
void ApplyBuoyancy(float dt)
{
m_applyBuoyancy.SetVector("_Size", m_size);
m_applyBuoyancy.SetVector("_Up", new Vector4(0,1,0,0));
m_applyBuoyancy.SetFloat("_Buoyancy", m_densityBuoyancy);
m_applyBuoyancy.SetFloat("_AmbientTemperature", m_ambientTemperature);
m_applyBuoyancy.SetFloat("_Weight", m_densityWeight);
m_applyBuoyancy.SetFloat("_DeltaTime", dt);
m_applyBuoyancy.SetBuffer(0, "_Write", m_velocity[WRITE]);
m_applyBuoyancy.SetBuffer(0, "_Velocity", m_velocity[READ]);
m_applyBuoyancy.SetBuffer(0, "_Density", m_density[READ]);
m_applyBuoyancy.SetBuffer(0, "_Temperature", m_temperature[READ]);
m_applyBuoyancy.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(m_velocity);
}
void ApplyAdvection(float dt, float dissipation, float decay, ComputeBuffer[] buffer, float forward = 1.0f)
{
m_applyAdvect.SetVector("_Size", m_size);
m_applyAdvect.SetFloat("_DeltaTime", dt);
m_applyAdvect.SetFloat("_Dissipate", dissipation);
m_applyAdvect.SetFloat("_Forward", forward);
m_applyAdvect.SetFloat("_Decay", decay);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Read1f", buffer[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Write1f", buffer[WRITE]);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Velocity", m_velocity[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Obstacles", m_obstacles);
m_applyAdvect.Dispatch((int)ADVECTION.NORMAL, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(buffer);
}
void ApplyAdvection(float dt, float dissipation, float decay, ComputeBuffer read, ComputeBuffer write, float forward = 1.0f)
{
m_applyAdvect.SetVector("_Size", m_size);
m_applyAdvect.SetFloat("_DeltaTime", dt);
m_applyAdvect.SetFloat("_Dissipate", dissipation);
m_applyAdvect.SetFloat("_Forward", forward);
m_applyAdvect.SetFloat("_Decay", decay);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Read1f", read);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Write1f", write);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Velocity", m_velocity[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Obstacles", m_obstacles);
m_applyAdvect.Dispatch((int)ADVECTION.NORMAL, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
}
void ApplyAdvectionBFECC(float dt, float dissipation, float decay, ComputeBuffer[] buffer)
{
m_applyAdvect.SetVector("_Size", m_size);
m_applyAdvect.SetFloat("_DeltaTime", dt);
m_applyAdvect.SetFloat("_Dissipate", dissipation);
m_applyAdvect.SetFloat("_Forward", 1.0f);
m_applyAdvect.SetFloat("_Decay", decay);
m_applyAdvect.SetBuffer((int)ADVECTION.BFECC, "_Read1f", buffer[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.BFECC, "_Write1f", buffer[WRITE]);
m_applyAdvect.SetBuffer((int)ADVECTION.BFECC, "_Phi_n_hat", m_phi[PHI_N_HAT]);
m_applyAdvect.SetBuffer((int)ADVECTION.BFECC, "_Velocity", m_velocity[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.BFECC, "_Obstacles", m_obstacles);
m_applyAdvect.Dispatch((int)ADVECTION.BFECC, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(buffer);
}
void ApplyAdvectionMacCormack(float dt, float dissipation, float decay, ComputeBuffer[] buffer)
{
m_applyAdvect.SetVector("_Size", m_size);
m_applyAdvect.SetFloat("_DeltaTime", dt);
m_applyAdvect.SetFloat("_Dissipate", dissipation);
m_applyAdvect.SetFloat("_Forward", 1.0f);
m_applyAdvect.SetFloat("_Decay", decay);
m_applyAdvect.SetBuffer((int)ADVECTION.MACCORMACK, "_Read1f", buffer[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.MACCORMACK, "_Write1f", buffer[WRITE]);
m_applyAdvect.SetBuffer((int)ADVECTION.MACCORMACK, "_Phi_n_1_hat", m_phi[PHI_N_1_HAT]);
m_applyAdvect.SetBuffer((int)ADVECTION.MACCORMACK, "_Phi_n_hat", m_phi[PHI_N_HAT]);
m_applyAdvect.SetBuffer((int)ADVECTION.MACCORMACK, "_Velocity", m_velocity[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.MACCORMACK, "_Obstacles", m_obstacles);
m_applyAdvect.Dispatch((int)ADVECTION.MACCORMACK, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(buffer);
}
void ApplyAdvectionVelocity(float dt)
{
m_applyAdvect.SetVector("_Size", m_size);
m_applyAdvect.SetFloat("_DeltaTime", dt);
m_applyAdvect.SetFloat("_Dissipate", m_velocityDissipation);
m_applyAdvect.SetFloat("_Forward", 1.0f);
m_applyAdvect.SetFloat("_Decay", 0.0f);
m_applyAdvect.SetBuffer(0, "_Read3f", m_velocity[READ]);
m_applyAdvect.SetBuffer(0, "_Write3f", m_velocity[WRITE]);
m_applyAdvect.SetBuffer(0, "_Velocity", m_velocity[READ]);
m_applyAdvect.SetBuffer(0, "_Obstacles", m_obstacles);
m_applyAdvect.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(m_velocity);
}
void ComputeVorticityConfinement(float dt)
{
m_computeVorticity.SetVector("_Size", m_size);
m_computeVorticity.SetBuffer(0, "_Write", m_temp3f);
m_computeVorticity.SetBuffer(0, "_Velocity", m_velocity[READ]);
m_computeVorticity.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
m_computeConfinement.SetVector("_Size", m_size);
m_computeConfinement.SetFloat("_DeltaTime", dt);
m_computeConfinement.SetFloat("_Epsilon", m_vorticityStrength);
m_computeConfinement.SetBuffer(0, "_Write", m_velocity[WRITE]);
m_computeConfinement.SetBuffer(0, "_Read", m_velocity[READ]);
m_computeConfinement.SetBuffer(0, "_Vorticity", m_temp3f);
m_computeConfinement.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(m_velocity);
}
void ComputeDivergence()
{
m_computeDivergence.SetVector("_Size", m_size);
m_computeDivergence.SetBuffer(0, "_Write", m_temp3f);
m_computeDivergence.SetBuffer(0, "_Velocity", m_velocity[READ]);
m_computeDivergence.SetBuffer(0, "_Obstacles", m_obstacles);
m_computeDivergence.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
}
void ComputePressure()
{
m_computeJacobi.SetVector("_Size", m_size);
m_computeJacobi.SetBuffer(0, "_Divergence", m_temp3f);
m_computeJacobi.SetBuffer(0, "_Obstacles", m_obstacles);
for(int i = 0; i < m_iterations; i++)
{
m_computeJacobi.SetBuffer(0, "_Write", m_pressure[WRITE]);
m_computeJacobi.SetBuffer(0, "_Pressure", m_pressure[READ]);
m_computeJacobi.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(m_pressure);
}
}
void ComputeProjection()
{
m_computeProjection.SetVector("_Size", m_size);
m_computeProjection.SetBuffer(0, "_Obstacles", m_obstacles);
m_computeProjection.SetBuffer(0, "_Pressure", m_pressure[READ]);
m_computeProjection.SetBuffer(0, "_Velocity", m_velocity[READ]);
m_computeProjection.SetBuffer(0, "_Write", m_velocity[WRITE]);
m_computeProjection.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(m_velocity);
}
void Update ()
{
float dt = TIME_STEP;
//First off advect any buffers that contain physical quantities like density or temperature by the
//velocity field. Advection is what moves values around.
ApplyAdvection(dt, m_temperatureDissipation, 0.0f, m_temperature);
//Normal advection can cause smoothing of the advected field making the results look less interesting.
//BFECC is a method of advection that helps to prevents this smoothing at a extra performance cost but is less numerically stable.
//MacCormack does the same as BFECC but is more (not completely) numerically stable and is more costly
//You only really need to do this type of advection on visible fields, but you can do it on non visible ones if you want
if(m_denstyAdvectionType == ADVECTION.BFECC)
{
ApplyAdvection(dt, 1.0f, 0.0f, m_density, 1.0f); //advect forward into write buffer
ApplyAdvection(dt, 1.0f, 0.0f, m_density[READ], m_phi[PHI_N_HAT], -1.0f); //advect back into phi_n_hat buffer
ApplyAdvectionBFECC(dt, m_densityDissipation, 0.0f, m_density); //advect using BFECC
}
else if(m_denstyAdvectionType == ADVECTION.MACCORMACK)
{
ApplyAdvection(dt, 1.0f, 0.0f, m_density[READ], m_phi[PHI_N_1_HAT], 1.0f); //advect forward into phi_n_1_hat buffer
ApplyAdvection(dt, 1.0f, 0.0f, m_phi[PHI_N_1_HAT], m_phi[PHI_N_HAT], -1.0f); //advect back into phi_n_hat buffer
ApplyAdvectionMacCormack(dt, m_densityDissipation, 0.0f, m_density);
}
else
{
ApplyAdvection(dt, m_densityDissipation, 0.0f, m_density);
}
//The reaction advection looks better using normal for shorter lived fire (ie a hight decay rate) and
//looks better with BFECC or macCormack for longer lived fire (in my opinion)
if(m_reactionAdvectionType == ADVECTION.BFECC)
{
ApplyAdvection(dt, 1.0f, 0.0f, m_reaction, 1.0f); //advect forward into write buffer
ApplyAdvection(dt, 1.0f, 0.0f, m_reaction[READ], m_phi[PHI_N_HAT], -1.0f); //advect back into phi_n_hat buffer
ApplyAdvectionBFECC(dt, 1.0f, m_reactionDecay, m_reaction); //advect using BFECC
}
else if(m_reactionAdvectionType == ADVECTION.MACCORMACK)
{
ApplyAdvection(dt, 1.0f, 0.0f, m_reaction[READ], m_phi[PHI_N_1_HAT], 1.0f); //advect forward into phi_n_1_hat buffer
ApplyAdvection(dt, 1.0f, 0.0f, m_phi[PHI_N_1_HAT], m_phi[PHI_N_HAT], -1.0f); //advect back into phi_n_hat buffer
ApplyAdvectionMacCormack(dt, 1.0f, m_reactionDecay, m_reaction);
}
else
{
ApplyAdvection(dt, 1.0f, m_reactionDecay, m_reaction);
}
//The velocity field also advects its self.
ApplyAdvectionVelocity(dt);
//Apply the effect the sinking colder smoke has on the velocity field
ApplyBuoyancy(dt);
//Adds a certain amount of reaction (fire) and temperate
ApplyImpulse(dt, m_reactionAmount, m_reaction);
ApplyImpulse(dt, m_temperatureAmount, m_temperature);
//The smoke is formed when the reaction is extinguished. When the reaction amount
//falls below the extinguishment factor smoke is added
ApplyExtinguishmentImpulse(dt, m_densityAmount, m_density);
//The fuild sim math tends to remove the swirling movement of fluids.
//This step will try and add it back in
ComputeVorticityConfinement(dt);
//Compute the divergence of the velocity field. In fluid simulation the
//fluid is modelled as being incompressible meaning that the volume of the fluid
//does not change over time. The divergence is the amount the field has deviated from being divergence free
ComputeDivergence();
//This computes the pressure need return the fluid to a divergence free condition
ComputePressure();
//Subtract the pressure field from the velocity field enforcing the divergence free conditions
ComputeProjection();
//rotation of box not support because ray cast in shader uses a AABB intersection
transform.rotation = Quaternion.identity;
GetComponent<Renderer>().material.SetVector("_Translate", transform.localPosition);
GetComponent<Renderer>().material.SetVector("_Scale", transform.localScale);
GetComponent<Renderer>().material.SetBuffer("_Density", m_density[READ]);
GetComponent<Renderer>().material.SetBuffer("_Reaction", m_reaction[READ]);
GetComponent<Renderer>().material.SetVector("_Size", m_size);
}
void OnDestroy()
{
m_density[READ].Release();
m_density[WRITE].Release();
m_temperature[READ].Release();
m_temperature[WRITE].Release();
m_reaction[READ].Release();
m_reaction[WRITE].Release();
m_phi[PHI_N_1_HAT].Release();
m_phi[PHI_N_HAT].Release();
m_velocity[READ].Release();
m_velocity[WRITE].Release();
m_pressure[READ].Release();
m_pressure[WRITE].Release();
m_obstacles.Release();
m_temp3f.Release();
}
}
}

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 164869986c15313419bf6ec021c90430
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:

@ -0,0 +1,436 @@
using UnityEngine;
using System.Collections;
namespace FluidSim3DProject
{
public class SmokeFluidSim : MonoBehaviour
{
//DONT CHANGE THESE
const int READ = 0;
const int WRITE = 1;
const int PHI_N_HAT = 0;
const int PHI_N_1_HAT = 1;
public enum ADVECTION { NORMAL = 1, BFECC = 2, MACCORMACK = 3 };
//You can change this but you must change the same value in all the compute shader's to the same
//Must be a pow2 number
const int NUM_THREADS = 8;
//You can change this or even use Time.DeltaTime but large time steps can cause numerical errors
const float TIME_STEP = 0.1f;
public ADVECTION m_advectionType = ADVECTION.NORMAL;
public int m_width = 128;
public int m_height = 128;
public int m_depth = 128;
public int m_iterations = 10;
public float m_vorticityStrength = 1.0f;
public float m_densityAmount = 1.0f;
public float m_densityDissipation = 0.999f;
public float m_densityBuoyancy = 1.0f;
public float m_densityWeight = 0.0125f;
public float m_temperatureAmount = 10.0f;
public float m_temperatureDissipation = 0.995f;
public float m_velocityDissipation = 0.995f;
public float m_inputRadius = 0.04f;
public Vector4 m_inputPos = new Vector4(0.5f,0.1f,0.5f,0.0f);
float m_ambientTemperature = 0.0f;
public ComputeShader m_applyImpulse, m_applyAdvect, m_computeVorticity;
public ComputeShader m_computeDivergence, m_computeJacobi, m_computeProjection;
public ComputeShader m_computeConfinement, m_computeObstacles, m_applyBuoyancy;
Vector4 m_size;
ComputeBuffer[] m_density, m_velocity, m_pressure, m_temperature, m_phi;
ComputeBuffer m_temp3f, m_obstacles;
// Ultracombos -------------------------------------------
[Header("Ultracombos Custom")]
public bool doUpdate = true;
public bool doDraw = true;
public float timeStepMultiplier = 5.0f;
public ComputeBuffer DensityBuffer { get { return m_density[READ]; } }
public ComputeBuffer VelocityBuffer { get { return m_velocity[READ]; } }
public ComputeBuffer TemperatureBuffer { get { return m_temperature[READ]; } }
public ComputeBuffer ObstacleBuffer { get { return m_obstacles; } }
public Vector4 GridSize { get { return transform.lossyScale; } }
public Vector4 GridRoot { get { return transform.position - transform.lossyScale * 0.5f; } }
public Vector4 GridDim { get { return m_size; } }
// Ultracombos -------------------------------------------
void Start ()
{
//Dimension sizes must be pow2 numbers
m_width = Mathf.ClosestPowerOfTwo(m_width);
m_height = Mathf.ClosestPowerOfTwo(m_height);
m_depth = Mathf.ClosestPowerOfTwo(m_depth);
//Put all dimension sizes in a vector for easy parsing to shader and also prevents user changing
//dimension sizes during play
m_size = new Vector4(m_width, m_height, m_depth, 0.0f);
//Create all the buffers needed
int SIZE = m_width*m_height*m_depth;
m_density = new ComputeBuffer[2];
m_density[READ] = new ComputeBuffer(SIZE, sizeof(float));
m_density[WRITE] = new ComputeBuffer(SIZE, sizeof(float));
m_temperature = new ComputeBuffer[2];
m_temperature[READ] = new ComputeBuffer(SIZE, sizeof(float));
m_temperature[WRITE] = new ComputeBuffer(SIZE, sizeof(float));
m_phi = new ComputeBuffer[2];
m_phi[READ] = new ComputeBuffer(SIZE, sizeof(float));
m_phi[WRITE] = new ComputeBuffer(SIZE, sizeof(float));
m_velocity = new ComputeBuffer[2];
m_velocity[READ] = new ComputeBuffer(SIZE, sizeof(float)*3);
m_velocity[WRITE] = new ComputeBuffer(SIZE, sizeof(float)*3);
m_pressure = new ComputeBuffer[2];
m_pressure[READ] = new ComputeBuffer(SIZE, sizeof(float));
m_pressure[WRITE] = new ComputeBuffer(SIZE, sizeof(float));
m_obstacles = new ComputeBuffer(SIZE, sizeof(float));
m_temp3f = new ComputeBuffer(SIZE, sizeof(float)*3);
//Any areas that are obstacles need to be masked of in the obstacle buffer
//At the moment is only the border around the edge of the buffers to enforce non-slip boundary conditions
ComputeObstacles();
}
void Swap(ComputeBuffer[] buffer)
{
ComputeBuffer tmp = buffer[READ];
buffer[READ] = buffer[WRITE];
buffer[WRITE] = tmp;
}
void ComputeObstacles()
{
m_computeObstacles.SetVector("_Size", m_size);
m_computeObstacles.SetBuffer(0, "_Write", m_obstacles);
m_computeObstacles.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
}
void ApplyImpulse(float dt, float amount, ComputeBuffer[] buffer)
{
m_applyImpulse.SetVector("_Size", m_size);
m_applyImpulse.SetFloat("_Radius", m_inputRadius);
m_applyImpulse.SetFloat("_Amount", amount);
m_applyImpulse.SetFloat("_DeltaTime", dt);
m_applyImpulse.SetVector("_Pos", m_inputPos);
m_applyImpulse.SetBuffer(0, "_Read", buffer[READ]);
m_applyImpulse.SetBuffer(0, "_Write", buffer[WRITE]);
m_applyImpulse.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(buffer);
}
void ApplyBuoyancy(float dt)
{
m_applyBuoyancy.SetVector("_Size", m_size);
m_applyBuoyancy.SetVector("_Up", new Vector4(0,1,0,0));
m_applyBuoyancy.SetFloat("_Buoyancy", m_densityBuoyancy);
m_applyBuoyancy.SetFloat("_AmbientTemperature", m_ambientTemperature);
m_applyBuoyancy.SetFloat("_Weight", m_densityWeight);
m_applyBuoyancy.SetFloat("_DeltaTime", dt);
m_applyBuoyancy.SetBuffer(0, "_Write", m_velocity[WRITE]);
m_applyBuoyancy.SetBuffer(0, "_Velocity", m_velocity[READ]);
m_applyBuoyancy.SetBuffer(0, "_Density", m_density[READ]);
m_applyBuoyancy.SetBuffer(0, "_Temperature", m_temperature[READ]);
m_applyBuoyancy.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(m_velocity);
}
void ApplyAdvection(float dt, float dissipation, float decay, ComputeBuffer[] buffer, float forward = 1.0f)
{
m_applyAdvect.SetVector("_Size", m_size);
m_applyAdvect.SetFloat("_DeltaTime", dt);
m_applyAdvect.SetFloat("_Dissipate", dissipation);
m_applyAdvect.SetFloat("_Forward", forward);
m_applyAdvect.SetFloat("_Decay", decay);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Read1f", buffer[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Write1f", buffer[WRITE]);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Velocity", m_velocity[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Obstacles", m_obstacles);
m_applyAdvect.Dispatch((int)ADVECTION.NORMAL, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(buffer);
}
void ApplyAdvection(float dt, float dissipation, float decay, ComputeBuffer read, ComputeBuffer write, float forward = 1.0f)
{
m_applyAdvect.SetVector("_Size", m_size);
m_applyAdvect.SetFloat("_DeltaTime", dt);
m_applyAdvect.SetFloat("_Dissipate", dissipation);
m_applyAdvect.SetFloat("_Forward", forward);
m_applyAdvect.SetFloat("_Decay", decay);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Read1f", read);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Write1f", write);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Velocity", m_velocity[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.NORMAL, "_Obstacles", m_obstacles);
m_applyAdvect.Dispatch((int)ADVECTION.NORMAL, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
}
void ApplyAdvectionBFECC(float dt, float dissipation, float decay, ComputeBuffer[] buffer)
{
m_applyAdvect.SetVector("_Size", m_size);
m_applyAdvect.SetFloat("_DeltaTime", dt);
m_applyAdvect.SetFloat("_Dissipate", dissipation);
m_applyAdvect.SetFloat("_Forward", 1.0f);
m_applyAdvect.SetFloat("_Decay", decay);
m_applyAdvect.SetBuffer((int)ADVECTION.BFECC, "_Read1f", buffer[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.BFECC, "_Write1f", buffer[WRITE]);
m_applyAdvect.SetBuffer((int)ADVECTION.BFECC, "_Phi_n_hat", m_phi[PHI_N_HAT]);
m_applyAdvect.SetBuffer((int)ADVECTION.BFECC, "_Velocity", m_velocity[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.BFECC, "_Obstacles", m_obstacles);
m_applyAdvect.Dispatch((int)ADVECTION.BFECC, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(buffer);
}
void ApplyAdvectionMacCormack(float dt, float dissipation, float decay, ComputeBuffer[] buffer)
{
m_applyAdvect.SetVector("_Size", m_size);
m_applyAdvect.SetFloat("_DeltaTime", dt);
m_applyAdvect.SetFloat("_Dissipate", dissipation);
m_applyAdvect.SetFloat("_Forward", 1.0f);
m_applyAdvect.SetFloat("_Decay", decay);
m_applyAdvect.SetBuffer((int)ADVECTION.MACCORMACK, "_Read1f", buffer[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.MACCORMACK, "_Write1f", buffer[WRITE]);
m_applyAdvect.SetBuffer((int)ADVECTION.MACCORMACK, "_Phi_n_1_hat", m_phi[PHI_N_1_HAT]);
m_applyAdvect.SetBuffer((int)ADVECTION.MACCORMACK, "_Phi_n_hat", m_phi[PHI_N_HAT]);
m_applyAdvect.SetBuffer((int)ADVECTION.MACCORMACK, "_Velocity", m_velocity[READ]);
m_applyAdvect.SetBuffer((int)ADVECTION.MACCORMACK, "_Obstacles", m_obstacles);
m_applyAdvect.Dispatch((int)ADVECTION.MACCORMACK, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(buffer);
}
void ApplyAdvectionVelocity(float dt)
{
m_applyAdvect.SetVector("_Size", m_size);
m_applyAdvect.SetFloat("_DeltaTime", dt);
m_applyAdvect.SetFloat("_Dissipate", m_velocityDissipation);
m_applyAdvect.SetFloat("_Forward", 1.0f);
m_applyAdvect.SetFloat("_Decay", 0.0f);
m_applyAdvect.SetBuffer(0, "_Read3f", m_velocity[READ]);
m_applyAdvect.SetBuffer(0, "_Write3f", m_velocity[WRITE]);
m_applyAdvect.SetBuffer(0, "_Velocity", m_velocity[READ]);
m_applyAdvect.SetBuffer(0, "_Obstacles", m_obstacles);
m_applyAdvect.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(m_velocity);
}
void ComputeVorticityConfinement(float dt)
{
m_computeVorticity.SetVector("_Size", m_size);
m_computeVorticity.SetBuffer(0, "_Write", m_temp3f);
m_computeVorticity.SetBuffer(0, "_Velocity", m_velocity[READ]);
m_computeVorticity.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
m_computeConfinement.SetVector("_Size", m_size);
m_computeConfinement.SetFloat("_DeltaTime", dt);
m_computeConfinement.SetFloat("_Epsilon", m_vorticityStrength);
m_computeConfinement.SetBuffer(0, "_Write", m_velocity[WRITE]);
m_computeConfinement.SetBuffer(0, "_Read", m_velocity[READ]);
m_computeConfinement.SetBuffer(0, "_Vorticity", m_temp3f);
m_computeConfinement.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(m_velocity);
}
void ComputeDivergence()
{
m_computeDivergence.SetVector("_Size", m_size);
m_computeDivergence.SetBuffer(0, "_Write", m_temp3f);
m_computeDivergence.SetBuffer(0, "_Velocity", m_velocity[READ]);
m_computeDivergence.SetBuffer(0, "_Obstacles", m_obstacles);
m_computeDivergence.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
}
void ComputePressure()
{
m_computeJacobi.SetVector("_Size", m_size);
m_computeJacobi.SetBuffer(0, "_Divergence", m_temp3f);
m_computeJacobi.SetBuffer(0, "_Obstacles", m_obstacles);
for(int i = 0; i < m_iterations; i++)
{
m_computeJacobi.SetBuffer(0, "_Write", m_pressure[WRITE]);
m_computeJacobi.SetBuffer(0, "_Pressure", m_pressure[READ]);
m_computeJacobi.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(m_pressure);
}
}
void ComputeProjection()
{
m_computeProjection.SetVector("_Size", m_size);
m_computeProjection.SetBuffer(0, "_Obstacles", m_obstacles);
m_computeProjection.SetBuffer(0, "_Pressure", m_pressure[READ]);
m_computeProjection.SetBuffer(0, "_Velocity", m_velocity[READ]);
m_computeProjection.SetBuffer(0, "_Write", m_velocity[WRITE]);
m_computeProjection.Dispatch(0, (int)m_size.x/NUM_THREADS, (int)m_size.y/NUM_THREADS, (int)m_size.z/NUM_THREADS);
Swap(m_velocity);
}
private void FixedUpdate()
//void Update ()
{
GetComponent<MeshRenderer>().enabled = doDraw;
if (doUpdate == false)
return;
float dt = Time.fixedDeltaTime * timeStepMultiplier;
//float dt = TIME_STEP;
Simulation(dt);
}
void OnDestroy()
{
m_density[READ].Release();
m_density[WRITE].Release();
m_temperature[READ].Release();
m_temperature[WRITE].Release();
m_phi[PHI_N_1_HAT].Release();
m_phi[PHI_N_HAT].Release();
m_velocity[READ].Release();
m_velocity[WRITE].Release();
m_pressure[READ].Release();
m_pressure[WRITE].Release();
m_obstacles.Release();
m_temp3f.Release();
}
void Simulation(float dt)
{
//First off advect any buffers that contain physical quantities like density or temperature by the
//velocity field. Advection is what moves values around.
ApplyAdvection(dt, m_temperatureDissipation, 0.0f, m_temperature);
//Normal advection can cause smoothing of the advected field making the results look less interesting.
//BFECC is a method of advection that helps to prevents this smoothing at a extra performance cost but is less numerically stable.
//MacCormack does the same as BFECC but is more (not completely) numerically stable and is more costly
if (m_advectionType == ADVECTION.BFECC)
{
ApplyAdvection(dt, 1.0f, 0.0f, m_density, 1.0f); //advect forward into write buffer
ApplyAdvection(dt, 1.0f, 0.0f, m_density[READ], m_phi[PHI_N_HAT], -1.0f); //advect back into phi_n_hat buffer
ApplyAdvectionBFECC(dt, m_densityDissipation, 0.0f, m_density); //advect using BFECC
}
else if (m_advectionType == ADVECTION.MACCORMACK)
{
ApplyAdvection(dt, 1.0f, 0.0f, m_density[READ], m_phi[PHI_N_1_HAT], 1.0f); //advect forward into phi_n_1_hat buffer
ApplyAdvection(dt, 1.0f, 0.0f, m_phi[PHI_N_1_HAT], m_phi[PHI_N_HAT], -1.0f); //advect back into phi_n_hat buffer
ApplyAdvectionMacCormack(dt, m_densityDissipation, 0.0f, m_density);
}
else
{
ApplyAdvection(dt, m_densityDissipation, 0.0f, m_density);
}
//The velocity field also advects its self.
ApplyAdvectionVelocity(dt);
//Apply the effect the sinking colder smoke has on the velocity field
ApplyBuoyancy(dt);
//Adds a certain amount of density (the visible smoke) and temperate
ApplyImpulse(dt, m_densityAmount, m_density);
ApplyImpulse(dt, m_temperatureAmount, m_temperature);
//The fuild sim math tends to remove the swirling movement of fluids.
//This step will try and add it back in
ComputeVorticityConfinement(dt);
//Compute the divergence of the velocity field. In fluid simulation the
//fluid is modelled as being incompressible meaning that the volume of the fluid
//does not change over time. The divergence is the amount the field has deviated from being divergence free
ComputeDivergence();
//This computes the pressure need return the fluid to a divergence free condition
ComputePressure();
//Subtract the pressure field from the velocity field enforcing the divergence free conditions
ComputeProjection();
//rotation of box not support because ray cast in shader uses a AABB intersection
transform.rotation = Quaternion.identity;
GetComponent<Renderer>().material.SetVector("_Translate", transform.localPosition);
GetComponent<Renderer>().material.SetVector("_Scale", transform.localScale);
GetComponent<Renderer>().material.SetBuffer("_Density", m_density[READ]);
GetComponent<Renderer>().material.SetVector("_Size", m_size);
}
}
}

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a924471615937564f81ebb1540cd8b36
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:

@ -0,0 +1,5 @@
fileFormatVersion: 2
guid: 8fe3db169bedce248a2ab634d707f41c
folderAsset: yes
DefaultImporter:
userData:

@ -0,0 +1,244 @@
#define NUM_THREADS 8
float4 _Size;
float _DeltaTime, _Dissipate, _Decay, _Forward;
StructuredBuffer<float3> _Velocity;
StructuredBuffer<float> _Obstacles;
RWStructuredBuffer<float> _Write1f;
StructuredBuffer<float> _Read1f;
RWStructuredBuffer<float3> _Write3f;
StructuredBuffer<float3> _Read3f;
StructuredBuffer<float> _Phi_n_1_hat, _Phi_n_hat;
float3 GetAdvectedPosTexCoords(float3 pos, int idx)
{
pos -= _DeltaTime * _Forward * _Velocity[idx];
return pos;
}
float SampleBilinear(StructuredBuffer<float> buffer, float3 uv, float3 size)
{
int x = uv.x;
int y = uv.y;
int z = uv.z;
int X = size.x;
int XY = size.x*size.y;
float fx = uv.x-x;
float fy = uv.y-y;
float fz = uv.z-z;
int xp1 = min(size.x-1, x+1);
int yp1 = min(size.y-1, y+1);
int zp1 = min(size.z-1, z+1);
float x0 = buffer[x+y*X+z*XY] * (1.0f-fx) + buffer[xp1+y*X+z*XY] * fx;
float x1 = buffer[x+y*X+zp1*XY] * (1.0f-fx) + buffer[xp1+y*X+zp1*XY] * fx;
float x2 = buffer[x+yp1*X+z*XY] * (1.0f-fx) + buffer[xp1+yp1*X+z*XY] * fx;
float x3 = buffer[x+yp1*X+zp1*XY] * (1.0f-fx) + buffer[xp1+yp1*X+zp1*XY] * fx;
float z0 = x0 * (1.0f-fz) + x1 * fz;
float z1 = x2 * (1.0f-fz) + x3 * fz;
return z0 * (1.0f-fy) + z1 * fy;
}
float3 SampleBilinear(StructuredBuffer<float3> buffer, float3 uv, float3 size)
{
int x = uv.x;
int y = uv.y;
int z = uv.z;
int X = size.x;
int XY = size.x*size.y;
float fx = uv.x-x;
float fy = uv.y-y;
float fz = uv.z-z;
int xp1 = min(size.x-1, x+1);
int yp1 = min(size.y-1, y+1);
int zp1 = min(size.z-1, z+1);
float3 x0 = buffer[x+y*X+z*XY] * (1.0f-fx) + buffer[xp1+y*X+z*XY] * fx;
float3 x1 = buffer[x+y*X+zp1*XY] * (1.0f-fx) + buffer[xp1+y*X+zp1*XY] * fx;
float3 x2 = buffer[x+yp1*X+z*XY] * (1.0f-fx) + buffer[xp1+yp1*X+z*XY] * fx;
float3 x3 = buffer[x+yp1*X+zp1*XY] * (1.0f-fx) + buffer[xp1+yp1*X+zp1*XY] * fx;
float3 z0 = x0 * (1.0f-fz) + x1 * fz;
float3 z1 = x2 * (1.0f-fz) + x3 * fz;
return z0 * (1.0f-fy) + z1 * fy;
}
#pragma kernel AdvectVelocity
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
void AdvectVelocity(uint3 id : SV_DispatchThreadID)
{
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
if(_Obstacles[idx] > 0.1)
{
_Write3f[idx] = float3(0,0,0);
return;
}
float3 uv = GetAdvectedPosTexCoords(id, idx);
_Write3f[idx] = SampleBilinear(_Read3f, uv, _Size.xyz) * _Dissipate;
}
#pragma kernel Advect
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
void Advect(uint3 id : SV_DispatchThreadID)
{
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
if(_Obstacles[idx] > 0.1)
{
_Write1f[idx] = 0;
return;
}
float3 uv = GetAdvectedPosTexCoords(id, idx);
_Write1f[idx] = max(0, SampleBilinear(_Read1f, uv, _Size.xyz) * _Dissipate - _Decay);
}
#pragma kernel AdvectBFECC
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
void AdvectBFECC(uint3 id : SV_DispatchThreadID)
{
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
if(_Obstacles[idx] > 0.1)
{
_Write1f[idx] = 0;
return;
}
float3 uv = GetAdvectedPosTexCoords(id, idx);
float r;
float4 halfVolumeDim = _Size/2;
float3 diff = abs( halfVolumeDim.xyz - id );
// Must use regular semi-Lagrangian advection instead of BFECC at the volume boundaries
if( (diff.x > (halfVolumeDim.x-4)) || (diff.y > (halfVolumeDim.y-4)) || (diff.z > (halfVolumeDim.z-4)) )
{
r = SampleBilinear(_Read1f, uv, _Size.xyz);
}
else
{
r = 1.5f * SampleBilinear(_Read1f, uv, _Size.xyz) - 0.5f * SampleBilinear(_Phi_n_hat, uv, _Size.xyz);
}
_Write1f[idx] = max(0, r * _Dissipate - _Decay);
}
#pragma kernel AdvectMacCormack
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
void AdvectMacCormack(uint3 id : SV_DispatchThreadID)
{
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
if(_Obstacles[idx] > 0.1)
{
_Write1f[idx] = 0;
return;
}
float3 uv = GetAdvectedPosTexCoords(id, idx);
float r;
float4 halfVolumeDim = _Size/2;
float3 diff = abs( halfVolumeDim.xyz - id );
// Must use regular semi-Lagrangian advection instead of MacCormack at the volume boundaries
if( (diff.x > (halfVolumeDim.x-4)) || (diff.y > (halfVolumeDim.y-4)) || (diff.z > (halfVolumeDim.z-4)) )
{
r = SampleBilinear(_Read1f, uv, _Size.xyz);
}
else
{
int idx0 = (id.x-1) + (id.y-1)*_Size.x + (id.z-1)*_Size.x*_Size.y;
int idx1 = (id.x-1) + (id.y-1)*_Size.x + (id.z+1)*_Size.x*_Size.y;
int idx2 = (id.x-1) + (id.y+1)*_Size.x + (id.z-1)*_Size.x*_Size.y;
int idx3 = (id.x-1) + (id.y+1)*_Size.x + (id.z+1)*_Size.x*_Size.y;
int idx4 = (id.x+1) + (id.y-1)*_Size.x + (id.z-1)*_Size.x*_Size.y;
int idx5 = (id.x+1) + (id.y-1)*_Size.x + (id.z+1)*_Size.x*_Size.y;
int idx6 = (id.x+1) + (id.y+1)*_Size.x + (id.z-1)*_Size.x*_Size.y;
int idx7 = (id.x+1) + (id.y+1)*_Size.x + (id.z+1)*_Size.x*_Size.y;
float nodes[8];
nodes[0] = _Read1f[ idx0 ];
nodes[1] = _Read1f[ idx1 ];
nodes[2] = _Read1f[ idx2 ];
nodes[3] = _Read1f[ idx3 ];
nodes[4] = _Read1f[ idx4 ];
nodes[5] = _Read1f[ idx5 ];
nodes[6] = _Read1f[ idx6 ];
nodes[7] = _Read1f[ idx7 ];
float minPhi = min(min(min(min(min(min(min(nodes[0],nodes[1]),nodes[2]),nodes[3]),nodes[4]),nodes[5]),nodes[6]),nodes[7]);
float maxPhi = max(max(max(max(max(max(max(nodes[0],nodes[1]),nodes[2]),nodes[3]),nodes[4]),nodes[5]),nodes[6]),nodes[7]);
r = SampleBilinear(_Phi_n_1_hat, uv, _Size.xyz) + 0.5f * (_Read1f[idx] - _Phi_n_hat[idx]);
r = max(min(r, maxPhi), minPhi);
}
_Write1f[idx] = max(0, r * _Dissipate - _Decay);
}

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: 411cedf0db0a1904693c77b97afbf915
ComputeShaderImporter:
userData:

@ -0,0 +1,47 @@
#pragma kernel CSMain
#define NUM_THREADS 8
float4 _Size, _Up;
float _AmbientTemperature, _DeltaTime, _Buoyancy, _Weight;
RWStructuredBuffer<float3> _Write;
StructuredBuffer<float3> _Velocity;
StructuredBuffer<float> _Density, _Temperature;
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
void CSMain (int3 id : SV_DispatchThreadID)
{
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
float T = _Temperature[idx];
float D = _Density[idx];
float3 V = _Velocity[idx];
if(T > _AmbientTemperature)
V += (_DeltaTime * (T - _AmbientTemperature) * _Buoyancy - D * _Weight) * _Up.xyz;
_Write[idx] = V;
}

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: 0d7710a16db583e418df13bddb0be43d
ComputeShaderImporter:
userData:

@ -0,0 +1,58 @@
#define NUM_THREADS 8
float _Radius, _Amount, _DeltaTime, _Extinguishment;
float4 _Pos, _Size;
RWStructuredBuffer<float> _Write;
StructuredBuffer<float> _Read, _Reaction;
#pragma kernel GaussImpulse
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
void GaussImpulse(uint3 id : SV_DispatchThreadID)
{
float3 pos = id/(_Size.xyz-1.0f) - _Pos.xyz;
pos.y /= 2.0f;
float mag = pos.x*pos.x + pos.y*pos.y + pos.z*pos.z;
float rad2 = _Radius*_Radius;
float amount = exp(-mag/rad2) * _Amount * _DeltaTime;
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
_Write[idx] = _Read[idx] + amount;
}
#pragma kernel ExtinguishmentImpluse
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
void ExtinguishmentImpluse(uint3 id : SV_DispatchThreadID)
{
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
float amount = 0.0;
float reaction = _Reaction[idx];
if(reaction > 0.0 && reaction < _Extinguishment)
amount = _Amount * reaction;
_Write[idx] = _Read[idx] + amount;
}

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: a080c25e6daeb0d4e88fced65f9959ce
ComputeShaderImporter:
userData:

@ -0,0 +1,44 @@
#pragma kernel CSMain
#define NUM_THREADS 8
float _DeltaTime, _Epsilon;
float4 _Size;
RWStructuredBuffer<float3> _Write;
StructuredBuffer<float3> _Vorticity, _Read;
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
void CSMain (int3 id : SV_DispatchThreadID)
{
int idxL = max(0, id.x-1) + id.y*_Size.x + id.z*_Size.x*_Size.y;
int idxR = min(_Size.x-1, id.x+1) + id.y*_Size.x + id.z*_Size.x*_Size.y;
int idxB = id.x + max(0, id.y-1)*_Size.x + id.z*_Size.x*_Size.y;
int idxT = id.x + min(_Size.y-1, id.y+1)*_Size.x + id.z*_Size.x*_Size.y;
int idxD = id.x + id.y*_Size.x + max(0, id.z-1)*_Size.x*_Size.y;
int idxU = id.x + id.y*_Size.x + min(_Size.z-1, id.z+1)*_Size.x*_Size.y;
float omegaL = length(_Vorticity[ idxL ]);
float omegaR = length(_Vorticity[ idxR ]);
float omegaB = length(_Vorticity[ idxB ]);
float omegaT = length(_Vorticity[ idxT ]);
float omegaD = length(_Vorticity[ idxD ]);
float omegaU = length(_Vorticity[ idxU ]);
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
float3 omega = _Vorticity[idx];
float3 eta = 0.5 * float3( omegaR - omegaL, omegaT - omegaB, omegaU - omegaD );
eta = normalize( eta + float3(0.001,0.001,0.001) );
float3 force = _DeltaTime * _Epsilon * float3( eta.y * omega.z - eta.z * omega.y, eta.z * omega.x - eta.x * omega.z, eta.x * omega.y - eta.y * omega.x );
_Write[idx] = _Read[idx] + force;
}

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: 4b0055f0edf774c4ea97ac8cd62e6158
ComputeShaderImporter:
userData:

@ -0,0 +1,49 @@
#pragma kernel CSMain
#define NUM_THREADS 8
float4 _Size;
RWStructuredBuffer<float3> _Write;
StructuredBuffer<float3> _Velocity;
StructuredBuffer<float> _Obstacles;
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
void CSMain (int3 id : SV_DispatchThreadID)
{
int idxL = max(0, id.x-1) + id.y*_Size.x + id.z*_Size.x*_Size.y;
int idxR = min(_Size.x-1, id.x+1) + id.y*_Size.x + id.z*_Size.x*_Size.y;
int idxB = id.x + max(0, id.y-1)*_Size.x + id.z*_Size.x*_Size.y;
int idxT = id.x + min(_Size.y-1, id.y+1)*_Size.x + id.z*_Size.x*_Size.y;
int idxD = id.x + id.y*_Size.x + max(0, id.z-1)*_Size.x*_Size.y;
int idxU = id.x + id.y*_Size.x + min(_Size.z-1, id.z+1)*_Size.x*_Size.y;
float3 L = _Velocity[ idxL ];
float3 R = _Velocity[ idxR ];
float3 B = _Velocity[ idxB ];
float3 T = _Velocity[ idxT ];
float3 D = _Velocity[ idxD ];
float3 U = _Velocity[ idxU ];
float3 obstacleVelocity = float3(0,0,0);
if(_Obstacles[idxL] > 0.1) L = obstacleVelocity;
if(_Obstacles[idxR] > 0.1) R = obstacleVelocity;
if(_Obstacles[idxB] > 0.1) B = obstacleVelocity;
if(_Obstacles[idxT] > 0.1) T = obstacleVelocity;
if(_Obstacles[idxD] > 0.1) D = obstacleVelocity;
if(_Obstacles[idxU] > 0.1) U = obstacleVelocity;
float divergence = 0.5 * ( ( R.x - L.x ) + ( T.y - B.y ) + ( U.z - D.z ) );
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
_Write[idx] = float3(divergence,0,0);
}

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: e25212f321912c44ab6d9430762d37b6
ComputeShaderImporter:
userData:

@ -0,0 +1,65 @@
#pragma kernel CSMain
#define NUM_THREADS 8
float4 _Size;
RWStructuredBuffer<float> _Write;
StructuredBuffer<float> _Pressure, _Obstacles;
StructuredBuffer<float3> _Divergence;
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
void CSMain (int3 id : SV_DispatchThreadID)
{
int idxL = max(0, id.x-1) + id.y*_Size.x + id.z*_Size.x*_Size.y;
int idxR = min(_Size.x-1, id.x+1) + id.y*_Size.x + id.z*_Size.x*_Size.y;
int idxB = id.x + max(0, id.y-1)*_Size.x + id.z*_Size.x*_Size.y;
int idxT = id.x + min(_Size.y-1, id.y+1)*_Size.x + id.z*_Size.x*_Size.y;
int idxD = id.x + id.y*_Size.x + max(0, id.z-1)*_Size.x*_Size.y;
int idxU = id.x + id.y*_Size.x + min(_Size.z-1, id.z+1)*_Size.x*_Size.y;
float L = _Pressure[ idxL ];
float R = _Pressure[ idxR ];
float B = _Pressure[ idxB ];
float T = _Pressure[ idxT ];
float D = _Pressure[ idxD ];
float U = _Pressure[ idxU ];
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
float C = _Pressure[idx];
float divergence = _Divergence[idx].r;
if(_Obstacles[idxL] > 0.1) L = C;
if(_Obstacles[idxR] > 0.1) R = C;
if(_Obstacles[idxB] > 0.1) B = C;
if(_Obstacles[idxT] > 0.1) T = C;
if(_Obstacles[idxD] > 0.1) D = C;
if(_Obstacles[idxU] > 0.1) U = C;
_Write[idx] = ( L + R + B + T + U + D - divergence ) / 6.0;
}

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: cebd12b982d79674aab2ed65879e49d0
ComputeShaderImporter:
userData:

@ -0,0 +1,47 @@
#pragma kernel CSMain
#define NUM_THREADS 8
float4 _Size;
RWStructuredBuffer<float> _Write;
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
void CSMain (int3 id : SV_DispatchThreadID)
{
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
float obstacle = 0;
if(id.x-1 < 0) obstacle = 1;
if(id.x+1 > (int)_Size.x-1) obstacle = 1;
if(id.y-1 < 0) obstacle = 1;
if(id.y+1 > (int)_Size.y-1) obstacle = 1;
if(id.z-1 < 0) obstacle = 1;
if(id.z+1 > (int)_Size.z-1) obstacle = 1;
_Write[idx] = obstacle;
}

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: 6a49b38e37bae7a4ab2903fbdde8e4ac
ComputeShaderImporter:
userData:

@ -0,0 +1,76 @@
#pragma kernel CSMain
#define NUM_THREADS 8
float4 _Size;
RWStructuredBuffer<float3> _Write;
StructuredBuffer<float> _Pressure, _Obstacles;
StructuredBuffer<float3> _Velocity;
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
void CSMain (int3 id : SV_DispatchThreadID)
{
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
if(_Obstacles[idx] > 0.1)
{
_Write[idx] = float3(0,0,0);
return;
}
int idxL = max(0, id.x-1) + id.y*_Size.x + id.z*_Size.x*_Size.y;
int idxR = min(_Size.x-1, id.x+1) + id.y*_Size.x + id.z*_Size.x*_Size.y;
int idxB = id.x + max(0, id.y-1)*_Size.x + id.z*_Size.x*_Size.y;
int idxT = id.x + min(_Size.y-1, id.y+1)*_Size.x + id.z*_Size.x*_Size.y;
int idxD = id.x + id.y*_Size.x + max(0, id.z-1)*_Size.x*_Size.y;
int idxU = id.x + id.y*_Size.x + min(_Size.z-1, id.z+1)*_Size.x*_Size.y;
float L = _Pressure[ idxL ];
float R = _Pressure[ idxR ];
float B = _Pressure[ idxB ];
float T = _Pressure[ idxT ];
float D = _Pressure[ idxD ];
float U = _Pressure[ idxU ];
float C = _Pressure[idx];
float3 mask = float3(1,1,1);
if(_Obstacles[idxL] > 0.1) { L = C; mask.x = 0; }
if(_Obstacles[idxR] > 0.1) { R = C; mask.x = 0; }
if(_Obstacles[idxB] > 0.1) { B = C; mask.y = 0; }
if(_Obstacles[idxT] > 0.1) { T = C; mask.y = 0; }
if(_Obstacles[idxD] > 0.1) { D = C; mask.z = 0; }
if(_Obstacles[idxU] > 0.1) { U = C; mask.z = 0; }
float3 v = _Velocity[idx] - float3( R - L, T - B, U - D ) * 0.5;
_Write[idx] = v * mask;
}

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: aa1de4528a2c0d24983dce181ecd63af
ComputeShaderImporter:
userData:

@ -0,0 +1,37 @@
#pragma kernel CSMain
#define NUM_THREADS 8
float4 _Size;
RWStructuredBuffer<float3> _Write;
StructuredBuffer<float3> _Velocity;
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
void CSMain (int3 id : SV_DispatchThreadID)
{
int idxL = max(0, id.x-1) + id.y*_Size.x + id.z*_Size.x*_Size.y;
int idxR = min(_Size.x-1, id.x+1) + id.y*_Size.x + id.z*_Size.x*_Size.y;
int idxB = id.x + max(0, id.y-1)*_Size.x + id.z*_Size.x*_Size.y;
int idxT = id.x + min(_Size.y-1, id.y+1)*_Size.x + id.z*_Size.x*_Size.y;
int idxD = id.x + id.y*_Size.x + max(0, id.z-1)*_Size.x*_Size.y;
int idxU = id.x + id.y*_Size.x + min(_Size.z-1, id.z+1)*_Size.x*_Size.y;
float3 L = _Velocity[ idxL ];
float3 R = _Velocity[ idxR ];
float3 B = _Velocity[ idxB ];
float3 T = _Velocity[ idxT ];
float3 D = _Velocity[ idxD ];
float3 U = _Velocity[ idxU ];
float3 vorticity = 0.5 * float3( (( T.z - B.z ) - ( U.y - D.y )) , (( U.x - D.x ) - ( R.z - L.z )) , (( R.y - L.y ) - ( T.x - B.x )) );
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
_Write[idx] = vorticity;
}

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: 62b5b102c778bbd4682f63bf0a9bd2fe
ComputeShaderImporter:
userData:

@ -0,0 +1,193 @@
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
Shader "3DFluidSim/FireRayCast"
{
Properties
{
_FireGradient("FireGradient", 2D) = "red" {}
_SmokeColor("SmokeGradient", Color) = (0,0,0,1)
_SmokeAbsorption("SmokeAbsorbtion", float) = 60.0
_FireAbsorption("FireAbsorbtion", float) = 40.0
}
SubShader
{
Tags { "Queue" = "Transparent" }
Pass
{
Cull front
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#include "UnityCG.cginc"
#pragma target 5.0
#pragma vertex vert
#pragma fragment frag
#define NUM_SAMPLES 64
sampler2D _FireGradient;
float4 _SmokeColor;
float _SmokeAbsorption, _FireAbsorption;
uniform float3 _Translate, _Scale, _Size;
StructuredBuffer<float> _Density, _Reaction;
struct v2f
{
float4 pos : SV_POSITION;
float3 worldPos : TEXCOORD0;
};
v2f vert(appdata_base v)
{
v2f OUT;
OUT.pos = UnityObjectToClipPos(v.vertex);
OUT.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
return OUT;
}
struct Ray {
float3 origin;
float3 dir;
};
struct AABB {
float3 Min;
float3 Max;
};
//find intersection points of a ray with a box
bool intersectBox(Ray r, AABB aabb, out float t0, out float t1)
{
float3 invR = 1.0 / r.dir;
float3 tbot = invR * (aabb.Min-r.origin);
float3 ttop = invR * (aabb.Max-r.origin);
float3 tmin = min(ttop, tbot);
float3 tmax = max(ttop, tbot);
float2 t = max(tmin.xx, tmin.yz);
t0 = max(t.x, t.y);
t = min(tmax.xx, tmax.yz);
t1 = min(t.x, t.y);
return t0 <= t1;
}
float SampleBilinear(StructuredBuffer<float> buffer, float3 uv, float3 size)
{
uv = saturate(uv);
uv = uv * (size-1.0);
int x = uv.x;
int y = uv.y;
int z = uv.z;
int X = size.x;
int XY = size.x*size.y;
float fx = uv.x-x;
float fy = uv.y-y;
float fz = uv.z-z;
int xp1 = min(_Size.x-1, x+1);
int yp1 = min(_Size.y-1, y+1);
int zp1 = min(_Size.z-1, z+1);
float x0 = buffer[x+y*X+z*XY] * (1.0f-fx) + buffer[xp1+y*X+z*XY] * fx;
float x1 = buffer[x+y*X+zp1*XY] * (1.0f-fx) + buffer[xp1+y*X+zp1*XY] * fx;
float x2 = buffer[x+yp1*X+z*XY] * (1.0f-fx) + buffer[xp1+yp1*X+z*XY] * fx;
float x3 = buffer[x+yp1*X+zp1*XY] * (1.0f-fx) + buffer[xp1+yp1*X+zp1*XY] * fx;
float z0 = x0 * (1.0f-fz) + x1 * fz;
float z1 = x2 * (1.0f-fz) + x3 * fz;
return z0 * (1.0f-fy) + z1 * fy;
}
float4 frag(v2f IN) : COLOR
{
float3 pos = _WorldSpaceCameraPos;
Ray r;
r.origin = pos;
r.dir = normalize(IN.worldPos-pos);
AABB aabb;
aabb.Min = float3(-0.5,-0.5,-0.5)*_Scale + _Translate;
aabb.Max = float3(0.5,0.5,0.5)*_Scale + _Translate;
//figure out where ray from eye hit front of cube
float tnear, tfar;
intersectBox(r, aabb, tnear, tfar);
//if eye is in cube then start ray at eye
if (tnear < 0.0) tnear = 0.0;
float3 rayStart = r.origin + r.dir * tnear;
float3 rayStop = r.origin + r.dir * tfar;
//convert to texture space
rayStart -= _Translate;
rayStop -= _Translate;
rayStart = (rayStart + 0.5*_Scale)/_Scale;
rayStop = (rayStop + 0.5*_Scale)/_Scale;
float3 start = rayStart;
float dist = distance(rayStop, rayStart);
float stepSize = dist/float(NUM_SAMPLES);
float3 ds = normalize(rayStop-rayStart) * stepSize;
float fireAlpha = 1.0, smokeAlpha = 1.0;
for(int i=0; i < NUM_SAMPLES; i++, start += ds)
{
float D = SampleBilinear(_Density, start, _Size);
float R = SampleBilinear(_Reaction, start, _Size);
fireAlpha *= 1.0-saturate(R*stepSize*_FireAbsorption);
smokeAlpha *= 1.0-saturate(D*stepSize*_SmokeAbsorption);
if(fireAlpha <= 0.01 && smokeAlpha <= 0.01) break;
}
float4 smoke = _SmokeColor * (1.0-smokeAlpha);
float4 fire = tex2D(_FireGradient, float2(fireAlpha,0)) * (1.0-fireAlpha);
return fire + smoke;
}
ENDCG
}
}
}

@ -0,0 +1,5 @@
fileFormatVersion: 2
guid: ce7e14398ee00d84193a82fb0174f3f6
ShaderImporter:
defaultTextures: []
userData:

@ -0,0 +1,183 @@
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
Shader "3DFluidSim/SmokeRayCast"
{
Properties
{
_SmokeColor("SmokeGradient", Color) = (0,0,0,1)
_SmokeAbsorption("SmokeAbsorbtion", float) = 60.0
}
SubShader
{
Tags { "Queue" = "Transparent" }
Pass
{
Cull front
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#include "UnityCG.cginc"
#pragma target 5.0
#pragma vertex vert
#pragma fragment frag
#define NUM_SAMPLES 64
float4 _SmokeColor;
float _SmokeAbsorption;
uniform float3 _Translate, _Scale, _Size;
StructuredBuffer<float> _Density;
struct v2f
{
float4 pos : SV_POSITION;
float3 worldPos : TEXCOORD0;
};
v2f vert(appdata_base v)
{
v2f OUT;
OUT.pos = UnityObjectToClipPos(v.vertex);
OUT.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
return OUT;
}
struct Ray {
float3 origin;
float3 dir;
};
struct AABB {
float3 Min;
float3 Max;
};
//find intersection points of a ray with a box
bool intersectBox(Ray r, AABB aabb, out float t0, out float t1)
{
float3 invR = 1.0 / r.dir;
float3 tbot = invR * (aabb.Min-r.origin);
float3 ttop = invR * (aabb.Max-r.origin);
float3 tmin = min(ttop, tbot);
float3 tmax = max(ttop, tbot);
float2 t = max(tmin.xx, tmin.yz);
t0 = max(t.x, t.y);
t = min(tmax.xx, tmax.yz);
t1 = min(t.x, t.y);
return t0 <= t1;
}
float SampleBilinear(StructuredBuffer<float> buffer, float3 uv, float3 size)
{
uv = saturate(uv);
uv = uv * (size-1.0);
int x = uv.x;
int y = uv.y;
int z = uv.z;
int X = size.x;
int XY = size.x*size.y;
float fx = uv.x-x;
float fy = uv.y-y;
float fz = uv.z-z;
int xp1 = min(_Size.x-1, x+1);
int yp1 = min(_Size.y-1, y+1);
int zp1 = min(_Size.z-1, z+1);
float x0 = buffer[x+y*X+z*XY] * (1.0f-fx) + buffer[xp1+y*X+z*XY] * fx;
float x1 = buffer[x+y*X+zp1*XY] * (1.0f-fx) + buffer[xp1+y*X+zp1*XY] * fx;
float x2 = buffer[x+yp1*X+z*XY] * (1.0f-fx) + buffer[xp1+yp1*X+z*XY] * fx;
float x3 = buffer[x+yp1*X+zp1*XY] * (1.0f-fx) + buffer[xp1+yp1*X+zp1*XY] * fx;
float z0 = x0 * (1.0f-fz) + x1 * fz;
float z1 = x2 * (1.0f-fz) + x3 * fz;
return z0 * (1.0f-fy) + z1 * fy;
}
float4 frag(v2f IN) : COLOR
{
float3 pos = _WorldSpaceCameraPos;
Ray r;
r.origin = pos;
r.dir = normalize(IN.worldPos-pos);
AABB aabb;
aabb.Min = float3(-0.5,-0.5,-0.5)*_Scale + _Translate;
aabb.Max = float3(0.5,0.5,0.5)*_Scale + _Translate;
//figure out where ray from eye hit front of cube
float tnear, tfar;
intersectBox(r, aabb, tnear, tfar);
//if eye is in cube then start ray at eye
if (tnear < 0.0) tnear = 0.0;
float3 rayStart = r.origin + r.dir * tnear;
float3 rayStop = r.origin + r.dir * tfar;
//convert to texture space
rayStart -= _Translate;
rayStop -= _Translate;
rayStart = (rayStart + 0.5*_Scale)/_Scale;
rayStop = (rayStop + 0.5*_Scale)/_Scale;
float3 start = rayStart;
float dist = distance(rayStop, rayStart);
float stepSize = dist/float(NUM_SAMPLES);
float3 ds = normalize(rayStop-rayStart) * stepSize;
float alpha = 1.0;
for(int i=0; i < NUM_SAMPLES; i++, start += ds)
{
float D = SampleBilinear(_Density, start, _Size);
alpha *= 1.0-saturate(D*stepSize*_SmokeAbsorption);
if(alpha <= 0.01) break;
}
return _SmokeColor * (1-alpha);
}
ENDCG
}
}
}

@ -0,0 +1,5 @@
fileFormatVersion: 2
guid: edf7886cf7d957f4c8416e250df7367c
ShaderImporter:
defaultTextures: []
userData:

@ -0,0 +1,399 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 8
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
m_LinearFogStart: 0
m_LinearFogEnd: 300
m_AmbientSkyColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
m_AmbientEquatorColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
m_AmbientIntensity: 1
m_AmbientMode: 3
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 0}
m_HaloStrength: 0.5
m_FlareStrength: 1
m_FlareFadeSpeed: 3
m_HaloTexture: {fileID: 0}
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
m_DefaultReflectionMode: 0
m_DefaultReflectionResolution: 128
m_ReflectionBounces: 1
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
--- !u!157 &4
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 11
m_GIWorkflowMode: 1
m_GISettings:
serializedVersion: 2
m_BounceScale: 1
m_IndirectOutputScale: 1
m_AlbedoBoost: 1
m_TemporalCoherenceThreshold: 1
m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 1
m_EnableRealtimeLightmaps: 0
m_LightmapEditorSettings:
serializedVersion: 9
m_Resolution: 1
m_BakeResolution: 50
m_TextureWidth: 1024
m_TextureHeight: 1024
m_AO: 1
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_Padding: 2
m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1
m_TextureCompression: 0
m_FinalGather: 0
m_FinalGatherFiltering: 1
m_FinalGatherRayCount: 256
m_ReflectionCompression: 2
m_MixedBakeMode: 1
m_BakeBackend: 0
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 500
m_PVRBounces: 2
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVRFilteringMode: 1
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
m_ShowResolutionOverlay: 1
m_LightingDataAsset: {fileID: 0}
m_UseShadowmask: 0
--- !u!196 &5
NavMeshSettings:
serializedVersion: 2
m_ObjectHideFlags: 0
m_BuildSettings:
serializedVersion: 2
agentTypeID: 0
agentRadius: 0.5
agentHeight: 2
agentSlope: 45
agentClimb: 0.4
ledgeDropHeight: 0
maxJumpAcrossDistance: 0
minRegionArea: 2
manualCellSize: 0
cellSize: 0.16666666
manualTileSize: 0
tileSize: 256
accuratePlacement: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &1470411171
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 100004, guid: 9d4133d5d30b644bd87802a347eaccbe, type: 2}
m_PrefabInternal: {fileID: 0}
serializedVersion: 5
m_Component:
- component: {fileID: 1470411177}
- component: {fileID: 1470411176}
- component: {fileID: 1470411175}
m_Layer: 0
m_Name: Main Camera
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!92 &1470411175
Behaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 9200000, guid: 9d4133d5d30b644bd87802a347eaccbe,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1470411171}
m_Enabled: 1
--- !u!20 &1470411176
Camera:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 2000000, guid: 9d4133d5d30b644bd87802a347eaccbe,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1470411171}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 1
m_BackGroundColor: {r: 0.42647058, g: 0.42647058, b: 0.42647058, a: 1}
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 60
field of view: 40
orthographic: 0
orthographic size: 100
m_Depth: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294966527
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 0
m_AllowMSAA: 1
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!4 &1470411177
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 400004, guid: 9d4133d5d30b644bd87802a347eaccbe, type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1470411171}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 3, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1803253977
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
serializedVersion: 5
m_Component:
- component: {fileID: 1803253979}
- component: {fileID: 1803253978}
m_Layer: 0
m_Name: Directional light
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!108 &1803253978
Light:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1803253977}
m_Enabled: 1
serializedVersion: 8
m_Type: 1
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_Intensity: 1
m_Range: 10
m_SpotAngle: 30
m_CookieSize: 10
m_Shadows:
m_Type: 0
m_Resolution: -1
m_CustomResolution: -1
m_Strength: 1
m_Bias: 0.05
m_NormalBias: 0.4
m_NearPlane: 0.2
m_Cookie: {fileID: 0}
m_DrawHalo: 0
m_Flare: {fileID: 0}
m_RenderMode: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_Lightmapping: 1
m_AreaSize: {x: 1, y: 1}
m_BounceIntensity: 1
m_ColorTemperature: 6570
m_UseColorTemperature: 0
m_ShadowRadius: 0
m_ShadowAngle: 0
--- !u!4 &1803253979
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1803253977}
m_LocalRotation: {x: 0.40821794, y: -0.23456973, z: 0.10938166, w: 0.8754261}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &2140950347
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
serializedVersion: 5
m_Component:
- component: {fileID: 2140950351}
- component: {fileID: 2140950350}
- component: {fileID: 2140950349}
- component: {fileID: 2140950348}
m_Layer: 0
m_Name: Plane
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!23 &2140950348
MeshRenderer:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 2140950347}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 0
m_ReflectionProbeUsage: 1
m_Materials:
- {fileID: 2100000, guid: 0d538acbbf71af343b5efaa45bd9af35, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 0
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!64 &2140950349
MeshCollider:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 2140950347}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 1
serializedVersion: 3
m_Convex: 0
m_CookingOptions: 14
m_SkinWidth: 0.01
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
--- !u!33 &2140950350
MeshFilter:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 2140950347}
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
--- !u!4 &2140950351
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 2140950347}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 64, y: 64, z: 64}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &2142477375
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 400000, guid: 0b40c0b4ea4208b4792d95085b850676, type: 2}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 0b40c0b4ea4208b4792d95085b850676, type: 2}
propertyPath: m_LocalPosition.y
value: 4.00099993
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 0b40c0b4ea4208b4792d95085b850676, type: 2}
propertyPath: m_LocalPosition.z
value: 12
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 0b40c0b4ea4208b4792d95085b850676, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 0b40c0b4ea4208b4792d95085b850676, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 0b40c0b4ea4208b4792d95085b850676, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 0b40c0b4ea4208b4792d95085b850676, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 0b40c0b4ea4208b4792d95085b850676, type: 2}
propertyPath: m_LocalScale.x
value: 4
objectReference: {fileID: 0}
- target: {fileID: 400000, guid: 0b40c0b4ea4208b4792d95085b850676, type: 2}
propertyPath: m_LocalScale.z
value: 4
objectReference: {fileID: 0}
- target: {fileID: 11400000, guid: 0b40c0b4ea4208b4792d95085b850676, type: 2}
propertyPath: m_width
value: 64
objectReference: {fileID: 0}
- target: {fileID: 11400000, guid: 0b40c0b4ea4208b4792d95085b850676, type: 2}
propertyPath: m_depth
value: 64
objectReference: {fileID: 0}
- target: {fileID: 11400000, guid: 0b40c0b4ea4208b4792d95085b850676, type: 2}
propertyPath: m_advectionType
value: 2
objectReference: {fileID: 0}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: 0b40c0b4ea4208b4792d95085b850676, type: 2}
m_IsPrefabParent: 0

@ -0,0 +1,4 @@
fileFormatVersion: 2
guid: 77228c5d076c6bc4fae6e505baf0f4f6
DefaultImporter:
userData:

@ -0,0 +1,5 @@
fileFormatVersion: 2
guid: c41114551fea2914095b31e0e66bfb2b
folderAsset: yes
DefaultImporter:
userData:

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

@ -0,0 +1,45 @@
fileFormatVersion: 2
guid: ac2c4961e13090042b382bb1c186bc31
TextureImporter:
serializedVersion: 2
mipmaps:
mipMapMode: 0
enableMipMap: 1
linearTexture: 0
correctGamma: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: .25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 0
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 1024
textureSettings:
filterMode: -1
aniso: -1
mipBias: -1
wrapMode: -1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: .5, y: .5}
spritePixelsToUnits: 100
alphaIsTransparency: 0
textureType: -1
buildTargetSettings: []
spriteSheet:
sprites: []
spritePackingTag:
userData:

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 5fc36e4bb6aa6c14ba128dca58463ede
folderAsset: yes
timeCreated: 1519705207
licenseType: Free
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,67 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FluidSimInputController : MonoBehaviour
{
[SerializeField]
FluidSim3DProject.SmokeFluidSim fluidSimulation;
public SmokeFluidSimUniforms uniforms;
List<Transform> children = new List<Transform>();
int child_index = 0;
void Start()
{
}
void Update()
{
children.Clear();
for (int i = 0; i < transform.childCount; i++)
{
var child = transform.GetChild(i);
if (child.gameObject.activeSelf)
children.Add(child);
}
Vector3 size = fluidSimulation.GridSize;
Vector3 root = fluidSimulation.GridRoot;
Vector3 inv_size = new Vector3(1.0f / size.x, 1.0f / size.y, 1.0f / size.z);
if (children.Count > 0)
{
child_index %= children.Count;
var trans = children[child_index];
Vector3 pos = Vector3.Scale(trans.position - root, inv_size);
pos.x = Mathf.Clamp01(pos.x);
pos.y = Mathf.Clamp01(pos.y);
pos.z = Mathf.Clamp01(pos.z);
fluidSimulation.m_inputPos = pos;
fluidSimulation.m_inputRadius = trans.lossyScale.x / size.x;
child_index++;
}
else
{
fluidSimulation.m_inputPos = Vector4.zero;
fluidSimulation.m_inputRadius = 0.0f;
}
{
fluidSimulation.m_vorticityStrength = uniforms.m_vorticityStrength;
fluidSimulation.m_densityAmount = uniforms.m_densityAmount;
fluidSimulation.m_densityDissipation = uniforms.m_densityDissipation;
fluidSimulation.m_densityBuoyancy = uniforms.m_densityBuoyancy;
fluidSimulation.m_densityWeight = uniforms.m_densityWeight;
fluidSimulation.m_temperatureAmount = uniforms.m_temperatureAmount;
fluidSimulation.m_temperatureDissipation = uniforms.m_temperatureDissipation;
fluidSimulation.m_velocityDissipation = uniforms.m_velocityDissipation;
}
}
}

@ -0,0 +1,13 @@
fileFormatVersion: 2
guid: efb50f560ef686940ab1bfb542387078
timeCreated: 1519705207
licenseType: Free
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,21 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b1ed87bff91722147827575923ba6b8a, type: 3}
m_Name: SmokeFluidSimUniforms
m_EditorClassIdentifier:
m_vorticityStrength: 1
m_densityAmount: 6.58
m_densityDissipation: 0.999
m_densityBuoyancy: 0.4
m_densityWeight: 0.0125
m_temperatureAmount: 0.9
m_temperatureDissipation: 0.995
m_velocityDissipation: 0.995

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 4dcbc9a971de5974da304d60289ebe0f
timeCreated: 1519718721
licenseType: Free
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,26 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(order = 1000, menuName = "UltraCombos/SmokeFluidSimUniforms", fileName = "SmokeFluidSimUniforms")]
public class SmokeFluidSimUniforms : ScriptableObject
{
[Header("FluidSimUniforms")]
[Range(0, 10)]
public float m_vorticityStrength = 1.0f;
[Range(0, 10)]
public float m_densityAmount = 1.0f;
[Range(0, 1)]
public float m_densityDissipation = 0.999f;
[Range(0, 10)]
public float m_densityBuoyancy = 1.0f;
[Range(0.0f, 0.1f)]
public float m_densityWeight = 0.0125f;
[Range(0, 50)]
public float m_temperatureAmount = 10.0f;
[Range(0, 1)]
public float m_temperatureDissipation = 0.995f;
[Range(0, 1)]
public float m_velocityDissipation = 0.995f;
}

@ -0,0 +1,13 @@
fileFormatVersion: 2
guid: b1ed87bff91722147827575923ba6b8a
timeCreated: 1519705207
licenseType: Free
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: b6d5c2dc76e09194ab689ea89ecab57d
folderAsset: yes
timeCreated: 1519717125
licenseType: Free
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 34b4afb9026442541b75a5cc9009882b
timeCreated: 1519717513
licenseType: Free
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: e88e267b1ead9ee4c9bdf8556f5a7490
folderAsset: yes
timeCreated: 1519717219
licenseType: Free
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,64 @@
// Each #kernel tells which function to compile; you can have many kernels
#pragma kernel CSMain
#define NUM_THREADS 8
RWStructuredBuffer<float4> KinectGridBuffer;
RWStructuredBuffer<float3> VelocityBuffer;
RWStructuredBuffer<float> TemperatureBuffer;
RWStructuredBuffer<float> ObstacleBuffer;
RWStructuredBuffer<float> DensityBuffer;
float4 FluidDim;
float timeStep;
float temperatureAmount;
float densityAmount;
float kinectAmount;
[numthreads(NUM_THREADS, NUM_THREADS, NUM_THREADS)]
void CSMain(uint3 id : SV_DispatchThreadID)
{
int idx = id.x + id.y*FluidDim.x + id.z*FluidDim.x*FluidDim.y;
float4 value = KinectGridBuffer[idx];
float3 vel = lerp(value.xyz, float3(0, 0, 0), 0.05f);
float obs = lerp(value.w, 0, 0.2f);
KinectGridBuffer[idx] = float4(vel, obs);
//KinectGridBuffer[idx] = float4(1, 0, 0, 1);
float obstacle = 0;
// boundary
{
if ((int)id.x - 1 < 0) obstacle = 1;
if ((int)id.x + 1 > (int)FluidDim.x - 1) obstacle = 1;
if ((int)id.y - 1 < 0) obstacle = 1;
if ((int)id.y + 1 > (int)FluidDim.y - 1) obstacle = 1;
if ((int)id.z - 1 < 0) obstacle = 1;
if ((int)id.z + 1 > (int)FluidDim.z - 1) obstacle = 1;
}
//
obstacle = max(obstacle, KinectGridBuffer[idx].w);
obstacle = saturate(obstacle);
//ObstacleBuffer[idx] = obstacle;
float3 velocity = VelocityBuffer[idx];
float density = DensityBuffer[idx];
//if (id.y == 1) density += 10.0f * timeStep;
density += KinectGridBuffer[idx].w * kinectAmount * densityAmount * timeStep * length(velocity);
density = max(density, 0);
//DensityBuffer[idx] = density;
float temperature = TemperatureBuffer[idx];
temperature += KinectGridBuffer[idx].w * kinectAmount * temperatureAmount * timeStep * length(velocity);
temperature = max(temperature, 0);
TemperatureBuffer[idx] = temperature;
velocity += KinectGridBuffer[idx].xyz * kinectAmount;
VelocityBuffer[idx] = velocity;
}

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 5a8d2c045ee23f743a54f85301ca1c0b
timeCreated: 1505446406
licenseType: Free
ComputeShaderImporter:
currentAPIMask: 4
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,199 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace UltraCombos
{
public class KinectOpticalFlow : MonoBehaviour
{
const int width = 512;
const int height = 424;
const int POSITION = 0;
const int VELOCITY = 1;
List<ComputeBuffer> kinectBuffers = new List<ComputeBuffer>();
public ComputeBuffer PositionBuffer { get { return kinectBuffers[POSITION]; } }
public ComputeBuffer VelocityBuffer { get { return kinectBuffers[VELOCITY]; } }
[SerializeField]
ComputeShader updateShader;
[SerializeField]
ComputeShader clearShader;
ComputeBuffer clear_grid_buffer_args_buffer = null;
ComputeBuffer args_buffer = null;
public bool flipX = true;
public Vector3 clipMin = Vector3.one * -10;
public Vector3 clipMax = Vector3.one * 10;
[SerializeField]
FluidSim3DProject.SmokeFluidSim fluidSimulation;
ComputeBuffer kinect_grid_buffer;
public ComputeBuffer KinectGridBuffer { get { return kinect_grid_buffer; } }
int grid_width, grid_height, grid_depth;
[Range(0, 5)]
public float kinectAmount = 0;
[SerializeField, Header("Debug")]
bool debug = false;
[SerializeField]
bool colorize = false;
[SerializeField]
Material debugMaterial;
[SerializeField]
string debugInfo;
public List<RenderTexture> renderTextures;
private void Start()
{
List<string> spout_names = new List<string>() { "Position", "Velocity" };
foreach (var name in spout_names)
{
var buf = new ComputeBuffer(width * height, sizeof(float) * 4);
kinectBuffers.Add(buf);
}
{
grid_width = fluidSimulation.m_width;
grid_height = fluidSimulation.m_height;
grid_depth = fluidSimulation.m_depth;
int grid_count = grid_width * grid_height * grid_depth;
kinect_grid_buffer = new ComputeBuffer(grid_count, sizeof(float) * 4);
}
}
bool is_initialized = false;
private void FixedUpdate()
{
if (is_initialized == false)
{
is_initialized = true;
List<string> spout_names = new List<string>() { "Position", "Velocity" };
int count = 0;
foreach (var name in spout_names)
{
updateShader.SetBuffer(0, string.Format("{0}Buffer", name), kinectBuffers[count]);
debugMaterial.SetBuffer(string.Format("{0}Buffer", name), kinectBuffers[count]);
count++;
}
{
updateShader.SetBuffer(0, "KinectGridBuffer", kinect_grid_buffer);
clearShader.SetBuffer(0, "KinectGridBuffer", kinect_grid_buffer);
}
}
if (args_buffer == null)
{
#if false
int work_group_size = 512;
int num_groups = (width * height + work_group_size - 1) / work_group_size;
uint[] args = new uint[3] { (uint)num_groups, 1, 1 };
args_buffer = new ComputeBuffer(1, args.Length * sizeof(uint), ComputeBufferType.IndirectArguments);
args_buffer.SetData(args);
#else
args_buffer = updateShader.CreateIndirectComputeArgsBuffer(width * height, 1, 1);
#endif
}
// reset kinect buffer counter
{
foreach (var buf in kinectBuffers)
{
buf.SetCounterValue(0);
}
}
// update
{
var m = transform.localToWorldMatrix;
float[] mat_floats = new float[16]
{ m.m00, m.m01, m.m02, m.m03,
m.m10, m.m11, m.m12, m.m13,
m.m20, m.m21, m.m22, m.m23,
m.m30, m.m31, m.m32, m.m33};
updateShader.SetVector("ClipMin", clipMin);
updateShader.SetVector("ClipMax", clipMax);
updateShader.SetFloats("ModelMatrix", mat_floats);
updateShader.SetVector("FluidSize", fluidSimulation.GridSize);
updateShader.SetVector("FluidRoot", fluidSimulation.GridRoot);
updateShader.SetVector("FluidDim", fluidSimulation.GridDim);
updateShader.SetInt("flipX", flipX ? 1 : 0);
updateShader.SetTexture(0, "PositionTexture", renderTextures[POSITION]);
updateShader.SetTexture(0, "VelocityTexture", renderTextures[VELOCITY]);
updateShader.DispatchIndirect(0, args_buffer);
}
if (clear_grid_buffer_args_buffer == null)
{
#if false
uint work_group_size = 8;
Vector3 dim = fluidSimulation.GridDim;
uint[] args = new uint[3] { (uint)dim.x / work_group_size, (uint)dim.y / work_group_size, (uint)dim.z / work_group_size };
clear_grid_buffer_args_buffer = new ComputeBuffer(1, args.Length * sizeof(uint), ComputeBufferType.IndirectArguments);
clear_grid_buffer_args_buffer.SetData(args);
#else
Vector3Int dim = Vector3Int.FloorToInt(fluidSimulation.GridDim);
clear_grid_buffer_args_buffer = clearShader.CreateIndirectComputeArgsBuffer(dim.x, dim.y, dim.z);
#endif
}
{
clearShader.SetVector("FluidDim", fluidSimulation.GridDim);
clearShader.SetBuffer(0, "VelocityBuffer", fluidSimulation.VelocityBuffer);
clearShader.SetBuffer(0, "TemperatureBuffer", fluidSimulation.TemperatureBuffer);
clearShader.SetBuffer(0, "ObstacleBuffer", fluidSimulation.ObstacleBuffer);
clearShader.SetBuffer(0, "DensityBuffer", fluidSimulation.DensityBuffer);
clearShader.SetFloat("timeStep", Time.fixedDeltaTime);
clearShader.SetFloat("temperatureAmount", fluidSimulation.m_temperatureAmount);
clearShader.SetFloat("densityAmount", fluidSimulation.m_densityAmount);
clearShader.SetFloat("kinectAmount", kinectAmount);
clearShader.DispatchIndirect(0, clear_grid_buffer_args_buffer);
}
}
private bool IsTextureValid(Texture2D tex)
{
bool res = false;
if (tex)
{
if (tex.width == 512 && tex.height == 424)
res = true;
}
return res;
}
private void OnRenderObject()
{
if (debug == false)
return;
if (Utilities.SkipCamera(Camera.current.name))
return;
debugMaterial.SetPass(0);
debugMaterial.SetInt("colorize", colorize ? 1 : 0);
Graphics.DrawProcedural(MeshTopology.Points, PositionBuffer.count);
}
private void OnDestroy()
{
foreach (var buf in kinectBuffers)
buf.Release();
clear_grid_buffer_args_buffer.Release();
args_buffer.Release();
KinectGridBuffer.Release();
}
}
}

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 639d7a6f2452c7d4cab5ffcb304b1d8c
timeCreated: 1505354794
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,78 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: KinectOpticalFlowDebugMaterial
m_Shader: {fileID: 4800000, guid: a37a351249d5e2a418fb42311734b238, type: 3}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _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}
- _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}
- _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}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GeomSize: 0.02
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _Size: 3
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 95b4d9b25b7a7e3449627228b10d9009
timeCreated: 1505375720
licenseType: Free
NativeFormatImporter:
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,94 @@
Shader "Kinect/OpticalFlowDebugShader"
{
Properties
{
_Size("Size", Range(0, 100)) = 1
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
//Cull Off
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma geometry geom
#pragma fragment frag
#include "UnityCG.cginc"
#ifdef SHADER_API_D3D11
StructuredBuffer<float4> PositionBuffer;
StructuredBuffer<float4> VelocityBuffer;
#endif
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2g
{
//float4 vertex : SV_POSITION;
//float2 uv : TEXCOORD0;
uint id : BLENDINDICES;
//UNITY_FOG_COORDS(1)
};
struct g2f
{
float4 vertex : SV_POSITION;
float3 color : COLOR;
};
float _Size;
float colorize;
v2g vert(appdata_base v, uint vid : SV_VertexID)
{
v2g o = (v2g)0;
o.id = vid;
return o;
}
[maxvertexcount(2)]
void geom(point v2g input[1], inout LineStream<g2f> OutputStream)
{
#ifdef SHADER_API_D3D11
float4 position = PositionBuffer[input[0].id];
float4 velocity = VelocityBuffer[input[0].id];
#else
float4 position = float4(0, 0, 0, 1);
float4 velocity = float4(0, 0, 0, 0);
#endif
float3 c0 = float3(0, 1, 0);
float3 c1 = float3(1, 0, 0);
c0 = float3(237, 210, 152) / 255;
c1 = float3(3, 46, 82) / 255;
g2f o = (g2f)0;
o.vertex = UnityObjectToClipPos(position.xyz);
o.color = lerp(float3(0, 0, 0), c0, colorize);
OutputStream.Append(o);
o.vertex = UnityObjectToClipPos(position.xyz - velocity.xyz * _Size);
o.color = lerp(float3(0, 0, 0), c1, colorize);
OutputStream.Append(o);
OutputStream.RestartStrip();
}
fixed4 frag (g2f i) : SV_Target
{
fixed4 col = float4(i.color, 1.0f);
return col;
}
ENDCG
}
}
}

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: a37a351249d5e2a418fb42311734b238
timeCreated: 1505374746
licenseType: Free
ShaderImporter:
defaultTextures: []
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,33 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!84 &8400000
RenderTexture:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: KinectRenderTexturePosition
m_ImageContentsHash:
serializedVersion: 2
Hash: 00000000000000000000000000000000
m_ForcedFallbackFormat: 4
m_DownscaleFallback: 0
m_Width: 512
m_Height: 424
m_AntiAliasing: 1
m_DepthFormat: 2
m_ColorFormat: 11
m_MipMap: 0
m_GenerateMips: 1
m_SRGB: 0
m_UseDynamicScale: 0
m_BindMS: 0
m_TextureSettings:
serializedVersion: 2
m_FilterMode: 1
m_Aniso: 0
m_MipBias: 0
m_WrapU: 1
m_WrapV: 1
m_WrapW: 1
m_Dimension: 2
m_VolumeDepth: 1

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: da32e5550d217674aa980199f6a84db3
timeCreated: 1508289246
licenseType: Free
NativeFormatImporter:
mainObjectFileID: 8400000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,33 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!84 &8400000
RenderTexture:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: KinectRenderTextureVelocity
m_ImageContentsHash:
serializedVersion: 2
Hash: 00000000000000000000000000000000
m_ForcedFallbackFormat: 4
m_DownscaleFallback: 0
m_Width: 512
m_Height: 424
m_AntiAliasing: 1
m_DepthFormat: 2
m_ColorFormat: 11
m_MipMap: 0
m_GenerateMips: 1
m_SRGB: 0
m_UseDynamicScale: 0
m_BindMS: 0
m_TextureSettings:
serializedVersion: 2
m_FilterMode: 1
m_Aniso: 0
m_MipBias: 0
m_WrapU: 1
m_WrapV: 1
m_WrapW: 1
m_Dimension: 2
m_VolumeDepth: 1

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 3d63e39cdb1f2e5419672e7560e22145
timeCreated: 1508289246
licenseType: Free
NativeFormatImporter:
mainObjectFileID: 8400000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,72 @@
// Each #kernel tells which function to compile; you can have many kernels
#pragma kernel CSMain
RWStructuredBuffer<float4> PositionBuffer;
RWStructuredBuffer<float4> VelocityBuffer;
RWStructuredBuffer<float4> KinectGridBuffer;
//RWStructuredBuffer<float4> FullPositionBuffer;
//RWStructuredBuffer<float4> FullVelocityBuffer;
Texture2D<float4> PositionTexture;
Texture2D<float4> VelocityTexture;
float4 ClipMin;
float4 ClipMax;
float4x4 ModelMatrix;
float4 FluidSize;
float4 FluidRoot;
float4 FluidDim;
int flipX;
[numthreads(512,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
uint2 tex_coord = uint2(id.x % 424, id.x / 424);
float4 pos = float4(PositionTexture[tex_coord].xyz, 1);
//pos.y *= -1;
pos.z *= -1;
pos.x = lerp(pos.x, -pos.x, flipX);
float pos_mag = length(pos.xyz);
{
pos = mul(pos, ModelMatrix);
float4 vel = VelocityTexture[tex_coord];
//vel.y *= -1;
vel.z *= -1;
vel.x = lerp(vel.x, -vel.x, flipX);
float3 grid_pos = (pos.xyz - FluidRoot.xyz) / FluidSize.xyz;
int grid_index = -1;
if (grid_pos.x > 0 && grid_pos.x < 1 &&
grid_pos.y > 0 && grid_pos.y < 1 &&
grid_pos.z > 0 && grid_pos.z < 1 &&
pos_mag > 0.0f)// && length(pos) > 10.0f)
{
grid_pos *= FluidDim.xyz;
grid_index = (int)grid_pos.x + (int)grid_pos.y * FluidDim.x + (int)grid_pos.z * FluidDim.x * FluidDim.y;
KinectGridBuffer[grid_index] += float4(vel.xyz, 1);
//const int layer = 0;
//for (int i = 0; i < layer; i++)
//{
// grid_index += FluidDim.x * FluidDim.y;
// KinectGridBuffer[grid_index] += float4(vel.xyz, 1);
//}
///PositionBuffer.Append(float4(pos.xyz, grid_index));
///VelocityBuffer.Append(float4(vel.xyz, 0));
}
PositionBuffer[id.x] = float4(pos.xyz, grid_index);
VelocityBuffer[id.x] = float4((pos_mag == 0.0f) ? float3(0, 0, 0) : vel.xyz, 0);
//FullPositionBuffer[id.x] = float4(pos.xyz, grid_index);
//FullVelocityBuffer[id.x] = float4((pos_mag == 0.0f) ? float3(0, 0, 0) : vel.xyz, 0);
}
//PositionBuffer.Append(float4(0, 0, 0, 1));
//Result[id.xy] = float4(id.x & id.y, (id.x & 15)/15.0, (id.y & 15)/15.0, 0.0);
}

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 514ebfeae1aec6342b486c73b1fbfa32
timeCreated: 1505357099
licenseType: Free
ComputeShaderImporter:
currentAPIMask: 4
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 13b88616b1d47df45b1c7e4bea2670ec
folderAsset: yes
timeCreated: 1519716653
licenseType: Free
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 4d0ccfcbf5ecf80479a8ef9067bd51be
folderAsset: yes
timeCreated: 1519716653
licenseType: Free
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,89 @@
using UnityEngine;
namespace Klak.Chromatics
{
/// Cosine gradient object
[CreateAssetMenu(order = 1000)]
public class CosineGradient : ScriptableObject
{
#region Serialized fields
[SerializeField] Vector4 _redCoeffs = new Vector4(0.5f, 0.5f, 1, 0);
[SerializeField] Vector4 _greenCoeffs = new Vector4(0.5f, 0.5f, 1, 0.333f);
[SerializeField] Vector4 _blueCoeffs = new Vector4(0.5f, 0.5f, 1, 0.665f);
#endregion
#region Public accessors
/// Packed coefficients of the red component (A, B, C, D).
public Vector4 redCoeffs {
get { return _redCoeffs; }
set { _redCoeffs = value; }
}
/// Packed coefficients of the green component (A, B, C, D).
public Vector4 greenCoeffs {
get { return _greenCoeffs; }
set { _greenCoeffs = value; }
}
/// Packed coefficients of the blue component (A, B, C, D).
public Vector4 blueCoeffs {
get { return _blueCoeffs; }
set { _blueCoeffs = value; }
}
#endregion
#region Public accessors (read only)
/// A-coefficient of the gradient packed in (red, green, blue).
public Vector3 coeffsA {
get { return new Vector3(_redCoeffs.x, _greenCoeffs.x, _blueCoeffs.x); }
}
/// B-coefficient of the gradient packed in (red, green, blue).
public Vector3 coeffsB {
get { return new Vector3(_redCoeffs.y, _greenCoeffs.y, _blueCoeffs.y); }
}
/// C-coefficient of the gradient packed in (red, green, blue).
public Vector3 coeffsC {
get { return new Vector3(_redCoeffs.z, _greenCoeffs.z, _blueCoeffs.z); }
}
/// C-coefficients multiplied by PI * 2.
public Vector3 coeffsC2 {
get { return coeffsC * Mathf.PI * 2; }
}
/// D-coefficient of the gradient packed in (red, green, blue).
public Vector3 coeffsD {
get { return new Vector3(_redCoeffs.w, _greenCoeffs.w, _blueCoeffs.w); }
}
/// D-coefficients multiplied by PI * 2.
public Vector3 coeffsD2 {
get { return coeffsD * Mathf.PI * 2; }
}
#endregion
#region Public methods
/// Evaluate a color at a given point in the gradient.
public Color Evaluate(float t)
{
var r = Mathf.Cos(( _redCoeffs.z * t + _redCoeffs.w) * Mathf.PI * 2);
var g = Mathf.Cos((_greenCoeffs.z * t + _greenCoeffs.w) * Mathf.PI * 2);
var b = Mathf.Cos(( _blueCoeffs.z * t + _blueCoeffs.w) * Mathf.PI * 2);
r = Mathf.Clamp01( _redCoeffs.x + _redCoeffs.y * r);
g = Mathf.Clamp01(_greenCoeffs.x + _greenCoeffs.y * g);
b = Mathf.Clamp01( _blueCoeffs.x + _blueCoeffs.y * b);
return new Color(r, g, b);
}
#endregion
}
}

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 54276434dda9c694e85abaf98cdd981d
timeCreated: 1485582313
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 6316b6f1835a3e84caee37a33985d868
folderAsset: yes
timeCreated: 1485598578
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,192 @@
using UnityEditor;
using UnityEngine;
namespace Klak.Chromatics
{
// Custom editor for cosine gradient object
[CustomEditor(typeof(CosineGradient))]
public class CosineGradientEditor : Editor
{
GraphDrawer _graph;
PreviewDrawer _preview;
SerializedProperty _redCoeffs;
SerializedProperty _greenCoeffs;
SerializedProperty _blueCoeffs;
[SerializeField] Shader _previewShader;
void OnEnable()
{
_graph = new GraphDrawer();
_preview = new PreviewDrawer(_previewShader);
_redCoeffs = serializedObject.FindProperty("_redCoeffs");
_greenCoeffs = serializedObject.FindProperty("_greenCoeffs");
_blueCoeffs = serializedObject.FindProperty("_blueCoeffs");
}
void OnDisable()
{
_preview.Cleanup();
}
public override void OnInspectorGUI()
{
serializedObject.Update();
_graph.DrawGraph((CosineGradient)target);
EditorGUILayout.Space();
_preview.DrawPreview((CosineGradient)target);
EditorGUILayout.Space();
ShowSliders("Red", _redCoeffs);
ShowSliders("Green", _greenCoeffs);
ShowSliders("Blue", _blueCoeffs);
serializedObject.ApplyModifiedProperties();
}
void ShowSliders(string label, SerializedProperty prop)
{
var v = prop.vector4Value;
EditorGUILayout.LabelField(label);
EditorGUI.BeginChangeCheck();
EditorGUI.indentLevel++;
v.x = EditorGUILayout.Slider("Bias", v.x, 0, 1);
v.y = EditorGUILayout.Slider("Amplitude", v.y, 0, 1);
v.z = EditorGUILayout.Slider("Frequency", v.z, 0, 3);
v.w = EditorGUILayout.Slider("Phase", v.w, 0, 1);
EditorGUI.indentLevel--;
if (EditorGUI.EndChangeCheck())
prop.vector4Value = new Vector4(v.x, v.y, v.z, v.w);
}
}
// A utility class for drawing component curves.
public class GraphDrawer
{
#region Public Methods
public void DrawGraph(CosineGradient grad)
{
_rectGraph = GUILayoutUtility.GetRect(128, 80);
// Background
DrawRect(0, 0, 1, 1, 0.1f, 0.4f);
// Horizontal line
var lineColor = Color.white * 0.4f;
DrawLine(0, 0.5f, 1, 0.5f, lineColor);
// Vertical lines
DrawLine(0.25f, 0, 0.25f, 1, lineColor);
DrawLine(0.50f, 0, 0.50f, 1, lineColor);
DrawLine(0.75f, 0, 0.75f, 1, lineColor);
// R/G/B curves
DrawGradientCurve(grad.redCoeffs, Color.red);
DrawGradientCurve(grad.greenCoeffs, Color.green);
DrawGradientCurve(grad.blueCoeffs, Color.blue);
}
void DrawGradientCurve(Vector4 coeffs, Color color)
{
for (var i = 0; i < _curveResolution; i++)
{
var x = (float)i / (_curveResolution - 1);
var theta = (coeffs.z * x + coeffs.w) * Mathf.PI * 2;
var y = coeffs.x + coeffs.y * Mathf.Cos(theta);
_curveVertices[i] = PointInRect(x, Mathf.Clamp01(y));
}
Handles.color = color;
Handles.DrawAAPolyLine(2.0f, _curveResolution, _curveVertices);
}
#endregion
#region Graph Functions
// Number of vertices in curve
const int _curveResolution = 96;
// Vertex buffers
Vector3[] _rectVertices = new Vector3[4];
Vector3[] _lineVertices = new Vector3[2];
Vector3[] _curveVertices = new Vector3[_curveResolution];
Rect _rectGraph;
// Transform a point into the graph rect.
Vector3 PointInRect(float x, float y)
{
x = Mathf.Lerp(_rectGraph.x, _rectGraph.xMax, x);
y = Mathf.Lerp(_rectGraph.yMax, _rectGraph.y, y);
return new Vector3(x, y, 0);
}
// Draw a line in the graph rect.
void DrawLine(float x1, float y1, float x2, float y2, Color color)
{
_lineVertices[0] = PointInRect(x1, y1);
_lineVertices[1] = PointInRect(x2, y2);
Handles.color = color;
Handles.DrawAAPolyLine(2.0f, _lineVertices);
}
// Draw a rect in the graph rect.
void DrawRect(float x1, float y1, float x2, float y2, float fill, float line)
{
_rectVertices[0] = PointInRect(x1, y1);
_rectVertices[1] = PointInRect(x2, y1);
_rectVertices[2] = PointInRect(x2, y2);
_rectVertices[3] = PointInRect(x1, y2);
Handles.DrawSolidRectangleWithOutline(
_rectVertices,
fill < 0 ? Color.clear : Color.white * fill,
line < 0 ? Color.clear : Color.white * line
);
}
#endregion
}
// A utility class for drawing a gradient preview area.
public class PreviewDrawer
{
Material _material;
public PreviewDrawer(Shader shader)
{
_material = new Material(Shader.Find("Hidden/Klak/Chromatics/CosineGradient/Preview"));
_material.hideFlags = HideFlags.DontSave;
}
public void Cleanup()
{
if (_material != null) Object.DestroyImmediate(_material);
_material = null;
}
public void DrawPreview(CosineGradient grad)
{
_material.SetVector("_CoeffsA", grad.coeffsA);
_material.SetVector("_CoeffsB", grad.coeffsB);
_material.SetVector("_CoeffsC", grad.coeffsC2);
_material.SetVector("_CoeffsD", grad.coeffsD2);
EditorGUI.DrawPreviewTexture(
GUILayoutUtility.GetRect(128, 32),
EditorGUIUtility.whiteTexture, _material
);
}
}
}

@ -0,0 +1,13 @@
fileFormatVersion: 2
guid: d41a30b93fdfb5c439685191d6fce80a
timeCreated: 1485595451
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences:
- _previewShader: {fileID: 4800000, guid: ac95681b71654b04196e7be8268726c1, type: 3}
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,46 @@
// Preview shader for cosine gradient
Shader "Hidden/Klak/Chromatics/CosineGradient/Preview"
{
CGINCLUDE
#include "UnityCG.cginc"
half3 _CoeffsA;
half3 _CoeffsB;
half3 _CoeffsC;
half3 _CoeffsD;
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
};
half4 frag (v2f i) : SV_Target
{
half t = i.uv.x;
half3 rgb = saturate(_CoeffsA + _CoeffsB * cos(_CoeffsC * t + _CoeffsD));
#if !defined(UNITY_COLORSPACE_GAMMA)
rgb = GammaToLinearSpace(rgb);
#endif
return half4(rgb, 1);
}
ENDCG
SubShader
{
Pass
{
CGPROGRAM
#pragma multi_compile __ UNITY_COLORSPACE_GAMMA
#pragma vertex vert_img
#pragma fragment frag
#pragma target 3.0
ENDCG
}
}
}

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: ac95681b71654b04196e7be8268726c1
timeCreated: 1485592925
licenseType: Pro
ShaderImporter:
defaultTextures: []
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because one or more lines are too long

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 0b6b04cdbb1543e4482331aebea631f8
timeCreated: 1519718305
licenseType: Free
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 19e978c6f39530b4e92e1019a575a9fc
folderAsset: yes
timeCreated: 1519716951
licenseType: Free
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,77 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: AtmosphereSkybox
m_Shader: {fileID: 4800000, guid: b5783fccd952891499da0155fe5c3887, type: 3}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _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}
- _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}
- _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}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _Exposure: 1
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: d8da8ee0c05959f40b595cff10460db1
timeCreated: 1519716963
licenseType: Free
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 22351417d40ca3844ba1ccf6bd1f6f5b
folderAsset: yes
timeCreated: 1519716259
licenseType: Free
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,16 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 54276434dda9c694e85abaf98cdd981d, type: 3}
m_Name: CosineGradient
m_EditorClassIdentifier:
_redCoeffs: {x: 0.32, y: 0.284, z: 0.56, w: 0.453}
_greenCoeffs: {x: 0.191, y: 0.306, z: 0.3, w: 0.825}
_blueCoeffs: {x: 0.198, y: 0.558, z: 0.27, w: 0}

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 0b6d4f25fdc8b8448a67827d394f8c07
timeCreated: 1513340684
licenseType: Free
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 863ee04df261c0b4d9835a82da436f0f
folderAsset: yes
timeCreated: 1513322377
licenseType: Free
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,76 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: Ground
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _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}
- _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}
- _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}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.448
- _GlossyReflections: 1
- _Metallic: 0.17
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 54c13d9de6d77834994872fbf5c7082b
timeCreated: 1513322386
licenseType: Free
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,76 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: Mirror
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _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}
- _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}
- _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}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.425
- _GlossyReflections: 1
- _Metallic: 0.653
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

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

@ -0,0 +1,78 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: ParticleViewerInstanced
m_Shader: {fileID: 4800000, guid: 0a37c93f4a42ad341ab8b8d2dafab01d, type: 3}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _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}
- _MainTex:
m_Texture: {fileID: 10910, guid: 0000000000000000f000000000000000, type: 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}
- _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}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _Emission: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0.917
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _Smoothness: 0.839
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: cc1041196be864c4cbe1b6a6118fe495
timeCreated: 1514086623
licenseType: Free
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,78 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: ParticleViewerMesh
m_Shader: {fileID: 4800000, guid: c31611738f4cc1b4ea71988156cc8327, type: 3}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _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}
- _MainTex:
m_Texture: {fileID: 10904, guid: 0000000000000000f000000000000000, type: 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}
- _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}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _Emission: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0.579
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _Smoothness: 0.479
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 6c404ebf6ff877a46a9ac3132b7c648d
timeCreated: 1513321839
licenseType: Free
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

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

Loading…
Cancel
Save