From a575c5b38b8d954ddbedcca4a63de73e228dad18 Mon Sep 17 00:00:00 2001 From: Yannick Date: Tue, 4 Oct 2016 08:10:51 +0200 Subject: [PATCH] Refactoring: The new material system is stable --- Assets/Materials.meta | 9 ++ Assets/{Prefabs => Materials}/Sky.mat | 0 Assets/{Prefabs => Materials}/Sky.mat.meta | 0 Assets/{Libraries.meta => Plugins.meta} | 0 Assets/{Libraries => Plugins}/MP3Sharp.dll | Bin .../{Libraries => Plugins}/MP3Sharp.dll.meta | 0 Assets/Prefabs/TESUnity.prefab | 21 +-- Assets/Resources.meta | 9 ++ Assets/Resources/Materials.meta | 9 ++ Assets/Resources/Materials/BumpedDiffuse.mat | 145 +++++++++++++++++ .../Materials/BumpedDiffuse.mat.meta} | 0 .../Materials/BumpedDiffuseTransCutout.mat | 145 +++++++++++++++++ .../BumpedDiffuseTransCutout.mat.meta | 8 + Assets/Resources/Materials/Standard.mat | 145 +++++++++++++++++ Assets/Resources/Materials/Standard.mat.meta | 8 + Assets/Resources/Materials/StandardCutout.mat | 146 ++++++++++++++++++ .../Materials/StandardCutout.mat.meta | 8 + Assets/Resources/Materials/Unlit.mat | 145 +++++++++++++++++ Assets/Resources/Materials/Unlit.mat.meta | 8 + .../Materials/UnlitTransparentCutout.mat} | 4 +- .../Materials/UnlitTransparentCutout.mat.meta | 8 + Assets/Scenes/Scene.unity | 22 ++- Assets/Scripts/Core/GUIUtils.cs | 8 +- .../TES/{Materials => }/MaterialManager.cs | 18 +-- .../{Materials => }/MaterialManager.cs.meta | 0 .../Scripts/TES/Materials/MWBaseMaterial.cs | 3 + .../TES/Materials/MWBumpedDiffuseMaterial.cs | 5 +- .../TES/Materials/MWDefaultMaterial.cs | 3 + .../TES/Materials/MWStandardMaterial.cs | 59 ++++--- .../Scripts/TES/Materials/MWUnlitMaterial.cs | 6 +- Assets/Scripts/TES/PathSelectionComponent.cs | 16 +- README.md | 61 ++++---- 32 files changed, 931 insertions(+), 88 deletions(-) create mode 100644 Assets/Materials.meta rename Assets/{Prefabs => Materials}/Sky.mat (100%) rename Assets/{Prefabs => Materials}/Sky.mat.meta (100%) rename Assets/{Libraries.meta => Plugins.meta} (100%) rename Assets/{Libraries => Plugins}/MP3Sharp.dll (100%) rename Assets/{Libraries => Plugins}/MP3Sharp.dll.meta (100%) create mode 100644 Assets/Resources.meta create mode 100644 Assets/Resources/Materials.meta create mode 100644 Assets/Resources/Materials/BumpedDiffuse.mat rename Assets/{Prefabs/Sky 1.mat.meta => Resources/Materials/BumpedDiffuse.mat.meta} (100%) create mode 100644 Assets/Resources/Materials/BumpedDiffuseTransCutout.mat create mode 100644 Assets/Resources/Materials/BumpedDiffuseTransCutout.mat.meta create mode 100644 Assets/Resources/Materials/Standard.mat create mode 100644 Assets/Resources/Materials/Standard.mat.meta create mode 100644 Assets/Resources/Materials/StandardCutout.mat create mode 100644 Assets/Resources/Materials/StandardCutout.mat.meta create mode 100644 Assets/Resources/Materials/Unlit.mat create mode 100644 Assets/Resources/Materials/Unlit.mat.meta rename Assets/{Prefabs/Sky 1.mat => Resources/Materials/UnlitTransparentCutout.mat} (96%) create mode 100644 Assets/Resources/Materials/UnlitTransparentCutout.mat.meta rename Assets/Scripts/TES/{Materials => }/MaterialManager.cs (74%) rename Assets/Scripts/TES/{Materials => }/MaterialManager.cs.meta (100%) diff --git a/Assets/Materials.meta b/Assets/Materials.meta new file mode 100644 index 0000000..daabf12 --- /dev/null +++ b/Assets/Materials.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b20b7eb76671f0b4388312a71c581a81 +folderAsset: yes +timeCreated: 1475518284 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Sky.mat b/Assets/Materials/Sky.mat similarity index 100% rename from Assets/Prefabs/Sky.mat rename to Assets/Materials/Sky.mat diff --git a/Assets/Prefabs/Sky.mat.meta b/Assets/Materials/Sky.mat.meta similarity index 100% rename from Assets/Prefabs/Sky.mat.meta rename to Assets/Materials/Sky.mat.meta diff --git a/Assets/Libraries.meta b/Assets/Plugins.meta similarity index 100% rename from Assets/Libraries.meta rename to Assets/Plugins.meta diff --git a/Assets/Libraries/MP3Sharp.dll b/Assets/Plugins/MP3Sharp.dll similarity index 100% rename from Assets/Libraries/MP3Sharp.dll rename to Assets/Plugins/MP3Sharp.dll diff --git a/Assets/Libraries/MP3Sharp.dll.meta b/Assets/Plugins/MP3Sharp.dll.meta similarity index 100% rename from Assets/Libraries/MP3Sharp.dll.meta rename to Assets/Plugins/MP3Sharp.dll.meta diff --git a/Assets/Prefabs/TESUnity.prefab b/Assets/Prefabs/TESUnity.prefab index 40c1dc3..25ec4f3 100644 --- a/Assets/Prefabs/TESUnity.prefab +++ b/Assets/Prefabs/TESUnity.prefab @@ -5,11 +5,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 477232} - - 114: {fileID: 11482094} - - 114: {fileID: 11464354} + - component: {fileID: 477232} + - component: {fileID: 11482094} + - component: {fileID: 11464354} m_Layer: 0 m_Name: TESUnity m_TagString: Untagged @@ -26,10 +26,10 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &11464354 MonoBehaviour: m_ObjectHideFlags: 1 @@ -43,13 +43,14 @@ MonoBehaviour: m_EditorClassIdentifier: dataPath: useKinematicRigidbodies: 1 - music: 1 + playMusic: 1 ambientIntensity: 1.5 - sunShadows: 0 - lightShadows: 0 + renderSunShadows: 0 + renderLightShadows: 0 + materialType: 2 renderPath: 1 - exteriorCellLights: 0 - animatedLights: 0 + renderExteriorCellLights: 0 + animateLights: 0 UIBackgroundImg: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} UICheckmarkImg: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} UIDropdownArrowImg: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} diff --git a/Assets/Resources.meta b/Assets/Resources.meta new file mode 100644 index 0000000..7391d63 --- /dev/null +++ b/Assets/Resources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 42c77ec87d7d5044daeedba71d9d3ee3 +folderAsset: yes +timeCreated: 1475517851 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Materials.meta b/Assets/Resources/Materials.meta new file mode 100644 index 0000000..fb3cae6 --- /dev/null +++ b/Assets/Resources/Materials.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fe0a5cfa7842c23419b51207ffabb53a +folderAsset: yes +timeCreated: 1475517876 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Materials/BumpedDiffuse.mat b/Assets/Resources/Materials/BumpedDiffuse.mat new file mode 100644 index 0000000..0387b1a --- /dev/null +++ b/Assets/Resources/Materials/BumpedDiffuse.mat @@ -0,0 +1,145 @@ +%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: BumpedDiffuse + m_Shader: {fileID: 2, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION _SUNDISK_HIGH_QUALITY + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: fb6566c21f717904f83743a5a76dd0b0, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: aa289c60f7cd0fd4390d5684283f8f4a, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _AtmosphereThickness + second: 1 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _Exposure + second: 1.3 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0.063 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _SunDisk + second: 2 + - first: + name: _SunSize + second: 0.04 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _GroundColor + second: {r: 0.369, g: 0.349, b: 0.341, a: 1} + - first: + name: _SkyTint + second: {r: 0.5, g: 0.5, b: 0.5, a: 1} diff --git a/Assets/Prefabs/Sky 1.mat.meta b/Assets/Resources/Materials/BumpedDiffuse.mat.meta similarity index 100% rename from Assets/Prefabs/Sky 1.mat.meta rename to Assets/Resources/Materials/BumpedDiffuse.mat.meta diff --git a/Assets/Resources/Materials/BumpedDiffuseTransCutout.mat b/Assets/Resources/Materials/BumpedDiffuseTransCutout.mat new file mode 100644 index 0000000..0514d9f --- /dev/null +++ b/Assets/Resources/Materials/BumpedDiffuseTransCutout.mat @@ -0,0 +1,145 @@ +%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: BumpedDiffuseTransCutout + m_Shader: {fileID: 52, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION _SUNDISK_HIGH_QUALITY + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: fb6566c21f717904f83743a5a76dd0b0, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: aa289c60f7cd0fd4390d5684283f8f4a, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _AtmosphereThickness + second: 1 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _Exposure + second: 1.3 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0.063 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _SunDisk + second: 2 + - first: + name: _SunSize + second: 0.04 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _GroundColor + second: {r: 0.369, g: 0.349, b: 0.341, a: 1} + - first: + name: _SkyTint + second: {r: 0.5, g: 0.5, b: 0.5, a: 1} diff --git a/Assets/Resources/Materials/BumpedDiffuseTransCutout.mat.meta b/Assets/Resources/Materials/BumpedDiffuseTransCutout.mat.meta new file mode 100644 index 0000000..8b83146 --- /dev/null +++ b/Assets/Resources/Materials/BumpedDiffuseTransCutout.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 99a0e20f0a18120478fa6762b1153269 +timeCreated: 1475518231 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Materials/Standard.mat b/Assets/Resources/Materials/Standard.mat new file mode 100644 index 0000000..6c4f44b --- /dev/null +++ b/Assets/Resources/Materials/Standard.mat @@ -0,0 +1,145 @@ +%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: Standard + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION _NORMALMAP _SUNDISK_HIGH_QUALITY + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: fb6566c21f717904f83743a5a76dd0b0, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _AtmosphereThickness + second: 1 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _Exposure + second: 1.3 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0.063 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _SunDisk + second: 2 + - first: + name: _SunSize + second: 0.04 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _GroundColor + second: {r: 0.369, g: 0.349, b: 0.341, a: 1} + - first: + name: _SkyTint + second: {r: 0.5, g: 0.5, b: 0.5, a: 1} diff --git a/Assets/Resources/Materials/Standard.mat.meta b/Assets/Resources/Materials/Standard.mat.meta new file mode 100644 index 0000000..3cc5f62 --- /dev/null +++ b/Assets/Resources/Materials/Standard.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aa59a264c07340745a94d005661b3199 +timeCreated: 1475517819 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Materials/StandardCutout.mat b/Assets/Resources/Materials/StandardCutout.mat new file mode 100644 index 0000000..262f63b --- /dev/null +++ b/Assets/Resources/Materials/StandardCutout.mat @@ -0,0 +1,146 @@ +%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: StandardCutout + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHATEST_ON _EMISSION _SUNDISK_HIGH_QUALITY + m_LightmapFlags: 1 + m_CustomRenderQueue: 2450 + stringTagMap: + RenderType: TransparentCutout + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _AtmosphereThickness + second: 1 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _Exposure + second: 1.3 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0.063 + - first: + name: _Mode + second: 1 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _SunDisk + second: 2 + - first: + name: _SunSize + second: 0.04 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _GroundColor + second: {r: 0.369, g: 0.349, b: 0.341, a: 1} + - first: + name: _SkyTint + second: {r: 0.5, g: 0.5, b: 0.5, a: 1} diff --git a/Assets/Resources/Materials/StandardCutout.mat.meta b/Assets/Resources/Materials/StandardCutout.mat.meta new file mode 100644 index 0000000..f9b9bc3 --- /dev/null +++ b/Assets/Resources/Materials/StandardCutout.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4b4a867e70d287049b29e4be8887252d +timeCreated: 1475520557 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Materials/Unlit.mat b/Assets/Resources/Materials/Unlit.mat new file mode 100644 index 0000000..de9eca5 --- /dev/null +++ b/Assets/Resources/Materials/Unlit.mat @@ -0,0 +1,145 @@ +%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: Unlit + m_Shader: {fileID: 10752, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION _SUNDISK_HIGH_QUALITY + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: aa289c60f7cd0fd4390d5684283f8f4a, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _AtmosphereThickness + second: 1 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _Exposure + second: 1.3 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0.063 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _SunDisk + second: 2 + - first: + name: _SunSize + second: 0.04 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _GroundColor + second: {r: 0.369, g: 0.349, b: 0.341, a: 1} + - first: + name: _SkyTint + second: {r: 0.5, g: 0.5, b: 0.5, a: 1} diff --git a/Assets/Resources/Materials/Unlit.mat.meta b/Assets/Resources/Materials/Unlit.mat.meta new file mode 100644 index 0000000..dfcb51c --- /dev/null +++ b/Assets/Resources/Materials/Unlit.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2fb90c2aec3c6134fbe9ac9f2b8fb820 +timeCreated: 1475517812 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Sky 1.mat b/Assets/Resources/Materials/UnlitTransparentCutout.mat similarity index 96% rename from Assets/Prefabs/Sky 1.mat rename to Assets/Resources/Materials/UnlitTransparentCutout.mat index 291a4ca..0307aaa 100644 --- a/Assets/Prefabs/Sky 1.mat +++ b/Assets/Resources/Materials/UnlitTransparentCutout.mat @@ -6,7 +6,7 @@ Material: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_Name: Sky 1 + m_Name: UnlitTransparentCutout m_Shader: {fileID: 10751, guid: 0000000000000000f000000000000000, type: 0} m_ShaderKeywords: _EMISSION _SUNDISK_HIGH_QUALITY m_LightmapFlags: 1 @@ -48,7 +48,7 @@ Material: - first: name: _MainTex second: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: aa289c60f7cd0fd4390d5684283f8f4a, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - first: diff --git a/Assets/Resources/Materials/UnlitTransparentCutout.mat.meta b/Assets/Resources/Materials/UnlitTransparentCutout.mat.meta new file mode 100644 index 0000000..1d3392d --- /dev/null +++ b/Assets/Resources/Materials/UnlitTransparentCutout.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4e2254165450b2f4cb8c16530e57d347 +timeCreated: 1475518196 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Scene.unity b/Assets/Scenes/Scene.unity index 82101d7..035e80d 100644 --- a/Assets/Scenes/Scene.unity +++ b/Assets/Scenes/Scene.unity @@ -37,7 +37,7 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.37311867, g: 0.38073912, b: 0.35872656, a: 1} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 @@ -130,6 +130,26 @@ Prefab: propertyPath: m_RootOrder value: 0 objectReference: {fileID: 0} + - target: {fileID: 11464354, guid: d9a1ba27e850d6d478d4a64d027d1204, type: 2} + propertyPath: renderLightShadows + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11464354, guid: d9a1ba27e850d6d478d4a64d027d1204, type: 2} + propertyPath: renderSunShadows + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11464354, guid: d9a1ba27e850d6d478d4a64d027d1204, type: 2} + propertyPath: renderExteriorCellLights + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11464354, guid: d9a1ba27e850d6d478d4a64d027d1204, type: 2} + propertyPath: materialType + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 11464354, guid: d9a1ba27e850d6d478d4a64d027d1204, type: 2} + propertyPath: animateLights + value: 0 + objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: d9a1ba27e850d6d478d4a64d027d1204, type: 2} m_IsPrefabParent: 0 diff --git a/Assets/Scripts/Core/GUIUtils.cs b/Assets/Scripts/Core/GUIUtils.cs index b9947b7..874fef9 100644 --- a/Assets/Scripts/Core/GUIUtils.cs +++ b/Assets/Scripts/Core/GUIUtils.cs @@ -1,4 +1,5 @@ using UnityEngine; +using UnityEngine.EventSystems; using UnityEngine.UI; public static class GUIUtils @@ -89,9 +90,12 @@ public static void SetupCanvasToVR(Canvas canvas, Transform parent) public static GameObject CreateEventSystem() { + if (EventSystem.current != null) + return EventSystem.current.gameObject; + var eventSystem = new GameObject("EventSystem"); - eventSystem.AddComponent(); - eventSystem.AddComponent(); + eventSystem.AddComponent(); + eventSystem.AddComponent(); return eventSystem; } diff --git a/Assets/Scripts/TES/Materials/MaterialManager.cs b/Assets/Scripts/TES/MaterialManager.cs similarity index 74% rename from Assets/Scripts/TES/Materials/MaterialManager.cs rename to Assets/Scripts/TES/MaterialManager.cs index abd866f..ee0fb49 100644 --- a/Assets/Scripts/TES/Materials/MaterialManager.cs +++ b/Assets/Scripts/TES/MaterialManager.cs @@ -31,7 +31,7 @@ public struct MWMaterialProps /// public class MaterialManager { - private MWBaseMaterial _materialInterface; + private MWBaseMaterial _mwMaterial; private TextureManager _textureManager; public TextureManager TextureManager @@ -46,38 +46,38 @@ public MaterialManager(TextureManager textureManager) switch(TESUnity.instance.materialType) { case TESUnity.MWMaterialType.Default: - _materialInterface = new MWDefaultMaterial(textureManager); + _mwMaterial = new MWDefaultMaterial(textureManager); break; case TESUnity.MWMaterialType.Standard: - _materialInterface = new MWStandardMaterial(textureManager); + _mwMaterial = new MWStandardMaterial(textureManager); break; case TESUnity.MWMaterialType.Unlit: - _materialInterface = new MWUnliteMaterial(textureManager); + _mwMaterial = new MWUnliteMaterial(textureManager); break; default: - _materialInterface = new MWBumpedDiffuseMaterial(textureManager); + _mwMaterial = new MWBumpedDiffuseMaterial(textureManager); break; } } public Material BuildMaterialFromProperties(MWMaterialProps mp) { - return _materialInterface.BuildMaterialFromProperties(mp); + return _mwMaterial.BuildMaterialFromProperties(mp); } private Material BuildMaterial() { - return _materialInterface.BuildMaterial(); + return _mwMaterial.BuildMaterial(); } private Material BuildMaterialBlended(ur.BlendMode sourceBlendMode, ur.BlendMode destinationBlendMode) { - return _materialInterface.BuildMaterialBlended(sourceBlendMode, destinationBlendMode); + return _mwMaterial.BuildMaterialBlended(sourceBlendMode, destinationBlendMode); } private Material BuildMaterialTested(float cutoff = 0.5f) { - return _materialInterface.BuildMaterialTested(cutoff); + return _mwMaterial.BuildMaterialTested(cutoff); } } } \ No newline at end of file diff --git a/Assets/Scripts/TES/Materials/MaterialManager.cs.meta b/Assets/Scripts/TES/MaterialManager.cs.meta similarity index 100% rename from Assets/Scripts/TES/Materials/MaterialManager.cs.meta rename to Assets/Scripts/TES/MaterialManager.cs.meta diff --git a/Assets/Scripts/TES/Materials/MWBaseMaterial.cs b/Assets/Scripts/TES/Materials/MWBaseMaterial.cs index 61e5bd3..c88b778 100644 --- a/Assets/Scripts/TES/Materials/MWBaseMaterial.cs +++ b/Assets/Scripts/TES/Materials/MWBaseMaterial.cs @@ -4,6 +4,9 @@ namespace TESUnity { + /// + /// An abstract class to describe a material. + /// public abstract class MWBaseMaterial { protected Dictionary m_existingMaterials; diff --git a/Assets/Scripts/TES/Materials/MWBumpedDiffuseMaterial.cs b/Assets/Scripts/TES/Materials/MWBumpedDiffuseMaterial.cs index 39b1d56..21098d0 100644 --- a/Assets/Scripts/TES/Materials/MWBumpedDiffuseMaterial.cs +++ b/Assets/Scripts/TES/Materials/MWBumpedDiffuseMaterial.cs @@ -3,6 +3,9 @@ namespace TESUnity { + /// + /// A material that uses the legacy Bumped Diffuse Shader. + /// public class MWBumpedDiffuseMaterial : MWBaseMaterial { public MWBumpedDiffuseMaterial(TextureManager textureManager) : base(textureManager) { } @@ -25,7 +28,7 @@ public override Material BuildMaterialFromProperties(MWMaterialProps mp) if (mp.textures.mainFilePath != null) material.mainTexture = m_textureManager.LoadTexture(mp.textures.mainFilePath); - if (mp.textures.bumpFilePath != null && material.HasProperty("_BumpMap")) + if (mp.textures.bumpFilePath != null) material.SetTexture("_BumpMap", m_textureManager.LoadTexture(mp.textures.bumpFilePath)); m_existingMaterials[mp] = material; diff --git a/Assets/Scripts/TES/Materials/MWDefaultMaterial.cs b/Assets/Scripts/TES/Materials/MWDefaultMaterial.cs index e8ab8de..c0b2550 100644 --- a/Assets/Scripts/TES/Materials/MWDefaultMaterial.cs +++ b/Assets/Scripts/TES/Materials/MWDefaultMaterial.cs @@ -3,6 +3,9 @@ namespace TESUnity { + /// + /// A material that uses the default shader created for TESUnity. + /// public class MWDefaultMaterial : MWBaseMaterial { public MWDefaultMaterial(TextureManager textureManager) : base(textureManager) { } diff --git a/Assets/Scripts/TES/Materials/MWStandardMaterial.cs b/Assets/Scripts/TES/Materials/MWStandardMaterial.cs index c9e9430..7192830 100644 --- a/Assets/Scripts/TES/Materials/MWStandardMaterial.cs +++ b/Assets/Scripts/TES/Materials/MWStandardMaterial.cs @@ -3,9 +3,20 @@ namespace TESUnity { + /// + /// A material that uses the new Standard Shader. + /// public class MWStandardMaterial : MWBaseMaterial { - public MWStandardMaterial(TextureManager textureManager) : base(textureManager) { } + private Material _standardMaterial; + private Material _standardCutoutMaterial; + + public MWStandardMaterial(TextureManager textureManager) + : base(textureManager) + { + _standardMaterial = Resources.Load("Materials/Standard"); + _standardCutoutMaterial = Resources.Load("Materials/StandardCutout"); + } public override Material BuildMaterialFromProperties(MWMaterialProps mp) { @@ -25,26 +36,23 @@ public override Material BuildMaterialFromProperties(MWMaterialProps mp) if (mp.textures.mainFilePath != null) material.mainTexture = m_textureManager.LoadTexture(mp.textures.mainFilePath); - if (mp.textures.mainFilePath != null && material.HasProperty("_Albedo")) - material.SetTexture("_Albedo", m_textureManager.LoadTexture(mp.textures.mainFilePath)); - - if (mp.textures.detailFilePath != null && material.HasProperty("_DetailMask")) - material.SetTexture("_DetailMask", m_textureManager.LoadTexture(mp.textures.detailFilePath)); - - if (mp.textures.darkFilePath != null && material.HasProperty("_Occlusion")) - material.SetTexture("_Occlusion", m_textureManager.LoadTexture(mp.textures.darkFilePath)); + if (mp.textures.glowFilePath != null) + { + material.EnableKeyword("_EMISION"); + material.SetTexture("_EMISSION", m_textureManager.LoadTexture(mp.textures.glowFilePath)); + } - if (mp.textures.glowFilePath != null && material.HasProperty("_Emission")) - material.SetTexture("_Emission", m_textureManager.LoadTexture(mp.textures.glowFilePath)); + if (mp.textures.bumpFilePath != null) + { + material.EnableKeyword("_NORMALMAP"); + material.SetTexture("_NORMALMAP", m_textureManager.LoadTexture(mp.textures.bumpFilePath)); + } - if (mp.textures.bumpFilePath != null && material.HasProperty("_NormalMap")) - material.SetTexture("_NormalMap", m_textureManager.LoadTexture(mp.textures.bumpFilePath)); - - if (material.HasProperty("_Metallic")) - material.SetFloat("_Metallic", 0f); - - if (material.HasProperty("_Smoothness")) - material.SetFloat("_Smoothness", 0f); + if (mp.textures.glossFilePath != null) + { + material.EnableKeyword("_METALLICGLOSSMAP"); + material.SetTexture("_METALLICGLOSSMAP", m_textureManager.LoadTexture(mp.textures.glossFilePath)); + } m_existingMaterials[mp] = material; } @@ -53,18 +61,23 @@ public override Material BuildMaterialFromProperties(MWMaterialProps mp) public override Material BuildMaterial() { - return new Material(Shader.Find("Standard")); + var material = new Material(Shader.Find("Standard")); + material.CopyPropertiesFromMaterial(_standardMaterial); + return material; } public override Material BuildMaterialBlended(ur.BlendMode sourceBlendMode, ur.BlendMode destinationBlendMode) { - return BuildMaterialTested(); + var material = BuildMaterialTested(); + //material.SetInt("_SrcBlend", (int)sourceBlendMode); + //material.SetInt("_DstBlend", (int)destinationBlendMode); + return material; } public override Material BuildMaterialTested(float cutoff = 0.5f) { - Material material = new Material(Shader.Find("Standard")); - material.SetFloat("_Mode", 1); + var material = new Material(Shader.Find("Standard")); + material.CopyPropertiesFromMaterial(_standardCutoutMaterial); material.SetFloat("_Cutout", cutoff); return material; } diff --git a/Assets/Scripts/TES/Materials/MWUnlitMaterial.cs b/Assets/Scripts/TES/Materials/MWUnlitMaterial.cs index 4c52140..a749f27 100644 --- a/Assets/Scripts/TES/Materials/MWUnlitMaterial.cs +++ b/Assets/Scripts/TES/Materials/MWUnlitMaterial.cs @@ -3,6 +3,9 @@ namespace TESUnity { + /// + /// A material that uses the Unlit Shader. + /// public class MWUnliteMaterial : MWBaseMaterial { public MWUnliteMaterial(TextureManager textureManager) : base(textureManager) { } @@ -37,10 +40,9 @@ public override Material BuildMaterial() public override Material BuildMaterialBlended(ur.BlendMode sourceBlendMode, ur.BlendMode destinationBlendMode) { - Material material = new Material(Shader.Find("Unlit/Transparent Cutout")); + var material = BuildMaterialTested(); material.SetInt("_SrcBlend", (int)sourceBlendMode); material.SetInt("_DstBlend", (int)destinationBlendMode); - material.SetFloat("_AlphaCutoff", 0.5f); return material; } diff --git a/Assets/Scripts/TES/PathSelectionComponent.cs b/Assets/Scripts/TES/PathSelectionComponent.cs index b73c737..33daeb5 100644 --- a/Assets/Scripts/TES/PathSelectionComponent.cs +++ b/Assets/Scripts/TES/PathSelectionComponent.cs @@ -8,7 +8,7 @@ namespace TESUnity { public class PathSelectionComponent : MonoBehaviour { - private static readonly string SavePathKey = "TESUnity.PathSelection.Path"; + private static readonly string SavePathKey = "keepMWPath"; private string defaultMWDataPath = "C:/Program Files (x86)/Steam/steamapps/common/Morrowind/Data Files"; private new GameObject camera; @@ -136,12 +136,12 @@ private void CheckConfigINI() case "SunShadows": tes.renderSunShadows = bool.Parse(value); break; case "LightShadows": tes.renderLightShadows = bool.Parse(value); break; case "PlayMusic": tes.playMusic = bool.Parse(value); break; - case "RenderPath": - switch (int.Parse(value)) - { - case 1: tes.renderPath = RenderingPath.Forward; break; - case 3: tes.renderPath = RenderingPath.DeferredShading; break; - } + case "RenderPath": + var renderPathID = int.Parse(value); + + if (renderPathID == 1 || renderPathID == 3) + tes.renderPath = (RenderingPath)renderPathID; + break; case "Shader": switch (value) @@ -149,6 +149,7 @@ private void CheckConfigINI() case "Default": tes.materialType = TESUnity.MWMaterialType.Default; break; case "Standard": tes.materialType = TESUnity.MWMaterialType.Standard; break; case "Unlit": tes.materialType = TESUnity.MWMaterialType.Unlit; break; + default: tes.materialType = TESUnity.MWMaterialType.BumpedDiffuse; break; } break; } @@ -156,6 +157,7 @@ private void CheckConfigINI() line = stream.ReadLine(); } + stream.Close(); } } diff --git a/README.md b/README.md index eb5e4ad..1556c73 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,41 @@ -*TESUnity* -========== +# TESUnity -World viewers for Elder Scrolls games in the Unity game engine. +World viewers for Elder Scrolls games in the Unity game engine with VR support supporting Oculus and OpenVR. +## Getting Started -Getting Started ---------------- - -**TESUnity requires a valid installation of Morrowind to run!** +**TESUnity requires a valid installation of Morrowind to run!**, you can get it on Steam or Gog.com. To get started, download the source code as a ZIP file, extract it, and open the TESUnity folder in Unity. +You can copy the `Data Files` folder from your Morrowind installation to the root folder of the project / release. The game will start automatically without asking for a path. -Controls --------- - -W, A, S, D - Move - -Shift - Sprint - -Left Ctrl. - Walk - -Space - Jump +## Configuration file +You can create a configuration file named `Config.ini` at the root folder of the project / release folder. -E - Interact +| Parameter | Values | +|-----------|---------| +| SunShadows | `True` or `False` | +| LightShadows | `True` or `False` | +| PlayMusic | `True` or `False` | +| Shader | `Unlit` or `Standard` or `Default` or `Bumped` | +| RenderPath | `1` = Forward, `3` = Deferred | -Tab - Toggle Flight Mode -L - Toggle Lantern +## Controls +| Action | Keys | Gamepad | +|--------|------|---------| +| Move | W, A, S, D | Left thumbstick | +| Sprint | Left Shift | Left thumbstick button | +| Walk | Left Ctrl | Right thumstick button | +| Jump | Space | button Y | +| Interact | E | button A | +| Toggle Flight Mode | Tab | Nothing | +|Toggle Lantern | L | button X | +| Free Cursor Lock | Backquote | Nothing | -Backquote - Free Cursor Lock ( Unity likes to hog the escape key and it causes some weird behaviour ) - -Contribute ----------- +## Contribute Bugs and feature requests are listed on the [GitHub issues page](https://github.com/ColeDeanShepherd/TESUnity/issues). Feel free to fork the source code and contribute, or use it in any way that falls under the [MIT License](https://github.com/ColeDeanShepherd/TESUnity/blob/master/LICENSE.txt). @@ -43,10 +45,7 @@ Please create a branch from develop for each "feature" (see [this article](http: Morrowind Data Format Resources ------------------------------- -[ESM File Format Specification](http://www.mwmythicmods.com/argent/tech/es_format.html) - -[BSA File Format Specification](http://www.uesp.net/wiki/Tes3Mod:BSA_File_Format) - -[NIF File Format Specification](https://github.com/niftools/nifxml/blob/develop/nif.xml) - -[NIF Viewer/Data Inspector](https://github.com/niftools/nifskope) \ No newline at end of file +* [ESM File Format Specification](http://www.mwmythicmods.com/argent/tech/es_format.html) +* [BSA File Format Specification](http://www.uesp.net/wiki/Tes3Mod:BSA_File_Format) +* [NIF File Format Specification](https://github.com/niftools/nifxml/blob/develop/nif.xml) +* [NIF Viewer/Data Inspector](https://github.com/niftools/nifskope) \ No newline at end of file