rearrange function order in importer
parent
e670bba1a6
commit
c5ecda6b7d
152
Importer.cs
152
Importer.cs
|
@ -7,6 +7,32 @@ namespace Smuggler
|
||||||
{
|
{
|
||||||
public static class Importer
|
public static class Importer
|
||||||
{
|
{
|
||||||
|
public static Model ImportGLB(GraphicsDevice graphicsDevice, Stream stream)
|
||||||
|
{
|
||||||
|
var sharpModel = SharpGLTF.Schema2.ModelRoot.ReadGLB(stream);
|
||||||
|
var vertexType = InferVertexType(sharpModel);
|
||||||
|
|
||||||
|
if (vertexType == null) { return null; }
|
||||||
|
|
||||||
|
var meshes = new List<Mesh>();
|
||||||
|
|
||||||
|
foreach (var mesh in sharpModel.LogicalMeshes)
|
||||||
|
{
|
||||||
|
var meshParts = new List<MeshPart>();
|
||||||
|
|
||||||
|
foreach (var primitive in mesh.Primitives)
|
||||||
|
{
|
||||||
|
meshParts.Add(
|
||||||
|
ImportMeshPart(graphicsDevice, vertexType, primitive)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
meshes.Add(new Mesh(meshParts.ToArray()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Model(meshes.ToArray());
|
||||||
|
}
|
||||||
|
|
||||||
private static System.Type InferVertexType(SharpGLTF.Schema2.ModelRoot model)
|
private static System.Type InferVertexType(SharpGLTF.Schema2.ModelRoot model)
|
||||||
{
|
{
|
||||||
bool hasColor = false;
|
bool hasColor = false;
|
||||||
|
@ -70,6 +96,56 @@ namespace Smuggler
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static MeshPart ImportMeshPart(GraphicsDevice graphicsDevice, System.Type vertexType, SharpGLTF.Schema2.MeshPrimitive primitive)
|
||||||
|
{
|
||||||
|
var indices = Indices(primitive);
|
||||||
|
var positions = Positions(primitive);
|
||||||
|
var triangles = Triangles(primitive);
|
||||||
|
|
||||||
|
var vertexBuffer = new VertexBuffer(
|
||||||
|
graphicsDevice,
|
||||||
|
vertexType,
|
||||||
|
positions.Length,
|
||||||
|
BufferUsage.None
|
||||||
|
);
|
||||||
|
|
||||||
|
var indexBuffer = new IndexBuffer(
|
||||||
|
graphicsDevice,
|
||||||
|
IndexElementSize.ThirtyTwoBits,
|
||||||
|
indices.Length,
|
||||||
|
BufferUsage.None
|
||||||
|
);
|
||||||
|
|
||||||
|
indexBuffer.SetData(indices);
|
||||||
|
|
||||||
|
if (vertexType == typeof(VertexPositionColor))
|
||||||
|
{
|
||||||
|
ImportVertexPositionColor(primitive, vertexBuffer, indices, positions);
|
||||||
|
}
|
||||||
|
else if (vertexType == typeof(VertexPositionColorTexture))
|
||||||
|
{
|
||||||
|
ImportVertexPositionColorTexture(primitive, vertexBuffer, indices, positions);
|
||||||
|
}
|
||||||
|
else if (vertexType == typeof(VertexPositionNormalTexture))
|
||||||
|
{
|
||||||
|
ImportVertexPositionNormalTexture(primitive, vertexBuffer, indices, positions);
|
||||||
|
}
|
||||||
|
else if (vertexType == typeof(VertexPositionTexture))
|
||||||
|
{
|
||||||
|
ImportVertexPositionTexture(primitive, vertexBuffer, indices, positions);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new MeshPart(
|
||||||
|
vertexBuffer,
|
||||||
|
indexBuffer,
|
||||||
|
positions,
|
||||||
|
triangles,
|
||||||
|
new BasicEffect(graphicsDevice)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Attribute Getters */
|
||||||
|
|
||||||
private static Vector3[] Positions(SharpGLTF.Schema2.MeshPrimitive primitive)
|
private static Vector3[] Positions(SharpGLTF.Schema2.MeshPrimitive primitive)
|
||||||
{
|
{
|
||||||
var positionAccessor = primitive.GetVertexAccessor("POSITION").AsVector3Array();
|
var positionAccessor = primitive.GetVertexAccessor("POSITION").AsVector3Array();
|
||||||
|
@ -151,6 +227,8 @@ namespace Smuggler
|
||||||
return indices;
|
return indices;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Vertex Builders */
|
||||||
|
|
||||||
private static void ImportVertexPositionColor(
|
private static void ImportVertexPositionColor(
|
||||||
SharpGLTF.Schema2.MeshPrimitive primitive,
|
SharpGLTF.Schema2.MeshPrimitive primitive,
|
||||||
VertexBuffer vertexBuffer,
|
VertexBuffer vertexBuffer,
|
||||||
|
@ -252,79 +330,5 @@ namespace Smuggler
|
||||||
|
|
||||||
vertexBuffer.SetData(vertices);
|
vertexBuffer.SetData(vertices);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static MeshPart ImportMeshPart(GraphicsDevice graphicsDevice, System.Type vertexType, SharpGLTF.Schema2.MeshPrimitive primitive)
|
|
||||||
{
|
|
||||||
var indices = Indices(primitive);
|
|
||||||
var positions = Positions(primitive);
|
|
||||||
var triangles = Triangles(primitive);
|
|
||||||
|
|
||||||
var vertexBuffer = new VertexBuffer(
|
|
||||||
graphicsDevice,
|
|
||||||
vertexType,
|
|
||||||
positions.Length,
|
|
||||||
BufferUsage.None
|
|
||||||
);
|
|
||||||
|
|
||||||
var indexBuffer = new IndexBuffer(
|
|
||||||
graphicsDevice,
|
|
||||||
IndexElementSize.ThirtyTwoBits,
|
|
||||||
indices.Length,
|
|
||||||
BufferUsage.None
|
|
||||||
);
|
|
||||||
|
|
||||||
indexBuffer.SetData(indices);
|
|
||||||
|
|
||||||
if (vertexType == typeof(VertexPositionColor))
|
|
||||||
{
|
|
||||||
ImportVertexPositionColor(primitive, vertexBuffer, indices, positions);
|
|
||||||
}
|
|
||||||
else if (vertexType == typeof(VertexPositionColorTexture))
|
|
||||||
{
|
|
||||||
ImportVertexPositionColorTexture(primitive, vertexBuffer, indices, positions);
|
|
||||||
}
|
|
||||||
else if (vertexType == typeof(VertexPositionNormalTexture))
|
|
||||||
{
|
|
||||||
ImportVertexPositionNormalTexture(primitive, vertexBuffer, indices, positions);
|
|
||||||
}
|
|
||||||
else if (vertexType == typeof(VertexPositionTexture))
|
|
||||||
{
|
|
||||||
ImportVertexPositionTexture(primitive, vertexBuffer, indices, positions);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new MeshPart(
|
|
||||||
vertexBuffer,
|
|
||||||
indexBuffer,
|
|
||||||
positions,
|
|
||||||
triangles,
|
|
||||||
new BasicEffect(graphicsDevice)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Model ImportGLB(GraphicsDevice graphicsDevice, Stream stream)
|
|
||||||
{
|
|
||||||
var sharpModel = SharpGLTF.Schema2.ModelRoot.ReadGLB(stream);
|
|
||||||
var vertexType = InferVertexType(sharpModel);
|
|
||||||
|
|
||||||
if (vertexType == null) { return null; }
|
|
||||||
|
|
||||||
var meshes = new List<Mesh>();
|
|
||||||
|
|
||||||
foreach (var mesh in sharpModel.LogicalMeshes)
|
|
||||||
{
|
|
||||||
var meshParts = new List<MeshPart>();
|
|
||||||
|
|
||||||
foreach (var primitive in mesh.Primitives)
|
|
||||||
{
|
|
||||||
meshParts.Add(
|
|
||||||
ImportMeshPart(graphicsDevice, vertexType, primitive)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
meshes.Add(new Mesh(meshParts.ToArray()));
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Model(meshes.ToArray());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue