absolutely horrible inefficient and incomplete implementation of writing OBJ models

This commit is contained in:
Michael Becker 2019-11-30 03:51:50 -05:00
parent 0a75cc0a3c
commit b264154020
No known key found for this signature in database
GPG Key ID: 389DFF5D73781A12

View File

@ -1,10 +1,13 @@
using System;
using System.Collections.Generic;
using UniversalEditor.DataFormats.Text.Plain;
using UniversalEditor.IO;
using UniversalEditor.ObjectModels.Multimedia3D.Model;
using UniversalEditor.ObjectModels.Text.Plain;
namespace UniversalEditor.DataFormats.Multimedia3D.Model.Wavefront
{
public class OBJDataFormat : DataFormat
public class OBJDataFormat : PlainTextDataFormat
{
private static DataFormatReference _dfr = null;
protected override DataFormatReference MakeReferenceInternal()
@ -16,19 +19,78 @@ namespace UniversalEditor.DataFormats.Multimedia3D.Model.Wavefront
}
return _dfr;
}
protected override void LoadInternal(ref ObjectModel objectModel)
protected override void BeforeLoadInternal(Stack<ObjectModel> objectModels)
{
ModelObjectModel model = (objectModel as ModelObjectModel);
if (model == null) throw new ObjectModelNotSupportedException();
Reader reader = base.Accessor.Reader;
base.BeforeLoadInternal(objectModels);
objectModels.Push(new PlainTextObjectModel());
}
protected override void SaveInternal(ObjectModel objectModel)
protected override void AfterLoadInternal(Stack<ObjectModel> objectModels)
{
ModelObjectModel model = (objectModel as ModelObjectModel);
base.AfterLoadInternal(objectModels);
PlainTextObjectModel ptom = (objectModels.Pop() as PlainTextObjectModel);
ModelObjectModel model = (objectModels.Pop() as ModelObjectModel);
if (model == null) throw new ObjectModelNotSupportedException();
Writer writer = base.Accessor.Writer;
}
protected override void BeforeSaveInternal(Stack<ObjectModel> objectModels)
{
base.BeforeSaveInternal(objectModels);
ModelObjectModel model = (objectModels.Pop() as ModelObjectModel);
if (model == null) throw new ObjectModelNotSupportedException();
string filetitle = Accessor.GetFileTitle();
PlainTextObjectModel ptom = new PlainTextObjectModel();
ptom.Lines.Add("# Universal Editor MM3D v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() + " OBJ File: '" + Accessor.GetFileName() + "'");
ptom.Lines.Add("# https://github.com/alcexhim/UniversalEditor");
ptom.Lines.Add("mtllib " + filetitle + ".mtl");
for (int i = 0; i < model.Surfaces.Count; i++)
{
ptom.Lines.Add("o Object");
for (int j = 0; j < model.Surfaces[i].Vertices.Count; j++)
{
ptom.Lines.Add(String.Format("v {0} {1} {2}", model.Surfaces[0].Vertices[j].Position.X, model.Surfaces[0].Vertices[j].Position.Y, model.Surfaces[0].Vertices[j].Position.Z));
/*
ptom.Lines.Add(String.Format("v {0} {1} {2}", model.Surfaces[0].Triangles[j].Vertex1.Position.X, model.Surfaces[0].Triangles[j].Vertex1.Position.Y, model.Surfaces[0].Triangles[j].Vertex1.Position.Z));
ptom.Lines.Add(String.Format("v {0} {1} {2}", model.Surfaces[0].Triangles[j].Vertex2.Position.X, model.Surfaces[0].Triangles[j].Vertex2.Position.Y, model.Surfaces[0].Triangles[j].Vertex2.Position.Z));
ptom.Lines.Add(String.Format("v {0} {1} {2}", model.Surfaces[0].Triangles[j].Vertex3.Position.X, model.Surfaces[0].Triangles[j].Vertex3.Position.Y, model.Surfaces[0].Triangles[j].Vertex3.Position.Z));
*/
}
for (int j = 0; j < model.Surfaces[0].Triangles.Count; j++)
{
ptom.Lines.Add(String.Format("vt {0} {1}", model.Surfaces[0].Triangles[j].Vertex1.Texture.U, model.Surfaces[0].Triangles[j].Vertex1.Texture.V));
ptom.Lines.Add(String.Format("vt {0} {1}", model.Surfaces[0].Triangles[j].Vertex2.Texture.U, model.Surfaces[0].Triangles[j].Vertex2.Texture.V));
ptom.Lines.Add(String.Format("vt {0} {1}", model.Surfaces[0].Triangles[j].Vertex3.Texture.U, model.Surfaces[0].Triangles[j].Vertex3.Texture.V));
}
for (int j = 0; j < model.Surfaces[0].Triangles.Count; j++)
{
ptom.Lines.Add(String.Format("vn {0} {1} {2}", model.Surfaces[0].Triangles[j].Vertex1.Normal.X, model.Surfaces[0].Triangles[j].Vertex1.Normal.Y, model.Surfaces[0].Triangles[j].Vertex1.Normal.Z));
ptom.Lines.Add(String.Format("vn {0} {1} {2}", model.Surfaces[0].Triangles[j].Vertex2.Normal.X, model.Surfaces[0].Triangles[j].Vertex2.Normal.Y, model.Surfaces[0].Triangles[j].Vertex2.Normal.Z));
ptom.Lines.Add(String.Format("vn {0} {1} {2}", model.Surfaces[0].Triangles[j].Vertex3.Normal.X, model.Surfaces[0].Triangles[j].Vertex3.Normal.Y, model.Surfaces[0].Triangles[j].Vertex3.Normal.Z));
}
// ptom.Lines.Add("usemtl Material");
// ptom.Lines.Add("s off");
for (int k = 0; k < model.Surfaces[i].Triangles.Count; k++)
{
ptom.Lines.Add(String.Format("f {0}/{1}/{2} {3}/{4}/{5} {6}/{7}/{8}",
model.Surfaces[i].Vertices.IndexOf(model.Surfaces[i].Triangles[k].Vertex1),
model.Surfaces[i].Vertices.IndexOf(model.Surfaces[i].Triangles[k].Vertex2),
(i + 1).ToString(),
model.Surfaces[i].Vertices.IndexOf(model.Surfaces[i].Triangles[k].Vertex2),
model.Surfaces[i].Vertices.IndexOf(model.Surfaces[i].Triangles[k].Vertex3),
(i + 1).ToString(),
model.Surfaces[i].Vertices.IndexOf(model.Surfaces[i].Triangles[k].Vertex3),
model.Surfaces[i].Vertices.IndexOf(model.Surfaces[i].Triangles[k].Vertex1),
(i + 1).ToString()
));
}
}
objectModels.Push(ptom);
}
}
}