1.ContentToolsAPI.cs
using Microsoft.VisualStudio.Shell.Interop;
using PrimalEditor.ContentToolsAPIStructs;
using PrimalEditor.Utilities;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Numerics;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
namespace PrimalEditor.ContentToolsAPIStructs {
StructLayout(LayoutKind.Sequential)
class GeometryImportSettings
{
public float SmoothingAngle = 178f;
public byte CalculateNormals =0;
public byte CalculateTangents=1;
public byte ReverseHandedness=0;
public byte ImportEmbededTextures=1;
public byte ImportAnimations=1;
}
StructLayout(LayoutKind.Sequential)
class SceneData : IDisposable
{
public IntPtr Data;
public int DataSize;
public GeometryImportSettings ImportSettings = new GeometryImportSettings();
public void Dispose()
{
Marshal.FreeCoTaskMem(Data);
GC.SuppressFinalize(this);
}
~SceneData()
{
Dispose();
}
}
StructLayout(LayoutKind.Sequential)
class PrimitiveInitInfo
{
public Content.PrimitiveMeshType Type;
public int SegmentX = 1;
public int SegmentY = 1;
public int SegmentZ = 1;
public Vector3 Size = new Vector3();
public int LOD = 0;
}
}
namespace PrimalEditor.DllWrappers
{
static class ContentToolsAPI
{
private const string _toolsDll = "ContentTools.dll";
DllImport(_toolsDll)
private static extern void CreatePrimitiveMesh([In, Out] SceneData data, PrimitiveInitInfo info);
public static void CreatePrimitiveMesh(Content.Geometry geometry, PrimitiveInitInfo info)
{
Debug.Assert(geometry != null);
using var sceneData = new SceneData();
try
{
CreatePrimitiveMesh(sceneData, info);
Debug.Assert(sceneData.Data != IntPtr.Zero && sceneData.DataSize > 0);
var data = new byte[sceneData.DataSize];
Marshal.Copy(sceneData.Data, data, 0, sceneData.DataSize);
Marshal.FreeCoTaskMem(sceneData.Data);
geometry.FromRawData(data);
}
catch (Exception ex)
{
Logger.Log(MessageType.Error, $"failed to create {info.Type} primitive mesh.");
Debug.WriteLine(ex.Message);
}
}
}
}