diff --git a/Utils/MapEdit/CmdMsg.h b/Utils/MapEdit/CmdMsg.h index 0e944a016..966712c47 100644 --- a/Utils/MapEdit/CmdMsg.h +++ b/Utils/MapEdit/CmdMsg.h @@ -53,6 +53,7 @@ enum CmdMsg // Misc CmdMsg_Report, // 35 CmdMsg_Undo, // 36 + CmdMsg_Filter, // 37 }; #endif diff --git a/Utils/MapEdit/GUILayerRGB.cpp b/Utils/MapEdit/GUILayerRGB.cpp index 9da05527f..e7d8deb2a 100644 --- a/Utils/MapEdit/GUILayerRGB.cpp +++ b/Utils/MapEdit/GUILayerRGB.cpp @@ -30,10 +30,15 @@ void CGUILayerRGB::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CGUILayerRGB) + DDX_Control(pDX, IDC_LAYERSHADE_SHADEBSPIN, m_BSpin); + DDX_Control(pDX, IDC_LAYERSHADE_SHADEB, m_B); + DDX_Control(pDX, IDC_LAYERSHADE_SHADEGSPIN, m_GSpin); + DDX_Control(pDX, IDC_LAYERSHADE_SHADEG, m_G); + DDX_Control(pDX, IDC_LAYERSHADE_SHADERSPIN, m_RSpin); + DDX_Control(pDX, IDC_LAYERSHADE_SHADER, m_R); DDX_Control(pDX, IDC_LAYERSHADE_RATELIST, m_RateList); DDX_Control(pDX, IDC_LAYERSHADE_BRUSHLIST, m_BrushList); DDX_Control(pDX, IDC_LAYERSHADE_MODELIST, m_ModeList); - DDX_Control(pDX, IDC_LAYERSHADE_SHADE, m_Shade); //}}AFX_DATA_MAP } @@ -41,14 +46,18 @@ void CGUILayerRGB::DoDataExchange(CDataExchange* pDX) BEGIN_MESSAGE_MAP(CGUILayerRGB, CDialog) //{{AFX_MSG_MAP(CGUILayerRGB) ON_CBN_SELCHANGE(IDC_LAYERSHADE_MODELIST, OnParamChange) + ON_BN_CLICKED(IDC_LAYERSHADE_TRIFILTER, OnLayershadeTrifilter) + ON_BN_CLICKED(IDC_LAYERSHADE_BIFILTER, OnLayershadeBifilter) ON_CBN_SELCHANGE(IDC_LAYERSHADE_BRUSHLIST, OnParamChange) ON_CBN_SELCHANGE(IDC_LAYERSHADE_RATELIST, OnParamChange) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADER, OnParamChange) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADEG, OnParamChange) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADEB, OnParamChange) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -/* void CGUILayerRGB::SetVal(CEdit &Dlg,int &Val,int Min,int Max) { CString Str; @@ -116,6 +125,10 @@ int iR,iG,iB; B=iB; } -*/ + ///////////////////////////////////////////////////////////////////////////// void CGUILayerRGB::OnParamChange() {if (CallbackFlag) theApp.GetCurrent()->GUIChanged();} +void CGUILayerRGB::OnLayershadeBifilter() {theApp.GetCurrent()->Command(CmdMsg_Filter,0);} +void CGUILayerRGB::OnLayershadeTrifilter() {theApp.GetCurrent()->Command(CmdMsg_Filter,1);} + + diff --git a/Utils/MapEdit/GUILayerRGB.h b/Utils/MapEdit/GUILayerRGB.h index 9fcfddf4e..a3f196522 100644 --- a/Utils/MapEdit/GUILayerRGB.h +++ b/Utils/MapEdit/GUILayerRGB.h @@ -22,10 +22,15 @@ public: // Dialog Data //{{AFX_DATA(CGUILayerRGB) enum { IDD = IDD_LAYER_RGB }; + CSpinButtonCtrl m_BSpin; + CEdit m_B; + CSpinButtonCtrl m_GSpin; + CEdit m_G; + CSpinButtonCtrl m_RSpin; + CEdit m_R; CComboBox m_RateList; CComboBox m_BrushList; CComboBox m_ModeList; - CButton m_Shade; //}}AFX_DATA @@ -41,10 +46,10 @@ public: void EnableCallback() {CallbackFlag=true;} void DisableCallback() {CallbackFlag=false;} -// void SetVal(CEdit &Dlg,int &Val,int Min=-1,int Max=-1); -// void GetVal(CEdit &Dlg,int &Val,int Min=-1,int Max=-1); -// void SetRGB(u8 &R,u8 &G,u8 &B); -// void GetRGB(u8 &R,u8 &G,u8 &B); + void SetVal(CEdit &Dlg,int &Val,int Min=-1,int Max=-1); + void GetVal(CEdit &Dlg,int &Val,int Min=-1,int Max=-1); + void SetRGB(u8 &R,u8 &G,u8 &B); + void GetRGB(u8 &R,u8 &G,u8 &B); protected: bool CallbackFlag; @@ -52,6 +57,9 @@ protected: // Generated message map functions //{{AFX_MSG(CGUILayerRGB) afx_msg void OnParamChange(); + afx_msg void OnLayershadeTrifilter(); + afx_msg void OnLayershadeStrifilter(); + afx_msg void OnLayershadeBifilter(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; diff --git a/Utils/MapEdit/LayerRGB.cpp b/Utils/MapEdit/LayerRGB.cpp index 4c1fd775c..ebc1feb85 100644 --- a/Utils/MapEdit/LayerRGB.cpp +++ b/Utils/MapEdit/LayerRGB.cpp @@ -40,13 +40,12 @@ CLayerRGB::CLayerRGB(sLayerDef &Def) { InitLayer(Def); - CurrentRGB.R=128; - CurrentRGB.G=128; - CurrentRGB.B=128; + ShadeRGB.R=224; + ShadeRGB.G=224; + ShadeRGB.B=224; CurrentMode=0; CurrentBrush=0; CurrentRate=0; - ShadeFlag=false; LastCursPos.x=-1; LastCursPos.y=-1; CurrentUndo=0; @@ -71,10 +70,10 @@ void CLayerRGB::Load(CFile *File,int Version) { InitLayer(LayerDef); - File->Read(&CurrentRGB,sizeof(sRGBElem)); + File->Read(&ShadeRGB,sizeof(sRGBElem)); File->Read(&CurrentBrush,sizeof(int)); File->Read(&CurrentMode,sizeof(int)); - File->Read(&ShadeFlag,sizeof(bool)); + File->Read(&SpareFlag,sizeof(bool)); // Read Map File->Read(&MapWidth,sizeof(int)); @@ -95,10 +94,10 @@ void CLayerRGB::Load(CFile *File,int Version) void CLayerRGB::Save(CFile *File) { // Always Save current version - File->Write(&CurrentRGB,sizeof(sRGBElem)); + File->Write(&ShadeRGB,sizeof(sRGBElem)); File->Write(&CurrentBrush,sizeof(int)); File->Write(&CurrentMode,sizeof(int)); - File->Write(&ShadeFlag,sizeof(bool)); + File->Write(&SpareFlag,sizeof(bool)); // Read Map File->Write(&MapWidth,sizeof(int)); @@ -192,6 +191,12 @@ bool Ret=false; case CmdMsg_Undo: Undo(); break; + case CmdMsg_Filter: + CreateUndo(); + if (Param0==0) BiFilter(Core); + if (Param0==1) TriFilter(Core); + if (Param0==2) STriFilter(Core); + break; default: break; } @@ -418,6 +423,9 @@ int ListSize,i; GUIRGB.m_RateList.AddString(Str); } + GUIRGB.m_RSpin.SetRange(0,255); + GUIRGB.m_GSpin.SetRange(0,255); + GUIRGB.m_BSpin.SetRange(0,255); GUIRGB.EnableCallback(); Core->RedrawView(); } @@ -438,7 +446,7 @@ void CLayerRGB::GUIUpdate(CCore *Core) GUIRGB.m_ModeList.SetCurSel(CurrentMode); GUIRGB.m_BrushList.SetCurSel(CurrentBrush); GUIRGB.m_RateList.SetCurSel(CurrentRate); - GUIRGB.m_Shade.SetCheck(ShadeFlag); + GUIRGB.SetRGB(ShadeRGB.R,ShadeRGB.G,ShadeRGB.B); GUIRGB.EnableCallback(); } @@ -448,7 +456,8 @@ void CLayerRGB::GUIChanged(CCore *Core) CurrentMode=GUIRGB.m_ModeList.GetCurSel(); CurrentBrush=GUIRGB.m_BrushList.GetCurSel(); CurrentRate=GUIRGB.m_RateList.GetCurSel(); - ShadeFlag=GUIRGB.m_Shade.GetCheck()!=0; + GUIRGB.GetRGB(ShadeRGB.R,ShadeRGB.G,ShadeRGB.B); + } /*****************************************************************************/ @@ -568,7 +577,6 @@ int Ofs=0; RGB=MapElem.R+RGBInc; break; case GUI_MODE_DARKEN: -// RGBInc=255-RGBInc; RGB=MapElem.R-RGBInc; break; } @@ -593,20 +601,150 @@ void CLayerRGB::Grab(CCore *Core,CPoint &CursorPos) GUIUpdate(Core); */ } + +/*****************************************************************************/ +void CLayerRGB::BiFilter(CCore *Core) +{ + for(int Y=0;Y>2 ) )>>1); + GetFilterCol(Core,X-1,Y+0,SCol,SCount); + GetFilterCol(Core,X+1,Y+0,SCol,SCount); + GetFilterCol(Core,X+0,Y-1,SCol,SCount); + GetFilterCol(Core,X+0,Y+1,SCol,SCount); + if (SCount) + { + SCol/=SCount; + SetFilterCol(Core,X,Y,SCol,2); + } + } + } + +} + +/*****************************************************************************/ +void CLayerRGB::TriFilter(CCore *Core) +{ + for(int Y=0;Y>3 ) )>>1); + GetFilterCol(Core,X-1,Y-1,SCol,SCount); + GetFilterCol(Core,X+0,Y-1,SCol,SCount); + GetFilterCol(Core,X+1,Y-1,SCol,SCount); + GetFilterCol(Core,X-1,Y+0,SCol,SCount); + GetFilterCol(Core,X+1,Y+0,SCol,SCount); + GetFilterCol(Core,X-1,Y+1,SCol,SCount); + GetFilterCol(Core,X+0,Y+1,SCol,SCount); + GetFilterCol(Core,X+1,Y+1,SCol,SCount); + if (SCount) + { + SCol/=SCount; + SetFilterCol(Core,X,Y,SCol,2); + } + } + } + +} + +/*****************************************************************************/ +void CLayerRGB::STriFilter(CCore *Core) +{ + for(int Y=0;Y>3 ) )>>1); +// *(p-WIDTH-1)=c; +// *(p-WIDTH+1)=c; +// *(p+WIDTH-1)=c; +// *(p+WIDTH+1)=c; + + GetFilterCol(Core,X-1,Y-1,SCol,SCount); + GetFilterCol(Core,X+0,Y-1,SCol,SCount); + GetFilterCol(Core,X+1,Y-1,SCol,SCount); + GetFilterCol(Core,X-1,Y+0,SCol,SCount); + GetFilterCol(Core,X+1,Y+0,SCol,SCount); + GetFilterCol(Core,X-1,Y+1,SCol,SCount); + GetFilterCol(Core,X+0,Y+1,SCol,SCount); + GetFilterCol(Core,X+1,Y+1,SCol,SCount); + if (SCount) + { + SCol/=SCount; + SetFilterCol(Core,X-1,Y-1,SCol,1); + SetFilterCol(Core,X+1,Y-1,SCol,1); + SetFilterCol(Core,X-1,Y+1,SCol,1); + SetFilterCol(Core,X+1,Y+1,SCol,1); + } + } + } + +} + +/*****************************************************************************/ +void CLayerRGB::GetFilterCol(CCore *Core,int X,int Y,int &SumCol,int &Count) +{ +CLayerTile *ActionLayer=(CLayerTile*)Core->GetActionLayer(); + + if (X>=0 && X=0 && YGetMapElem(X,Y); + if (MapElem.Tile) + { + sRGBElem &C=Map[X][Y]; + SumCol+=C.R; + Count++; + } + } + +} + +/*****************************************************************************/ +void CLayerRGB::SetFilterCol(CCore *Core,int X,int Y,int Col,int Div) +{ +CLayerTile *ActionLayer=(CLayerTile*)Core->GetActionLayer(); + + if (X>=0 && X=0 && YGetMapElem(X,Y); + if (MapElem.Tile) + { + sRGBElem &ThisElem=Map[X][Y]; + Col+=ThisElem.R; + if (Div) Col/=Div; + ThisElem.R=Col; + ThisElem.G=Col; + ThisElem.B=Col; + } + } + +} /*****************************************************************************/ void CLayerRGB::Export(CCore *Core,CExport &Exp) { +sRGBCol RGB; + Exp.ExportLayerHeader(LayerDef);//LAYER_TYPE_RGB,LayerDef.SubType,LayerDef.Width,LayerDef.Height); -int f=ShadeFlag; - Exp.Write(&f,sizeof(int)); + RGB.R=ShadeRGB.R; + RGB.G=ShadeRGB.G; + RGB.B=ShadeRGB.B; + + Exp.Write(&RGB,sizeof(sRGBCol)); for (int Y=0; Y255) R=255; if (G<0) G=0; else if (G>255) G=255; if (B<0) B=0; else if (B>255) B=255; } } } -#if 0 -void CMkLevelLayerRGB::PreProcess(CMkLevel *Core) -{ -int X,Y; -int ColorCount; -int c; - -// build RGB List - for (Y=0; Y256) ColorCount=256; - OutRGBTable.SetSize(ColorCount,16); -int RGBInc=6; - if (ShadeFlag) RGBInc=-6; - for (c=0;c255) R=255; - if (G<0) G=0; else if (G>255) G=255; - if (B<0) B=0; else if (B>255) B=255; - } - } - -} - -/*****************************************************************************/ -int CMkLevelLayerRGB::FindClosestRGB(sRGBCol const &RGB) -{ -int CIdx=-1; -int CVal=0; - - for (int i=0; i<256; i++) - { - sRGBCol &ListRGB=SortRGBList[i].RGB; - - int Dr=abs(ListRGB.R-RGB.R); - int Dg=abs(ListRGB.G-RGB.G); - int Db=abs(ListRGB.B-RGB.B); -/* - int ThisVal=(SortRGBList[i].RGB.R*SortRGBList[i].RGB.R)+ - (SortRGBList[i].RGB.G*SortRGBList[i].RGB.G)+ - (SortRGBList[i].RGB.B*SortRGBList[i].RGB.B); -*/ - int ThisVal=Dr+Dg+Db; - - if (CIdx==-1 || ThisVal RGBMap; -// CList InRGBList; -// CList SortRGBList; -// CList RemapTable; - int ShadeFlag; + sRGBCol ShadeRGB; CList2d OutMap; CList2d OutRGBTable; diff --git a/source/fx/fxjfish.cpp b/source/fx/fxjfish.cpp index 115e0f1e2..29addc6d0 100644 --- a/source/fx/fxjfish.cpp +++ b/source/fx/fxjfish.cpp @@ -58,8 +58,11 @@ const int LegXInc=4; void CFXJellyFishLegs::render() { +CThing *Parent=getParent(); + CFX::render(); - if (!canRender()) return; +// if (!canRender()) return; + if (!Parent->canRender()) return; SpriteBank *SprBank=CGameScene::getSpriteBank();; DVECTOR RenderPos=getRenderPos();