mirror of
https://github.com/electronicarts/CNC_TS_and_RA2_Mission_Editor.git
synced 2025-05-01 01:21:41 -04:00
352 lines
13 KiB
C++
352 lines
13 KiB
C++
#include "stdafx.h"
|
||
#include "Palettes.h"
|
||
#include "variables.h"
|
||
#include "functions.h"
|
||
|
||
void Palettes::Init()
|
||
{
|
||
if (!FSunPackLib::XCC_ExtractFile("isotem.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
|
||
errstream << "IsoTem.pal failed\n";
|
||
m_hPalIsoTemp = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("isosno.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
|
||
errstream << "IsoSno.pal failed\n";
|
||
m_hPalIsoSnow = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("isourb.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
|
||
errstream << "IsoUrb.pal failed\n";
|
||
m_hPalIsoUrb = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
HMIXFILE m_hCache2 = loading.ExpandMixes()[100].hECache;
|
||
if (!FSunPackLib::XCC_ExtractFile("isolun.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
|
||
errstream << "IsoLun.pal failed\n";
|
||
m_hPalIsoLun = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("isodes.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
|
||
errstream << "IsoDes.pal failed\n";
|
||
m_hPalIsoDes = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("isoubn.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
|
||
errstream << "IsoUbn.pal failed\n";
|
||
m_hPalIsoUbn = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("unittem.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
|
||
errstream << "UnitTem.pal failed";
|
||
m_hPalUnitTemp = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("unitsno.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
|
||
errstream << "UnitSno.pal failed\n";
|
||
m_hPalUnitSnow = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("uniturb.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
|
||
errstream << "UnitUrb.pal failed\n";
|
||
m_hPalUnitUrb = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("unitlun.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
|
||
errstream << "UnitLun.pal failed\n";
|
||
m_hPalUnitLun = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("unitdes.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
|
||
errstream << "UnitDes.pal failed\n";
|
||
m_hPalUnitDes = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("unitubn.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
|
||
errstream << "UnitUbn.pal failed\n";
|
||
m_hPalUnitUbn = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("snow.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
|
||
errstream << "Snow.pal failed\n";
|
||
m_hPalSnow = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("temperat.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
|
||
errstream << "Temperat.pal failed\n";
|
||
m_hPalTemp = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("urban.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
|
||
errstream << "Urban.pal failed\n";
|
||
m_hPalUrb = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("lunar.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
|
||
errstream << "lunar.pal failed\n";
|
||
m_hPalLun = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("desert.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
|
||
errstream << "desert.pal failed\n";
|
||
m_hPalDes = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("urbann.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
|
||
errstream << "urbann.pal failed\n";
|
||
m_hPalUbn = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
|
||
if (!FSunPackLib::XCC_ExtractFile("_ID2124019542", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
|
||
errstream << "lib.pal failed\n";
|
||
m_hPalLib = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
|
||
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
|
||
|
||
LoadedPalettes["isotem.pal"] = new Palette(m_hPalIsoTemp);
|
||
LoadedPalettes["isosno.pal"] = new Palette(m_hPalIsoSnow);
|
||
LoadedPalettes["isourb.pal"] = new Palette(m_hPalIsoUrb);
|
||
LoadedPalettes["isoubn.pal"] = new Palette(m_hPalIsoUbn);
|
||
LoadedPalettes["isolun.pal"] = new Palette(m_hPalIsoLun);
|
||
LoadedPalettes["isodes.pal"] = new Palette(m_hPalIsoDes);
|
||
|
||
LoadedPalettes["unittem.pal"] = new Palette(m_hPalUnitTemp, true);
|
||
LoadedPalettes["unitsno.pal"] = new Palette(m_hPalUnitSnow, true);
|
||
LoadedPalettes["uniturb.pal"] = new Palette(m_hPalUnitUrb, true);
|
||
LoadedPalettes["unitubn.pal"] = new Palette(m_hPalUnitUbn, true);
|
||
LoadedPalettes["unitlun.pal"] = new Palette(m_hPalUnitLun, true);
|
||
LoadedPalettes["unitdes.pal"] = new Palette(m_hPalUnitDes, true);
|
||
|
||
LoadedPalettes["temperat.pal"] = new Palette(m_hPalTemp);
|
||
LoadedPalettes["snow.pal"] = new Palette(m_hPalSnow);
|
||
LoadedPalettes["urban.pal"] = new Palette(m_hPalUrb);
|
||
LoadedPalettes["urbann.pal"] = new Palette(m_hPalUbn);
|
||
LoadedPalettes["lunar.pal"] = new Palette(m_hPalLun);
|
||
LoadedPalettes["desert.pal"] = new Palette(m_hPalDes);
|
||
LoadedPalettes["lib.pal"] = new Palette(m_hPalLib);
|
||
}
|
||
|
||
|
||
HTSPALETTE Palettes::GetIsoPalette(char theat)
|
||
{
|
||
HTSPALETTE isoPalette = m_hPalIsoTemp;
|
||
switch (theat) {
|
||
case 'T':
|
||
case 'G':
|
||
isoPalette = m_hPalIsoTemp;
|
||
break;
|
||
case 'A':
|
||
isoPalette = m_hPalIsoSnow;
|
||
break;
|
||
case 'U':
|
||
isoPalette = m_hPalIsoUrb;
|
||
break;
|
||
case 'N':
|
||
isoPalette = m_hPalIsoUbn;
|
||
break;
|
||
case 'D':
|
||
isoPalette = m_hPalIsoDes;
|
||
break;
|
||
case 'L':
|
||
isoPalette = m_hPalIsoLun;
|
||
break;
|
||
}
|
||
return isoPalette;
|
||
}
|
||
|
||
HTSPALETTE Palettes::GetUnitPalette(char theat)
|
||
{
|
||
HTSPALETTE isoPalette = m_hPalUnitTemp;
|
||
switch (theat) {
|
||
case 'T':
|
||
case 'G':
|
||
isoPalette = m_hPalUnitTemp;
|
||
break;
|
||
case 'A':
|
||
isoPalette = m_hPalUnitSnow;
|
||
break;
|
||
case 'U':
|
||
isoPalette = m_hPalUnitUrb;
|
||
break;
|
||
case 'N':
|
||
isoPalette = m_hPalUnitUbn;
|
||
break;
|
||
case 'D':
|
||
isoPalette = m_hPalUnitDes;
|
||
break;
|
||
case 'L':
|
||
isoPalette = m_hPalUnitLun;
|
||
break;
|
||
}
|
||
return isoPalette;
|
||
}
|
||
|
||
|
||
/*
|
||
Helper function that fetches the palette data from FsunPackLib
|
||
FSunPackLib doesn´t provide any special function to retrieve a color table entry,
|
||
so we have to build it ourself
|
||
Also builds color_conv
|
||
*/
|
||
void Palettes::FetchPalettes()
|
||
{
|
||
// SetTSPaletteEntry(HTSPALETTE hPalette, BYTE bIndex, RGBTRIPLE* rgb, RGBTRIPLE* orig);
|
||
// SetTSPaletteEntry can retrieve the current color table entry without modifying it!
|
||
|
||
|
||
// iso palette
|
||
HTSPALETTE hCur = 0;
|
||
if (Map->GetTheater() == THEATER0) hCur = m_hPalIsoTemp;
|
||
if (Map->GetTheater() == THEATER1) hCur = m_hPalIsoSnow;
|
||
if (Map->GetTheater() == THEATER2) hCur = m_hPalIsoUrb;
|
||
if (Map->GetTheater() == THEATER3) hCur = m_hPalIsoUbn;
|
||
if (Map->GetTheater() == THEATER4) hCur = m_hPalIsoLun;
|
||
if (Map->GetTheater() == THEATER5) hCur = m_hPalIsoDes;
|
||
|
||
int i;
|
||
|
||
for (i = 0; i < 256; i++) {
|
||
FSunPackLib::SetTSPaletteEntry(hCur, i, NULL /* don´t modify it!*/, &palIso[i] /*but retrieve it!*/);
|
||
}
|
||
|
||
|
||
// unit palette
|
||
if (Map->GetTheater() == THEATER0) hCur = m_hPalUnitTemp;
|
||
if (Map->GetTheater() == THEATER1) hCur = m_hPalUnitSnow;
|
||
if (Map->GetTheater() == THEATER2) hCur = m_hPalUnitUrb;
|
||
if (Map->GetTheater() == THEATER3) hCur = m_hPalUnitUbn;
|
||
if (Map->GetTheater() == THEATER4) hCur = m_hPalUnitLun;
|
||
if (Map->GetTheater() == THEATER5) hCur = m_hPalUnitDes;
|
||
|
||
|
||
for (i = 0; i < 256; i++) {
|
||
FSunPackLib::SetTSPaletteEntry(hCur, i, NULL /* don´t modify it!*/, &palUnit[i] /*but retrieve it!*/);
|
||
}
|
||
|
||
|
||
// theater palette
|
||
if (Map->GetTheater() == THEATER0) hCur = m_hPalTemp;
|
||
if (Map->GetTheater() == THEATER1) hCur = m_hPalSnow;
|
||
if (Map->GetTheater() == THEATER2) hCur = m_hPalUrb;
|
||
if (Map->GetTheater() == THEATER3) hCur = m_hPalUbn;
|
||
if (Map->GetTheater() == THEATER4) hCur = m_hPalLun;
|
||
if (Map->GetTheater() == THEATER5) hCur = m_hPalDes;
|
||
|
||
|
||
|
||
for (i = 0; i < 256; i++) {
|
||
FSunPackLib::SetTSPaletteEntry(hCur, i, NULL /* don´t modify it!*/, &palTheater[i] /*but retrieve it!*/);
|
||
}
|
||
|
||
|
||
// lib palette
|
||
hCur = m_hPalLib;
|
||
|
||
|
||
for (i = 0; i < 256; i++) {
|
||
FSunPackLib::SetTSPaletteEntry(hCur, i, NULL /* don´t modify it!*/, &palLib[i] /*but retrieve it!*/);
|
||
}
|
||
|
||
CreateConvTable(palIso, iPalIso);
|
||
CreateConvTable(palLib, iPalLib);
|
||
CreateConvTable(palUnit, iPalUnit);
|
||
CreateConvTable(palTheater, iPalTheater);
|
||
|
||
CIsoView& v = *((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview;
|
||
|
||
DDPIXELFORMAT pf;
|
||
memset(&pf, 0, sizeof(DDPIXELFORMAT));
|
||
pf.dwSize = sizeof(DDPIXELFORMAT);
|
||
|
||
v.lpds->GetPixelFormat(&pf);
|
||
v.pf = pf;
|
||
v.m_color_converter.reset(new FSunPackLib::ColorConverter(v.pf));
|
||
|
||
FSunPackLib::ColorConverter conf(pf);
|
||
|
||
for (auto const& [name, col] : rules["Colors"]) {
|
||
COLORREF cref = v.GetColor("", col);
|
||
|
||
color_conv[col] = conf.GetColor(GetRValue(cref), GetGValue(cref), GetBValue(cref));
|
||
colorref_conv[cref] = color_conv[col];
|
||
}
|
||
}
|
||
|
||
void Palettes::CreateConvTable(RGBTRIPLE* pal, int* iPal)
|
||
{
|
||
CIsoView& v = *((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview;
|
||
|
||
DDPIXELFORMAT pf;
|
||
memset(&pf, 0, sizeof(DDPIXELFORMAT));
|
||
pf.dwSize = sizeof(DDPIXELFORMAT);
|
||
|
||
v.lpds->GetPixelFormat(&pf);
|
||
|
||
FSunPackLib::ColorConverter conf(pf);
|
||
|
||
int i;
|
||
for (i = 0; i < 256; i++) {
|
||
iPal[i] = conf.GetColor(pal[i].rgbtRed, pal[i].rgbtGreen, pal[i].rgbtBlue);
|
||
}
|
||
}
|
||
|
||
|
||
Palette* Palettes::LoadPalette(const CString& palName, bool remappable)
|
||
{
|
||
if (LoadedPalettes.size() == 0) {
|
||
Palettes::Init();
|
||
}
|
||
|
||
auto it = LoadedPalettes.find(palName);
|
||
if (it != LoadedPalettes.end()) {
|
||
return it->second;
|
||
}
|
||
|
||
BytePalette buffer;
|
||
HMIXFILE mixIdx = loading.FindFileInMix(palName);
|
||
|
||
if (FSunPackLib::LoadTSPalette(reinterpret_cast<RGBTRIPLE*>(buffer.Data), palName, mixIdx)) {
|
||
auto pal = new Palette(buffer, remappable);
|
||
LoadedPalettes[palName] = pal;
|
||
return pal;
|
||
}
|
||
|
||
return nullptr;
|
||
}
|
||
|
||
void Palettes::Clear()
|
||
{
|
||
for (auto& pair : LoadedPalettes) {
|
||
delete(pair.second);
|
||
}
|
||
LoadedPalettes.clear();
|
||
RemappedPalettes.clear();
|
||
Init();
|
||
}
|
||
|
||
Palette::Palette(const BytePalette& bytes, bool remappable) :
|
||
Remappable(remappable)
|
||
{
|
||
for (auto idx = 0; idx < 256; idx++) {
|
||
Data[idx].R = bytes.Data[idx].red;
|
||
Data[idx].G = bytes.Data[idx].green;
|
||
Data[idx].B = bytes.Data[idx].blue;
|
||
Data[idx].Zero = 0;
|
||
}
|
||
}
|
||
|
||
Palette::Palette(HTSPALETTE indexer, bool remappable) :
|
||
Remappable(remappable)
|
||
{
|
||
for (auto idx = 0; idx < 256; idx++) {
|
||
RGBTRIPLE ret;
|
||
FSunPackLib::SetTSPaletteEntry(indexer, idx, NULL /* don´t modify it!*/, &ret /*but retrieve it!*/);
|
||
Data[idx].R = ret.rgbtRed;
|
||
Data[idx].G = ret.rgbtGreen;
|
||
Data[idx].B = ret.rgbtBlue;
|
||
Data[idx].Zero = 0;
|
||
}
|
||
}
|