/* TextureXPanel::newTextureFromPatch * Creates a new texture called [name] from [patch]. The new texture * will be set to the dimensions of the patch, with the patch added * at 0,0 *******************************************************************/ CTexture* TextureXPanel::newTextureFromPatch(string name, string patch) { // Create new texture CTexture* tex = new CTexture(); tex->setName(name); tex->setState(2); // Setup texture scale if (texturex.getFormat() == TXF_TEXTURES) { tex->setScale(1, 1); tex->setExtended(true); } else tex->setScale(0, 0); // Add patch tex->addPatch(patch, 0, 0); // Load patch image (to determine dimensions) SImage image; tex->loadPatchImage(0, image); // Set dimensions tex->setWidth(image.getWidth()); tex->setHeight(image.getHeight()); // Update variables modified = true; // Return the new texture return tex; }
// ----------------------------------------------------------------------------- // Creates a new, empty texture // ----------------------------------------------------------------------------- void TextureXPanel::newTexture() { // Prompt for new texture name string name = wxGetTextFromUser("Enter a texture name:", "New Texture"); // Do nothing if no name entered if (name.IsEmpty()) return; // Process name if (!TxListIsTextures(texturex_)) { name = name.Upper().Truncate(8); } // Create new texture CTexture* tex = new CTexture(); tex->setName(name); tex->setState(2); // Default size = 64x128 tex->setWidth(64); tex->setHeight(128); // Setup texture scale if (TxListIsTextures(texturex_)) { tex->setScale(1, 1); tex->setExtended(true); } else tex->setScale(0, 0); // Add it after the last selected item int selected = list_textures_->getItemIndex(list_textures_->getLastSelected()); if (selected == -1) selected = texturex_.nTextures() - 1; // Add to end of the list if nothing selected texturex_.addTexture(tex, selected + 1); // Record undo level undo_manager_->beginRecord("New Texture"); undo_manager_->recordUndoStep(new TextureCreateDeleteUS(this, tex, true)); undo_manager_->endRecord(true); // Update texture list list_textures_->updateList(); // Select the new texture list_textures_->clearSelection(); list_textures_->selectItem(selected + 1); list_textures_->EnsureVisible(selected + 1); // Update variables modified_ = true; }
IResource* createObjFromName<CTexture>(const std::string& name) { CTexture* texture = new CTexture; //TODO: find locale texture //auto p = name.find_last_of("."); //if (p == std::string::npos) { // return nullptr; //} //std::string name_locale = name + GameController->GetLanguage(); //if (!texture->load(name_locale.c_str())) { if (!texture->load(name.c_str())) { dbg("Can't load texture %s. Will try placeholder...\n", name.c_str()); delete texture; // try to load a placeholder... texture = new CTexture; if (!texture->load("textures/missing.dds")) { fatal("Can't load texture %s\n", name.c_str()); delete texture; texture = nullptr; } } //} if (texture) texture->setName(name.c_str()); return texture; }
/* EntryOperations::createTexture * Same as addToPatchTable, but also creates a single-patch texture * from each added patch *******************************************************************/ bool EntryOperations::createTexture(vector<ArchiveEntry*> entries) { // Check any entries were given if (entries.size() == 0) return true; // Get parent archive Archive* parent = entries[0]->getParent(); // Create texture entries if needed if (!TextureXEditor::setupTextureEntries(parent)) return false; // Find texturex entry to add to Archive::search_options_t opt; opt.match_type = EntryType::getType("texturex"); ArchiveEntry* texturex = parent->findFirst(opt); // Check it exists bool zdtextures = false; if (!texturex) { opt.match_type = EntryType::getType("zdtextures"); texturex = parent->findFirst(opt); if (!texturex) return false; else zdtextures = true; } // Find patch table in parent archive ArchiveEntry* pnames = NULL; if (!zdtextures) { opt.match_type = EntryType::getType("pnames"); pnames = parent->findLast(opt); // Check it exists if (!pnames) return false; } // Check entries aren't locked (texture editor open or iwad) if ((pnames && pnames->isLocked()) || texturex->isLocked()) { if (parent->isReadOnly()) wxMessageBox("Cannot perform this action on an IWAD", "Error", wxICON_ERROR); else wxMessageBox("Cannot perform this action because one or more texture related entries is locked. Please close the archive's texture editor if it is open.", "Error", wxICON_ERROR); return false; } TextureXList tx; PatchTable ptable; if (zdtextures) { // Load TEXTURES tx.readTEXTURESData(texturex); } else { // Load patch table ptable.loadPNAMES(pnames); // Load TEXTUREx tx.readTEXTUREXData(texturex, ptable); } // Create textures from entries SImage image; for (unsigned a = 0; a < entries.size(); a++) { // Check entry type if (!(entries[a]->getType()->extraProps().propertyExists("image"))) { wxLogMessage("Entry %s is not a valid image", entries[a]->getName()); continue; } // Check entry name string name = entries[a]->getName(true); if (name.Length() > 8) { wxLogMessage("Entry %s has too long a name to add to the patch table (name must be 8 characters max)", entries[a]->getName()); continue; } // Add to patch table if (!zdtextures) ptable.addPatch(name); // Load patch to temp image Misc::loadImageFromEntry(&image, entries[a]); // Create texture CTexture* ntex = new CTexture(zdtextures); ntex->setName(name); ntex->addPatch(name, 0, 0); ntex->setWidth(image.getWidth()); ntex->setHeight(image.getHeight()); // Setup texture scale if (tx.getFormat() == TXF_TEXTURES) ntex->setScale(1, 1); else ntex->setScale(0, 0); // Add to texture list tx.addTexture(ntex); } if (zdtextures) { // Write texture data back to textures entry tx.writeTEXTURESData(texturex); } else { // Write patch table data back to pnames entry ptable.writePNAMES(pnames); // Write texture data back to texturex entry tx.writeTEXTUREXData(texturex, ptable); } return true; }