From 8facd84971669fe4572960f23cfd63f9bf21ba34 Mon Sep 17 00:00:00 2001 From: amazingalek Date: Mon, 23 Dec 2019 09:31:25 +0100 Subject: [PATCH] Import model (#18) * Asset mod helper for creating custom 3D objects * New sample mod which spawns rubber ducks --- OWML.Assets/Mod3DObject.cs | 13 + OWML.Assets/ModAssets.cs | 59 ++++ OWML.Assets/OWML.Assets.csproj | 63 +++++ OWML.Assets/ObjImporter.cs | 253 ++++++++++++++++++ OWML.Assets/Properties/AssemblyInfo.cs | 35 +++ OWML.Common/IModAssets.cs | 9 + OWML.Common/IModHelper.cs | 1 + OWML.Common/ModBehaviour.cs | 4 +- OWML.Common/ModHelper.cs | 4 +- OWML.Common/OWML.Common.csproj | 1 + OWML.Launcher/App.cs | 4 +- OWML.ModLoader/ModLoader.cs | 4 +- OWML.ModLoader/OWML.ModLoader.csproj | 4 + OWML.ModLoader/Owo.cs | 2 +- .../OWML.Create3DObject/Create3DObject.cs | 53 ++++ .../OWML.Create3DObject.csproj | 79 ++++++ .../Properties/AssemblyInfo.cs | 35 +++ OWML.SampleMods/OWML.Create3DObject/duck.png | Bin 0 -> 106205 bytes .../OWML.Create3DObject/manifest.json | 9 + .../OWML.EnableDebugMode/manifest.json | 2 +- OWML.SampleMods/OWML.TestMod/manifest.json | 2 +- OWML.sln | 13 + Readme.md | 17 +- createrelease.bat | 7 + 24 files changed, 664 insertions(+), 9 deletions(-) create mode 100644 OWML.Assets/Mod3DObject.cs create mode 100644 OWML.Assets/ModAssets.cs create mode 100644 OWML.Assets/OWML.Assets.csproj create mode 100644 OWML.Assets/ObjImporter.cs create mode 100644 OWML.Assets/Properties/AssemblyInfo.cs create mode 100644 OWML.Common/IModAssets.cs create mode 100644 OWML.SampleMods/OWML.Create3DObject/Create3DObject.cs create mode 100644 OWML.SampleMods/OWML.Create3DObject/OWML.Create3DObject.csproj create mode 100644 OWML.SampleMods/OWML.Create3DObject/Properties/AssemblyInfo.cs create mode 100644 OWML.SampleMods/OWML.Create3DObject/duck.png create mode 100644 OWML.SampleMods/OWML.Create3DObject/manifest.json diff --git a/OWML.Assets/Mod3DObject.cs b/OWML.Assets/Mod3DObject.cs new file mode 100644 index 00000000..1a65680c --- /dev/null +++ b/OWML.Assets/Mod3DObject.cs @@ -0,0 +1,13 @@ +using UnityEngine; + +namespace OWML.Assets +{ + public class Mod3DObject : MonoBehaviour + { + private void Start() + { + DontDestroyOnLoad(gameObject); + } + + } +} diff --git a/OWML.Assets/ModAssets.cs b/OWML.Assets/ModAssets.cs new file mode 100644 index 00000000..df3562c9 --- /dev/null +++ b/OWML.Assets/ModAssets.cs @@ -0,0 +1,59 @@ +using System.Collections; +using OWML.Common; +using UnityEngine; + +namespace OWML.Assets +{ + public class ModAssets : IModAssets + { + private readonly IModConsole _console; + private readonly ObjImporter _objImporter; + + public ModAssets(IModConsole console) + { + _console = console; + _objImporter = new ObjImporter(); + } + + public GameObject Create3DObject(ModBehaviour modBehaviour, string objectFilename, string imageFilename) + { + var objectPath = modBehaviour.ModManifest.FolderPath + objectFilename; + var imagePath = modBehaviour.ModManifest.FolderPath + imageFilename; + + _console.WriteLine("Creating object from " + objectPath); + + var go = new GameObject(); + go.AddComponent(); + + var loadObject = LoadObject(go, objectPath); + modBehaviour.StartCoroutine(loadObject); + + var loadTexture = LoadTexture(go, imagePath); + modBehaviour.StartCoroutine(loadTexture); + + return go; + } + + private IEnumerator LoadObject(GameObject go, string objectPath) + { + var mesh = _objImporter.ImportFile(objectPath); + var meshFilter = go.AddComponent(); + meshFilter.mesh = mesh; + yield return null; + } + + private IEnumerator LoadTexture(GameObject go, string imagePath) + { + var texture = new Texture2D(4, 4, TextureFormat.DXT1, false); + var url = "file://" + imagePath; + using (var www = new WWW(url)) + { + yield return www; + www.LoadImageIntoTexture(texture); + } + var meshRenderer = go.AddComponent(); + meshRenderer.material.mainTexture = texture; + } + + } +} diff --git a/OWML.Assets/OWML.Assets.csproj b/OWML.Assets/OWML.Assets.csproj new file mode 100644 index 00000000..0a88e85a --- /dev/null +++ b/OWML.Assets/OWML.Assets.csproj @@ -0,0 +1,63 @@ + + + + + Debug + AnyCPU + {A62856BD-D06C-4F2C-86E8-91C6FDF8F8D5} + Library + Properties + OWML.Assets + OWML.Assets + v3.5 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\..\..\..\..\Program Files (x86)\Outer Wilds\OuterWilds_Data\Managed\Assembly-CSharp.dll + + + + False + ..\..\..\..\..\..\Program Files (x86)\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.CoreModule.dll + + + False + ..\..\..\..\..\..\Program Files (x86)\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.PhysicsModule.dll + + + ..\..\..\..\..\..\Program Files (x86)\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll + + + + + + + + + + + {3C00626F-B688-4F32-B493-5B7EC1C879A0} + OWML.Common + + + + \ No newline at end of file diff --git a/OWML.Assets/ObjImporter.cs b/OWML.Assets/ObjImporter.cs new file mode 100644 index 00000000..586224c7 --- /dev/null +++ b/OWML.Assets/ObjImporter.cs @@ -0,0 +1,253 @@ +using UnityEngine; +using System.Collections.Generic; +using System.IO; + +namespace OWML.Assets +{ + // Source: https://wiki.unity3d.com/index.php?title=ObjImporter&oldid=13033 + + /* This version of ObjImporter first reads through the entire file, getting a count of how large + * the final arrays will be, and then uses standard arrays for everything (as opposed to ArrayLists + * or any other fancy things). + */ + + public class ObjImporter + { + + private struct meshStruct + { + public Vector3[] vertices; + public Vector3[] normals; + public Vector2[] uv; + public Vector2[] uv1; + public Vector2[] uv2; + public int[] triangles; + public int[] faceVerts; + public int[] faceUVs; + public Vector3[] faceData; + public string name; + public string fileName; + } + + // Use this for initialization + public Mesh ImportFile(string filePath) + { + meshStruct newMesh = createMeshStruct(filePath); + populateMeshStruct(ref newMesh); + + Vector3[] newVerts = new Vector3[newMesh.faceData.Length]; + Vector2[] newUVs = new Vector2[newMesh.faceData.Length]; + Vector3[] newNormals = new Vector3[newMesh.faceData.Length]; + int i = 0; + /* The following foreach loops through the facedata and assigns the appropriate vertex, uv, or normal + * for the appropriate Unity mesh array. + */ + foreach (Vector3 v in newMesh.faceData) + { + newVerts[i] = newMesh.vertices[(int)v.x - 1]; + if (v.y >= 1) + newUVs[i] = newMesh.uv[(int)v.y - 1]; + + if (v.z >= 1) + newNormals[i] = newMesh.normals[(int)v.z - 1]; + i++; + } + + Mesh mesh = new Mesh(); + + mesh.vertices = newVerts; + mesh.uv = newUVs; + mesh.normals = newNormals; + mesh.triangles = newMesh.triangles; + + mesh.RecalculateBounds(); + //mesh.Optimize(); + + return mesh; + } + + private static meshStruct createMeshStruct(string filename) + { + int triangles = 0; + int vertices = 0; + int vt = 0; + int vn = 0; + int face = 0; + meshStruct mesh = new meshStruct(); + mesh.fileName = filename; + StreamReader stream = File.OpenText(filename); + string entireText = stream.ReadToEnd(); + stream.Close(); + using (StringReader reader = new StringReader(entireText)) + { + string currentText = reader.ReadLine(); + char[] splitIdentifier = { ' ' }; + string[] brokenString; + while (currentText != null) + { + if (!currentText.StartsWith("f ") && !currentText.StartsWith("v ") && !currentText.StartsWith("vt ") + && !currentText.StartsWith("vn ")) + { + currentText = reader.ReadLine(); + if (currentText != null) + { + currentText = currentText.Replace(" ", " "); + } + } + else + { + currentText = currentText.Trim(); //Trim the current line + brokenString = currentText.Split(splitIdentifier, 50); //Split the line into an array, separating the original line by blank spaces + switch (brokenString[0]) + { + case "v": + vertices++; + break; + case "vt": + vt++; + break; + case "vn": + vn++; + break; + case "f": + face = face + brokenString.Length - 1; + triangles = triangles + 3 * (brokenString.Length - 2); /*brokenString.Length is 3 or greater since a face must have at least + 3 vertices. For each additional vertice, there is an additional + triangle in the mesh (hence this formula).*/ + break; + } + currentText = reader.ReadLine(); + if (currentText != null) + { + currentText = currentText.Replace(" ", " "); + } + } + } + } + mesh.triangles = new int[triangles]; + mesh.vertices = new Vector3[vertices]; + mesh.uv = new Vector2[vt]; + mesh.normals = new Vector3[vn]; + mesh.faceData = new Vector3[face]; + return mesh; + } + + private static void populateMeshStruct(ref meshStruct mesh) + { + StreamReader stream = File.OpenText(mesh.fileName); + string entireText = stream.ReadToEnd(); + stream.Close(); + using (StringReader reader = new StringReader(entireText)) + { + string currentText = reader.ReadLine(); + + char[] splitIdentifier = { ' ' }; + char[] splitIdentifier2 = { '/' }; + string[] brokenString; + string[] brokenBrokenString; + int f = 0; + int f2 = 0; + int v = 0; + int vn = 0; + int vt = 0; + int vt1 = 0; + int vt2 = 0; + while (currentText != null) + { + if (!currentText.StartsWith("f ") && !currentText.StartsWith("v ") && !currentText.StartsWith("vt ") && + !currentText.StartsWith("vn ") && !currentText.StartsWith("g ") && !currentText.StartsWith("usemtl ") && + !currentText.StartsWith("mtllib ") && !currentText.StartsWith("vt1 ") && !currentText.StartsWith("vt2 ") && + !currentText.StartsWith("vc ") && !currentText.StartsWith("usemap ")) + { + currentText = reader.ReadLine(); + if (currentText != null) + { + currentText = currentText.Replace(" ", " "); + } + } + else + { + currentText = currentText.Trim(); + brokenString = currentText.Split(splitIdentifier, 50); + switch (brokenString[0]) + { + case "g": + break; + case "usemtl": + break; + case "usemap": + break; + case "mtllib": + break; + case "v": + mesh.vertices[v] = new Vector3(System.Convert.ToSingle(brokenString[1]), System.Convert.ToSingle(brokenString[2]), + System.Convert.ToSingle(brokenString[3])); + v++; + break; + case "vt": + mesh.uv[vt] = new Vector2(System.Convert.ToSingle(brokenString[1]), System.Convert.ToSingle(brokenString[2])); + vt++; + break; + case "vt1": + mesh.uv[vt1] = new Vector2(System.Convert.ToSingle(brokenString[1]), System.Convert.ToSingle(brokenString[2])); + vt1++; + break; + case "vt2": + mesh.uv[vt2] = new Vector2(System.Convert.ToSingle(brokenString[1]), System.Convert.ToSingle(brokenString[2])); + vt2++; + break; + case "vn": + mesh.normals[vn] = new Vector3(System.Convert.ToSingle(brokenString[1]), System.Convert.ToSingle(brokenString[2]), + System.Convert.ToSingle(brokenString[3])); + vn++; + break; + case "vc": + break; + case "f": + + int j = 1; + List intArray = new List(); + while (j < brokenString.Length && ("" + brokenString[j]).Length > 0) + { + Vector3 temp = new Vector3(); + brokenBrokenString = brokenString[j].Split(splitIdentifier2, 3); //Separate the face into individual components (vert, uv, normal) + temp.x = System.Convert.ToInt32(brokenBrokenString[0]); + if (brokenBrokenString.Length > 1) //Some .obj files skip UV and normal + { + if (brokenBrokenString[1] != "") //Some .obj files skip the uv and not the normal + { + temp.y = System.Convert.ToInt32(brokenBrokenString[1]); + } + temp.z = System.Convert.ToInt32(brokenBrokenString[2]); + } + j++; + + mesh.faceData[f2] = temp; + intArray.Add(f2); + f2++; + } + j = 1; + while (j + 2 < brokenString.Length) //Create triangles out of the face data. There will generally be more than 1 triangle per face. + { + mesh.triangles[f] = intArray[0]; + f++; + mesh.triangles[f] = intArray[j]; + f++; + mesh.triangles[f] = intArray[j + 1]; + f++; + + j++; + } + break; + } + currentText = reader.ReadLine(); + if (currentText != null) + { + currentText = currentText.Replace(" ", " "); //Some .obj files insert double spaces, this removes them. + } + } + } + } + } + } +} diff --git a/OWML.Assets/Properties/AssemblyInfo.cs b/OWML.Assets/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..fbbb46d9 --- /dev/null +++ b/OWML.Assets/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OWML.Assets")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OWML.Assets")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a62856bd-d06c-4f2c-86e8-91c6fdf8f8d5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OWML.Common/IModAssets.cs b/OWML.Common/IModAssets.cs new file mode 100644 index 00000000..439bb42b --- /dev/null +++ b/OWML.Common/IModAssets.cs @@ -0,0 +1,9 @@ +using UnityEngine; + +namespace OWML.Common +{ + public interface IModAssets + { + GameObject Create3DObject(ModBehaviour modBehaviour, string objectFilename, string imageFilename); + } +} diff --git a/OWML.Common/IModHelper.cs b/OWML.Common/IModHelper.cs index a19c0f53..e13eb715 100644 --- a/OWML.Common/IModHelper.cs +++ b/OWML.Common/IModHelper.cs @@ -7,5 +7,6 @@ public interface IModHelper IModConsole Console { get; } IModEvents Events { get; } IHarmonyHelper HarmonyHelper { get; } + IModAssets Assets { get; } } } diff --git a/OWML.Common/ModBehaviour.cs b/OWML.Common/ModBehaviour.cs index 8bbc94e7..59fe577b 100644 --- a/OWML.Common/ModBehaviour.cs +++ b/OWML.Common/ModBehaviour.cs @@ -5,10 +5,12 @@ namespace OWML.Common public class ModBehaviour : MonoBehaviour { public static IModHelper ModHelper; + public IModManifest ModManifest; - public void Init(IModHelper modHelper) + public void Init(IModHelper modHelper, IModManifest manifest) { ModHelper = modHelper; + ModManifest = manifest; DontDestroyOnLoad(gameObject); } diff --git a/OWML.Common/ModHelper.cs b/OWML.Common/ModHelper.cs index ba7a22a9..9936e2d0 100644 --- a/OWML.Common/ModHelper.cs +++ b/OWML.Common/ModHelper.cs @@ -8,14 +8,16 @@ public class ModHelper : IModHelper public IModConsole Console { get; } public IModEvents Events { get; } public IHarmonyHelper HarmonyHelper { get; } + public IModAssets Assets { get; } - public ModHelper(IModConfig config, IModLogger logger, IModConsole console, IModEvents events, IHarmonyHelper harmonyHelper) + public ModHelper(IModConfig config, IModLogger logger, IModConsole console, IModEvents events, IHarmonyHelper harmonyHelper, IModAssets assets) { Config = config; Logger = logger; Console = console; Events = events; HarmonyHelper = harmonyHelper; + Assets = assets; } } diff --git a/OWML.Common/OWML.Common.csproj b/OWML.Common/OWML.Common.csproj index 85f42ef7..3b761069 100644 --- a/OWML.Common/OWML.Common.csproj +++ b/OWML.Common/OWML.Common.csproj @@ -44,6 +44,7 @@ + diff --git a/OWML.Launcher/App.cs b/OWML.Launcher/App.cs index 651c9337..b229c907 100644 --- a/OWML.Launcher/App.cs +++ b/OWML.Launcher/App.cs @@ -11,7 +11,7 @@ namespace OWML.Launcher { public class App { - private const string OWMLVersion = "0.1.7"; + private const string OWMLVersion = "0.2.0"; private readonly string[] _filesToCopy = { "UnityEngine.CoreModule.dll", "Assembly-CSharp.dll" }; @@ -117,7 +117,7 @@ private void PatchGame(IModConfig config) { var patcher = new ModPatcher(config); patcher.PatchGame(); - var filesToCopy = new[] { "OWML.ModLoader.dll", "OWML.Common.dll", "OWML.Events.dll", "Newtonsoft.Json.dll", "System.Runtime.Serialization.dll", "0Harmony.dll" }; + var filesToCopy = new[] { "OWML.ModLoader.dll", "OWML.Common.dll", "OWML.Events.dll", "OWML.Assets.dll", "Newtonsoft.Json.dll", "System.Runtime.Serialization.dll", "0Harmony.dll" }; foreach (var filename in filesToCopy) { File.Copy(filename, $"{config.ManagedPath}/{filename}", true); diff --git a/OWML.ModLoader/ModLoader.cs b/OWML.ModLoader/ModLoader.cs index cc903910..9c0303b6 100644 --- a/OWML.ModLoader/ModLoader.cs +++ b/OWML.ModLoader/ModLoader.cs @@ -1,6 +1,7 @@ using System; using System.IO; using Newtonsoft.Json; +using OWML.Assets; using OWML.Common; using OWML.Events; using UnityEngine; @@ -30,7 +31,8 @@ public static void LoadMods() var console = new ModConsole(config); var harmonyHelper = new HarmonyHelper(logger, console); var events = new ModEvents(harmonyHelper); - var helper = new ModHelper(config, logger, console, events, harmonyHelper); + var assets = new ModAssets(console); + var helper = new ModHelper(config, logger, console, events, harmonyHelper, assets); var modFinder = new ModFinder(config); var owo = new Owo(helper, modFinder); owo.LoadMods(); diff --git a/OWML.ModLoader/OWML.ModLoader.csproj b/OWML.ModLoader/OWML.ModLoader.csproj index 3c4a54b7..edc98723 100644 --- a/OWML.ModLoader/OWML.ModLoader.csproj +++ b/OWML.ModLoader/OWML.ModLoader.csproj @@ -47,6 +47,10 @@ + + {A62856BD-D06C-4F2C-86E8-91C6FDF8F8D5} + OWML.Assets + {3c00626f-b688-4f32-b493-5b7ec1c879a0} OWML.Common diff --git a/OWML.ModLoader/Owo.cs b/OWML.ModLoader/Owo.cs index 8b28bcdc..636f8e5d 100644 --- a/OWML.ModLoader/Owo.cs +++ b/OWML.ModLoader/Owo.cs @@ -53,7 +53,7 @@ private void LoadMod(IModManifest manifest) var go = new GameObject(manifest.UniqueName); var mod = (ModBehaviour)go.AddComponent(modType); _helper.Logger.Log("Added! Initializing..."); - mod.Init(_helper); + mod.Init(_helper, manifest); _helper.Console.WriteLine($"Loaded {manifest.UniqueName} ({manifest.Version})."); _helper.Logger.Log($"Loaded {manifest.UniqueName} ({manifest.Version})."); } diff --git a/OWML.SampleMods/OWML.Create3DObject/Create3DObject.cs b/OWML.SampleMods/OWML.Create3DObject/Create3DObject.cs new file mode 100644 index 00000000..2c260423 --- /dev/null +++ b/OWML.SampleMods/OWML.Create3DObject/Create3DObject.cs @@ -0,0 +1,53 @@ +using OWML.Common; +using UnityEngine; + +namespace OWML.Create3DObject +{ + public class Create3DObject : ModBehaviour + { + private bool _isStarted; + private OWRigidbody _duckBody; + private Transform _playerTransform; + private OWRigidbody _playerBody; + + private void Start() + { + ModHelper.Console.WriteLine($"In {nameof(Create3DObject)}!"); + _duckBody = CreateDuck(); + ModHelper.Events.AddEvent(Common.Events.AfterStart); + ModHelper.Events.OnEvent += OnEvent; + } + + private OWRigidbody CreateDuck() + { + var duck = ModHelper.Assets.Create3DObject(this, "duck.obj", "duck.png"); + duck.AddComponent(); + duck.AddComponent(); + var duckBody = duck.AddComponent(); + return duckBody; + } + + private void OnEvent(MonoBehaviour behaviour, Common.Events ev) + { + if (behaviour.GetType() == typeof(Flashlight) && ev == Common.Events.AfterStart) + { + _playerTransform = Locator.GetPlayerTransform(); + _playerBody = _playerTransform.GetAttachedOWRigidbody(); + _isStarted = true; + } + } + + private void Update() + { + if (_isStarted && Input.GetMouseButtonDown(0)) + { + ModHelper.Console.WriteLine("Creating duck"); + var duckBody = Instantiate(_duckBody); + duckBody.SetPosition(_playerTransform.position + _playerTransform.forward * 1f); + duckBody.SetRotation(_playerTransform.rotation); + duckBody.SetVelocity(_playerBody.GetVelocity() + _playerTransform.forward * 10f); + } + } + + } +} diff --git a/OWML.SampleMods/OWML.Create3DObject/OWML.Create3DObject.csproj b/OWML.SampleMods/OWML.Create3DObject/OWML.Create3DObject.csproj new file mode 100644 index 00000000..b1773ef0 --- /dev/null +++ b/OWML.SampleMods/OWML.Create3DObject/OWML.Create3DObject.csproj @@ -0,0 +1,79 @@ + + + + + Debug + AnyCPU + {EC1DFA4B-D824-40FB-BF99-2B722BC1FAF6} + Library + Properties + OWML.Create3DObject + OWML.Create3DObject + v3.5 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\..\..\..\..\..\Program Files (x86)\Outer Wilds\OuterWilds_Data\Managed\Assembly-CSharp.dll + + + + + + + + + ..\..\..\..\..\..\..\Program Files (x86)\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.CoreModule.dll + + + False + ..\..\..\..\..\..\..\Program Files (x86)\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.PhysicsModule.dll + + + + + + + + + {3C00626F-B688-4F32-B493-5B7EC1C879A0} + OWML.Common + + + {B771615E-6B51-44F8-B862-D7543C12C0FF} + OWML.Events + + + + + Always + + + Always + + + + + Always + + + + \ No newline at end of file diff --git a/OWML.SampleMods/OWML.Create3DObject/Properties/AssemblyInfo.cs b/OWML.SampleMods/OWML.Create3DObject/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..c864d42b --- /dev/null +++ b/OWML.SampleMods/OWML.Create3DObject/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OWML.Load3DModel")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OWML.Load3DModel")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ec1dfa4b-d824-40fb-bf99-2b722bc1faf6")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OWML.SampleMods/OWML.Create3DObject/duck.png b/OWML.SampleMods/OWML.Create3DObject/duck.png new file mode 100644 index 0000000000000000000000000000000000000000..377f999d6722171df5b2bcbee2a171fb26fbaba0 GIT binary patch literal 106205 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 z

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 z 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