312 lines
8.6 KiB
C++
312 lines
8.6 KiB
C++
/*******************/
|
|
/*** Layer Shade ***/
|
|
/*******************/
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include <Vector3.h>
|
|
#include <gl\gl.h>
|
|
#include <gl\glu.h>
|
|
#include "GLEnabledView.h"
|
|
|
|
#include "MapEdit.h"
|
|
#include "MapEditDoc.h"
|
|
#include "MapEditView.h"
|
|
#include "MainFrm.h"
|
|
|
|
#include "Core.h"
|
|
#include "Layer.h"
|
|
#include "LayerShade.h"
|
|
#include "Utils.h"
|
|
#include "Select.h"
|
|
#include "Export.h"
|
|
#include "GUILayerShade.h"
|
|
|
|
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
// New Layer
|
|
CLayerShade::CLayerShade(sLayerDef &Def)
|
|
{
|
|
InitLayer(Def);
|
|
// Load script (messy)
|
|
GString ExecPath;
|
|
GString ScriptName;
|
|
|
|
GetExecPath(ExecPath);
|
|
ScriptName=ExecPath+theApp.GetConfigStr("LayerScript","BackGfxScript");
|
|
Script.LoadAndImport(ScriptName);
|
|
|
|
int i,ListSize=Script.GetGroupCount();
|
|
BackGfx.resize(ListSize);
|
|
|
|
for (i=0; i<ListSize; i++)
|
|
{
|
|
BackGfx[i]=Script.GetGroupName(i);
|
|
TRACE1("%s\n",BackGfx[i]);
|
|
}
|
|
Back0=Back1=-1;
|
|
TransMode0=TransMode1=0;
|
|
Flags0=Flags1=-1;
|
|
}
|
|
|
|
|
|
/*****************************************************************************/
|
|
CLayerShade::~CLayerShade()
|
|
{
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
void CLayerShade::InitLayer(sLayerDef &Def)
|
|
{
|
|
CLayer::InitLayer(Def);
|
|
LayerDef.Width=TileLayerMinWidth+(Def.Width-TileLayerMinWidth)/GetScaleFactor();
|
|
LayerDef.Height=TileLayerMinHeight+(Def.Height-TileLayerMinHeight)/GetScaleFactor();
|
|
|
|
RGB[0].rgbRed=255; RGB[0].rgbGreen=255; RGB[0].rgbBlue=255;
|
|
RGB[1].rgbRed=255; RGB[1].rgbGreen=0; RGB[1].rgbBlue=0;
|
|
RGB[2].rgbRed=0; RGB[2].rgbGreen=255; RGB[2].rgbBlue=0;
|
|
RGB[3].rgbRed=0; RGB[3].rgbGreen=0; RGB[3].rgbBlue=255;
|
|
Count=2;
|
|
|
|
}
|
|
/*****************************************************************************/
|
|
void CLayerShade::Load(CFile *File,int Version)
|
|
{
|
|
if (Version<=5)
|
|
{
|
|
BOOL DB;
|
|
float DF;
|
|
LayerDef.Type=LAYER_TYPE_SHADE;
|
|
File->Read(&DB,sizeof(BOOL));
|
|
File->Read(&DF,sizeof(float));
|
|
File->Read(&DB,sizeof(BOOL));
|
|
File->Read(&LayerDef.VisibleFlag,sizeof(BOOL));
|
|
File->Read(&LayerDef.SubType,sizeof(int));
|
|
File->Read(&LayerDef.Width,sizeof(int));
|
|
File->Read(&LayerDef.Height,sizeof(int));
|
|
}
|
|
InitLayer(LayerDef);
|
|
File->Read(&Count,sizeof(int));
|
|
for (int i=0; i<LAYER_SHADE_RGB_MAX; i++)
|
|
{
|
|
File->Read(&Pos[i],sizeof(int));
|
|
File->Read(&RGB[i],sizeof(RGBQUAD));
|
|
}
|
|
if (Version>=7)
|
|
{
|
|
File->Read(&Back0,sizeof(int));
|
|
File->Read(&Back1,sizeof(int));
|
|
}
|
|
if (Version>=8)
|
|
{
|
|
File->Read(&TransMode0,sizeof(int));
|
|
File->Read(&Flags0,sizeof(int));
|
|
File->Read(&TransMode1,sizeof(int));
|
|
File->Read(&Flags1,sizeof(int));
|
|
}
|
|
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
void CLayerShade::Save(CFile *File)
|
|
{
|
|
// Always Save current version
|
|
File->Write(&Count,sizeof(int));
|
|
for (int i=0; i<LAYER_SHADE_RGB_MAX; i++)
|
|
{
|
|
File->Write(&Pos[i],sizeof(int));
|
|
File->Write(&RGB[i],sizeof(RGBQUAD));
|
|
}
|
|
File->Write(&Back0,sizeof(int));
|
|
File->Write(&Back1,sizeof(int));
|
|
File->Write(&TransMode0,sizeof(int));
|
|
File->Write(&Flags0,sizeof(int));
|
|
File->Write(&TransMode1,sizeof(int));
|
|
File->Write(&Flags1,sizeof(int));
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
void CLayerShade::Render(CCore *Core,Vector3 &CamPos,bool Is3d)
|
|
{
|
|
Vector3 ThisCam=Core->OffsetCam(CamPos,GetScaleFactor());
|
|
float ZoomW=Core->GetZoomW();
|
|
float ZoomH=Core->GetZoomH();
|
|
float ScrOfsX=(ZoomW/2);
|
|
float ScrOfsY=(ZoomH/2);
|
|
Vector3 &Scale=Core->GetScaleVector();
|
|
int ThisCount=Count-1;
|
|
float X0=0;
|
|
float X1=LayerDef.Width;
|
|
float Y=(0+1);
|
|
|
|
float YInc=(float)LayerDef.Height/(float)ThisCount;
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
glPushMatrix();
|
|
glLoadIdentity();
|
|
glScalef(Scale.x,Scale.y,Scale.z);
|
|
glTranslatef(-ThisCam.x,ThisCam.y,0); // Set scroll offset
|
|
glTranslatef(-ScrOfsX,ScrOfsY,0); // Bring to top left corner
|
|
|
|
glBegin (GL_QUADS);
|
|
for (int i=0; i<ThisCount; i++)
|
|
{
|
|
glColor3ub(RGB[i+0].rgbRed,RGB[i+0].rgbGreen,RGB[i+0].rgbBlue);
|
|
glVertex3f( X0,Y,0.0f);
|
|
glVertex3f( X1,Y,0.0f);
|
|
Y-=YInc;
|
|
glColor3ub(RGB[i+1].rgbRed,RGB[i+1].rgbGreen,RGB[i+1].rgbBlue);
|
|
glVertex3f( X1,Y,0.0f);
|
|
glVertex3f( X0,Y,0.0f);
|
|
}
|
|
glEnd();
|
|
glPopMatrix();
|
|
}
|
|
|
|
|
|
/*****************************************************************************/
|
|
bool CLayerShade::Resize(int Width,int Height)
|
|
{
|
|
LayerDef.Width=TileLayerMinWidth+(Width-TileLayerMinWidth)/GetScaleFactor();
|
|
LayerDef.Height=TileLayerMinHeight+(Height-TileLayerMinHeight)/GetScaleFactor();
|
|
|
|
return(true);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/*** Gui *********************************************************************/
|
|
/*****************************************************************************/
|
|
void CLayerShade::GUIInit(CCore *Core)
|
|
{
|
|
Core->GUIAdd(GUI,IDD_LAYER_SHADE);
|
|
for (int i=0; i<LAYER_SHADE_MAX; i++)
|
|
{
|
|
GUI.SetRGB(RGB[i],i);
|
|
}
|
|
GUI.SetCount(Count);
|
|
InitGfxList();
|
|
|
|
if (Flags0 & SpinFlag) GUI.m_Spin0.SetCheck(true);
|
|
if (Flags0 & ScaleFlag) GUI.m_Scale0.SetCheck(true);
|
|
if (Flags0 & MoveFlag) GUI.m_Move0.SetCheck(true);
|
|
if (Flags0 & ColorFlag) GUI.m_Color0.SetCheck(true);
|
|
|
|
if (Flags1 & SpinFlag) GUI.m_Spin1.SetCheck(true);
|
|
if (Flags1 & ScaleFlag) GUI.m_Scale1.SetCheck(true);
|
|
if (Flags1 & MoveFlag) GUI.m_Move1.SetCheck(true);
|
|
if (Flags1 & ColorFlag) GUI.m_Color1.SetCheck(true);
|
|
|
|
GUI.m_Trans0.ResetContent();
|
|
GUI.m_Trans0.AddString("Normal");
|
|
GUI.m_Trans0.AddString("50%");
|
|
GUI.m_Trans0.AddString("Subtractive");
|
|
GUI.m_Trans0.AddString("Another one");
|
|
GUI.m_Trans0.SetCurSel(TransMode0);
|
|
|
|
GUI.m_Trans1.ResetContent();
|
|
GUI.m_Trans1.AddString("Normal");
|
|
GUI.m_Trans1.AddString("50%");
|
|
GUI.m_Trans1.AddString("Subtractive");
|
|
GUI.m_Trans1.AddString("Another one");
|
|
GUI.m_Trans1.SetCurSel(TransMode1);
|
|
|
|
GUI.m_CountSpin.SetRange(1,4);
|
|
|
|
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
void CLayerShade::InitGfxList()
|
|
{
|
|
int i,ListSize=BackGfx.size();
|
|
CComboBox &List0=GUI.m_Gfx0;
|
|
CComboBox &List1=GUI.m_Gfx1;
|
|
|
|
List0.ResetContent();
|
|
List1.ResetContent();
|
|
for (i=0; i<ListSize; i++)
|
|
{
|
|
List0.AddString(BackGfx[i]);
|
|
List1.AddString(BackGfx[i]);
|
|
}
|
|
List0.SetCurSel(Back0);
|
|
List1.SetCurSel(Back1);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
void CLayerShade::GUIKill(CCore *Core)
|
|
{
|
|
Core->GUIRemove(GUI,IDD_LAYER_SHADE);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
void CLayerShade::GUIUpdate(CCore *Core)
|
|
{
|
|
GUI.CheckData();
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
void CLayerShade::GUIChanged(CCore *Core)
|
|
{
|
|
for (int i=0; i<LAYER_SHADE_MAX; i++)
|
|
{
|
|
GUI.GetRGB(RGB[i],i);
|
|
}
|
|
GUI.GetCount(Count);
|
|
Back0=GUI.m_Gfx0.GetCurSel();
|
|
Back1=GUI.m_Gfx1.GetCurSel();
|
|
|
|
Flags0=0;
|
|
if (GUI.m_Spin0.GetCheck()) Flags0|=SpinFlag;
|
|
if (GUI.m_Scale0.GetCheck()) Flags0|=ScaleFlag;
|
|
if (GUI.m_Move0.GetCheck()) Flags0|=MoveFlag;
|
|
if (GUI.m_Color0.GetCheck()) Flags0|=ColorFlag;
|
|
TransMode0=GUI.m_Trans0.GetCurSel();
|
|
|
|
Flags1=0;
|
|
if (GUI.m_Spin1.GetCheck()) Flags1|=SpinFlag;
|
|
if (GUI.m_Scale1.GetCheck()) Flags1|=ScaleFlag;
|
|
if (GUI.m_Move1.GetCheck()) Flags1|=MoveFlag;
|
|
if (GUI.m_Color1.GetCheck()) Flags1|=ColorFlag;
|
|
TransMode1=GUI.m_Trans1.GetCurSel();
|
|
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/*** Functions ***************************************************************/
|
|
/*****************************************************************************/
|
|
void CLayerShade::Export(CCore *Core,CExport &Exp)
|
|
{
|
|
Exp.ExportLayerHeader(LayerDef);//LAYER_TYPE_SHADE,LayerDef.SubType,LayerDef.Width,LayerDef.Height);
|
|
Exp.Write(&Count,sizeof(int));
|
|
for (int i=0; i<LAYER_SHADE_RGB_MAX; i++)
|
|
{
|
|
Exp.Write(&Pos[i],sizeof(int));
|
|
Exp.Write(&RGB[i].rgbRed,sizeof(u8));
|
|
Exp.Write(&RGB[i].rgbGreen,sizeof(u8));
|
|
Exp.Write(&RGB[i].rgbBlue,sizeof(u8));
|
|
Exp.Write(&RGB[i].rgbRed,sizeof(u8)); // Pad
|
|
}
|
|
|
|
Exp.Write(&TransMode0,sizeof(int));
|
|
Exp.Write(&Flags0,sizeof(int));
|
|
Exp.Write(&TransMode1,sizeof(int));
|
|
Exp.Write(&Flags1,sizeof(int));
|
|
|
|
// Back Gfx
|
|
char Txt[256];
|
|
|
|
Txt[0]=0;
|
|
if (Back0!=-1) sprintf(Txt,BackGfx[Back0]);
|
|
Exp.Write(Txt,strlen(Txt)+1);
|
|
|
|
Txt[0]=0;
|
|
if (Back1!=-1) sprintf(Txt,BackGfx[Back1]);
|
|
Exp.Write(Txt,strlen(Txt)+1);
|
|
|
|
}
|