ddnet/src/game/editor/editor.h

781 lines
18 KiB
C
Raw Normal View History

2010-11-20 10:37:14 +00:00
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
2011-04-19 08:34:51 +00:00
#ifndef GAME_EDITOR_EDITOR_H
#define GAME_EDITOR_EDITOR_H
2010-05-29 07:25:38 +00:00
#include <math.h>
2010-05-29 07:25:38 +00:00
#include <base/math.h>
#include <base/system.h>
2010-05-29 07:25:38 +00:00
#include <base/tl/algorithm.h>
#include <base/tl/array.h>
2010-09-12 11:15:59 +00:00
#include <base/tl/sorted_array.h>
#include <base/tl/string.h>
2010-05-29 07:25:38 +00:00
#include <game/client/ui.h>
2010-05-29 07:25:38 +00:00
#include <game/mapitems.h>
#include <game/client/render.h>
#include <engine/shared/config.h>
#include <engine/shared/datafile.h>
2010-05-29 07:25:38 +00:00
#include <engine/editor.h>
#include <engine/graphics.h>
#include "auto_map.h"
2010-05-29 07:25:38 +00:00
typedef void (*INDEX_MODIFY_FUNC)(int *pIndex);
//CRenderTools m_RenderTools;
// CEditor SPECIFIC
enum
{
MODE_LAYERS=0,
MODE_IMAGES,
2010-05-29 07:25:38 +00:00
DIALOG_NONE=0,
DIALOG_FILE,
};
struct CEntity
{
CPoint m_Position;
int m_Type;
};
class CEnvelope
{
public:
int m_Channels;
array<CEnvPoint> m_lPoints;
char m_aName[32];
float m_Bottom, m_Top;
bool m_Synchronized;
2010-05-29 07:25:38 +00:00
CEnvelope(int Chan)
{
m_Channels = Chan;
m_aName[0] = 0;
m_Bottom = 0;
m_Top = 0;
m_Synchronized = true;
2010-05-29 07:25:38 +00:00
}
2010-05-29 07:25:38 +00:00
void Resort()
{
sort(m_lPoints.all());
FindTopBottom(0xf);
}
void FindTopBottom(int ChannelMask)
{
m_Top = -1000000000.0f;
m_Bottom = 1000000000.0f;
for(int i = 0; i < m_lPoints.size(); i++)
{
for(int c = 0; c < m_Channels; c++)
{
if(ChannelMask&(1<<c))
{
float v = fx2f(m_lPoints[i].m_aValues[c]);
if(v > m_Top) m_Top = v;
if(v < m_Bottom) m_Bottom = v;
}
}
}
}
2010-05-29 07:25:38 +00:00
int Eval(float Time, float *pResult)
{
CRenderTools::RenderEvalEnvelope(m_lPoints.base_ptr(), m_lPoints.size(), m_Channels, Time, pResult);
return m_Channels;
}
2010-05-29 07:25:38 +00:00
void AddPoint(int Time, int v0, int v1=0, int v2=0, int v3=0)
{
CEnvPoint p;
p.m_Time = Time;
p.m_aValues[0] = v0;
p.m_aValues[1] = v1;
p.m_aValues[2] = v2;
p.m_aValues[3] = v3;
p.m_Curvetype = CURVETYPE_LINEAR;
m_lPoints.add(p);
Resort();
}
2010-05-29 07:25:38 +00:00
float EndTime()
{
if(m_lPoints.size())
return m_lPoints[m_lPoints.size()-1].m_Time*(1.0f/1000.0f);
return 0;
}
};
class CLayer;
class CLayerGroup;
class CEditorMap;
class CLayer
{
public:
class CEditor *m_pEditor;
class IGraphics *Graphics();
class ITextRender *TextRender();
CLayer()
{
m_Type = LAYERTYPE_INVALID;
2011-07-12 01:14:46 +00:00
str_copy(m_aName, "(invalid)", sizeof(m_aName));
2010-05-29 07:25:38 +00:00
m_Visible = true;
m_Readonly = false;
m_SaveToMap = true;
2010-05-29 07:25:38 +00:00
m_Flags = 0;
m_pEditor = 0;
}
2010-05-29 07:25:38 +00:00
virtual ~CLayer()
{
}
2010-05-29 07:25:38 +00:00
virtual void BrushSelecting(CUIRect Rect) {}
virtual int BrushGrab(CLayerGroup *pBrush, CUIRect Rect) { return 0; }
virtual void FillSelection(bool Empty, CLayer *pBrush, CUIRect Rect) {}
virtual void BrushDraw(CLayer *pBrush, float x, float y) {}
virtual void BrushPlace(CLayer *pBrush, float x, float y) {}
virtual void BrushFlipX() {}
virtual void BrushFlipY() {}
virtual void BrushRotate(float Amount) {}
2010-05-29 07:25:38 +00:00
virtual void Render() {}
virtual int RenderProperties(CUIRect *pToolbox) { return 0; }
2010-05-29 07:25:38 +00:00
virtual void ModifyImageIndex(INDEX_MODIFY_FUNC pfnFunc) {}
virtual void ModifyEnvelopeIndex(INDEX_MODIFY_FUNC pfnFunc) {}
2010-05-29 07:25:38 +00:00
virtual void GetSize(float *w, float *h) { *w = 0; *h = 0;}
2011-07-12 01:14:46 +00:00
char m_aName[12];
2010-05-29 07:25:38 +00:00
int m_Type;
int m_Flags;
bool m_Readonly;
bool m_Visible;
bool m_SaveToMap;
2010-05-29 07:25:38 +00:00
};
class CLayerGroup
{
public:
class CEditorMap *m_pMap;
2010-05-29 07:25:38 +00:00
array<CLayer*> m_lLayers;
2010-05-29 07:25:38 +00:00
int m_OffsetX;
int m_OffsetY;
int m_ParallaxX;
int m_ParallaxY;
2010-05-29 07:25:38 +00:00
int m_UseClipping;
int m_ClipX;
int m_ClipY;
int m_ClipW;
int m_ClipH;
2011-07-12 01:14:46 +00:00
char m_aName[12];
2010-05-29 07:25:38 +00:00
bool m_GameGroup;
bool m_Visible;
bool m_SaveToMap;
bool m_Collapse;
2010-05-29 07:25:38 +00:00
CLayerGroup();
~CLayerGroup();
2010-05-29 07:25:38 +00:00
void Convert(CUIRect *pRect);
void Render();
void MapScreen();
void Mapping(float *pPoints);
void GetSize(float *w, float *h);
2010-05-29 07:25:38 +00:00
void DeleteLayer(int Index);
int SwapLayers(int Index0, int Index1);
bool IsEmpty() const
2010-05-29 07:25:38 +00:00
{
return m_lLayers.size() == 0;
}
void Clear()
{
2010-05-29 07:25:38 +00:00
m_lLayers.delete_all();
}
void AddLayer(CLayer *l);
2010-05-29 07:25:38 +00:00
void ModifyImageIndex(INDEX_MODIFY_FUNC Func)
{
for(int i = 0; i < m_lLayers.size(); i++)
m_lLayers[i]->ModifyImageIndex(Func);
}
2010-05-29 07:25:38 +00:00
void ModifyEnvelopeIndex(INDEX_MODIFY_FUNC Func)
{
for(int i = 0; i < m_lLayers.size(); i++)
m_lLayers[i]->ModifyEnvelopeIndex(Func);
}
};
class CEditorImage : public CImageInfo
{
public:
CEditor *m_pEditor;
2010-05-29 07:25:38 +00:00
CEditorImage(CEditor *pEditor)
: m_AutoMapper(pEditor)
2010-05-29 07:25:38 +00:00
{
m_pEditor = pEditor;
m_TexID = -1;
2010-05-29 07:25:38 +00:00
m_aName[0] = 0;
m_External = 0;
m_Width = 0;
m_Height = 0;
m_pData = 0;
m_Format = 0;
}
2010-05-29 07:25:38 +00:00
~CEditorImage();
2010-05-29 07:25:38 +00:00
void AnalyseTileFlags();
int m_TexID;
2010-05-29 07:25:38 +00:00
int m_External;
char m_aName[128];
unsigned char m_aTileFlags[256];
class CAutoMapper m_AutoMapper;
2010-05-29 07:25:38 +00:00
};
class CEditorMap
{
void MakeGameGroup(CLayerGroup *pGroup);
void MakeGameLayer(CLayer *pLayer);
public:
CEditor *m_pEditor;
bool m_Modified;
2010-05-29 07:25:38 +00:00
CEditorMap()
{
Clean();
}
array<CLayerGroup*> m_lGroups;
array<CEditorImage*> m_lImages;
array<CEnvelope*> m_lEnvelopes;
2010-05-29 07:25:38 +00:00
class CLayerGame *m_pGameLayer;
CLayerGroup *m_pGameGroup;
2010-05-29 07:25:38 +00:00
CEnvelope *NewEnvelope(int Channels)
{
m_Modified = true;
2010-05-29 07:25:38 +00:00
CEnvelope *e = new CEnvelope(Channels);
m_lEnvelopes.add(e);
return e;
}
void DeleteEnvelope(int Index);
2010-05-29 07:25:38 +00:00
CLayerGroup *NewGroup()
{
m_Modified = true;
2010-05-29 07:25:38 +00:00
CLayerGroup *g = new CLayerGroup;
g->m_pMap = this;
m_lGroups.add(g);
return g;
}
2010-05-29 07:25:38 +00:00
int SwapGroups(int Index0, int Index1)
{
if(Index0 < 0 || Index0 >= m_lGroups.size()) return Index0;
if(Index1 < 0 || Index1 >= m_lGroups.size()) return Index0;
if(Index0 == Index1) return Index0;
m_Modified = true;
2010-05-29 07:25:38 +00:00
swap(m_lGroups[Index0], m_lGroups[Index1]);
return Index1;
}
2010-05-29 07:25:38 +00:00
void DeleteGroup(int Index)
{
if(Index < 0 || Index >= m_lGroups.size()) return;
m_Modified = true;
2010-05-29 07:25:38 +00:00
delete m_lGroups[Index];
m_lGroups.remove_index(Index);
}
2010-05-29 07:25:38 +00:00
void ModifyImageIndex(INDEX_MODIFY_FUNC pfnFunc)
{
m_Modified = true;
2010-05-29 07:25:38 +00:00
for(int i = 0; i < m_lGroups.size(); i++)
m_lGroups[i]->ModifyImageIndex(pfnFunc);
}
2010-05-29 07:25:38 +00:00
void ModifyEnvelopeIndex(INDEX_MODIFY_FUNC pfnFunc)
{
m_Modified = true;
2010-05-29 07:25:38 +00:00
for(int i = 0; i < m_lGroups.size(); i++)
m_lGroups[i]->ModifyEnvelopeIndex(pfnFunc);
}
2010-05-29 07:25:38 +00:00
void Clean();
void CreateDefault(int EntitiesTexture);
// io
2010-05-29 07:25:38 +00:00
int Save(class IStorage *pStorage, const char *pFilename);
int Load(class IStorage *pStorage, const char *pFilename, int StorageType);
2010-05-29 07:25:38 +00:00
};
struct CProperty
{
const char *m_pName;
int m_Value;
int m_Type;
int m_Min;
int m_Max;
};
enum
{
PROPTYPE_NULL=0,
PROPTYPE_BOOL,
PROPTYPE_INT_STEP,
PROPTYPE_INT_SCROLL,
PROPTYPE_COLOR,
PROPTYPE_IMAGE,
PROPTYPE_ENVELOPE,
PROPTYPE_SHIFT,
2010-05-29 07:25:38 +00:00
};
typedef struct
{
int x, y;
int w, h;
} RECTi;
class CLayerTiles : public CLayer
{
public:
CLayerTiles(int w, int h);
~CLayerTiles();
void Resize(int NewW, int NewH);
void Shift(int Direction);
2010-05-29 07:25:38 +00:00
void MakePalette();
virtual void Render();
int ConvertX(float x) const;
int ConvertY(float y) const;
void Convert(CUIRect Rect, RECTi *pOut);
void Snap(CUIRect *pRect);
void Clamp(RECTi *pRect);
virtual void BrushSelecting(CUIRect Rect);
virtual int BrushGrab(CLayerGroup *pBrush, CUIRect Rect);
virtual void FillSelection(bool Empty, CLayer *pBrush, CUIRect Rect);
virtual void BrushDraw(CLayer *pBrush, float wx, float wy);
virtual void BrushFlipX();
virtual void BrushFlipY();
virtual void BrushRotate(float Amount);
virtual void ShowInfo();
2010-05-29 07:25:38 +00:00
virtual int RenderProperties(CUIRect *pToolbox);
virtual void ModifyImageIndex(INDEX_MODIFY_FUNC pfnFunc);
virtual void ModifyEnvelopeIndex(INDEX_MODIFY_FUNC pfnFunc);
2010-05-29 07:25:38 +00:00
void PrepareForSave();
void GetSize(float *w, float *h) { *w = m_Width*32.0f; *h = m_Height*32.0f; }
int m_TexID;
2010-05-29 07:25:38 +00:00
int m_Game;
int m_Image;
int m_Width;
int m_Height;
CColor m_Color;
int m_ColorEnv;
int m_ColorEnvOffset;
2010-05-29 07:25:38 +00:00
CTile *m_pTiles;
};
class CLayerQuads : public CLayer
{
public:
CLayerQuads();
~CLayerQuads();
virtual void Render();
CQuad *NewQuad();
virtual void BrushSelecting(CUIRect Rect);
virtual int BrushGrab(CLayerGroup *pBrush, CUIRect Rect);
virtual void BrushPlace(CLayer *pBrush, float wx, float wy);
virtual void BrushFlipX();
virtual void BrushFlipY();
virtual void BrushRotate(float Amount);
2010-05-29 07:25:38 +00:00
virtual int RenderProperties(CUIRect *pToolbox);
virtual void ModifyImageIndex(INDEX_MODIFY_FUNC pfnFunc);
virtual void ModifyEnvelopeIndex(INDEX_MODIFY_FUNC pfnFunc);
2010-05-29 07:25:38 +00:00
void GetSize(float *w, float *h);
2010-05-29 07:25:38 +00:00
int m_Image;
array<CQuad> m_lQuads;
};
class CLayerGame : public CLayerTiles
{
public:
CLayerGame(int w, int h);
~CLayerGame();
virtual int RenderProperties(CUIRect *pToolbox);
};
class CEditor : public IEditor
{
class IInput *m_pInput;
class IClient *m_pClient;
class IConsole *m_pConsole;
2010-05-29 07:25:38 +00:00
class IGraphics *m_pGraphics;
class ITextRender *m_pTextRender;
2010-09-12 11:15:59 +00:00
class IStorage *m_pStorage;
2010-05-29 07:25:38 +00:00
CRenderTools m_RenderTools;
CUI m_UI;
public:
class IInput *Input() { return m_pInput; };
class IClient *Client() { return m_pClient; };
class IConsole *Console() { return m_pConsole; };
2010-05-29 07:25:38 +00:00
class IGraphics *Graphics() { return m_pGraphics; };
class ITextRender *TextRender() { return m_pTextRender; };
2010-09-12 11:15:59 +00:00
class IStorage *Storage() { return m_pStorage; };
2010-05-29 07:25:38 +00:00
CUI *UI() { return &m_UI; }
CRenderTools *RenderTools() { return &m_RenderTools; }
CEditor() : m_TilesetPicker(16, 16)
{
m_pInput = 0;
m_pClient = 0;
m_pGraphics = 0;
m_pTextRender = 0;
m_Mode = MODE_LAYERS;
m_Dialog = 0;
m_pTooltip = 0;
2011-07-10 20:16:16 +00:00
m_GridActive = false;
m_GridFactor = 1;
2010-05-29 07:25:38 +00:00
m_aFileName[0] = 0;
m_aFileSaveName[0] = 0;
m_ValidSaveFilename = false;
m_PopupEventActivated = false;
m_PopupEventWasActivated = false;
2010-10-06 21:07:35 +00:00
m_FileDialogStorageType = 0;
2010-09-16 10:48:32 +00:00
m_pFileDialogTitle = 0;
m_pFileDialogButtonText = 0;
m_pFileDialogUser = 0;
2010-09-12 11:15:59 +00:00
m_aFileDialogFileName[0] = 0;
m_aFileDialogCurrentFolder[0] = 0;
m_aFileDialogCurrentLink[0] = 0;
m_pFileDialogPath = m_aFileDialogCurrentFolder;
m_aFileDialogActivate = false;
m_FileDialogScrollValue = 0.0f;
m_FilesSelectedIndex = -1;
2010-09-12 11:15:59 +00:00
m_FilesStartAt = 0;
m_FilesCur = 0;
m_FilesStopAt = 999;
2010-05-29 07:25:38 +00:00
m_WorldOffsetX = 0;
m_WorldOffsetY = 0;
m_EditorOffsetX = 0.0f;
m_EditorOffsetY = 0.0f;
2010-05-29 07:25:38 +00:00
m_WorldZoom = 1.0f;
m_ZoomLevel = 200;
m_LockMouse = false;
m_ShowMousePointer = true;
m_MouseDeltaX = 0;
m_MouseDeltaY = 0;
m_MouseDeltaWx = 0;
m_MouseDeltaWy = 0;
2010-05-29 07:25:38 +00:00
m_GuiActive = true;
m_ProofBorders = false;
m_ShowTileInfo = false;
2010-05-29 07:25:38 +00:00
m_ShowDetail = true;
m_Animate = false;
m_AnimateStart = 0;
m_AnimateTime = 0;
m_AnimateSpeed = 1;
2010-05-29 07:25:38 +00:00
m_ShowEnvelopeEditor = 0;
2011-08-15 18:12:31 +00:00
m_ShowEnvelopePreview = 0;
m_SelectedQuadEnvelope = -1;
m_SelectedEnvelopePoint = -1;
2011-08-14 14:31:48 +00:00
2010-05-29 07:25:38 +00:00
ms_CheckerTexture = 0;
ms_BackgroundTexture = 0;
ms_CursorTexture = 0;
ms_EntitiesTexture = 0;
2010-05-29 07:25:38 +00:00
ms_pUiGotContext = 0;
}
2010-05-29 07:25:38 +00:00
virtual void Init();
virtual void UpdateAndRender();
virtual bool HasUnsavedData() { return m_Map.m_Modified; }
void FilelistPopulate(int StorageType);
void InvokeFileDialog(int StorageType, int FileType, const char *pTitle, const char *pButtonText,
2010-05-29 07:25:38 +00:00
const char *pBasepath, const char *pDefaultName,
void (*pfnFunc)(const char *pFilename, int StorageType, void *pUser), void *pUser);
2010-05-29 07:25:38 +00:00
void Reset(bool CreateDefault=true);
int Save(const char *pFilename);
int Load(const char *pFilename, int StorageType);
int Append(const char *pFilename, int StorageType);
2010-05-29 07:25:38 +00:00
void Render();
CQuad *GetSelectedQuad();
CLayer *GetSelectedLayerType(int Index, int Type);
CLayer *GetSelectedLayer(int Index);
CLayerGroup *GetSelectedGroup();
int DoProperties(CUIRect *pToolbox, CProperty *pProps, int *pIDs, int *pNewVal);
2010-05-29 07:25:38 +00:00
int m_Mode;
int m_Dialog;
const char *m_pTooltip;
2011-07-10 20:16:16 +00:00
bool m_GridActive;
int m_GridFactor;
2010-05-29 07:25:38 +00:00
char m_aFileName[512];
char m_aFileSaveName[512];
bool m_ValidSaveFilename;
enum
{
POPEVENT_EXIT=0,
POPEVENT_LOAD,
POPEVENT_NEW,
POPEVENT_SAVE,
};
int m_PopupEventType;
int m_PopupEventActivated;
int m_PopupEventWasActivated;
enum
{
FILETYPE_MAP,
FILETYPE_IMG,
MAX_PATH_LENGTH = 512
};
2010-10-06 21:07:35 +00:00
int m_FileDialogStorageType;
2010-09-12 11:15:59 +00:00
const char *m_pFileDialogTitle;
const char *m_pFileDialogButtonText;
void (*m_pfnFileDialogFunc)(const char *pFileName, int StorageType, void *pUser);
2010-09-12 11:15:59 +00:00
void *m_pFileDialogUser;
char m_aFileDialogFileName[MAX_PATH_LENGTH];
char m_aFileDialogCurrentFolder[MAX_PATH_LENGTH];
char m_aFileDialogCurrentLink[MAX_PATH_LENGTH];
char *m_pFileDialogPath;
bool m_aFileDialogActivate;
int m_FileDialogFileType;
float m_FileDialogScrollValue;
int m_FilesSelectedIndex;
char m_FileDialogNewFolderName[64];
char m_FileDialogErrString[64];
2010-10-06 21:07:35 +00:00
struct CFilelistItem
{
char m_aFilename[128];
char m_aName[128];
bool m_IsDir;
bool m_IsLink;
2010-10-06 21:07:35 +00:00
int m_StorageType;
2010-10-06 21:07:35 +00:00
bool operator<(const CFilelistItem &Other) { return !str_comp(m_aFilename, "..") ? true : !str_comp(Other.m_aFilename, "..") ? false :
m_IsDir && !Other.m_IsDir ? true : !m_IsDir && Other.m_IsDir ? false :
str_comp_filenames(m_aFilename, Other.m_aFilename) < 0; }
};
sorted_array<CFilelistItem> m_FileList;
2010-09-12 11:15:59 +00:00
int m_FilesStartAt;
int m_FilesCur;
int m_FilesStopAt;
2010-05-29 07:25:38 +00:00
float m_WorldOffsetX;
float m_WorldOffsetY;
float m_EditorOffsetX;
float m_EditorOffsetY;
float m_WorldZoom;
int m_ZoomLevel;
bool m_LockMouse;
bool m_ShowMousePointer;
bool m_GuiActive;
bool m_ProofBorders;
float m_MouseDeltaX;
float m_MouseDeltaY;
float m_MouseDeltaWx;
float m_MouseDeltaWy;
bool m_ShowTileInfo;
2010-05-29 07:25:38 +00:00
bool m_ShowDetail;
bool m_Animate;
int64 m_AnimateStart;
float m_AnimateTime;
float m_AnimateSpeed;
2010-05-29 07:25:38 +00:00
int m_ShowEnvelopeEditor;
2011-08-14 14:31:48 +00:00
int m_ShowEnvelopePreview; //Values: 0-Off|1-Selected Envelope|2-All
bool m_ShowPicker;
2010-05-29 07:25:38 +00:00
int m_SelectedLayer;
int m_SelectedGroup;
int m_SelectedQuad;
int m_SelectedPoints;
2011-08-15 18:12:31 +00:00
int m_SelectedEnvelope;
int m_SelectedEnvelopePoint;
2011-08-14 14:31:48 +00:00
int m_SelectedQuadEnvelope;
2010-05-29 07:25:38 +00:00
int m_SelectedImage;
2010-05-29 07:25:38 +00:00
static int ms_CheckerTexture;
static int ms_BackgroundTexture;
static int ms_CursorTexture;
static int ms_EntitiesTexture;
2010-05-29 07:25:38 +00:00
CLayerGroup m_Brush;
CLayerTiles m_TilesetPicker;
2010-05-29 07:25:38 +00:00
static const void *ms_pUiGotContext;
2010-05-29 07:25:38 +00:00
CEditorMap m_Map;
static void EnvelopeEval(float TimeOffset, int Env, float *pChannels, void *pUser);
void DoMapBorder();
2010-05-29 07:25:38 +00:00
int DoButton_Editor_Common(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip);
int DoButton_Editor(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip);
int DoButton_Tab(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip);
2011-07-12 01:14:46 +00:00
int DoButton_Ex(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip, int Corners, float FontSize=10.0f);
2010-05-29 07:25:38 +00:00
int DoButton_ButtonDec(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip);
int DoButton_ButtonInc(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip);
int DoButton_File(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip);
2010-05-29 07:25:38 +00:00
int DoButton_Menu(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip);
int DoButton_MenuItem(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags=0, const char *pToolTip=0);
2011-07-12 01:14:46 +00:00
int DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrSize, float FontSize, float *Offset, bool Hidden=false, int Corners=CUI::CORNER_ALL);
2010-05-29 07:25:38 +00:00
void RenderBackground(CUIRect View, int Texture, float Size, float Brightness);
2011-07-10 20:16:16 +00:00
void RenderGrid(CLayerGroup *pGroup);
void UiInvokePopupMenu(void *pID, int Flags, float X, float Y, float W, float H, int (*pfnFunc)(CEditor *pEditor, CUIRect Rect), void *pExtra=0);
2010-05-29 07:25:38 +00:00
void UiDoPopupMenu();
int UiDoValueSelector(void *pID, CUIRect *pRect, const char *pLabel, int Current, int Min, int Max, int Step, float Scale, const char *pToolTip);
2010-05-29 07:25:38 +00:00
static int PopupGroup(CEditor *pEditor, CUIRect View);
static int PopupLayer(CEditor *pEditor, CUIRect View);
static int PopupQuad(CEditor *pEditor, CUIRect View);
static int PopupPoint(CEditor *pEditor, CUIRect View);
static int PopupNewFolder(CEditor *pEditor, CUIRect View);
static int PopupEvent(CEditor *pEditor, CUIRect View);
2010-05-29 07:25:38 +00:00
static int PopupSelectImage(CEditor *pEditor, CUIRect View);
static int PopupSelectGametileOp(CEditor *pEditor, CUIRect View);
2010-05-29 07:25:38 +00:00
static int PopupImage(CEditor *pEditor, CUIRect View);
static int PopupMenuFile(CEditor *pEditor, CUIRect View);
static int PopupSelectConfigAutoMap(CEditor *pEditor, CUIRect View);
2010-05-29 07:25:38 +00:00
static void CallbackOpenMap(const char *pFileName, int StorageType, void *pUser);
static void CallbackAppendMap(const char *pFileName, int StorageType, void *pUser);
static void CallbackSaveMap(const char *pFileName, int StorageType, void *pUser);
2010-05-29 07:25:38 +00:00
void PopupSelectImageInvoke(int Current, float x, float y);
int PopupSelectImageResult();
void PopupSelectGametileOpInvoke(float x, float y);
int PopupSelectGameTileOpResult();
2011-08-11 08:59:14 +00:00
void PopupSelectConfigAutoMapInvoke(float x, float y);
int PopupSelectConfigAutoMapResult();
vec4 ButtonColorMul(const void *pID);
2010-05-29 07:25:38 +00:00
2011-08-15 18:12:31 +00:00
void DoQuadEnvelopes(CQuad *pQuad, int Index, int TexID = -1);
void DoQuadEnvPoint(CQuad *pQuad, int QIndex, int pIndex);
2010-05-29 07:25:38 +00:00
void DoQuadPoint(CQuad *pQuad, int QuadIndex, int v);
2011-08-14 14:31:48 +00:00
void DoMapEditor(CUIRect View, CUIRect Toolbar);
2010-05-29 07:25:38 +00:00
void DoToolbar(CUIRect Toolbar);
void DoQuad(CQuad *pQuad, int Index);
float UiDoScrollbarV(const void *pID, const CUIRect *pRect, float Current);
vec4 GetButtonColor(const void *pID, int Checked);
static void ReplaceImage(const char *pFilename, int StorageType, void *pUser);
static void AddImage(const char *pFilename, int StorageType, void *pUser);
2010-05-29 07:25:38 +00:00
void RenderImages(CUIRect Toolbox, CUIRect Toolbar, CUIRect View);
void RenderLayers(CUIRect Toolbox, CUIRect Toolbar, CUIRect View);
void RenderModebar(CUIRect View);
void RenderStatusbar(CUIRect View);
void RenderEnvelopeEditor(CUIRect View);
2010-05-29 07:25:38 +00:00
void RenderMenubar(CUIRect Menubar);
void RenderFileDialog();
void AddFileDialogEntry(int Index, CUIRect *pView);
2010-06-02 16:12:32 +00:00
void SortImages();
static void ExtractName(const char *pFileName, char *pName, int BufferSize)
{
const char *pExtractedName = pFileName;
const char *pEnd = 0;
for(; *pFileName; ++pFileName)
{
if(*pFileName == '/' || *pFileName == '\\')
pExtractedName = pFileName+1;
else if(*pFileName == '.')
pEnd = pFileName;
}
int Length = pEnd > pExtractedName ? min(BufferSize, (int)(pEnd-pExtractedName+1)) : BufferSize;
str_copy(pName, pExtractedName, Length);
}
2011-07-10 20:16:16 +00:00
int GetLineDistance();
2010-05-29 07:25:38 +00:00
};
// make sure to inline this function
inline class IGraphics *CLayer::Graphics() { return m_pEditor->Graphics(); }
inline class ITextRender *CLayer::TextRender() { return m_pEditor->TextRender(); }
#endif