public static geometry MeshToGeometry(CPUMesh inputMesh, string id) { geometry outputGeometry = new geometry(); mesh outputMesh = new mesh(); outputGeometry.id = id + "-lib"; outputGeometry.name = inputMesh.name + "-mesh"; outputGeometry.Item = outputMesh; //vertex Positions List <source> sourceList = new List <source>(); var inputVertices = inputMesh.vertices; if (inputVertices.Length == 0) { return(null); } sourceList.Add(ArrayToSource(inputMesh.vertices, id + "-POSITION")); vertices vertexList = new vertices(); vertexList.id = id + "-VERTEX"; vertexList.input = new InputLocal[1]; vertexList.input[0] = new InputLocal(); vertexList.input[0].semantic = "POSITION"; vertexList.input[0].source = "#" + sourceList[0].id; outputMesh.vertices = vertexList; List <InputLocalOffset> offsetList = new List <InputLocalOffset>(); { InputLocalOffset offset = new InputLocalOffset(); offset.semantic = "VERTEX"; offset.offset = 0; offset.source = "#" + vertexList.id; offsetList.Add(offset); } var inputNormals = inputMesh.normals; if (inputNormals.Length > 0) { var array = ArrayToSource(inputNormals, id + "-Normal0"); InputLocalOffset offset = new InputLocalOffset(); offset.semantic = "NORMAL"; offset.offset = (ulong)sourceList.Count; offset.source = "#" + array.id; sourceList.Add(array); offsetList.Add(offset); } var inputUV1s = inputMesh.uv; if (inputUV1s.Length > 0) { var array = ArrayToSource(inputUV1s, id + "-UV0"); InputLocalOffset offset = new InputLocalOffset(); offset.semantic = "TEXCOORD"; offset.offset = (ulong)sourceList.Count; offset.source = "#" + array.id; offset.set = 0; offset.setSpecified = true; sourceList.Add(array); offsetList.Add(offset); } var inputUV2s = inputMesh.uv2; if (inputUV2s.Length > 0) { var array = ArrayToSource(inputUV2s, id + "-UV1"); InputLocalOffset offset = new InputLocalOffset(); offset.semantic = "TEXCOORD"; offset.offset = (ulong)sourceList.Count; offset.source = "#" + array.id; offset.set = 1; offset.setSpecified = true; sourceList.Add(array); offsetList.Add(offset); } var inputColors = inputMesh.colors; if (inputColors.Length > 0) { var array = ArrayToSource(inputColors, id + "-VERTEX_COLOR0"); InputLocalOffset offset = new InputLocalOffset(); offset.semantic = "COLOR"; offset.offset = (ulong)sourceList.Count; offset.source = "#" + array.id; offset.set = 0; offset.setSpecified = true; sourceList.Add(array); offsetList.Add(offset); } outputMesh.source = sourceList.ToArray(); triangles triangleList = new triangles(); triangleList.input = offsetList.ToArray(); var inputTriangles = inputMesh.triangles; triangleList.count = (ulong)inputTriangles.Length / 3; if (triangleList.count == 0) { return(null); } StringBuilder pString = new StringBuilder(); for (int i = 0; i < inputTriangles.Length; i++) { for (int j = 0; j < triangleList.input.Length; j++) { pString.Append(inputTriangles[i]).Append(" "); } if (i % 3 == 2) { pString.AppendLine(); } else { pString.Append(" "); } } triangleList.p = pString.ToString(); outputMesh.Items = new object[1]; outputMesh.Items[0] = triangleList; return(outputGeometry); }
public static geometry MeshToGeometry(Mesh inputMesh) { string meshName = "Mesh-" + inputMesh.GetInstanceID(); geometry outputGeometry = new geometry(); mesh outputMesh = new mesh(); outputGeometry.id = meshName + "-lib"; outputGeometry.name = inputMesh.name + "-mesh"; outputGeometry.Item = outputMesh; //vertex Positions List<source> sourceList = new List<source>(); var inputVertices = inputMesh.vertices; if (inputVertices.Length == 0) return null; sourceList.Add(ArrayToSource(inputMesh.vertices, meshName + "-POSITION")); vertices vertexList = new vertices(); vertexList.id = meshName + "-VERTEX"; vertexList.input = new InputLocal[1]; vertexList.input[0] = new InputLocal(); vertexList.input[0].semantic = "POSITION"; vertexList.input[0].source = "#" + sourceList[0].id; outputMesh.vertices = vertexList; List<InputLocalOffset> offsetList = new List<InputLocalOffset>(); { InputLocalOffset offset = new InputLocalOffset(); offset.semantic = "VERTEX"; offset.offset = 0; offset.source = "#" + vertexList.id; offsetList.Add(offset); } var inputNormals = inputMesh.normals; if(inputNormals.Length > 0) { var array = ArrayToSource(inputNormals, meshName + "-Normal0"); InputLocalOffset offset = new InputLocalOffset(); offset.semantic = "NORMAL"; offset.offset = (ulong)sourceList.Count; offset.source = "#" + array.id; sourceList.Add(array); offsetList.Add(offset); } var inputUV1s = inputMesh.uv; if (inputUV1s.Length > 0) { var array = ArrayToSource(inputUV1s, meshName + "-UV0"); InputLocalOffset offset = new InputLocalOffset(); offset.semantic = "TEXCOORD"; offset.offset = (ulong)sourceList.Count; offset.source = "#" + array.id; offset.set = 0; offset.setSpecified = true; sourceList.Add(array); offsetList.Add(offset); } var inputUV2s = inputMesh.uv2; if (inputUV2s.Length > 0) { var array = ArrayToSource(inputUV2s, meshName + "-UV1"); InputLocalOffset offset = new InputLocalOffset(); offset.semantic = "TEXCOORD"; offset.offset = (ulong)sourceList.Count; offset.source = "#" + array.id; offset.set = 1; offset.setSpecified = true; sourceList.Add(array); offsetList.Add(offset); } var inputColors = inputMesh.colors; if (inputColors.Length > 0) { var array = ArrayToSource(inputColors, meshName + "-VERTEX_COLOR0"); InputLocalOffset offset = new InputLocalOffset(); offset.semantic = "COLOR"; offset.offset = (ulong)sourceList.Count; offset.source = "#" + array.id; offset.set = 0; offset.setSpecified = true; sourceList.Add(array); offsetList.Add(offset); } outputMesh.source = sourceList.ToArray(); triangles triangleList = new triangles(); triangleList.input = offsetList.ToArray(); var inputTriangles = inputMesh.triangles; triangleList.count = (ulong)inputTriangles.Length / 3; if (triangleList.count == 0) return null; StringBuilder pString = new StringBuilder(); for(int i = 0; i < inputTriangles.Length; i++) { for(int j = 0; j < triangleList.input.Length; j++) { pString.Append(inputTriangles[i]).Append(" "); } if (i % 3 == 2) pString.AppendLine(); else pString.Append(" "); } triangleList.p = pString.ToString(); outputMesh.Items = new object[1]; outputMesh.Items[0] = triangleList; return outputGeometry; }