Пример #1
0
    /// <summary>
    /// 初始化
    /// </summary>
    public void Initialize()
    {
        if (m_FBXSource == null)
        {
            EB.Debug.LogError("部件引用的预置为空了:{0}", name);
            return;
        }

        EB.Debug.LogObjectMgrAsset("初始化部件<color=#ff0000>克隆一次,部件需要的:</color>{0},预置体:<color=#00ff00>{1}</color>", name, m_FBXSource.name);
        GameObject partitionObj = GameObject.Instantiate(m_FBXSource, Vector3.zero, Quaternion.identity) as GameObject;

        partitionObj.transform.parent = transform;
        SkinnedMeshRenderer[] skinnedMeshes = partitionObj.GetComponentsInChildren <SkinnedMeshRenderer>();
        for (int i = skinnedMeshes.Length - 1; i >= 0; i--)
        {
            SkinnedMeshRenderer mesh = skinnedMeshes[i];
            if (mesh == null)
            {
                continue;
            }
            for (int j = m_MaterialRegistry.Count - 1; j >= 0; j--)
            {
                MeshMaterialInfo info = m_MaterialRegistry[j];
                if (info.MeshName == mesh.name)
                {
                    mesh.sharedMaterials = info.Materials;
                    break;
                }
            }
        }

        GM.AssetUtils.FixShaderInEditor(partitionObj);
    }
Пример #2
0
    public void RegisterMesh(string meshName, Material[] materials)
    {
        for (int i = m_MaterialRegistry.Count - 1; i >= 0; i--)
        {
            if (m_MaterialRegistry[i].MeshName == meshName)
            {
                MeshMaterialInfo info = m_MaterialRegistry[i];
                info.Materials        = materials;
                info.MaterialCount    = materials == null ? 0 : materials.Length;
                m_MaterialRegistry[i] = info;
                return;
            }
        }
        MeshMaterialInfo newInfo = new MeshMaterialInfo();

        newInfo.MeshName  = meshName;
        newInfo.Materials = materials;
        if (materials != null)
        {
            newInfo.MaterialCount = materials.Length;
        }
        else
        {
            newInfo.MaterialCount = 0;
        }

        m_MaterialRegistry.Add(newInfo);
    }
Пример #3
0
        private bool ParseMeshData(Assimp.Scene scene)
        {
            if (!scene.HasMeshes)
            {
                return(false);
            }

            Assimp.Mesh[] meshes = scene.Meshes;
            if (meshes.Length == 0)
            {
                return(false);
            }

            m_meshData    = new MeshData[meshes.Length];
            m_meshMatInfo = new MeshMaterialInfo[meshes.Length];

            for (int i = 0; i < meshes.Length; i++)
            {
                Assimp.Mesh      mesh = meshes[i];
                MeshData         md   = new MeshData();
                MeshMaterialInfo info = new MeshMaterialInfo();

                if (mesh.HasVertices)
                {
                    Assimp.Vector3D[]    assimpPos = mesh.Vertices;
                    DataBuffer <Vector3> positions = new DataBuffer <Vector3>(assimpPos.Length);
                    MemoryHelper.Copy(assimpPos, positions.Buffer, Vector3.SizeInBytes * assimpPos.Length);
                    md.Positions = positions;
                }

                if (mesh.HasNormals)
                {
                    Assimp.Vector3D[]    assimpNorms = mesh.Normals;
                    DataBuffer <Vector3> normals     = new DataBuffer <Vector3>(assimpNorms.Length);
                    MemoryHelper.Copy(assimpNorms, normals.Buffer, Vector3.SizeInBytes * assimpNorms.Length);
                    md.Normals      = normals;
                    info.HasNormals = true;
                }

                if (mesh.HasTangentBasis)
                {
                    Assimp.Vector3D[]    assimpTangs   = mesh.Tangents;
                    Assimp.Vector3D[]    assimpBitangs = mesh.BiTangents;
                    DataBuffer <Vector3> tangents      = new DataBuffer <Vector3>(assimpTangs.Length);
                    DataBuffer <Vector3> bitangents    = new DataBuffer <Vector3>(assimpBitangs.Length);
                    MemoryHelper.Copy(assimpTangs, tangents.Buffer, Vector3.SizeInBytes * assimpTangs.Length);
                    MemoryHelper.Copy(assimpBitangs, bitangents.Buffer, Vector3.SizeInBytes * assimpBitangs.Length);
                    md.Tangents          = tangents;
                    md.Binormals         = bitangents;
                    info.HasTangentBasis = true;
                }

                if (mesh.HasVertexColors(0))
                {
                    Assimp.Color4D[] assimpColors = mesh.GetVertexColors(0);
                    md.Colors            = new DataBuffer <Color>(ConvertColors(assimpColors));
                    info.HasVertexColors = true;
                }

                if (mesh.HasTextureCoords(0))
                {
                    Assimp.Vector3D[] assimpUV = mesh.GetTextureCoords(0);
                    md.TextureCoordinates = new DataBuffer <Vector2>(ConvertVectors(assimpUV));
                    info.HasTexCoords     = true;
                }

                md.Indices = new DataBuffer <int>(mesh.GetIntIndices());
                md.Reconstruct();
                m_meshMatInfo[i] = info;
                m_meshData[i]    = md;
            }

            ParseMaterials(scene);
            return(true);
        }