Primitive entity player-selection in ScEd
This was SVN commit r1727.
This commit is contained in:
parent
2e58a8fd21
commit
1c044ac229
@ -2,9 +2,10 @@
|
|||||||
|
|
||||||
<!ELEMENT Entities (Entity*)>
|
<!ELEMENT Entities (Entity*)>
|
||||||
|
|
||||||
<!ELEMENT Entity (Template,Position,Orientation)>
|
<!ELEMENT Entity (Template,Player,Position,Orientation)>
|
||||||
|
|
||||||
<!ELEMENT Template (#PCDATA)>
|
<!ELEMENT Template (#PCDATA)>
|
||||||
|
<!ELEMENT Player (#PCDATA)>
|
||||||
|
|
||||||
<!ELEMENT Position EMPTY>
|
<!ELEMENT Position EMPTY>
|
||||||
<!ATTLIST Position
|
<!ATTLIST Position
|
||||||
|
@ -214,6 +214,7 @@ void CMapReader::ReadXML(const char* filename)
|
|||||||
EL(entities);
|
EL(entities);
|
||||||
EL(entity);
|
EL(entity);
|
||||||
EL(template);
|
EL(template);
|
||||||
|
EL(player);
|
||||||
EL(position);
|
EL(position);
|
||||||
EL(orientation);
|
EL(orientation);
|
||||||
AT(x);
|
AT(x);
|
||||||
@ -245,6 +246,7 @@ void CMapReader::ReadXML(const char* filename)
|
|||||||
// <entity>
|
// <entity>
|
||||||
|
|
||||||
CStrW TemplateName;
|
CStrW TemplateName;
|
||||||
|
int PlayerID;
|
||||||
CVector3D Position;
|
CVector3D Position;
|
||||||
float Orientation;
|
float Orientation;
|
||||||
|
|
||||||
@ -259,6 +261,11 @@ void CMapReader::ReadXML(const char* filename)
|
|||||||
// <template>
|
// <template>
|
||||||
TemplateName = child.getText();
|
TemplateName = child.getText();
|
||||||
}
|
}
|
||||||
|
else if (element_name == el_player)
|
||||||
|
{
|
||||||
|
// <player>
|
||||||
|
PlayerID = CStr(child.getText()).ToInt();
|
||||||
|
}
|
||||||
else if (element_name == el_position)
|
else if (element_name == el_position)
|
||||||
{
|
{
|
||||||
// <position>
|
// <position>
|
||||||
@ -279,7 +286,8 @@ void CMapReader::ReadXML(const char* filename)
|
|||||||
debug_warn("Invalid XML data - DTD shouldn't allow this");
|
debug_warn("Invalid XML data - DTD shouldn't allow this");
|
||||||
}
|
}
|
||||||
|
|
||||||
g_EntityManager.create(g_EntityTemplateCollection.getTemplate(TemplateName), Position, Orientation);
|
HEntity ent = g_EntityManager.create(g_EntityTemplateCollection.getTemplate(TemplateName), Position, Orientation);
|
||||||
|
ent->m_player = PlayerID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -279,6 +279,8 @@ void CMapWriter::WriteXML(const char* filename, CUnitManager* pUnitMan)
|
|||||||
|
|
||||||
XML_Setting("Template", entity->m_base->m_Tag);
|
XML_Setting("Template", entity->m_base->m_Tag);
|
||||||
|
|
||||||
|
XML_Setting("Player", entity->m_player);
|
||||||
|
|
||||||
{
|
{
|
||||||
CVector3D position = entity->m_position;
|
CVector3D position = entity->m_position;
|
||||||
|
|
||||||
|
@ -19,6 +19,9 @@
|
|||||||
|
|
||||||
#include "scripting/JSInterface_Vector3D.h"
|
#include "scripting/JSInterface_Vector3D.h"
|
||||||
|
|
||||||
|
// TODO: don't hardcode player-colours
|
||||||
|
static const float PlayerColours[8][3] = { {1,1,1}, {1,0,0}, {0,1,0}, {0,0,1}, {1,1,0}, {1,0,1}, {0,1,1}, {1,0.5,0} };
|
||||||
|
|
||||||
CEntity::CEntity( CBaseEntity* base, CVector3D position, float orientation )
|
CEntity::CEntity( CBaseEntity* base, CVector3D position, float orientation )
|
||||||
{
|
{
|
||||||
m_position = position;
|
m_position = position;
|
||||||
@ -66,6 +69,8 @@ CEntity::CEntity( CBaseEntity* base, CVector3D position, float orientation )
|
|||||||
m_selected = false;
|
m_selected = false;
|
||||||
|
|
||||||
m_grouped = -1;
|
m_grouped = -1;
|
||||||
|
|
||||||
|
m_player = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
CEntity::~CEntity()
|
CEntity::~CEntity()
|
||||||
@ -495,12 +500,22 @@ void CEntity::render()
|
|||||||
|
|
||||||
void CEntity::renderSelectionOutline( float alpha )
|
void CEntity::renderSelectionOutline( float alpha )
|
||||||
{
|
{
|
||||||
|
#ifdef SCED
|
||||||
|
extern CTerrain g_Terrain;
|
||||||
|
CTerrain *pTerrain = &g_Terrain;
|
||||||
|
#else
|
||||||
CTerrain *pTerrain = g_Game->GetWorld()->GetTerrain();
|
CTerrain *pTerrain = g_Game->GetWorld()->GetTerrain();
|
||||||
|
#endif
|
||||||
|
|
||||||
if( !m_bounds ) return;
|
if( !m_bounds ) return;
|
||||||
|
|
||||||
glColor4f( 1.0f, 1.0f, 1.0f, alpha );
|
if( getCollisionObject( this ) )
|
||||||
if( getCollisionObject( this ) ) glColor4f( 1.0f, 0.5f, 0.5f, alpha );
|
glColor4f( 1.0f, 0.5f, 0.5f, alpha );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int player = min(max(1, m_player), 8) - 1;
|
||||||
|
glColor4f( PlayerColours[player][0], PlayerColours[player][1], PlayerColours[player][2], alpha);
|
||||||
|
}
|
||||||
|
|
||||||
glBegin( GL_LINE_LOOP );
|
glBegin( GL_LINE_LOOP );
|
||||||
|
|
||||||
|
@ -68,6 +68,9 @@ public:
|
|||||||
bool m_selected;
|
bool m_selected;
|
||||||
i32 m_grouped;
|
i32 m_grouped;
|
||||||
|
|
||||||
|
// The player that owns this entity. TODO: do this properly (if this way is wrong)
|
||||||
|
int m_player;
|
||||||
|
|
||||||
// If this unit has been removed from the gameworld but has still
|
// If this unit has been removed from the gameworld but has still
|
||||||
// has references.
|
// has references.
|
||||||
bool m_destroyed;
|
bool m_destroyed;
|
||||||
@ -165,7 +168,7 @@ public:
|
|||||||
void teleport(); // Fixes things if the position is changed by something externally.
|
void teleport(); // Fixes things if the position is changed by something externally.
|
||||||
void checkSelection(); // In case anyone tries to select/deselect this through JavaScript.
|
void checkSelection(); // In case anyone tries to select/deselect this through JavaScript.
|
||||||
void checkGroup(); // Groups
|
void checkGroup(); // Groups
|
||||||
void checkExtant(); // Existance
|
void checkExtant(); // Existence
|
||||||
|
|
||||||
// Returns the default action of the entity upon the target (or -1 if none apply)
|
// Returns the default action of the entity upon the target (or -1 if none apply)
|
||||||
int CEntity::defaultOrder( CEntity* orderTarget );
|
int CEntity::defaultOrder( CEntity* orderTarget );
|
||||||
|
@ -38,7 +38,7 @@ void CCommandManager::Append(CCommand* cmd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// update history position to point at last command executed
|
// update history position to point at last command executed
|
||||||
m_HistoryPos=m_CommandHistory.size()-1;
|
m_HistoryPos=(i32)m_CommandHistory.size()-1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,7 +347,7 @@ void CEditorData::OnScreenShot(const char* filename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// SubmitModelRecursive: recurse down given model, submitting it and all it's descendents to the
|
// SubmitModelRecursive: recurse down given model, submitting it and all its descendants to the
|
||||||
// renderer
|
// renderer
|
||||||
void SubmitModelRecursive(CModel* model)
|
void SubmitModelRecursive(CModel* model)
|
||||||
{
|
{
|
||||||
@ -407,7 +407,7 @@ void CEditorData::RenderWorld()
|
|||||||
// render all the units
|
// render all the units
|
||||||
RenderModels();
|
RenderModels();
|
||||||
|
|
||||||
// flush prior to rendering overlays etc
|
// flush prior to rendering overlays etc
|
||||||
g_Renderer.FlushFrame();
|
g_Renderer.FlushFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -495,6 +495,12 @@ void CEditorData::OnDraw()
|
|||||||
// .. and here's the overlays
|
// .. and here's the overlays
|
||||||
g_MiniMap.Render();
|
g_MiniMap.Render();
|
||||||
m_InfoBox.Render();
|
m_InfoBox.Render();
|
||||||
|
|
||||||
|
const std::vector<CUnit*>& units=g_UnitMan.GetUnits();
|
||||||
|
for (size_t i=0;i<units.size();++i)
|
||||||
|
if (units[i]->GetEntity())
|
||||||
|
units[i]->GetEntity()->renderSelectionOutline();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
g_Renderer.SetClearColor(0x00453015);
|
g_Renderer.SetClearColor(0x00453015);
|
||||||
g_Renderer.BeginFrame();
|
g_Renderer.BeginFrame();
|
||||||
|
@ -41,7 +41,8 @@ void CPaintObjectCommand::Finalize()
|
|||||||
CVector3D orient = m_Unit->GetModel()->GetTransform().GetIn();
|
CVector3D orient = m_Unit->GetModel()->GetTransform().GetIn();
|
||||||
CVector3D position = m_Unit->GetModel()->GetTransform().GetTranslation();
|
CVector3D position = m_Unit->GetModel()->GetTransform().GetTranslation();
|
||||||
g_UnitMan.RemoveUnit(m_Unit);
|
g_UnitMan.RemoveUnit(m_Unit);
|
||||||
g_EntityManager.create( templateObject, position, atan2( -orient.X, -orient.Z ) );
|
HEntity ent = g_EntityManager.create( templateObject, position, atan2( -orient.X, -orient.Z ) );
|
||||||
|
ent->m_player = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,3 +112,12 @@ void CSelectObjectTool::RenderUnitBounds(CUnit* unit)
|
|||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// GetFirstEntity: return the entity of the first selected object
|
||||||
|
CEntity* CSelectObjectTool::GetFirstEntity()
|
||||||
|
{
|
||||||
|
if (m_SelectedUnits.size() == 0)
|
||||||
|
return NULL;
|
||||||
|
return m_SelectedUnits[0]->GetEntity();
|
||||||
|
}
|
@ -10,6 +10,7 @@
|
|||||||
#include "Model.h"
|
#include "Model.h"
|
||||||
|
|
||||||
class CUnit;
|
class CUnit;
|
||||||
|
class CEntity;
|
||||||
|
|
||||||
class CSelectObjectTool : public CBrushTool
|
class CSelectObjectTool : public CBrushTool
|
||||||
{
|
{
|
||||||
@ -21,6 +22,10 @@ public:
|
|||||||
// tool triggered via left mouse button; paint current selection
|
// tool triggered via left mouse button; paint current selection
|
||||||
void OnLButtonDown(unsigned int flags,int px,int py) { SelectObject(flags,px,py); }
|
void OnLButtonDown(unsigned int flags,int px,int py) { SelectObject(flags,px,py); }
|
||||||
|
|
||||||
|
// return the entity of the first selected object, or null if it can't
|
||||||
|
// (TODO: less hackiness, for the whole player-selection system)
|
||||||
|
CEntity* GetFirstEntity();
|
||||||
|
|
||||||
// get the default select object instance
|
// get the default select object instance
|
||||||
static CSelectObjectTool* GetTool() { return &m_SelectObjectTool; }
|
static CSelectObjectTool* GetTool() { return &m_SelectObjectTool; }
|
||||||
|
|
||||||
|
@ -43,6 +43,9 @@
|
|||||||
#include "RaiseElevationTool.h"
|
#include "RaiseElevationTool.h"
|
||||||
#include "BrushShapeEditorTool.h"
|
#include "BrushShapeEditorTool.h"
|
||||||
|
|
||||||
|
#include "SelectObjectTool.h"
|
||||||
|
#include "simulation/Entity.h"
|
||||||
|
|
||||||
extern CTerrain g_Terrain;
|
extern CTerrain g_Terrain;
|
||||||
extern CLightEnv g_LightEnv;
|
extern CLightEnv g_LightEnv;
|
||||||
|
|
||||||
@ -90,6 +93,14 @@ BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
|
|||||||
ON_COMMAND(IDR_UNIT_TOOLS, OnUnitTools)
|
ON_COMMAND(IDR_UNIT_TOOLS, OnUnitTools)
|
||||||
ON_COMMAND(ID_RANDOM_MAP, OnRandomMap)
|
ON_COMMAND(ID_RANDOM_MAP, OnRandomMap)
|
||||||
//}}AFX_MSG_MAP
|
//}}AFX_MSG_MAP
|
||||||
|
ON_COMMAND(ID_PLAYER_PLAYER1, OnEntityPlayer1)
|
||||||
|
ON_COMMAND(ID_PLAYER_PLAYER2, OnEntityPlayer2)
|
||||||
|
ON_COMMAND(ID_PLAYER_PLAYER3, OnEntityPlayer3)
|
||||||
|
ON_COMMAND(ID_PLAYER_PLAYER4, OnEntityPlayer4)
|
||||||
|
ON_COMMAND(ID_PLAYER_PLAYER5, OnEntityPlayer5)
|
||||||
|
ON_COMMAND(ID_PLAYER_PLAYER6, OnEntityPlayer6)
|
||||||
|
ON_COMMAND(ID_PLAYER_PLAYER7, OnEntityPlayer7)
|
||||||
|
ON_COMMAND(ID_PLAYER_PLAYER8, OnEntityPlayer8)
|
||||||
END_MESSAGE_MAP()
|
END_MESSAGE_MAP()
|
||||||
|
|
||||||
static UINT indicators[] =
|
static UINT indicators[] =
|
||||||
@ -852,3 +863,14 @@ void CMainFrame::OnRandomMap()
|
|||||||
g_MiniMap.Rebuild();
|
g_MiniMap.Rebuild();
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define P(n) void CMainFrame::OnEntityPlayer##n() { return OnEntityPlayerX(n); }
|
||||||
|
P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8)
|
||||||
|
#undef P
|
||||||
|
|
||||||
|
void CMainFrame::OnEntityPlayerX(int x)
|
||||||
|
{
|
||||||
|
CEntity* entity = CSelectObjectTool::GetTool()->GetFirstEntity();
|
||||||
|
if (entity)
|
||||||
|
entity->m_player = x;
|
||||||
|
}
|
||||||
|
@ -108,6 +108,17 @@ protected:
|
|||||||
afx_msg void OnRandomMap();
|
afx_msg void OnRandomMap();
|
||||||
//}}AFX_MSG
|
//}}AFX_MSG
|
||||||
DECLARE_MESSAGE_MAP()
|
DECLARE_MESSAGE_MAP()
|
||||||
|
public:
|
||||||
|
afx_msg void OnEntityPlayer1();
|
||||||
|
afx_msg void OnEntityPlayer2();
|
||||||
|
afx_msg void OnEntityPlayer3();
|
||||||
|
afx_msg void OnEntityPlayer4();
|
||||||
|
afx_msg void OnEntityPlayer5();
|
||||||
|
afx_msg void OnEntityPlayer6();
|
||||||
|
afx_msg void OnEntityPlayer7();
|
||||||
|
afx_msg void OnEntityPlayer8();
|
||||||
|
|
||||||
|
afx_msg void OnEntityPlayerX(int x);
|
||||||
};
|
};
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -165,6 +165,20 @@ BEGIN
|
|||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
MENUITEM "Ra&ndom Map", ID_RANDOM_MAP
|
MENUITEM "Ra&ndom Map", ID_RANDOM_MAP
|
||||||
END
|
END
|
||||||
|
POPUP "E&ntity"
|
||||||
|
BEGIN
|
||||||
|
POPUP "&Player"
|
||||||
|
BEGIN
|
||||||
|
MENUITEM "Player &1", ID_PLAYER_PLAYER1
|
||||||
|
MENUITEM "Player &2", ID_PLAYER_PLAYER2
|
||||||
|
MENUITEM "Player &3", ID_PLAYER_PLAYER3
|
||||||
|
MENUITEM "Player &4", ID_PLAYER_PLAYER4
|
||||||
|
MENUITEM "Player &5", ID_PLAYER_PLAYER5
|
||||||
|
MENUITEM "Player &6", ID_PLAYER_PLAYER6
|
||||||
|
MENUITEM "Player &7", ID_PLAYER_PLAYER7
|
||||||
|
MENUITEM "Player &8", ID_PLAYER_PLAYER8
|
||||||
|
END
|
||||||
|
END
|
||||||
POPUP "&Tools"
|
POPUP "&Tools"
|
||||||
BEGIN
|
BEGIN
|
||||||
MENUITEM "&Options", ID_TOOLS_OPTIONS
|
MENUITEM "&Options", ID_TOOLS_OPTIONS
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
//{{NO_DEPENDENCIES}}
|
//{{NO_DEPENDENCIES}}
|
||||||
// Microsoft Developer Studio generated include file.
|
// Microsoft Visual C++ generated include file.
|
||||||
// Used by ScEd.rc
|
// Used by ScEd.rc
|
||||||
//
|
//
|
||||||
#define IDD_ABOUTBOX 100
|
#define IDD_ABOUTBOX 100
|
||||||
@ -100,6 +100,15 @@
|
|||||||
#define ID_TEST_STOP 32797
|
#define ID_TEST_STOP 32797
|
||||||
#define ID_TEST_GO 32798
|
#define ID_TEST_GO 32798
|
||||||
#define ID_RANDOM_MAP 32799
|
#define ID_RANDOM_MAP 32799
|
||||||
|
#define ID_ENTITY_PLAYER 32800
|
||||||
|
#define ID_PLAYER_PLAYER1 32801
|
||||||
|
#define ID_PLAYER_PLAYER2 32802
|
||||||
|
#define ID_PLAYER_PLAYER3 32803
|
||||||
|
#define ID_PLAYER_PLAYER4 32804
|
||||||
|
#define ID_PLAYER_PLAYER5 32805
|
||||||
|
#define ID_PLAYER_PLAYER6 32806
|
||||||
|
#define ID_PLAYER_PLAYER7 32807
|
||||||
|
#define ID_PLAYER_PLAYER8 32808
|
||||||
|
|
||||||
// Next default values for new objects
|
// Next default values for new objects
|
||||||
//
|
//
|
||||||
@ -107,7 +116,7 @@
|
|||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
#define _APS_3D_CONTROLS 1
|
#define _APS_3D_CONTROLS 1
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 156
|
#define _APS_NEXT_RESOURCE_VALUE 156
|
||||||
#define _APS_NEXT_COMMAND_VALUE 32800
|
#define _APS_NEXT_COMMAND_VALUE 32809
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1044
|
#define _APS_NEXT_CONTROL_VALUE 1044
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user