public override Material Load(string FilePath) { Stream S = Engine.VFS.OpenFile(FilePath); if (S == null) { return(null); } return(ValveMaterial.CreateMaterial(S, FilePath)); }
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); }
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); }