# Added tool for viewing models and animations outside the game.
Atlas: Added ActorViewer. Moved GL canvas into separate class for shared use. Disabled message-handling callback while blocked on the game, and stopped creating dialog boxes inside the game thread in order to avoid deadlocks (hopefully). Support multiple Views (for independent sets of camera/update/render code). Recalculate territory boundaries when necessary. Changed default list of animations to match those currently used by actors. # Tidied up more code. Moved some more #includes out of .h files, to minimise unnecessary compilation. MathUtil: Deleted unused/unuseful macros (M_PI (use PI instead), M_PI_2 (use PI/2), MAX3, ABS (use abs)). ObjectManager: Removed some ScEd-specific things. Unit: Moved creation out of UnitManager, so units can be created without adding to the manager. Changed CStr8 to the more conventional CStr. app_hooks: Removed warning for setting multiple times. win: Restored SEH catcher. GameSetup, GameView: Removed RenderNoCull, because it doesn't seem to do what it says it does ("force renderer to load everything") since we're loading-on-demand most stuff and it doesn't seem especially useful since we'd prefer to minimise loading times (but feel free to correct me if I'm wrong). (And because it crashes when things need to be initialised in a different order, so it's easier to remove than to understand and fix it.) PatchRData, Renderer: Work sensibly when there's no game (hence no LOS manager, water, etc). LOSManager: Use entity position instead of actor position when possible. TerritoryManager: Allow delayed recalculations (so Atlas can issue lots of move+recalculate commands per frame). Cinematic: Non-pointer wxTimer, so it doesn't leak and doesn't have to be deleted manually. This was SVN commit r4261.
This commit is contained in:
parent
5205944dce
commit
35e91718c5
@ -25,21 +25,20 @@
|
|||||||
</attachpoints>
|
</attachpoints>
|
||||||
|
|
||||||
<animations>
|
<animations>
|
||||||
<item> Attack </item>
|
|
||||||
<item> AttackA </item>
|
<item>attack1 </item>
|
||||||
<item> AttackB </item>
|
<item>attack2 </item>
|
||||||
<item> AttackC </item>
|
<item>build </item>
|
||||||
<item> Death </item>
|
<item>corpse </item>
|
||||||
<item> DeathA </item>
|
<item>death </item>
|
||||||
<item> DeathB </item>
|
<item>gather_fruit</item>
|
||||||
<item> Idle </item>
|
<item>gather_grain</item>
|
||||||
<item> IdleA </item>
|
<item>gather_stone</item>
|
||||||
<item> IdleB </item>
|
<item>gather_wood </item>
|
||||||
<item> IdleC </item>
|
<item>idle </item>
|
||||||
<item> Run </item>
|
<item>melee </item>
|
||||||
<item> Special </item>
|
<item>run </item>
|
||||||
<item> Walk </item>
|
<item>walk </item>
|
||||||
<item> Pack </item>
|
|
||||||
</animations>
|
</animations>
|
||||||
|
|
||||||
<playercolours>
|
<playercolours>
|
||||||
|
1
binaries/system/ActorViewer.bat
Normal file
1
binaries/system/ActorViewer.bat
Normal file
@ -0,0 +1 @@
|
|||||||
|
pyrogenesis.exe -editor -actorviewer
|
@ -484,9 +484,11 @@ function setup_atlas_packages()
|
|||||||
setup_atlas_package("AtlasUI", "dll",
|
setup_atlas_package("AtlasUI", "dll",
|
||||||
{ -- src
|
{ -- src
|
||||||
"ActorEditor",
|
"ActorEditor",
|
||||||
|
"ActorViewer",
|
||||||
"ArchiveViewer",
|
"ArchiveViewer",
|
||||||
"ColourTester",
|
"ColourTester",
|
||||||
"CustomControls/Buttons",
|
"CustomControls/Buttons",
|
||||||
|
"CustomControls/Canvas",
|
||||||
"CustomControls/ColourDialog",
|
"CustomControls/ColourDialog",
|
||||||
"CustomControls/DraggableListCtrl",
|
"CustomControls/DraggableListCtrl",
|
||||||
"CustomControls/EditableListCtrl",
|
"CustomControls/EditableListCtrl",
|
||||||
|
@ -303,32 +303,6 @@ void CGameView::SubmitModelRecursive(CModel* model)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGameView::RenderNoCull()
|
|
||||||
{
|
|
||||||
CUnitManager *pUnitMan=m_pWorld->GetUnitManager();
|
|
||||||
CTerrain *pTerrain=m_pWorld->GetTerrain();
|
|
||||||
|
|
||||||
if (m_LockCullCamera == false)
|
|
||||||
m_CullCamera = m_ViewCamera;
|
|
||||||
g_Renderer.SetCamera(m_ViewCamera, m_CullCamera);
|
|
||||||
|
|
||||||
CheckLightEnv();
|
|
||||||
|
|
||||||
uint i,j;
|
|
||||||
const std::vector<CUnit*>& units=pUnitMan->GetUnits();
|
|
||||||
for (i=0;i<units.size();++i) {
|
|
||||||
SubmitModelRecursive(units[i]->GetModel());
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 patchesPerSide=pTerrain->GetPatchesPerSide();
|
|
||||||
for (j=0; j<patchesPerSide; j++) {
|
|
||||||
for (i=0; i<patchesPerSide; i++) {
|
|
||||||
CPatch* patch=pTerrain->GetPatch(i,j);
|
|
||||||
g_Renderer.Submit(patch);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void MarkUpdateColorRecursive(CModel* model)
|
static void MarkUpdateColorRecursive(CModel* model)
|
||||||
{
|
{
|
||||||
model->SetDirty(RENDERDATA_UPDATE_COLOR);
|
model->SetDirty(RENDERDATA_UPDATE_COLOR);
|
||||||
|
@ -141,10 +141,6 @@ public:
|
|||||||
void CameraLock(CVector3D Trans, bool smooth=true);
|
void CameraLock(CVector3D Trans, bool smooth=true);
|
||||||
void CameraLock(float x, float y, float z, bool smooth=true);
|
void CameraLock(float x, float y, float z, bool smooth=true);
|
||||||
|
|
||||||
// RenderNoCull: render absolutely everything to a blank frame to force
|
|
||||||
// renderer to load required assets
|
|
||||||
void RenderNoCull();
|
|
||||||
|
|
||||||
// Camera Control Functions (used by input handler)
|
// Camera Control Functions (used by input handler)
|
||||||
void ResetCamera();
|
void ResetCamera();
|
||||||
void ResetCameraOrientation();
|
void ResetCameraOrientation();
|
||||||
|
@ -1,31 +1,31 @@
|
|||||||
#include "precompiled.h"
|
#include "precompiled.h"
|
||||||
|
|
||||||
#include "MapReader.h"
|
#include "MapReader.h"
|
||||||
#include "lib/types.h"
|
|
||||||
#include "UnitManager.h"
|
#include "graphics/Camera.h"
|
||||||
#include "Unit.h"
|
|
||||||
#include "ps/Game.h"
|
|
||||||
#include "ObjectManager.h"
|
|
||||||
#include "simulation/Entity.h"
|
|
||||||
#include "simulation/EntityTemplate.h"
|
|
||||||
#include "simulation/EntityTemplateCollection.h"
|
|
||||||
#include "simulation/EntityManager.h"
|
|
||||||
#include "ps/CLogger.h"
|
|
||||||
#include "maths/MathUtil.h"
|
|
||||||
#include "Camera.h"
|
|
||||||
#include "graphics/Patch.h"
|
|
||||||
#include "graphics/GameView.h"
|
#include "graphics/GameView.h"
|
||||||
#include "renderer/WaterManager.h"
|
#include "graphics/Model.h"
|
||||||
#include "renderer/SkyManager.h"
|
#include "graphics/ObjectManager.h"
|
||||||
|
#include "graphics/Patch.h"
|
||||||
#include "Model.h"
|
#include "graphics/Terrain.h"
|
||||||
#include "Terrain.h"
|
#include "graphics/TextureEntry.h"
|
||||||
#include "TextureManager.h"
|
#include "graphics/TextureManager.h"
|
||||||
#include "TextureEntry.h"
|
#include "graphics/Unit.h"
|
||||||
|
#include "graphics/UnitManager.h"
|
||||||
#include "lib/timer.h"
|
#include "lib/timer.h"
|
||||||
|
#include "lib/types.h"
|
||||||
|
#include "maths/MathUtil.h"
|
||||||
|
#include "ps/CLogger.h"
|
||||||
|
#include "ps/Game.h"
|
||||||
#include "ps/Loader.h"
|
#include "ps/Loader.h"
|
||||||
#include "ps/LoaderThunks.h"
|
#include "ps/LoaderThunks.h"
|
||||||
|
#include "ps/xml/Xeromyces.h"
|
||||||
|
#include "renderer/SkyManager.h"
|
||||||
|
#include "renderer/WaterManager.h"
|
||||||
|
#include "simulation/Entity.h"
|
||||||
|
#include "simulation/EntityManager.h"
|
||||||
|
#include "simulation/EntityTemplate.h"
|
||||||
|
#include "simulation/EntityTemplateCollection.h"
|
||||||
|
|
||||||
#define LOG_CATEGORY "graphics"
|
#define LOG_CATEGORY "graphics"
|
||||||
|
|
||||||
|
@ -237,7 +237,7 @@ void CMapWriter::WriteXML(const char* filename,
|
|||||||
CVector3D in = pCamera->m_Orientation.GetIn();
|
CVector3D in = pCamera->m_Orientation.GetIn();
|
||||||
// Convert to spherical coordinates
|
// Convert to spherical coordinates
|
||||||
float rotation = atan2(in.X, in.Z);
|
float rotation = atan2(in.X, in.Z);
|
||||||
float declination = atan2(sqrt(in.X*in.X + in.Z*in.Z), in.Y) - M_PI_2;
|
float declination = atan2(sqrt(in.X*in.X + in.Z*in.Z), in.Y) - PI/2;
|
||||||
|
|
||||||
{
|
{
|
||||||
XML_Element("Rotation");
|
XML_Element("Rotation");
|
||||||
|
@ -29,7 +29,7 @@ bool operator< (const CObjectManager::ObjectKey& a, const CObjectManager::Object
|
|||||||
return a.ActorVariation < b.ActorVariation;
|
return a.ActorVariation < b.ActorVariation;
|
||||||
}
|
}
|
||||||
|
|
||||||
CObjectManager::CObjectManager() : m_SelectedThing(NULL)
|
CObjectManager::CObjectManager()
|
||||||
{
|
{
|
||||||
m_ObjectTypes.reserve(32);
|
m_ObjectTypes.reserve(32);
|
||||||
}
|
}
|
||||||
@ -158,6 +158,10 @@ void CObjectManager::DeleteObject(CObjectEntry* entry)
|
|||||||
|
|
||||||
int CObjectManager::LoadObjects()
|
int CObjectManager::LoadObjects()
|
||||||
{
|
{
|
||||||
|
// This is kind of useless - it should probably be removed,
|
||||||
|
// and UnloadObject moved into the destructor, and singletonness
|
||||||
|
// removed if we still want to unload the object manager and reuse it
|
||||||
|
// again later.
|
||||||
AddObjectType("");
|
AddObjectType("");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -177,9 +181,6 @@ void CObjectManager::UnloadObjects()
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
m_ObjectTypes.clear();
|
m_ObjectTypes.clear();
|
||||||
|
|
||||||
delete m_SelectedThing;
|
|
||||||
m_SelectedThing = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,16 +14,6 @@ class CMatrix3D;
|
|||||||
// access to sole CObjectManager object
|
// access to sole CObjectManager object
|
||||||
#define g_ObjMan CObjectManager::GetSingleton()
|
#define g_ObjMan CObjectManager::GetSingleton()
|
||||||
|
|
||||||
// Slight hack, to allow ScEd to place either entities or objects
|
|
||||||
class CObjectThing
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual ~CObjectThing() {}
|
|
||||||
virtual void Create(CMatrix3D& transform, int playerID)=0;
|
|
||||||
virtual void SetTransform(CMatrix3D& transform)=0;
|
|
||||||
virtual CObjectEntry* GetObjectEntry()=0;
|
|
||||||
};
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// CObjectManager: manager class for all possible actor types
|
// CObjectManager: manager class for all possible actor types
|
||||||
class CObjectManager : public Singleton<CObjectManager>
|
class CObjectManager : public Singleton<CObjectManager>
|
||||||
@ -51,7 +41,6 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CObjectThing* m_SelectedThing;
|
|
||||||
|
|
||||||
// constructor, destructor
|
// constructor, destructor
|
||||||
CObjectManager();
|
CObjectManager();
|
||||||
@ -68,8 +57,8 @@ public:
|
|||||||
|
|
||||||
CObjectBase* FindObjectBase(const char* objname);
|
CObjectBase* FindObjectBase(const char* objname);
|
||||||
|
|
||||||
CObjectEntry* FindObjectVariation(const char* objname, const std::vector<std::set<CStr8> >& selections);
|
CObjectEntry* FindObjectVariation(const char* objname, const std::vector<std::set<CStr> >& selections);
|
||||||
CObjectEntry* FindObjectVariation(CObjectBase* base, const std::vector<std::set<CStr8> >& selections);
|
CObjectEntry* FindObjectVariation(CObjectBase* base, const std::vector<std::set<CStr> >& selections);
|
||||||
|
|
||||||
// Get all names, quite slowly. (Intended only for ScEd.)
|
// Get all names, quite slowly. (Intended only for ScEd.)
|
||||||
void GetAllObjectNames(std::vector<CStr>& names);
|
void GetAllObjectNames(std::vector<CStr>& names);
|
||||||
|
@ -7,18 +7,37 @@
|
|||||||
#include "SkeletonAnim.h"
|
#include "SkeletonAnim.h"
|
||||||
#include "SkeletonAnimDef.h"
|
#include "SkeletonAnimDef.h"
|
||||||
|
|
||||||
CUnit::CUnit(CObjectEntry* object, CEntity* entity, const std::set<CStr8>& actorSelections)
|
CUnit::CUnit(CObjectEntry* object, CEntity* entity, const std::set<CStr>& actorSelections)
|
||||||
: m_Object(object), m_Model(object->m_Model->Clone()), m_Entity(entity),
|
: m_Object(object), m_Model(object->m_Model->Clone()), m_Entity(entity),
|
||||||
m_ID(-1), m_ActorSelections(actorSelections)
|
m_ID(-1), m_ActorSelections(actorSelections)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CUnit::~CUnit()
|
CUnit::~CUnit()
|
||||||
{
|
{
|
||||||
delete m_Model;
|
delete m_Model;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CUnit* CUnit::Create(const CStr& actorName, CEntity* entity, const std::set<CStr>& selections)
|
||||||
|
{
|
||||||
|
CObjectBase* base = g_ObjMan.FindObjectBase(actorName);
|
||||||
|
|
||||||
|
if (! base)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
std::set<CStr> actorSelections = base->CalculateRandomVariation(selections);
|
||||||
|
|
||||||
|
std::vector<std::set<CStr> > selectionsVec;
|
||||||
|
selectionsVec.push_back(actorSelections);
|
||||||
|
|
||||||
|
CObjectEntry* obj = g_ObjMan.FindObjectVariation(base, selectionsVec);
|
||||||
|
|
||||||
|
if (! obj)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return new CUnit(obj, entity, actorSelections);
|
||||||
|
}
|
||||||
|
|
||||||
void CUnit::ShowAmmunition()
|
void CUnit::ShowAmmunition()
|
||||||
{
|
{
|
||||||
if (!m_Object->m_AmmunitionModel || !m_Object->m_AmmunitionPoint)
|
if (!m_Object->m_AmmunitionModel || !m_Object->m_AmmunitionPoint)
|
||||||
@ -115,9 +134,9 @@ void CUnit::SetPlayerID(int id)
|
|||||||
m_Model->SetPlayerID(m_PlayerID);
|
m_Model->SetPlayerID(m_PlayerID);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CUnit::SetEntitySelection(const CStrW& selection)
|
void CUnit::SetEntitySelection(const CStr& selection)
|
||||||
{
|
{
|
||||||
CStrW selection_lc = selection.LowerCase();
|
CStr selection_lc = selection.LowerCase();
|
||||||
|
|
||||||
// If we've already selected this, don't do anything
|
// If we've already selected this, don't do anything
|
||||||
if (m_EntitySelections.find(selection_lc) != m_EntitySelections.end())
|
if (m_EntitySelections.find(selection_lc) != m_EntitySelections.end())
|
||||||
@ -130,7 +149,7 @@ void CUnit::SetEntitySelection(const CStrW& selection)
|
|||||||
ReloadObject();
|
ReloadObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CUnit::SetActorSelections(const std::set<CStr8>& selections)
|
void CUnit::SetActorSelections(const std::set<CStr>& selections)
|
||||||
{
|
{
|
||||||
m_ActorSelections = selections;
|
m_ActorSelections = selections;
|
||||||
ReloadObject();
|
ReloadObject();
|
||||||
@ -138,7 +157,7 @@ void CUnit::SetActorSelections(const std::set<CStr8>& selections)
|
|||||||
|
|
||||||
void CUnit::ReloadObject()
|
void CUnit::ReloadObject()
|
||||||
{
|
{
|
||||||
std::vector<std::set<CStr8> > selections;
|
std::vector<std::set<CStr> > selections;
|
||||||
// TODO: push world selections (seasons, etc) (and reload whenever they're changed)
|
// TODO: push world selections (seasons, etc) (and reload whenever they're changed)
|
||||||
selections.push_back(m_EntitySelections);
|
selections.push_back(m_EntitySelections);
|
||||||
selections.push_back(m_ActorSelections);
|
selections.push_back(m_ActorSelections);
|
||||||
|
@ -3,24 +3,31 @@
|
|||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
|
#include "ps/CStr.h"
|
||||||
|
|
||||||
class CModel;
|
class CModel;
|
||||||
class CObjectEntry;
|
class CObjectEntry;
|
||||||
class CEntity;
|
class CEntity;
|
||||||
class CSkeletonAnim;
|
class CSkeletonAnim;
|
||||||
class CStr8;
|
|
||||||
class CStrW;
|
class CStrW;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// CUnit: simple "actor" definition - defines a sole object within the world
|
// CUnit: simple "actor" definition - defines a sole object within the world
|
||||||
class CUnit
|
class CUnit
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
// Private constructor. Needs complete list of selections for the variation.
|
||||||
|
CUnit(CObjectEntry* object, CEntity* entity, const std::set<CStr>& actorSelections);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CUnit(CObjectEntry* object, CEntity* entity, const std::set<CStr8>& actorSelections);
|
// Attempt to create a unit with the given actor, attached to an entity
|
||||||
|
// (or NULL), with a set of suggested selections (with the rest being randomised).
|
||||||
|
// Returns NULL on failure.
|
||||||
|
static CUnit* Create(const CStr& actorName, CEntity* entity, const std::set<CStr>& selections);
|
||||||
|
|
||||||
// destructor
|
// destructor
|
||||||
~CUnit();
|
~CUnit();
|
||||||
|
|
||||||
|
|
||||||
// get unit's template object; never NULL
|
// get unit's template object; never NULL
|
||||||
CObjectEntry* GetObject() { return m_Object; }
|
CObjectEntry* GetObject() { return m_Object; }
|
||||||
// get unit's model data; never NULL
|
// get unit's model data; never NULL
|
||||||
@ -34,19 +41,20 @@ public:
|
|||||||
|
|
||||||
// Sets the animation a random one matching 'name'. If none is found,
|
// Sets the animation a random one matching 'name'. If none is found,
|
||||||
// sets to idle instead. Applies recursively to props.
|
// sets to idle instead. Applies recursively to props.
|
||||||
bool SetRandomAnimation(const CStr8& name, bool once = false, float speed = 0.0f);
|
// SetEntitySelection(name) should typically be used before this.
|
||||||
|
bool SetRandomAnimation(const CStr& name, bool once = false, float speed = 0.0f);
|
||||||
|
|
||||||
// Returns a random animation matching 'name'. If none is found,
|
// Returns a random animation matching 'name'. If none is found,
|
||||||
// returns idle instead.
|
// returns idle instead.
|
||||||
CSkeletonAnim* GetRandomAnimation(const CStr8& name);
|
CSkeletonAnim* GetRandomAnimation(const CStr& name);
|
||||||
|
|
||||||
// Sets the entity-selection, and updates the unit to use the new
|
// Sets the entity-selection, and updates the unit to use the new
|
||||||
// actor variation.
|
// actor variation.
|
||||||
void SetEntitySelection(const CStrW& selection);
|
void SetEntitySelection(const CStr& selection);
|
||||||
|
|
||||||
// Returns whether the currently active animation is one of the ones
|
// Returns whether the currently active animation is one of the ones
|
||||||
// matching 'name'.
|
// matching 'name'.
|
||||||
bool IsPlayingAnimation(const CStr8& name);
|
bool IsPlayingAnimation(const CStr& name);
|
||||||
|
|
||||||
// Set player ID of this unit
|
// Set player ID of this unit
|
||||||
void SetPlayerID(int id);
|
void SetPlayerID(int id);
|
||||||
@ -57,9 +65,9 @@ public:
|
|||||||
int GetID() const { return m_ID; }
|
int GetID() const { return m_ID; }
|
||||||
void SetID(int id) { m_ID = id; }
|
void SetID(int id) { m_ID = id; }
|
||||||
|
|
||||||
const std::set<CStr8>& GetActorSelections() const { return m_ActorSelections; }
|
const std::set<CStr>& GetActorSelections() const { return m_ActorSelections; }
|
||||||
|
|
||||||
void SetActorSelections(const std::set<CStr8>& selections);
|
void SetActorSelections(const std::set<CStr>& selections);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// object from which unit was created
|
// object from which unit was created
|
||||||
@ -76,9 +84,9 @@ private:
|
|||||||
int m_ID;
|
int m_ID;
|
||||||
|
|
||||||
// actor-level selections for this unit
|
// actor-level selections for this unit
|
||||||
std::set<CStr8> m_ActorSelections;
|
std::set<CStr> m_ActorSelections;
|
||||||
// entity-level selections for this unit
|
// entity-level selections for this unit
|
||||||
std::set<CStr8> m_EntitySelections;
|
std::set<CStr> m_EntitySelections;
|
||||||
|
|
||||||
void ReloadObject();
|
void ReloadObject();
|
||||||
};
|
};
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
#include "ObjectEntry.h"
|
#include "ObjectEntry.h"
|
||||||
#include "simulation/Entity.h"
|
#include "simulation/Entity.h"
|
||||||
#include "simulation/LOSManager.h"
|
#include "simulation/LOSManager.h"
|
||||||
#include "simulation/TerritoryManager.h"
|
|
||||||
|
|
||||||
extern CConsole* g_Console;
|
extern CConsole* g_Console;
|
||||||
|
|
||||||
@ -127,22 +126,8 @@ CUnit* CUnitManager::PickUnit(const CVector3D& origin, const CVector3D& dir) con
|
|||||||
// CreateUnit: create a new unit and add it to the world
|
// CreateUnit: create a new unit and add it to the world
|
||||||
CUnit* CUnitManager::CreateUnit(const CStr& actorName, CEntity* entity, const std::set<CStr8>& selections)
|
CUnit* CUnitManager::CreateUnit(const CStr& actorName, CEntity* entity, const std::set<CStr8>& selections)
|
||||||
{
|
{
|
||||||
CObjectBase* base = g_ObjMan.FindObjectBase(actorName);
|
CUnit* unit = CUnit::Create(actorName, entity, selections);
|
||||||
|
if (unit)
|
||||||
if (! base)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
std::set<CStr8> actorSelections = base->CalculateRandomVariation(selections);
|
|
||||||
|
|
||||||
std::vector<std::set<CStr8> > selectionsVec;
|
|
||||||
selectionsVec.push_back(actorSelections);
|
|
||||||
|
|
||||||
CObjectEntry* obj = g_ObjMan.FindObjectVariation(base, selectionsVec);
|
|
||||||
|
|
||||||
if (! obj)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
CUnit* unit = new CUnit(obj, entity, actorSelections);
|
|
||||||
AddUnit(unit);
|
AddUnit(unit);
|
||||||
return unit;
|
return unit;
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ public:
|
|||||||
void DeleteAll();
|
void DeleteAll();
|
||||||
|
|
||||||
// creates a new unit and adds it to the world
|
// creates a new unit and adds it to the world
|
||||||
CUnit* CreateUnit(const CStr& actorName, CEntity* entity, const std::set<CStr8>& selections);
|
CUnit* CreateUnit(const CStr& actorName, CEntity* entity, const std::set<CStr>& selections);
|
||||||
|
|
||||||
// return the units
|
// return the units
|
||||||
const std::vector<CUnit*>& GetUnits() const { return m_Units; }
|
const std::vector<CUnit*>& GetUnits() const { return m_Units; }
|
||||||
|
@ -157,7 +157,6 @@ static AppHooks ah =
|
|||||||
void app_hooks_update(AppHooks* ah_)
|
void app_hooks_update(AppHooks* ah_)
|
||||||
{
|
{
|
||||||
debug_assert(ah_);
|
debug_assert(ah_);
|
||||||
ONCE_NOT(debug_warn("app hooks already set"));
|
|
||||||
|
|
||||||
// override members in <ah> if they are non-zero in <ah_>
|
// override members in <ah> if they are non-zero in <ah_>
|
||||||
// (otherwise, we stick with the defaults set above)
|
// (otherwise, we stick with the defaults set above)
|
||||||
|
@ -1394,7 +1394,7 @@ static float fade_factor_exponential(float t)
|
|||||||
static float fade_factor_s_curve(float t)
|
static float fade_factor_s_curve(float t)
|
||||||
{
|
{
|
||||||
// cosine curve
|
// cosine curve
|
||||||
float y = cos(t*M_PI + M_PI);
|
float y = cos(t*PI + PI);
|
||||||
// map [-1,1] to [0,1]
|
// map [-1,1] to [0,1]
|
||||||
return (y + 1.0f) / 2.0f;
|
return (y + 1.0f) / 2.0f;
|
||||||
}
|
}
|
||||||
|
@ -327,7 +327,7 @@ static inline void pre_libc_init()
|
|||||||
static int SEH_wrapped_entry()
|
static int SEH_wrapped_entry()
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
//__try
|
__try
|
||||||
{
|
{
|
||||||
pre_libc_init();
|
pre_libc_init();
|
||||||
#ifdef USE_WINMAIN
|
#ifdef USE_WINMAIN
|
||||||
@ -336,7 +336,7 @@ static int SEH_wrapped_entry()
|
|||||||
ret = mainCRTStartup(); // calls _cinit and then our main
|
ret = mainCRTStartup(); // calls _cinit and then our main
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
//__except(wdbg_exception_filter(GetExceptionInformation()))
|
__except(wdbg_exception_filter(GetExceptionInformation()))
|
||||||
{
|
{
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
|
@ -357,6 +357,9 @@ void kill_mainloop()
|
|||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
// If you ever want to catch a particular allocation:
|
||||||
|
//_CrtSetBreakAlloc(7864);
|
||||||
|
|
||||||
// see discussion at declaration of win_pre_main_init.
|
// see discussion at declaration of win_pre_main_init.
|
||||||
#if OS_WIN
|
#if OS_WIN
|
||||||
win_pre_main_init();
|
win_pre_main_init();
|
||||||
|
@ -5,42 +5,32 @@
|
|||||||
#define PI 3.14159265358979323846f
|
#define PI 3.14159265358979323846f
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef M_PI
|
|
||||||
#define M_PI 3.14159265358979323846
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef M_PI_2
|
|
||||||
#define M_PI_2 1.57079632679489661923
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define DEGTORAD(a) ((a) * (PI/180.0f))
|
#define DEGTORAD(a) ((a) * (PI/180.0f))
|
||||||
#define RADTODEG(a) ((a) * (180.0f/PI))
|
#define RADTODEG(a) ((a) * (180.0f/PI))
|
||||||
#define SQR(x) ((x) * (x))
|
#define SQR(x) ((x) * (x))
|
||||||
#define MAX3(a,b,c) ( MAX (MAX(a,b), c) )
|
|
||||||
#define ABS(a) ((a > 0) ? (a) : (-a))
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T Interpolate( T& a, T& b, float l )
|
T Interpolate(T& a, T& b, float l)
|
||||||
{
|
{
|
||||||
return( a + ( b - a ) * l );
|
return a + (b - a) * l;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline T clamp(T value, T min, T max)
|
inline T clamp(T value, T min, T max)
|
||||||
{
|
{
|
||||||
if (value<=min) return min;
|
if (value <= min) return min;
|
||||||
else if (value>=max) return max;
|
else if (value >= max) return max;
|
||||||
else return value;
|
else return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int RoundUpToPowerOf2(int x)
|
static inline int RoundUpToPowerOf2(int x)
|
||||||
{
|
{
|
||||||
if ((x & (x-1))==0) return x;
|
if ((x & (x-1)) == 0)
|
||||||
int d=x;
|
return x;
|
||||||
while (d & (d-1)) {
|
int d = x;
|
||||||
d&=(d-1);
|
while (d & (d-1))
|
||||||
}
|
d &= (d-1);
|
||||||
return d<<1;
|
return d << 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline float sgn(float a)
|
inline float sgn(float a)
|
||||||
|
@ -31,7 +31,7 @@ Noise2D::Noise2D(int f)
|
|||||||
grads[i] = new CVector2D_Maths[freq];
|
grads[i] = new CVector2D_Maths[freq];
|
||||||
for(int j=0; j<freq; j++)
|
for(int j=0; j<freq; j++)
|
||||||
{
|
{
|
||||||
float a = randFloat() * 2 * M_PI;
|
float a = randFloat() * 2 * PI;
|
||||||
grads[i][j] = CVector2D_Maths(cos(a), sin(a));
|
grads[i][j] = CVector2D_Maths(cos(a), sin(a));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,49 +14,54 @@
|
|||||||
#include "lib/res/graphics/tex.h"
|
#include "lib/res/graphics/tex.h"
|
||||||
#include "lib/res/graphics/cursor.h"
|
#include "lib/res/graphics/cursor.h"
|
||||||
|
|
||||||
|
#include "ps/CConsole.h"
|
||||||
|
#include "ps/CLogger.h"
|
||||||
|
#include "ps/ConfigDB.h"
|
||||||
|
#include "ps/Font.h"
|
||||||
|
#include "ps/Game.h"
|
||||||
|
#include "ps/Globals.h"
|
||||||
|
#include "ps/Hotkey.h"
|
||||||
|
#include "ps/Interact.h"
|
||||||
|
#include "ps/Loader.h"
|
||||||
|
#include "ps/Overlay.h"
|
||||||
#include "ps/Profile.h"
|
#include "ps/Profile.h"
|
||||||
#include "ps/ProfileViewer.h"
|
#include "ps/ProfileViewer.h"
|
||||||
#include "ps/Loader.h"
|
|
||||||
#include "ps/Font.h"
|
|
||||||
#include "ps/CConsole.h"
|
|
||||||
#include "ps/Game.h"
|
|
||||||
#include "ps/Interact.h"
|
|
||||||
#include "ps/Hotkey.h"
|
|
||||||
#include "ps/ConfigDB.h"
|
|
||||||
#include "ps/CLogger.h"
|
|
||||||
#include "ps/i18n.h"
|
|
||||||
#include "ps/Overlay.h"
|
|
||||||
#include "ps/StringConvert.h"
|
#include "ps/StringConvert.h"
|
||||||
#include "ps/Globals.h"
|
|
||||||
#include "ps/Util.h"
|
#include "ps/Util.h"
|
||||||
|
#include "ps/i18n.h"
|
||||||
|
|
||||||
#include "graphics/ParticleEngine.h"
|
#include "graphics/GameView.h"
|
||||||
#include "graphics/MapReader.h"
|
|
||||||
#include "graphics/Terrain.h"
|
|
||||||
#include "graphics/TextureManager.h"
|
|
||||||
#include "graphics/ObjectManager.h"
|
|
||||||
#include "graphics/SkeletonAnimManager.h"
|
|
||||||
#include "graphics/LightEnv.h"
|
#include "graphics/LightEnv.h"
|
||||||
#include "graphics/Model.h"
|
#include "graphics/MapReader.h"
|
||||||
#include "graphics/UnitManager.h"
|
|
||||||
#include "graphics/MaterialManager.h"
|
#include "graphics/MaterialManager.h"
|
||||||
#include "graphics/MeshManager.h"
|
#include "graphics/MeshManager.h"
|
||||||
#include "graphics/GameView.h"
|
#include "graphics/Model.h"
|
||||||
|
#include "graphics/ObjectManager.h"
|
||||||
|
#include "graphics/ParticleEngine.h"
|
||||||
|
#include "graphics/SkeletonAnimManager.h"
|
||||||
|
#include "graphics/Terrain.h"
|
||||||
|
#include "graphics/TextureManager.h"
|
||||||
|
#include "graphics/Unit.h"
|
||||||
|
#include "graphics/UnitManager.h"
|
||||||
|
|
||||||
#include "renderer/Renderer.h"
|
#include "renderer/Renderer.h"
|
||||||
#include "renderer/VertexBufferManager.h"
|
#include "renderer/VertexBufferManager.h"
|
||||||
|
|
||||||
#include "maths/MathUtil.h"
|
#include "maths/MathUtil.h"
|
||||||
|
|
||||||
#include "simulation/EntityTemplateCollection.h"
|
|
||||||
#include "simulation/FormationCollection.h"
|
|
||||||
#include "simulation/TechnologyCollection.h"
|
|
||||||
#include "simulation/Entity.h"
|
#include "simulation/Entity.h"
|
||||||
#include "simulation/EntityHandles.h"
|
#include "simulation/EntityHandles.h"
|
||||||
#include "simulation/EntityManager.h"
|
#include "simulation/EntityManager.h"
|
||||||
|
#include "simulation/EntityTemplate.h"
|
||||||
|
#include "simulation/EntityTemplateCollection.h"
|
||||||
|
#include "simulation/EventHandlers.h"
|
||||||
|
#include "simulation/FormationCollection.h"
|
||||||
#include "simulation/FormationManager.h"
|
#include "simulation/FormationManager.h"
|
||||||
#include "simulation/TerritoryManager.h"
|
#include "simulation/TerritoryManager.h"
|
||||||
#include "simulation/PathfindEngine.h"
|
#include "simulation/PathfindEngine.h"
|
||||||
#include "simulation/Scheduler.h"
|
|
||||||
#include "simulation/Projectile.h"
|
#include "simulation/Projectile.h"
|
||||||
|
#include "simulation/Scheduler.h"
|
||||||
|
#include "simulation/TechnologyCollection.h"
|
||||||
|
|
||||||
#include "scripting/ScriptableComplex.inl"
|
#include "scripting/ScriptableComplex.inl"
|
||||||
#include "scripting/ScriptingHost.h"
|
#include "scripting/ScriptingHost.h"
|
||||||
@ -266,22 +271,6 @@ void GUI_DisplayLoadProgress(int percent, const wchar_t* pending_task)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// RenderNoCull: render absolutely everything to a blank frame to force renderer
|
|
||||||
// to load required assets
|
|
||||||
static void RenderNoCull()
|
|
||||||
{
|
|
||||||
g_Renderer.BeginFrame();
|
|
||||||
|
|
||||||
if (g_Game)
|
|
||||||
g_Game->GetView()->RenderNoCull();
|
|
||||||
|
|
||||||
g_Renderer.FlushFrame();
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
|
|
||||||
g_Renderer.EndFrame();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Render()
|
void Render()
|
||||||
{
|
{
|
||||||
MICROLOG(L"begin frame");
|
MICROLOG(L"begin frame");
|
||||||
@ -389,12 +378,6 @@ void Render()
|
|||||||
g_Game->GetView()->GetCinema()->DrawAllSplines();
|
g_Game->GetView()->GetCinema()->DrawAllSplines();
|
||||||
PROFILE_END( "render cinematic splines" );
|
PROFILE_END( "render cinematic splines" );
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
PROFILE_START( "flush frame" );
|
|
||||||
g_Renderer.FlushFrame();
|
|
||||||
PROFILE_END( "flush frame" );
|
|
||||||
}
|
|
||||||
|
|
||||||
oglCheck();
|
oglCheck();
|
||||||
|
|
||||||
@ -898,9 +881,6 @@ void Init(int argc, char* argv[], uint flags)
|
|||||||
// add all debug_printf "tags" that we are interested in:
|
// add all debug_printf "tags" that we are interested in:
|
||||||
debug_filter_add("TIMER");
|
debug_filter_add("TIMER");
|
||||||
|
|
||||||
// If you ever want to catch a particular allocation:
|
|
||||||
//_CrtSetBreakAlloc(187);
|
|
||||||
|
|
||||||
// Query CPU capabilities, possibly set some CPU-dependent flags
|
// Query CPU capabilities, possibly set some CPU-dependent flags
|
||||||
cpu_init();
|
cpu_init();
|
||||||
|
|
||||||
@ -1004,7 +984,13 @@ void Init(int argc, char* argv[], uint flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// (must come after SetVideoMode, since it calls oglInit)
|
// (must come after SetVideoMode, since it calls oglInit)
|
||||||
const char* missing = oglHaveExtensions(0, "GL_ARB_multitexture", "GL_EXT_draw_range_elements", "GL_ARB_texture_env_combine", "GL_ARB_texture_env_dot3", "GL_ARB_texture_env_crossbar", 0);
|
const char* missing = oglHaveExtensions(0,
|
||||||
|
"GL_ARB_multitexture",
|
||||||
|
"GL_EXT_draw_range_elements",
|
||||||
|
"GL_ARB_texture_env_combine",
|
||||||
|
"GL_ARB_texture_env_dot3",
|
||||||
|
"GL_ARB_texture_env_crossbar",
|
||||||
|
0);
|
||||||
if(missing)
|
if(missing)
|
||||||
{
|
{
|
||||||
wchar_t buf[500];
|
wchar_t buf[500];
|
||||||
@ -1065,7 +1051,7 @@ void Init(int argc, char* argv[], uint flags)
|
|||||||
// Check for heap corruption after every allocation. Very, very slowly.
|
// Check for heap corruption after every allocation. Very, very slowly.
|
||||||
// (And it highlights the allocation just after the one you care about,
|
// (And it highlights the allocation just after the one you care about,
|
||||||
// so you need to run it again and tell it to break on the one before.)
|
// so you need to run it again and tell it to break on the one before.)
|
||||||
//debug_heap_enable(DEBUG_HEAP_ALL);
|
// debug_heap_enable(DEBUG_HEAP_ALL);
|
||||||
|
|
||||||
InitInput();
|
InitInput();
|
||||||
|
|
||||||
@ -1079,27 +1065,20 @@ void Init(int argc, char* argv[], uint flags)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
{
|
|
||||||
TIMER("Init_renderblank");
|
|
||||||
MICROLOG(L"render blank");
|
|
||||||
// render everything to a blank frame to force renderer to load everything
|
|
||||||
RenderNoCull();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_FixedFrameTiming) {
|
if (g_FixedFrameTiming) {
|
||||||
CCamera &g_Camera=*g_Game->GetView()->GetCamera();
|
CCamera &camera = *g_Game->GetView()->GetCamera();
|
||||||
#if 0 // TOPDOWN
|
#if 0 // TOPDOWN
|
||||||
g_Camera.SetProjection(1.0f,10000.0f,DEGTORAD(90));
|
camera.SetProjection(1.0f,10000.0f,DEGTORAD(90));
|
||||||
g_Camera.m_Orientation.SetIdentity();
|
camera.m_Orientation.SetIdentity();
|
||||||
g_Camera.m_Orientation.RotateX(DEGTORAD(90));
|
camera.m_Orientation.RotateX(DEGTORAD(90));
|
||||||
g_Camera.m_Orientation.Translate(CELL_SIZE*250*0.5, 250, CELL_SIZE*250*0.5);
|
camera.m_Orientation.Translate(CELL_SIZE*250*0.5, 250, CELL_SIZE*250*0.5);
|
||||||
#else // std view
|
#else // std view
|
||||||
g_Camera.SetProjection(1.0f,10000.0f,DEGTORAD(20));
|
camera.SetProjection(1.0f,10000.0f,DEGTORAD(20));
|
||||||
g_Camera.m_Orientation.SetXRotation(DEGTORAD(30));
|
camera.m_Orientation.SetXRotation(DEGTORAD(30));
|
||||||
g_Camera.m_Orientation.RotateY(DEGTORAD(-45));
|
camera.m_Orientation.RotateY(DEGTORAD(-45));
|
||||||
g_Camera.m_Orientation.Translate(350, 350, -275);
|
camera.m_Orientation.Translate(350, 350, -275);
|
||||||
#endif
|
#endif
|
||||||
g_Camera.UpdateFrustum();
|
camera.UpdateFrustum();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_AutostartMap.Length())
|
if (g_AutostartMap.Length())
|
||||||
|
@ -15,6 +15,7 @@ extern void GUI_DisplayLoadProgress(int percent, const wchar_t* pending_task);
|
|||||||
|
|
||||||
|
|
||||||
extern void Render();
|
extern void Render();
|
||||||
|
extern void RenderActor();
|
||||||
|
|
||||||
extern void Shutdown();
|
extern void Shutdown();
|
||||||
|
|
||||||
|
@ -2,9 +2,6 @@
|
|||||||
|
|
||||||
#include "Interact.h"
|
#include "Interact.h"
|
||||||
|
|
||||||
#include "ps/CConsole.h"
|
|
||||||
#include "ps/Game.h"
|
|
||||||
#include "ps/Hotkey.h"
|
|
||||||
#include "graphics/GameView.h"
|
#include "graphics/GameView.h"
|
||||||
#include "graphics/HFTracer.h"
|
#include "graphics/HFTracer.h"
|
||||||
#include "graphics/Model.h"
|
#include "graphics/Model.h"
|
||||||
@ -18,22 +15,27 @@
|
|||||||
#include "lib/res/graphics/unifont.h"
|
#include "lib/res/graphics/unifont.h"
|
||||||
#include "lib/timer.h"
|
#include "lib/timer.h"
|
||||||
#include "maths/MathUtil.h"
|
#include "maths/MathUtil.h"
|
||||||
#include "ps/Globals.h"
|
|
||||||
#include "network/NetMessage.h"
|
#include "network/NetMessage.h"
|
||||||
|
#include "ps/CConsole.h"
|
||||||
|
#include "ps/Game.h"
|
||||||
|
#include "ps/Globals.h"
|
||||||
|
#include "ps/Hotkey.h"
|
||||||
#include "ps/Player.h"
|
#include "ps/Player.h"
|
||||||
#include "ps/VFSUtil.h"
|
#include "ps/VFSUtil.h"
|
||||||
#include "ps/World.h"
|
#include "ps/World.h"
|
||||||
#include "renderer/Renderer.h"
|
#include "renderer/Renderer.h"
|
||||||
#include "scripting/GameEvents.h"
|
#include "scripting/GameEvents.h"
|
||||||
#include "simulation/EntityTemplateCollection.h"
|
|
||||||
#include "simulation/BoundingObjects.h"
|
#include "simulation/BoundingObjects.h"
|
||||||
#include "simulation/Collision.h"
|
#include "simulation/Collision.h"
|
||||||
#include "simulation/Entity.h"
|
#include "simulation/Entity.h"
|
||||||
#include "simulation/EntityFormation.h"
|
#include "simulation/EntityFormation.h"
|
||||||
#include "simulation/EntityManager.h"
|
#include "simulation/EntityManager.h"
|
||||||
|
#include "simulation/EntityTemplate.h"
|
||||||
|
#include "simulation/EntityTemplateCollection.h"
|
||||||
|
#include "simulation/EventHandlers.h"
|
||||||
#include "simulation/FormationManager.h"
|
#include "simulation/FormationManager.h"
|
||||||
#include "simulation/TerritoryManager.h"
|
|
||||||
#include "simulation/Simulation.h"
|
#include "simulation/Simulation.h"
|
||||||
|
#include "simulation/TerritoryManager.h"
|
||||||
|
|
||||||
#include "ps/CLogger.h"
|
#include "ps/CLogger.h"
|
||||||
#define LOG_CATEGORY "world"
|
#define LOG_CATEGORY "world"
|
||||||
@ -1294,7 +1296,7 @@ InReaction interactInputHandler( const SDL_Event_* ev )
|
|||||||
{
|
{
|
||||||
int deltax = ev->ev.motion.x - button_down_x;
|
int deltax = ev->ev.motion.x - button_down_x;
|
||||||
int deltay = ev->ev.motion.y - button_down_y;
|
int deltay = ev->ev.motion.y - button_down_y;
|
||||||
if( ABS( deltax ) > 2 || ABS( deltay ) > 2 )
|
if( abs( deltax ) > 2 || abs( deltay ) > 2 )
|
||||||
g_Mouseover.startBandbox( button_down_x, button_down_y );
|
g_Mouseover.startBandbox( button_down_x, button_down_y );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1384,9 +1386,9 @@ bool CBuildingPlacer::activate(CStrW& templateName)
|
|||||||
|
|
||||||
void CBuildingPlacer::mousePressed()
|
void CBuildingPlacer::mousePressed()
|
||||||
{
|
{
|
||||||
CCamera &g_Camera=*g_Game->GetView()->GetCamera();
|
CCamera &camera=*g_Game->GetView()->GetCamera();
|
||||||
if( m_template->m_socket == L"" )
|
if( m_template->m_socket == L"" )
|
||||||
clickPos = g_Camera.GetWorldCoordinates();
|
clickPos = camera.GetWorldCoordinates();
|
||||||
m_clicked = true;
|
m_clicked = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1430,8 +1432,8 @@ void CBuildingPlacer::update( float timeStep )
|
|||||||
{
|
{
|
||||||
// Rotate object
|
// Rotate object
|
||||||
m_timeSinceClick += timeStep;
|
m_timeSinceClick += timeStep;
|
||||||
CCamera &g_Camera=*g_Game->GetView()->GetCamera();
|
CCamera &camera = *g_Game->GetView()->GetCamera();
|
||||||
CVector3D mousePos = g_Camera.GetWorldCoordinates();
|
CVector3D mousePos = camera.GetWorldCoordinates();
|
||||||
CVector3D dif = mousePos - clickPos;
|
CVector3D dif = mousePos - clickPos;
|
||||||
float x = dif.X, z = dif.Z;
|
float x = dif.X, z = dif.Z;
|
||||||
if(x*x + z*z < 3*3) {
|
if(x*x + z*z < 3*3) {
|
||||||
@ -1454,8 +1456,8 @@ void CBuildingPlacer::update( float timeStep )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CCamera &g_Camera=*g_Game->GetView()->GetCamera();
|
CCamera &camera = *g_Game->GetView()->GetCamera();
|
||||||
pos = g_Camera.GetWorldCoordinates();
|
pos = camera.GetWorldCoordinates();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool onSocket = false;
|
bool onSocket = false;
|
||||||
|
@ -288,7 +288,6 @@ void initKeyNameMap()
|
|||||||
SKeycodeMapping* it = keycodeMapping;
|
SKeycodeMapping* it = keycodeMapping;
|
||||||
while( it->keycode != 0 )
|
while( it->keycode != 0 )
|
||||||
{
|
{
|
||||||
debug_printf("adding key %s\n", it->keyname);
|
|
||||||
keymap.insert( std::pair<CStr,int>( CStr( it->keyname ).LowerCase(), it->keycode ) );
|
keymap.insert( std::pair<CStr,int>( CStr( it->keyname ).LowerCase(), it->keycode ) );
|
||||||
if( it->altkeyname )
|
if( it->altkeyname )
|
||||||
keymap.insert( std::pair<CStr,int>( CStr( it->altkeyname ).LowerCase(), it->keycode ) );
|
keymap.insert( std::pair<CStr,int>( CStr( it->altkeyname ).LowerCase(), it->keycode ) );
|
||||||
|
@ -412,9 +412,12 @@ void CPatchRData::Update()
|
|||||||
|
|
||||||
CTerrain* terrain=m_Patch->m_Parent;
|
CTerrain* terrain=m_Patch->m_Parent;
|
||||||
int mapSize=terrain->GetVerticesPerSide();
|
int mapSize=terrain->GetVerticesPerSide();
|
||||||
CLOSManager* losMgr = g_Game->GetWorld()->GetLOSManager();
|
|
||||||
int vsize=PATCH_SIZE+1;
|
int vsize=PATCH_SIZE+1;
|
||||||
|
|
||||||
|
if (g_Game)
|
||||||
|
{
|
||||||
|
CLOSManager* losMgr = g_Game->GetWorld()->GetLOSManager();
|
||||||
|
|
||||||
// this is very similar to BuildVertices(), but just for color
|
// this is very similar to BuildVertices(), but just for color
|
||||||
for (int j=0;j<vsize;j++) {
|
for (int j=0;j<vsize;j++) {
|
||||||
for (int i=0;i<vsize;i++) {
|
for (int i=0;i<vsize;i++) {
|
||||||
@ -444,6 +447,19 @@ void CPatchRData::Update()
|
|||||||
m_Vertices[v].m_LOSColor = losMod;
|
m_Vertices[v].m_LOSColor = losMod;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int j = 0; j < vsize; ++j)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < vsize; ++i)
|
||||||
|
{
|
||||||
|
int v = (j*vsize)+i;
|
||||||
|
m_Vertices[v].m_LOSColor = SColor4ub(255, 255, 255, 255);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// upload base vertices into their vertex buffer
|
// upload base vertices into their vertex buffer
|
||||||
m_VBBase->m_Owner->UpdateChunkVertices(m_VBBase,m_Vertices);
|
m_VBBase->m_Owner->UpdateChunkVertices(m_VBBase,m_Vertices);
|
||||||
|
@ -705,9 +705,6 @@ void CRenderer::SetFastPlayerColor(bool fast)
|
|||||||
// BeginFrame: signal frame start
|
// BeginFrame: signal frame start
|
||||||
void CRenderer::BeginFrame()
|
void CRenderer::BeginFrame()
|
||||||
{
|
{
|
||||||
if(!g_Game || !g_Game->IsGameStarted())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// bump frame counter
|
// bump frame counter
|
||||||
m_FrameCounter++;
|
m_FrameCounter++;
|
||||||
|
|
||||||
@ -1158,9 +1155,6 @@ void CRenderer::RenderRefractions()
|
|||||||
// FlushFrame: force rendering of any batched objects
|
// FlushFrame: force rendering of any batched objects
|
||||||
void CRenderer::FlushFrame()
|
void CRenderer::FlushFrame()
|
||||||
{
|
{
|
||||||
if(!g_Game || !g_Game->IsGameStarted())
|
|
||||||
return;
|
|
||||||
|
|
||||||
oglCheck();
|
oglCheck();
|
||||||
|
|
||||||
// Prepare model renderers
|
// Prepare model renderers
|
||||||
@ -1178,7 +1172,8 @@ void CRenderer::FlushFrame()
|
|||||||
m->terrainRenderer->PrepareForRendering();
|
m->terrainRenderer->PrepareForRendering();
|
||||||
PROFILE_END("prepare terrain");
|
PROFILE_END("prepare terrain");
|
||||||
|
|
||||||
if (m_Options.m_Shadows) {
|
if (m_Options.m_Shadows)
|
||||||
|
{
|
||||||
MICROLOG(L"render shadows");
|
MICROLOG(L"render shadows");
|
||||||
RenderShadowMap();
|
RenderShadowMap();
|
||||||
}
|
}
|
||||||
@ -1189,7 +1184,7 @@ void CRenderer::FlushFrame()
|
|||||||
|
|
||||||
oglCheck();
|
oglCheck();
|
||||||
|
|
||||||
if(m_WaterManager->m_RenderWater && m_Options.m_FancyWater)
|
if (m_WaterManager->m_RenderWater && m_Options.m_FancyWater)
|
||||||
{
|
{
|
||||||
// render reflected and refracted scenes, then re-clear the screen
|
// render reflected and refracted scenes, then re-clear the screen
|
||||||
RenderReflections();
|
RenderReflections();
|
||||||
@ -1227,7 +1222,7 @@ void CRenderer::FlushFrame()
|
|||||||
oglCheck();
|
oglCheck();
|
||||||
|
|
||||||
// render water
|
// render water
|
||||||
if (m_WaterManager->m_RenderWater)
|
if (m_WaterManager->m_RenderWater && g_Game)
|
||||||
{
|
{
|
||||||
MICROLOG(L"render water");
|
MICROLOG(L"render water");
|
||||||
m->terrainRenderer->RenderWater();
|
m->terrainRenderer->RenderWater();
|
||||||
@ -1247,7 +1242,6 @@ void CRenderer::FlushFrame()
|
|||||||
// on all the time, so it might not be worth worrying about.
|
// on all the time, so it might not be worth worrying about.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Clean up texture blend mode so particles and other things render OK
|
// Clean up texture blend mode so particles and other things render OK
|
||||||
// (really this should be cleaned up by whoever set it)
|
// (really this should be cleaned up by whoever set it)
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
@ -1284,9 +1278,6 @@ void CRenderer::FlushFrame()
|
|||||||
// EndFrame: signal frame end
|
// EndFrame: signal frame end
|
||||||
void CRenderer::EndFrame()
|
void CRenderer::EndFrame()
|
||||||
{
|
{
|
||||||
if(!g_Game || !g_Game->IsGameStarted())
|
|
||||||
return;
|
|
||||||
|
|
||||||
g_Renderer.SetTexture(0,0);
|
g_Renderer.SetTexture(0,0);
|
||||||
|
|
||||||
static bool once=false;
|
static bool once=false;
|
||||||
|
@ -205,7 +205,7 @@ void SkyManager::RenderSky()
|
|||||||
|
|
||||||
// Rotate so that the "left" face, which contains the brightest part of each
|
// Rotate so that the "left" face, which contains the brightest part of each
|
||||||
// skymap, is in the direction of the sun from our light environment
|
// skymap, is in the direction of the sun from our light environment
|
||||||
glRotatef( 90.0f + g_Renderer.GetLightEnv().GetRotation()*180.0f/M_PI, 0.0f, 1.0f, 0.0f );
|
glRotatef( 90.0f + RADTODEG(g_Renderer.GetLightEnv().GetRotation()), 0.0f, 1.0f, 0.0f );
|
||||||
|
|
||||||
// Distance to draw the faces at
|
// Distance to draw the faces at
|
||||||
const float D = 2000.0;
|
const float D = 2000.0;
|
||||||
|
@ -132,7 +132,7 @@ void TerrainRenderer::EndFrame()
|
|||||||
// Query if patches have been submitted this frame
|
// Query if patches have been submitted this frame
|
||||||
bool TerrainRenderer::HaveSubmissions()
|
bool TerrainRenderer::HaveSubmissions()
|
||||||
{
|
{
|
||||||
return m->visiblePatches.size() > 0;
|
return !m->visiblePatches.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -332,9 +332,9 @@ void TerrainRenderer::RenderTerrain(ShadowMap* shadow)
|
|||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
|
||||||
// restore OpenGL state
|
// restore OpenGL state
|
||||||
if ( shadow )
|
if (shadow)
|
||||||
{
|
{
|
||||||
if ( shadow->GetUseDepthTexture() )
|
if (shadow->GetUseDepthTexture())
|
||||||
g_Renderer.BindTexture(2,0);
|
g_Renderer.BindTexture(2,0);
|
||||||
}
|
}
|
||||||
g_Renderer.BindTexture(1,0);
|
g_Renderer.BindTexture(1,0);
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include "simulation/EntityFormation.h"
|
#include "simulation/EntityFormation.h"
|
||||||
#include "simulation/EntityHandles.h"
|
#include "simulation/EntityHandles.h"
|
||||||
#include "simulation/EntityManager.h"
|
#include "simulation/EntityManager.h"
|
||||||
|
#include "simulation/EntityTemplate.h"
|
||||||
#include "simulation/FormationManager.h"
|
#include "simulation/FormationManager.h"
|
||||||
#include "simulation/LOSManager.h"
|
#include "simulation/LOSManager.h"
|
||||||
#include "simulation/Scheduler.h"
|
#include "simulation/Scheduler.h"
|
||||||
|
@ -14,15 +14,15 @@ before, 30+ files had to be recompiled because they #included Entity.h
|
|||||||
which #includes ScriptableComplex.h.
|
which #includes ScriptableComplex.h.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef SCRIPTABLE_COMPLEX_INCLUDED
|
||||||
|
#define SCRIPTABLE_COMPLEX_INCLUDED
|
||||||
|
|
||||||
#include "scripting/ScriptingHost.h"
|
#include "scripting/ScriptingHost.h"
|
||||||
#include "simulation/ScriptObject.h"
|
#include "simulation/ScriptObject.h"
|
||||||
#include "JSConversions.h"
|
#include "JSConversions.h"
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#ifndef SCRIPTABLE_COMPLEX_INCLUDED
|
|
||||||
#define SCRIPTABLE_COMPLEX_INCLUDED
|
|
||||||
|
|
||||||
class IJSComplex;
|
class IJSComplex;
|
||||||
|
|
||||||
class IJSComplexProperty
|
class IJSComplexProperty
|
||||||
@ -285,5 +285,3 @@ extern void* jscomplexproperty_suballoc();
|
|||||||
extern void jscomplexproperty_suballoc_free(IJSComplexProperty* p);
|
extern void jscomplexproperty_suballoc_free(IJSComplexProperty* p);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,6 +52,7 @@ linker won't find the definitions of these functions. Right now this is only
|
|||||||
#ifndef SCRIPTABLE_COMPLEX_INL_INCLUDED
|
#ifndef SCRIPTABLE_COMPLEX_INL_INCLUDED
|
||||||
#define SCRIPTABLE_COMPLEX_INL_INCLUDED
|
#define SCRIPTABLE_COMPLEX_INL_INCLUDED
|
||||||
|
|
||||||
|
#include "ScriptableComplex.h"
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// CJSComplexPropertyAccessor
|
// CJSComplexPropertyAccessor
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "Collision.h"
|
#include "Collision.h"
|
||||||
#include "Entity.h"
|
#include "Entity.h"
|
||||||
#include "EntityManager.h"
|
#include "EntityManager.h"
|
||||||
|
#include "EntityTemplate.h"
|
||||||
|
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
|
||||||
|
@ -1,36 +1,36 @@
|
|||||||
// Last modified: May 15 2004, Mark Thompson (mark@wildfiregames.com)
|
|
||||||
|
|
||||||
#include "precompiled.h"
|
#include "precompiled.h"
|
||||||
|
|
||||||
#include "ps/Profile.h"
|
|
||||||
|
|
||||||
#include "Entity.h"
|
|
||||||
#include "EntityManager.h"
|
|
||||||
#include "EntityTemplateCollection.h"
|
|
||||||
#include "graphics/Unit.h"
|
|
||||||
#include "Aura.h"
|
|
||||||
#include "ProductionQueue.h"
|
|
||||||
#include "renderer/Renderer.h"
|
|
||||||
#include "graphics/Model.h"
|
|
||||||
#include "graphics/Terrain.h"
|
|
||||||
#include "ps/Interact.h"
|
|
||||||
#include "Collision.h"
|
|
||||||
#include "PathfindEngine.h"
|
|
||||||
#include "ps/Game.h"
|
|
||||||
#include "maths/scripting/JSInterface_Vector3D.h"
|
|
||||||
#include "maths/MathUtil.h"
|
|
||||||
#include "ps/CConsole.h"
|
|
||||||
#include "renderer/WaterManager.h"
|
|
||||||
#include "EntityFormation.h"
|
|
||||||
#include "FormationManager.h"
|
|
||||||
#include "TerritoryManager.h"
|
|
||||||
#include "Formation.h"
|
|
||||||
#include "TechnologyCollection.h"
|
|
||||||
#include "graphics/GameView.h"
|
#include "graphics/GameView.h"
|
||||||
|
#include "graphics/Model.h"
|
||||||
#include "graphics/Sprite.h"
|
#include "graphics/Sprite.h"
|
||||||
|
#include "graphics/Terrain.h"
|
||||||
|
#include "graphics/Unit.h"
|
||||||
#include "graphics/UnitManager.h"
|
#include "graphics/UnitManager.h"
|
||||||
|
#include "maths/MathUtil.h"
|
||||||
|
#include "maths/scripting/JSInterface_Vector3D.h"
|
||||||
|
#include "ps/CConsole.h"
|
||||||
|
#include "ps/Game.h"
|
||||||
|
#include "ps/Interact.h"
|
||||||
|
#include "ps/Profile.h"
|
||||||
|
#include "renderer/Renderer.h"
|
||||||
|
#include "renderer/WaterManager.h"
|
||||||
#include "scripting/ScriptableComplex.inl"
|
#include "scripting/ScriptableComplex.inl"
|
||||||
|
|
||||||
|
#include "Aura.h"
|
||||||
|
#include "Collision.h"
|
||||||
|
#include "Entity.h"
|
||||||
|
#include "EntityFormation.h"
|
||||||
|
#include "EntityManager.h"
|
||||||
|
#include "EntityTemplate.h"
|
||||||
|
#include "EntityTemplateCollection.h"
|
||||||
|
#include "EventHandlers.h"
|
||||||
|
#include "Formation.h"
|
||||||
|
#include "FormationManager.h"
|
||||||
|
#include "PathfindEngine.h"
|
||||||
|
#include "ProductionQueue.h"
|
||||||
|
#include "TechnologyCollection.h"
|
||||||
|
#include "TerritoryManager.h"
|
||||||
|
|
||||||
extern CConsole* g_Console;
|
extern CConsole* g_Console;
|
||||||
extern int g_xres, g_yres;
|
extern int g_xres, g_yres;
|
||||||
|
|
||||||
@ -467,7 +467,7 @@ void CEntity::update( size_t timestep )
|
|||||||
{
|
{
|
||||||
if( ( m_lastState != -1 ) || !m_actor->GetModel()->GetAnimation() )
|
if( ( m_lastState != -1 ) || !m_actor->GetModel()->GetAnimation() )
|
||||||
{
|
{
|
||||||
m_actor->SetEntitySelection( L"idle" );
|
m_actor->SetEntitySelection( "idle" );
|
||||||
m_actor->SetRandomAnimation( "idle" );
|
m_actor->SetRandomAnimation( "idle" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1167,14 +1167,14 @@ void CEntity::renderAuras()
|
|||||||
|
|
||||||
CVector2D CEntity::getScreenCoords( float height )
|
CVector2D CEntity::getScreenCoords( float height )
|
||||||
{
|
{
|
||||||
CCamera &g_Camera=*g_Game->GetView()->GetCamera();
|
CCamera &camera = *g_Game->GetView()->GetCamera();
|
||||||
|
|
||||||
float sx, sy;
|
float sx, sy;
|
||||||
CVector3D above;
|
CVector3D above;
|
||||||
above.X = m_position.X;
|
above.X = m_position.X;
|
||||||
above.Z = m_position.Z;
|
above.Z = m_position.Z;
|
||||||
above.Y = getAnchorLevel(m_position.X, m_position.Z) + height;
|
above.Y = getAnchorLevel(m_position.X, m_position.Z) + height;
|
||||||
g_Camera.GetScreenCoordinates(above, sx, sy);
|
camera.GetScreenCoordinates(above, sx, sy);
|
||||||
return CVector2D( sx, sy );
|
return CVector2D( sx, sy );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1399,14 +1399,14 @@ void CEntity::renderRank()
|
|||||||
if( g_Selection.m_unitUITextures.find( m_rankName ) == g_Selection.m_unitUITextures.end() )
|
if( g_Selection.m_unitUITextures.find( m_rankName ) == g_Selection.m_unitUITextures.end() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CCamera *g_Camera=g_Game->GetView()->GetCamera();
|
CCamera *camera = g_Game->GetView()->GetCamera();
|
||||||
|
|
||||||
float sx, sy;
|
float sx, sy;
|
||||||
CVector3D above;
|
CVector3D above;
|
||||||
above.X = m_position.X;
|
above.X = m_position.X;
|
||||||
above.Z = m_position.Z;
|
above.Z = m_position.Z;
|
||||||
above.Y = getAnchorLevel(m_position.X, m_position.Z) + m_base->m_rankHeight;
|
above.Y = getAnchorLevel(m_position.X, m_position.Z) + m_base->m_rankHeight;
|
||||||
g_Camera->GetScreenCoordinates(above, sx, sy);
|
camera->GetScreenCoordinates(above, sx, sy);
|
||||||
int size = m_base->m_rankWidth/2;
|
int size = m_base->m_rankWidth/2;
|
||||||
|
|
||||||
float x1 = sx + m_base->m_healthBarSize/2;
|
float x1 = sx + m_base->m_healthBarSize/2;
|
||||||
@ -1853,7 +1853,7 @@ bool CEntity::Kill( JSContext* UNUSED(cx), uintN UNUSED(argc), jsval* UNUSED(arg
|
|||||||
|
|
||||||
if( m_actor )
|
if( m_actor )
|
||||||
{
|
{
|
||||||
m_actor->SetEntitySelection( L"death" );
|
m_actor->SetEntitySelection( "death" );
|
||||||
m_actor->SetRandomAnimation( "death", true );
|
m_actor->SetRandomAnimation( "death", true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,13 +38,8 @@
|
|||||||
#include "scripting/DOMEvent.h"
|
#include "scripting/DOMEvent.h"
|
||||||
#include "scripting/ScriptCustomTypes.h"
|
#include "scripting/ScriptCustomTypes.h"
|
||||||
|
|
||||||
// JW: must be pulled in because CEntity no longer mirrors CEntityTemplate exactly.
|
|
||||||
// some fields have been moved out of CEntity and are accessed via m_base,
|
|
||||||
// so CEntityTemplate must be fully defined.
|
|
||||||
#include "EntityTemplate.h"
|
|
||||||
|
|
||||||
class CAura;
|
class CAura;
|
||||||
//class CEntityTemplate; // see comment above
|
class CEntityTemplate;
|
||||||
class CBoundingObject;
|
class CBoundingObject;
|
||||||
class CPlayer;
|
class CPlayer;
|
||||||
class CProductionQueue;
|
class CProductionQueue;
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include "EntityManager.h"
|
#include "EntityManager.h"
|
||||||
#include "EntityTemplateCollection.h"
|
#include "EntityTemplateCollection.h"
|
||||||
|
#include "EntityTemplate.h"
|
||||||
#include "ps/ConfigDB.h"
|
#include "ps/ConfigDB.h"
|
||||||
#include "ps/Profile.h"
|
#include "ps/Profile.h"
|
||||||
#include "graphics/Terrain.h"
|
#include "graphics/Terrain.h"
|
||||||
|
@ -24,10 +24,11 @@
|
|||||||
#include "EntityMessage.h"
|
#include "EntityMessage.h"
|
||||||
#include "ps/Game.h"
|
#include "ps/Game.h"
|
||||||
#include "ps/World.h"
|
#include "ps/World.h"
|
||||||
#include "ps/CStr.h"
|
|
||||||
#include "maths/Vector3D.h"
|
#include "maths/Vector3D.h"
|
||||||
|
|
||||||
class CEntityTemplate;
|
class CEntityTemplate;
|
||||||
|
class CPlayer;
|
||||||
|
class CStrW;
|
||||||
|
|
||||||
#define MAX_HANDLES 4096
|
#define MAX_HANDLES 4096
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include "Entity.h"
|
#include "Entity.h"
|
||||||
#include "EntityTemplate.h"
|
#include "EntityTemplate.h"
|
||||||
|
#include "EventHandlers.h"
|
||||||
#include "graphics/Model.h"
|
#include "graphics/Model.h"
|
||||||
#include "graphics/ObjectEntry.h"
|
#include "graphics/ObjectEntry.h"
|
||||||
#include "graphics/SkeletonAnim.h"
|
#include "graphics/SkeletonAnim.h"
|
||||||
@ -406,7 +407,7 @@ bool CEntity::processContactActionNoPathing( CEntityOrder* current, size_t times
|
|||||||
popOrder();
|
popOrder();
|
||||||
entf_clear(ENTF_IS_RUNNING);
|
entf_clear(ENTF_IS_RUNNING);
|
||||||
entf_clear(ENTF_SHOULD_RUN);
|
entf_clear(ENTF_SHOULD_RUN);
|
||||||
m_actor->SetEntitySelection( L"idle" );
|
m_actor->SetEntitySelection( "idle" );
|
||||||
m_actor->SetRandomAnimation( "idle" );
|
m_actor->SetRandomAnimation( "idle" );
|
||||||
return( false );
|
return( false );
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
#define ENTITY_SUPPORT_INCLUDED
|
#define ENTITY_SUPPORT_INCLUDED
|
||||||
|
|
||||||
#include "EntityHandles.h"
|
#include "EntityHandles.h"
|
||||||
#include "ScriptObject.h"
|
|
||||||
|
|
||||||
class CEntityManager;
|
class CEntityManager;
|
||||||
|
|
||||||
|
@ -21,13 +21,14 @@
|
|||||||
#include "graphics/ObjectEntry.h"
|
#include "graphics/ObjectEntry.h"
|
||||||
|
|
||||||
#include "scripting/ScriptableComplex.h"
|
#include "scripting/ScriptableComplex.h"
|
||||||
|
#include "scripting/DOMEvent.h"
|
||||||
#include "BoundingObjects.h"
|
#include "BoundingObjects.h"
|
||||||
#include "EventHandlers.h"
|
|
||||||
#include "EntitySupport.h"
|
#include "EntitySupport.h"
|
||||||
#include "ScriptObject.h"
|
#include "ScriptObject.h"
|
||||||
#include "ps/XML/Xeromyces.h"
|
|
||||||
|
|
||||||
class CPlayer;
|
class CPlayer;
|
||||||
|
class CXeromyces;
|
||||||
|
class XMBElement;
|
||||||
|
|
||||||
class CEntityTemplate : public CJSComplex<CEntityTemplate>, public IEventTarget
|
class CEntityTemplate : public CJSComplex<CEntityTemplate>, public IEventTarget
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "precompiled.h"
|
#include "precompiled.h"
|
||||||
|
|
||||||
#include "EntityTemplateCollection.h"
|
#include "EntityTemplateCollection.h"
|
||||||
|
#include "EntityTemplate.h"
|
||||||
#include "graphics/ObjectManager.h"
|
#include "graphics/ObjectManager.h"
|
||||||
#include "graphics/Model.h"
|
#include "graphics/Model.h"
|
||||||
#include "ps/CLogger.h"
|
#include "ps/CLogger.h"
|
||||||
|
@ -20,16 +20,18 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include "ps/CStr.h"
|
#include "ps/CStr.h"
|
||||||
#include "ps/Singleton.h"
|
#include "ps/Singleton.h"
|
||||||
#include "graphics/ObjectEntry.h"
|
|
||||||
#include "EntityTemplate.h"
|
|
||||||
#include "ps/Game.h"
|
#include "ps/Game.h"
|
||||||
|
|
||||||
#define g_EntityTemplateCollection CEntityTemplateCollection::GetSingleton()
|
#define g_EntityTemplateCollection CEntityTemplateCollection::GetSingleton()
|
||||||
|
|
||||||
class CPlayer;
|
class CPlayer;
|
||||||
|
class CEntityTemplate;
|
||||||
|
|
||||||
class CEntityTemplateCollection : public Singleton<CEntityTemplateCollection>
|
class CEntityTemplateCollection : public Singleton<CEntityTemplateCollection>
|
||||||
{
|
{
|
||||||
|
// TODO: PS_MAX_PLAYERS doesn't seem to be an upper limit -
|
||||||
|
// "This may be overridden by system.cfg ("max_players")"
|
||||||
|
// - so we shouldn't use it here
|
||||||
static const uint NULL_PLAYER = (PS_MAX_PLAYERS+1);
|
static const uint NULL_PLAYER = (PS_MAX_PLAYERS+1);
|
||||||
|
|
||||||
typedef STL_HASH_MAP<CStrW, CEntityTemplate*, CStrW_hash_compare> TemplateMap;
|
typedef STL_HASH_MAP<CStrW, CEntityTemplate*, CStrW_hash_compare> TemplateMap;
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "graphics/Terrain.h"
|
#include "graphics/Terrain.h"
|
||||||
#include "Entity.h"
|
#include "Entity.h"
|
||||||
#include "EntityManager.h"
|
#include "EntityManager.h"
|
||||||
|
#include "EntityTemplate.h"
|
||||||
#include "graphics/Unit.h"
|
#include "graphics/Unit.h"
|
||||||
#include "maths/Bound.h"
|
#include "maths/Bound.h"
|
||||||
#include "graphics/Model.h"
|
#include "graphics/Model.h"
|
||||||
@ -209,7 +210,16 @@ ELOSStatus CLOSManager::GetStatus(float fx, float fz, CPlayer* player)
|
|||||||
|
|
||||||
EUnitLOSStatus CLOSManager::GetUnitStatus(CUnit* unit, CPlayer* player)
|
EUnitLOSStatus CLOSManager::GetUnitStatus(CUnit* unit, CPlayer* player)
|
||||||
{
|
{
|
||||||
CVector3D centre = unit->GetModel()->GetTransform().GetTranslation();
|
CVector3D centre;
|
||||||
|
|
||||||
|
// For entities, we must use the simulation position so that we stay synchronised
|
||||||
|
// (because the output of this function will presumably affect AI)
|
||||||
|
CEntity* entity = unit->GetEntity();
|
||||||
|
if (entity)
|
||||||
|
centre = entity->m_position;
|
||||||
|
else
|
||||||
|
centre = unit->GetModel()->GetTransform().GetTranslation();
|
||||||
|
|
||||||
ELOSStatus status = GetStatus(centre.X, centre.Z, player);
|
ELOSStatus status = GetStatus(centre.X, centre.Z, player);
|
||||||
|
|
||||||
if(status & LOS_VISIBLE)
|
if(status & LOS_VISIBLE)
|
||||||
@ -217,7 +227,7 @@ EUnitLOSStatus CLOSManager::GetUnitStatus(CUnit* unit, CPlayer* player)
|
|||||||
|
|
||||||
if(status & LOS_EXPLORED)
|
if(status & LOS_EXPLORED)
|
||||||
{
|
{
|
||||||
if(unit->GetEntity() == 0 || unit->GetEntity()->m_base->m_visionPermanent)
|
if(!entity || entity->m_base->m_visionPermanent)
|
||||||
{
|
{
|
||||||
// both actors (which are usually for decoration) and units with the
|
// both actors (which are usually for decoration) and units with the
|
||||||
// permanent flag should be remembered
|
// permanent flag should be remembered
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include "EntityOrders.h"
|
#include "EntityOrders.h"
|
||||||
#include "Entity.h"
|
#include "Entity.h"
|
||||||
|
#include "EntityTemplate.h"
|
||||||
#include "PathfindEngine.h"
|
#include "PathfindEngine.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -15,12 +15,12 @@
|
|||||||
#include "lib/timer.h"
|
#include "lib/timer.h"
|
||||||
#include "lib/ogl.h"
|
#include "lib/ogl.h"
|
||||||
#include "EntityManager.h"
|
#include "EntityManager.h"
|
||||||
|
#include "EntityTemplate.h"
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
CTerritoryManager::CTerritoryManager()
|
CTerritoryManager::CTerritoryManager()
|
||||||
{
|
{
|
||||||
m_TerritoryMatrix = 0;
|
m_TerritoryMatrix = 0;
|
||||||
|
m_DelayedRecalculate = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
CTerritoryManager::~CTerritoryManager()
|
CTerritoryManager::~CTerritoryManager()
|
||||||
@ -129,6 +129,14 @@ void CTerritoryManager::Recalculate()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CTerritoryManager::DelayedRecalculate()
|
||||||
|
{
|
||||||
|
// This is useful particularly for Atlas, which wants to recalculate
|
||||||
|
// the boundaries as you move an object around but which doesn't want
|
||||||
|
// to waste time recalculating multiple times per frame
|
||||||
|
m_DelayedRecalculate = true;
|
||||||
|
}
|
||||||
|
|
||||||
CTerritory* CTerritoryManager::GetTerritory(int x, int z)
|
CTerritory* CTerritoryManager::GetTerritory(int x, int z)
|
||||||
{
|
{
|
||||||
debug_assert( (uint) x < m_TilesPerSide && (uint) z < m_TilesPerSide );
|
debug_assert( (uint) x < m_TilesPerSide && (uint) z < m_TilesPerSide );
|
||||||
@ -209,6 +217,12 @@ void CTerritoryManager::CalculateBoundary( std::vector<CEntity*>& centres, size_
|
|||||||
}
|
}
|
||||||
void CTerritoryManager::renderTerritories()
|
void CTerritoryManager::renderTerritories()
|
||||||
{
|
{
|
||||||
|
if (m_DelayedRecalculate)
|
||||||
|
{
|
||||||
|
Recalculate();
|
||||||
|
m_DelayedRecalculate = false;
|
||||||
|
}
|
||||||
|
|
||||||
const CTerrain* pTerrain = g_Game->GetWorld()->GetTerrain();
|
const CTerrain* pTerrain = g_Game->GetWorld()->GetTerrain();
|
||||||
CFrustum frustum = g_Game->GetView()->GetCamera()->GetFrustum();
|
CFrustum frustum = g_Game->GetView()->GetCamera()->GetFrustum();
|
||||||
std::vector<CTerritory*>::iterator terr=m_Territories.begin();
|
std::vector<CTerritory*>::iterator terr=m_Territories.begin();
|
||||||
@ -218,6 +232,9 @@ void CTerritoryManager::renderTerritories()
|
|||||||
|
|
||||||
for ( ; terr != m_Territories.end(); ++terr )
|
for ( ; terr != m_Territories.end(); ++terr )
|
||||||
{
|
{
|
||||||
|
if ((*terr)->boundary.empty())
|
||||||
|
continue;
|
||||||
|
|
||||||
std::vector<CVector2D>::iterator it=(*terr)->boundary.begin()+1;
|
std::vector<CVector2D>::iterator it=(*terr)->boundary.begin()+1;
|
||||||
//const SPlayerColour& col = (*terr)->owner->GetColour();
|
//const SPlayerColour& col = (*terr)->owner->GetColour();
|
||||||
//glColor3f(col.r, col.g, col.b);
|
//glColor3f(col.r, col.g, col.b);
|
||||||
|
@ -10,10 +10,6 @@
|
|||||||
#ifndef TERRITORY_MANAGER_INCLUDED
|
#ifndef TERRITORY_MANAGER_INCLUDED
|
||||||
#define TERRITORY_MANAGER_INCLUDED
|
#define TERRITORY_MANAGER_INCLUDED
|
||||||
|
|
||||||
#include "ps/Singleton.h"
|
|
||||||
#include "ps/Game.h"
|
|
||||||
#include "ps/World.h"
|
|
||||||
#include "ps/Player.h"
|
|
||||||
#include "ps/Vector2D.h"
|
#include "ps/Vector2D.h"
|
||||||
#include "EntityHandles.h"
|
#include "EntityHandles.h"
|
||||||
|
|
||||||
@ -39,6 +35,7 @@ class CTerritoryManager
|
|||||||
CTerritory*** m_TerritoryMatrix; // m_TerritoryMatrix[x][z] points to the territory for tile (x, z)
|
CTerritory*** m_TerritoryMatrix; // m_TerritoryMatrix[x][z] points to the territory for tile (x, z)
|
||||||
|
|
||||||
uint m_TilesPerSide;
|
uint m_TilesPerSide;
|
||||||
|
bool m_DelayedRecalculate;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CTerritoryManager();
|
CTerritoryManager();
|
||||||
@ -46,6 +43,7 @@ public:
|
|||||||
|
|
||||||
void Initialize(); // initialize, called after the game is fully loaded
|
void Initialize(); // initialize, called after the game is fully loaded
|
||||||
void Recalculate(); // recalculate the territory boundaries
|
void Recalculate(); // recalculate the territory boundaries
|
||||||
|
void DelayedRecalculate(); // recalculate the territory boundaries when next rendered
|
||||||
void renderTerritories();
|
void renderTerritories();
|
||||||
CTerritory* GetTerritory(int x, int z); // get the territory to which the given tile belongs
|
CTerritory* GetTerritory(int x, int z); // get the territory to which the given tile belongs
|
||||||
CTerritory* GetTerritory(float x, float z); // get the territory to which the given world-space point belongs
|
CTerritory* GetTerritory(float x, float z); // get the territory to which the given world-space point belongs
|
||||||
|
299
source/tools/atlas/AtlasUI/ActorViewer/ActorViewer.cpp
Normal file
299
source/tools/atlas/AtlasUI/ActorViewer/ActorViewer.cpp
Normal file
@ -0,0 +1,299 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "ActorViewer.h"
|
||||||
|
|
||||||
|
#include "wx/treectrl.h"
|
||||||
|
|
||||||
|
#include "General/Datafile.h"
|
||||||
|
#include "ScenarioEditor/Tools/Common/Tools.h"
|
||||||
|
#include "ScenarioEditor/ScenarioEditor.h"
|
||||||
|
#include "ScenarioEditor/Sections/Environment/LightControl.h"
|
||||||
|
#include "GameInterface/Messages.h"
|
||||||
|
#include "CustomControls/Canvas/Canvas.h"
|
||||||
|
#include "CustomControls/SnapSplitterWindow/SnapSplitterWindow.h"
|
||||||
|
|
||||||
|
using namespace AtlasMessage;
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class ActorCanvas : public Canvas
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ActorCanvas(wxWindow* parent, int* attribList)
|
||||||
|
: Canvas(parent, attribList, wxBORDER_SUNKEN),
|
||||||
|
m_Distance(20.f), m_Angle(0.f), m_LastIsValid(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void PostLookAt()
|
||||||
|
{
|
||||||
|
POST_MESSAGE(LookAt, (eRenderView::ACTOR,
|
||||||
|
Position(m_Distance*sin(m_Angle), m_Distance/2.f, m_Distance*cos(m_Angle)),
|
||||||
|
Position(0, 0, 0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void HandleMouseEvent(wxMouseEvent& evt)
|
||||||
|
{
|
||||||
|
bool camera_changed = false;
|
||||||
|
|
||||||
|
if (evt.GetWheelRotation())
|
||||||
|
{
|
||||||
|
float speed = -1.f * ScenarioEditor::GetSpeedModifier();
|
||||||
|
|
||||||
|
m_Distance += evt.GetWheelRotation() * speed / evt.GetWheelDelta();
|
||||||
|
|
||||||
|
camera_changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (evt.ButtonDown(wxMOUSE_BTN_LEFT))
|
||||||
|
{
|
||||||
|
m_LastX = evt.GetX();
|
||||||
|
m_LastY = evt.GetY();
|
||||||
|
m_LastIsValid = true;
|
||||||
|
}
|
||||||
|
else if (evt.Dragging() && evt.ButtonIsDown(wxMOUSE_BTN_LEFT) && m_LastIsValid)
|
||||||
|
{
|
||||||
|
int dx = evt.GetX() - m_LastX;
|
||||||
|
int dy = evt.GetY() - m_LastY;
|
||||||
|
m_LastX = evt.GetX();
|
||||||
|
m_LastY = evt.GetY();
|
||||||
|
|
||||||
|
m_Angle += dx * M_PI/256.f * ScenarioEditor::GetSpeedModifier();
|
||||||
|
m_Distance += dy / 8.f * ScenarioEditor::GetSpeedModifier();
|
||||||
|
camera_changed = true;
|
||||||
|
}
|
||||||
|
else if (evt.ButtonUp(wxMOUSE_BTN_ANY))
|
||||||
|
{
|
||||||
|
// In some situations (e.g. double-clicking the title bar to
|
||||||
|
// maximise the window) we get a dragging event without the matching
|
||||||
|
// buttondown; so disallow dragging when there was a buttonup since
|
||||||
|
// the last buttondown.
|
||||||
|
// (TODO: does this affect the scenario editor too?)
|
||||||
|
m_LastIsValid = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Distance = std::max(m_Distance, 1/64.f); // don't let people fly through the origin
|
||||||
|
|
||||||
|
if (camera_changed)
|
||||||
|
PostLookAt();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
float m_Distance;
|
||||||
|
float m_Angle;
|
||||||
|
int m_LastX, m_LastY;
|
||||||
|
bool m_LastIsValid;
|
||||||
|
};
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class StringTreeItemData : public wxTreeItemData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StringTreeItemData(const wxString& string) : m_String(string) {}
|
||||||
|
wxString m_String;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
ID_Actors,
|
||||||
|
ID_Animations,
|
||||||
|
ID_Play,
|
||||||
|
ID_Pause,
|
||||||
|
ID_Slow,
|
||||||
|
};
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(ActorViewer, wxFrame)
|
||||||
|
EVT_CLOSE(ActorViewer::OnClose)
|
||||||
|
EVT_TREE_SEL_CHANGED(ID_Actors, ActorViewer::OnTreeSelection)
|
||||||
|
EVT_COMBOBOX(ID_Animations, ActorViewer::OnAnimationSelection)
|
||||||
|
EVT_TEXT_ENTER(ID_Animations, ActorViewer::OnAnimationSelection)
|
||||||
|
EVT_BUTTON(ID_Play, ActorViewer::OnSpeedButton)
|
||||||
|
EVT_BUTTON(ID_Pause, ActorViewer::OnSpeedButton)
|
||||||
|
EVT_BUTTON(ID_Slow, ActorViewer::OnSpeedButton)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
static void SendToGame(const AtlasMessage::sEnvironmentSettings& settings)
|
||||||
|
{
|
||||||
|
POST_COMMAND(SetEnvironmentSettings, (settings));
|
||||||
|
}
|
||||||
|
|
||||||
|
ActorViewer::ActorViewer(wxWindow* parent)
|
||||||
|
: wxFrame(parent, wxID_ANY, _("Actor Viewer"), wxDefaultPosition, wxSize(800, 600)),
|
||||||
|
m_CurrentSpeed(0.f)
|
||||||
|
{
|
||||||
|
SetIcon(wxIcon(_T("ICON_ActorEditor")));
|
||||||
|
|
||||||
|
SnapSplitterWindow* splitter = new SnapSplitterWindow(this, 0);
|
||||||
|
splitter->SetDefaultSashPosition(250);
|
||||||
|
|
||||||
|
wxPanel* sidePanel = new wxPanel(splitter);
|
||||||
|
|
||||||
|
// TODO: don't have this duplicated from ScenarioEditor.cpp
|
||||||
|
int glAttribList[] = {
|
||||||
|
WX_GL_RGBA,
|
||||||
|
WX_GL_DOUBLEBUFFER,
|
||||||
|
WX_GL_DEPTH_SIZE, 24,
|
||||||
|
WX_GL_BUFFER_SIZE, 24,
|
||||||
|
WX_GL_MIN_ALPHA, 8,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
ActorCanvas* canvas = new ActorCanvas(splitter, glAttribList);
|
||||||
|
|
||||||
|
splitter->SplitVertically(sidePanel, canvas);
|
||||||
|
|
||||||
|
wglMakeCurrent(NULL, NULL);
|
||||||
|
POST_MESSAGE(SetContext, (canvas->GetContext()));
|
||||||
|
|
||||||
|
POST_MESSAGE(Init, ());
|
||||||
|
|
||||||
|
canvas->InitSize();
|
||||||
|
canvas->PostLookAt();
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Construct a tree containing all the available actors
|
||||||
|
|
||||||
|
qGetObjectsList qry;
|
||||||
|
qry.Post();
|
||||||
|
std::vector<sObjectsListItem> objects = *qry.objects;
|
||||||
|
|
||||||
|
m_TreeCtrl = new wxTreeCtrl(sidePanel, ID_Actors);
|
||||||
|
wxTreeItemId root = m_TreeCtrl->AddRoot(_("Actors"));
|
||||||
|
|
||||||
|
std::map<std::wstring, wxTreeItemId> treeEntries;
|
||||||
|
|
||||||
|
wxRegEx stripDirs (_T("^([^/]+)/"), wxRE_ADVANCED); // the non-empty string up to the first slash
|
||||||
|
|
||||||
|
for (std::vector<sObjectsListItem>::iterator it = objects.begin(); it != objects.end(); ++it)
|
||||||
|
{
|
||||||
|
if (it->type != 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
wxString name = it->name.c_str();
|
||||||
|
// Loop through the directory components of the name, stripping them
|
||||||
|
// off and search down the tree hierarchy
|
||||||
|
wxString path = _T("");
|
||||||
|
wxTreeItemId treeItem = root;
|
||||||
|
while (stripDirs.Matches(name))
|
||||||
|
{
|
||||||
|
wxString dir = stripDirs.GetMatch(name, 1);
|
||||||
|
path += dir + _T("/");
|
||||||
|
|
||||||
|
// If we've got 'path' in the tree already, use it
|
||||||
|
std::map<std::wstring, wxTreeItemId>::iterator entry = treeEntries.find(path.c_str());
|
||||||
|
if (entry != treeEntries.end())
|
||||||
|
{
|
||||||
|
treeItem = entry->second;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Add this new path into the tree
|
||||||
|
treeItem = m_TreeCtrl->AppendItem(treeItem, dir);
|
||||||
|
treeEntries.insert(std::make_pair(path, treeItem));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the leading directory name from the full filename
|
||||||
|
stripDirs.Replace(&name, _T(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_TreeCtrl->AppendItem(treeItem, name, -1, -1, new StringTreeItemData(it->name.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_TreeCtrl->Expand(root);
|
||||||
|
|
||||||
|
|
||||||
|
wxArrayString animations;
|
||||||
|
|
||||||
|
AtObj animationsList (Datafile::ReadList("animations"));
|
||||||
|
for (AtIter it = animationsList["item"]; it.defined(); ++it)
|
||||||
|
animations.Add(it);
|
||||||
|
|
||||||
|
m_AnimationBox = new wxComboBox(sidePanel, ID_Animations, _T("Idle"), wxDefaultPosition, wxDefaultSize, animations);
|
||||||
|
|
||||||
|
m_EnvironmentSettings.sunelevation = 45 * M_PI/180;
|
||||||
|
m_EnvironmentSettings.sunrotation = 315 * M_PI/180;
|
||||||
|
m_EnvironmentSettings.suncolour = Colour(255, 255, 255);
|
||||||
|
m_EnvironmentSettings.terraincolour = Colour(164, 164, 164);
|
||||||
|
m_EnvironmentSettings.unitcolour = Colour(164, 164, 164);
|
||||||
|
LightControl* lightControl = new LightControl(sidePanel, wxSize(100, 100), m_EnvironmentSettings);
|
||||||
|
m_Conn = m_EnvironmentSettings.RegisterObserver(0, &SendToGame);
|
||||||
|
SendToGame(m_EnvironmentSettings);
|
||||||
|
|
||||||
|
wxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
wxSizer* bottomSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
wxSizer* bottomRightSizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
wxSizer* playButtonSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
|
||||||
|
mainSizer->Add(m_TreeCtrl, wxSizerFlags().Expand().Proportion(1));
|
||||||
|
mainSizer->Add(bottomSizer, wxSizerFlags().Expand());
|
||||||
|
|
||||||
|
bottomSizer->Add(lightControl, wxSizerFlags().Border(wxRIGHT, 5));
|
||||||
|
bottomSizer->Add(bottomRightSizer, wxSizerFlags().Proportion(1));
|
||||||
|
|
||||||
|
playButtonSizer->Add(new wxButton(sidePanel, ID_Play, _("Play")), wxSizerFlags().Proportion(1));
|
||||||
|
playButtonSizer->Add(new wxButton(sidePanel, ID_Pause, _("Pause")), wxSizerFlags().Proportion(1));
|
||||||
|
playButtonSizer->Add(new wxButton(sidePanel, ID_Slow, _("Slow")), wxSizerFlags().Proportion(1));
|
||||||
|
|
||||||
|
bottomRightSizer->Add(m_AnimationBox, wxSizerFlags().Expand());
|
||||||
|
bottomRightSizer->Add(playButtonSizer, wxSizerFlags().Expand());
|
||||||
|
sidePanel->SetSizer(mainSizer);
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Start by displaying the default non-existent actor
|
||||||
|
m_CurrentActor = _T("structures/fndn_1x1.xml");
|
||||||
|
SetActorView();
|
||||||
|
|
||||||
|
POST_MESSAGE(RenderEnable, (eRenderView::ACTOR));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActorViewer::OnClose(wxCloseEvent& WXUNUSED(event))
|
||||||
|
{
|
||||||
|
POST_MESSAGE(Shutdown, ());
|
||||||
|
|
||||||
|
AtlasMessage::qExit().Post();
|
||||||
|
// blocks until engine has noticed the message, so we won't be
|
||||||
|
// destroying the GLCanvas while it's still rendering
|
||||||
|
|
||||||
|
Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActorViewer::SetActorView()
|
||||||
|
{
|
||||||
|
POST_MESSAGE(SetActorViewer, (m_CurrentActor.c_str(), m_AnimationBox->GetValue().c_str(), m_CurrentSpeed));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActorViewer::OnTreeSelection(wxTreeEvent& event)
|
||||||
|
{
|
||||||
|
wxTreeItemData* data = m_TreeCtrl->GetItemData(event.GetItem());
|
||||||
|
if (! data)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_CurrentActor = static_cast<StringTreeItemData*>(data)->m_String;
|
||||||
|
SetActorView();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActorViewer::OnAnimationSelection(wxCommandEvent& WXUNUSED(event))
|
||||||
|
{
|
||||||
|
SetActorView();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActorViewer::OnSpeedButton(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
if (event.GetId() == ID_Play)
|
||||||
|
m_CurrentSpeed = 1.f;
|
||||||
|
else if (event.GetId() == ID_Pause)
|
||||||
|
m_CurrentSpeed = 0.f;
|
||||||
|
else if (event.GetId() == ID_Slow)
|
||||||
|
m_CurrentSpeed = 0.1f;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxLogDebug(_T("Invalid OnSpeedButton (%d)"), event.GetId());
|
||||||
|
m_CurrentSpeed = 1.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetActorView();
|
||||||
|
}
|
29
source/tools/atlas/AtlasUI/ActorViewer/ActorViewer.h
Normal file
29
source/tools/atlas/AtlasUI/ActorViewer/ActorViewer.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#include "Windows/AtlasWindow.h"
|
||||||
|
|
||||||
|
#include "GameInterface/Messages.h"
|
||||||
|
#include "General/Observable.h"
|
||||||
|
|
||||||
|
class wxTreeCtrl;
|
||||||
|
|
||||||
|
class ActorViewer : public wxFrame
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ActorViewer(wxWindow* parent);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void SetActorView();
|
||||||
|
void OnClose(wxCloseEvent& event);
|
||||||
|
void OnTreeSelection(wxTreeEvent& event);
|
||||||
|
void OnAnimationSelection(wxCommandEvent& event);
|
||||||
|
void OnSpeedButton(wxCommandEvent& event);
|
||||||
|
|
||||||
|
wxTreeCtrl* m_TreeCtrl;
|
||||||
|
wxComboBox* m_AnimationBox;
|
||||||
|
wxString m_CurrentActor;
|
||||||
|
float m_CurrentSpeed;
|
||||||
|
|
||||||
|
Observable<AtlasMessage::sEnvironmentSettings> m_EnvironmentSettings;
|
||||||
|
ObservableScopedConnection m_Conn;
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE();
|
||||||
|
};
|
88
source/tools/atlas/AtlasUI/CustomControls/Canvas/Canvas.cpp
Normal file
88
source/tools/atlas/AtlasUI/CustomControls/Canvas/Canvas.cpp
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "Canvas.h"
|
||||||
|
|
||||||
|
#include "GameInterface/Messages.h"
|
||||||
|
#include "ScenarioEditor/tools/Common/Tools.h"
|
||||||
|
|
||||||
|
Canvas::Canvas(wxWindow* parent, int* attribList, long style)
|
||||||
|
: wxGLCanvas(parent, -1, wxDefaultPosition, wxDefaultSize, style, _T("GLCanvas"), attribList),
|
||||||
|
m_SuppressResize(true),
|
||||||
|
m_LastMousePos(-1, -1), m_MouseCaptured(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Canvas::OnResize(wxSizeEvent&)
|
||||||
|
{
|
||||||
|
// Be careful not to send 'resize' messages to the game before we've
|
||||||
|
// told it that this canvas exists
|
||||||
|
if (! m_SuppressResize)
|
||||||
|
POST_MESSAGE(ResizeScreen, (GetClientSize().GetWidth(), GetClientSize().GetHeight()));
|
||||||
|
// TODO: fix flashing
|
||||||
|
}
|
||||||
|
|
||||||
|
void Canvas::InitSize()
|
||||||
|
{
|
||||||
|
m_SuppressResize = false;
|
||||||
|
SetSize(320, 240);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Canvas::OnMouseCapture(wxMouseCaptureChangedEvent& WXUNUSED(evt))
|
||||||
|
{
|
||||||
|
if (m_MouseCaptured)
|
||||||
|
{
|
||||||
|
// unexpected loss of capture (i.e. not through ReleaseMouse)
|
||||||
|
m_MouseCaptured = false;
|
||||||
|
|
||||||
|
// (Note that this can be made to happen easily, by alt-tabbing away,
|
||||||
|
// and mouse events will be missed; so it is never guaranteed that e.g.
|
||||||
|
// two LeftDown events will be separated by a LeftUp.)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Canvas::OnMouse(wxMouseEvent& evt)
|
||||||
|
{
|
||||||
|
// Capture on button-down, so we can respond even when the mouse
|
||||||
|
// moves off the window
|
||||||
|
if (!m_MouseCaptured && evt.ButtonDown())
|
||||||
|
{
|
||||||
|
m_MouseCaptured = true;
|
||||||
|
CaptureMouse();
|
||||||
|
}
|
||||||
|
// Un-capture when all buttons are up
|
||||||
|
else if (m_MouseCaptured && evt.ButtonUp() &&
|
||||||
|
! (evt.ButtonIsDown(wxMOUSE_BTN_LEFT) || evt.ButtonIsDown(wxMOUSE_BTN_MIDDLE) || evt.ButtonIsDown(wxMOUSE_BTN_RIGHT))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
m_MouseCaptured = false;
|
||||||
|
ReleaseMouse();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set focus when clicking
|
||||||
|
if (evt.ButtonDown())
|
||||||
|
SetFocus();
|
||||||
|
|
||||||
|
// Reject motion events if the mouse has not actually moved
|
||||||
|
if (evt.Moving() || evt.Dragging())
|
||||||
|
{
|
||||||
|
if (m_LastMousePos == evt.GetPosition())
|
||||||
|
return;
|
||||||
|
m_LastMousePos = evt.GetPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
HandleMouseEvent(evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(Canvas, wxGLCanvas)
|
||||||
|
EVT_SIZE(Canvas::OnResize)
|
||||||
|
EVT_LEFT_DOWN (Canvas::OnMouse)
|
||||||
|
EVT_LEFT_UP (Canvas::OnMouse)
|
||||||
|
EVT_RIGHT_DOWN (Canvas::OnMouse)
|
||||||
|
EVT_RIGHT_UP (Canvas::OnMouse)
|
||||||
|
EVT_MIDDLE_DOWN(Canvas::OnMouse)
|
||||||
|
EVT_MIDDLE_UP (Canvas::OnMouse)
|
||||||
|
EVT_MOUSEWHEEL (Canvas::OnMouse)
|
||||||
|
EVT_MOTION (Canvas::OnMouse)
|
||||||
|
EVT_MOUSE_CAPTURE_CHANGED(Canvas::OnMouseCapture)
|
||||||
|
END_EVENT_TABLE()
|
24
source/tools/atlas/AtlasUI/CustomControls/Canvas/Canvas.h
Normal file
24
source/tools/atlas/AtlasUI/CustomControls/Canvas/Canvas.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#include "wx/glcanvas.h"
|
||||||
|
|
||||||
|
class Canvas : public wxGLCanvas
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Canvas(wxWindow* parent, int* attribList, long style);
|
||||||
|
|
||||||
|
void InitSize();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void HandleMouseEvent(wxMouseEvent& evt) = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void OnResize(wxSizeEvent&);
|
||||||
|
void OnMouseCapture(wxMouseCaptureChangedEvent& evt);
|
||||||
|
void OnMouse(wxMouseEvent& evt);
|
||||||
|
|
||||||
|
bool m_SuppressResize;
|
||||||
|
|
||||||
|
wxPoint m_LastMousePos;
|
||||||
|
bool m_MouseCaptured;
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE();
|
||||||
|
};
|
@ -1,5 +1,8 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
/* Disabled (and should be removed if it turns out to be unnecessary)
|
||||||
|
- see MessagePasserImpl.cpp for information
|
||||||
|
|
||||||
#include "AtlasEventLoop.h"
|
#include "AtlasEventLoop.h"
|
||||||
|
|
||||||
AtlasEventLoop::AtlasEventLoop()
|
AtlasEventLoop::AtlasEventLoop()
|
||||||
@ -36,3 +39,4 @@ bool AtlasEventLoop::Dispatch()
|
|||||||
|
|
||||||
return wxEventLoop::Dispatch();
|
return wxEventLoop::Dispatch();
|
||||||
}
|
}
|
||||||
|
*/
|
@ -1,6 +1,9 @@
|
|||||||
#ifndef ATLASEVENTLOOP_H__
|
#ifndef ATLASEVENTLOOP_H__
|
||||||
#define ATLASEVENTLOOP_H__
|
#define ATLASEVENTLOOP_H__
|
||||||
|
|
||||||
|
/* Disabled (and should be removed if it turns out to be unnecessary)
|
||||||
|
- see MessagePasserImpl.cpp for information
|
||||||
|
|
||||||
#include "wx/evtloop.h"
|
#include "wx/evtloop.h"
|
||||||
|
|
||||||
struct tagMSG;
|
struct tagMSG;
|
||||||
@ -21,4 +24,6 @@ public:
|
|||||||
virtual bool Dispatch();
|
virtual bool Dispatch();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
#endif // ATLASEVENTLOOP_H__
|
#endif // ATLASEVENTLOOP_H__
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
|
|
||||||
typedef boost::signals::connection ObservableConnection;
|
typedef boost::signals::connection ObservableConnection;
|
||||||
|
typedef boost::signals::scoped_connection ObservableScopedConnection;
|
||||||
|
|
||||||
template <typename T> class Observable : public T
|
template <typename T> class Observable : public T
|
||||||
{
|
{
|
||||||
|
@ -5,11 +5,13 @@
|
|||||||
#include "General/AtlasEventLoop.h"
|
#include "General/AtlasEventLoop.h"
|
||||||
|
|
||||||
#include "General/Datafile.h"
|
#include "General/Datafile.h"
|
||||||
|
|
||||||
#include "ActorEditor/ActorEditor.h"
|
#include "ActorEditor/ActorEditor.h"
|
||||||
#include "ColourTester/ColourTester.h"
|
#include "ActorViewer/ActorViewer.h"
|
||||||
#include "ScenarioEditor/ScenarioEditor.h"
|
|
||||||
#include "FileConverter/FileConverter.h"
|
|
||||||
#include "ArchiveViewer/ArchiveViewer.h"
|
#include "ArchiveViewer/ArchiveViewer.h"
|
||||||
|
#include "ColourTester/ColourTester.h"
|
||||||
|
#include "FileConverter/FileConverter.h"
|
||||||
|
#include "ScenarioEditor/ScenarioEditor.h"
|
||||||
|
|
||||||
#include "GameInterface/MessagePasser.h"
|
#include "GameInterface/MessagePasser.h"
|
||||||
|
|
||||||
@ -26,7 +28,7 @@ ATLASDLLIMPEXP void* ShareableMalloc(size_t n)
|
|||||||
}
|
}
|
||||||
ATLASDLLIMPEXP void ShareableFree(void* p)
|
ATLASDLLIMPEXP void ShareableFree(void* p)
|
||||||
{
|
{
|
||||||
return free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
// Define the function pointers that we'll use when calling those functions.
|
// Define the function pointers that we'll use when calling those functions.
|
||||||
// (The game loads the addresses of the above functions, then does the same.)
|
// (The game loads the addresses of the above functions, then does the same.)
|
||||||
@ -72,16 +74,30 @@ ATLASDLLIMPEXP void Atlas_SetMessagePasser(MessagePasser* passer)
|
|||||||
g_MessagePasser = passer;
|
g_MessagePasser = passer;
|
||||||
}
|
}
|
||||||
|
|
||||||
ATLASDLLIMPEXP void Atlas_StartWindow(wchar_t* type)
|
ATLASDLLIMPEXP void Atlas_StartWindow(const wchar_t* type)
|
||||||
{
|
{
|
||||||
g_InitialWindowType = type;
|
g_InitialWindowType = type;
|
||||||
wxEntry(g_Module);
|
wxEntry(g_Module);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ATLASDLLIMPEXP void Atlas_DisplayError(const wchar_t* text, unsigned int WXUNUSED(flags))
|
||||||
|
{
|
||||||
|
// This is called from the game thread.
|
||||||
|
// wxLog appears to be thread-safe, so that's okay.
|
||||||
|
wxLogError(L"%s", text);
|
||||||
|
|
||||||
class wxDLLApp : public wxApp
|
// TODO: wait for user response (if possible) before returning,
|
||||||
|
// and return their status (break/continue/debug/etc), but only in
|
||||||
|
// cases where we're certain it won't deadlock (i.e. the UI event loop
|
||||||
|
// is still running and won't block before showing the dialog to the user)
|
||||||
|
// and where it matters (i.e. errors, not warnings (unless they're going to
|
||||||
|
// turn into errors after continuing))
|
||||||
|
}
|
||||||
|
|
||||||
|
class AtlasDLLApp : public wxApp
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual bool OnInit()
|
virtual bool OnInit()
|
||||||
{
|
{
|
||||||
if (! wxIsDebuggerRunning())
|
if (! wxIsDebuggerRunning())
|
||||||
@ -99,10 +115,11 @@ public:
|
|||||||
wxFrame* frame;
|
wxFrame* frame;
|
||||||
#define MAYBE(t) if (g_InitialWindowType == _T(#t)) frame = new t(NULL); else
|
#define MAYBE(t) if (g_InitialWindowType == _T(#t)) frame = new t(NULL); else
|
||||||
MAYBE(ActorEditor)
|
MAYBE(ActorEditor)
|
||||||
MAYBE(ColourTester)
|
MAYBE(ActorViewer)
|
||||||
MAYBE(ScenarioEditor)
|
|
||||||
MAYBE(FileConverter)
|
|
||||||
MAYBE(ArchiveViewer)
|
MAYBE(ArchiveViewer)
|
||||||
|
MAYBE(ColourTester)
|
||||||
|
MAYBE(FileConverter)
|
||||||
|
MAYBE(ScenarioEditor)
|
||||||
#undef MAYBE
|
#undef MAYBE
|
||||||
// else
|
// else
|
||||||
{
|
{
|
||||||
@ -188,6 +205,8 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Disabled (and should be removed if it turns out to be unnecessary)
|
||||||
|
- see MessagePasserImpl.cpp for information
|
||||||
virtual int MainLoop()
|
virtual int MainLoop()
|
||||||
{
|
{
|
||||||
// Override the default MainLoop so that we can provide our own event loop
|
// Override the default MainLoop so that we can provide our own event loop
|
||||||
@ -201,6 +220,8 @@ public:
|
|||||||
m_mainLoop = old;
|
m_mainLoop = old;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
IMPLEMENT_APP_NO_MAIN(wxDLLApp)
|
IMPLEMENT_APP_NO_MAIN(AtlasDLLApp)
|
||||||
|
@ -3,9 +3,11 @@
|
|||||||
namespace AtlasMessage { class MessagePasser; }
|
namespace AtlasMessage { class MessagePasser; }
|
||||||
|
|
||||||
ATLASDLLIMPEXP void Atlas_SetMessagePasser(AtlasMessage::MessagePasser*);
|
ATLASDLLIMPEXP void Atlas_SetMessagePasser(AtlasMessage::MessagePasser*);
|
||||||
ATLASDLLIMPEXP void Atlas_StartWindow(wchar_t* type);
|
ATLASDLLIMPEXP void Atlas_StartWindow(const wchar_t* type);
|
||||||
|
|
||||||
ATLASDLLIMPEXP void Atlas_GLSetCurrent(void* context);
|
ATLASDLLIMPEXP void Atlas_GLSetCurrent(void* context);
|
||||||
ATLASDLLIMPEXP void Atlas_GLSwapBuffers(void* context);
|
ATLASDLLIMPEXP void Atlas_GLSwapBuffers(void* context);
|
||||||
|
|
||||||
ATLASDLLIMPEXP void Atlas_NotifyEndOfFrame();
|
ATLASDLLIMPEXP void Atlas_NotifyEndOfFrame();
|
||||||
|
|
||||||
|
ATLASDLLIMPEXP void Atlas_DisplayError(const wchar_t* text, unsigned int flags);
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
#include "ScenarioEditor.h"
|
#include "ScenarioEditor.h"
|
||||||
|
|
||||||
#include "wx/glcanvas.h"
|
|
||||||
#include "wx/evtloop.h"
|
#include "wx/evtloop.h"
|
||||||
#include "wx/tooltip.h"
|
#include "wx/tooltip.h"
|
||||||
#include "wx/image.h"
|
#include "wx/image.h"
|
||||||
@ -11,84 +10,74 @@
|
|||||||
#include "General/AtlasEventLoop.h"
|
#include "General/AtlasEventLoop.h"
|
||||||
#include "General/Datafile.h"
|
#include "General/Datafile.h"
|
||||||
|
|
||||||
#include "SnapSplitterWindow/SnapSplitterWindow.h"
|
|
||||||
#include "HighResTimer/HighResTimer.h"
|
#include "HighResTimer/HighResTimer.h"
|
||||||
#include "Buttons/ToolButton.h"
|
#include "Buttons/ToolButton.h"
|
||||||
|
#include "CustomControls/Canvas/Canvas.h"
|
||||||
|
|
||||||
#include "GameInterface/MessagePasser.h"
|
#include "GameInterface/MessagePasser.h"
|
||||||
#include "GameInterface/Messages.h"
|
#include "GameInterface/Messages.h"
|
||||||
|
|
||||||
#include "tools/Common/Tools.h"
|
#include "tools/Common/Tools.h"
|
||||||
|
|
||||||
// #define UI_ONLY
|
|
||||||
|
|
||||||
static HighResTimer g_Timer;
|
static HighResTimer g_Timer;
|
||||||
|
|
||||||
|
using namespace AtlasMessage;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// TODO: move into another file
|
// GL functions exported from DLL, and called by game (in a separate
|
||||||
class Canvas : public wxGLCanvas
|
// thread to the standard wx one)
|
||||||
|
ATLASDLLIMPEXP void Atlas_GLSetCurrent(void* context)
|
||||||
|
{
|
||||||
|
((wxGLContext*)context)->SetCurrent();
|
||||||
|
}
|
||||||
|
|
||||||
|
ATLASDLLIMPEXP void Atlas_GLSwapBuffers(void* context)
|
||||||
|
{
|
||||||
|
((wxGLContext*)context)->SwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class GameCanvas : public Canvas
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Canvas(wxWindow* parent, int* attribList)
|
GameCanvas(wxWindow* parent, int* attribList)
|
||||||
: wxGLCanvas(parent, -1, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS, _T("GLCanvas"), attribList),
|
: Canvas(parent, attribList, wxWANTS_CHARS),
|
||||||
m_SuppressResize(true),
|
m_MouseState(NONE), m_LastMouseState(NONE)
|
||||||
m_MouseState(NONE), m_LastMouseState(NONE), m_MouseCaptured(false),
|
|
||||||
m_LastMousePos(-1, -1)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnResize(wxSizeEvent&)
|
private:
|
||||||
{
|
|
||||||
#ifndef UI_ONLY
|
|
||||||
// Be careful not to send 'resize' messages to the game before we've
|
|
||||||
// told it that this canvas exists
|
|
||||||
if (! m_SuppressResize)
|
|
||||||
POST_MESSAGE(ResizeScreen, (GetClientSize().GetWidth(), GetClientSize().GetHeight()));
|
|
||||||
// TODO: fix flashing
|
|
||||||
#endif // UI_ONLY
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitSize()
|
|
||||||
{
|
|
||||||
m_SuppressResize = false;
|
|
||||||
SetSize(320, 240);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool KeyScroll(wxKeyEvent& evt, bool enable)
|
bool KeyScroll(wxKeyEvent& evt, bool enable)
|
||||||
{
|
{
|
||||||
#ifndef UI_ONLY
|
|
||||||
int dir;
|
int dir;
|
||||||
switch (evt.GetKeyCode())
|
switch (evt.GetKeyCode())
|
||||||
{
|
{
|
||||||
case WXK_LEFT: dir = AtlasMessage::eScrollConstantDir::LEFT; break;
|
case WXK_LEFT: dir = eScrollConstantDir::LEFT; break;
|
||||||
case WXK_RIGHT: dir = AtlasMessage::eScrollConstantDir::RIGHT; break;
|
case WXK_RIGHT: dir = eScrollConstantDir::RIGHT; break;
|
||||||
case WXK_UP: dir = AtlasMessage::eScrollConstantDir::FORWARDS; break;
|
case WXK_UP: dir = eScrollConstantDir::FORWARDS; break;
|
||||||
case WXK_DOWN: dir = AtlasMessage::eScrollConstantDir::BACKWARDS; break;
|
case WXK_DOWN: dir = eScrollConstantDir::BACKWARDS; break;
|
||||||
case WXK_SHIFT: case WXK_CONTROL: dir = -1; break;
|
case WXK_SHIFT: case WXK_CONTROL: dir = -1; break;
|
||||||
default: return false;
|
default: return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
float speed = 120.f;
|
float speed = 120.f * ScenarioEditor::GetSpeedModifier();
|
||||||
if (wxGetKeyState(WXK_SHIFT) && wxGetKeyState(WXK_CONTROL))
|
|
||||||
speed /= 64.f;
|
|
||||||
else if (wxGetKeyState(WXK_CONTROL))
|
|
||||||
speed /= 4.f;
|
|
||||||
else if (wxGetKeyState(WXK_SHIFT))
|
|
||||||
speed *= 4.f;
|
|
||||||
|
|
||||||
if (dir == -1) // changed modifier keys - update all currently-scrolling directions
|
if (dir == -1) // changed modifier keys - update all currently-scrolling directions
|
||||||
{
|
{
|
||||||
if (wxGetKeyState(WXK_LEFT)) POST_MESSAGE(ScrollConstant, (AtlasMessage::eScrollConstantDir::LEFT, speed));
|
if (wxGetKeyState(WXK_LEFT)) POST_MESSAGE(ScrollConstant, (eRenderView::GAME, eScrollConstantDir::LEFT, speed));
|
||||||
if (wxGetKeyState(WXK_RIGHT)) POST_MESSAGE(ScrollConstant, (AtlasMessage::eScrollConstantDir::RIGHT, speed));
|
if (wxGetKeyState(WXK_RIGHT)) POST_MESSAGE(ScrollConstant, (eRenderView::GAME, eScrollConstantDir::RIGHT, speed));
|
||||||
if (wxGetKeyState(WXK_UP)) POST_MESSAGE(ScrollConstant, (AtlasMessage::eScrollConstantDir::FORWARDS, speed));
|
if (wxGetKeyState(WXK_UP)) POST_MESSAGE(ScrollConstant, (eRenderView::GAME, eScrollConstantDir::FORWARDS, speed));
|
||||||
if (wxGetKeyState(WXK_DOWN)) POST_MESSAGE(ScrollConstant, (AtlasMessage::eScrollConstantDir::BACKWARDS, speed));
|
if (wxGetKeyState(WXK_DOWN)) POST_MESSAGE(ScrollConstant, (eRenderView::GAME, eScrollConstantDir::BACKWARDS, speed));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
POST_MESSAGE(ScrollConstant, (dir, enable ? speed : 0.0f));
|
POST_MESSAGE(ScrollConstant, (eRenderView::GAME, dir, enable ? speed : 0.0f));
|
||||||
}
|
}
|
||||||
#endif // UI_ONLY
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,47 +124,14 @@ public:
|
|||||||
float speed = 16.f;
|
float speed = 16.f;
|
||||||
if (wxGetKeyState(WXK_SHIFT))
|
if (wxGetKeyState(WXK_SHIFT))
|
||||||
speed *= 4.f;
|
speed *= 4.f;
|
||||||
POST_MESSAGE(SmoothZoom, (speed*dir));
|
POST_MESSAGE(SmoothZoom, (eRenderView::GAME, speed*dir));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
evt.Skip();
|
evt.Skip();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnMouseCapture(wxMouseCaptureChangedEvent& WXUNUSED(evt))
|
virtual void HandleMouseEvent(wxMouseEvent& evt)
|
||||||
{
|
{
|
||||||
if (m_MouseCaptured)
|
|
||||||
{
|
|
||||||
// unexpected loss of capture (i.e. not through ReleaseMouse)
|
|
||||||
m_MouseCaptured = false;
|
|
||||||
|
|
||||||
// (Note that this can be made to happen easily, by alt-tabbing away,
|
|
||||||
// and mouse events will be missed; so it is never guaranteed that e.g.
|
|
||||||
// two LeftDown events will be separated by a LeftUp.)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnMouse(wxMouseEvent& evt)
|
|
||||||
{
|
|
||||||
// Capture on button-down, so we can respond even when the mouse
|
|
||||||
// moves off the window
|
|
||||||
if (!m_MouseCaptured && evt.ButtonDown())
|
|
||||||
{
|
|
||||||
m_MouseCaptured = true;
|
|
||||||
CaptureMouse();
|
|
||||||
}
|
|
||||||
// Un-capture when all buttons are up
|
|
||||||
else if (m_MouseCaptured && evt.ButtonUp() &&
|
|
||||||
! (evt.ButtonIsDown(wxMOUSE_BTN_LEFT) || evt.ButtonIsDown(wxMOUSE_BTN_MIDDLE) || evt.ButtonIsDown(wxMOUSE_BTN_RIGHT))
|
|
||||||
)
|
|
||||||
{
|
|
||||||
m_MouseCaptured = false;
|
|
||||||
ReleaseMouse();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set focus when clicking
|
|
||||||
if (evt.ButtonDown())
|
|
||||||
SetFocus();
|
|
||||||
|
|
||||||
// TODO or at least to think about: When using other controls in the
|
// TODO or at least to think about: When using other controls in the
|
||||||
// editor, it's annoying that keyboard/scrollwheel no longer navigate
|
// editor, it's annoying that keyboard/scrollwheel no longer navigate
|
||||||
@ -188,16 +144,6 @@ public:
|
|||||||
if (evt.Moving())
|
if (evt.Moving())
|
||||||
SetFocus();
|
SetFocus();
|
||||||
|
|
||||||
// Reject motion events if the mouse has not actually moved
|
|
||||||
if (evt.Moving() || evt.Dragging())
|
|
||||||
{
|
|
||||||
if (m_LastMousePos == evt.GetPosition())
|
|
||||||
return;
|
|
||||||
m_LastMousePos = evt.GetPosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef UI_ONLY
|
|
||||||
|
|
||||||
if (GetCurrentTool().OnMouse(evt))
|
if (GetCurrentTool().OnMouse(evt))
|
||||||
{
|
{
|
||||||
// Mouse event has been handled by the tool, so don't try
|
// Mouse event has been handled by the tool, so don't try
|
||||||
@ -209,15 +155,8 @@ public:
|
|||||||
|
|
||||||
if (evt.GetWheelRotation())
|
if (evt.GetWheelRotation())
|
||||||
{
|
{
|
||||||
float speed = 16.f;
|
float speed = 16.f * ScenarioEditor::GetSpeedModifier();
|
||||||
if (wxGetKeyState(WXK_SHIFT) && wxGetKeyState(WXK_CONTROL))
|
POST_MESSAGE(SmoothZoom, (eRenderView::GAME, evt.GetWheelRotation() * speed / evt.GetWheelDelta()));
|
||||||
speed /= 64.f;
|
|
||||||
else if (wxGetKeyState(WXK_CONTROL))
|
|
||||||
speed /= 4.f;
|
|
||||||
else if (wxGetKeyState(WXK_SHIFT))
|
|
||||||
speed *= 4.f;
|
|
||||||
|
|
||||||
POST_MESSAGE(SmoothZoom, (evt.GetWheelRotation() * speed / evt.GetWheelDelta()));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -236,8 +175,8 @@ public:
|
|||||||
switch (m_MouseState)
|
switch (m_MouseState)
|
||||||
{
|
{
|
||||||
case NONE: break;
|
case NONE: break;
|
||||||
case SCROLL: POST_MESSAGE(Scroll, (AtlasMessage::eScrollType::FROM, evt.GetPosition())); break;
|
case SCROLL: POST_MESSAGE(Scroll, (eRenderView::GAME, eScrollType::FROM, evt.GetPosition())); break;
|
||||||
case ROTATEAROUND: POST_MESSAGE(RotateAround, (AtlasMessage::eRotateAroundType::FROM, evt.GetPosition())); break;
|
case ROTATEAROUND: POST_MESSAGE(RotateAround, (eRenderView::GAME, eRotateAroundType::FROM, evt.GetPosition())); break;
|
||||||
default: wxFAIL;
|
default: wxFAIL;
|
||||||
}
|
}
|
||||||
m_LastMouseState = m_MouseState;
|
m_LastMouseState = m_MouseState;
|
||||||
@ -247,59 +186,28 @@ public:
|
|||||||
switch (m_MouseState)
|
switch (m_MouseState)
|
||||||
{
|
{
|
||||||
case NONE: break;
|
case NONE: break;
|
||||||
case SCROLL: POST_MESSAGE(Scroll, (AtlasMessage::eScrollType::TO, evt.GetPosition())); break;
|
case SCROLL: POST_MESSAGE(Scroll, (eRenderView::GAME, eScrollType::TO, evt.GetPosition())); break;
|
||||||
case ROTATEAROUND: POST_MESSAGE(RotateAround, (AtlasMessage::eRotateAroundType::TO, evt.GetPosition())); break;
|
case ROTATEAROUND: POST_MESSAGE(RotateAround, (eRenderView::GAME, eRotateAroundType::TO, evt.GetPosition())); break;
|
||||||
default: wxFAIL;
|
default: wxFAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // UI_ONLY
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
bool m_SuppressResize;
|
|
||||||
|
|
||||||
enum { NONE, SCROLL, ROTATEAROUND };
|
enum { NONE, SCROLL, ROTATEAROUND };
|
||||||
int m_MouseState, m_LastMouseState;
|
int m_MouseState, m_LastMouseState;
|
||||||
bool m_MouseCaptured;
|
|
||||||
|
|
||||||
wxPoint m_LastMousePos;
|
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE();
|
DECLARE_EVENT_TABLE();
|
||||||
};
|
};
|
||||||
BEGIN_EVENT_TABLE(Canvas, wxGLCanvas)
|
|
||||||
EVT_SIZE (Canvas::OnResize)
|
|
||||||
EVT_KEY_DOWN (Canvas::OnKeyDown)
|
|
||||||
EVT_KEY_UP (Canvas::OnKeyUp)
|
|
||||||
EVT_CHAR (Canvas::OnChar)
|
|
||||||
|
|
||||||
EVT_LEFT_DOWN (Canvas::OnMouse)
|
BEGIN_EVENT_TABLE(GameCanvas, Canvas)
|
||||||
EVT_LEFT_UP (Canvas::OnMouse)
|
EVT_KEY_DOWN(GameCanvas::OnKeyDown)
|
||||||
EVT_RIGHT_DOWN (Canvas::OnMouse)
|
EVT_KEY_UP(GameCanvas::OnKeyUp)
|
||||||
EVT_RIGHT_UP (Canvas::OnMouse)
|
EVT_CHAR(GameCanvas::OnChar)
|
||||||
EVT_MIDDLE_DOWN(Canvas::OnMouse)
|
|
||||||
EVT_MIDDLE_UP (Canvas::OnMouse)
|
|
||||||
EVT_MOUSEWHEEL (Canvas::OnMouse)
|
|
||||||
EVT_MOTION (Canvas::OnMouse)
|
|
||||||
EVT_MOUSE_CAPTURE_CHANGED(Canvas::OnMouseCapture)
|
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
// GL functions exported from DLL, and called by game (in a separate
|
|
||||||
// thread to the standard wx one)
|
|
||||||
ATLASDLLIMPEXP void Atlas_GLSetCurrent(void* context)
|
|
||||||
{
|
|
||||||
((wxGLContext*)context)->SetCurrent();
|
|
||||||
}
|
|
||||||
|
|
||||||
ATLASDLLIMPEXP void Atlas_GLSwapBuffers(void* context)
|
|
||||||
{
|
|
||||||
((wxGLContext*)context)->SwapBuffers();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
volatile bool g_FrameHasEnded;
|
volatile bool g_FrameHasEnded;
|
||||||
// Called from game thread
|
// Called from game thread
|
||||||
ATLASDLLIMPEXP void Atlas_NotifyEndOfFrame()
|
ATLASDLLIMPEXP void Atlas_NotifyEndOfFrame()
|
||||||
@ -434,7 +342,7 @@ ScenarioEditor::ScenarioEditor(wxWindow* parent)
|
|||||||
WX_GL_MIN_ALPHA, 8, // alpha bits
|
WX_GL_MIN_ALPHA, 8, // alpha bits
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
Canvas* canvas = new Canvas(m_SectionLayout.GetCanvasParent(), glAttribList);
|
Canvas* canvas = new GameCanvas(m_SectionLayout.GetCanvasParent(), glAttribList);
|
||||||
m_SectionLayout.SetCanvas(canvas);
|
m_SectionLayout.SetCanvas(canvas);
|
||||||
// The canvas' context gets made current on creation; but it can only be
|
// The canvas' context gets made current on creation; but it can only be
|
||||||
// current for one thread at a time, and it needs to be current for the
|
// current for one thread at a time, and it needs to be current for the
|
||||||
@ -447,7 +355,6 @@ ScenarioEditor::ScenarioEditor(wxWindow* parent)
|
|||||||
|
|
||||||
// Send setup messages to game engine:
|
// Send setup messages to game engine:
|
||||||
|
|
||||||
#ifndef UI_ONLY
|
|
||||||
POST_MESSAGE(SetContext, (canvas->GetContext()));
|
POST_MESSAGE(SetContext, (canvas->GetContext()));
|
||||||
|
|
||||||
POST_MESSAGE(Init, ());
|
POST_MESSAGE(Init, ());
|
||||||
@ -458,8 +365,7 @@ ScenarioEditor::ScenarioEditor(wxWindow* parent)
|
|||||||
// a valid map loaded)
|
// a valid map loaded)
|
||||||
POST_MESSAGE(GenerateMap, (9));
|
POST_MESSAGE(GenerateMap, (9));
|
||||||
|
|
||||||
POST_MESSAGE(RenderEnable, (true));
|
POST_MESSAGE(RenderEnable, (eRenderView::GAME));
|
||||||
#endif
|
|
||||||
|
|
||||||
// Set up a timer to make sure tool-updates happen frequently (in addition
|
// Set up a timer to make sure tool-updates happen frequently (in addition
|
||||||
// to the idle handler (which makes them happen more frequently if there's nothing
|
// to the idle handler (which makes them happen more frequently if there's nothing
|
||||||
@ -468,16 +374,26 @@ ScenarioEditor::ScenarioEditor(wxWindow* parent)
|
|||||||
m_Timer.Start(20);
|
m_Timer.Start(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float ScenarioEditor::GetSpeedModifier()
|
||||||
|
{
|
||||||
|
if (wxGetKeyState(WXK_SHIFT) && wxGetKeyState(WXK_CONTROL))
|
||||||
|
return 1.f/64.f;
|
||||||
|
else if (wxGetKeyState(WXK_CONTROL))
|
||||||
|
return 1.f/4.f;
|
||||||
|
else if (wxGetKeyState(WXK_SHIFT))
|
||||||
|
return 4.f;
|
||||||
|
else
|
||||||
|
return 1.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ScenarioEditor::OnClose(wxCloseEvent&)
|
void ScenarioEditor::OnClose(wxCloseEvent&)
|
||||||
{
|
{
|
||||||
SetCurrentTool(_T(""));
|
SetCurrentTool(_T(""));
|
||||||
|
|
||||||
#ifndef UI_ONLY
|
|
||||||
POST_MESSAGE(Shutdown, ());
|
POST_MESSAGE(Shutdown, ());
|
||||||
#endif
|
|
||||||
|
|
||||||
AtlasMessage::qExit().Post();
|
qExit().Post();
|
||||||
// blocks until engine has noticed the message, so we won't be
|
// blocks until engine has noticed the message, so we won't be
|
||||||
// destroying the GLCanvas while it's still rendering
|
// destroying the GLCanvas while it's still rendering
|
||||||
|
|
||||||
@ -553,7 +469,7 @@ void ScenarioEditor::OnOpen(wxCommandEvent& WXUNUSED(event))
|
|||||||
SetOpenFilename(dlg.GetFilename());
|
SetOpenFilename(dlg.GetFilename());
|
||||||
|
|
||||||
// Wait for it to load, while the wxBusyInfo is telling the user that we're doing that
|
// Wait for it to load, while the wxBusyInfo is telling the user that we're doing that
|
||||||
AtlasMessage::qPing qry;
|
qPing qry;
|
||||||
qry.Post();
|
qry.Post();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -576,7 +492,7 @@ void ScenarioEditor::OnSave(wxCommandEvent& event)
|
|||||||
POST_MESSAGE(SaveMap, (map));
|
POST_MESSAGE(SaveMap, (map));
|
||||||
|
|
||||||
// Wait for it to finish saving
|
// Wait for it to finish saving
|
||||||
AtlasMessage::qPing qry;
|
qPing qry;
|
||||||
qry.Post();
|
qry.Post();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -599,7 +515,7 @@ void ScenarioEditor::OnSaveAs(wxCommandEvent& WXUNUSED(event))
|
|||||||
SetOpenFilename(dlg.GetFilename());
|
SetOpenFilename(dlg.GetFilename());
|
||||||
|
|
||||||
// Wait for it to finish saving
|
// Wait for it to finish saving
|
||||||
AtlasMessage::qPing qry;
|
qPing qry;
|
||||||
qry.Post();
|
qry.Post();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -631,7 +547,7 @@ void ScenarioEditor::OnScreenshot(wxCommandEvent& WXUNUSED(event))
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
AtlasMessage::Position::Position(const wxPoint& pt)
|
Position::Position(const wxPoint& pt)
|
||||||
: type(1)
|
: type(1)
|
||||||
{
|
{
|
||||||
type1.x = pt.x;
|
type1.x = pt.x;
|
||||||
@ -640,6 +556,8 @@ AtlasMessage::Position::Position(const wxPoint& pt)
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/* Disabled (and should be removed if it turns out to be unnecessary)
|
||||||
|
- see MessagePasserImpl.cpp for information
|
||||||
|
|
||||||
static void QueryCallback()
|
static void QueryCallback()
|
||||||
{
|
{
|
||||||
@ -670,6 +588,14 @@ static void QueryCallback()
|
|||||||
|
|
||||||
AtlasEventLoop* evtLoop = (AtlasEventLoop*)wxEventLoop::GetActive();
|
AtlasEventLoop* evtLoop = (AtlasEventLoop*)wxEventLoop::GetActive();
|
||||||
|
|
||||||
|
// evtLoop might be NULL, particularly if we're still initialising windows
|
||||||
|
// and haven't got into the normal event loop yet. But we'd have to process
|
||||||
|
// messages anyway, to avoid the deadlocks that this is for. So, don't bother
|
||||||
|
// with that and just crash instead.
|
||||||
|
// (Maybe it could be solved better by constructing/finding an event loop
|
||||||
|
// object here and setting it as the global one, assuming it's not overwritten
|
||||||
|
// later by wx.)
|
||||||
|
|
||||||
while (evtLoop->Pending())
|
while (evtLoop->Pending())
|
||||||
{
|
{
|
||||||
// Based on src/msw/evtloop.cpp's wxEventLoop::Dispatch()
|
// Based on src/msw/evtloop.cpp's wxEventLoop::Dispatch()
|
||||||
@ -712,8 +638,9 @@ static void QueryCallback()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
void AtlasMessage::QueryMessage::Post()
|
void QueryMessage::Post()
|
||||||
{
|
{
|
||||||
g_MessagePasser->Query(this, &QueryCallback);
|
// g_MessagePasser->Query(this, &QueryCallback);
|
||||||
|
g_MessagePasser->Query(this, NULL);
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,8 @@ public:
|
|||||||
|
|
||||||
static AtlasWindowCommandProc& GetCommandProc();
|
static AtlasWindowCommandProc& GetCommandProc();
|
||||||
|
|
||||||
|
static float GetSpeedModifier();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxTimer m_Timer;
|
wxTimer m_Timer;
|
||||||
|
|
||||||
|
@ -729,7 +729,7 @@ public:
|
|||||||
m_Sizer->Add(m_Track, 0);
|
m_Sizer->Add(m_Track, 0);
|
||||||
m_Sizer->Add(m_Path, 0);
|
m_Sizer->Add(m_Path, 0);
|
||||||
|
|
||||||
m_Timer = new wxTimer(this, wxID_ANY);
|
m_Timer.SetOwner(this);
|
||||||
}
|
}
|
||||||
void Update()
|
void Update()
|
||||||
{
|
{
|
||||||
@ -744,7 +744,7 @@ public:
|
|||||||
void PrepareTimers()
|
void PrepareTimers()
|
||||||
{
|
{
|
||||||
m_OldTime = m_NewTime = m_HighResTimer.GetTime();
|
m_OldTime = m_NewTime = m_HighResTimer.GetTime();
|
||||||
m_Timer->Start(10);
|
m_Timer.Start(10);
|
||||||
}
|
}
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
@ -754,7 +754,7 @@ public:
|
|||||||
|
|
||||||
float m_OldTime;
|
float m_OldTime;
|
||||||
float m_NewTime;
|
float m_NewTime;
|
||||||
wxTimer* m_Timer;
|
wxTimer m_Timer;
|
||||||
private:
|
private:
|
||||||
TrackSlider* m_Track;
|
TrackSlider* m_Track;
|
||||||
HighResTimer m_HighResTimer;
|
HighResTimer m_HighResTimer;
|
||||||
@ -771,7 +771,7 @@ END_EVENT_TABLE()
|
|||||||
void TrackSlider::OnScroll(wxScrollEvent& WXUNUSED(event))
|
void TrackSlider::OnScroll(wxScrollEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
//Move path and send movement message
|
//Move path and send movement message
|
||||||
m_Sidebar->m_SliderBox->m_Timer->Stop();
|
m_Sidebar->m_SliderBox->m_Timer.Stop();
|
||||||
if ( m_Sidebar->m_SelectedTrack < 0 || m_Sidebar->m_SelectedPath < 0 )
|
if ( m_Sidebar->m_SelectedTrack < 0 || m_Sidebar->m_SelectedPath < 0 )
|
||||||
{
|
{
|
||||||
SetValue(0);
|
SetValue(0);
|
||||||
@ -792,7 +792,7 @@ void TrackSlider::OnScroll(wxScrollEvent& WXUNUSED(event))
|
|||||||
}
|
}
|
||||||
void PathSlider::OnScroll(wxScrollEvent& WXUNUSED(event))
|
void PathSlider::OnScroll(wxScrollEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
m_Sidebar->m_SliderBox->m_Timer->Stop();
|
m_Sidebar->m_SliderBox->m_Timer.Stop();
|
||||||
if ( m_Sidebar->m_SelectedTrack < 0 || m_Sidebar->m_SelectedPath < 0 )
|
if ( m_Sidebar->m_SelectedTrack < 0 || m_Sidebar->m_SelectedPath < 0 )
|
||||||
{
|
{
|
||||||
SetValue(0);
|
SetValue(0);
|
||||||
@ -834,7 +834,7 @@ void TrackSlider::Update(float interval)
|
|||||||
|
|
||||||
if ( move == range && m_Sidebar->m_Playing )
|
if ( move == range && m_Sidebar->m_Playing )
|
||||||
{
|
{
|
||||||
m_Parent->m_Timer->Stop();
|
m_Parent->m_Timer.Stop();
|
||||||
SetValue(0);
|
SetValue(0);
|
||||||
m_Path->SetValue(0);
|
m_Path->SetValue(0);
|
||||||
m_Sidebar->GotoNode(0);
|
m_Sidebar->GotoNode(0);
|
||||||
@ -859,7 +859,7 @@ public:
|
|||||||
{
|
{
|
||||||
if ( m_Parent->m_SelectedTrack < 0 )
|
if ( m_Parent->m_SelectedTrack < 0 )
|
||||||
return;
|
return;
|
||||||
m_Parent->m_SliderBox->m_Timer->Stop();
|
m_Parent->m_SliderBox->m_Timer.Stop();
|
||||||
m_Parent->m_Playing = false;
|
m_Parent->m_Playing = false;
|
||||||
std::wstring name=*m_Parent->m_Tracks[m_Parent->m_SelectedTrack].name;
|
std::wstring name=*m_Parent->m_Tracks[m_Parent->m_SelectedTrack].name;
|
||||||
|
|
||||||
@ -894,7 +894,7 @@ public:
|
|||||||
{
|
{
|
||||||
if ( m_Parent->m_SelectedTrack < 0 || m_Parent->m_SelectedPath < 0)
|
if ( m_Parent->m_SelectedTrack < 0 || m_Parent->m_SelectedPath < 0)
|
||||||
return;
|
return;
|
||||||
m_Parent->m_SliderBox->m_Timer->Stop();
|
m_Parent->m_SliderBox->m_Timer.Stop();
|
||||||
m_Parent->m_Playing = false;
|
m_Parent->m_Playing = false;
|
||||||
m_Parent->m_AbsoluteTime = m_Parent->m_TimeElapsed = 0.0f;
|
m_Parent->m_AbsoluteTime = m_Parent->m_TimeElapsed = 0.0f;
|
||||||
m_Parent->SelectPath(0);
|
m_Parent->SelectPath(0);
|
||||||
@ -910,7 +910,7 @@ public:
|
|||||||
{
|
{
|
||||||
if ( m_Parent->m_SelectedTrack < 0 )
|
if ( m_Parent->m_SelectedTrack < 0 )
|
||||||
return;
|
return;
|
||||||
m_Parent->m_SliderBox->m_Timer->Stop();
|
m_Parent->m_SliderBox->m_Timer.Stop();
|
||||||
m_Parent->m_SliderBox->PrepareTimers();
|
m_Parent->m_SliderBox->PrepareTimers();
|
||||||
|
|
||||||
POST_MESSAGE(CinemaEvent,
|
POST_MESSAGE(CinemaEvent,
|
||||||
@ -925,7 +925,7 @@ public:
|
|||||||
{
|
{
|
||||||
if ( m_Parent->m_SelectedTrack < 0 )
|
if ( m_Parent->m_SelectedTrack < 0 )
|
||||||
return;
|
return;
|
||||||
m_Parent->m_SliderBox->m_Timer->Stop();
|
m_Parent->m_SliderBox->m_Timer.Stop();
|
||||||
m_Parent->m_SliderBox->Reset();
|
m_Parent->m_SliderBox->Reset();
|
||||||
//m_Parent->m_NodeList->Thaw();
|
//m_Parent->m_NodeList->Thaw();
|
||||||
m_Parent->m_Playing = false;
|
m_Parent->m_Playing = false;
|
||||||
@ -939,7 +939,7 @@ public:
|
|||||||
//void OnForward(wxCommandEvent& event)
|
//void OnForward(wxCommandEvent& event)
|
||||||
void OnNext(wxCommandEvent& WXUNUSED(event))
|
void OnNext(wxCommandEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
m_Parent->m_SliderBox->m_Timer->Stop();
|
m_Parent->m_SliderBox->m_Timer.Stop();
|
||||||
m_Parent->m_Playing = false;
|
m_Parent->m_Playing = false;
|
||||||
std::wstring name=*m_Parent->m_Tracks[m_Parent->m_SelectedTrack].name;
|
std::wstring name=*m_Parent->m_Tracks[m_Parent->m_SelectedTrack].name;
|
||||||
sCinemaPath path = m_Parent->GetCurrentPath();
|
sCinemaPath path = m_Parent->GetCurrentPath();
|
||||||
|
@ -60,18 +60,13 @@ public:
|
|||||||
Add(m_Slider);
|
Add(m_Slider);
|
||||||
}
|
}
|
||||||
|
|
||||||
~VariableSliderBox()
|
|
||||||
{
|
|
||||||
m_Conn.disconnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnSettingsChange(const AtlasMessage::sEnvironmentSettings& WXUNUSED(env))
|
void OnSettingsChange(const AtlasMessage::sEnvironmentSettings& WXUNUSED(env))
|
||||||
{
|
{
|
||||||
m_Slider->UpdateFromVar();
|
m_Slider->UpdateFromVar();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ObservableConnection m_Conn;
|
ObservableScopedConnection m_Conn;
|
||||||
VariableSlider* m_Slider;
|
VariableSlider* m_Slider;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -122,11 +117,6 @@ public:
|
|||||||
Add(m_Combo);
|
Add(m_Combo);
|
||||||
}
|
}
|
||||||
|
|
||||||
~VariableListBox()
|
|
||||||
{
|
|
||||||
m_Conn.disconnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetChoices(const std::vector<std::wstring>& choices)
|
void SetChoices(const std::vector<std::wstring>& choices)
|
||||||
{
|
{
|
||||||
wxArrayString choices_arraystr;
|
wxArrayString choices_arraystr;
|
||||||
@ -145,7 +135,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ObservableConnection m_Conn;
|
ObservableScopedConnection m_Conn;
|
||||||
VariableCombo* m_Combo;
|
VariableCombo* m_Combo;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -210,18 +200,13 @@ public:
|
|||||||
Add(m_Button);
|
Add(m_Button);
|
||||||
}
|
}
|
||||||
|
|
||||||
~VariableColourBox()
|
|
||||||
{
|
|
||||||
m_Conn.disconnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnSettingsChange(const AtlasMessage::sEnvironmentSettings& WXUNUSED(env))
|
void OnSettingsChange(const AtlasMessage::sEnvironmentSettings& WXUNUSED(env))
|
||||||
{
|
{
|
||||||
m_Button->UpdateDisplay();
|
m_Button->UpdateDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ObservableConnection m_Conn;
|
ObservableScopedConnection m_Conn;
|
||||||
VariableColourButton* m_Button;
|
VariableColourButton* m_Button;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -240,7 +225,7 @@ EnvironmentSidebar::EnvironmentSidebar(wxWindow* sidebarContainer, wxWindow* bot
|
|||||||
m_MainSizer->Add(new VariableSliderBox(this, _("Water waviness"), g_EnvironmentSettings.waterwaviness, 0, 10.f));
|
m_MainSizer->Add(new VariableSliderBox(this, _("Water waviness"), g_EnvironmentSettings.waterwaviness, 0, 10.f));
|
||||||
m_MainSizer->Add(new VariableSliderBox(this, _("Sun rotation"), g_EnvironmentSettings.sunrotation, -M_PI, M_PI));
|
m_MainSizer->Add(new VariableSliderBox(this, _("Sun rotation"), g_EnvironmentSettings.sunrotation, -M_PI, M_PI));
|
||||||
m_MainSizer->Add(new VariableSliderBox(this, _("Sun elevation"), g_EnvironmentSettings.sunelevation, -M_PI/2, M_PI/2));
|
m_MainSizer->Add(new VariableSliderBox(this, _("Sun elevation"), g_EnvironmentSettings.sunelevation, -M_PI/2, M_PI/2));
|
||||||
m_MainSizer->Add(new LightControl(this, g_EnvironmentSettings));
|
m_MainSizer->Add(new LightControl(this, wxSize(150, 150), g_EnvironmentSettings));
|
||||||
m_MainSizer->Add(m_SkyList = new VariableListBox(this, _("Sky set"), g_EnvironmentSettings.skyset));
|
m_MainSizer->Add(m_SkyList = new VariableListBox(this, _("Sky set"), g_EnvironmentSettings.skyset));
|
||||||
m_MainSizer->Add(new VariableColourBox(this, _("Sun colour"), g_EnvironmentSettings.suncolour));
|
m_MainSizer->Add(new VariableColourBox(this, _("Sun colour"), g_EnvironmentSettings.suncolour));
|
||||||
m_MainSizer->Add(new VariableColourBox(this, _("Terrain ambient colour"), g_EnvironmentSettings.terraincolour));
|
m_MainSizer->Add(new VariableColourBox(this, _("Terrain ambient colour"), g_EnvironmentSettings.terraincolour));
|
||||||
|
@ -14,5 +14,5 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
VariableListBox* m_SkyList;
|
VariableListBox* m_SkyList;
|
||||||
ObservableConnection m_Conn;
|
ObservableScopedConnection m_Conn;
|
||||||
};
|
};
|
||||||
|
@ -8,13 +8,13 @@ class LightSphere : public wxControl
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
LightSphere(wxWindow* parent, LightControl* lightControl)
|
LightSphere(wxWindow* parent, const wxSize& size, LightControl* lightControl)
|
||||||
: wxControl(parent, wxID_ANY, wxDefaultPosition, wxSize(150, 150)),
|
: wxControl(parent, wxID_ANY, wxDefaultPosition, size),
|
||||||
m_LightControl(lightControl)
|
m_LightControl(lightControl)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnPaint(wxPaintEvent& event)
|
void OnPaint(wxPaintEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
// Draw a lit 3D sphere:
|
// Draw a lit 3D sphere:
|
||||||
|
|
||||||
@ -87,9 +87,16 @@ public:
|
|||||||
float mz2 = 1 - mx*mx - my*my;
|
float mz2 = 1 - mx*mx - my*my;
|
||||||
if (mz2 >= 0.f)
|
if (mz2 >= 0.f)
|
||||||
{
|
{
|
||||||
float mz = sqrt(mz2);
|
//float mz = sqrt(mz2);
|
||||||
|
//phi = asin(mz);
|
||||||
|
|
||||||
|
// ^^ That's giving the height of the sphere at that point, so it's
|
||||||
|
// matching the point the user clicked on - but that's quite inconvenient
|
||||||
|
// when you want to move the sun near the horizon. So just make up
|
||||||
|
// some formula that gives a slightly nicer-feeling result:
|
||||||
|
phi = asin(mz2*mz2);
|
||||||
|
|
||||||
theta = -atan2(mx, my);
|
theta = -atan2(mx, my);
|
||||||
phi = asin(mz);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -114,12 +121,16 @@ BEGIN_EVENT_TABLE(LightSphere, wxControl)
|
|||||||
EVT_LEFT_DOWN(LightSphere::OnMouse)
|
EVT_LEFT_DOWN(LightSphere::OnMouse)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
LightControl::LightControl(wxWindow* parent, Observable<AtlasMessage::sEnvironmentSettings>& environment)
|
LightControl::LightControl(wxWindow* parent, const wxSize& size, Observable<AtlasMessage::sEnvironmentSettings>& environment)
|
||||||
: wxPanel(parent), m_Environment(environment)
|
: wxPanel(parent), m_Environment(environment)
|
||||||
{
|
{
|
||||||
m_Sphere = new LightSphere(this, this);
|
wxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
sizer->SetMinSize(size);
|
||||||
|
m_Sphere = new LightSphere(this, size, this);
|
||||||
m_Sphere->theta = environment.sunrotation;
|
m_Sphere->theta = environment.sunrotation;
|
||||||
m_Sphere->phi = environment.sunelevation;
|
m_Sphere->phi = environment.sunelevation;
|
||||||
|
sizer->Add(m_Sphere, wxSizerFlags().Expand().Proportion(1));
|
||||||
|
SetSizer(sizer);
|
||||||
|
|
||||||
m_Conn = environment.RegisterObserver(0, &LightControl::OnSettingsChange, this);
|
m_Conn = environment.RegisterObserver(0, &LightControl::OnSettingsChange, this);
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@ class LightSphere;
|
|||||||
class LightControl : public wxPanel
|
class LightControl : public wxPanel
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LightControl(wxWindow* parent, Observable<AtlasMessage::sEnvironmentSettings>& environment);
|
LightControl(wxWindow* parent, const wxSize& size, Observable<AtlasMessage::sEnvironmentSettings>& environment);
|
||||||
~LightControl();
|
~LightControl();
|
||||||
|
|
||||||
void OnSettingsChange(const AtlasMessage::sEnvironmentSettings& settings);
|
void OnSettingsChange(const AtlasMessage::sEnvironmentSettings& settings);
|
||||||
|
@ -99,13 +99,7 @@ public:
|
|||||||
if (wxGetKeyState(WXK_PRIOR)) --dir; // page-up key
|
if (wxGetKeyState(WXK_PRIOR)) --dir; // page-up key
|
||||||
if (dir)
|
if (dir)
|
||||||
{
|
{
|
||||||
float speed = M_PI/2.f; // radians per second
|
float speed = M_PI/2.f * ScenarioEditor::GetSpeedModifier(); // radians per second
|
||||||
if (wxGetKeyState(WXK_SHIFT) && wxGetKeyState(WXK_CONTROL))
|
|
||||||
speed /= 64.f;
|
|
||||||
else if (wxGetKeyState(WXK_CONTROL))
|
|
||||||
speed /= 4.f;
|
|
||||||
else if (wxGetKeyState(WXK_SHIFT))
|
|
||||||
speed *= 4.f;
|
|
||||||
g_DefaultAngle += (dir * dt * speed);
|
g_DefaultAngle += (dir * dt * speed);
|
||||||
SendObjectMsg(true);
|
SendObjectMsg(true);
|
||||||
}
|
}
|
||||||
|
190
source/tools/atlas/GameInterface/ActorViewer.cpp
Normal file
190
source/tools/atlas/GameInterface/ActorViewer.cpp
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
#include "precompiled.h"
|
||||||
|
|
||||||
|
#include "ActorViewer.h"
|
||||||
|
|
||||||
|
#include "View.h"
|
||||||
|
|
||||||
|
#include "graphics/Model.h"
|
||||||
|
#include "graphics/ObjectManager.h"
|
||||||
|
#include "graphics/Patch.h"
|
||||||
|
#include "graphics/Terrain.h"
|
||||||
|
#include "graphics/TextureEntry.h"
|
||||||
|
#include "graphics/TextureManager.h"
|
||||||
|
#include "graphics/Unit.h"
|
||||||
|
#include "graphics/UnitManager.h"
|
||||||
|
#include "maths/MathUtil.h"
|
||||||
|
#include "ps/GameSetup/Config.h"
|
||||||
|
#include "renderer/Renderer.h"
|
||||||
|
#include "renderer/SkyManager.h"
|
||||||
|
|
||||||
|
struct ActorViewerImpl
|
||||||
|
{
|
||||||
|
CUnit* Unit;
|
||||||
|
CStrW CurrentUnitID;
|
||||||
|
CStrW CurrentUnitAnim;
|
||||||
|
float CurrentSpeed;
|
||||||
|
|
||||||
|
CTerrain Terrain;
|
||||||
|
};
|
||||||
|
|
||||||
|
ActorViewer::ActorViewer()
|
||||||
|
: m(*new ActorViewerImpl())
|
||||||
|
{
|
||||||
|
m.Unit = NULL;
|
||||||
|
|
||||||
|
// Set up the renderer
|
||||||
|
g_TexMan.LoadTerrainTextures();
|
||||||
|
g_ObjMan.LoadObjects();
|
||||||
|
g_Renderer.LoadAlphaMaps();
|
||||||
|
// (TODO: should these be unloaded properly some time? and what should
|
||||||
|
// happen if we want the actor viewer and scenario editor loaded at
|
||||||
|
// the same time?)
|
||||||
|
|
||||||
|
// Create a tiny empty piece of terrain, just so we can put shadows
|
||||||
|
// on it without having to think too hard
|
||||||
|
m.Terrain.Initialize(1, NULL);
|
||||||
|
CTextureEntry* tex = g_TexMan.FindTexture("whiteness");
|
||||||
|
if (tex)
|
||||||
|
{
|
||||||
|
CPatch* patch = m.Terrain.GetPatch(0, 0);
|
||||||
|
for (int i = 0; i < PATCH_SIZE; ++i)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < PATCH_SIZE; ++j)
|
||||||
|
{
|
||||||
|
CMiniPatch& mp = patch->m_MiniPatches[i][j];
|
||||||
|
mp.Tex1 = tex->GetHandle();
|
||||||
|
mp.Tex1Priority = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ActorViewer::~ActorViewer()
|
||||||
|
{
|
||||||
|
delete m.Unit;
|
||||||
|
delete &m;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActorViewer::SetActor(const CStrW& id, const CStrW& animation)
|
||||||
|
{
|
||||||
|
bool needsAnimReload = false;
|
||||||
|
|
||||||
|
if (! m.Unit || id != m.CurrentUnitID)
|
||||||
|
{
|
||||||
|
delete m.Unit;
|
||||||
|
m.Unit = NULL;
|
||||||
|
|
||||||
|
// If there's no actor to display, return with nothing loaded
|
||||||
|
if (id.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
m.Unit = CUnit::Create((CStr)id, NULL, std::set<CStr>());
|
||||||
|
|
||||||
|
if (! m.Unit)
|
||||||
|
return;
|
||||||
|
|
||||||
|
float angle = PI;
|
||||||
|
float s = sin(angle);
|
||||||
|
float c = cos(angle);
|
||||||
|
CMatrix3D mat;
|
||||||
|
mat._11 = -c; mat._12 = 0.0f; mat._13 = -s; mat._14 = CELL_SIZE * PATCH_SIZE/2;
|
||||||
|
mat._21 = 0.0f; mat._22 = 1.0f; mat._23 = 0.0f; mat._24 = 0.0f;
|
||||||
|
mat._31 = s; mat._32 = 0.0f; mat._33 = -c; mat._34 = CELL_SIZE * PATCH_SIZE/2;
|
||||||
|
mat._41 = 0.0f; mat._42 = 0.0f; mat._43 = 0.0f; mat._44 = 1.0f;
|
||||||
|
m.Unit->GetModel()->SetTransform(mat);
|
||||||
|
m.Unit->GetModel()->ValidatePosition();
|
||||||
|
|
||||||
|
needsAnimReload = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (animation != m.CurrentUnitAnim)
|
||||||
|
needsAnimReload = true;
|
||||||
|
|
||||||
|
if (needsAnimReload)
|
||||||
|
{
|
||||||
|
CStr anim = ((CStr)animation).LowerCase();
|
||||||
|
|
||||||
|
float speed;
|
||||||
|
// TODO: this is just copied from template_unit.xml and isn't the
|
||||||
|
// same for all units. But we don't know anything about entities here,
|
||||||
|
// so what to do?
|
||||||
|
if (anim == "walk")
|
||||||
|
speed = 7.f;
|
||||||
|
else if (anim == "run")
|
||||||
|
speed = 12.f;
|
||||||
|
else
|
||||||
|
speed = 0.f;
|
||||||
|
m.CurrentSpeed = speed;
|
||||||
|
|
||||||
|
m.Unit->SetEntitySelection(anim);
|
||||||
|
m.Unit->SetRandomAnimation(anim, false, speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
m.CurrentUnitID = id;
|
||||||
|
m.CurrentUnitAnim = animation;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: don't have this duplicated from GameView
|
||||||
|
void SubmitModelRecursive(CModel* model)
|
||||||
|
{
|
||||||
|
g_Renderer.Submit(model);
|
||||||
|
|
||||||
|
const std::vector<CModel::Prop>& props = model->GetProps();
|
||||||
|
for (size_t i = 0; i < props.size(); ++i)
|
||||||
|
SubmitModelRecursive(props[i].m_Model);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActorViewer::Render()
|
||||||
|
{
|
||||||
|
m.Terrain.MakeDirty(RENDERDATA_UPDATE_COLOR);
|
||||||
|
|
||||||
|
g_Renderer.SetClearColor(0xFFFFFFFFu);
|
||||||
|
|
||||||
|
g_Renderer.BeginFrame();
|
||||||
|
|
||||||
|
// Find the centre of the interesting region, in the middle of the patch
|
||||||
|
// and half way up the model (assuming there is one)
|
||||||
|
CVector3D centre;
|
||||||
|
if (m.Unit)
|
||||||
|
m.Unit->GetModel()->GetBounds().GetCentre(centre);
|
||||||
|
else
|
||||||
|
centre.Y = 0.f;
|
||||||
|
centre.X = centre.Z = CELL_SIZE * PATCH_SIZE/2;
|
||||||
|
|
||||||
|
CCamera camera = View::GetView_Actor()->GetCamera();
|
||||||
|
camera.m_Orientation.Translate(centre.X, centre.Y, centre.Z);
|
||||||
|
camera.UpdateFrustum();
|
||||||
|
|
||||||
|
g_Renderer.SetCamera(camera, camera);
|
||||||
|
|
||||||
|
g_Renderer.Submit(m.Terrain.GetPatch(0, 0));
|
||||||
|
|
||||||
|
if (m.Unit)
|
||||||
|
SubmitModelRecursive(m.Unit->GetModel());
|
||||||
|
|
||||||
|
g_Renderer.FlushFrame();
|
||||||
|
|
||||||
|
g_Renderer.EndFrame();
|
||||||
|
|
||||||
|
oglCheck();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActorViewer::Update(float dt)
|
||||||
|
{
|
||||||
|
if (m.Unit)
|
||||||
|
{
|
||||||
|
m.Unit->GetModel()->Update(dt);
|
||||||
|
|
||||||
|
// Move the model by speed*dt forwards
|
||||||
|
CMatrix3D mat = m.Unit->GetModel()->GetTransform();
|
||||||
|
float z = mat.GetTranslation().Z;
|
||||||
|
z -= m.CurrentSpeed*dt;
|
||||||
|
// Wrap at the edges, so it doesn't run off into the horizon
|
||||||
|
if (z < CELL_SIZE*PATCH_SIZE * 0.4f)
|
||||||
|
z = CELL_SIZE*PATCH_SIZE * 0.6f;
|
||||||
|
|
||||||
|
mat.Translate(0.f, 0.f, z - mat.GetTranslation().Z);
|
||||||
|
m.Unit->GetModel()->SetTransform(mat);
|
||||||
|
m.Unit->GetModel()->ValidatePosition();
|
||||||
|
}
|
||||||
|
}
|
22
source/tools/atlas/GameInterface/ActorViewer.h
Normal file
22
source/tools/atlas/GameInterface/ActorViewer.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#ifndef ACTORVIEWER_H__
|
||||||
|
#define ACTORVIEWER_H__
|
||||||
|
|
||||||
|
struct ActorViewerImpl;
|
||||||
|
|
||||||
|
class ActorViewer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ActorViewer();
|
||||||
|
~ActorViewer();
|
||||||
|
|
||||||
|
void SetActor(const CStrW& id, const CStrW& animation);
|
||||||
|
void Render();
|
||||||
|
void Update(float dt);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ActorViewerImpl& m;
|
||||||
|
|
||||||
|
NO_COPY_CTOR(ActorViewer);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // ACTORVIEWER_H__
|
@ -1,3 +1,6 @@
|
|||||||
|
#ifndef BRUSHES_H__
|
||||||
|
#define BRUSHES_H__
|
||||||
|
|
||||||
#include "maths/Vector3D.h"
|
#include "maths/Vector3D.h"
|
||||||
|
|
||||||
class TerrainOverlay;
|
class TerrainOverlay;
|
||||||
@ -33,3 +36,5 @@ private:
|
|||||||
extern Brush g_CurrentBrush;
|
extern Brush g_CurrentBrush;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // BRUSHES_H__
|
@ -1,3 +1,6 @@
|
|||||||
|
#ifndef COMMANDPROC_H__
|
||||||
|
#define COMMANDPROC_H__
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <map>
|
#include <map>
|
||||||
@ -162,3 +165,5 @@ The following macros convert that into:
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // COMMANDPROC_H__
|
||||||
|
@ -5,44 +5,33 @@
|
|||||||
#include "MessagePasserImpl.h"
|
#include "MessagePasserImpl.h"
|
||||||
#include "Messages.h"
|
#include "Messages.h"
|
||||||
#include "SharedMemory.h"
|
#include "SharedMemory.h"
|
||||||
#include "Brushes.h"
|
|
||||||
#include "Handlers/MessageHandler.h"
|
#include "Handlers/MessageHandler.h"
|
||||||
|
#include "ActorViewer.h"
|
||||||
|
#include "View.h"
|
||||||
|
|
||||||
#include "InputProcessor.h"
|
#include "InputProcessor.h"
|
||||||
|
|
||||||
|
#include "lib/app_hooks.h"
|
||||||
#include "lib/sdl.h"
|
#include "lib/sdl.h"
|
||||||
#include "lib/ogl.h"
|
|
||||||
#include "lib/timer.h"
|
#include "lib/timer.h"
|
||||||
#include "lib/res/file/vfs.h"
|
#include "lib/res/file/vfs.h"
|
||||||
#include "ps/CLogger.h"
|
#include "ps/CLogger.h"
|
||||||
#include "ps/GameSetup/GameSetup.h"
|
|
||||||
#include "ps/Game.h"
|
|
||||||
#include "ps/World.h"
|
|
||||||
#include "simulation/Simulation.h"
|
|
||||||
#include "simulation/EntityManager.h"
|
|
||||||
|
|
||||||
using namespace AtlasMessage;
|
using namespace AtlasMessage;
|
||||||
|
|
||||||
|
|
||||||
namespace AtlasMessage
|
namespace AtlasMessage
|
||||||
{
|
{
|
||||||
extern void AtlasRenderSelection();
|
|
||||||
extern void RegisterHandlers();
|
extern void RegisterHandlers();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtlasRender()
|
|
||||||
{
|
|
||||||
Render();
|
|
||||||
AtlasRenderSelection();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Loaded from DLL:
|
// Loaded from DLL:
|
||||||
void (*Atlas_StartWindow)(wchar_t* type);
|
void (*Atlas_StartWindow)(const wchar_t* type);
|
||||||
void (*Atlas_SetMessagePasser)(MessagePasser*);
|
void (*Atlas_SetMessagePasser)(MessagePasser*);
|
||||||
void (*Atlas_GLSetCurrent)(void* context);
|
void (*Atlas_GLSetCurrent)(void* context);
|
||||||
void (*Atlas_GLSwapBuffers)(void* context);
|
void (*Atlas_GLSwapBuffers)(void* context);
|
||||||
void (*Atlas_NotifyEndOfFrame)();
|
void (*Atlas_NotifyEndOfFrame)();
|
||||||
|
void (*Atlas_DisplayError)(const wchar_t* text, unsigned int flags);
|
||||||
namespace AtlasMessage
|
namespace AtlasMessage
|
||||||
{
|
{
|
||||||
void* (*ShareableMallocFptr)(size_t);
|
void* (*ShareableMallocFptr)(size_t);
|
||||||
@ -60,13 +49,33 @@ static GameLoopState state;
|
|||||||
GameLoopState* g_GameLoop = &state;
|
GameLoopState* g_GameLoop = &state;
|
||||||
|
|
||||||
|
|
||||||
static void* LaunchWindow(void*)
|
static void* LaunchWindow(void* data)
|
||||||
{
|
{
|
||||||
|
const wchar_t* windowName = reinterpret_cast<const wchar_t*>(data);
|
||||||
debug_set_thread_name("atlas_window");
|
debug_set_thread_name("atlas_window");
|
||||||
Atlas_StartWindow(L"ScenarioEditor");
|
Atlas_StartWindow(windowName);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Work out which Atlas window to launch, given the command-line arguments
|
||||||
|
static const wchar_t* FindWindowName(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
for (int i = 1; i < argc; i++)
|
||||||
|
{
|
||||||
|
if (strcmp(argv[i], "-actorviewer") == 0)
|
||||||
|
return L"ActorViewer";
|
||||||
|
}
|
||||||
|
|
||||||
|
return L"ScenarioEditor";
|
||||||
|
}
|
||||||
|
|
||||||
|
static ErrorReaction AtlasDisplayError(const wchar_t* text, uint flags)
|
||||||
|
{
|
||||||
|
// TODO: after Atlas has been unloaded, don't do this
|
||||||
|
Atlas_DisplayError(text, flags);
|
||||||
|
|
||||||
|
return ER_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
bool BeginAtlas(int argc, char* argv[], void* dll)
|
bool BeginAtlas(int argc, char* argv[], void* dll)
|
||||||
{
|
{
|
||||||
@ -77,6 +86,7 @@ bool BeginAtlas(int argc, char* argv[], void* dll)
|
|||||||
GET(Atlas_GLSetCurrent);
|
GET(Atlas_GLSetCurrent);
|
||||||
GET(Atlas_GLSwapBuffers);
|
GET(Atlas_GLSwapBuffers);
|
||||||
GET(Atlas_NotifyEndOfFrame);
|
GET(Atlas_NotifyEndOfFrame);
|
||||||
|
GET(Atlas_DisplayError);
|
||||||
#undef GET
|
#undef GET
|
||||||
#define GET(x) *(void**)&x##Fptr = dlsym(dll, #x); debug_assert(x##Fptr); if (! x##Fptr) return false;
|
#define GET(x) *(void**)&x##Fptr = dlsym(dll, #x); debug_assert(x##Fptr); if (! x##Fptr) return false;
|
||||||
GET(ShareableMalloc);
|
GET(ShareableMalloc);
|
||||||
@ -90,14 +100,19 @@ bool BeginAtlas(int argc, char* argv[], void* dll)
|
|||||||
RegisterHandlers();
|
RegisterHandlers();
|
||||||
|
|
||||||
// Create a new thread, and launch the Atlas window inside that thread
|
// Create a new thread, and launch the Atlas window inside that thread
|
||||||
pthread_t gameThread;
|
const wchar_t* windowName = FindWindowName(argc, argv);
|
||||||
pthread_create(&gameThread, NULL, LaunchWindow, NULL);
|
pthread_t uiThread;
|
||||||
|
pthread_create(&uiThread, NULL, LaunchWindow, reinterpret_cast<void*>(const_cast<wchar_t*>(windowName)));
|
||||||
|
|
||||||
|
// Override ah_display_error to pass all errors to the Atlas UI
|
||||||
|
AppHooks hooks = {0};
|
||||||
|
hooks.display_error = AtlasDisplayError;
|
||||||
|
app_hooks_update(&hooks);
|
||||||
|
|
||||||
state.argc = argc;
|
state.argc = argc;
|
||||||
state.argv = argv;
|
state.argv = argv;
|
||||||
state.running = true;
|
state.running = true;
|
||||||
state.rendering = false;
|
state.view = View::GetView_None();
|
||||||
state.worldloaded = false;
|
|
||||||
state.glContext = NULL;
|
state.glContext = NULL;
|
||||||
|
|
||||||
double last_activity = get_time();
|
double last_activity = get_time();
|
||||||
@ -108,13 +123,13 @@ bool BeginAtlas(int argc, char* argv[], void* dll)
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// (TODO: Work out why these things have to be in this order (to avoid
|
// (TODO: Work out why these things have to be in this order (to avoid
|
||||||
// jumps when starting to move, etc)
|
// jumps when starting to move, etc))
|
||||||
|
|
||||||
// Calculate frame length
|
// Calculate frame length
|
||||||
{
|
{
|
||||||
const double time = get_time();
|
double time = get_time();
|
||||||
static double last_time = time;
|
static double last_time = time;
|
||||||
const float length = (float)(time-last_time);
|
float length = (float)(time-last_time);
|
||||||
last_time = time;
|
last_time = time;
|
||||||
debug_assert(length >= 0.0f);
|
debug_assert(length >= 0.0f);
|
||||||
// TODO: filter out big jumps, e.g. when having done a lot of slow
|
// TODO: filter out big jumps, e.g. when having done a lot of slow
|
||||||
@ -181,17 +196,9 @@ bool BeginAtlas(int argc, char* argv[], void* dll)
|
|||||||
|
|
||||||
vfs_reload_changed_files();
|
vfs_reload_changed_files();
|
||||||
|
|
||||||
if (state.worldloaded)
|
state.view->Update(state.frameLength);
|
||||||
{
|
|
||||||
g_EntityManager.updateAll(0);
|
|
||||||
g_Game->GetSimulation()->Update(0.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state.rendering)
|
state.view->Render();
|
||||||
{
|
|
||||||
AtlasRender();
|
|
||||||
Atlas_GLSwapBuffers((void*)state.glContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
double time = get_time();
|
double time = get_time();
|
||||||
if (recent_activity)
|
if (recent_activity)
|
||||||
@ -199,13 +206,14 @@ bool BeginAtlas(int argc, char* argv[], void* dll)
|
|||||||
|
|
||||||
// Be nice to the processor (by sleeping lots) if we're not doing anything
|
// Be nice to the processor (by sleeping lots) if we're not doing anything
|
||||||
// useful, and nice to the user (by just yielding to other threads) if we are
|
// useful, and nice to the user (by just yielding to other threads) if we are
|
||||||
bool yield = time - last_activity > 0.5;
|
bool yield = (time - last_activity > 0.5);
|
||||||
if ( state.worldloaded )
|
|
||||||
{
|
// But make sure we aren't doing anything interesting right now, where
|
||||||
if ( g_Game->GetView()->GetCinema()->IsPlaying() )
|
// the user wants to see the screen updating even though they're not
|
||||||
g_Game->GetView()->GetCinema()->Update(state.frameLength);
|
// interacting with it
|
||||||
|
if (state.view->WantsHighFramerate())
|
||||||
yield = false;
|
yield = false;
|
||||||
}
|
|
||||||
if (yield) // if there was no recent activity...
|
if (yield) // if there was no recent activity...
|
||||||
{
|
{
|
||||||
double sleepUntil = time + 0.5; // only redraw at 2fps
|
double sleepUntil = time + 0.5; // only redraw at 2fps
|
||||||
@ -231,7 +239,11 @@ bool BeginAtlas(int argc, char* argv[], void* dll)
|
|||||||
|
|
||||||
// TODO: delete all remaining messages, to avoid memory leak warnings
|
// TODO: delete all remaining messages, to avoid memory leak warnings
|
||||||
|
|
||||||
pthread_join(gameThread, NULL);
|
// Wait for the UI to exit
|
||||||
|
pthread_join(uiThread, NULL);
|
||||||
|
|
||||||
|
// Clean up
|
||||||
|
View::DestroyViews();
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
@ -3,13 +3,16 @@
|
|||||||
|
|
||||||
extern void (*Atlas_GLSetCurrent)(void* context);
|
extern void (*Atlas_GLSetCurrent)(void* context);
|
||||||
|
|
||||||
|
class View;
|
||||||
|
|
||||||
struct GameLoopState
|
struct GameLoopState
|
||||||
{
|
{
|
||||||
int argc;
|
int argc;
|
||||||
char** argv;
|
char** argv;
|
||||||
bool running;
|
|
||||||
bool rendering;
|
bool running; // whether the Atlas game loop is still running
|
||||||
bool worldloaded;
|
View* view; // current 'view' (controls updates, rendering, etc)
|
||||||
|
|
||||||
const void* glContext;
|
const void* glContext;
|
||||||
float frameLength; // smoothed to avoid large jumps
|
float frameLength; // smoothed to avoid large jumps
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ MESSAGEHANDLER(Brush)
|
|||||||
MESSAGEHANDLER(BrushPreview)
|
MESSAGEHANDLER(BrushPreview)
|
||||||
{
|
{
|
||||||
g_CurrentBrush.SetRenderEnabled(msg->enable);
|
g_CurrentBrush.SetRenderEnabled(msg->enable);
|
||||||
msg->pos->GetWorldSpace(g_CurrentBrush.m_Centre);
|
g_CurrentBrush.m_Centre = msg->pos->GetWorldSpace();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "MessageHandler.h"
|
#include "MessageHandler.h"
|
||||||
#include "../GameLoop.h"
|
#include "../GameLoop.h"
|
||||||
|
#include "../View.h"
|
||||||
|
|
||||||
#include "maths/Vector3D.h"
|
#include "maths/Vector3D.h"
|
||||||
#include "maths/Quaternion.h"
|
#include "maths/Quaternion.h"
|
||||||
@ -16,8 +17,9 @@ namespace AtlasMessage {
|
|||||||
|
|
||||||
MESSAGEHANDLER(ScrollConstant)
|
MESSAGEHANDLER(ScrollConstant)
|
||||||
{
|
{
|
||||||
if ( g_Game->GetView()->GetCinema()->IsPlaying() )
|
if (g_Game->GetView()->GetCinema()->IsPlaying())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (msg->dir < 0 || msg->dir > 3)
|
if (msg->dir < 0 || msg->dir > 3)
|
||||||
{
|
{
|
||||||
debug_warn("ScrollConstant: invalid direction");
|
debug_warn("ScrollConstant: invalid direction");
|
||||||
@ -28,10 +30,14 @@ MESSAGEHANDLER(ScrollConstant)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: change all these g_Game->...GetCamera() bits to use the current View's
|
||||||
|
// camera instead.
|
||||||
|
|
||||||
MESSAGEHANDLER(Scroll)
|
MESSAGEHANDLER(Scroll)
|
||||||
{
|
{
|
||||||
if ( g_Game->GetView()->GetCinema()->IsPlaying() )
|
if (g_Game->GetView()->GetCinema()->IsPlaying()) // TODO: do this better (probably a separate View class for cinematics)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
static CVector3D targetPos;
|
static CVector3D targetPos;
|
||||||
static float targetDistance = 0.f;
|
static float targetDistance = 0.f;
|
||||||
|
|
||||||
@ -57,7 +63,7 @@ MESSAGEHANDLER(Scroll)
|
|||||||
|
|
||||||
if (msg->type == eScrollType::FROM)
|
if (msg->type == eScrollType::FROM)
|
||||||
{
|
{
|
||||||
msg->pos->GetWorldSpace(targetPos);
|
targetPos = msg->pos->GetWorldSpace();
|
||||||
targetDistance = (targetPos - camera.GetTranslation()).GetLength();
|
targetDistance = (targetPos - camera.GetTranslation()).GetLength();
|
||||||
}
|
}
|
||||||
else if (msg->type == eScrollType::TO)
|
else if (msg->type == eScrollType::TO)
|
||||||
@ -79,15 +85,17 @@ MESSAGEHANDLER(Scroll)
|
|||||||
|
|
||||||
MESSAGEHANDLER(SmoothZoom)
|
MESSAGEHANDLER(SmoothZoom)
|
||||||
{
|
{
|
||||||
if ( g_Game->GetView()->GetCinema()->IsPlaying() )
|
if (g_Game->GetView()->GetCinema()->IsPlaying())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_GameLoop->input.zoomDelta += msg->amount;
|
g_GameLoop->input.zoomDelta += msg->amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
MESSAGEHANDLER(RotateAround)
|
MESSAGEHANDLER(RotateAround)
|
||||||
{
|
{
|
||||||
if ( g_Game->GetView()->GetCinema()->IsPlaying() )
|
if (g_Game->GetView()->GetCinema()->IsPlaying())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
static CVector3D focusPos;
|
static CVector3D focusPos;
|
||||||
static float lastX = 0.f, lastY = 0.f;
|
static float lastX = 0.f, lastY = 0.f;
|
||||||
|
|
||||||
@ -96,7 +104,7 @@ MESSAGEHANDLER(RotateAround)
|
|||||||
if (msg->type == eRotateAroundType::FROM)
|
if (msg->type == eRotateAroundType::FROM)
|
||||||
{
|
{
|
||||||
msg->pos->GetScreenSpace(lastX, lastY); // get mouse position
|
msg->pos->GetScreenSpace(lastX, lastY); // get mouse position
|
||||||
msg->pos->GetWorldSpace(focusPos); // get point on terrain under mouse
|
focusPos = msg->pos->GetWorldSpace(); // get point on terrain under mouse
|
||||||
}
|
}
|
||||||
else if (msg->type == eRotateAroundType::TO)
|
else if (msg->type == eRotateAroundType::TO)
|
||||||
{
|
{
|
||||||
@ -136,5 +144,33 @@ MESSAGEHANDLER(RotateAround)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MESSAGEHANDLER(LookAt)
|
||||||
|
{
|
||||||
|
// TODO: different view depending on
|
||||||
|
CCamera& camera = View::GetView_Actor()->GetCamera();
|
||||||
|
|
||||||
|
CVector3D tgt = msg->target->GetWorldSpace();
|
||||||
|
CVector3D eye = msg->pos->GetWorldSpace();
|
||||||
|
tgt.Y = -tgt.Y; // ??? why is this needed?
|
||||||
|
eye.Y = -eye.Y; // ???
|
||||||
|
|
||||||
|
// Based on http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glu/lookat.html
|
||||||
|
CVector3D f = tgt - eye;
|
||||||
|
f.Normalize();
|
||||||
|
CVector3D s = f.Cross(CVector3D(0, 1, 0));
|
||||||
|
CVector3D u = s.Cross(f);
|
||||||
|
CMatrix3D M (
|
||||||
|
s[0], s[1], s[2], 0,
|
||||||
|
u[0], u[1], u[2], 0,
|
||||||
|
-f[0], -f[1], -f[2], 0,
|
||||||
|
0, 0, 0, 1
|
||||||
|
);
|
||||||
|
|
||||||
|
M.GetTranspose(camera.m_Orientation);
|
||||||
|
camera.m_Orientation.Translate(-eye);
|
||||||
|
|
||||||
|
camera.UpdateFrustum();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -102,7 +102,7 @@ BEGIN_COMMAND(AlterElevation)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static CVector3D previousPosition;
|
static CVector3D previousPosition;
|
||||||
msg->pos->GetWorldSpace(g_CurrentBrush.m_Centre, previousPosition);
|
g_CurrentBrush.m_Centre = msg->pos->GetWorldSpace(previousPosition);
|
||||||
previousPosition = g_CurrentBrush.m_Centre;
|
previousPosition = g_CurrentBrush.m_Centre;
|
||||||
|
|
||||||
int x0, y0;
|
int x0, y0;
|
||||||
@ -158,7 +158,7 @@ BEGIN_COMMAND(FlattenElevation)
|
|||||||
int amount = (int)msg->amount;
|
int amount = (int)msg->amount;
|
||||||
|
|
||||||
static CVector3D previousPosition;
|
static CVector3D previousPosition;
|
||||||
msg->pos->GetWorldSpace(g_CurrentBrush.m_Centre, previousPosition);
|
g_CurrentBrush.m_Centre = msg->pos->GetWorldSpace(previousPosition);
|
||||||
previousPosition = g_CurrentBrush.m_Centre;
|
previousPosition = g_CurrentBrush.m_Centre;
|
||||||
|
|
||||||
int xc, yc;
|
int xc, yc;
|
||||||
|
@ -50,7 +50,10 @@ void SetSettings(const sEnvironmentSettings& s)
|
|||||||
g_LightEnv.SetRotation(s.sunrotation);
|
g_LightEnv.SetRotation(s.sunrotation);
|
||||||
g_LightEnv.SetElevation(s.sunelevation);
|
g_LightEnv.SetElevation(s.sunelevation);
|
||||||
|
|
||||||
g_Renderer.GetSkyManager()->SetSkySet(*s.skyset);
|
CStrW skySet = *s.skyset;
|
||||||
|
if (skySet.length() == 0)
|
||||||
|
skySet = L"default";
|
||||||
|
g_Renderer.GetSkyManager()->SetSkySet(skySet);
|
||||||
|
|
||||||
#define COLOUR(A, B) B = RGBColor(A->r/255.f, A->g/255.f, A->b/255.f)
|
#define COLOUR(A, B) B = RGBColor(A->r/255.f, A->g/255.f, A->b/255.f)
|
||||||
COLOUR(s.suncolour, g_LightEnv.m_SunColor);
|
COLOUR(s.suncolour, g_LightEnv.m_SunColor);
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
#include "MessageHandler.h"
|
#include "MessageHandler.h"
|
||||||
#include "../GameLoop.h"
|
#include "../GameLoop.h"
|
||||||
#include "../CommandProc.h"
|
#include "../CommandProc.h"
|
||||||
|
#include "../ActorViewer.h"
|
||||||
|
#include "../View.h"
|
||||||
|
|
||||||
#include "renderer/Renderer.h"
|
#include "renderer/Renderer.h"
|
||||||
#include "graphics/GameView.h"
|
#include "graphics/GameView.h"
|
||||||
@ -15,10 +17,8 @@
|
|||||||
#include "ps/GameSetup/Config.h"
|
#include "ps/GameSetup/Config.h"
|
||||||
#include "ps/GameSetup/GameSetup.h"
|
#include "ps/GameSetup/GameSetup.h"
|
||||||
|
|
||||||
|
|
||||||
namespace AtlasMessage {
|
namespace AtlasMessage {
|
||||||
|
|
||||||
|
|
||||||
MESSAGEHANDLER(Init)
|
MESSAGEHANDLER(Init)
|
||||||
{
|
{
|
||||||
UNUSED2(msg);
|
UNUSED2(msg);
|
||||||
@ -45,9 +45,10 @@ MESSAGEHANDLER(Shutdown)
|
|||||||
// we kill the EntityManager
|
// we kill the EntityManager
|
||||||
GetCommandProc().Destroy();
|
GetCommandProc().Destroy();
|
||||||
|
|
||||||
Shutdown();
|
View::DestroyViews();
|
||||||
|
g_GameLoop->view = View::GetView_None();
|
||||||
|
|
||||||
g_GameLoop->rendering = false;
|
Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -60,7 +61,16 @@ QUERYHANDLER(Exit)
|
|||||||
|
|
||||||
MESSAGEHANDLER(RenderEnable)
|
MESSAGEHANDLER(RenderEnable)
|
||||||
{
|
{
|
||||||
g_GameLoop->rendering = msg->enabled;
|
if (msg->view == eRenderView::NONE) g_GameLoop->view = View::GetView_None();
|
||||||
|
else if (msg->view == eRenderView::GAME) g_GameLoop->view = View::GetView_Game();
|
||||||
|
else if (msg->view == eRenderView::ACTOR) g_GameLoop->view = View::GetView_Actor();
|
||||||
|
else debug_warn("Invalid view type");
|
||||||
|
}
|
||||||
|
|
||||||
|
MESSAGEHANDLER(SetActorViewer)
|
||||||
|
{
|
||||||
|
View::GetView_Actor()->SetSpeedMultiplier(msg->speed);
|
||||||
|
View::GetView_Actor()->GetActorViewer().SetActor(*msg->id, *msg->animation);
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
@ -81,18 +91,9 @@ MESSAGEHANDLER(ResizeScreen)
|
|||||||
|
|
||||||
SViewPort vp = { 0, 0, g_xres, g_yres };
|
SViewPort vp = { 0, 0, g_xres, g_yres };
|
||||||
|
|
||||||
if (g_Game)
|
|
||||||
{
|
|
||||||
g_Game->GetView()->GetCamera()->SetViewPort(&vp);
|
|
||||||
g_Game->GetView()->GetCamera()->SetProjection (1, 5000, DEGTORAD(20));
|
|
||||||
}
|
|
||||||
|
|
||||||
g_Renderer.SetViewport(vp);
|
g_Renderer.SetViewport(vp);
|
||||||
g_Renderer.Resize(g_xres, g_yres);
|
g_Renderer.Resize(g_xres, g_yres);
|
||||||
|
|
||||||
if (g_Game)
|
|
||||||
g_Game->GetView()->GetCamera()->UpdateFrustum();
|
|
||||||
|
|
||||||
g_GUI.UpdateResolution();
|
g_GUI.UpdateResolution();
|
||||||
|
|
||||||
g_Console->UpdateScreenSize(g_xres, g_yres);
|
g_Console->UpdateScreenSize(g_xres, g_yres);
|
||||||
|
@ -35,8 +35,6 @@ static void InitGame(std::wstring map)
|
|||||||
|
|
||||||
// Initialise the game:
|
// Initialise the game:
|
||||||
g_Game = new CGame();
|
g_Game = new CGame();
|
||||||
|
|
||||||
g_GameLoop->worldloaded = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void StartGame()
|
static void StartGame()
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "graphics/GameView.h"
|
#include "graphics/GameView.h"
|
||||||
#include "graphics/Model.h"
|
#include "graphics/Model.h"
|
||||||
|
#include "graphics/ObjectEntry.h"
|
||||||
#include "graphics/ObjectManager.h"
|
#include "graphics/ObjectManager.h"
|
||||||
#include "graphics/Terrain.h"
|
#include "graphics/Terrain.h"
|
||||||
#include "graphics/Unit.h"
|
#include "graphics/Unit.h"
|
||||||
@ -18,8 +19,10 @@
|
|||||||
#include "ps/Game.h"
|
#include "ps/Game.h"
|
||||||
#include "ps/World.h"
|
#include "ps/World.h"
|
||||||
#include "simulation/EntityTemplateCollection.h"
|
#include "simulation/EntityTemplateCollection.h"
|
||||||
|
#include "simulation/EntityTemplate.h"
|
||||||
#include "simulation/Entity.h"
|
#include "simulation/Entity.h"
|
||||||
#include "simulation/EntityManager.h"
|
#include "simulation/EntityManager.h"
|
||||||
|
#include "simulation/TerritoryManager.h"
|
||||||
|
|
||||||
#define LOG_CATEGORY "editor"
|
#define LOG_CATEGORY "editor"
|
||||||
|
|
||||||
@ -214,7 +217,7 @@ static float flt_minus_epsilon(float f)
|
|||||||
static CVector3D GetUnitPos(const Position& pos)
|
static CVector3D GetUnitPos(const Position& pos)
|
||||||
{
|
{
|
||||||
static CVector3D vec;
|
static CVector3D vec;
|
||||||
pos.GetWorldSpace(vec, vec); // if msg->pos is 'Unchanged', use the previous pos
|
vec = pos.GetWorldSpace(vec); // if msg->pos is 'Unchanged', use the previous pos
|
||||||
|
|
||||||
float xOnMap = clamp(vec.X, 0.f, flt_minus_epsilon((g_Game->GetWorld()->GetTerrain()->GetVerticesPerSide()-1)*CELL_SIZE));
|
float xOnMap = clamp(vec.X, 0.f, flt_minus_epsilon((g_Game->GetWorld()->GetTerrain()->GetVerticesPerSide()-1)*CELL_SIZE));
|
||||||
float zOnMap = clamp(vec.Z, 0.f, flt_minus_epsilon((g_Game->GetWorld()->GetTerrain()->GetVerticesPerSide()-1)*CELL_SIZE));
|
float zOnMap = clamp(vec.Z, 0.f, flt_minus_epsilon((g_Game->GetWorld()->GetTerrain()->GetVerticesPerSide()-1)*CELL_SIZE));
|
||||||
@ -296,8 +299,7 @@ MESSAGEHANDLER(ObjectPreview)
|
|||||||
if (msg->usetarget)
|
if (msg->usetarget)
|
||||||
{
|
{
|
||||||
// Aim from pos towards msg->target
|
// Aim from pos towards msg->target
|
||||||
CVector3D target;
|
CVector3D target = msg->target->GetWorldSpace(pos.Y);
|
||||||
msg->target->GetWorldSpace(target, pos.Y);
|
|
||||||
CVector2D dir(target.X-pos.X, target.Z-pos.Z);
|
CVector2D dir(target.X-pos.X, target.Z-pos.Z);
|
||||||
dir = dir.normalize();
|
dir = dir.normalize();
|
||||||
s = dir.x;
|
s = dir.x;
|
||||||
@ -337,8 +339,7 @@ BEGIN_COMMAND(CreateObject)
|
|||||||
if (msg->usetarget)
|
if (msg->usetarget)
|
||||||
{
|
{
|
||||||
// Aim from m_Pos towards msg->target
|
// Aim from m_Pos towards msg->target
|
||||||
CVector3D target;
|
CVector3D target = msg->target->GetWorldSpace(m_Pos.Y);
|
||||||
msg->target->GetWorldSpace(target, m_Pos.Y);
|
|
||||||
CVector2D dir(target.X-m_Pos.X, target.Z-m_Pos.Z);
|
CVector2D dir(target.X-m_Pos.X, target.Z-m_Pos.Z);
|
||||||
m_Angle = atan2(dir.x, dir.y);
|
m_Angle = atan2(dir.x, dir.y);
|
||||||
}
|
}
|
||||||
@ -388,6 +389,9 @@ BEGIN_COMMAND(CreateObject)
|
|||||||
{
|
{
|
||||||
ent->SetPlayer(g_Game->GetPlayer(m_Player));
|
ent->SetPlayer(g_Game->GetPlayer(m_Player));
|
||||||
ent->m_actor->SetID(m_ID);
|
ent->m_actor->SetID(m_ID);
|
||||||
|
|
||||||
|
if (ent->m_base->m_isTerritoryCentre)
|
||||||
|
g_Game->GetWorld()->GetTerritoryManager()->DelayedRecalculate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -424,7 +428,14 @@ BEGIN_COMMAND(CreateObject)
|
|||||||
if (unit)
|
if (unit)
|
||||||
{
|
{
|
||||||
if (unit->GetEntity())
|
if (unit->GetEntity())
|
||||||
|
{
|
||||||
|
bool wasTerritoryCentre = unit->GetEntity()->m_base->m_isTerritoryCentre;
|
||||||
|
|
||||||
unit->GetEntity()->kill();
|
unit->GetEntity()->kill();
|
||||||
|
|
||||||
|
if (wasTerritoryCentre)
|
||||||
|
g_Game->GetWorld()->GetTerritoryManager()->DelayedRecalculate();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_UnitMan.RemoveUnit(unit);
|
g_UnitMan.RemoveUnit(unit);
|
||||||
@ -504,6 +515,9 @@ BEGIN_COMMAND(MoveObject)
|
|||||||
if (unit->GetEntity())
|
if (unit->GetEntity())
|
||||||
{
|
{
|
||||||
unit->GetEntity()->m_position = pos;
|
unit->GetEntity()->m_position = pos;
|
||||||
|
|
||||||
|
if (unit->GetEntity()->m_base->m_isTerritoryCentre)
|
||||||
|
g_Game->GetWorld()->GetTerritoryManager()->DelayedRecalculate();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -549,8 +563,7 @@ BEGIN_COMMAND(RotateObject)
|
|||||||
if (msg->usetarget)
|
if (msg->usetarget)
|
||||||
{
|
{
|
||||||
CVector3D& pos = unit->GetEntity()->m_position;
|
CVector3D& pos = unit->GetEntity()->m_position;
|
||||||
CVector3D target;
|
CVector3D target = msg->target->GetWorldSpace(pos.Y);
|
||||||
msg->target->GetWorldSpace(target, pos.Y);
|
|
||||||
CVector2D dir(target.X-pos.X, target.Z-pos.Z);
|
CVector2D dir(target.X-pos.X, target.Z-pos.Z);
|
||||||
m_AngleNew = atan2(dir.x, dir.y);
|
m_AngleNew = atan2(dir.x, dir.y);
|
||||||
}
|
}
|
||||||
@ -568,8 +581,7 @@ BEGIN_COMMAND(RotateObject)
|
|||||||
float s, c;
|
float s, c;
|
||||||
if (msg->usetarget)
|
if (msg->usetarget)
|
||||||
{
|
{
|
||||||
CVector3D target;
|
CVector3D target = msg->target->GetWorldSpace(pos.Y);
|
||||||
msg->target->GetWorldSpace(target, pos.Y);
|
|
||||||
CVector2D dir(target.X-pos.X, target.Z-pos.Z);
|
CVector2D dir(target.X-pos.X, target.Z-pos.Z);
|
||||||
dir = dir.normalize();
|
dir = dir.normalize();
|
||||||
s = dir.x;
|
s = dir.x;
|
||||||
@ -660,6 +672,10 @@ BEGIN_COMMAND(DeleteObject)
|
|||||||
{
|
{
|
||||||
// HACK: I don't know the proper way of undoably deleting entities...
|
// HACK: I don't know the proper way of undoably deleting entities...
|
||||||
unit->GetEntity()->entf_set(ENTF_DESTROYED);
|
unit->GetEntity()->entf_set(ENTF_DESTROYED);
|
||||||
|
|
||||||
|
// TODO: territories don't ignore DESTROYED entities
|
||||||
|
if (unit->GetEntity()->m_base->m_isTerritoryCentre)
|
||||||
|
g_Game->GetWorld()->GetTerritoryManager()->DelayedRecalculate();
|
||||||
}
|
}
|
||||||
|
|
||||||
g_UnitMan.RemoveUnit(unit);
|
g_UnitMan.RemoveUnit(unit);
|
||||||
@ -669,8 +685,13 @@ BEGIN_COMMAND(DeleteObject)
|
|||||||
void Undo()
|
void Undo()
|
||||||
{
|
{
|
||||||
if (m_UnitInLimbo->GetEntity())
|
if (m_UnitInLimbo->GetEntity())
|
||||||
|
{
|
||||||
m_UnitInLimbo->GetEntity()->entf_clear(ENTF_DESTROYED);
|
m_UnitInLimbo->GetEntity()->entf_clear(ENTF_DESTROYED);
|
||||||
|
|
||||||
|
if (m_UnitInLimbo->GetEntity()->m_base->m_isTerritoryCentre)
|
||||||
|
g_Game->GetWorld()->GetTerritoryManager()->DelayedRecalculate();
|
||||||
|
}
|
||||||
|
|
||||||
g_UnitMan.AddUnit(m_UnitInLimbo);
|
g_UnitMan.AddUnit(m_UnitInLimbo);
|
||||||
m_UnitInLimbo = NULL;
|
m_UnitInLimbo = NULL;
|
||||||
}
|
}
|
||||||
|
@ -163,7 +163,7 @@ BEGIN_COMMAND(PaintTerrain)
|
|||||||
void Do()
|
void Do()
|
||||||
{
|
{
|
||||||
|
|
||||||
msg->pos->GetWorldSpace(g_CurrentBrush.m_Centre);
|
g_CurrentBrush.m_Centre = msg->pos->GetWorldSpace();
|
||||||
|
|
||||||
int x0, y0;
|
int x0, y0;
|
||||||
g_CurrentBrush.GetBottomLeft(x0, y0);
|
g_CurrentBrush.GetBottomLeft(x0, y0);
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
#ifndef INPUTPROCESSOR_H__
|
||||||
|
#define INPUTPROCESSOR_H__
|
||||||
|
|
||||||
#include "GameLoop.h"
|
#include "GameLoop.h"
|
||||||
|
|
||||||
class InputProcessor
|
class InputProcessor
|
||||||
@ -6,3 +9,5 @@ public:
|
|||||||
// Returns true if the camera has moved
|
// Returns true if the camera has moved
|
||||||
bool ProcessInput(GameLoopState* state);
|
bool ProcessInput(GameLoopState* state);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif // INPUTPROCESSOR_H__
|
||||||
|
@ -43,12 +43,13 @@ IMessage* MessagePasserImpl::Retrieve()
|
|||||||
|
|
||||||
m_Mutex.Unlock();
|
m_Mutex.Unlock();
|
||||||
|
|
||||||
// if (m_Trace && msg) debug_printf("%8.3f retrieved message: %s\n", get_time(), msg->GetType());
|
if (m_Trace && msg)
|
||||||
|
debug_printf("%8.3f retrieved message: %s\n", get_time(), msg->GetName());
|
||||||
|
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagePasserImpl::Query(QueryMessage* qry, void(*timeoutCallback)())
|
void MessagePasserImpl::Query(QueryMessage* qry, void(* UNUSED(timeoutCallback) )())
|
||||||
{
|
{
|
||||||
debug_assert(qry);
|
debug_assert(qry);
|
||||||
debug_assert(qry->GetType() == IMessage::Query);
|
debug_assert(qry->GetType() == IMessage::Query);
|
||||||
@ -74,32 +75,49 @@ void MessagePasserImpl::Query(QueryMessage* qry, void(*timeoutCallback)())
|
|||||||
|
|
||||||
// Wait until the query handler has handled the query and called sem_post:
|
// Wait until the query handler has handled the query and called sem_post:
|
||||||
|
|
||||||
// At least on Win32, it is necessary for the UI thread to run its event
|
|
||||||
// loop to avoid deadlocking the system (particularly when the game
|
|
||||||
// tries to show a dialog box); so timeoutCallback is called whenever we
|
|
||||||
// think it's necessary for that to happen.
|
|
||||||
|
|
||||||
#if OS_WIN
|
// The following code was necessary to avoid deadlock, but it still breaks
|
||||||
// On Win32, use MsgWaitForMultipleObjects, which waits on the semaphore
|
// in some cases (e.g. when Atlas issues a query before its event loop starts
|
||||||
// but is also interrupted by incoming Windows-messages.
|
// running) and doesn't seem to be the simplest possible solution.
|
||||||
while (0 != (err = sem_msgwait_np(&sem)))
|
// So currently we're trying to not do anything like that at all, and
|
||||||
#else
|
// just stop the game making windows (which is what seems (from experience) to
|
||||||
// TODO: On non-Win32, I have no idea whether the same problem exists; but
|
// deadlock things) by overriding ah_display_error. Hopefully it'll work like
|
||||||
// it might do, so call the callback every few seconds just in case it helps.
|
// that, and the redundant code below/elsewhere can be removed, but it's
|
||||||
struct timespec abs_timeout;
|
// left in here in case it needs to be reinserted in the future to make it
|
||||||
clock_gettime(CLOCK_REALTIME, &abs_timeout);
|
// work.
|
||||||
abs_timeout.tv_sec += 2;
|
// (See http://www.wildfiregames.com/forum/index.php?s=&showtopic=10236&view=findpost&p=174617)
|
||||||
while (0 != (err = sem_timedwait(&sem, &abs_timeout)))
|
|
||||||
#endif
|
// // At least on Win32, it is necessary for the UI thread to run its event
|
||||||
|
// // loop to avoid deadlocking the system (particularly when the game
|
||||||
|
// // tries to show a dialog box); so timeoutCallback is called whenever we
|
||||||
|
// // think it's necessary for that to happen.
|
||||||
|
//
|
||||||
|
// #if OS_WIN
|
||||||
|
// // On Win32, use MsgWaitForMultipleObjects, which waits on the semaphore
|
||||||
|
// // but is also interrupted by incoming Windows-messages.
|
||||||
|
// // while (0 != (err = sem_msgwait_np(&sem)))
|
||||||
|
//
|
||||||
|
// while (0 != (err = sem_wait(&sem)))
|
||||||
|
// #else
|
||||||
|
// // TODO: On non-Win32, I have no idea whether the same problem exists; but
|
||||||
|
// // it might do, so call the callback every few seconds just in case it helps.
|
||||||
|
// struct timespec abs_timeout;
|
||||||
|
// clock_gettime(CLOCK_REALTIME, &abs_timeout);
|
||||||
|
// abs_timeout.tv_sec += 2;
|
||||||
|
// while (0 != (err = sem_timedwait(&sem, &abs_timeout)))
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
while (0 != (err = sem_wait(&sem)))
|
||||||
{
|
{
|
||||||
// If timed out, call callback and try again
|
// If timed out, call callback and try again
|
||||||
if (errno == ETIMEDOUT)
|
// if (errno == ETIMEDOUT)
|
||||||
timeoutCallback();
|
// timeoutCallback();
|
||||||
|
// else
|
||||||
// Keep retrying while EINTR, but other errors are probably fatal
|
// Keep retrying while EINTR, but other errors are probably fatal
|
||||||
else if (errno != EINTR)
|
if (errno != EINTR)
|
||||||
{
|
{
|
||||||
debug_warn("Semaphore wait failed");
|
debug_warn("Semaphore wait failed");
|
||||||
return; // (leak the semaphore)
|
return; // (leaks the semaphore)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,8 +13,11 @@ MESSAGE(Init, );
|
|||||||
|
|
||||||
MESSAGE(Shutdown, );
|
MESSAGE(Shutdown, );
|
||||||
|
|
||||||
|
struct eRenderView { enum { NONE, GAME, ACTOR }; };
|
||||||
|
|
||||||
MESSAGE(RenderEnable,
|
MESSAGE(RenderEnable,
|
||||||
((bool, enabled)));
|
((int, view)) // eRenderView
|
||||||
|
);
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -108,7 +111,7 @@ SHAREABLE_STRUCT(sObjectsListItem);
|
|||||||
|
|
||||||
QUERY(GetObjectsList,
|
QUERY(GetObjectsList,
|
||||||
, // no inputs
|
, // no inputs
|
||||||
((std::vector<sObjectsListItem>, objects))
|
((std::vector<sObjectsListItem>, objects)) // sorted by .name
|
||||||
);
|
);
|
||||||
|
|
||||||
struct sObjectSettings
|
struct sObjectSettings
|
||||||
@ -123,6 +126,8 @@ struct sObjectSettings
|
|||||||
};
|
};
|
||||||
SHAREABLE_STRUCT(sObjectSettings);
|
SHAREABLE_STRUCT(sObjectSettings);
|
||||||
|
|
||||||
|
// Preview object in the game world - creates a temporary unit at the given
|
||||||
|
// position, and removes it when the preview is next changed
|
||||||
MESSAGE(ObjectPreview,
|
MESSAGE(ObjectPreview,
|
||||||
((std::wstring, id)) // or empty string => disable
|
((std::wstring, id)) // or empty string => disable
|
||||||
((sObjectSettings, settings))
|
((sObjectSettings, settings))
|
||||||
@ -141,6 +146,13 @@ COMMAND(CreateObject, NOMERGE,
|
|||||||
((float, angle))
|
((float, angle))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Set an actor to be previewed on its own (i.e. without the game world).
|
||||||
|
// (Use RenderEnable to make it visible.)
|
||||||
|
MESSAGE(SetActorViewer,
|
||||||
|
((std::wstring, id))
|
||||||
|
((std::wstring, animation))
|
||||||
|
((float, speed))
|
||||||
|
);
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -149,29 +161,38 @@ QUERY(Exit,,); // no inputs nor outputs
|
|||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
struct eScrollConstantDir { enum { FORWARDS, BACKWARDS, LEFT, RIGHT }; };
|
struct eScrollConstantDir { enum { FORWARDS, BACKWARDS, LEFT, RIGHT }; };
|
||||||
MESSAGE(ScrollConstant,
|
MESSAGE(ScrollConstant,
|
||||||
((int, dir))
|
((int, view)) // eRenderView
|
||||||
|
((int, dir)) // eScrollConstantDir
|
||||||
((float, speed)) // set speed 0.0f to stop scrolling
|
((float, speed)) // set speed 0.0f to stop scrolling
|
||||||
);
|
);
|
||||||
|
|
||||||
struct eScrollType { enum { FROM, TO }; };
|
struct eScrollType { enum { FROM, TO }; };
|
||||||
MESSAGE(Scroll, // for scrolling by dragging the mouse FROM somewhere TO elsewhere
|
MESSAGE(Scroll, // for scrolling by dragging the mouse FROM somewhere TO elsewhere
|
||||||
((int, type))
|
((int, view)) // eRenderView
|
||||||
|
((int, type)) // eScrollType
|
||||||
((Position, pos))
|
((Position, pos))
|
||||||
);
|
);
|
||||||
|
|
||||||
MESSAGE(SmoothZoom,
|
MESSAGE(SmoothZoom,
|
||||||
|
((int, view)) // eRenderView
|
||||||
((float, amount))
|
((float, amount))
|
||||||
);
|
);
|
||||||
|
|
||||||
struct eRotateAroundType { enum { FROM, TO }; };
|
struct eRotateAroundType { enum { FROM, TO }; };
|
||||||
MESSAGE(RotateAround,
|
MESSAGE(RotateAround,
|
||||||
((int, type))
|
((int, view)) // eRenderView
|
||||||
|
((int, type)) // eRotateAroundType
|
||||||
((Position, pos))
|
((Position, pos))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
MESSAGE(LookAt,
|
||||||
|
((int, view)) // eRenderView
|
||||||
|
((Position, pos))
|
||||||
|
((Position, target))
|
||||||
|
);
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
struct sEnvironmentSettings
|
struct sEnvironmentSettings
|
||||||
@ -225,16 +246,11 @@ struct ePaintTerrainPriority { enum { HIGH, LOW }; };
|
|||||||
COMMAND(PaintTerrain, MERGE,
|
COMMAND(PaintTerrain, MERGE,
|
||||||
((Position, pos))
|
((Position, pos))
|
||||||
((std::wstring, texture))
|
((std::wstring, texture))
|
||||||
((int, priority))
|
((int, priority)) // ePaintTerrainPriority
|
||||||
);
|
);
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
typedef int ObjectID;
|
|
||||||
FUNCTION(
|
|
||||||
inline bool ObjectIDIsValid(ObjectID id) { return (id >= 0); }
|
|
||||||
);
|
|
||||||
|
|
||||||
QUERY(PickObject,
|
QUERY(PickObject,
|
||||||
((Position, pos))
|
((Position, pos))
|
||||||
,
|
,
|
||||||
@ -276,64 +292,8 @@ COMMAND(SetObjectSettings, NOMERGE,
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
struct sCinemaSplineNode
|
|
||||||
{
|
|
||||||
Shareable<float> x, y, z, t;
|
|
||||||
public:
|
|
||||||
sCinemaSplineNode(float px, float py, float pz) : x(px), y(py), z(pz), t(0.0f){}
|
|
||||||
sCinemaSplineNode() {}
|
|
||||||
void SetTime(float _t) { t = _t; }
|
|
||||||
};
|
|
||||||
SHAREABLE_STRUCT(sCinemaSplineNode);
|
|
||||||
|
|
||||||
struct sCinemaPath
|
|
||||||
{
|
|
||||||
Shareable<std::vector<AtlasMessage::sCinemaSplineNode> > nodes;
|
|
||||||
Shareable<float> duration, x, y, z;
|
|
||||||
Shareable<int> mode, growth, change, style; //change == switch point
|
|
||||||
|
|
||||||
sCinemaPath(float rx, float ry, float rz) : x(rx), y(ry), z(rz),
|
|
||||||
mode(0), style(0), change(0), growth(0), duration(0) {}
|
|
||||||
sCinemaPath() : x(0), y(0), z(0), mode(0), style(0),
|
|
||||||
change(0), growth(0), duration(0) {}
|
|
||||||
|
|
||||||
AtlasMessage::sCinemaPath operator-(const AtlasMessage::sCinemaPath& path)
|
|
||||||
{
|
|
||||||
return AtlasMessage::sCinemaPath(x - path.x, y - path.y,
|
|
||||||
z - path.z);
|
|
||||||
}
|
|
||||||
AtlasMessage::sCinemaPath operator+(const AtlasMessage::sCinemaPath& path)
|
|
||||||
{
|
|
||||||
return AtlasMessage::sCinemaPath(x + path.x, y + path.y,
|
|
||||||
z + path.z);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
SHAREABLE_STRUCT(sCinemaPath);
|
|
||||||
|
|
||||||
struct sCinemaTrack
|
|
||||||
{
|
|
||||||
Shareable<std::wstring> name;
|
|
||||||
Shareable<float> x, y, z, timescale, duration;
|
|
||||||
Shareable<std::vector<AtlasMessage::sCinemaPath> > paths;
|
|
||||||
|
|
||||||
public:
|
|
||||||
sCinemaTrack(float rx, float ry, float rz, std::wstring track)
|
|
||||||
: x(rx), y(ry), z(rz), timescale(1.f), duration(0)
|
|
||||||
{ name = track; }
|
|
||||||
sCinemaTrack() : x(0), y(0), z(0), timescale(1.f), duration(0) {}
|
|
||||||
};
|
|
||||||
SHAREABLE_STRUCT(sCinemaTrack);
|
|
||||||
|
|
||||||
struct eCinemaEventMode { enum { SMOOTH, SELECT, IMMEDIATE_PATH,
|
|
||||||
IMMEDIATE_TRACK }; };
|
|
||||||
struct sCameraInfo
|
|
||||||
{
|
|
||||||
Shareable<float> pX, pY, pZ, rX, rY, rZ; //position and rotation
|
|
||||||
};
|
|
||||||
SHAREABLE_STRUCT(sCameraInfo);
|
|
||||||
|
|
||||||
QUERY(GetCinemaTracks,
|
QUERY(GetCinemaTracks,
|
||||||
, //no input
|
, // no inputs
|
||||||
((std::vector<AtlasMessage::sCinemaTrack> , tracks))
|
((std::vector<AtlasMessage::sCinemaTrack> , tracks))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -165,8 +165,6 @@ const bool NOMERGE = false;
|
|||||||
QUERY_WITH_INPUTS) \
|
QUERY_WITH_INPUTS) \
|
||||||
(name, in_vals, out_vals)
|
(name, in_vals, out_vals)
|
||||||
|
|
||||||
#define FUNCTION(def) def
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -187,7 +185,6 @@ const bool NOMERGE = false;
|
|||||||
#undef QUERY_WITHOUT_INPUTS
|
#undef QUERY_WITHOUT_INPUTS
|
||||||
#undef QUERY_WITH_INPUTS
|
#undef QUERY_WITH_INPUTS
|
||||||
#undef QUERY
|
#undef QUERY
|
||||||
#undef FUNCTION
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,52 +8,50 @@
|
|||||||
#include "ps/Game.h"
|
#include "ps/Game.h"
|
||||||
#include "graphics/GameView.h"
|
#include "graphics/GameView.h"
|
||||||
|
|
||||||
void AtlasMessage::Position::GetWorldSpace(CVector3D& vec) const
|
CVector3D AtlasMessage::Position::GetWorldSpace() const
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
vec.Set(type0.x, type0.y, type0.z);
|
return CVector3D(type0.x, type0.y, type0.z);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
vec = g_Game->GetView()->GetCamera()->GetWorldCoordinates(type1.x, type1.y);
|
return g_Game->GetView()->GetCamera()->GetWorldCoordinates(type1.x, type1.y);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
debug_warn("Invalid Position acquisition (unchanged without previous)");
|
debug_warn("Invalid Position acquisition (unchanged without previous)");
|
||||||
vec.Set(0.f, 0.f, 0.f);
|
return CVector3D(0.f, 0.f, 0.f);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
debug_warn("Invalid Position type");
|
debug_warn("Invalid Position type");
|
||||||
vec.Set(0.f, 0.f, 0.f);
|
return CVector3D(0.f, 0.f, 0.f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtlasMessage::Position::GetWorldSpace(CVector3D& vec, float h) const
|
CVector3D AtlasMessage::Position::GetWorldSpace(float h) const
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
vec = g_Game->GetView()->GetCamera()->GetWorldCoordinates(type1.x, type1.y, h);
|
return g_Game->GetView()->GetCamera()->GetWorldCoordinates(type1.x, type1.y, h);
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
GetWorldSpace(vec);
|
return GetWorldSpace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtlasMessage::Position::GetWorldSpace(CVector3D& vec, const CVector3D& prev) const
|
CVector3D AtlasMessage::Position::GetWorldSpace(const CVector3D& prev) const
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
vec = prev;
|
return prev;
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
GetWorldSpace(vec);
|
return GetWorldSpace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,8 +35,6 @@ extern cmdHandlers& GetCmdHandlers();
|
|||||||
extern cmdHandler c##name##_create(); \
|
extern cmdHandler c##name##_create(); \
|
||||||
GetCmdHandlers().insert(std::pair<std::string, cmdHandler>("c"#name, c##name##_create()));
|
GetCmdHandlers().insert(std::pair<std::string, cmdHandler>("c"#name, c##name##_create()));
|
||||||
|
|
||||||
#define FUNCTION(def)
|
|
||||||
|
|
||||||
#undef SHAREABLE_STRUCT
|
#undef SHAREABLE_STRUCT
|
||||||
#define SHAREABLE_STRUCT(name)
|
#define SHAREABLE_STRUCT(name)
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ public:
|
|||||||
|
|
||||||
const wrapped_type _Unwrap() const
|
const wrapped_type _Unwrap() const
|
||||||
{
|
{
|
||||||
return buf ? wrapped_type(buf, buf+length-1) : wrapped_type();
|
return (buf && length) ? wrapped_type(buf, buf+length-1) : wrapped_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
const wrapped_type operator*() const
|
const wrapped_type operator*() const
|
||||||
@ -173,7 +173,7 @@ public:
|
|||||||
// without constructing a new std::basic_string then calling c_str on that
|
// without constructing a new std::basic_string then calling c_str on that
|
||||||
const C* c_str() const
|
const C* c_str() const
|
||||||
{
|
{
|
||||||
return buf ? buf : (C*)empty_str;
|
return (buf && length) ? buf : (C*)empty_str;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -39,13 +39,14 @@ struct Position
|
|||||||
|
|
||||||
// Only for use in the game, not the UI.
|
// Only for use in the game, not the UI.
|
||||||
// Implementations in Misc.cpp.
|
// Implementations in Misc.cpp.
|
||||||
void GetWorldSpace(CVector3D& vec) const;
|
CVector3D GetWorldSpace() const;
|
||||||
void GetWorldSpace(CVector3D& vec, float h) const;
|
CVector3D GetWorldSpace(float h) const;
|
||||||
void GetWorldSpace(CVector3D& vec, const CVector3D& prev) const;
|
CVector3D GetWorldSpace(const CVector3D& prev) const;
|
||||||
void GetScreenSpace(float& x, float& y) const;
|
void GetScreenSpace(float& x, float& y) const;
|
||||||
};
|
};
|
||||||
SHAREABLE_STRUCT(Position);
|
SHAREABLE_STRUCT(Position);
|
||||||
|
|
||||||
|
|
||||||
struct Colour
|
struct Colour
|
||||||
{
|
{
|
||||||
Colour()
|
Colour()
|
||||||
@ -62,6 +63,64 @@ struct Colour
|
|||||||
};
|
};
|
||||||
SHAREABLE_STRUCT(Colour);
|
SHAREABLE_STRUCT(Colour);
|
||||||
|
|
||||||
|
|
||||||
|
typedef int ObjectID;
|
||||||
|
inline bool ObjectIDIsValid(ObjectID id) { return (id >= 0); }
|
||||||
|
|
||||||
|
|
||||||
|
struct sCinemaSplineNode
|
||||||
|
{
|
||||||
|
Shareable<float> x, y, z, t;
|
||||||
|
public:
|
||||||
|
sCinemaSplineNode(float px, float py, float pz) : x(px), y(py), z(pz), t(0.0f) {}
|
||||||
|
sCinemaSplineNode() {}
|
||||||
|
void SetTime(float _t) { t = _t; }
|
||||||
|
};
|
||||||
|
SHAREABLE_STRUCT(sCinemaSplineNode);
|
||||||
|
|
||||||
|
struct sCinemaPath
|
||||||
|
{
|
||||||
|
Shareable<std::vector<AtlasMessage::sCinemaSplineNode> > nodes;
|
||||||
|
Shareable<float> duration, x, y, z;
|
||||||
|
Shareable<int> mode, growth, change, style; // change == switch point
|
||||||
|
|
||||||
|
sCinemaPath(float rx, float ry, float rz) : x(rx), y(ry), z(rz),
|
||||||
|
mode(0), style(0), change(0), growth(0), duration(0) {}
|
||||||
|
sCinemaPath() : x(0), y(0), z(0), mode(0), style(0),
|
||||||
|
change(0), growth(0), duration(0) {}
|
||||||
|
|
||||||
|
AtlasMessage::sCinemaPath operator-(const AtlasMessage::sCinemaPath& path)
|
||||||
|
{
|
||||||
|
return AtlasMessage::sCinemaPath(x - path.x, y - path.y, z - path.z);
|
||||||
|
}
|
||||||
|
AtlasMessage::sCinemaPath operator+(const AtlasMessage::sCinemaPath& path)
|
||||||
|
{
|
||||||
|
return AtlasMessage::sCinemaPath(x + path.x, y + path.y, z + path.z);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
SHAREABLE_STRUCT(sCinemaPath);
|
||||||
|
|
||||||
|
struct sCinemaTrack
|
||||||
|
{
|
||||||
|
Shareable<std::wstring> name;
|
||||||
|
Shareable<float> x, y, z, timescale, duration;
|
||||||
|
Shareable<std::vector<AtlasMessage::sCinemaPath> > paths;
|
||||||
|
|
||||||
|
public:
|
||||||
|
sCinemaTrack(float rx, float ry, float rz, std::wstring track)
|
||||||
|
: x(rx), y(ry), z(rz), timescale(1.f), duration(0), name(track) {}
|
||||||
|
sCinemaTrack() : x(0), y(0), z(0), timescale(1.f), duration(0) {}
|
||||||
|
};
|
||||||
|
SHAREABLE_STRUCT(sCinemaTrack);
|
||||||
|
|
||||||
|
struct eCinemaEventMode { enum { SMOOTH, SELECT, IMMEDIATE_PATH, IMMEDIATE_TRACK }; };
|
||||||
|
struct sCameraInfo
|
||||||
|
{
|
||||||
|
Shareable<float> pX, pY, pZ, rX, rY, rZ; // position and rotation
|
||||||
|
};
|
||||||
|
SHAREABLE_STRUCT(sCameraInfo);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // SHAREDTYPES_H__
|
#endif // SHAREDTYPES_H__
|
||||||
|
165
source/tools/atlas/GameInterface/View.cpp
Normal file
165
source/tools/atlas/GameInterface/View.cpp
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
#include "precompiled.h"
|
||||||
|
|
||||||
|
#include "View.h"
|
||||||
|
|
||||||
|
#include "ActorViewer.h"
|
||||||
|
#include "GameLoop.h"
|
||||||
|
|
||||||
|
#include "ps/Game.h"
|
||||||
|
#include "ps/GameSetup/GameSetup.h"
|
||||||
|
#include "simulation/EntityManager.h"
|
||||||
|
#include "simulation/Simulation.h"
|
||||||
|
|
||||||
|
extern void (*Atlas_GLSwapBuffers)(void* context);
|
||||||
|
|
||||||
|
extern int g_xres, g_yres;
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class ViewNone : public View
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void Update(float) { }
|
||||||
|
virtual void Render() { }
|
||||||
|
virtual CCamera& GetCamera() { return dummyCamera; }
|
||||||
|
virtual bool WantsHighFramerate() { return false; }
|
||||||
|
private:
|
||||||
|
CCamera dummyCamera;
|
||||||
|
};
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
ViewActor::ViewActor()
|
||||||
|
: m_SpeedMultiplier(1.f), m_ActorViewer(new ActorViewer())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ViewActor::~ViewActor()
|
||||||
|
{
|
||||||
|
delete m_ActorViewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ViewActor::Update(float frameLength)
|
||||||
|
{
|
||||||
|
m_ActorViewer->Update(frameLength * m_SpeedMultiplier);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ViewActor::Render()
|
||||||
|
{
|
||||||
|
SViewPort vp = { 0, 0, g_xres, g_yres };
|
||||||
|
CCamera& camera = GetCamera();
|
||||||
|
camera.SetViewPort(&vp);
|
||||||
|
camera.SetProjection(CGameView::defaultNear, CGameView::defaultFar, CGameView::defaultFOV);
|
||||||
|
camera.UpdateFrustum();
|
||||||
|
|
||||||
|
m_ActorViewer->Render();
|
||||||
|
Atlas_GLSwapBuffers((void*)g_GameLoop->glContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
CCamera& ViewActor::GetCamera()
|
||||||
|
{
|
||||||
|
return m_Camera;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ViewActor::WantsHighFramerate()
|
||||||
|
{
|
||||||
|
if (m_SpeedMultiplier != 0.f)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ViewActor::SetSpeedMultiplier(float speed)
|
||||||
|
{
|
||||||
|
m_SpeedMultiplier = speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
ActorViewer& ViewActor::GetActorViewer()
|
||||||
|
{
|
||||||
|
return *m_ActorViewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
namespace AtlasMessage
|
||||||
|
{
|
||||||
|
extern void AtlasRenderSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
ViewGame::ViewGame()
|
||||||
|
{
|
||||||
|
debug_assert(g_Game);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ViewGame::Update(float frameLength)
|
||||||
|
{
|
||||||
|
g_EntityManager.updateAll(0);
|
||||||
|
g_Game->GetSimulation()->Update(0.0);
|
||||||
|
|
||||||
|
if (g_Game->GetView()->GetCinema()->IsPlaying())
|
||||||
|
g_Game->GetView()->GetCinema()->Update(frameLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ViewGame::Render()
|
||||||
|
{
|
||||||
|
SViewPort vp = { 0, 0, g_xres, g_yres };
|
||||||
|
CCamera& camera = GetCamera();
|
||||||
|
camera.SetViewPort(&vp);
|
||||||
|
camera.SetProjection(CGameView::defaultNear, CGameView::defaultFar, CGameView::defaultFOV);
|
||||||
|
camera.UpdateFrustum();
|
||||||
|
|
||||||
|
::Render();
|
||||||
|
AtlasMessage::AtlasRenderSelection();
|
||||||
|
Atlas_GLSwapBuffers((void*)g_GameLoop->glContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
CCamera& ViewGame::GetCamera()
|
||||||
|
{
|
||||||
|
return *g_Game->GetView()->GetCamera();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ViewGame::WantsHighFramerate()
|
||||||
|
{
|
||||||
|
if (g_Game->GetView()->GetCinema()->IsPlaying())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
ViewNone* view_None = NULL;
|
||||||
|
ViewGame* view_Game = NULL;
|
||||||
|
ViewActor* view_Actor = NULL;
|
||||||
|
|
||||||
|
View::~View()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
View* View::GetView_None()
|
||||||
|
{
|
||||||
|
if (! view_None)
|
||||||
|
view_None = new ViewNone();
|
||||||
|
return view_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
ViewGame* View::GetView_Game()
|
||||||
|
{
|
||||||
|
if (! view_Game)
|
||||||
|
view_Game = new ViewGame();
|
||||||
|
return view_Game;
|
||||||
|
}
|
||||||
|
|
||||||
|
ViewActor* View::GetView_Actor()
|
||||||
|
{
|
||||||
|
if (! view_Actor)
|
||||||
|
view_Actor = new ViewActor();
|
||||||
|
return view_Actor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void View::DestroyViews()
|
||||||
|
{
|
||||||
|
delete view_None; view_None = NULL;
|
||||||
|
delete view_Game; view_Game = NULL;
|
||||||
|
delete view_Actor; view_Actor = NULL;
|
||||||
|
}
|
62
source/tools/atlas/GameInterface/View.h
Normal file
62
source/tools/atlas/GameInterface/View.h
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#ifndef VIEW_H__
|
||||||
|
#define VIEW_H__
|
||||||
|
|
||||||
|
class ViewGame;
|
||||||
|
class ViewActor;
|
||||||
|
|
||||||
|
class View
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~View();
|
||||||
|
virtual void Update(float frameLength) = 0;
|
||||||
|
virtual void Render() = 0;
|
||||||
|
virtual CCamera& GetCamera() = 0;
|
||||||
|
virtual bool WantsHighFramerate() = 0;
|
||||||
|
|
||||||
|
// These always return a valid (not NULL) object
|
||||||
|
static View* GetView_None();
|
||||||
|
static ViewGame* GetView_Game();
|
||||||
|
static ViewActor* GetView_Actor();
|
||||||
|
|
||||||
|
// Invalidates any View objects previously returned by this class
|
||||||
|
static void DestroyViews();
|
||||||
|
};
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class ActorViewer;
|
||||||
|
|
||||||
|
class ViewGame : public View
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ViewGame();
|
||||||
|
virtual void Update(float frameLength);
|
||||||
|
virtual void Render();
|
||||||
|
virtual CCamera& GetCamera();
|
||||||
|
virtual bool WantsHighFramerate();
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
class ViewActor : public View
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ViewActor();
|
||||||
|
~ViewActor();
|
||||||
|
|
||||||
|
virtual void Update(float frameLength);
|
||||||
|
virtual void Render();
|
||||||
|
virtual CCamera& GetCamera();
|
||||||
|
virtual bool WantsHighFramerate();
|
||||||
|
|
||||||
|
void SetSpeedMultiplier(float speed);
|
||||||
|
ActorViewer& GetActorViewer();
|
||||||
|
|
||||||
|
private:
|
||||||
|
float m_SpeedMultiplier;
|
||||||
|
CCamera m_Camera;
|
||||||
|
ActorViewer* m_ActorViewer;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // VIEW_H__
|
Loading…
Reference in New Issue
Block a user