about summary refs log tree commit diff
path: root/src/game/editor/ed_editor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/editor/ed_editor.cpp')
-rw-r--r--src/game/editor/ed_editor.cpp68
1 files changed, 54 insertions, 14 deletions
diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp
index 015b9946..c75ff238 100644
--- a/src/game/editor/ed_editor.cpp
+++ b/src/game/editor/ed_editor.cpp
@@ -2286,31 +2286,18 @@ void CEditor::RenderStatusbar(CUIRect View)
 void CEditor::RenderEnvelopeEditor(CUIRect View)
 {
 	if(m_SelectedEnvelope < 0) m_SelectedEnvelope = 0;
-	if(m_SelectedEnvelope >= m_Map.m_lEnvelopes.size()) m_SelectedEnvelope--;
+	if(m_SelectedEnvelope >= m_Map.m_lEnvelopes.size()) m_SelectedEnvelope = m_Map.m_lEnvelopes.size()-1;
 
 	CEnvelope *pEnvelope = 0;
 	if(m_SelectedEnvelope >= 0 && m_SelectedEnvelope < m_Map.m_lEnvelopes.size())
 		pEnvelope = m_Map.m_lEnvelopes[m_SelectedEnvelope];
 
-	bool ShowColorBar = false;
-	if(pEnvelope && pEnvelope->m_Channels == 4)
-		ShowColorBar = true;
-
 	CUIRect ToolBar, CurveBar, ColorBar;
 	View.HSplitTop(15.0f, &ToolBar, &View);
 	View.HSplitTop(15.0f, &CurveBar, &View);
 	ToolBar.Margin(2.0f, &ToolBar);
 	CurveBar.Margin(2.0f, &CurveBar);
 
-	if(ShowColorBar)
-	{
-		View.HSplitTop(20.0f, &ColorBar, &View);
-		ColorBar.Margin(2.0f, &ColorBar);
-		RenderBackground(ColorBar, ms_CheckerTexture, 16.0f, 1.0f);
-	}
-
-	RenderBackground(View, ms_CheckerTexture, 32.0f, 0.1f);
-
 	// do the toolbar
 	{
 		CUIRect Button;
@@ -2327,6 +2314,21 @@ void CEditor::RenderEnvelopeEditor(CUIRect View)
 		if(DoButton_Editor(&s_New2dButton, Localize("Pos.+"), 0, &Button, 0, Localize("Creates a new pos envelope")))
 			pNewEnv = m_Map.NewEnvelope(3);
 
+		// Delete button
+		if(m_SelectedEnvelope >= 0)
+		{
+			ToolBar.VSplitRight(10.0f, &ToolBar, &Button);
+			ToolBar.VSplitRight(50.0f, &ToolBar, &Button);
+			static int s_DelButton = 0;
+			if(DoButton_Editor(&s_DelButton, Localize("Delete"), 0, &Button, 0, Localize("Delete this envelope")))
+			{
+				m_Map.DeleteEnvelope(m_SelectedEnvelope);
+				if(m_SelectedEnvelope >= m_Map.m_lEnvelopes.size())
+					m_SelectedEnvelope = m_Map.m_lEnvelopes.size()-1;
+				pEnvelope = m_SelectedEnvelope >= 0 ? m_Map.m_lEnvelopes[m_SelectedEnvelope] : 0;
+			}
+		}
+
 		if(pNewEnv) // add the default points
 		{
 			if(pNewEnv->m_Channels == 4)
@@ -2371,6 +2373,17 @@ void CEditor::RenderEnvelopeEditor(CUIRect View)
 		}
 	}
 
+	bool ShowColorBar = false;
+	if(pEnvelope && pEnvelope->m_Channels == 4)
+	{
+		ShowColorBar = true;
+		View.HSplitTop(20.0f, &ColorBar, &View);
+		ColorBar.Margin(2.0f, &ColorBar);
+		RenderBackground(ColorBar, ms_CheckerTexture, 16.0f, 1.0f);
+	}
+
+	RenderBackground(View, ms_CheckerTexture, 32.0f, 0.1f);
+
 	if(pEnvelope)
 	{
 		static array<int> Selection;
@@ -2900,6 +2913,33 @@ void CEditor::Reset(bool CreateDefault)
 	m_MouseDeltaWy = 0;
 }
 
+void CEditorMap::DeleteEnvelope(int Index)
+{
+	if(Index < 0 || Index >= m_lEnvelopes.size())
+		return;
+
+	// fix links between envelopes and quads
+	for(int i = 0; i < m_lGroups.size(); ++i)
+		for(int j = 0; j < m_lGroups[i]->m_lLayers.size(); ++j)
+			if(m_lGroups[i]->m_lLayers[j]->m_Type == LAYERTYPE_QUADS)
+			{
+				CLayerQuads *Layer = static_cast<CLayerQuads *>(m_lGroups[i]->m_lLayers[j]);
+				for(int k = 0; k < Layer->m_lQuads.size(); ++k)
+				{
+					if(Layer->m_lQuads[k].m_PosEnv == Index)
+						Layer->m_lQuads[k].m_PosEnv = -1;
+					else if(Layer->m_lQuads[k].m_PosEnv > Index)
+						Layer->m_lQuads[k].m_PosEnv--;
+					if(Layer->m_lQuads[k].m_ColorEnv == Index)
+						Layer->m_lQuads[k].m_ColorEnv = -1;
+					else if(Layer->m_lQuads[k].m_ColorEnv > Index)
+						Layer->m_lQuads[k].m_ColorEnv--;
+				}
+			}
+
+	m_lEnvelopes.remove_index(Index);
+}
+
 void CEditorMap::MakeGameLayer(CLayer *pLayer)
 {
 	m_pGameLayer = (CLayerGame *)pLayer;