public override Material Load(string FilePath)
        {
            Stream S = Engine.VFS.OpenFile(FilePath);

            if (S == null)
            {
                return(null);
            }

            return(ValveMaterial.CreateMaterial(S, FilePath));
        }
Esempio n. 2
0
        public static Mesh BakePart(BasePart part, ValveMaterial material = null)
        {
            Contract.Requires(part != null);
            Mesh result = null;

            Asset meshAsset    = null;
            Asset textureAsset = null;

            Vector3 scale  = null;
            CFrame  offset = null;

            if (material != null)
            {
                material.LinkedTo     = part;
                material.Reflectance  = part.Reflectance;
                material.Transparency = part.Transparency;
            }

            if (part.Transparency < 1)
            {
                if (part is MeshPart meshPart)
                {
                    string meshId = meshPart.MeshId;

                    if (meshId != null && meshId.Length > 0)
                    {
                        meshAsset = Asset.GetByAssetId(meshId);
                    }
                    else
                    {
                        string partName = meshPart.Name;
                        StandardLimbs.TryGetValue(partName, out meshAsset);
                    }

                    if (meshPart.TextureID != null)
                    {
                        textureAsset = Asset.GetByAssetId(meshPart.TextureID);
                    }

                    scale  = meshPart.Size / meshPart.InitialSize;
                    offset = part.CFrame;
                }
                else
                {
                    SpecialMesh specialMesh = part.FindFirstChildOfClass <SpecialMesh>();
                    offset = part.CFrame;

                    if (specialMesh != null && specialMesh.MeshType == MeshType.FileMesh)
                    {
                        meshAsset = Asset.GetByAssetId(specialMesh.MeshId);
                        offset   *= new CFrame(specialMesh.Offset);
                        scale     = specialMesh.Scale;

                        if (material != null)
                        {
                            textureAsset         = Asset.GetByAssetId(specialMesh.TextureId);
                            material.VertexColor = specialMesh.VertexColor;
                        }
                    }
                    else
                    {
                        DataModelMesh legacy = part.FindFirstChildOfClass <DataModelMesh>();

                        if (legacy != null)
                        {
                            meshAsset = Head.ResolveHeadMeshAsset(legacy);
                            offset   *= new CFrame(legacy.Offset);
                            scale     = legacy.Scale;
                        }
                    }
                }
            }
            else
            {
                // Just give it a blank mesh to eat for now.
                result = new Mesh();
            }

            if (meshAsset != null)
            {
                if (material != null)
                {
                    material.TextureAsset = textureAsset;
                }

                result = FromAsset(meshAsset);
                result.BakeGeometry(scale, offset);
            }

            return(result);
        }
Esempio n. 3
0
        public static libTechModel FromSourceMdl(SourceMdl Mdl, string ShaderOverride = null)
        {
            libTechModel Model = new libTechModel();

            string[] MaterialNames = Mdl.GetMaterialNames();
            string[] BodyNames     = Mdl.GetBodyNames();

            StudioModelFile.StudioBone[] Bones = Mdl.Mdl.GetBones();
            string[] BoneNames = Mdl.Mdl.GetBoneNames();

            for (int i = 0; i < Bones.Length; i++)
            {
                Model.Bones.Add(BoneNames[i], new libTechBone(BoneNames[i], Bones[i]));
            }


            // BODIES
            for (int BodyPartIdx = 0; BodyPartIdx < Mdl.Mdl.BodyPartCount; BodyPartIdx++)
            {
                StudioModelFile.StudioModel[] StudioModels = Mdl.Mdl.GetModels(BodyPartIdx).ToArray();

                // MODELS
                for (int ModelIdx = 0; ModelIdx < StudioModels.Length; ModelIdx++)
                {
                    ref StudioModelFile.StudioModel StudioModel  = ref StudioModels[ModelIdx];
                    StudioModelFile.StudioMesh[]    StudioMeshes = Mdl.Mdl.GetMeshes(ref StudioModel).ToArray();

                    // MESHES
                    for (int MeshIdx = 0; MeshIdx < StudioMeshes.Length; MeshIdx++)
                    {
                        ref StudioModelFile.StudioMesh StudioMesh = ref StudioMeshes[MeshIdx];

                        StudioVertex[] StudioVerts = new StudioVertex[Mdl.Tris.GetVertexCount(BodyPartIdx, ModelIdx, 0, MeshIdx)];
                        Mdl.Tris.GetVertices(BodyPartIdx, ModelIdx, 0, MeshIdx, StudioVerts);

                        int[] Indices = new int[Mdl.Tris.GetIndexCount(BodyPartIdx, ModelIdx, 0, MeshIdx)];
                        Mdl.Tris.GetIndices(BodyPartIdx, ModelIdx, 0, MeshIdx, Indices);

                        List <Vertex3> Vts = new List <Vertex3>();
                        for (int i = 0; i < Indices.Length; i++)
                        {
                            ref StudioVertex V = ref StudioVerts[Indices[i]];
                            Vts.Add(new Vertex3(new Vector3(V.Position.X, V.Position.Y, V.Position.Z), new Vector2(V.TexCoordX, 1.0f - V.TexCoordY), Color.White));
                        }

                        string   MatName = MaterialNames[StudioMesh.Material];
                        Material Mat     = Engine.GetMaterial(MatName);

                        if (Mat == Engine.GetMaterial("error"))
                        {
                            Mat = ValveMaterial.CreateMaterial(MatName);

                            if (Mat != Engine.GetMaterial("error"))
                            {
                                Engine.RegisterMaterial(Mat);
                            }
                        }

                        libTechMesh Msh = new libTechMesh(Vts.ToArray(), Mat);
                        Msh.Name = StudioModel.Name;
                        Model.AddMesh(Msh);
                    }