Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // By: kiwidog (http://kiwidog.me)
- // Use with: https://github.com/kiwidoggie/RimeExamplePlugin
- // http://modders.link
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Windows.Controls;
- using Microsoft.Win32;
- using RimeCommon.Content.Messages;
- using RimeCommon.Messaging;
- using RimeCommon.Mounting;
- using RimeCommon.Mounting.Messages;
- using RimeCommon.Plugins;
- using RimeLib;
- using RimeLib.Frostbite.Content.Mesh;
- using RimeLib.Helpers.Mesh;
- using RimeLib.IO;
- namespace Rime.Core.Plugins.Rendering
- {
- public class MeshPlugin : RimePlugin
- {
- public override string Name { get { return "Mesh Exporter"; } }
- public override string Author { get { return "kiwidog"; } }
- public override string Version { get { return "2.2"; } }
- public override string Description { get { return "Model exporter"; } }
- public override string Extension { get { return ".meshset"; } }
- public override UserControl MainControl { get { return null; } }
- public override MountPoint Mount { get { return MountPoint.Center; } }
- public override void Init(params object[] p_Params)
- {
- RegisterListener(MessagingSubSystem.Content);
- RegisterMessageCallback(typeof(ContentRequestOpen), OnContentReqest);
- }
- private void OnContentReqest(RimeMessage p_Obj)
- {
- var s_Message = (ContentRequestOpen) p_Obj;
- if (s_Message.Extension != Extension)
- return;
- var s_List = new List<MountEntry>();
- MessageManager.SendMessage(new MountRequestEntry
- {
- Hash = s_Message.Hash
- }, (p_Msg) =>
- {
- var s_Msg = (MountRespondEntry) p_Msg;
- if (!s_Msg.Success)
- return;
- s_List = s_Msg.Entries.ToList();
- });
- if (s_List.Count < 1)
- return;
- LoadModel(s_List[0]);
- }
- private void LoadModel(MountEntry p_Entry)
- {
- // Get our resource data
- var s_MeshSetResourceData = p_Entry.GetData();
- if (s_MeshSetResourceData == null)
- return;
- // Decompress the resource
- var s_MeshSetData = RimeHelper.ResourceDecompress(s_MeshSetResourceData);
- // Hold the class of MeshSetLayout
- MeshSetLayout s_Layout = null;
- using (var s_Reader = new RimeReader(new MemoryStream(s_MeshSetData)))
- s_Layout = new MeshSetLayout(s_Reader);
- // Check to see if we have at least one level of detail
- if (!s_Layout.Lods.Any())
- return;
- // Select the highest quality model by default
- var s_MeshSet = s_Layout.Lods[0];
- byte[] s_LodData = null;
- MessageManager.SendMessage(new MountRequestEntry
- {
- Hash = s_MeshSet.DataChunkID.ToString()
- }, (p_Msg) =>
- {
- var s_Msg = (MountRespondEntry) p_Msg;
- if (!s_Msg.Success)
- return;
- if (s_Msg.Entries.Length < 1)
- return;
- var s_Entry = s_Msg.Entries[0];
- s_LodData = s_Entry.GetData();
- });
- if (s_LodData == null)
- return;
- var s_SaveFileDialog = new SaveFileDialog
- {
- Title = "Save model file...",
- FileName = s_Layout.ShortName,
- DefaultExt = ".obj",
- Filter = "Waveform Object file (.obj)|*.obj"
- };
- if (s_SaveFileDialog.ShowDialog() != true)
- return;
- ConvertToObj(s_SaveFileDialog.FileName, s_MeshSet, s_LodData);
- }
- public void ConvertToObj(string p_SavePath, MeshLayout p_Layout, byte[] p_Data)
- {
- using (var s_Reader = new RimeReader(new MemoryStream(p_Data)))
- {
- using (TextWriter s_Writer = new StreamWriter(p_SavePath))
- {
- // Ensure that there is a subset to read from
- if (!p_Layout.Subsets.Any())
- return;
- // Write our our comment
- s_Writer.WriteLine("# Generated with Rime, the ultimate frostbite mod tool");
- // Get the first subset.
- var s_Subset = p_Layout.Subsets[0];
- // Iterate through all of the vertices and write it out with UV information
- for (var i = 0; i < s_Subset.VertexCount; ++i)
- {
- s_Reader.BaseStream.Position = (s_Subset.VertexStride*i) + s_Subset.VertexOffset;
- var l_VertexBlock = new VertexData(s_Reader);
- s_Writer.WriteLine("v {0} {1} {2}", l_VertexBlock.X.ToString("F6"), l_VertexBlock.Y.ToString("F6"), l_VertexBlock.Z.ToString("F6"));
- s_Writer.WriteLine("vt {0} {1}", l_VertexBlock.UV[0].ToString("F6"), l_VertexBlock.UV[1].ToString("F6"));
- s_Writer.Flush();
- }
- // Write out the mat name
- s_Writer.WriteLine("g {0}", s_Subset.MaterialName);
- // Go to the start of the primitive data
- s_Reader.BaseStream.Position = p_Layout.VertexDataSize;
- // Iterate through all of the primitives and write out the faces
- for (var i = 0; i < s_Subset.PrimitiveCount; ++i)
- {
- var l_x = s_Reader.ReadUInt16();
- var l_y = s_Reader.ReadUInt16();
- var l_z = s_Reader.ReadUInt16();
- s_Writer.WriteLine("f {0}/{0} {1}/{1} {2}/{2}", (l_x + 1), (l_y + 1), (l_z + 1));
- s_Writer.Flush();
- }
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement