diff --git a/include/core/tileset.h b/include/core/tileset.h index cf0bb67c..9113788a 100644 --- a/include/core/tileset.h +++ b/include/core/tileset.h @@ -28,13 +28,14 @@ public: QList *tiles = nullptr; QList *metatiles = nullptr; QList> *palettes = nullptr; + QList> *palettePreviews = nullptr; Tileset* copy(); static Tileset* getBlockTileset(int, Tileset*, Tileset*); static Metatile* getMetatile(int, Tileset*, Tileset*); - static QList> getBlockPalettes(Tileset*, Tileset*); - static QList getPalette(int, Tileset*, Tileset*); + static QList> getBlockPalettes(Tileset*, Tileset*, bool useTruePalettes = false); + static QList getPalette(int, Tileset*, Tileset*, bool useTruePalettes = false); static bool metatileIsValid(uint16_t metatileId, Tileset *, Tileset *); bool appendToHeaders(QString headerFile, QString friendlyName); diff --git a/include/mainwindow.h b/include/mainwindow.h index fd320576..518c3d9d 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -69,6 +69,9 @@ public: QJSValue getTilesetPalette(Tileset *tileset, int paletteIndex); Q_INVOKABLE QJSValue getPrimaryTilesetPalette(int paletteIndex); Q_INVOKABLE QJSValue getSecondaryTilesetPalette(int paletteIndex); + void setTilesetPalettePreview(Tileset *tileset, int paletteIndex, QList> colors); + Q_INVOKABLE void setPrimaryTilesetPalettePreview(int paletteIndex, QList> colors); + Q_INVOKABLE void setSecondaryTilesetPalettePreview(int paletteIndex, QList> colors); public slots: diff --git a/include/ui/imageproviders.h b/include/ui/imageproviders.h index de54e1aa..89dfdce9 100644 --- a/include/ui/imageproviders.h +++ b/include/ui/imageproviders.h @@ -8,9 +8,9 @@ QImage getCollisionMetatileImage(Block); QImage getCollisionMetatileImage(int, int); -QImage getMetatileImage(uint16_t, Tileset*, Tileset*); +QImage getMetatileImage(uint16_t, Tileset*, Tileset*, bool useTruePalettes = false); QImage getTileImage(uint16_t, Tileset*, Tileset*); -QImage getPalettedTileImage(uint16_t, Tileset*, Tileset*, int); +QImage getPalettedTileImage(uint16_t, Tileset*, Tileset*, int, bool useTruePalettes = false); QImage getGreyscaleTileImage(uint16_t tile, Tileset *primaryTileset, Tileset *secondaryTileset); static QList greyscalePalette({ diff --git a/src/core/tileset.cpp b/src/core/tileset.cpp index 450458b8..4c9a9fbb 100644 --- a/src/core/tileset.cpp +++ b/src/core/tileset.cpp @@ -46,6 +46,14 @@ Tileset* Tileset::copy() { } copy->palettes->append(copyPalette); } + copy->palettePreviews = new QList>; + for (QList palette : *this->palettePreviews) { + QList copyPalette; + for (QRgb color : palette) { + copyPalette.append(color); + } + copy->palettePreviews->append(copyPalette); + } return copy; } @@ -80,24 +88,27 @@ bool Tileset::metatileIsValid(uint16_t metatileId, Tileset *primaryTileset, Tile return true; } -QList> Tileset::getBlockPalettes(Tileset *primaryTileset, Tileset *secondaryTileset) { +QList> Tileset::getBlockPalettes(Tileset *primaryTileset, Tileset *secondaryTileset, bool useTruePalettes) { QList> palettes; + auto primaryPalettes = useTruePalettes ? primaryTileset->palettes : primaryTileset->palettePreviews; for (int i = 0; i < Project::getNumPalettesPrimary(); i++) { - palettes.append(primaryTileset->palettes->at(i)); + palettes.append(primaryPalettes->at(i)); } + auto secondaryPalettes = useTruePalettes ? secondaryTileset->palettes : secondaryTileset->palettePreviews; for (int i = Project::getNumPalettesPrimary(); i < Project::getNumPalettesTotal(); i++) { - palettes.append(secondaryTileset->palettes->at(i)); + palettes.append(secondaryPalettes->at(i)); } return palettes; } -QList Tileset::getPalette(int paletteId, Tileset *primaryTileset, Tileset *secondaryTileset) { +QList Tileset::getPalette(int paletteId, Tileset *primaryTileset, Tileset *secondaryTileset, bool useTruePalettes) { QList paletteTable; Tileset *tileset = paletteId < Project::getNumPalettesPrimary() ? primaryTileset : secondaryTileset; - for (int i = 0; i < tileset->palettes->at(paletteId).length(); i++) { - paletteTable.append(tileset->palettes->at(paletteId).at(i)); + auto palettes = useTruePalettes ? tileset->palettes : tileset->palettePreviews; + for (int i = 0; i < palettes->at(paletteId).length(); i++) { + paletteTable.append(palettes->at(paletteId).at(i)); } return paletteTable; } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 29b73ed7..ed9653d0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1056,6 +1056,7 @@ void MainWindow::on_actionNew_Tileset_triggered() { newSet->metatiles->append(mt); } newSet->palettes = new QList>(); + newSet->palettePreviews = new QList>(); newSet->palettePaths = *new QList(); for(int i = 0; i < 16; ++i) { QList *currentPal = new QList(); @@ -1063,11 +1064,13 @@ void MainWindow::on_actionNew_Tileset_triggered() { currentPal->append(qRgb(0,0,0)); } newSet->palettes->append(*currentPal); + newSet->palettePreviews->append(*currentPal); QString fileName; fileName.sprintf("%02d.pal", i); newSet->palettePaths.append(fullDirectoryPath+"/palettes/" + fileName); } (*newSet->palettes)[0][1] = qRgb(255,0,255); + (*newSet->palettePreviews)[0][1] = qRgb(255,0,255); newSet->is_compressed = "TRUE"; newSet->padding = "0"; editor->project->saveTilesetTilesImage(newSet); @@ -2758,8 +2761,8 @@ void MainWindow::setTilesetPalette(Tileset *tileset, int paletteIndex, QListpalettes; - (*palettes)[paletteIndex][i] = qRgb(colors[i][0], colors[i][1], colors[i][2]); + (*tileset->palettes)[paletteIndex][i] = qRgb(colors[i][0], colors[i][1], colors[i][2]); + (*tileset->palettePreviews)[paletteIndex][i] = qRgb(colors[i][0], colors[i][1], colors[i][2]); } if (this->tilesetEditor) { @@ -2807,3 +2810,37 @@ QJSValue MainWindow::getSecondaryTilesetPalette(int paletteIndex) { return QJSValue(); return this->getTilesetPalette(this->editor->map->layout->tileset_secondary, paletteIndex); } + +void MainWindow::setTilesetPalettePreview(Tileset *tileset, int paletteIndex, QList> colors) { + if (!this->editor || !this->editor->map || !this->editor->map->layout) + return; + if (paletteIndex >= tileset->palettePreviews->size()) + return; + if (colors.size() != 16) + return; + + for (int i = 0; i < 16; i++) { + if (colors[i].size() != 3) + continue; + auto palettes = tileset->palettePreviews; + (*palettes)[paletteIndex][i] = qRgb(colors[i][0], colors[i][1], colors[i][2]); + } + + this->editor->metatile_selector_item->draw(); + this->editor->selected_border_metatiles_item->draw(); + this->editor->map_item->draw(true); + this->editor->updateMapBorder(); + this->editor->updateMapConnections(); +} + +void MainWindow::setPrimaryTilesetPalettePreview(int paletteIndex, QList> colors) { + if (!this->editor || !this->editor->map || !this->editor->map->layout || !this->editor->map->layout->tileset_primary) + return; + this->setTilesetPalettePreview(this->editor->map->layout->tileset_primary, paletteIndex, colors); +} + +void MainWindow::setSecondaryTilesetPalettePreview(int paletteIndex, QList> colors) { + if (!this->editor || !this->editor->map || !this->editor->map->layout || !this->editor->map->layout->tileset_secondary) + return; + this->setTilesetPalettePreview(this->editor->map->layout->tileset_secondary, paletteIndex, colors); +} diff --git a/src/project.cpp b/src/project.cpp index 7e2a8731..ce8420bc 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -1585,6 +1585,7 @@ void Project::loadTilesetAssets(Tileset* tileset) { // palettes QList> *palettes = new QList>; + QList> *palettePreviews = new QList>; for (int i = 0; i < tileset->palettePaths.length(); i++) { QList palette; QString path = tileset->palettePaths.value(i); @@ -1619,8 +1620,10 @@ void Project::loadTilesetAssets(Tileset* tileset) { } palettes->append(palette); + palettePreviews->append(palette); } tileset->palettes = palettes; + tileset->palettePreviews = palettePreviews; } void Project::loadTilesetTiles(Tileset *tileset, QImage image) { diff --git a/src/ui/imageproviders.cpp b/src/ui/imageproviders.cpp index 286badb3..f060450e 100644 --- a/src/ui/imageproviders.cpp +++ b/src/ui/imageproviders.cpp @@ -13,7 +13,7 @@ QImage getCollisionMetatileImage(int collision, int elevation) { return collisionImage.toImage(); } -QImage getMetatileImage(uint16_t tile, Tileset *primaryTileset, Tileset *secondaryTileset) { +QImage getMetatileImage(uint16_t tile, Tileset *primaryTileset, Tileset *secondaryTileset, bool useTruePalettes) { QImage metatile_image(16, 16, QImage::Format_RGBA8888); Metatile* metatile = Tileset::getMetatile(tile, primaryTileset, secondaryTileset); @@ -27,7 +27,7 @@ QImage getMetatileImage(uint16_t tile, Tileset *primaryTileset, Tileset *seconda metatile_image.fill(Qt::magenta); return metatile_image; } - QList> palettes = Tileset::getBlockPalettes(primaryTileset, secondaryTileset); + QList> palettes = Tileset::getBlockPalettes(primaryTileset, secondaryTileset, useTruePalettes); QPainter metatile_painter(&metatile_image); for (int layer = 0; layer < 2; layer++) @@ -95,8 +95,8 @@ QImage getColoredTileImage(uint16_t tile, Tileset *primaryTileset, Tileset *seco return tileImage; } -QImage getPalettedTileImage(uint16_t tile, Tileset *primaryTileset, Tileset *secondaryTileset, int paletteId) { - QList palette = Tileset::getPalette(paletteId, primaryTileset, secondaryTileset); +QImage getPalettedTileImage(uint16_t tile, Tileset *primaryTileset, Tileset *secondaryTileset, int paletteId, bool useTruePalettes) { + QList palette = Tileset::getPalette(paletteId, primaryTileset, secondaryTileset, useTruePalettes); return getColoredTileImage(tile, primaryTileset, secondaryTileset, palette); } diff --git a/src/ui/metatilelayersitem.cpp b/src/ui/metatilelayersitem.cpp index 774e1388..cf4c3b9f 100644 --- a/src/ui/metatilelayersitem.cpp +++ b/src/ui/metatilelayersitem.cpp @@ -18,7 +18,7 @@ void MetatileLayersItem::draw() { QPainter painter(&pixmap); for (int i = 0; i < 8; i++) { Tile tile = this->metatile->tiles->at(i); - QImage tileImage = getPalettedTileImage(tile.tile, this->primaryTileset, this->secondaryTileset, tile.palette) + QImage tileImage = getPalettedTileImage(tile.tile, this->primaryTileset, this->secondaryTileset, tile.palette, true) .mirrored(tile.xflip, tile.yflip) .scaled(16, 16); painter.drawImage(tileCoords.at(i), tileImage); diff --git a/src/ui/paletteeditor.cpp b/src/ui/paletteeditor.cpp index 87169784..fd9eeb9a 100644 --- a/src/ui/paletteeditor.cpp +++ b/src/ui/paletteeditor.cpp @@ -203,6 +203,7 @@ void PaletteEditor::setColor(int colorIndex) { ? this->primaryTileset : this->secondaryTileset; (*tileset->palettes)[paletteNum][colorIndex] = qRgb(red, green, blue); + (*tileset->palettePreviews)[paletteNum][colorIndex] = qRgb(red, green, blue); this->refreshColor(colorIndex); this->commitEditHistory(paletteNum); emit this->changedPaletteColor(); @@ -246,8 +247,10 @@ void PaletteEditor::setColorsFromHistory(PaletteHistoryItem *history, int palett for (int i = 0; i < 16; i++) { if (paletteId < Project::getNumPalettesPrimary()) { (*this->primaryTileset->palettes)[paletteId][i] = history->colors.at(i); + (*this->primaryTileset->palettePreviews)[paletteId][i] = history->colors.at(i); } else { (*this->secondaryTileset->palettes)[paletteId][i] = history->colors.at(i); + (*this->secondaryTileset->palettePreviews)[paletteId][i] = history->colors.at(i); } } @@ -296,8 +299,10 @@ void PaletteEditor::on_actionImport_Palette_triggered() for (int i = 0; i < 16; i++) { if (paletteId < Project::getNumPalettesPrimary()) { (*this->primaryTileset->palettes)[paletteId][i] = palette.at(i); + (*this->primaryTileset->palettePreviews)[paletteId][i] = palette.at(i); } else { (*this->secondaryTileset->palettes)[paletteId][i] = palette.at(i); + (*this->secondaryTileset->palettePreviews)[paletteId][i] = palette.at(i); } } diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp index 069a9e23..3b09a069 100644 --- a/src/ui/tileseteditor.cpp +++ b/src/ui/tileseteditor.cpp @@ -177,7 +177,7 @@ void TilesetEditor::drawSelectedTiles() { int tileIndex = 0; for (int j = 0; j < dimensions.y(); j++) { for (int i = 0; i < dimensions.x(); i++) { - QImage tileImage = getPalettedTileImage(tiles.at(tileIndex).tile, this->primaryTileset, this->secondaryTileset, tiles.at(tileIndex).palette) + QImage tileImage = getPalettedTileImage(tiles.at(tileIndex).tile, this->primaryTileset, this->secondaryTileset, tiles.at(tileIndex).palette, true) .mirrored(tiles.at(tileIndex).xflip, tiles.at(tileIndex).yflip) .scaled(16, 16); tileIndex++; diff --git a/src/ui/tileseteditormetatileselector.cpp b/src/ui/tileseteditormetatileselector.cpp index eae7d4cc..b5732c99 100644 --- a/src/ui/tileseteditormetatileselector.cpp +++ b/src/ui/tileseteditormetatileselector.cpp @@ -22,7 +22,7 @@ void TilesetEditorMetatileSelector::draw() { if (i >= primaryLength) { tile += Project::getNumMetatilesPrimary() - primaryLength; } - QImage metatile_image = getMetatileImage(tile, this->primaryTileset, this->secondaryTileset).scaled(32, 32); + QImage metatile_image = getMetatileImage(tile, this->primaryTileset, this->secondaryTileset, true).scaled(32, 32); int map_y = i / this->numMetatilesWide; int map_x = i % this->numMetatilesWide; QPoint metatile_origin = QPoint(map_x * 32, map_y * 32); diff --git a/src/ui/tileseteditortileselector.cpp b/src/ui/tileseteditortileselector.cpp index d41cc754..40d58952 100644 --- a/src/ui/tileseteditortileselector.cpp +++ b/src/ui/tileseteditortileselector.cpp @@ -22,19 +22,19 @@ void TilesetEditorTileSelector::draw() { int primaryLength = this->primaryTileset->tiles->length(); int secondaryLength = this->secondaryTileset->tiles->length(); int height = totalTiles / this->numTilesWide; - QList palette = Tileset::getPalette(this->paletteId, this->primaryTileset, this->secondaryTileset); + QList palette = Tileset::getPalette(this->paletteId, this->primaryTileset, this->secondaryTileset, true); QImage image(this->numTilesWide * 16, height * 16, QImage::Format_RGBA8888); QPainter painter(&image); for (uint16_t tile = 0; tile < totalTiles; tile++) { QImage tileImage; if (tile < primaryLength) { - tileImage = getPalettedTileImage(tile, this->primaryTileset, this->secondaryTileset, this->paletteId).scaled(16, 16); + tileImage = getPalettedTileImage(tile, this->primaryTileset, this->secondaryTileset, this->paletteId, true).scaled(16, 16); } else if (tile < Project::getNumTilesPrimary()) { tileImage = QImage(16, 16, QImage::Format_RGBA8888); tileImage.fill(palette.at(0)); } else if (tile < Project::getNumTilesPrimary() + secondaryLength) { - tileImage = getPalettedTileImage(tile, this->primaryTileset, this->secondaryTileset, this->paletteId).scaled(16, 16); + tileImage = getPalettedTileImage(tile, this->primaryTileset, this->secondaryTileset, this->paletteId, true).scaled(16, 16); } else { tileImage = QImage(16, 16, QImage::Format_RGBA8888); QPainter painter(&tileImage); @@ -224,7 +224,7 @@ QImage TilesetEditorTileSelector::buildPrimaryTilesIndexedImage() { // Image is first converted using greyscale so that palettes with duplicate colors // are properly represented in the final image. QImage indexedImage = image.convertToFormat(QImage::Format::Format_Indexed8, greyscalePalette.toVector()); - QList palette = Tileset::getPalette(this->paletteId, this->primaryTileset, this->secondaryTileset); + QList palette = Tileset::getPalette(this->paletteId, this->primaryTileset, this->secondaryTileset, true); indexedImage.setColorTable(palette.toVector()); return indexedImage; } @@ -261,7 +261,7 @@ QImage TilesetEditorTileSelector::buildSecondaryTilesIndexedImage() { // Image is first converted using greyscale so that palettes with duplicate colors // are properly represented in the final image. QImage indexedImage = image.convertToFormat(QImage::Format::Format_Indexed8, greyscalePalette.toVector()); - QList palette = Tileset::getPalette(this->paletteId, this->primaryTileset, this->secondaryTileset); + QList palette = Tileset::getPalette(this->paletteId, this->primaryTileset, this->secondaryTileset, true); indexedImage.setColorTable(palette.toVector()); return indexedImage; } diff --git a/test_script.js b/test_script.js index 3eae34b3..28b5deb1 100644 --- a/test_script.js +++ b/test_script.js @@ -1,3 +1,4 @@ +const morningTint = [0.8, 0.7, 0.9]; const nightTint = [0.6, 0.55, 1.0]; function applyTint(palette, tint) { @@ -14,11 +15,11 @@ export function on_map_opened(mapName) { try { for (let i = 0; i < 13; i++) { const primaryPalette = map.getPrimaryTilesetPalette(i) - applyTint(primaryPalette, nightTint) - map.setPrimaryTilesetPalette(i, primaryPalette) + applyTint(primaryPalette, morningTint) + map.setPrimaryTilesetPalettePreview(i, primaryPalette) const secondaryPalette = map.getSecondaryTilesetPalette(i) - applyTint(secondaryPalette, nightTint) - map.setSecondaryTilesetPalette(i, secondaryPalette) + applyTint(secondaryPalette, morningTint) + map.setSecondaryTilesetPalettePreview(i, secondaryPalette) } } catch (err) { console.log(err)