Skip to content

Commit 1e8c645

Browse files
committed
tag: Decompile D1 XB1 shaders
1 parent 6276b5a commit 1e8c645

File tree

1 file changed

+40
-27
lines changed

1 file changed

+40
-27
lines changed

src/gui/tag.rs

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ pub struct TagView {
9898
hexview_referenced: Option<TagHexView>,
9999
mode: TagViewMode,
100100

101-
decompiled_shader: Result<String, String>,
101+
decompiled_shader: Option<Result<String, String>>,
102102
}
103103

104104
#[macro_export]
@@ -275,13 +275,26 @@ impl TagView {
275275
};
276276

277277
let decompiled_shader = if tag_type.is_shader() && tag_type.is_header() {
278-
package_manager()
279-
.read_tag(tag_entry.reference)
280-
.ok()
281-
.map(|d| decompile_shader(&d))
282-
.unwrap_or(Err("Failed to read shader data".to_string()))
278+
Some(
279+
package_manager()
280+
.read_tag(tag_entry.reference)
281+
.ok()
282+
.map(|d| decompile_shader(&d))
283+
.unwrap_or(Err("Failed to read shader data".to_string())),
284+
)
285+
} else if matches!(tag_entry.reference, 0x80801AB4 | 0x80801B7C)
286+
&& package_manager().platform == PackagePlatform::XboxOne
287+
&& package_manager().version == GameVersion::Destiny(DestinyVersion::DestinyRiseOfIron)
288+
{
289+
Some(
290+
package_manager()
291+
.read_tag(tag)
292+
.ok()
293+
.map(|d| decompile_shader(&d[0x30..]))
294+
.unwrap_or(Err("Failed to read shader data".to_string())),
295+
)
283296
} else {
284-
Err("Not a shader".to_string())
297+
None
285298
};
286299

287300
let mut string_hashes_hexview = string_hashes
@@ -462,7 +475,26 @@ impl TagView {
462475
ui.heading(RichText::new("⚠ Tag data failed to read").color(Color32::YELLOW));
463476
}
464477

465-
if self.tag_type.is_tag() {
478+
if let Some(decompiled_shader) = &self.decompiled_shader {
479+
match &decompiled_shader {
480+
Ok(d) => {
481+
egui::ScrollArea::vertical()
482+
.auto_shrink([false; 2])
483+
.show(ui, |ui| {
484+
// ui.monospace(d);
485+
egui_extras::syntax_highlighting::code_view_ui(
486+
ui,
487+
&CodeTheme::dark(),
488+
d,
489+
"cpp",
490+
)
491+
});
492+
}
493+
Err(e) => {
494+
ui.label(format!("Decompiled shader output not available: {e}"));
495+
}
496+
}
497+
} else if self.tag_type.is_tag() {
466498
ui.horizontal_wrapped(|ui| {
467499
if ui
468500
.add_enabled(
@@ -615,25 +647,6 @@ impl TagView {
615647
ui.colored_label(Color32::RED, strip_ansi_codes(&format!("{e:?}")));
616648
}
617649
}
618-
} else if self.tag_type.is_shader() && self.tag_type.is_header() {
619-
match &self.decompiled_shader {
620-
Ok(d) => {
621-
egui::ScrollArea::vertical()
622-
.auto_shrink([false; 2])
623-
.show(ui, |ui| {
624-
// ui.monospace(d);
625-
egui_extras::syntax_highlighting::code_view_ui(
626-
ui,
627-
&CodeTheme::dark(),
628-
d,
629-
"cpp",
630-
)
631-
});
632-
}
633-
Err(e) => {
634-
ui.label(format!("Decompiled shader output not available: {e}"));
635-
}
636-
}
637650
} else {
638651
ui.label(RichText::new("Traversal not available for non-8080 tags").italics());
639652
}

0 commit comments

Comments
 (0)