@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: da3ccee8576aaae438180c440466b71b | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 91571d1d2601647498e27c944d9c6852 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 66207ff69de6b4d73a445036c3a195f6 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,103 @@ | |||
using UnityEngine; | |||
using System; | |||
using UnityEditor; | |||
[CustomEditor(typeof(GerstnerDisplace))] | |||
public class GerstnerDisplaceEditor : Editor | |||
{ | |||
private SerializedObject serObj; | |||
public void OnEnable () | |||
{ | |||
serObj = new SerializedObject (target); | |||
} | |||
public override void OnInspectorGUI () | |||
{ | |||
serObj.Update(); | |||
GameObject go = ((GerstnerDisplace)serObj.targetObject).gameObject; | |||
WaterBase wb = (WaterBase)go.GetComponent(typeof(WaterBase)); | |||
Material sharedWaterMaterial = wb.sharedMaterial; | |||
GUILayout.Label ("Animates vertices using up 4 generated waves", EditorStyles.miniBoldLabel); | |||
if(sharedWaterMaterial) | |||
{ | |||
Vector4 amplitude = WaterEditorUtility.GetMaterialVector("_GAmplitude", sharedWaterMaterial); | |||
Vector4 frequency = WaterEditorUtility.GetMaterialVector("_GFrequency", sharedWaterMaterial); | |||
Vector4 steepness = WaterEditorUtility.GetMaterialVector("_GSteepness", sharedWaterMaterial); | |||
Vector4 speed = WaterEditorUtility.GetMaterialVector("_GSpeed", sharedWaterMaterial); | |||
Vector4 directionAB = WaterEditorUtility.GetMaterialVector("_GDirectionAB", sharedWaterMaterial); | |||
Vector4 directionCD = WaterEditorUtility.GetMaterialVector("_GDirectionCD", sharedWaterMaterial); | |||
amplitude = EditorGUILayout.Vector4Field("Amplitude (Height offset)", amplitude); | |||
frequency = EditorGUILayout.Vector4Field("Frequency (Tiling)", frequency); | |||
steepness = EditorGUILayout.Vector4Field("Steepness", steepness); | |||
speed = EditorGUILayout.Vector4Field("Speed", speed); | |||
directionAB = EditorGUILayout.Vector4Field("Direction scale (Wave 1 (X,Y) and 2 (Z,W))", directionAB); | |||
directionCD = EditorGUILayout.Vector4Field("Direction scale (Wave 3 (X,Y) and 4 (Z,W))", directionCD); | |||
if (GUI.changed) { | |||
WaterEditorUtility.SetMaterialVector("_GAmplitude", amplitude, sharedWaterMaterial); | |||
WaterEditorUtility.SetMaterialVector("_GFrequency", frequency, sharedWaterMaterial); | |||
WaterEditorUtility.SetMaterialVector("_GSteepness", steepness, sharedWaterMaterial); | |||
WaterEditorUtility.SetMaterialVector("_GSpeed", speed, sharedWaterMaterial); | |||
WaterEditorUtility.SetMaterialVector("_GDirectionAB", directionAB, sharedWaterMaterial); | |||
WaterEditorUtility.SetMaterialVector("_GDirectionCD", directionCD, sharedWaterMaterial); | |||
} | |||
/* | |||
Vector4 animationTiling = WaterEditorUtility.GetMaterialVector("_AnimationTiling", sharedWaterMaterial); | |||
Vector4 animationDirection = WaterEditorUtility.GetMaterialVector("_AnimationDirection", sharedWaterMaterial); | |||
float firstTilingU = animationTiling.x*100.0F; | |||
float firstTilingV = animationTiling.y*100.0F; | |||
float firstDirectionU = animationDirection.x; | |||
float firstDirectionV = animationDirection.y; | |||
float secondTilingU = animationTiling.z*100.0F; | |||
float secondTilingV = animationTiling.w*100.0F; | |||
float secondDirectionU = animationDirection.z; | |||
float secondDirectionV = animationDirection.w; | |||
EditorGUILayout.BeginHorizontal (); | |||
firstTilingU = EditorGUILayout.FloatField("First Tiling U", firstTilingU); | |||
firstTilingV = EditorGUILayout.FloatField("First Tiling V", firstTilingV); | |||
EditorGUILayout.EndHorizontal (); | |||
EditorGUILayout.BeginHorizontal (); | |||
secondTilingU = EditorGUILayout.FloatField("Second Tiling U", secondTilingU); | |||
secondTilingV = EditorGUILayout.FloatField("Second Tiling V", secondTilingV); | |||
EditorGUILayout.EndHorizontal (); | |||
EditorGUILayout.BeginHorizontal (); | |||
firstDirectionU = EditorGUILayout.FloatField("1st Animation U", firstDirectionU); | |||
firstDirectionV = EditorGUILayout.FloatField("1st Animation V", firstDirectionV); | |||
EditorGUILayout.EndHorizontal (); | |||
EditorGUILayout.BeginHorizontal (); | |||
secondDirectionU = EditorGUILayout.FloatField("2nd Animation U", secondDirectionU); | |||
secondDirectionV = EditorGUILayout.FloatField("2nd Animation V", secondDirectionV); | |||
EditorGUILayout.EndHorizontal (); | |||
animationDirection = new Vector4(firstDirectionU,firstDirectionV, secondDirectionU,secondDirectionV); | |||
animationTiling = new Vector4(firstTilingU/100.0F,firstTilingV/100.0F, secondTilingU/100.0F,secondTilingV/100.0F); | |||
WaterEditorUtility.SetMaterialVector("_AnimationTiling", animationTiling, sharedWaterMaterial); | |||
WaterEditorUtility.SetMaterialVector("_AnimationDirection", animationDirection, sharedWaterMaterial); | |||
EditorGUILayout.Separator (); | |||
GUILayout.Label ("Displacement Strength", EditorStyles.boldLabel); | |||
float heightDisplacement = WaterEditorUtility.GetMaterialFloat("_HeightDisplacement", sharedWaterMaterial); | |||
heightDisplacement = EditorGUILayout.Slider("Height", heightDisplacement, 0.0F, 5.0F); | |||
WaterEditorUtility.SetMaterialFloat("_HeightDisplacement", heightDisplacement, sharedWaterMaterial); | |||
*/ | |||
} | |||
serObj.ApplyModifiedProperties(); | |||
} | |||
} |
@ -0,0 +1,8 @@ | |||
fileFormatVersion: 2 | |||
guid: 1dfa22e5547fb4a4585ba225887d89dd | |||
MonoImporter: | |||
serializedVersion: 2 | |||
defaultReferences: [] | |||
executionOrder: 0 | |||
icon: {instanceID: 0} | |||
userData: |
@ -0,0 +1,60 @@ | |||
using UnityEngine; | |||
using UnityEditor; | |||
[CustomEditor(typeof(PlanarReflection))] | |||
public class PlanarReflectionEditor : Editor | |||
{ | |||
private SerializedObject serObj; | |||
//private SerializedProperty wavesFrequency; | |||
// reflection | |||
private SerializedProperty reflectionMask; | |||
private SerializedProperty reflectSkybox; | |||
private SerializedProperty clearColor; | |||
bool showKidsWithReflectionHint = false; | |||
public void OnEnable () { | |||
serObj = new SerializedObject (target); | |||
reflectionMask = serObj.FindProperty("reflectionMask"); | |||
reflectSkybox = serObj.FindProperty("reflectSkybox"); | |||
clearColor = serObj.FindProperty("clearColor"); | |||
} | |||
public override void OnInspectorGUI () | |||
{ | |||
GUILayout.Label ("Render planar reflections and use GrabPass for refractions", EditorStyles.miniBoldLabel); | |||
if(!SystemInfo.supportsRenderTextures) | |||
EditorGUILayout.HelpBox("Realtime reflections not supported", MessageType.Warning); | |||
serObj.Update(); | |||
EditorGUILayout.PropertyField(reflectionMask, new GUIContent("Reflection layers")); | |||
EditorGUILayout.PropertyField(reflectSkybox, new GUIContent("Use skybox")); | |||
EditorGUILayout.PropertyField(clearColor, new GUIContent("Clear color")); | |||
showKidsWithReflectionHint = EditorGUILayout.BeginToggleGroup("Show all tiles", showKidsWithReflectionHint); | |||
if (showKidsWithReflectionHint) { | |||
int i = 0; | |||
foreach(Transform t in ((PlanarReflection)target).transform) { | |||
if (t.GetComponent<WaterTile>()) { | |||
if(i%2==0) | |||
EditorGUILayout.BeginHorizontal(); | |||
EditorGUILayout.ObjectField(t, typeof(Transform), true); | |||
if(i%2==1) | |||
EditorGUILayout.EndHorizontal(); | |||
i = (i+1)%2; | |||
} | |||
} | |||
if(i>0) | |||
EditorGUILayout.EndHorizontal(); | |||
} | |||
EditorGUILayout.EndToggleGroup(); | |||
serObj.ApplyModifiedProperties(); | |||
} | |||
} |
@ -0,0 +1,8 @@ | |||
fileFormatVersion: 2 | |||
guid: ff3b0e14a61014f50be83e1a18c6d43e | |||
MonoImporter: | |||
serializedVersion: 2 | |||
defaultReferences: [] | |||
executionOrder: 0 | |||
icon: {instanceID: 0} | |||
userData: |
@ -0,0 +1,47 @@ | |||
using UnityEngine; | |||
using UnityEditor; | |||
[CustomEditor(typeof(SpecularLighting))] | |||
public class SpecularLightingEditor : Editor | |||
{ | |||
private SerializedObject serObj; | |||
private SerializedProperty specularLight; | |||
public void OnEnable () { | |||
serObj = new SerializedObject (target); | |||
specularLight = serObj.FindProperty("specularLight"); | |||
} | |||
public override void OnInspectorGUI () | |||
{ | |||
serObj.Update(); | |||
GameObject go = ((SpecularLighting)serObj.targetObject).gameObject; | |||
WaterBase wb = (WaterBase)go.GetComponent(typeof(WaterBase)); | |||
if(!wb.sharedMaterial) | |||
return; | |||
if(wb.sharedMaterial.HasProperty("_WorldLightDir")) { | |||
GUILayout.Label ("Transform casting specular highlights", EditorStyles.miniBoldLabel); | |||
EditorGUILayout.PropertyField(specularLight, new GUIContent("Specular light")); | |||
if(wb.sharedMaterial.HasProperty("_SpecularColor")) | |||
WaterEditorUtility.SetMaterialColor( | |||
"_SpecularColor", | |||
EditorGUILayout.ColorField("Specular", | |||
WaterEditorUtility.GetMaterialColor("_SpecularColor", wb.sharedMaterial)), | |||
wb.sharedMaterial); | |||
if(wb.sharedMaterial.HasProperty("_Shininess")) | |||
WaterEditorUtility.SetMaterialFloat("_Shininess", EditorGUILayout.Slider( | |||
"Specular power", | |||
WaterEditorUtility.GetMaterialFloat("_Shininess", wb.sharedMaterial), | |||
0.0F, 500.0F), wb.sharedMaterial); | |||
} | |||
else | |||
GUILayout.Label ("The shader doesn't have the needed _WorldLightDir property.", EditorStyles.miniBoldLabel); | |||
serObj.ApplyModifiedProperties(); | |||
} | |||
} |
@ -0,0 +1,8 @@ | |||
fileFormatVersion: 2 | |||
guid: 33f51eb21122c4ca6a199d561065ae30 | |||
MonoImporter: | |||
serializedVersion: 2 | |||
defaultReferences: [] | |||
executionOrder: 0 | |||
icon: {instanceID: 0} | |||
userData: |
@ -0,0 +1,188 @@ | |||
using UnityEngine; | |||
using UnityEditor; | |||
[CustomEditor(typeof(WaterBase))] | |||
public class WaterBaseEditor : Editor | |||
{ | |||
public GameObject oceanBase; | |||
private WaterBase waterBase; | |||
private Material oceanMaterial = null; | |||
private SerializedObject serObj; | |||
private SerializedProperty sharedMaterial; | |||
public SerializedProperty waterQuality; | |||
public SerializedProperty edgeBlend; | |||
public void OnEnable () | |||
{ | |||
serObj = new SerializedObject (target); | |||
sharedMaterial = serObj.FindProperty("sharedMaterial"); | |||
waterQuality = serObj.FindProperty("waterQuality"); | |||
edgeBlend = serObj.FindProperty("edgeBlend"); | |||
} | |||
public override void OnInspectorGUI () | |||
{ | |||
serObj.Update(); | |||
waterBase = (WaterBase)serObj.targetObject; | |||
oceanBase = ((WaterBase)serObj.targetObject).gameObject; | |||
if(!oceanBase) | |||
return; | |||
GUILayout.Label ("This script helps adjusting water material properties", EditorStyles.miniBoldLabel); | |||
EditorGUILayout.PropertyField(sharedMaterial, new GUIContent("Material")); | |||
oceanMaterial = (Material)sharedMaterial.objectReferenceValue; | |||
if (!oceanMaterial) { | |||
sharedMaterial.objectReferenceValue = (Object)WaterEditorUtility.LocateValidWaterMaterial(oceanBase.transform); | |||
serObj.ApplyModifiedProperties(); | |||
oceanMaterial = (Material)sharedMaterial.objectReferenceValue; | |||
if (!oceanMaterial) | |||
return; | |||
} | |||
EditorGUILayout.Separator (); | |||
GUILayout.Label ("Overall Quality", EditorStyles.boldLabel); | |||
EditorGUILayout.PropertyField(waterQuality, new GUIContent("Quality")); | |||
EditorGUILayout.PropertyField(edgeBlend, new GUIContent("Edge blend?")); | |||
if(waterQuality.intValue > (int)WaterQuality.Low && !SystemInfo.supportsRenderTextures) | |||
EditorGUILayout.HelpBox("Water features not supported", MessageType.Warning); | |||
if(edgeBlend.boolValue && !SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.Depth)) | |||
EditorGUILayout.HelpBox("Edge blend not supported", MessageType.Warning); | |||
EditorGUILayout.Separator (); | |||
bool hasShore = oceanMaterial.HasProperty("_ShoreTex"); | |||
GUILayout.Label ("Main Colors", EditorStyles.boldLabel); | |||
GUILayout.Label ("Alpha values define blending with realtime textures", EditorStyles.miniBoldLabel); | |||
WaterEditorUtility.SetMaterialColor("_BaseColor", EditorGUILayout.ColorField("Refraction", WaterEditorUtility.GetMaterialColor("_BaseColor", oceanMaterial)), oceanMaterial); | |||
WaterEditorUtility.SetMaterialColor("_ReflectionColor", EditorGUILayout.ColorField("Reflection", WaterEditorUtility.GetMaterialColor("_ReflectionColor", oceanMaterial)), oceanMaterial); | |||
EditorGUILayout.Separator (); | |||
GUILayout.Label ("Main Textures", EditorStyles.boldLabel); | |||
GUILayout.Label ("Used for small waves (bumps), foam and white caps", EditorStyles.miniBoldLabel); | |||
WaterEditorUtility.SetMaterialTexture("_BumpMap",(Texture)EditorGUILayout.ObjectField("Normals", WaterEditorUtility.GetMaterialTexture("_BumpMap", waterBase.sharedMaterial), typeof(Texture), false), waterBase.sharedMaterial); | |||
if (hasShore) | |||
WaterEditorUtility.SetMaterialTexture("_ShoreTex", (Texture)EditorGUILayout.ObjectField("Shore & Foam", WaterEditorUtility.GetMaterialTexture("_ShoreTex", waterBase.sharedMaterial), typeof(Texture), false), waterBase.sharedMaterial); | |||
Vector4 animationTiling; | |||
Vector4 animationDirection; | |||
Vector2 firstTiling; | |||
Vector2 secondTiling; | |||
Vector2 firstDirection; | |||
Vector2 secondDirection; | |||
animationTiling = WaterEditorUtility.GetMaterialVector("_BumpTiling", oceanMaterial); | |||
animationDirection = WaterEditorUtility.GetMaterialVector("_BumpDirection", oceanMaterial); | |||
firstTiling = new Vector2(animationTiling.x*100.0F,animationTiling.y*100.0F); | |||
secondTiling = new Vector2(animationTiling.z*100.0F,animationTiling.w*100.0F); | |||
firstTiling = EditorGUILayout.Vector2Field("Tiling 1", firstTiling); | |||
secondTiling = EditorGUILayout.Vector2Field("Tiling 2", secondTiling); | |||
//firstTiling.x = EditorGUILayout.FloatField("1st Tiling U", firstTiling.x); | |||
//firstTiling.y = EditorGUILayout.FloatField("1st Tiling V", firstTiling.y); | |||
//secondTiling.x = EditorGUILayout.FloatField("2nd Tiling U", secondTiling.x); | |||
//secondTiling.y = EditorGUILayout.FloatField("2nd Tiling V", secondTiling.y); | |||
firstDirection = new Vector2(animationDirection.x,animationDirection.y); | |||
secondDirection = new Vector2(animationDirection.z,animationDirection.w); | |||
//firstDirection.x = EditorGUILayout.FloatField("1st Animation U", firstDirection.x); | |||
//firstDirection.y = EditorGUILayout.FloatField("1st Animation V", firstDirection.y); | |||
//secondDirection.x = EditorGUILayout.FloatField("2nd Animation U", secondDirection.x); | |||
//secondDirection.y = EditorGUILayout.FloatField("2nd Animation V", secondDirection.y); | |||
firstDirection = EditorGUILayout.Vector2Field("Direction 1", firstDirection); | |||
secondDirection = EditorGUILayout.Vector2Field("Direction 2", secondDirection); | |||
animationTiling = new Vector4(firstTiling.x/100.0F,firstTiling.y/100.0F, secondTiling.x/100.0F,secondTiling.y/100.0F); | |||
animationDirection = new Vector4(firstDirection.x,firstDirection.y, secondDirection.x,secondDirection.y); | |||
WaterEditorUtility.SetMaterialVector("_BumpTiling", animationTiling, oceanMaterial); | |||
WaterEditorUtility.SetMaterialVector("_BumpDirection", animationDirection, oceanMaterial); | |||
Vector4 displacementParameter = WaterEditorUtility.GetMaterialVector("_DistortParams", oceanMaterial); | |||
Vector4 fade = WaterEditorUtility.GetMaterialVector("_InvFadeParemeter", oceanMaterial); | |||
EditorGUILayout.Separator (); | |||
GUILayout.Label ("Normals", EditorStyles.boldLabel); | |||
GUILayout.Label ("Displacement for fresnel, specular and reflection/refraction", EditorStyles.miniBoldLabel); | |||
float gerstnerNormalIntensity = WaterEditorUtility.GetMaterialFloat("_GerstnerIntensity", oceanMaterial); | |||
gerstnerNormalIntensity = EditorGUILayout.Slider("Per Vertex", gerstnerNormalIntensity, -2.5F, 2.5F); | |||
WaterEditorUtility.SetMaterialFloat("_GerstnerIntensity", gerstnerNormalIntensity, oceanMaterial); | |||
displacementParameter.x = EditorGUILayout.Slider("Per Pixel", displacementParameter.x, -4.0F, 4.0F); | |||
displacementParameter.y = EditorGUILayout.Slider("Distortion", displacementParameter.y, -0.5F, 0.5F); | |||
// fade.z = EditorGUILayout.Slider("Distance fade", fade.z, 0.0f, 0.5f); | |||
EditorGUILayout.Separator (); | |||
GUILayout.Label ("Fresnel", EditorStyles.boldLabel); | |||
GUILayout.Label ("Defines reflection to refraction relation", EditorStyles.miniBoldLabel); | |||
if(!oceanMaterial.HasProperty("_Fresnel")) { | |||
if(oceanMaterial.HasProperty("_FresnelScale")) { | |||
float fresnelScale = EditorGUILayout.Slider("Intensity", WaterEditorUtility.GetMaterialFloat("_FresnelScale", oceanMaterial), 0.1F, 4.0F); | |||
WaterEditorUtility.SetMaterialFloat("_FresnelScale", fresnelScale, oceanMaterial); | |||
} | |||
displacementParameter.z = EditorGUILayout.Slider("Power", displacementParameter.z, 0.1F, 10.0F); | |||
displacementParameter.w = EditorGUILayout.Slider("Bias", displacementParameter.w, -3.0F, 3.0F); | |||
} | |||
else | |||
{ | |||
Texture fresnelTex = (Texture)EditorGUILayout.ObjectField( | |||
"Ramp", | |||
(Texture)WaterEditorUtility.GetMaterialTexture("_Fresnel", | |||
oceanMaterial), | |||
typeof(Texture), | |||
false); | |||
WaterEditorUtility.SetMaterialTexture("_Fresnel", fresnelTex, oceanMaterial); | |||
} | |||
EditorGUILayout.Separator (); | |||
WaterEditorUtility.SetMaterialVector("_DistortParams", displacementParameter, oceanMaterial); | |||
if (edgeBlend.boolValue) | |||
{ | |||
GUILayout.Label ("Fading", EditorStyles.boldLabel); | |||
fade.x = EditorGUILayout.Slider("Edge fade", fade.x, 0.001f, 3.0f); | |||
if(hasShore) | |||
fade.y = EditorGUILayout.Slider("Shore fade", fade.y, 0.001f, 3.0f); | |||
fade.w = EditorGUILayout.Slider("Extinction fade", fade.w, 0.0f, 2.5f); | |||
WaterEditorUtility.SetMaterialVector("_InvFadeParemeter", fade, oceanMaterial); | |||
} | |||
EditorGUILayout.Separator (); | |||
if(oceanMaterial.HasProperty("_Foam")) { | |||
GUILayout.Label ("Foam", EditorStyles.boldLabel); | |||
Vector4 foam = WaterEditorUtility.GetMaterialVector("_Foam", oceanMaterial); | |||
foam.x = EditorGUILayout.Slider("Intensity", foam.x, 0.0F, 1.0F); | |||
foam.y = EditorGUILayout.Slider("Cutoff", foam.y, 0.0F, 1.0F); | |||
WaterEditorUtility.SetMaterialVector("_Foam", foam, oceanMaterial); | |||
} | |||
serObj.ApplyModifiedProperties(); | |||
} | |||
} |
@ -0,0 +1,8 @@ | |||
fileFormatVersion: 2 | |||
guid: 9c2c627f6fe3945b39581fc103d32251 | |||
MonoImporter: | |||
serializedVersion: 2 | |||
defaultReferences: [] | |||
executionOrder: 0 | |||
icon: {instanceID: 0} | |||
userData: |
@ -0,0 +1,75 @@ | |||
using UnityEngine; | |||
using UnityEditor; | |||
class WaterEditorUtility | |||
{ | |||
// helper functions to retrieve & set material values | |||
public static float GetMaterialFloat(System.String name, Material mat) { | |||
return mat.GetFloat(name); | |||
} | |||
public static void SetMaterialFloat(System.String name, float f, Material mat) { | |||
mat.SetFloat(name, f); | |||
} | |||
public static Color GetMaterialColor(System.String name, Material mat) { | |||
return mat.GetColor(name); | |||
} | |||
public static void SetMaterialColor(System.String name, Color color, Material mat) { | |||
mat.SetColor(name, color); | |||
} | |||
public static Vector4 GetMaterialVector(System.String name, Material mat) { | |||
return mat.GetVector(name); | |||
} | |||
public static void SetMaterialVector(System.String name, Vector4 vector, Material mat) { | |||
mat.SetVector(name, vector); | |||
} | |||
public static Texture GetMaterialTexture(System.String theName, Material mat) { | |||
return mat.GetTexture(theName); | |||
} | |||
public static void SetMaterialTexture(System.String theName, Texture parameter, Material mat) { | |||
mat.SetTexture(theName, parameter); | |||
} | |||
public static Material LocateValidWaterMaterial(Transform parent) | |||
{ | |||
if(parent.renderer && parent.renderer.sharedMaterial) | |||
return parent.renderer.sharedMaterial; | |||
foreach( Transform t in parent) | |||
{ | |||
if(t.renderer && t.renderer.sharedMaterial) | |||
return t.renderer.sharedMaterial; | |||
} | |||
return null; | |||
} | |||
public static void CurveGui (System.String name, SerializedObject serObj, Color color) | |||
{ | |||
AnimationCurve curve = new AnimationCurve(new Keyframe(0, 0.0f, 1.0f, 1.0f), new Keyframe(1, 1.0f, 1.0f, 1.0f)); | |||
curve = EditorGUILayout.CurveField(new GUIContent (name), curve, color, new Rect (0.0f,0.0f,1.0f,1.0f)); | |||
//if (GUI.changed) { | |||
// AnimationCurveChanged(((WaterBase)serObj.targetObject).sharedMaterial, curve); | |||
//((WaterBase)serObj.targetObject).gameObject.SendMessage ("AnimationCurveChanged", SendMessageOptions.DontRequireReceiver); | |||
//} | |||
} | |||
/* | |||
public static void AnimationCurveChanged(Material sharedMaterial, AnimationCurve fresnelCurve) | |||
{ | |||
Debug.Log("AnimationCurveChanged"); | |||
Texture2D fresnel = (Texture2D)sharedMaterial.GetTexture("_Fresnel"); | |||
if(!fresnel) | |||
fresnel = new Texture2D(256,1); | |||
for (int i = 0; i < 256; i++) | |||
{ | |||
float val = Mathf.Clamp01(fresnelCurve.Evaluate((float)i)/255.0f); | |||
Debug.Log(""+(((float)i)/255.0f) +": "+val); | |||
fresnel.SetPixel(i, 0, new Color(val,val,val,val)); | |||
} | |||
fresnel.Apply(); | |||
sharedMaterial.SetTexture("_Fresnel", fresnel); | |||
} */ | |||
} |
@ -0,0 +1,8 @@ | |||
fileFormatVersion: 2 | |||
guid: f67f2bac30f824d4f8270bb8bb0779df | |||
MonoImporter: | |||
serializedVersion: 2 | |||
defaultReferences: [] | |||
executionOrder: 0 | |||
icon: {instanceID: 0} | |||
userData: |
@ -0,0 +1,4 @@ | |||
fileFormatVersion: 2 | |||
guid: a2cdf2ef81f27984fa7b93bd6d364c16 | |||
NativeFormatImporter: | |||
userData: |
@ -0,0 +1,48 @@ | |||
using UnityEngine; | |||
using System.Collections; | |||
public class Patrol : MonoBehaviour { | |||
public float patrolDistance; | |||
public int waitTime; | |||
public float speed; | |||
public bool startRight; | |||
public int direction = 1; | |||
private Vector3 startPosition; | |||
private int curWait = 0; | |||
// Use this for initialization | |||
void Start () { | |||
startPosition = transform.position; | |||
if (!startRight) { | |||
transform.Rotate (Vector3.up * 180); | |||
direction *= -1; | |||
} | |||
} | |||
// Update is called once per frame | |||
void Update () { | |||
Vector3 curPosition = transform.position; | |||
Vector3 move = new Vector3(1, 0.0f ,0.0f); | |||
move.x *= speed; | |||
move *= direction; | |||
if (curWait == 0) { | |||
if (Mathf.Abs(startPosition.x - curPosition.x) < patrolDistance) | |||
transform.position += move; | |||
else | |||
curWait = waitTime; | |||
} else if (curWait == 1) { | |||
transform.Rotate (Vector3.up * 180); | |||
direction *= -1; | |||
transform.position -= move; | |||
curWait--; | |||
} else | |||
curWait--; | |||
} | |||
} |
@ -0,0 +1,8 @@ | |||
fileFormatVersion: 2 | |||
guid: afa701e8ac1b548478719de7f588c6d2 | |||
MonoImporter: | |||
serializedVersion: 2 | |||
defaultReferences: [] | |||
executionOrder: 0 | |||
icon: {instanceID: 0} | |||
userData: |
@ -0,0 +1,4 @@ | |||
fileFormatVersion: 2 | |||
guid: 09de098202ab0a7439f834e8df93e9d2 | |||
NativeFormatImporter: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: dc7abfa0435174ded902b073322d67cc | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,4 @@ | |||
fileFormatVersion: 2 | |||
guid: 9485b0c79d11e2e4d0007da98d76c639 | |||
NativeFormatImporter: | |||
userData: |
@ -0,0 +1,4 @@ | |||
fileFormatVersion: 2 | |||
guid: 6b436d069d11415d1100ab9b44295342 | |||
NativeFormatImporter: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 70a4c3571f5624280bd8605def97056d | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 706eadfad28bc4c1c9bb137b31052b14 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,4 @@ | |||
fileFormatVersion: 2 | |||
guid: 52b7d70b1de7c4ce09662b77c14d9fda | |||
NativeFormatImporter: | |||
userData: |
@ -0,0 +1,4 @@ | |||
fileFormatVersion: 2 | |||
guid: c55afdc4a8a3b4890b07cc7d176510bb | |||
NativeFormatImporter: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 2fd60b04f7c434a4dafd253d09bfa783 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 40b01469ebddf42bc84870ba2f3d8c4c | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,4 @@ | |||
fileFormatVersion: 2 | |||
guid: 30abebfd9bf1c49d8a2d26e61e66bc15 | |||
NativeFormatImporter: | |||
userData: |
@ -0,0 +1,68 @@ | |||
fileFormatVersion: 2 | |||
guid: ce8d79c79d11b8f9d00076e98d76c639 | |||
ModelImporter: | |||
serializedVersion: 16 | |||
fileIDToRecycleName: | |||
100000: //RootNode | |||
400000: //RootNode | |||
2300000: //RootNode | |||
3300000: //RootNode | |||
4300000: pPlane1 | |||
4300002: nurbsToPoly1 | |||
4300004: pCylinder1 | |||
4300006: waterPlaneMesh | |||
11100000: //RootNode | |||
materials: | |||
importMaterials: 1 | |||
materialName: 3 | |||
materialSearch: 1 | |||
animations: | |||
legacyGenerateAnimations: 0 | |||
bakeSimulation: 0 | |||
optimizeGameObjects: 0 | |||
motionNodeName: | |||
animationCompression: 1 | |||
animationRotationError: .5 | |||
animationPositionError: .5 | |||
animationScaleError: .5 | |||
animationWrapMode: 0 | |||
extraExposedTransformPaths: [] | |||
clipAnimations: [] | |||
isReadable: 1 | |||
meshes: | |||
lODScreenPercentages: [] | |||
globalScale: 1 | |||
meshCompression: 0 | |||
addColliders: 0 | |||
importBlendShapes: 1 | |||
swapUVChannels: 0 | |||
generateSecondaryUV: 0 | |||
useFileUnits: 1 | |||
optimizeMeshForGPU: 1 | |||
weldVertices: 1 | |||
secondaryUVAngleDistortion: 8 | |||
secondaryUVAreaDistortion: 15 | |||
secondaryUVHardAngle: 88 | |||
secondaryUVPackMargin: 4 | |||
tangentSpace: | |||
normalSmoothAngle: 60 | |||
splitTangentsAcrossUV: 0 | |||
normalImportMode: 0 | |||
tangentImportMode: 1 | |||
importAnimation: 1 | |||
copyAvatar: 0 | |||
humanDescription: | |||
human: [] | |||
skeleton: [] | |||
armTwist: .5 | |||
foreArmTwist: .5 | |||
upperLegTwist: .5 | |||
legTwist: .5 | |||
armStretch: .0500000007 | |||
legStretch: .0500000007 | |||
feetSpacing: 0 | |||
rootMotionBoneName: | |||
lastHumanDescriptionAvatarSource: {instanceID: 0} | |||
animationType: 1 | |||
additionalBone: 1 | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: ac85670a1b2274f22905d6a43940371a | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,32 @@ | |||
using UnityEngine; | |||
// Sets up transformation matrices to scale&scroll water waves | |||
// for the case where graphics card does not support vertex programs. | |||
[ExecuteInEditMode] | |||
public class WaterSimple : MonoBehaviour | |||
{ | |||
void Update() | |||
{ | |||
if( !GetComponent<Renderer>() ) | |||
return; | |||
Material mat = GetComponent<Renderer>().sharedMaterial; | |||
if( !mat ) | |||
return; | |||
Vector4 waveSpeed = mat.GetVector( "WaveSpeed" ); | |||
float waveScale = mat.GetFloat( "_WaveScale" ); | |||
float t = Time.time / 20.0f; | |||
Vector4 offset4 = waveSpeed * (t * waveScale); | |||
Vector4 offsetClamped = new Vector4(Mathf.Repeat(offset4.x,1.0f), Mathf.Repeat(offset4.y,1.0f), Mathf.Repeat(offset4.z,1.0f), Mathf.Repeat(offset4.w,1.0f)); | |||
mat.SetVector( "_WaveOffset", offsetClamped ); | |||
Vector3 scale = new Vector3( 1.0f/waveScale, 1.0f/waveScale, 1 ); | |||
Matrix4x4 scrollMatrix = Matrix4x4.TRS( new Vector3(offsetClamped.x,offsetClamped.y,0), Quaternion.identity, scale ); | |||
mat.SetMatrix( "_WaveMatrix", scrollMatrix ); | |||
scrollMatrix = Matrix4x4.TRS( new Vector3(offsetClamped.z,offsetClamped.w,0), Quaternion.identity, scale * 0.45f ); | |||
mat.SetMatrix( "_WaveMatrix2", scrollMatrix ); | |||
} | |||
} |
@ -0,0 +1,8 @@ | |||
fileFormatVersion: 2 | |||
guid: 0d2f50a8e0bb841a5aaa90ae55db8849 | |||
MonoImporter: | |||
serializedVersion: 2 | |||
defaultReferences: [] | |||
executionOrder: 0 | |||
icon: {instanceID: 0} | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: c8e96a067d1ef4982b454cf5a686f648 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,140 @@ | |||
Shader "FX/Water (simple)" { | |||
Properties { | |||
_horizonColor ("Horizon color", COLOR) = ( .172 , .463 , .435 , 0) | |||
_WaveScale ("Wave scale", Range (0.02,0.15)) = .07 | |||
_ColorControl ("Reflective color (RGB) fresnel (A) ", 2D) = "" { } | |||
_ColorControlCube ("Reflective color cube (RGB) fresnel (A) ", Cube) = "" { TexGen CubeReflect } | |||
_BumpMap ("Waves Normalmap ", 2D) = "" { } | |||
WaveSpeed ("Wave speed (map1 x,y; map2 x,y)", Vector) = (19,9,-16,-7) | |||
_MainTex ("Fallback texture", 2D) = "" { } | |||
} | |||
CGINCLUDE | |||
// ----------------------------------------------------------- | |||
// This section is included in all program sections below | |||
#include "UnityCG.cginc" | |||
uniform float4 _horizonColor; | |||
uniform float4 WaveSpeed; | |||
uniform float _WaveScale; | |||
uniform float4 _WaveOffset; | |||
struct appdata { | |||
float4 vertex : POSITION; | |||
float3 normal : NORMAL; | |||
}; | |||
struct v2f { | |||
float4 pos : SV_POSITION; | |||
float2 bumpuv[2] : TEXCOORD0; | |||
float3 viewDir : TEXCOORD2; | |||
}; | |||
v2f vert(appdata v) | |||
{ | |||
v2f o; | |||
float4 s; | |||
o.pos = mul (UNITY_MATRIX_MVP, v.vertex); | |||
// scroll bump waves | |||
float4 temp; | |||
temp.xyzw = v.vertex.xzxz * _WaveScale / unity_Scale.w + _WaveOffset; | |||
o.bumpuv[0] = temp.xy * float2(.4, .45); | |||
o.bumpuv[1] = temp.wz; | |||
// object space view direction | |||
o.viewDir.xzy = normalize( ObjSpaceViewDir(v.vertex) ); | |||
return o; | |||
} | |||
ENDCG | |||
// ----------------------------------------------------------- | |||
// Fragment program | |||
Subshader { | |||
Tags { "RenderType"="Opaque" } | |||
Pass { | |||
CGPROGRAM | |||
#pragma vertex vert | |||
#pragma fragment frag | |||
#pragma fragmentoption ARB_precision_hint_fastest | |||
sampler2D _BumpMap; | |||
sampler2D _ColorControl; | |||
half4 frag( v2f i ) : COLOR | |||
{ | |||
half3 bump1 = UnpackNormal(tex2D( _BumpMap, i.bumpuv[0] )).rgb; | |||
half3 bump2 = UnpackNormal(tex2D( _BumpMap, i.bumpuv[1] )).rgb; | |||
half3 bump = (bump1 + bump2) * 0.5; | |||
half fresnel = dot( i.viewDir, bump ); | |||
half4 water = tex2D( _ColorControl, float2(fresnel,fresnel) ); | |||
half4 col; | |||
col.rgb = lerp( water.rgb, _horizonColor.rgb, water.a ); | |||
col.a = _horizonColor.a; | |||
return col; | |||
} | |||
ENDCG | |||
} | |||
} | |||
// ----------------------------------------------------------- | |||
// Old cards | |||
// three texture, cubemaps | |||
Subshader { | |||
Tags { "RenderType"="Opaque" } | |||
Pass { | |||
Color (0.5,0.5,0.5,0.5) | |||
SetTexture [_MainTex] { | |||
Matrix [_WaveMatrix] | |||
combine texture * primary | |||
} | |||
SetTexture [_MainTex] { | |||
Matrix [_WaveMatrix2] | |||
combine texture * primary + previous | |||
} | |||
SetTexture [_ColorControlCube] { | |||
combine texture +- previous, primary | |||
Matrix [_Reflection] | |||
} | |||
} | |||
} | |||
// dual texture, cubemaps | |||
Subshader { | |||
Tags { "RenderType"="Opaque" } | |||
Pass { | |||
Color (0.5,0.5,0.5,0.5) | |||
SetTexture [_MainTex] { | |||
Matrix [_WaveMatrix] | |||
combine texture | |||
} | |||
SetTexture [_ColorControlCube] { | |||
combine texture +- previous, primary | |||
Matrix [_Reflection] | |||
} | |||
} | |||
} | |||
// single texture | |||
Subshader { | |||
Tags { "RenderType"="Opaque" } | |||
Pass { | |||
Color (0.5,0.5,0.5,0) | |||
SetTexture [_MainTex] { | |||
Matrix [_WaveMatrix] | |||
combine texture, primary | |||
} | |||
} | |||
} | |||
} |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 9dccc8e8f0da4494991c26ef59019551 | |||
ShaderImporter: | |||
defaultTextures: [] | |||
userData: |
@ -0,0 +1,4 @@ | |||
fileFormatVersion: 2 | |||
guid: 5421734063b66ee4f8a180ecae8132bc | |||
NativeFormatImporter: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 33850b67ffcaa4b6c9a7146e4be0b917 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,47 @@ | |||
fileFormatVersion: 2 | |||
guid: c2ef94ff9d11915d1100a04b44295342 | |||
TextureImporter: | |||
fileIDToRecycleName: {} | |||
serializedVersion: 2 | |||
mipmaps: | |||
mipMapMode: 0 | |||
enableMipMap: 1 | |||
linearTexture: 0 | |||
correctGamma: 0 | |||
fadeOut: 0 | |||
borderMipMap: 0 | |||
mipMapFadeDistanceStart: 2 | |||
mipMapFadeDistanceEnd: 3 | |||
bumpmap: | |||
convertToNormalMap: 0 | |||
externalNormalMap: 0 | |||
heightScale: .25 | |||
normalMapFilter: 0 | |||
isReadable: 0 | |||
grayScaleToAlpha: 0 | |||
generateCubemap: 0 | |||
seamlessCubemap: 0 | |||
textureFormat: -1 | |||
maxTextureSize: 512 | |||
textureSettings: | |||
filterMode: 1 | |||
aniso: 1 | |||
mipBias: 0 | |||
wrapMode: 0 | |||
nPOTScale: 1 | |||
lightmap: 0 | |||
compressionQuality: 50 | |||
spriteMode: 0 | |||
spriteExtrude: 1 | |||
spriteMeshType: 1 | |||
alignment: 0 | |||
spritePivot: {x: .5, y: .5} | |||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||
spritePixelsToUnits: 100 | |||
alphaIsTransparency: 0 | |||
textureType: 0 | |||
buildTargetSettings: [] | |||
spriteSheet: | |||
sprites: [] | |||
spritePackingTag: | |||
userData: |
@ -0,0 +1,47 @@ | |||
fileFormatVersion: 2 | |||
guid: a53cf5449d11a15d1100a04b44295342 | |||
TextureImporter: | |||
fileIDToRecycleName: {} | |||
serializedVersion: 2 | |||
mipmaps: | |||
mipMapMode: 0 | |||
enableMipMap: 1 | |||
linearTexture: 1 | |||
correctGamma: 0 | |||
fadeOut: 0 | |||
borderMipMap: 0 | |||
mipMapFadeDistanceStart: 2 | |||
mipMapFadeDistanceEnd: 3 | |||
bumpmap: | |||
convertToNormalMap: 1 | |||
externalNormalMap: 1 | |||
heightScale: .0164516103 | |||
normalMapFilter: 0 | |||
isReadable: 0 | |||
grayScaleToAlpha: 0 | |||
generateCubemap: 0 | |||
seamlessCubemap: 0 | |||
textureFormat: -1 | |||
maxTextureSize: 512 | |||
textureSettings: | |||
filterMode: 1 | |||
aniso: 3 | |||
mipBias: 0 | |||
wrapMode: 0 | |||
nPOTScale: 1 | |||
lightmap: 0 | |||
compressionQuality: 50 | |||
spriteMode: 0 | |||
spriteExtrude: 1 | |||
spriteMeshType: 1 | |||
alignment: 0 | |||
spritePivot: {x: .5, y: .5} | |||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||
spritePixelsToUnits: 100 | |||
alphaIsTransparency: 0 | |||
textureType: 1 | |||
buildTargetSettings: [] | |||
spriteSheet: | |||
sprites: [] | |||
spritePackingTag: | |||
userData: |
@ -0,0 +1,48 @@ | |||
fileFormatVersion: 2 | |||
guid: 006a5f739d1105f6a000538a2aef8c59 | |||
TextureImporter: | |||
fileIDToRecycleName: | |||
8900000: generatedCubemap | |||
serializedVersion: 2 | |||
mipmaps: | |||
mipMapMode: 0 | |||
enableMipMap: 1 | |||
linearTexture: 0 | |||
correctGamma: 0 | |||
fadeOut: 0 | |||
borderMipMap: 0 | |||
mipMapFadeDistanceStart: 2 | |||
mipMapFadeDistanceEnd: 3 | |||
bumpmap: | |||
convertToNormalMap: 0 | |||
externalNormalMap: 0 | |||
heightScale: .100000001 | |||
normalMapFilter: 0 | |||
isReadable: 0 | |||
grayScaleToAlpha: 0 | |||
generateCubemap: 3 | |||
seamlessCubemap: 0 | |||
textureFormat: -1 | |||
maxTextureSize: 32 | |||
textureSettings: | |||
filterMode: 1 | |||
aniso: 1 | |||
mipBias: 0 | |||
wrapMode: 0 | |||
nPOTScale: 0 | |||
lightmap: 0 | |||
compressionQuality: 50 | |||
spriteMode: 0 | |||
spriteExtrude: 1 | |||
spriteMeshType: 1 | |||
alignment: 0 | |||
spritePivot: {x: .5, y: .5} | |||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||
spritePixelsToUnits: 100 | |||
alphaIsTransparency: 0 | |||
textureType: -1 | |||
buildTargetSettings: [] | |||
spriteSheet: | |||
sprites: [] | |||
spritePackingTag: | |||
userData: |
@ -0,0 +1,47 @@ | |||
fileFormatVersion: 2 | |||
guid: 8403d3349d112ba4d000be1be39e7c39 | |||
TextureImporter: | |||
fileIDToRecycleName: {} | |||
serializedVersion: 2 | |||
mipmaps: | |||
mipMapMode: 0 | |||
enableMipMap: 1 | |||
linearTexture: 0 | |||
correctGamma: 0 | |||
fadeOut: 0 | |||
borderMipMap: 0 | |||
mipMapFadeDistanceStart: 2 | |||
mipMapFadeDistanceEnd: 3 | |||
bumpmap: | |||
convertToNormalMap: 0 | |||
externalNormalMap: 0 | |||
heightScale: .100000001 | |||
normalMapFilter: 0 | |||
isReadable: 0 | |||
grayScaleToAlpha: 0 | |||
generateCubemap: 0 | |||
seamlessCubemap: 0 | |||
textureFormat: -1 | |||
maxTextureSize: 32 | |||
textureSettings: | |||
filterMode: 1 | |||
aniso: 1 | |||
mipBias: 0 | |||
wrapMode: 1 | |||
nPOTScale: 1 | |||
lightmap: 0 | |||
compressionQuality: 50 | |||
spriteMode: 0 | |||
spriteExtrude: 1 | |||
spriteMeshType: 1 | |||
alignment: 0 | |||
spritePivot: {x: .5, y: .5} | |||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||
spritePixelsToUnits: 100 | |||
alphaIsTransparency: 0 | |||
textureType: 0 | |||
buildTargetSettings: [] | |||
spriteSheet: | |||
sprites: [] | |||
spritePackingTag: | |||
userData: |
@ -0,0 +1,47 @@ | |||
fileFormatVersion: 2 | |||
guid: 047330f39d11745ad0004adb8d76c639 | |||
TextureImporter: | |||
fileIDToRecycleName: {} | |||
serializedVersion: 2 | |||
mipmaps: | |||
mipMapMode: 0 | |||
enableMipMap: 1 | |||
linearTexture: 0 | |||
correctGamma: 0 | |||
fadeOut: 0 | |||
borderMipMap: 0 | |||
mipMapFadeDistanceStart: 2 | |||
mipMapFadeDistanceEnd: 3 | |||
bumpmap: | |||
convertToNormalMap: 0 | |||
externalNormalMap: 0 | |||
heightScale: .100000001 | |||
normalMapFilter: 0 | |||
isReadable: 0 | |||
grayScaleToAlpha: 0 | |||
generateCubemap: 0 | |||
seamlessCubemap: 0 | |||
textureFormat: -1 | |||
maxTextureSize: 32 | |||
textureSettings: | |||
filterMode: 1 | |||
aniso: 1 | |||
mipBias: 0 | |||
wrapMode: 1 | |||
nPOTScale: 1 | |||
lightmap: 0 | |||
compressionQuality: 50 | |||
spriteMode: 0 | |||
spriteExtrude: 1 | |||
spriteMeshType: 1 | |||
alignment: 0 | |||
spritePivot: {x: .5, y: .5} | |||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||
spritePixelsToUnits: 100 | |||
alphaIsTransparency: 0 | |||
textureType: 0 | |||
buildTargetSettings: [] | |||
spriteSheet: | |||
sprites: [] | |||
spritePackingTag: | |||
userData: |
@ -0,0 +1,48 @@ | |||
fileFormatVersion: 2 | |||
guid: 98c330f39d11745ad0004adb8d76c639 | |||
TextureImporter: | |||
fileIDToRecycleName: | |||
8900000: generatedCubemap | |||
serializedVersion: 2 | |||
mipmaps: | |||
mipMapMode: 0 | |||
enableMipMap: 1 | |||
linearTexture: 0 | |||
correctGamma: 0 | |||
fadeOut: 0 | |||
borderMipMap: 0 | |||
mipMapFadeDistanceStart: 2 | |||
mipMapFadeDistanceEnd: 3 | |||
bumpmap: | |||
convertToNormalMap: 0 | |||
externalNormalMap: 0 | |||
heightScale: .100000001 | |||
normalMapFilter: 0 | |||
isReadable: 0 | |||
grayScaleToAlpha: 0 | |||
generateCubemap: 3 | |||
seamlessCubemap: 0 | |||
textureFormat: 12 | |||
maxTextureSize: 32 | |||
textureSettings: | |||
filterMode: 1 | |||
aniso: 1 | |||
mipBias: 0 | |||
wrapMode: 0 | |||
nPOTScale: 0 | |||
lightmap: 0 | |||
compressionQuality: 50 | |||
spriteMode: 0 | |||
spriteExtrude: 1 | |||
spriteMeshType: 1 | |||
alignment: 0 | |||
spritePivot: {x: .5, y: .5} | |||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||
spritePixelsToUnits: 100 | |||
alphaIsTransparency: 0 | |||
textureType: -1 | |||
buildTargetSettings: [] | |||
spriteSheet: | |||
sprites: [] | |||
spritePackingTag: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 15577174a872740edb59495b6549a0c3 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,4 @@ | |||
fileFormatVersion: 2 | |||
guid: 780611a67e8e941a2b3aa96e5915a793 | |||
NativeFormatImporter: | |||
userData: |
@ -0,0 +1,4 @@ | |||
fileFormatVersion: 2 | |||
guid: bcae914220acd4907840a029bb9d9aec | |||
NativeFormatImporter: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 32569ca6b14e24176be40165ccaa300c | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 8269a010592f549af8f11b1683d9e794 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,4 @@ | |||
fileFormatVersion: 2 | |||
guid: ae162c0523ab4468bb03ef160eb672e2 | |||
NativeFormatImporter: | |||
userData: |
@ -0,0 +1,4 @@ | |||
fileFormatVersion: 2 | |||
guid: e633a20421c47426aa04444234225b69 | |||
NativeFormatImporter: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: fe5d00245bc1d42a7927f4b2879026b8 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 1e68e75546e8d4feab8846bfaf8878d3 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,4 @@ | |||
fileFormatVersion: 2 | |||
guid: 358a87f082de94ddd810e929c00c8594 | |||
NativeFormatImporter: | |||
userData: |
@ -0,0 +1,68 @@ | |||
fileFormatVersion: 2 | |||
guid: ba6a41dc489914734857bb5924eb70ad | |||
ModelImporter: | |||
serializedVersion: 16 | |||
fileIDToRecycleName: | |||
100000: //RootNode | |||
400000: //RootNode | |||
2300000: //RootNode | |||
3300000: //RootNode | |||
4300000: pPlane1 | |||
4300002: nurbsToPoly1 | |||
4300004: pCylinder1 | |||
4300006: waterPlaneMesh | |||
11100000: //RootNode | |||
materials: | |||
importMaterials: 1 | |||
materialName: 3 | |||
materialSearch: 1 | |||
animations: | |||
legacyGenerateAnimations: 0 | |||
bakeSimulation: 0 | |||
optimizeGameObjects: 0 | |||
motionNodeName: | |||
animationCompression: 1 | |||
animationRotationError: .5 | |||
animationPositionError: .5 | |||
animationScaleError: .5 | |||
animationWrapMode: 0 | |||
extraExposedTransformPaths: [] | |||
clipAnimations: [] | |||
isReadable: 1 | |||
meshes: | |||
lODScreenPercentages: [] | |||
globalScale: 1 | |||
meshCompression: 0 | |||
addColliders: 0 | |||
importBlendShapes: 1 | |||
swapUVChannels: 0 | |||
generateSecondaryUV: 0 | |||
useFileUnits: 1 | |||
optimizeMeshForGPU: 1 | |||
weldVertices: 1 | |||
secondaryUVAngleDistortion: 8 | |||
secondaryUVAreaDistortion: 15 | |||
secondaryUVHardAngle: 88 | |||
secondaryUVPackMargin: 4 | |||
tangentSpace: | |||
normalSmoothAngle: 60 | |||
splitTangentsAcrossUV: 0 | |||
normalImportMode: 0 | |||
tangentImportMode: 1 | |||
importAnimation: 1 | |||
copyAvatar: 0 | |||
humanDescription: | |||
human: [] | |||
skeleton: [] | |||
armTwist: .5 | |||
foreArmTwist: .5 | |||
upperLegTwist: .5 | |||
legTwist: .5 | |||
armStretch: .0500000007 | |||
legStretch: .0500000007 | |||
feetSpacing: 0 | |||
rootMotionBoneName: | |||
lastHumanDescriptionAvatarSource: {instanceID: 0} | |||
animationType: 1 | |||
additionalBone: 1 | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: b5b8c0f9acc2944f086c02cb83f4ae76 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,369 @@ | |||
using UnityEngine; | |||
using System.Collections; | |||
using System.Collections.Generic; | |||
[ExecuteInEditMode] // Make water live-update even when not in play mode | |||
public class Water : MonoBehaviour | |||
{ | |||
public enum WaterMode { | |||
Simple = 0, | |||
Reflective = 1, | |||
Refractive = 2, | |||
}; | |||
public WaterMode m_WaterMode = WaterMode.Refractive; | |||
public bool m_DisablePixelLights = true; | |||
public int m_TextureSize = 256; | |||
public float m_ClipPlaneOffset = 0.07f; | |||
public LayerMask m_ReflectLayers = -1; | |||
public LayerMask m_RefractLayers = -1; | |||
private Dictionary<Camera, Camera> m_ReflectionCameras = new Dictionary<Camera, Camera>(); // Camera -> Camera table | |||
private Dictionary<Camera, Camera> m_RefractionCameras = new Dictionary<Camera, Camera>(); // Camera -> Camera table | |||
private RenderTexture m_ReflectionTexture = null; | |||
private RenderTexture m_RefractionTexture = null; | |||
private WaterMode m_HardwareWaterSupport = WaterMode.Refractive; | |||
private int m_OldReflectionTextureSize = 0; | |||
private int m_OldRefractionTextureSize = 0; | |||
private static bool s_InsideWater = false; | |||
// This is called when it's known that the object will be rendered by some | |||
// camera. We render reflections / refractions and do other updates here. | |||
// Because the script executes in edit mode, reflections for the scene view | |||
// camera will just work! | |||
public void OnWillRenderObject() | |||
{ | |||
if( !enabled || !renderer || !renderer.sharedMaterial || !renderer.enabled ) | |||
return; | |||
Camera cam = Camera.current; | |||
if( !cam ) | |||
return; | |||
// Safeguard from recursive water reflections. | |||
if( s_InsideWater ) | |||
return; | |||
s_InsideWater = true; | |||
// Actual water rendering mode depends on both the current setting AND | |||
// the hardware support. There's no point in rendering refraction textures | |||
// if they won't be visible in the end. | |||
m_HardwareWaterSupport = FindHardwareWaterSupport(); | |||
WaterMode mode = GetWaterMode(); | |||
Camera reflectionCamera, refractionCamera; | |||
CreateWaterObjects( cam, out reflectionCamera, out refractionCamera ); | |||
// find out the reflection plane: position and normal in world space | |||
Vector3 pos = transform.position; | |||
Vector3 normal = transform.up; | |||
// Optionally disable pixel lights for reflection/refraction | |||
int oldPixelLightCount = QualitySettings.pixelLightCount; | |||
if( m_DisablePixelLights ) | |||
QualitySettings.pixelLightCount = 0; | |||
UpdateCameraModes( cam, reflectionCamera ); | |||
UpdateCameraModes( cam, refractionCamera ); | |||
// Render reflection if needed | |||
if( mode >= WaterMode.Reflective ) | |||
{ | |||
// Reflect camera around reflection plane | |||
float d = -Vector3.Dot (normal, pos) - m_ClipPlaneOffset; | |||
Vector4 reflectionPlane = new Vector4 (normal.x, normal.y, normal.z, d); | |||
Matrix4x4 reflection = Matrix4x4.zero; | |||
CalculateReflectionMatrix (ref reflection, reflectionPlane); | |||
Vector3 oldpos = cam.transform.position; | |||
Vector3 newpos = reflection.MultiplyPoint( oldpos ); | |||
reflectionCamera.worldToCameraMatrix = cam.worldToCameraMatrix * reflection; | |||
// Setup oblique projection matrix so that near plane is our reflection | |||
// plane. This way we clip everything below/above it for free. | |||
Vector4 clipPlane = CameraSpacePlane( reflectionCamera, pos, normal, 1.0f ); | |||
reflectionCamera.projectionMatrix = cam.CalculateObliqueMatrix(clipPlane); | |||
reflectionCamera.cullingMask = ~(1<<4) & m_ReflectLayers.value; // never render water layer | |||
reflectionCamera.targetTexture = m_ReflectionTexture; | |||
GL.SetRevertBackfacing (true); | |||
reflectionCamera.transform.position = newpos; | |||
Vector3 euler = cam.transform.eulerAngles; | |||
reflectionCamera.transform.eulerAngles = new Vector3(-euler.x, euler.y, euler.z); | |||
reflectionCamera.Render(); | |||
reflectionCamera.transform.position = oldpos; | |||
GL.SetRevertBackfacing (false); | |||
renderer.sharedMaterial.SetTexture( "_ReflectionTex", m_ReflectionTexture ); | |||
} | |||
// Render refraction | |||
if( mode >= WaterMode.Refractive ) | |||
{ | |||
refractionCamera.worldToCameraMatrix = cam.worldToCameraMatrix; | |||
// Setup oblique projection matrix so that near plane is our reflection | |||
// plane. This way we clip everything below/above it for free. | |||
Vector4 clipPlane = CameraSpacePlane( refractionCamera, pos, normal, -1.0f ); | |||
refractionCamera.projectionMatrix = cam.CalculateObliqueMatrix(clipPlane); | |||
refractionCamera.cullingMask = ~(1<<4) & m_RefractLayers.value; // never render water layer | |||
refractionCamera.targetTexture = m_RefractionTexture; | |||
refractionCamera.transform.position = cam.transform.position; | |||
refractionCamera.transform.rotation = cam.transform.rotation; | |||
refractionCamera.Render(); | |||
renderer.sharedMaterial.SetTexture( "_RefractionTex", m_RefractionTexture ); | |||
} | |||
// Restore pixel light count | |||
if( m_DisablePixelLights ) | |||
QualitySettings.pixelLightCount = oldPixelLightCount; | |||
// Setup shader keywords based on water mode | |||
switch( mode ) | |||
{ | |||
case WaterMode.Simple: | |||
Shader.EnableKeyword( "WATER_SIMPLE" ); | |||
Shader.DisableKeyword( "WATER_REFLECTIVE" ); | |||
Shader.DisableKeyword( "WATER_REFRACTIVE" ); | |||
break; | |||
case WaterMode.Reflective: | |||
Shader.DisableKeyword( "WATER_SIMPLE" ); | |||
Shader.EnableKeyword( "WATER_REFLECTIVE" ); | |||
Shader.DisableKeyword( "WATER_REFRACTIVE" ); | |||
break; | |||
case WaterMode.Refractive: | |||
Shader.DisableKeyword( "WATER_SIMPLE" ); | |||
Shader.DisableKeyword( "WATER_REFLECTIVE" ); | |||
Shader.EnableKeyword( "WATER_REFRACTIVE" ); | |||
break; | |||
} | |||
s_InsideWater = false; | |||
} | |||
// Cleanup all the objects we possibly have created | |||
void OnDisable() | |||
{ | |||
if( m_ReflectionTexture ) { | |||
DestroyImmediate( m_ReflectionTexture ); | |||
m_ReflectionTexture = null; | |||
} | |||
if( m_RefractionTexture ) { | |||
DestroyImmediate( m_RefractionTexture ); | |||
m_RefractionTexture = null; | |||
} | |||
foreach (KeyValuePair<Camera, Camera> kvp in m_ReflectionCameras) | |||
DestroyImmediate( (kvp.Value).gameObject ); | |||
m_ReflectionCameras.Clear(); | |||
foreach (KeyValuePair<Camera, Camera> kvp in m_RefractionCameras) | |||
DestroyImmediate( (kvp.Value).gameObject ); | |||
m_RefractionCameras.Clear(); | |||
} | |||
// This just sets up some matrices in the material; for really | |||
// old cards to make water texture scroll. | |||
void Update() | |||
{ | |||
if( !renderer ) | |||
return; | |||
Material mat = renderer.sharedMaterial; | |||
if( !mat ) | |||
return; | |||
Vector4 waveSpeed = mat.GetVector( "WaveSpeed" ); | |||
float waveScale = mat.GetFloat( "_WaveScale" ); | |||
Vector4 waveScale4 = new Vector4(waveScale, waveScale, waveScale * 0.4f, waveScale * 0.45f); | |||
// Time since level load, and do intermediate calculations with doubles | |||
double t = Time.timeSinceLevelLoad / 20.0; | |||
Vector4 offsetClamped = new Vector4( | |||
(float)System.Math.IEEERemainder(waveSpeed.x * waveScale4.x * t, 1.0), | |||
(float)System.Math.IEEERemainder(waveSpeed.y * waveScale4.y * t, 1.0), | |||
(float)System.Math.IEEERemainder(waveSpeed.z * waveScale4.z * t, 1.0), | |||
(float)System.Math.IEEERemainder(waveSpeed.w * waveScale4.w * t, 1.0) | |||
); | |||
mat.SetVector( "_WaveOffset", offsetClamped ); | |||
mat.SetVector( "_WaveScale4", waveScale4 ); | |||
Vector3 waterSize = renderer.bounds.size; | |||
Vector3 scale = new Vector3( waterSize.x*waveScale4.x, waterSize.z*waveScale4.y, 1 ); | |||
Matrix4x4 scrollMatrix = Matrix4x4.TRS( new Vector3(offsetClamped.x,offsetClamped.y,0), Quaternion.identity, scale ); | |||
mat.SetMatrix( "_WaveMatrix", scrollMatrix ); | |||
scale = new Vector3( waterSize.x*waveScale4.z, waterSize.z*waveScale4.w, 1 ); | |||
scrollMatrix = Matrix4x4.TRS( new Vector3(offsetClamped.z,offsetClamped.w,0), Quaternion.identity, scale ); | |||
mat.SetMatrix( "_WaveMatrix2", scrollMatrix ); | |||
} | |||
private void UpdateCameraModes( Camera src, Camera dest ) | |||
{ | |||
if( dest == null ) | |||
return; | |||
// set water camera to clear the same way as current camera | |||
dest.clearFlags = src.clearFlags; | |||
dest.backgroundColor = src.backgroundColor; | |||
if( src.clearFlags == CameraClearFlags.Skybox ) | |||
{ | |||
Skybox sky = src.GetComponent(typeof(Skybox)) as Skybox; | |||
Skybox mysky = dest.GetComponent(typeof(Skybox)) as Skybox; | |||
if( !sky || !sky.material ) | |||
{ | |||
mysky.enabled = false; | |||
} | |||
else | |||
{ | |||
mysky.enabled = true; | |||
mysky.material = sky.material; | |||
} | |||
} | |||
// update other values to match current camera. | |||
// even if we are supplying custom camera&projection matrices, | |||
// some of values are used elsewhere (e.g. skybox uses far plane) | |||
dest.farClipPlane = src.farClipPlane; | |||
dest.nearClipPlane = src.nearClipPlane; | |||
dest.orthographic = src.orthographic; | |||
dest.fieldOfView = src.fieldOfView; | |||
dest.aspect = src.aspect; | |||
dest.orthographicSize = src.orthographicSize; | |||
} | |||
// On-demand create any objects we need for water | |||
private void CreateWaterObjects( Camera currentCamera, out Camera reflectionCamera, out Camera refractionCamera ) | |||
{ | |||
WaterMode mode = GetWaterMode(); | |||
reflectionCamera = null; | |||
refractionCamera = null; | |||
if( mode >= WaterMode.Reflective ) | |||
{ | |||
// Reflection render texture | |||
if( !m_ReflectionTexture || m_OldReflectionTextureSize != m_TextureSize ) | |||
{ | |||
if( m_ReflectionTexture ) | |||
DestroyImmediate( m_ReflectionTexture ); | |||
m_ReflectionTexture = new RenderTexture( m_TextureSize, m_TextureSize, 16 ); | |||
m_ReflectionTexture.name = "__WaterReflection" + GetInstanceID(); | |||
m_ReflectionTexture.isPowerOfTwo = true; | |||
m_ReflectionTexture.hideFlags = HideFlags.DontSave; | |||
m_OldReflectionTextureSize = m_TextureSize; | |||
} | |||
// Camera for reflection | |||
m_ReflectionCameras.TryGetValue(currentCamera, out reflectionCamera); | |||
if (!reflectionCamera) // catch both not-in-dictionary and in-dictionary-but-deleted-GO | |||
{ | |||
GameObject go = new GameObject( "Water Refl Camera id" + GetInstanceID() + " for " + currentCamera.GetInstanceID(), typeof(Camera), typeof(Skybox) ); | |||
reflectionCamera = go.camera; | |||
reflectionCamera.enabled = false; | |||
reflectionCamera.transform.position = transform.position; | |||
reflectionCamera.transform.rotation = transform.rotation; | |||
reflectionCamera.gameObject.AddComponent("FlareLayer"); | |||
go.hideFlags = HideFlags.HideAndDontSave; | |||
m_ReflectionCameras[currentCamera] = reflectionCamera; | |||
} | |||
} | |||
if( mode >= WaterMode.Refractive ) | |||
{ | |||
// Refraction render texture | |||
if( !m_RefractionTexture || m_OldRefractionTextureSize != m_TextureSize ) | |||
{ | |||
if( m_RefractionTexture ) | |||
DestroyImmediate( m_RefractionTexture ); | |||
m_RefractionTexture = new RenderTexture( m_TextureSize, m_TextureSize, 16 ); | |||
m_RefractionTexture.name = "__WaterRefraction" + GetInstanceID(); | |||
m_RefractionTexture.isPowerOfTwo = true; | |||
m_RefractionTexture.hideFlags = HideFlags.DontSave; | |||
m_OldRefractionTextureSize = m_TextureSize; | |||
} | |||
// Camera for refraction | |||
m_RefractionCameras.TryGetValue(currentCamera, out refractionCamera); | |||
if (!refractionCamera) // catch both not-in-dictionary and in-dictionary-but-deleted-GO | |||
{ | |||
GameObject go = new GameObject( "Water Refr Camera id" + GetInstanceID() + " for " + currentCamera.GetInstanceID(), typeof(Camera), typeof(Skybox) ); | |||
refractionCamera = go.camera; | |||
refractionCamera.enabled = false; | |||
refractionCamera.transform.position = transform.position; | |||
refractionCamera.transform.rotation = transform.rotation; | |||
refractionCamera.gameObject.AddComponent("FlareLayer"); | |||
go.hideFlags = HideFlags.HideAndDontSave; | |||
m_RefractionCameras[currentCamera] = refractionCamera; | |||
} | |||
} | |||
} | |||
private WaterMode GetWaterMode() | |||
{ | |||
if( m_HardwareWaterSupport < m_WaterMode ) | |||
return m_HardwareWaterSupport; | |||
else | |||
return m_WaterMode; | |||
} | |||
private WaterMode FindHardwareWaterSupport() | |||
{ | |||
if( !SystemInfo.supportsRenderTextures || !renderer ) | |||
return WaterMode.Simple; | |||
Material mat = renderer.sharedMaterial; | |||
if( !mat ) | |||
return WaterMode.Simple; | |||
string mode = mat.GetTag("WATERMODE", false); | |||
if( mode == "Refractive" ) | |||
return WaterMode.Refractive; | |||
if( mode == "Reflective" ) | |||
return WaterMode.Reflective; | |||
return WaterMode.Simple; | |||
} | |||
// Extended sign: returns -1, 0 or 1 based on sign of a | |||
private static float sgn(float a) | |||
{ | |||
if (a > 0.0f) return 1.0f; | |||
if (a < 0.0f) return -1.0f; | |||
return 0.0f; | |||
} | |||
// Given position/normal of the plane, calculates plane in camera space. | |||
private Vector4 CameraSpacePlane (Camera cam, Vector3 pos, Vector3 normal, float sideSign) | |||
{ | |||
Vector3 offsetPos = pos + normal * m_ClipPlaneOffset; | |||
Matrix4x4 m = cam.worldToCameraMatrix; | |||
Vector3 cpos = m.MultiplyPoint( offsetPos ); | |||
Vector3 cnormal = m.MultiplyVector( normal ).normalized * sideSign; | |||
return new Vector4( cnormal.x, cnormal.y, cnormal.z, -Vector3.Dot(cpos,cnormal) ); | |||
} | |||
// Calculates reflection matrix around the given plane | |||
private static void CalculateReflectionMatrix (ref Matrix4x4 reflectionMat, Vector4 plane) | |||
{ | |||
reflectionMat.m00 = (1F - 2F*plane[0]*plane[0]); | |||
reflectionMat.m01 = ( - 2F*plane[0]*plane[1]); | |||
reflectionMat.m02 = ( - 2F*plane[0]*plane[2]); | |||
reflectionMat.m03 = ( - 2F*plane[3]*plane[0]); | |||
reflectionMat.m10 = ( - 2F*plane[1]*plane[0]); | |||
reflectionMat.m11 = (1F - 2F*plane[1]*plane[1]); | |||
reflectionMat.m12 = ( - 2F*plane[1]*plane[2]); | |||
reflectionMat.m13 = ( - 2F*plane[3]*plane[1]); | |||
reflectionMat.m20 = ( - 2F*plane[2]*plane[0]); | |||
reflectionMat.m21 = ( - 2F*plane[2]*plane[1]); | |||
reflectionMat.m22 = (1F - 2F*plane[2]*plane[2]); | |||
reflectionMat.m23 = ( - 2F*plane[3]*plane[2]); | |||
reflectionMat.m30 = 0F; | |||
reflectionMat.m31 = 0F; | |||
reflectionMat.m32 = 0F; | |||
reflectionMat.m33 = 1F; | |||
} | |||
} |
@ -0,0 +1,8 @@ | |||
fileFormatVersion: 2 | |||
guid: a3d3ef1a5bbfb4e0a910fbbe5830b1f9 | |||
MonoImporter: | |||
serializedVersion: 2 | |||
defaultReferences: [] | |||
executionOrder: 0 | |||
icon: {instanceID: 0} | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: e70b47c0cfc1d4b12a3c663d7582a523 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,211 @@ | |||
Shader "FX/Water" { | |||
Properties { | |||
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.063 | |||
_ReflDistort ("Reflection distort", Range (0,1.5)) = 0.44 | |||
_RefrDistort ("Refraction distort", Range (0,1.5)) = 0.40 | |||
_RefrColor ("Refraction color", COLOR) = ( .34, .85, .92, 1) | |||
_Fresnel ("Fresnel (A) ", 2D) = "gray" {} | |||
_BumpMap ("Normalmap ", 2D) = "bump" {} | |||
WaveSpeed ("Wave speed (map1 x,y; map2 x,y)", Vector) = (19,9,-16,-7) | |||
_ReflectiveColor ("Reflective color (RGB) fresnel (A) ", 2D) = "" {} | |||
_ReflectiveColorCube ("Reflective color cube (RGB) fresnel (A)", Cube) = "" { TexGen CubeReflect } | |||
_HorizonColor ("Simple water horizon color", COLOR) = ( .172, .463, .435, 1) | |||
_MainTex ("Fallback texture", 2D) = "" {} | |||
_ReflectionTex ("Internal Reflection", 2D) = "" {} | |||
_RefractionTex ("Internal Refraction", 2D) = "" {} | |||
} | |||
// ----------------------------------------------------------- | |||
// Fragment program cards | |||
Subshader { | |||
Tags { "WaterMode"="Refractive" "RenderType"="Opaque" } | |||
Pass { | |||
CGPROGRAM | |||
#pragma vertex vert | |||
#pragma fragment frag | |||
#pragma fragmentoption ARB_precision_hint_fastest | |||
#pragma multi_compile WATER_REFRACTIVE WATER_REFLECTIVE WATER_SIMPLE | |||
#if defined (WATER_REFLECTIVE) || defined (WATER_REFRACTIVE) | |||
#define HAS_REFLECTION 1 | |||
#endif | |||
#if defined (WATER_REFRACTIVE) | |||
#define HAS_REFRACTION 1 | |||
#endif | |||
#include "UnityCG.cginc" | |||
uniform float4 _WaveScale4; | |||
uniform float4 _WaveOffset; | |||
#if HAS_REFLECTION | |||
uniform float _ReflDistort; | |||
#endif | |||
#if HAS_REFRACTION | |||
uniform float _RefrDistort; | |||
#endif | |||
struct appdata { | |||
float4 vertex : POSITION; | |||
float3 normal : NORMAL; | |||
}; | |||
struct v2f { | |||
float4 pos : SV_POSITION; | |||
#if defined(HAS_REFLECTION) || defined(HAS_REFRACTION) | |||
float4 ref : TEXCOORD0; | |||
float2 bumpuv0 : TEXCOORD1; | |||
float2 bumpuv1 : TEXCOORD2; | |||
float3 viewDir : TEXCOORD3; | |||
#else | |||
float2 bumpuv0 : TEXCOORD0; | |||
float2 bumpuv1 : TEXCOORD1; | |||
float3 viewDir : TEXCOORD2; | |||
#endif | |||
}; | |||
v2f vert(appdata v) | |||
{ | |||
v2f o; | |||
o.pos = mul (UNITY_MATRIX_MVP, v.vertex); | |||
// scroll bump waves | |||
float4 temp; | |||
temp.xyzw = v.vertex.xzxz * _WaveScale4 / unity_Scale.w + _WaveOffset; | |||
o.bumpuv0 = temp.xy; | |||
o.bumpuv1 = temp.wz; | |||
// object space view direction (will normalize per pixel) | |||
o.viewDir.xzy = ObjSpaceViewDir(v.vertex); | |||
#if defined(HAS_REFLECTION) || defined(HAS_REFRACTION) | |||
o.ref = ComputeScreenPos(o.pos); | |||
#endif | |||
return o; | |||
} | |||
#if defined (WATER_REFLECTIVE) || defined (WATER_REFRACTIVE) | |||
sampler2D _ReflectionTex; | |||
#endif | |||
#if defined (WATER_REFLECTIVE) || defined (WATER_SIMPLE) | |||
sampler2D _ReflectiveColor; | |||
#endif | |||
#if defined (WATER_REFRACTIVE) | |||
sampler2D _Fresnel; | |||
sampler2D _RefractionTex; | |||
uniform float4 _RefrColor; | |||
#endif | |||
#if defined (WATER_SIMPLE) | |||
uniform float4 _HorizonColor; | |||
#endif | |||
sampler2D _BumpMap; | |||
half4 frag( v2f i ) : SV_Target | |||
{ | |||
i.viewDir = normalize(i.viewDir); | |||
// combine two scrolling bumpmaps into one | |||
half3 bump1 = UnpackNormal(tex2D( _BumpMap, i.bumpuv0 )).rgb; | |||
half3 bump2 = UnpackNormal(tex2D( _BumpMap, i.bumpuv1 )).rgb; | |||
half3 bump = (bump1 + bump2) * 0.5; | |||
// fresnel factor | |||
half fresnelFac = dot( i.viewDir, bump ); | |||
// perturb reflection/refraction UVs by bumpmap, and lookup colors | |||
#if HAS_REFLECTION | |||
float4 uv1 = i.ref; uv1.xy += bump * _ReflDistort; | |||
half4 refl = tex2Dproj( _ReflectionTex, UNITY_PROJ_COORD(uv1) ); | |||
#endif | |||
#if HAS_REFRACTION | |||
float4 uv2 = i.ref; uv2.xy -= bump * _RefrDistort; | |||
half4 refr = tex2Dproj( _RefractionTex, UNITY_PROJ_COORD(uv2) ) * _RefrColor; | |||
#endif | |||
// final color is between refracted and reflected based on fresnel | |||
half4 color; | |||
#if defined(WATER_REFRACTIVE) | |||
half fresnel = UNITY_SAMPLE_1CHANNEL( _Fresnel, float2(fresnelFac,fresnelFac) ); | |||
color = lerp( refr, refl, fresnel ); | |||
#endif | |||
#if defined(WATER_REFLECTIVE) | |||
half4 water = tex2D( _ReflectiveColor, float2(fresnelFac,fresnelFac) ); | |||
color.rgb = lerp( water.rgb, refl.rgb, water.a ); | |||
color.a = refl.a * water.a; | |||
#endif | |||
#if defined(WATER_SIMPLE) | |||
half4 water = tex2D( _ReflectiveColor, float2(fresnelFac,fresnelFac) ); | |||
color.rgb = lerp( water.rgb, _HorizonColor.rgb, water.a ); | |||
color.a = _HorizonColor.a; | |||
#endif | |||
return color; | |||
} | |||
ENDCG | |||
} | |||
} | |||
// ----------------------------------------------------------- | |||
// Old cards | |||
// three texture, cubemaps | |||
Subshader { | |||
Tags { "WaterMode"="Simple" "RenderType"="Opaque" } | |||
Pass { | |||
Color (0.5,0.5,0.5,0.5) | |||
SetTexture [_MainTex] { | |||
Matrix [_WaveMatrix] | |||
combine texture * primary | |||
} | |||
SetTexture [_MainTex] { | |||
Matrix [_WaveMatrix2] | |||
combine texture * primary + previous | |||
} | |||
SetTexture [_ReflectiveColorCube] { | |||
combine texture +- previous, primary | |||
Matrix [_Reflection] | |||
} | |||
} | |||
} | |||
// dual texture, cubemaps | |||
Subshader { | |||
Tags { "WaterMode"="Simple" "RenderType"="Opaque" } | |||
Pass { | |||
Color (0.5,0.5,0.5,0.5) | |||
SetTexture [_MainTex] { | |||
Matrix [_WaveMatrix] | |||
combine texture | |||
} | |||
SetTexture [_ReflectiveColorCube] { | |||
combine texture +- previous, primary | |||
Matrix [_Reflection] | |||
} | |||
} | |||
} | |||
// single texture | |||
Subshader { | |||
Tags { "WaterMode"="Simple" "RenderType"="Opaque" } | |||
Pass { | |||
Color (0.5,0.5,0.5,0) | |||
SetTexture [_MainTex] { | |||
Matrix [_WaveMatrix] | |||
combine texture, primary | |||
} | |||
} | |||
} | |||
} |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 1cac2e0bcc34e4b3cbb4bd85982eba83 | |||
ShaderImporter: | |||
defaultTextures: [] | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: c22094bc116524b2a95c9aae09278b22 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,47 @@ | |||
fileFormatVersion: 2 | |||
guid: 5b5c5575fd4c74abd9f7b30862fb76a3 | |||
TextureImporter: | |||
fileIDToRecycleName: {} | |||
serializedVersion: 2 | |||
mipmaps: | |||
mipMapMode: 0 | |||
enableMipMap: 1 | |||
linearTexture: 0 | |||
correctGamma: 0 | |||
fadeOut: 0 | |||
borderMipMap: 0 | |||
mipMapFadeDistanceStart: 2 | |||
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: 0 | |||
wrapMode: 0 | |||
nPOTScale: 0 | |||
lightmap: 0 | |||
compressionQuality: 50 | |||
spriteMode: 0 | |||
spriteExtrude: 1 | |||
spriteMeshType: 1 | |||
alignment: 0 | |||
spritePivot: {x: .5, y: .5} | |||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||
spritePixelsToUnits: 100 | |||
alphaIsTransparency: 0 | |||
textureType: -1 | |||
buildTargetSettings: [] | |||
spriteSheet: | |||
sprites: [] | |||
spritePackingTag: | |||
userData: |
@ -0,0 +1,47 @@ | |||
fileFormatVersion: 2 | |||
guid: e6f8288974c664a309d6c66de636978c | |||
TextureImporter: | |||
fileIDToRecycleName: {} | |||
serializedVersion: 2 | |||
mipmaps: | |||
mipMapMode: 0 | |||
enableMipMap: 1 | |||
linearTexture: 0 | |||
correctGamma: 0 | |||
fadeOut: 0 | |||
borderMipMap: 0 | |||
mipMapFadeDistanceStart: 2 | |||
mipMapFadeDistanceEnd: 3 | |||
bumpmap: | |||
convertToNormalMap: 0 | |||
externalNormalMap: 0 | |||
heightScale: .25 | |||
normalMapFilter: 0 | |||
isReadable: 0 | |||
grayScaleToAlpha: 0 | |||
generateCubemap: 0 | |||
seamlessCubemap: 0 | |||
textureFormat: -1 | |||
maxTextureSize: 512 | |||
textureSettings: | |||
filterMode: 1 | |||
aniso: 1 | |||
mipBias: 0 | |||
wrapMode: 0 | |||
nPOTScale: 1 | |||
lightmap: 0 | |||
compressionQuality: 50 | |||
spriteMode: 0 | |||
spriteExtrude: 1 | |||
spriteMeshType: 1 | |||
alignment: 0 | |||
spritePivot: {x: .5, y: .5} | |||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||
spritePixelsToUnits: 100 | |||
alphaIsTransparency: 0 | |||
textureType: 0 | |||
buildTargetSettings: [] | |||
spriteSheet: | |||
sprites: [] | |||
spritePackingTag: | |||
userData: |
@ -0,0 +1,47 @@ | |||
fileFormatVersion: 2 | |||
guid: 2dd3788f8589b40bf82a92d76ffc5091 | |||
TextureImporter: | |||
fileIDToRecycleName: {} | |||
serializedVersion: 2 | |||
mipmaps: | |||
mipMapMode: 0 | |||
enableMipMap: 1 | |||
linearTexture: 1 | |||
correctGamma: 0 | |||
fadeOut: 0 | |||
borderMipMap: 0 | |||
mipMapFadeDistanceStart: 2 | |||
mipMapFadeDistanceEnd: 3 | |||
bumpmap: | |||
convertToNormalMap: 1 | |||
externalNormalMap: 1 | |||
heightScale: .0164516103 | |||
normalMapFilter: 0 | |||
isReadable: 0 | |||
grayScaleToAlpha: 0 | |||
generateCubemap: 0 | |||
seamlessCubemap: 0 | |||
textureFormat: -1 | |||
maxTextureSize: 512 | |||
textureSettings: | |||
filterMode: 1 | |||
aniso: 3 | |||
mipBias: 0 | |||
wrapMode: 0 | |||
nPOTScale: 1 | |||
lightmap: 0 | |||
compressionQuality: 50 | |||
spriteMode: 0 | |||
spriteExtrude: 1 | |||
spriteMeshType: 1 | |||
alignment: 0 | |||
spritePivot: {x: .5, y: .5} | |||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||
spritePixelsToUnits: 100 | |||
alphaIsTransparency: 0 | |||
textureType: 1 | |||
buildTargetSettings: [] | |||
spriteSheet: | |||
sprites: [] | |||
spritePackingTag: | |||
userData: |
@ -0,0 +1,48 @@ | |||
fileFormatVersion: 2 | |||
guid: 15c6acc4f11254a04b03849245d80574 | |||
TextureImporter: | |||
fileIDToRecycleName: | |||
8900000: generatedCubemap | |||
serializedVersion: 2 | |||
mipmaps: | |||
mipMapMode: 0 | |||
enableMipMap: 1 | |||
linearTexture: 0 | |||
correctGamma: 0 | |||
fadeOut: 0 | |||
borderMipMap: 0 | |||
mipMapFadeDistanceStart: 2 | |||
mipMapFadeDistanceEnd: 3 | |||
bumpmap: | |||
convertToNormalMap: 0 | |||
externalNormalMap: 0 | |||
heightScale: .100000001 | |||
normalMapFilter: 0 | |||
isReadable: 0 | |||
grayScaleToAlpha: 0 | |||
generateCubemap: 3 | |||
seamlessCubemap: 0 | |||
textureFormat: -1 | |||
maxTextureSize: 32 | |||
textureSettings: | |||
filterMode: 1 | |||
aniso: 1 | |||
mipBias: 0 | |||
wrapMode: 0 | |||
nPOTScale: 0 | |||
lightmap: 0 | |||
compressionQuality: 50 | |||
spriteMode: 0 | |||
spriteExtrude: 1 | |||
spriteMeshType: 1 | |||
alignment: 0 | |||
spritePivot: {x: .5, y: .5} | |||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||
spritePixelsToUnits: 100 | |||
alphaIsTransparency: 0 | |||
textureType: -1 | |||
buildTargetSettings: [] | |||
spriteSheet: | |||
sprites: [] | |||
spritePackingTag: | |||
userData: |
@ -0,0 +1,47 @@ | |||
fileFormatVersion: 2 | |||
guid: b725b62cfc9d04e4886735ab2a8107d1 | |||
TextureImporter: | |||
fileIDToRecycleName: {} | |||
serializedVersion: 2 | |||
mipmaps: | |||
mipMapMode: 0 | |||
enableMipMap: 1 | |||
linearTexture: 0 | |||
correctGamma: 0 | |||
fadeOut: 0 | |||
borderMipMap: 0 | |||
mipMapFadeDistanceStart: 2 | |||
mipMapFadeDistanceEnd: 3 | |||
bumpmap: | |||
convertToNormalMap: 0 | |||
externalNormalMap: 0 | |||
heightScale: .100000001 | |||
normalMapFilter: 0 | |||
isReadable: 0 | |||
grayScaleToAlpha: 0 | |||
generateCubemap: 0 | |||
seamlessCubemap: 0 | |||
textureFormat: -1 | |||
maxTextureSize: 32 | |||
textureSettings: | |||
filterMode: 1 | |||
aniso: 1 | |||
mipBias: 0 | |||
wrapMode: 1 | |||
nPOTScale: 1 | |||
lightmap: 0 | |||
compressionQuality: 50 | |||
spriteMode: 0 | |||
spriteExtrude: 1 | |||
spriteMeshType: 1 | |||
alignment: 0 | |||
spritePivot: {x: .5, y: .5} | |||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||
spritePixelsToUnits: 100 | |||
alphaIsTransparency: 0 | |||
textureType: 0 | |||
buildTargetSettings: [] | |||
spriteSheet: | |||
sprites: [] | |||
spritePackingTag: | |||
userData: |
@ -0,0 +1,47 @@ | |||
fileFormatVersion: 2 | |||
guid: 17680dc3bf8f74b498b01cf1481e2593 | |||
TextureImporter: | |||
fileIDToRecycleName: {} | |||
serializedVersion: 2 | |||
mipmaps: | |||
mipMapMode: 0 | |||
enableMipMap: 1 | |||
linearTexture: 0 | |||
correctGamma: 0 | |||
fadeOut: 0 | |||
borderMipMap: 0 | |||
mipMapFadeDistanceStart: 2 | |||
mipMapFadeDistanceEnd: 3 | |||
bumpmap: | |||
convertToNormalMap: 0 | |||
externalNormalMap: 0 | |||
heightScale: .100000001 | |||
normalMapFilter: 0 | |||
isReadable: 0 | |||
grayScaleToAlpha: 0 | |||
generateCubemap: 0 | |||
seamlessCubemap: 0 | |||
textureFormat: -1 | |||
maxTextureSize: 32 | |||
textureSettings: | |||
filterMode: 1 | |||
aniso: 1 | |||
mipBias: 0 | |||
wrapMode: 1 | |||
nPOTScale: 1 | |||
lightmap: 0 | |||
compressionQuality: 50 | |||
spriteMode: 0 | |||
spriteExtrude: 1 | |||
spriteMeshType: 1 | |||
alignment: 0 | |||
spritePivot: {x: .5, y: .5} | |||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||
spritePixelsToUnits: 100 | |||
alphaIsTransparency: 0 | |||
textureType: 0 | |||
buildTargetSettings: [] | |||
spriteSheet: | |||
sprites: [] | |||
spritePackingTag: | |||
userData: |
@ -0,0 +1,48 @@ | |||
fileFormatVersion: 2 | |||
guid: 9cda328e4b6954d70841a8a66f42ec08 | |||
TextureImporter: | |||
fileIDToRecycleName: | |||
8900000: generatedCubemap | |||
serializedVersion: 2 | |||
mipmaps: | |||
mipMapMode: 0 | |||
enableMipMap: 1 | |||
linearTexture: 0 | |||
correctGamma: 0 | |||
fadeOut: 0 | |||
borderMipMap: 0 | |||
mipMapFadeDistanceStart: 2 | |||
mipMapFadeDistanceEnd: 3 | |||
bumpmap: | |||
convertToNormalMap: 0 | |||
externalNormalMap: 0 | |||
heightScale: .100000001 | |||
normalMapFilter: 0 | |||
isReadable: 0 | |||
grayScaleToAlpha: 0 | |||
generateCubemap: 3 | |||
seamlessCubemap: 0 | |||
textureFormat: 12 | |||
maxTextureSize: 32 | |||
textureSettings: | |||
filterMode: 1 | |||
aniso: 1 | |||
mipBias: 0 | |||
wrapMode: 0 | |||
nPOTScale: 0 | |||
lightmap: 0 | |||
compressionQuality: 50 | |||
spriteMode: 0 | |||
spriteExtrude: 1 | |||
spriteMeshType: 1 | |||
alignment: 0 | |||
spritePivot: {x: .5, y: .5} | |||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||
spritePixelsToUnits: 100 | |||
alphaIsTransparency: 0 | |||
textureType: -1 | |||
buildTargetSettings: [] | |||
spriteSheet: | |||
sprites: [] | |||
spritePackingTag: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 17e234879cb994b7f93d7437c10d23d6 | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |
@ -0,0 +1,5 @@ | |||
fileFormatVersion: 2 | |||
guid: 7097f369c5ba74821bd76c430889322a | |||
folderAsset: yes | |||
DefaultImporter: | |||
userData: |