private SEAMesh AppendMesh(Scene scene, Node node, List <Mesh> meshes, SEAObject3D parent) { int sIndex = GetIndexByTag(node); if (sIndex != -1) { return((SEAMesh)Writer.Objects[sIndex]); } List <Animation> anmList = GetAnimation(scene, node.Name); SEAGeometry geo = AppendGeometry(scene, node, meshes); if (geo != null) { SEAMesh seaMesh = new SEAMesh(node.Name); /*if (meshes[0].HasMeshAnimationAttachments) * { * }*/ Mesh mesh = meshes[0]; if (Modifiers && geo.jointPerVertex > 0) { seaMesh.modifiers.Add((uint)GetIndex(AppendSkeleton(scene, mesh))); seaMesh.animations.Add((uint)GetIndex(AppendSkeletonAnimation(scene, mesh))); } if (mesh.MaterialIndex != -1) { seaMesh.materials.Add(GetIndex(AppendMaterial(scene, scene.Materials[mesh.MaterialIndex]))); } seaMesh.parent = parent != null?GetIndex(parent) : -1; objects.Add(seaMesh); Writer.AddObject(seaMesh); seaMesh.transform = To3x4Array(node.Transform); seaMesh.geometry = GetIndex(geo); seaMesh.tag = node; return(seaMesh); } return(null); }
private SEAGeometry AppendGeometry(Scene scene, Node node, List <Mesh> geometryList) { int sIndex = GetIndexByTag(node); if (sIndex != -1) { return((SEAGeometry)Writer.Objects[sIndex]); } List <float> vertex = new List <float>(); List <List <float> > uvs = new List <List <float> >(); List <float> normal = new List <float>(); List <float> tangent = new List <float>(); List <uint> joints = new List <uint>(); List <float> weights = new List <float>(); List <List <float> > colors = new List <List <float> >(); List <List <uint> > indexes = new List <List <uint> >(); uint countUV = 0; uint countColor = 0; uint jointPerVertex = 0; uint indexOffset = 0; bool containsNormal = false; bool containsTangent = false; foreach (Mesh mesh in geometryList) { countUV = (uint)Math.Max(countUV, mesh.TextureCoordinateChannelCount); countColor = (uint)Math.Max(countColor, mesh.VertexColorChannelCount); if (mesh.HasNormals) { containsNormal = mesh.HasNormals; } if (mesh.HasTangentBasis) { containsTangent = mesh.HasTangentBasis; } if (mesh.HasBones) { foreach (Bone bone in mesh.Bones) { if (bone.VertexWeightCount > jointPerVertex) { jointPerVertex = (uint)bone.VertexWeightCount; } } } } for (int i = 0; i < countUV; i++) { uvs.Add(new List <float>()); } for (int i = 0; i < countColor; i++) { colors.Add(new List <float>()); } foreach (Mesh geometry in geometryList) { if (!geometry.HasVertices || !geometry.HasFaces) { continue; } int NumVertex = geometry.VertexCount; for (int i = 0; i < NumVertex; i++) { vertex.Add(geometry.Vertices[i].X); vertex.Add(geometry.Vertices[i].Y); vertex.Add(geometry.Vertices[i].Z); } for (int i = 0; i < countUV; i++) { List <float> uv = uvs[i]; if (geometry.HasTextureCoords(i)) { List <Vector3D> uv3d = geometry.TextureCoordinateChannels[i]; for (int j = 0; j < NumVertex; j++) { uv.Add(uv3d[j].X); uv.Add(1 - uv3d[j].Y); } } else { for (int j = 0; j < NumVertex; j++) { uv.Add(0); uv.Add(0); } } } if (containsNormal) { if (geometry.HasNormals) { for (int i = 0; i < NumVertex; i++) { normal.Add(geometry.Normals[i].X); normal.Add(geometry.Normals[i].Y); normal.Add(geometry.Normals[i].Z); } } else { for (int i = 0; i < NumVertex; i++) { normal.Add(0); normal.Add(0); normal.Add(0); } } } if (containsTangent) { if (geometry.HasTangentBasis) { for (int i = 0; i < NumVertex; i++) { tangent.Add(geometry.Tangents[i].X); tangent.Add(geometry.Tangents[i].Y); tangent.Add(geometry.Tangents[i].Z); } } else { for (int i = 0; i < NumVertex; i++) { tangent.Add(0); tangent.Add(0); tangent.Add(0); } } } for (int i = 0; i < colors.Count; i++) { List <float> color = colors[i]; if (geometry.HasVertexColors(i)) { List <Color4D> clr = geometry.VertexColorChannels[i]; int j = 0; while (j < NumVertex) { color.Add(clr[j].R); color.Add(clr[j].G); color.Add(clr[j].B); color.Add(clr[j].A); } } else { int j = 0; while (j < NumVertex) { color.Add(0); color.Add(0); color.Add(0); color.Add(0); } } } if (Modifiers && jointPerVertex > 0) { foreach (Bone bone in geometry.Bones) { int i = 0; for (; i < bone.VertexWeights.Count; i++) { joints.Add(indexOffset + (uint)bone.VertexWeights[i].VertexID); weights.Add((uint)bone.VertexWeights[i].Weight); } for (; i < jointPerVertex; i++) { joints.Add(0); weights.Add(0); } } } List <uint> index = geometry.GetUnsignedIndices().ToList(); for (int i = 0; i < index.Count; i++) { index[i] += indexOffset; } indexOffset += (uint)NumVertex; indexes.Add(index); } float[][] _uv = new float[uvs.Count][]; float[][] _color = new float[colors.Count][]; uint[][] _indexes = new uint[indexes.Count][]; for (int i = 0; i < uvs.Count; i++) { _uv[i] = uvs[i].ToArray(); } for (int i = 0; i < colors.Count; i++) { _color[i] = colors[i].ToArray(); } for (int i = 0; i < indexes.Count; i++) { _indexes[i] = indexes[i].ToArray(); } SEAGeometry geo = new SEAGeometry(GetValidString(geometries, node.Name)); geo.vertex = vertex.ToArray(); geo.uv = uvs.Count > 0 ? _uv : null; geo.normal = normal.Count > 0 ? normal.ToArray() : null; geo.tangent = tangent.Count > 0 ? tangent.ToArray() : null; geo.color = colors.Count > 0 ? _color : null; geo.weight = weights.Count > 0 ? weights.ToArray() : null; geo.joint = joints.Count > 0 ? joints.ToArray() : null; geo.jointPerVertex = jointPerVertex; geo.indexes = _indexes; geo.tag = node; geometries.Add(geo); Writer.AddObject(geo); return(geo); }