Example #1
0
        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);
        }
Example #2
0
        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);
        }