private void LoadShaders(bool spec) { var errMat = GetErrorMaterial(); if (sbsp.Shaders.Count == 0) { var matGroup = new MaterialGroup(); matGroup.Children.Add(errMat); shaders.Add(matGroup); return; } foreach (var s in sbsp.Shaders) { #region Skip Unused bool found = false; foreach (var sec in sbsp.ModelSections) { foreach (var sub in sec.Submeshes) { if (sub.ShaderIndex == sbsp.Shaders.IndexOf(s)) { found = true; break; } } if (found) { break; } } if (!found) { shaders.Add(null); continue; } #endregion var matGroup = new MaterialGroup(); try { var rmshTag = cache.IndexItems.GetItemByID(s.tagID); var rmsh = DefinitionsManager.rmsh(cache, rmshTag); int mapIndex = 0; if (cache.Version >= DefinitionSet.Halo3Beta && cache.Version <= DefinitionSet.HaloReachRetail) { var rmt2Tag = cache.IndexItems.GetItemByID(rmsh.Properties[0].TemplateTagID); var rmt2 = DefinitionsManager.rmt2(cache, rmt2Tag); for (int i = 0; i < rmt2.UsageBlocks.Count; i++) { if (rmt2.UsageBlocks[i].Usage.Contains("base_map") || rmt2.UsageBlocks[i].Usage == "foam_texture") { mapIndex = i; } } } var bitmTag = cache.IndexItems.GetItemByID(rmsh.Properties[0].ShaderMaps[mapIndex].BitmapTagID); var image = BitmapExtractor.GetBitmapByTag(cache, bitmTag, 0, System.Drawing.Imaging.PixelFormat.Format32bppRgb); if (TextureScale < 1) { image = new Bitmap(image, new Size((int)(image.Width * TextureScale), (int)(image.Height * TextureScale))); } if (image == null) { matGroup.Children.Add(errMat); shaders.Add(matGroup); continue; } int tileIndex = rmsh.Properties[0].ShaderMaps[mapIndex].TilingIndex; float uTiling; try { uTiling = rmsh.Properties[0].Tilings[tileIndex].UTiling; } catch { uTiling = 1; } float vTiling; try { vTiling = rmsh.Properties[0].Tilings[tileIndex].VTiling; } catch { vTiling = 1; } MemoryStream stream = new MemoryStream(); //PNG for transparency //image.Save(stream, (rmshTag.ClassCode == "rmsh" || rmshTag.ClassCode == "rmtr" || rmshTag.ClassCode == "rmt" || rmshTag.ClassCode == "mat") ? ImageFormat.Bmp : ImageFormat.Bmp); image.Save(stream, ImageFormat.Bmp); image.Dispose(); var diffuse = new BitmapImage(); diffuse.BeginInit(); diffuse.StreamSource = stream; diffuse.EndInit(); matGroup.Children.Add(new DiffuseMaterial() { Brush = new ImageBrush(diffuse) { ViewportUnits = BrushMappingMode.Absolute, TileMode = TileMode.Tile, Viewport = new System.Windows.Rect(0, 0, 1f / Math.Abs(uTiling), 1f / Math.Abs(vTiling)) } }); shaders.Add(matGroup); } catch { matGroup.Children.Add(errMat); shaders.Add(matGroup); } } }