/* GfxEntryPanel::detectOffsetType * Detects the offset view type of the current entry *******************************************************************/ int GfxEntryPanel::detectOffsetType() { if (!entry) return GFXVIEW_DEFAULT; if (!entry->getParent()) return GFXVIEW_DEFAULT; // Check what section of the archive the entry is in string section = entry->getParent()->detectNamespace(entry); if (section == "sprites") { SImage* img = getImage(); int left = -img->offset().x; int right = -img->offset().x + img->getWidth(); int top = -img->offset().y; int bottom = -img->offset().y + img->getHeight(); if (top >= 0 && bottom <= 216 && left >= 0 && right <= 336) return GFXVIEW_HUD; else return GFXVIEW_SPRITE; } // Check for png image if (entry->getType()->getFormat() == "img_png") { if (getImage()->offset().x == 0 && getImage()->offset().y == 0) return GFXVIEW_DEFAULT; else { SImage* img = getImage(); int left = -img->offset().x; int right = -img->offset().x + img->getWidth(); int top = -img->offset().y; int bottom = -img->offset().y + img->getHeight(); if (top >= 0 && bottom <= 216 && left >= 0 && right <= 336) return GFXVIEW_HUD; else return GFXVIEW_SPRITE; } } return GFXVIEW_DEFAULT; }
bool exportEntry() { wxFileName fn(appPath(entry->getName(), DIR_TEMP)); fn.SetExt("png"); // Create image from entry SImage image; if (!Misc::loadImageFromEntry(&image, entry)) { Global::error = "Could not read graphic"; return false; } // Set export info gfx_format = image.getFormat()->getId(); offsets = image.offset(); palette.copyPalette(theMainWindow->getPaletteChooser()->getSelectedPalette(entry)); // Write png data MemChunk png; SIFormat* fmt_png = SIFormat::getFormat("png"); if (!fmt_png->saveImage(image, png, &palette)) { Global::error = "Error converting to png"; return false; } // Export file and start monitoring if successful filename = fn.GetFullPath(); if (png.exportFile(filename)) { file_modified = wxFileModificationTime(filename); Start(1000); return true; } return false; }
/* MapTextureManager::getVerticalOffset * Detects offset hacks such as that used by the wall torch thing in * Heretic (type 50). If the Y offset is noticeably larger than the * sprite height, that means the thing is supposed to be rendered * above its real position. *******************************************************************/ int MapTextureManager::getVerticalOffset(string name) { // Don't bother looking for nameless sprites if (name.IsEmpty()) return 0; // Get sprite matching name ArchiveEntry* entry = theResourceManager->getPatchEntry(name, "sprites", archive); if (!entry) entry = theResourceManager->getPatchEntry(name, "", archive); if (entry) { SImage image; Misc::loadImageFromEntry(&image, entry); int h = image.getHeight(); int o = image.offset().y; if (o > h) return o - h; else return 0; } return 0; }
// ----------------------------------------------------------------------------- // Detects offset hacks such as that used by the wall torch thing in Heretic. // If the Y offset is noticeably larger than the sprite height, that means the // thing is supposed to be rendered above its real position. // ----------------------------------------------------------------------------- int MapTextureManager::verticalOffset(std::string_view name) const { // Don't bother looking for nameless sprites if (name.empty()) return 0; // Get sprite matching name auto entry = App::resources().getPatchEntry(name, "sprites", archive_); if (!entry) entry = App::resources().getPatchEntry(name, "", archive_); if (entry) { SImage image; Misc::loadImageFromEntry(&image, entry); int h = image.height(); int o = image.offset().y; if (o > h) return o - h; else return 0; } return 0; }