/// <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); }
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); }
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); }