public SimpleVertexAdder(Mesh <TVertex> .Builder builder, ObjFileVertexParser <TVertex> parser, ObjFileMesh owner) { this.builder = builder; this.parser = parser; this.owner = owner; }
private TVertex createVertex <TVertex>( Face.VertexIds ids, ObjFileVertexParser <TVertex> parser) where TVertex : struct { var position = this.positions[ids.Position]; var uv = ids.UV < 2 ? new Vector3(0) : this.uvCoordinates[ids.UV]; var normal = ids.UV < 0 ? new Vector3(0) : this.normals[ids.Normal]; return(parser(position, uv, normal)); }
private static ObjFileVertexParser <TVertex> normalizeNormal <TVertex>(ObjFileVertexParser <TVertex> parser) where TVertex : struct { return((p, uv, n) => { var normalLength = n.LengthSquared; if (normalLength > 0) { n = n / (float)Math.Sqrt(normalLength); } return parser(p, uv, n); }); }
/// <summary> /// Creates a mesh from the loaded obj file for further processing and rendering. /// </summary> /// <param name="vertexParser">A function creating mesh vertices from position, uv coordinate and normal.</param> /// <param name="mergeVertices">Whether to merge and reuse identical vertices.</param> /// <param name="normalizeNormals">Whether to normalise normals before creating the mesh vertex.</param> public Mesh <TVertex> ToMesh <TVertex>( ObjFileVertexParser <TVertex> vertexParser, bool mergeVertices = true, bool normalizeNormals = true) where TVertex : struct { this.ensureStats(); if (normalizeNormals) { vertexParser = normalizeNormal(vertexParser); } var builder = new Mesh <TVertex> .Builder( mergeVertices? 0 : this.totalFaceVertexCount); var vertexAdder = mergeVertices ? new SimpleVertexAdder <TVertex>(builder, vertexParser, this) : new MergedVertexDictionary <TVertex>(builder, vertexParser, this); return(this.toMesh(builder, vertexAdder)); }
public MergedVertexDictionary(Mesh <TVertex> .Builder builder, ObjFileVertexParser <TVertex> parser, ObjFileMesh owner) : base(builder, parser, owner) { }