From: <tz...@us...> - 2007-11-29 05:00:54
|
Revision: 2256 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2256&view=rev Author: tzlaine Date: 2007-11-28 21:00:59 -0800 (Wed, 28 Nov 2007) Log Message: ----------- Added a second Durgha model to the test scene, and added support for recentering on each ship by clicking on it. Modified Paths: -------------- branches/ogre-integration/UI/CombatWnd.cpp branches/ogre-integration/UI/CombatWnd.h Modified: branches/ogre-integration/UI/CombatWnd.cpp =================================================================== --- branches/ogre-integration/UI/CombatWnd.cpp 2007-11-29 02:52:45 UTC (rev 2255) +++ branches/ogre-integration/UI/CombatWnd.cpp 2007-11-29 05:00:59 UTC (rev 2256) @@ -8,6 +8,7 @@ #include <OgreMeshManager.h> #include <OgreRoot.h> #include <OgreSceneManager.h> +#include <OgreSceneQuery.h> #include <GG/GUI.h> @@ -22,28 +23,32 @@ m_scene_manager(scene_manager), m_camera(camera), m_viewport(viewport), + m_ray_scene_query(m_scene_manager->createRayQuery(Ogre::Ray())), m_distance_to_lookat_point(m_camera->getPosition().length()), m_pitch(0.0), m_yaw(0.0), m_last_pos(), + m_mouse_dragged(false), + m_currently_selected_scene_node(0), + m_lookat_point(0, 0, 0), m_exit(false) { Ogre::Root::getSingleton().addFrameListener(this); + m_ray_scene_query->setSortByDistance(true); + // Load resource paths from config file Ogre::ConfigFile cf; cf.load((ClientUI::ArtDir() / "combat" / "resources.cfg").native_file_string()); // Go through all sections & settings in the file Ogre::ConfigFile::SectionIterator section_it = cf.getSectionIterator(); - while (section_it.hasMoreElements()) - { + while (section_it.hasMoreElements()) { Ogre::String section_name = section_it.peekNextKey(); Ogre::ConfigFile::SettingsMultiMap *settings = section_it.getNext(); for (Ogre::ConfigFile::SettingsMultiMap::iterator it = settings->begin(); it != settings->end(); - ++it) - { + ++it) { Ogre::String type_name = it->first, path_name = it->second; Ogre::ResourceGroupManager::getSingleton().addResourceLocation( (ClientUI::ArtDir() / path_name).native_file_string(), @@ -61,17 +66,25 @@ m_scene_manager->setSkyBox(true, "backgrounds/sky_box_1", 50); - // Put an "Durgha" ship model in the middle + // Load the "Durgha" ship mesh Ogre::MeshPtr m = Ogre::MeshManager::getSingleton().load( "durgha.mesh", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); - Ogre::Entity* e = m_scene_manager->createEntity("durgha", "durgha.mesh"); - e->setCastShadows(true); - m_durgha_node = m_scene_manager->getRootSceneNode()->createChildSceneNode("durgha node"); - m_durgha_node->setDirection(0, -1, 0); - m_durgha_node->yaw(Ogre::Radian(Ogre::Math::PI)); - m_durgha_node->attachObject(e); + // Put a few Durghas into the scene + Ogre::Entity* entity = m_scene_manager->createEntity("lead durgha", "durgha.mesh"); + entity->setCastShadows(true); + Ogre::SceneNode* lead_durgha_node = m_scene_manager->getRootSceneNode()->createChildSceneNode("lead durgha node"); + lead_durgha_node->setDirection(0, -1, 0); + lead_durgha_node->yaw(Ogre::Radian(Ogre::Math::PI)); + lead_durgha_node->attachObject(entity); + + entity = m_scene_manager->createEntity("wing durgha 1", "durgha.mesh"); + entity->setCastShadows(true); + Ogre::SceneNode* durgha_node = lead_durgha_node->createChildSceneNode("wing durgha 1 node"); + durgha_node->attachObject(entity); + durgha_node->setPosition(250, 250, 0); + m_scene_manager->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5)); m_scene_manager->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE); Ogre::Light* star = m_scene_manager->createLight("Star"); @@ -80,37 +93,36 @@ } CombatWnd::~CombatWnd() -{ Ogre::Root::getSingleton().removeFrameListener(this); } +{ + Ogre::Root::getSingleton().removeFrameListener(this); + m_scene_manager->destroyQuery(m_ray_scene_query); +} void CombatWnd::LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) -{ m_last_pos = GG::Pt(); } +{ + m_last_pos = pt; + m_mouse_dragged = false; +} void CombatWnd::LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) { - if (m_last_pos == GG::Pt()) - m_last_pos = pt - move; - GG::Pt delta_pos = pt - m_last_pos; m_last_pos = pt; - // set position to look-at point - m_camera->setPosition(Ogre::Vector3()); // TODO (leave it at the origin for now) - - // set orientation - m_camera->setDirection(-Ogre::Vector3::UNIT_Z); - Ogre::Radian delta_pitch = -delta_pos.y * 1.0 / GG::GUI::GetGUI()->AppHeight() * Ogre::Radian(Ogre::Math::PI); + Ogre::Radian delta_pitch = + -delta_pos.y * 1.0 / GG::GUI::GetGUI()->AppHeight() * Ogre::Radian(Ogre::Math::PI); m_pitch += delta_pitch; if (m_pitch < Ogre::Radian(-Ogre::Math::HALF_PI)) m_pitch = Ogre::Radian(-Ogre::Math::HALF_PI); if (Ogre::Radian(Ogre::Math::HALF_PI) < m_pitch) m_pitch = Ogre::Radian(Ogre::Math::HALF_PI); - m_camera->pitch(m_pitch); - Ogre::Radian delta_yaw = -delta_pos.x * 1.0 / GG::GUI::GetGUI()->AppWidth() * Ogre::Radian(Ogre::Math::PI); + Ogre::Radian delta_yaw = + -delta_pos.x * 1.0 / GG::GUI::GetGUI()->AppWidth() * Ogre::Radian(Ogre::Math::PI); m_yaw += delta_yaw; - m_camera->yaw(m_yaw); - // back up to final position - m_camera->moveRelative(Ogre::Vector3(0, 0, m_distance_to_lookat_point)); + UpdateCameraPosition(); + + m_mouse_dragged = true; } void CombatWnd::LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) @@ -118,15 +130,19 @@ void CombatWnd::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { -#if 0 // this was a test to see how easy it is to clean up the Ogre scene graph in order to go back to GG-only mode - if (m_durgha_node->isInSceneGraph()) { - m_scene_manager->getRootSceneNode()->removeChild(m_durgha_node); - m_scene_manager->setSkyBox(false, "backgrounds/sky_box_1"); - } else { - m_scene_manager->getRootSceneNode()->addChild(m_durgha_node); - m_scene_manager->setSkyBox(true, "backgrounds/sky_box_1", 50); + if (!m_mouse_dragged) { + Ogre::Ray ray = m_camera->getCameraToViewportRay(pt.x * 1.0 / GG::GUI::GetGUI()->AppWidth(), + pt.y * 1.0 / GG::GUI::GetGUI()->AppHeight()); + m_ray_scene_query->setRay(ray); + Ogre::RaySceneQueryResult &result = m_ray_scene_query->execute(); + if (result.begin() != result.end() && result.begin()->movable) { + Ogre::SceneNode* clicked_scene_node = result.begin()->movable->getParentSceneNode(); + assert(clicked_scene_node); + m_currently_selected_scene_node = clicked_scene_node; + m_lookat_point = m_currently_selected_scene_node->getWorldPosition(); + UpdateCameraPosition(); + } } -#endif } void CombatWnd::LDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) @@ -161,4 +177,19 @@ } bool CombatWnd::frameStarted(const Ogre::FrameEvent &event) -{ return !m_exit; } +{ + if (m_currently_selected_scene_node) { + m_lookat_point = m_currently_selected_scene_node->getWorldPosition(); + UpdateCameraPosition(); + } + return !m_exit; +} + +void CombatWnd::UpdateCameraPosition() +{ + m_camera->setPosition(m_lookat_point); + m_camera->setDirection(Ogre::Vector3::NEGATIVE_UNIT_Z); + m_camera->pitch(m_pitch); + m_camera->yaw(m_yaw); + m_camera->moveRelative(Ogre::Vector3(0, 0, m_distance_to_lookat_point)); +} Modified: branches/ogre-integration/UI/CombatWnd.h =================================================================== --- branches/ogre-integration/UI/CombatWnd.h 2007-11-29 02:52:45 UTC (rev 2255) +++ branches/ogre-integration/UI/CombatWnd.h 2007-11-29 05:00:59 UTC (rev 2256) @@ -4,12 +4,14 @@ #include <OgreFrameListener.h> #include <OgreMath.h> +#include <OgreVector3.h> #include <GG/Wnd.h> namespace Ogre { class Camera; + class RaySceneQuery; class SceneManager; class SceneNode; class Viewport; @@ -38,15 +40,20 @@ private: virtual bool frameStarted(const Ogre::FrameEvent &event); + void UpdateCameraPosition(); + Ogre::SceneManager* m_scene_manager; Ogre::Camera* m_camera; Ogre::Viewport* m_viewport; - Ogre::SceneNode* m_durgha_node; + Ogre::RaySceneQuery* m_ray_scene_query; Ogre::Real m_distance_to_lookat_point; Ogre::Radian m_pitch; Ogre::Radian m_yaw; GG::Pt m_last_pos; + bool m_mouse_dragged; + Ogre::SceneNode* m_currently_selected_scene_node; + Ogre::Vector3 m_lookat_point; bool m_exit; // TODO: Remove this; it is only here for prototyping. }; |
From: <tz...@us...> - 2007-11-30 22:43:59
|
Revision: 2257 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2257&view=rev Author: tzlaine Date: 2007-11-30 14:43:53 -0800 (Fri, 30 Nov 2007) Log Message: ----------- Implemented drag-selection of multiple objects in CombatWnd. Modified Paths: -------------- branches/ogre-integration/UI/CombatWnd.cpp branches/ogre-integration/UI/CombatWnd.h Modified: branches/ogre-integration/UI/CombatWnd.cpp =================================================================== --- branches/ogre-integration/UI/CombatWnd.cpp 2007-11-29 05:00:59 UTC (rev 2256) +++ branches/ogre-integration/UI/CombatWnd.cpp 2007-11-30 22:43:53 UTC (rev 2257) @@ -1,19 +1,67 @@ #include "CombatWnd.h" #include "ClientUI.h" +#include "../util/Version.h" #include <OgreCamera.h> #include <OgreConfigFile.h> #include <OgreEntity.h> #include <OgreMeshManager.h> #include <OgreRoot.h> +#include <OgreRenderTarget.h> #include <OgreSceneManager.h> #include <OgreSceneQuery.h> #include <GG/GUI.h> +namespace { + const GG::Pt INVALID_SHIFT_DRAG_POS(-1, -1); +} + //////////////////////////////////////////////////////////// +// SelectionRect +//////////////////////////////////////////////////////////// +CombatWnd::SelectionRect::SelectionRect() : + ManualObject("SelectionRect") +{ + setUseIdentityProjection(true); + setUseIdentityView(true); + setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); + setQueryFlags(0); +} + +void CombatWnd::SelectionRect::Resize(const GG::Pt& pt1, const GG::Pt& pt2) +{ + const float APP_WIDTH = GG::GUI::GetGUI()->AppWidth(); + const float APP_HEIGHT = GG::GUI::GetGUI()->AppHeight(); + + float left = std::min(pt1.x, pt2.x) / APP_WIDTH; + float right = std::max(pt1.x, pt2.x) / APP_WIDTH; + float top = std::min(pt1.y, pt2.y) / APP_HEIGHT; + float bottom = std::max(pt1.y, pt2.y) / APP_HEIGHT; + + left = left * 2 - 1; + right = right * 2 - 1; + top = 1 - top * 2; + bottom = 1 - bottom * 2; + + clear(); + begin("", Ogre::RenderOperation::OT_LINE_STRIP); + position(left, top, -1); + position(right, top, -1); + position(right, bottom, -1); + position(left, bottom, -1); + position(left, top, -1); + end(); + + Ogre::AxisAlignedBox box; + box.setInfinite(); + setBoundingBox(box); +} + + +//////////////////////////////////////////////////////////// // CombatWnd //////////////////////////////////////////////////////////// CombatWnd::CombatWnd(Ogre::SceneManager* scene_manager, @@ -24,12 +72,16 @@ m_camera(camera), m_viewport(viewport), m_ray_scene_query(m_scene_manager->createRayQuery(Ogre::Ray())), + m_volume_scene_query(m_scene_manager->createPlaneBoundedVolumeQuery(Ogre::PlaneBoundedVolumeList())), m_distance_to_lookat_point(m_camera->getPosition().length()), m_pitch(0.0), m_yaw(0.0), m_last_pos(), + m_shift_drag_start(INVALID_SHIFT_DRAG_POS), + m_shift_drag_stop(INVALID_SHIFT_DRAG_POS), m_mouse_dragged(false), m_currently_selected_scene_node(0), + m_selection_rect(new SelectionRect), m_lookat_point(0, 0, 0), m_exit(false) { @@ -59,6 +111,7 @@ // Initialise, parse scripts etc Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); + m_scene_manager->getRootSceneNode()->createChildSceneNode()->attachObject(m_selection_rect); ////////////////////////////////////////////////////////////////// // NOTE: Below is temporary code for combat system prototyping! // @@ -96,6 +149,8 @@ { Ogre::Root::getSingleton().removeFrameListener(this); m_scene_manager->destroyQuery(m_ray_scene_query); + m_scene_manager->destroyQuery(m_volume_scene_query); + delete m_selection_rect; } void CombatWnd::LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) @@ -107,34 +162,60 @@ void CombatWnd::LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) { GG::Pt delta_pos = pt - m_last_pos; - m_last_pos = pt; + if (m_mouse_dragged || + GG::GUI::GetGUI()->MinDragDistance() * GG::GUI::GetGUI()->MinDragDistance() < + delta_pos.x * delta_pos.x + delta_pos.y * delta_pos.y) { + if (mod_keys & GG::MOD_KEY_SHIFT) { + if (m_shift_drag_start == INVALID_SHIFT_DRAG_POS) { + m_shift_drag_start = pt; + m_selection_rect->setVisible(true); + m_selection_rect->clear(); + } else { + m_shift_drag_stop = pt; + m_selection_rect->Resize(m_shift_drag_start, m_shift_drag_stop); + } + } else { + if (m_shift_drag_start != INVALID_SHIFT_DRAG_POS) { + m_shift_drag_start = INVALID_SHIFT_DRAG_POS; + m_selection_rect->clear(); + } - Ogre::Radian delta_pitch = - -delta_pos.y * 1.0 / GG::GUI::GetGUI()->AppHeight() * Ogre::Radian(Ogre::Math::PI); - m_pitch += delta_pitch; - if (m_pitch < Ogre::Radian(-Ogre::Math::HALF_PI)) - m_pitch = Ogre::Radian(-Ogre::Math::HALF_PI); - if (Ogre::Radian(Ogre::Math::HALF_PI) < m_pitch) - m_pitch = Ogre::Radian(Ogre::Math::HALF_PI); - Ogre::Radian delta_yaw = - -delta_pos.x * 1.0 / GG::GUI::GetGUI()->AppWidth() * Ogre::Radian(Ogre::Math::PI); - m_yaw += delta_yaw; + m_last_pos = pt; - UpdateCameraPosition(); + Ogre::Radian delta_pitch = + -delta_pos.y * 1.0 / GG::GUI::GetGUI()->AppHeight() * Ogre::Radian(Ogre::Math::PI); + m_pitch += delta_pitch; + if (m_pitch < Ogre::Radian(-Ogre::Math::HALF_PI)) + m_pitch = Ogre::Radian(-Ogre::Math::HALF_PI); + if (Ogre::Radian(Ogre::Math::HALF_PI) < m_pitch) + m_pitch = Ogre::Radian(Ogre::Math::HALF_PI); + Ogre::Radian delta_yaw = + -delta_pos.x * 1.0 / GG::GUI::GetGUI()->AppWidth() * Ogre::Radian(Ogre::Math::PI); + m_yaw += delta_yaw; - m_mouse_dragged = true; + UpdateCameraPosition(); + + m_mouse_dragged = true; + } + } } void CombatWnd::LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) -{} +{ + if (m_shift_drag_start != INVALID_SHIFT_DRAG_POS) + EndShiftDrag(); +} void CombatWnd::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { - if (!m_mouse_dragged) { + if (m_shift_drag_start != INVALID_SHIFT_DRAG_POS) { + SelectObjectsInVolume(); + EndShiftDrag(); + } else if (!m_mouse_dragged) { Ogre::Ray ray = m_camera->getCameraToViewportRay(pt.x * 1.0 / GG::GUI::GetGUI()->AppWidth(), pt.y * 1.0 / GG::GUI::GetGUI()->AppHeight()); m_ray_scene_query->setRay(ray); - Ogre::RaySceneQueryResult &result = m_ray_scene_query->execute(); + Ogre::RaySceneQueryResult& result = m_ray_scene_query->execute(); if (result.begin() != result.end() && result.begin()->movable) { Ogre::SceneNode* clicked_scene_node = result.begin()->movable->getParentSceneNode(); assert(clicked_scene_node); @@ -176,12 +257,16 @@ m_exit = true; } -bool CombatWnd::frameStarted(const Ogre::FrameEvent &event) +bool CombatWnd::frameStarted(const Ogre::FrameEvent& event) { if (m_currently_selected_scene_node) { m_lookat_point = m_currently_selected_scene_node->getWorldPosition(); UpdateCameraPosition(); } +#if 0 // TODO: Remove this; it only here for profiling the number of triangles rendered. + Ogre::RenderTarget::FrameStats stats = Ogre::Root::getSingleton().getRenderTarget("FreeOrion " + FreeOrionVersionString())->getStatistics(); + std::cout << "tris: " << stats.triangleCount << " batches: " << stats.batchCount << std::endl; +#endif return !m_exit; } @@ -193,3 +278,56 @@ m_camera->yaw(m_yaw); m_camera->moveRelative(Ogre::Vector3(0, 0, m_distance_to_lookat_point)); } + +void CombatWnd::EndShiftDrag() +{ + m_shift_drag_start = INVALID_SHIFT_DRAG_POS; + m_selection_rect->setVisible(false); +} + +void CombatWnd::SelectObjectsInVolume() +{ + const float APP_WIDTH = GG::GUI::GetGUI()->AppWidth(); + const float APP_HEIGHT = GG::GUI::GetGUI()->AppHeight(); + + float left = std::min(m_shift_drag_start.x, m_shift_drag_stop.x) / APP_WIDTH; + float right = std::max(m_shift_drag_start.x, m_shift_drag_stop.x) / APP_WIDTH; + float top = std::min(m_shift_drag_start.y, m_shift_drag_stop.y) / APP_HEIGHT; + float bottom = std::max(m_shift_drag_start.y, m_shift_drag_stop.y) / APP_HEIGHT; + + const float MIN_SELECTION_VOLUME = 0.0001; + if ((right - left) * (bottom - top) < MIN_SELECTION_VOLUME) + return; + + Ogre::Ray ul = m_camera->getCameraToViewportRay(left, top); + Ogre::Ray ur = m_camera->getCameraToViewportRay(right, top); + Ogre::Ray ll = m_camera->getCameraToViewportRay(left, bottom); + Ogre::Ray lr = m_camera->getCameraToViewportRay(right, bottom); + + Ogre::PlaneBoundedVolume volume; + volume.planes.push_back( + Ogre::Plane(ul.getOrigin(), ur.getOrigin(), lr.getOrigin())); // front plane + volume.planes.push_back( + Ogre::Plane(ul.getOrigin(), ul.getPoint(1.0), ur.getPoint(1.0))); // top plane + volume.planes.push_back( + Ogre::Plane(ll.getOrigin(), lr.getPoint(1.0), ll.getPoint(1.0))); // bottom plane + volume.planes.push_back( + Ogre::Plane(ul.getOrigin(), ll.getPoint(1.0), ul.getPoint(1.0))); // left plane + volume.planes.push_back( + Ogre::Plane(ur.getOrigin(), ur.getPoint(1.0), lr.getPoint(1.0))); // right plane + + Ogre::PlaneBoundedVolumeList volume_list; + volume_list.push_back(volume); + m_volume_scene_query->setVolumes(volume_list); + Ogre::SceneQueryResult& result = m_volume_scene_query->execute(); + for (unsigned int i = 0; i < m_current_selections.size(); ++i) { + // TODO: Come up with a system for ensuring that the pointers in m_current_selections are not left dangling, so + // that deselection code like that below doesn't crash the app. + m_current_selections[i]->getParentSceneNode()->showBoundingBox(false); // TODO: Remove. + } + m_current_selections.clear(); + for (Ogre::SceneQueryResultMovableList::iterator it = result.movables.begin(); it != result.movables.end(); ++it) { + (*it)->getParentSceneNode()->showBoundingBox(true); // TODO: Remove. + m_current_selections.push_back(*it); + } +} Modified: branches/ogre-integration/UI/CombatWnd.h =================================================================== --- branches/ogre-integration/UI/CombatWnd.h 2007-11-29 05:00:59 UTC (rev 2256) +++ branches/ogre-integration/UI/CombatWnd.h 2007-11-30 22:43:53 UTC (rev 2257) @@ -3,6 +3,7 @@ #define _CombatWnd_h_ #include <OgreFrameListener.h> +#include <OgreManualObject.h> #include <OgreMath.h> #include <OgreVector3.h> @@ -15,6 +16,7 @@ class SceneManager; class SceneNode; class Viewport; + class PlaneBoundedVolumeListSceneQuery; } class CombatWnd : @@ -38,24 +40,38 @@ virtual void KeyPress(GG::Key key, GG::Flags<GG::ModKey> mod_keys); private: - virtual bool frameStarted(const Ogre::FrameEvent &event); + class SelectionRect : public Ogre::ManualObject + { + public: + SelectionRect(); + void Resize(const GG::Pt& pt1, const GG::Pt& pt2); + }; + virtual bool frameStarted(const Ogre::FrameEvent& event); + void UpdateCameraPosition(); + void EndShiftDrag(); + void SelectObjectsInVolume(); Ogre::SceneManager* m_scene_manager; Ogre::Camera* m_camera; Ogre::Viewport* m_viewport; Ogre::RaySceneQuery* m_ray_scene_query; + Ogre::PlaneBoundedVolumeListSceneQuery* m_volume_scene_query; Ogre::Real m_distance_to_lookat_point; Ogre::Radian m_pitch; Ogre::Radian m_yaw; GG::Pt m_last_pos; + GG::Pt m_shift_drag_start; + GG::Pt m_shift_drag_stop; bool m_mouse_dragged; Ogre::SceneNode* m_currently_selected_scene_node; + SelectionRect* m_selection_rect; Ogre::Vector3 m_lookat_point; bool m_exit; // TODO: Remove this; it is only here for prototyping. + std::vector<Ogre::MovableObject*> m_current_selections; }; #endif |
From: <tz...@us...> - 2007-12-01 00:16:09
|
Revision: 2258 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2258&view=rev Author: tzlaine Date: 2007-11-30 16:16:13 -0800 (Fri, 30 Nov 2007) Log Message: ----------- Changed the click and shift-dragging code so that selection now works like GG::ListBox -- Ctrl indicates toggle (whether from a shift-drag or click). Modified Paths: -------------- branches/ogre-integration/UI/CombatWnd.cpp branches/ogre-integration/UI/CombatWnd.h Modified: branches/ogre-integration/UI/CombatWnd.cpp =================================================================== --- branches/ogre-integration/UI/CombatWnd.cpp 2007-11-30 22:43:53 UTC (rev 2257) +++ branches/ogre-integration/UI/CombatWnd.cpp 2007-12-01 00:16:13 UTC (rev 2258) @@ -209,19 +209,31 @@ void CombatWnd::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (m_shift_drag_start != INVALID_SHIFT_DRAG_POS) { - SelectObjectsInVolume(); + SelectObjectsInVolume(mod_keys & GG::MOD_KEY_CTRL); EndShiftDrag(); } else if (!m_mouse_dragged) { - Ogre::Ray ray = m_camera->getCameraToViewportRay(pt.x * 1.0 / GG::GUI::GetGUI()->AppWidth(), - pt.y * 1.0 / GG::GUI::GetGUI()->AppHeight()); - m_ray_scene_query->setRay(ray); - Ogre::RaySceneQueryResult& result = m_ray_scene_query->execute(); - if (result.begin() != result.end() && result.begin()->movable) { - Ogre::SceneNode* clicked_scene_node = result.begin()->movable->getParentSceneNode(); + if (Ogre::MovableObject* movable_object = GetObjectUnderPt(pt)) { + Ogre::SceneNode* clicked_scene_node = movable_object->getParentSceneNode(); assert(clicked_scene_node); - m_currently_selected_scene_node = clicked_scene_node; - m_lookat_point = m_currently_selected_scene_node->getWorldPosition(); - UpdateCameraPosition(); + if (mod_keys & GG::MOD_KEY_CTRL) { + std::set<Ogre::MovableObject*>::iterator it = m_current_selections.find(movable_object); + if (it == m_current_selections.end()) { + movable_object->getParentSceneNode()->showBoundingBox(true); // TODO: Replace. + m_current_selections.insert(movable_object); + } else { + (*it)->getParentSceneNode()->showBoundingBox(false); // TODO: Replace. + m_current_selections.erase(it); + } + } else { + DeselectAll(); + movable_object->getParentSceneNode()->showBoundingBox(true); // TODO: Replace. + m_current_selections.insert(movable_object); + m_currently_selected_scene_node = clicked_scene_node; + m_lookat_point = m_currently_selected_scene_node->getWorldPosition(); + UpdateCameraPosition(); + } + } else { + DeselectAll(); } } } @@ -285,7 +297,7 @@ m_selection_rect->setVisible(false); } -void CombatWnd::SelectObjectsInVolume() +void CombatWnd::SelectObjectsInVolume(bool toggle_selected_items) { const float APP_WIDTH = GG::GUI::GetGUI()->AppWidth(); const float APP_HEIGHT = GG::GUI::GetGUI()->AppHeight(); @@ -319,15 +331,38 @@ Ogre::PlaneBoundedVolumeList volume_list; volume_list.push_back(volume); m_volume_scene_query->setVolumes(volume_list); + if (!toggle_selected_items) + DeselectAll(); Ogre::SceneQueryResult& result = m_volume_scene_query->execute(); - for (unsigned int i = 0; i < m_current_selections.size(); ++i) { + for (Ogre::SceneQueryResultMovableList::iterator it = result.movables.begin(); it != result.movables.end(); ++it) { + std::pair<std::set<Ogre::MovableObject*>::iterator, bool> insertion_result = m_current_selections.insert(*it); + if (insertion_result.second) { + (*it)->getParentSceneNode()->showBoundingBox(true); // TODO: Remove. + } else { + (*insertion_result.first)->getParentSceneNode()->showBoundingBox(false); // TODO: Remove. + m_current_selections.erase(insertion_result.first); + } + } +} + +Ogre::MovableObject* CombatWnd::GetObjectUnderPt(const GG::Pt& pt) +{ + Ogre::MovableObject* retval = 0; + Ogre::Ray ray = m_camera->getCameraToViewportRay(pt.x * 1.0 / GG::GUI::GetGUI()->AppWidth(), + pt.y * 1.0 / GG::GUI::GetGUI()->AppHeight()); + m_ray_scene_query->setRay(ray); + Ogre::RaySceneQueryResult& result = m_ray_scene_query->execute(); + if (result.begin() != result.end()) + retval = result.begin()->movable; + return retval; +} + +void CombatWnd::DeselectAll() +{ + for (std::set<Ogre::MovableObject*>::iterator it = m_current_selections.begin(); it != m_current_selections.end(); ++it) { // TODO: Come up with a system for ensuring that the pointers in m_current_selections are not left dangling, so // that deselection code like that below doesn't crash the app. - m_current_selections[i]->getParentSceneNode()->showBoundingBox(false); // TODO: Remove. + (*it)->getParentSceneNode()->showBoundingBox(false); // TODO: Replace. } m_current_selections.clear(); - for (Ogre::SceneQueryResultMovableList::iterator it = result.movables.begin(); it != result.movables.end(); ++it) { - (*it)->getParentSceneNode()->showBoundingBox(true); // TODO: Remove. - m_current_selections.push_back(*it); - } } Modified: branches/ogre-integration/UI/CombatWnd.h =================================================================== --- branches/ogre-integration/UI/CombatWnd.h 2007-11-30 22:43:53 UTC (rev 2257) +++ branches/ogre-integration/UI/CombatWnd.h 2007-12-01 00:16:13 UTC (rev 2258) @@ -12,6 +12,7 @@ namespace Ogre { class Camera; + class MovableObject; class RaySceneQuery; class SceneManager; class SceneNode; @@ -51,7 +52,9 @@ void UpdateCameraPosition(); void EndShiftDrag(); - void SelectObjectsInVolume(); + void SelectObjectsInVolume(bool toggle_selected_items); + Ogre::MovableObject* GetObjectUnderPt(const GG::Pt& pt); + void DeselectAll(); Ogre::SceneManager* m_scene_manager; Ogre::Camera* m_camera; @@ -69,9 +72,9 @@ Ogre::SceneNode* m_currently_selected_scene_node; SelectionRect* m_selection_rect; Ogre::Vector3 m_lookat_point; + std::set<Ogre::MovableObject*> m_current_selections; bool m_exit; // TODO: Remove this; it is only here for prototyping. - std::vector<Ogre::MovableObject*> m_current_selections; }; #endif |
From: <tz...@us...> - 2008-03-04 01:34:04
|
Revision: 2371 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2371&view=rev Author: tzlaine Date: 2008-03-03 17:34:05 -0800 (Mon, 03 Mar 2008) Log Message: ----------- Updated CombatWnd to use GG's new middle-dragging abilities to rotate the view. Modified Paths: -------------- branches/ogre-integration/UI/CombatWnd.cpp branches/ogre-integration/UI/CombatWnd.h Modified: branches/ogre-integration/UI/CombatWnd.cpp =================================================================== --- branches/ogre-integration/UI/CombatWnd.cpp 2008-03-03 05:10:11 UTC (rev 2370) +++ branches/ogre-integration/UI/CombatWnd.cpp 2008-03-04 01:34:05 UTC (rev 2371) @@ -17,7 +17,7 @@ namespace { - const GG::Pt INVALID_SHIFT_DRAG_POS(-1, -1); + const GG::Pt INVALID_SELECTION_DRAG_POS(-1, -1); } //////////////////////////////////////////////////////////// @@ -78,8 +78,8 @@ m_pitch(0.0), m_yaw(0.0), m_last_pos(), - m_shift_drag_start(INVALID_SHIFT_DRAG_POS), - m_shift_drag_stop(INVALID_SHIFT_DRAG_POS), + m_selection_drag_start(INVALID_SELECTION_DRAG_POS), + m_selection_drag_stop(INVALID_SELECTION_DRAG_POS), m_mouse_dragged(false), m_currently_selected_scene_node(0), m_selection_rect(new SelectionRect), @@ -185,50 +185,27 @@ if (m_mouse_dragged || GG::GUI::GetGUI()->MinDragDistance() * GG::GUI::GetGUI()->MinDragDistance() < delta_pos.x * delta_pos.x + delta_pos.y * delta_pos.y) { - if (mod_keys & GG::MOD_KEY_SHIFT) { - if (m_shift_drag_start == INVALID_SHIFT_DRAG_POS) { - m_shift_drag_start = pt; - m_selection_rect->setVisible(true); - m_selection_rect->clear(); - } else { - m_shift_drag_stop = pt; - m_selection_rect->Resize(m_shift_drag_start, m_shift_drag_stop); - } + if (m_selection_drag_start == INVALID_SELECTION_DRAG_POS) { + m_selection_drag_start = pt; + m_selection_rect->setVisible(true); + m_selection_rect->clear(); } else { - if (m_shift_drag_start != INVALID_SHIFT_DRAG_POS) { - m_shift_drag_start = INVALID_SHIFT_DRAG_POS; - m_selection_rect->clear(); - } - - m_last_pos = pt; - - Ogre::Radian delta_pitch = - -delta_pos.y * 1.0 / GG::GUI::GetGUI()->AppHeight() * Ogre::Radian(Ogre::Math::PI); - m_pitch += delta_pitch; - if (m_pitch < Ogre::Radian(-Ogre::Math::HALF_PI)) - m_pitch = Ogre::Radian(-Ogre::Math::HALF_PI); - if (Ogre::Radian(Ogre::Math::HALF_PI) < m_pitch) - m_pitch = Ogre::Radian(Ogre::Math::HALF_PI); - Ogre::Radian delta_yaw = - -delta_pos.x * 1.0 / GG::GUI::GetGUI()->AppWidth() * Ogre::Radian(Ogre::Math::PI); - m_yaw += delta_yaw; - - UpdateCameraPosition(); - - m_mouse_dragged = true; + m_selection_drag_stop = pt; + m_selection_rect->Resize(m_selection_drag_start, m_selection_drag_stop); } + m_mouse_dragged = true; } } void CombatWnd::LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { - if (m_shift_drag_start != INVALID_SHIFT_DRAG_POS) + if (m_selection_drag_start != INVALID_SELECTION_DRAG_POS) EndShiftDrag(); } void CombatWnd::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { - if (m_shift_drag_start != INVALID_SHIFT_DRAG_POS) { + if (m_selection_drag_start != INVALID_SELECTION_DRAG_POS) { SelectObjectsInVolume(mod_keys & GG::MOD_KEY_CTRL); EndShiftDrag(); } else if (!m_mouse_dragged) { @@ -259,14 +236,72 @@ } void CombatWnd::LDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) -{} +{ +} +void CombatWnd::MButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) +{ + m_last_pos = pt; + m_mouse_dragged = false; +} + +void CombatWnd::MDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) +{ + GG::Pt delta_pos = pt - m_last_pos; + if (m_mouse_dragged || + GG::GUI::GetGUI()->MinDragDistance() * GG::GUI::GetGUI()->MinDragDistance() < + delta_pos.x * delta_pos.x + delta_pos.y * delta_pos.y) { + m_last_pos = pt; + + Ogre::Radian delta_pitch = + -delta_pos.y * 1.0 / GG::GUI::GetGUI()->AppHeight() * Ogre::Radian(Ogre::Math::PI); + m_pitch += delta_pitch; + if (m_pitch < Ogre::Radian(-Ogre::Math::HALF_PI)) + m_pitch = Ogre::Radian(-Ogre::Math::HALF_PI); + if (Ogre::Radian(Ogre::Math::HALF_PI) < m_pitch) + m_pitch = Ogre::Radian(Ogre::Math::HALF_PI); + Ogre::Radian delta_yaw = + -delta_pos.x * 1.0 / GG::GUI::GetGUI()->AppWidth() * Ogre::Radian(Ogre::Math::PI); + m_yaw += delta_yaw; + + UpdateCameraPosition(); + + m_mouse_dragged = true; + } +} + +void CombatWnd::MButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) +{ +} + +void CombatWnd::MClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) +{ +} + +void CombatWnd::MDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) +{ +} + void CombatWnd::RButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) -{} +{ +} +void CombatWnd::RDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) +{ +} + +void CombatWnd::RButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) +{ +} + void CombatWnd::RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) -{} +{ +} +void CombatWnd::RDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) +{ +} + void CombatWnd::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { const Ogre::Real c_move_incr = 10.0; @@ -313,7 +348,7 @@ void CombatWnd::EndShiftDrag() { - m_shift_drag_start = INVALID_SHIFT_DRAG_POS; + m_selection_drag_start = INVALID_SELECTION_DRAG_POS; m_selection_rect->setVisible(false); } @@ -322,10 +357,10 @@ const float APP_WIDTH = GG::GUI::GetGUI()->AppWidth(); const float APP_HEIGHT = GG::GUI::GetGUI()->AppHeight(); - float left = std::min(m_shift_drag_start.x, m_shift_drag_stop.x) / APP_WIDTH; - float right = std::max(m_shift_drag_start.x, m_shift_drag_stop.x) / APP_WIDTH; - float top = std::min(m_shift_drag_start.y, m_shift_drag_stop.y) / APP_HEIGHT; - float bottom = std::max(m_shift_drag_start.y, m_shift_drag_stop.y) / APP_HEIGHT; + float left = std::min(m_selection_drag_start.x, m_selection_drag_stop.x) / APP_WIDTH; + float right = std::max(m_selection_drag_start.x, m_selection_drag_stop.x) / APP_WIDTH; + float top = std::min(m_selection_drag_start.y, m_selection_drag_stop.y) / APP_HEIGHT; + float bottom = std::max(m_selection_drag_start.y, m_selection_drag_stop.y) / APP_HEIGHT; const float MIN_SELECTION_VOLUME = 0.0001; if ((right - left) * (bottom - top) < MIN_SELECTION_VOLUME) Modified: branches/ogre-integration/UI/CombatWnd.h =================================================================== --- branches/ogre-integration/UI/CombatWnd.h 2008-03-03 05:10:11 UTC (rev 2370) +++ branches/ogre-integration/UI/CombatWnd.h 2008-03-04 01:34:05 UTC (rev 2371) @@ -35,8 +35,16 @@ virtual void LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void LDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void MButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void MDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys); + virtual void MButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void MClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void MDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void RButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void RDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys); + virtual void RButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void RDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys); virtual void KeyPress(GG::Key key, GG::Flags<GG::ModKey> mod_keys); @@ -66,8 +74,8 @@ Ogre::Radian m_pitch; Ogre::Radian m_yaw; GG::Pt m_last_pos; - GG::Pt m_shift_drag_start; - GG::Pt m_shift_drag_stop; + GG::Pt m_selection_drag_start; + GG::Pt m_selection_drag_stop; bool m_mouse_dragged; Ogre::SceneNode* m_currently_selected_scene_node; SelectionRect* m_selection_rect; |
From: <tz...@us...> - 2008-03-06 03:44:09
|
Revision: 2380 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2380&view=rev Author: tzlaine Date: 2008-03-05 19:44:15 -0800 (Wed, 05 Mar 2008) Log Message: ----------- Added initial code to render the star in the system, and changed the zooming to be exponential in scale, for more natural zooming. There are still serious problems that occur when zoomed out too far. Modified Paths: -------------- branches/ogre-integration/UI/CombatWnd.cpp branches/ogre-integration/UI/CombatWnd.h Modified: branches/ogre-integration/UI/CombatWnd.cpp =================================================================== --- branches/ogre-integration/UI/CombatWnd.cpp 2008-03-05 15:02:48 UTC (rev 2379) +++ branches/ogre-integration/UI/CombatWnd.cpp 2008-03-06 03:44:15 UTC (rev 2380) @@ -3,6 +3,7 @@ #include "ClientUI.h" #include "../util/Version.h" +#include <OgreBillboardSet.h> #include <OgreCamera.h> #include <OgreConfigFile.h> #include <OgreEntity.h> @@ -18,6 +19,53 @@ namespace { const GG::Pt INVALID_SELECTION_DRAG_POS(-1, -1); + + const double NEAR_CLIP = 1.0; // km + const double FAR_CLIP = 1e9; // km + + const double CELESTIAL_OBJECT_SCALE_FACTOR = 1.0; + const double NONCELESTIAL_OBJECT_SCALE_FACTOR = 1.0; + + // TODO: These are for testing only. + const double EARTH_RADIUS = 6378.135; // km (equatorial) + const double EARTH_TO_SUN = 149.0e6; // km (average) + const double SUN_RADIUS = 695500.0 * 10.0; // km (equatorial) + + Ogre::Vector3 Project(const Ogre::Camera& camera, const Ogre::Vector3& world_pt) + { + Ogre::Vector3 retval(-5.0, -5.0, 1.0); + + Ogre::Matrix4 modelview_ = camera.getViewMatrix(); + if (0.0 < (modelview_ * world_pt).z) { + GLdouble modelview[16]; + for (std::size_t i = 0; i < 16; ++i) { + modelview[i] = modelview_[i % 4][i / 4]; + } + GLdouble projection[16]; + Ogre::Matrix4 projection_ = camera.getProjectionMatrix(); + for (std::size_t i = 0; i < 16; ++i) { + projection[i] = projection_[i % 4][i / 4]; + } + Ogre::Viewport* viewport_ = camera.getViewport(); + GLint viewport[4] = { + static_cast<GLint>(viewport_->getLeft()), + static_cast<GLint>(viewport_->getTop()), + static_cast<GLint>(viewport_->getWidth()), + static_cast<GLint>(viewport_->getHeight()) + }; + GLdouble x, y, z; + if (gluProject(world_pt.x, world_pt.y, world_pt.z, + modelview, projection, viewport, + &x, &y, &z)) { + retval = Ogre::Vector3(x * 2 - 1.0, y * 2 - 1.0, z * 2 - 1.0); + } + Ogre::Vector3 eyeSpacePos = modelview_ * world_pt; + std::cout << eyeSpacePos.x << " " << eyeSpacePos.y << " " << eyeSpacePos.z << "\n"; + } + std::cout << retval.x << " " << retval.y << " " << retval.z << "\n"; + + return retval; + } } //////////////////////////////////////////////////////////// @@ -29,6 +77,8 @@ setUseIdentityProjection(true); setUseIdentityView(true); setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); + setUseIdentityProjection(true); + setUseIdentityView(true); setQueryFlags(0); } @@ -63,6 +113,38 @@ //////////////////////////////////////////////////////////// +// StarRect +//////////////////////////////////////////////////////////// +CombatWnd::StarRect::StarRect() : + ManualObject("StarRect") +{ + setUseIdentityProjection(true); + setUseIdentityView(true); + setRenderQueueGroup(Ogre::RENDER_QUEUE_1); + setQueryFlags(0); +} + +void CombatWnd::StarRect::Resize(Ogre::Real left, Ogre::Real top, Ogre::Real right, Ogre::Real bottom) +{ + clear(); + begin("backgrounds/star", Ogre::RenderOperation::OT_TRIANGLE_FAN); + position(right, top, -1); + textureCoord(1.0, 0.0); + position(left, top, -1); + textureCoord(0.0, 0.0); + position(left, bottom, -1); + textureCoord(0.0, 1.0); + position(right, bottom, -1); + textureCoord(1.0, 1.0); + end(); + + Ogre::AxisAlignedBox box; + box.setInfinite(); + setBoundingBox(box); +} + + +//////////////////////////////////////////////////////////// // CombatWnd //////////////////////////////////////////////////////////// CombatWnd::CombatWnd(Ogre::SceneManager* scene_manager, @@ -74,8 +156,8 @@ m_viewport(viewport), m_ray_scene_query(m_scene_manager->createRayQuery(Ogre::Ray())), m_volume_scene_query(m_scene_manager->createPlaneBoundedVolumeQuery(Ogre::PlaneBoundedVolumeList())), - m_distance_to_lookat_point(m_camera->getPosition().length()), - m_pitch(0.0), + m_distance_to_lookat_point(1e7), + m_pitch(-Ogre::Math::HALF_PI), m_yaw(0.0), m_last_pos(), m_selection_drag_start(INVALID_SELECTION_DRAG_POS), @@ -83,6 +165,7 @@ m_mouse_dragged(false), m_currently_selected_scene_node(0), m_selection_rect(new SelectionRect), + m_star_rect(new StarRect), m_lookat_point(0, 0, 0), m_exit(false) { @@ -113,28 +196,49 @@ Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); m_scene_manager->getRootSceneNode()->createChildSceneNode()->attachObject(m_selection_rect); + m_scene_manager->getRootSceneNode()->createChildSceneNode()->attachObject(m_star_rect); + m_scene_manager->setSkyBox(true, "backgrounds/sky_box_1", 5000.0); + + m_camera->setNearClipDistance(NEAR_CLIP); + m_camera->setFarClipDistance(FAR_CLIP); + + m_star_rect->setVisible(true); + + UpdateCameraPosition(); + ////////////////////////////////////////////////////////////////// // NOTE: Below is temporary code for combat system prototyping! // ////////////////////////////////////////////////////////////////// - m_scene_manager->setSkyBox(true, "backgrounds/sky_box_1", 50); + Ogre::Vector3 light_dir(1, -0.15, 0.25); + light_dir.normalise(); + if (0) + { + Ogre::SceneNode* star_node = m_scene_manager->getRootSceneNode()->createChildSceneNode(); + Ogre::BillboardSet* star_billboard_set = m_scene_manager->createBillboardSet("StarBillboardSet"); + star_billboard_set->setMaterialName("backgrounds/star"); + star_billboard_set->setRenderQueueGroup(Ogre::RENDER_QUEUE_1); + star_node->attachObject(star_billboard_set); + star_billboard_set->createBillboard(-5000.0 * light_dir); + } + // Load the "Durgha" ship mesh Ogre::MeshPtr m = Ogre::MeshManager::getSingleton().load( "durgha.mesh", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); - Ogre::Vector3 light_dir(1, -0.15, 0.25); - light_dir.normalise(); - Ogre::Entity* entity = m_scene_manager->createEntity("planet", "sphere.mesh"); entity->setMaterialName("planet"); assert(entity->getNumSubEntities() == 1u); entity->getSubEntity(0)->getMaterial()->getTechnique(0)->getPass(0)->getVertexProgramParameters()->setNamedConstant("light_dir", light_dir); entity->setCastShadows(true); Ogre::SceneNode* planet_node = m_scene_manager->getRootSceneNode()->createChildSceneNode("planet node"); - planet_node->setScale(125.0, 125.0, 125.0); + //planet_node->setPosition(EARH_TO_SUN, 0.0, 0.0); + planet_node->setScale(EARTH_RADIUS * CELESTIAL_OBJECT_SCALE_FACTOR, + EARTH_RADIUS * CELESTIAL_OBJECT_SCALE_FACTOR, + EARTH_RADIUS * CELESTIAL_OBJECT_SCALE_FACTOR); planet_node->attachObject(entity); entity = m_scene_manager->createEntity("atmosphere", "sphere.mesh"); @@ -171,6 +275,7 @@ m_scene_manager->destroyQuery(m_ray_scene_query); m_scene_manager->destroyQuery(m_volume_scene_query); delete m_selection_rect; + delete m_star_rect; } void CombatWnd::LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) @@ -304,13 +409,13 @@ void CombatWnd::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { - const Ogre::Real c_move_incr = 10.0; + const Ogre::Real c_move_incr = m_distance_to_lookat_point * 0.25; const Ogre::Real c_min_distance = 50.0; Ogre::Real scale_factor = 1.0; if (mod_keys & GG::MOD_KEY_SHIFT) - scale_factor *= 5.0; + scale_factor *= 2.0; if (mod_keys & GG::MOD_KEY_CTRL) - scale_factor /= 5.0; + scale_factor /= 4.0; Ogre::Real total_move = c_move_incr * scale_factor * move; if (m_distance_to_lookat_point + total_move < c_min_distance) total_move -= c_min_distance - (m_distance_to_lookat_point + total_move); @@ -330,6 +435,25 @@ m_lookat_point = m_currently_selected_scene_node->getWorldPosition(); UpdateCameraPosition(); } + + // update star + { + Ogre::Vector3 star_pos = Ogre::Vector3(EARTH_TO_SUN, 0.0, 0.0); + Ogre::Vector3 star_screen_pos = Project(*m_camera, star_pos); + Ogre::Vector3 camera_pos = m_camera->getPosition(); + Ogre::Radian sun_angular_half_width = Ogre::Math::ATan2(SUN_RADIUS, (star_pos - camera_pos).length()); + Ogre::Radian half_fov_y = m_camera->getFOVy() / 2.0; + Ogre::Radian half_fov_x = half_fov_y * m_camera->getAspectRatio(); + Ogre::Real sun_height_view_y = sun_angular_half_width.valueRadians() / half_fov_y.valueRadians(); + Ogre::Real sun_height_view_x = sun_angular_half_width.valueRadians() / half_fov_x.valueRadians(); + std::cout << "Resize(" << (star_screen_pos.x - sun_height_view_x) << ", " + << (star_screen_pos.y + sun_height_view_y) << ", " + << (star_screen_pos.x + sun_height_view_x) << ", " + << (star_screen_pos.y - sun_height_view_y) << ")\n"; + m_star_rect->Resize(star_screen_pos.x - sun_height_view_x, star_screen_pos.y + sun_height_view_y, + star_screen_pos.x + sun_height_view_x, star_screen_pos.y - sun_height_view_y); + } + #if 0 // TODO: Remove this; it only here for profiling the number of triangles rendered. Ogre::RenderTarget::FrameStats stats = Ogre::Root::getSingleton().getRenderTarget("FreeOrion " + FreeOrionVersionString())->getStatistics(); std::cout << "tris: " << stats.triangleCount << " batches: " << stats.batchCount << std::endl; Modified: branches/ogre-integration/UI/CombatWnd.h =================================================================== --- branches/ogre-integration/UI/CombatWnd.h 2008-03-05 15:02:48 UTC (rev 2379) +++ branches/ogre-integration/UI/CombatWnd.h 2008-03-06 03:44:15 UTC (rev 2380) @@ -56,6 +56,13 @@ void Resize(const GG::Pt& pt1, const GG::Pt& pt2); }; + class StarRect : public Ogre::ManualObject + { + public: + StarRect(); + void Resize(Ogre::Real left, Ogre::Real top, Ogre::Real right, Ogre::Real bottom); + }; + virtual bool frameStarted(const Ogre::FrameEvent& event); void UpdateCameraPosition(); @@ -79,6 +86,7 @@ bool m_mouse_dragged; Ogre::SceneNode* m_currently_selected_scene_node; SelectionRect* m_selection_rect; + StarRect* m_star_rect; Ogre::Vector3 m_lookat_point; std::set<Ogre::MovableObject*> m_current_selections; |
From: <tz...@us...> - 2008-03-14 20:51:52
|
Revision: 2397 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2397&view=rev Author: tzlaine Date: 2008-03-14 13:44:19 -0700 (Fri, 14 Mar 2008) Log Message: ----------- - Reduced the exponent for the star variable-glow effect from 2.0 to 1.5. - Added a new class, CombatWnd::SelectedObject, which will encapsulate the behavior of a selected object in the CombatWnd. Modified Paths: -------------- branches/ogre-integration/UI/CombatWnd.cpp branches/ogre-integration/UI/CombatWnd.h Modified: branches/ogre-integration/UI/CombatWnd.cpp =================================================================== --- branches/ogre-integration/UI/CombatWnd.cpp 2008-03-14 12:02:45 UTC (rev 2396) +++ branches/ogre-integration/UI/CombatWnd.cpp 2008-03-14 20:44:19 UTC (rev 2397) @@ -153,6 +153,49 @@ } //////////////////////////////////////////////////////////// +// SelectedObject +//////////////////////////////////////////////////////////// +struct CombatWnd::SelectedObject::SelectedObjectImpl +{ + SelectedObjectImpl() : + m_object(0) + {} + explicit SelectedObjectImpl(Ogre::MovableObject* object) : + m_object(object) + { + m_object->getParentSceneNode()->showBoundingBox(true); + } + ~SelectedObjectImpl() + { + if (!m_object) + return; + m_object->getParentSceneNode()->showBoundingBox(false); + } + + Ogre::MovableObject* m_object; +}; + +// SelectedObject +CombatWnd::SelectedObject::SelectedObject() : + m_impl(new SelectedObjectImpl) +{} + +CombatWnd::SelectedObject::SelectedObject(Ogre::MovableObject* object) : + m_impl(new SelectedObjectImpl(object)) +{} + +bool CombatWnd::SelectedObject::operator<(const SelectedObject& rhs) const +{ return m_impl->m_object < rhs.m_impl->m_object; } + +CombatWnd::SelectedObject CombatWnd::SelectedObject::Key(Ogre::MovableObject* object) +{ + SelectedObject retval; + retval.m_impl->m_object = object; + return retval; +} + + +//////////////////////////////////////////////////////////// // CombatWnd //////////////////////////////////////////////////////////// CombatWnd::CombatWnd(Ogre::SceneManager* scene_manager, @@ -203,6 +246,9 @@ // Initialise, parse scripts etc Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); + m_scene_manager->setAmbientLight(Ogre::ColourValue(0.2, 0.2, 0.2)); + m_scene_manager->setShadowTechnique(Ogre::SHADOWTYPE_NONE);//STENCIL_MODULATIVE); + m_scene_manager->getRootSceneNode()->createChildSceneNode()->attachObject(m_selection_rect); Ogre::SceneNode* star_node = m_scene_manager->getRootSceneNode()->createChildSceneNode(); @@ -222,9 +268,9 @@ star_billboard_set->setVisible(true); star_node->attachObject(star_billboard_set); - // TODO: Place other textures whose alpha must be scaled in other billboard sets. - +#if 0 m_scene_manager->setSkyBox(true, "backgrounds/sky_box_1"); +#endif m_camera->setNearClipDistance(NEAR_CLIP); m_camera->setFarClipDistance(FAR_CLIP); @@ -285,9 +331,6 @@ durgha_node->attachObject(entity); durgha_node->setPosition(250, 250, 0); - m_scene_manager->setAmbientLight(Ogre::ColourValue(0.2, 0.2, 0.2)); - m_scene_manager->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_MODULATIVE); - Ogre::Light* star = m_scene_manager->createLight("Star"); star->setType(Ogre::Light::LT_POINT); star->setPosition(Ogre::Vector3(0.0, 0.0, 0.0)); @@ -342,18 +385,15 @@ Ogre::SceneNode* clicked_scene_node = movable_object->getParentSceneNode(); assert(clicked_scene_node); if (mod_keys & GG::MOD_KEY_CTRL) { - std::set<Ogre::MovableObject*>::iterator it = m_current_selections.find(movable_object); - if (it == m_current_selections.end()) { - movable_object->getParentSceneNode()->showBoundingBox(true); // TODO: Replace. - m_current_selections.insert(movable_object); - } else { - (*it)->getParentSceneNode()->showBoundingBox(false); // TODO: Replace. + std::set<SelectedObject>::iterator it = + m_current_selections.find(SelectedObject::Key(movable_object)); + if (it == m_current_selections.end()) + m_current_selections.insert(SelectedObject(movable_object)); + else m_current_selections.erase(it); - } } else { DeselectAll(); - movable_object->getParentSceneNode()->showBoundingBox(true); // TODO: Replace. - m_current_selections.insert(movable_object); + m_current_selections.insert(SelectedObject(movable_object)); m_currently_selected_scene_node = clicked_scene_node; } } else { @@ -471,7 +511,7 @@ Ogre::Real star_back_brightness_factor = BRIGHTNESS_AT_MAX_FOVY + center_nearness_factor * (1.0 - BRIGHTNESS_AT_MAX_FOVY); // Raise the factor to a (smallish) power to create some nonlinearity in the scaling. - star_back_brightness_factor = Ogre::Math::Sqr(star_back_brightness_factor); + star_back_brightness_factor = Ogre::Math::Pow(star_back_brightness_factor, 1.5); m_star_back_billboard->setColour(Ogre::ColourValue(1.0, 1.0, 1.0, star_back_brightness_factor)); } @@ -535,13 +575,10 @@ DeselectAll(); Ogre::SceneQueryResult& result = m_volume_scene_query->execute(); for (Ogre::SceneQueryResultMovableList::iterator it = result.movables.begin(); it != result.movables.end(); ++it) { - std::pair<std::set<Ogre::MovableObject*>::iterator, bool> insertion_result = m_current_selections.insert(*it); - if (insertion_result.second) { - (*it)->getParentSceneNode()->showBoundingBox(true); // TODO: Remove. - } else { - (*insertion_result.first)->getParentSceneNode()->showBoundingBox(false); // TODO: Remove. + std::pair<std::set<SelectedObject>::iterator, bool> insertion_result = + m_current_selections.insert(SelectedObject(*it)); + if (!insertion_result.second) m_current_selections.erase(insertion_result.first); - } } } @@ -559,10 +596,5 @@ void CombatWnd::DeselectAll() { - for (std::set<Ogre::MovableObject*>::iterator it = m_current_selections.begin(); it != m_current_selections.end(); ++it) { - // TODO: Come up with a system for ensuring that the pointers in m_current_selections are not left dangling, so - // that deselection code like that below doesn't crash the app. - (*it)->getParentSceneNode()->showBoundingBox(false); // TODO: Replace. - } m_current_selections.clear(); } Modified: branches/ogre-integration/UI/CombatWnd.h =================================================================== --- branches/ogre-integration/UI/CombatWnd.h 2008-03-14 12:02:45 UTC (rev 2396) +++ branches/ogre-integration/UI/CombatWnd.h 2008-03-14 20:44:19 UTC (rev 2397) @@ -59,13 +59,26 @@ class FlareRect : public Ogre::ManualObject { public: - FlareRect(const std::string& material_name); + explicit FlareRect(const std::string& material_name); void Resize(Ogre::Real left, Ogre::Real top, Ogre::Real right, Ogre::Real bottom); private: std::string m_material_name; }; + struct SelectedObject + { + struct SelectedObjectImpl; + + SelectedObject(); + explicit SelectedObject(Ogre::MovableObject* object); + bool operator<(const SelectedObject& rhs) const; + + static SelectedObject Key(Ogre::MovableObject* object); + + boost::shared_ptr<SelectedObjectImpl> m_impl; + }; + virtual bool frameStarted(const Ogre::FrameEvent& event); void UpdateCameraPosition(); @@ -90,7 +103,7 @@ Ogre::SceneNode* m_currently_selected_scene_node; SelectionRect* m_selection_rect; Ogre::Vector3 m_lookat_point; - std::set<Ogre::MovableObject*> m_current_selections; + std::set<SelectedObject> m_current_selections; Ogre::Billboard* m_star_back_billboard; bool m_exit; // TODO: Remove this; it is only here for prototyping. |
From: <tz...@us...> - 2008-04-12 22:09:01
|
Revision: 2483 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2483&view=rev Author: tzlaine Date: 2008-04-12 15:08:57 -0700 (Sat, 12 Apr 2008) Log Message: ----------- - Removed crufty FlareRect class from CombatWnd. - Fixed the problem with planets with atmospheres having part of their atmospheres rendered as black when occluded by the star background textures. Modified Paths: -------------- branches/ogre-integration/UI/CombatWnd.cpp branches/ogre-integration/UI/CombatWnd.h Modified: branches/ogre-integration/UI/CombatWnd.cpp =================================================================== --- branches/ogre-integration/UI/CombatWnd.cpp 2008-04-12 20:32:09 UTC (rev 2482) +++ branches/ogre-integration/UI/CombatWnd.cpp 2008-04-12 22:08:57 UTC (rev 2483) @@ -40,6 +40,10 @@ const double MAX_ZOOM_OUT_DISTANCE = SYSTEM_RADIUS; const double MIN_ZOOM_IN_DISTANCE = 0.5; + const int ALPHA_OBJECTS_QUEUE = Ogre::RENDER_QUEUE_7; + const int STAR_CORE_QUEUE = ALPHA_OBJECTS_QUEUE + 1; + const int SELECTION_RECT_QUEUE = Ogre::RENDER_QUEUE_OVERLAY - 1; + Ogre::Real OrbitRadius(unsigned int orbit) { assert(orbit < 10); @@ -133,7 +137,7 @@ { setUseIdentityProjection(true); setUseIdentityView(true); - setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); + setRenderQueueGroup(SELECTION_RECT_QUEUE); setUseIdentityProjection(true); setUseIdentityView(true); setQueryFlags(0); @@ -170,38 +174,6 @@ //////////////////////////////////////////////////////////// -// FlareRect -//////////////////////////////////////////////////////////// -CombatWnd::FlareRect::FlareRect(const std::string& material_name) : - ManualObject("FlareRect"), - m_material_name(material_name) -{ - setUseIdentityProjection(true); - setUseIdentityView(true); - setRenderQueueGroup(Ogre::RENDER_QUEUE_9); - setQueryFlags(0); -} - -void CombatWnd::FlareRect::Resize(Ogre::Real left, Ogre::Real top, Ogre::Real right, Ogre::Real bottom) -{ - clear(); - begin(m_material_name, Ogre::RenderOperation::OT_TRIANGLE_FAN); - position(right, top, -1); - textureCoord(1.0, 0.0); - position(left, top, -1); - textureCoord(0.0, 0.0); - position(left, bottom, -1); - textureCoord(0.0, 1.0); - position(right, bottom, -1); - textureCoord(1.0, 1.0); - end(); - - Ogre::AxisAlignedBox box; - box.setInfinite(); - setBoundingBox(box); -} - -//////////////////////////////////////////////////////////// // SelectedObject //////////////////////////////////////////////////////////// struct CombatWnd::SelectedObject::SelectedObjectImpl @@ -302,7 +274,7 @@ Ogre::SceneNode* star_node = m_scene_manager->getRootSceneNode()->createChildSceneNode(); Ogre::BillboardSet* star_billboard_set = m_scene_manager->createBillboardSet("StarBackBillboardSet"); - star_billboard_set->setRenderQueueGroup(Ogre::RENDER_QUEUE_8); + star_billboard_set->setRenderQueueGroup(ALPHA_OBJECTS_QUEUE); star_billboard_set->setMaterialName("backgrounds/star_back"); star_billboard_set->setDefaultDimensions(STAR_RADIUS * 2.0, STAR_RADIUS * 2.0); m_star_back_billboard = star_billboard_set->createBillboard(Ogre::Vector3(0.0, 0.0, 0.0)); @@ -310,7 +282,7 @@ star_node->attachObject(star_billboard_set); star_billboard_set = m_scene_manager->createBillboardSet("StarCoreBillboardSet"); - star_billboard_set->setRenderQueueGroup(Ogre::RENDER_QUEUE_9); + star_billboard_set->setRenderQueueGroup(STAR_CORE_QUEUE); star_billboard_set->setMaterialName("backgrounds/star_core"); star_billboard_set->setDefaultDimensions(STAR_RADIUS * 2.0, STAR_RADIUS * 2.0); star_billboard_set->createBillboard(Ogre::Vector3(0.0, 0.0, 0.0)); @@ -478,6 +450,7 @@ node->attachObject(entity); entity = m_scene_manager->createEntity(planet_name + " atmosphere", "sphere.mesh"); + entity->setRenderQueueGroup(ALPHA_OBJECTS_QUEUE); std::string new_material_name = material_name + "_" + boost::lexical_cast<std::string>(it->first); Ogre::MaterialPtr material = @@ -507,6 +480,7 @@ if (material_name == "planet") { material->getTechnique(0)->getPass(0)->getTextureUnitState(2)->setTextureName(base_name + "CloudGloss.png"); entity = m_scene_manager->createEntity(planet_name + " atmosphere", "sphere.mesh"); + entity->setRenderQueueGroup(ALPHA_OBJECTS_QUEUE); entity->setMaterialName(AtmosphereNameFromBaseName(base_name)); entity->getSubEntity(0)->getMaterial()->getTechnique(0)->getPass(0)->getVertexProgramParameters()->setNamedConstant("light_dir", light_dir); node->attachObject(entity); Modified: branches/ogre-integration/UI/CombatWnd.h =================================================================== --- branches/ogre-integration/UI/CombatWnd.h 2008-04-12 20:32:09 UTC (rev 2482) +++ branches/ogre-integration/UI/CombatWnd.h 2008-04-12 22:08:57 UTC (rev 2483) @@ -59,16 +59,6 @@ void Resize(const GG::Pt& pt1, const GG::Pt& pt2); }; - class FlareRect : public Ogre::ManualObject - { - public: - explicit FlareRect(const std::string& material_name); - void Resize(Ogre::Real left, Ogre::Real top, Ogre::Real right, Ogre::Real bottom); - - private: - std::string m_material_name; - }; - struct SelectedObject { struct SelectedObjectImpl; |
From: <tz...@us...> - 2008-04-26 20:36:45
|
Revision: 2521 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2521&view=rev Author: tzlaine Date: 2008-04-26 13:36:45 -0700 (Sat, 26 Apr 2008) Log Message: ----------- Refactored the selection-related event handlers in CombatWnd. This fixes the crashes that were ocurring previously. Also added a map from SceneNodes to Entity's that indicates the "main" entity for each node. This fixes the problem of clicks selecting e.g. the atmoshpere entity on one node and the surface entity on another. This in turn fixes the problem of the gaps in outline mode of selection when selecting some planets. Modified Paths: -------------- branches/ogre-integration/UI/CombatWnd.cpp branches/ogre-integration/UI/CombatWnd.h Modified: branches/ogre-integration/UI/CombatWnd.cpp =================================================================== --- branches/ogre-integration/UI/CombatWnd.cpp 2008-04-24 02:47:24 UTC (rev 2520) +++ branches/ogre-integration/UI/CombatWnd.cpp 2008-04-26 20:36:45 UTC (rev 2521) @@ -79,7 +79,7 @@ // Set this to true to see object selection as a translucent shell around // the entire object; set it to false to see selected objects merely // outlined. - const bool USE_FILLED_SELECTION = true; + const bool USE_FILLED_SELECTION = false; Ogre::Real OrbitRadius(unsigned int orbit) { @@ -213,6 +213,7 @@ // SelectedObjectImpl struct CombatWnd::SelectedObject::SelectedObjectImpl { + SelectedObjectImpl() : m_object(0), m_core_entity(0), @@ -233,8 +234,10 @@ assert(m_scene_node); m_scene_manager = m_scene_node->getCreator(); assert(m_scene_manager); - m_core_entity = - boost::polymorphic_downcast<Ogre::Entity*>(m_scene_node->getAttachedObject(0)); + m_core_entity = boost::polymorphic_downcast<Ogre::Entity*>(m_object); + + std::cout << "SelectedObjectImpl() m_core_entity \"" << m_core_entity->getName() << "\"" << std::endl; + m_core_entity->setRenderQueueGroup(SELECTION_HILITING_OBJECT_RENDER_QUEUE); m_outline_entity = m_core_entity->clone(m_core_entity->getName() + " hiliting outline"); @@ -290,14 +293,7 @@ bool CombatWnd::SelectedObject::operator<(const SelectedObject& rhs) const { return m_impl->m_object < rhs.m_impl->m_object; } -CombatWnd::SelectedObject CombatWnd::SelectedObject::Key(Ogre::MovableObject* object) -{ - SelectedObject retval; - retval.m_impl->m_object = object; - return retval; -} - //////////////////////////////////////////////////////////// // StencilOpQueueListener //////////////////////////////////////////////////////////// @@ -611,6 +607,7 @@ if (material_name == "gas_giant") { Ogre::Entity* entity = m_scene_manager->createEntity(planet_name, "sphere.mesh"); + m_primary_entities[node] = entity; entity->setMaterialName("gas_giant_core"); assert(entity->getNumSubEntities() == 1u); entity->setCastShadows(true); @@ -632,6 +629,7 @@ node->attachObject(entity); } else { Ogre::Entity* entity = m_scene_manager->createEntity(planet_name, "sphere.mesh"); + m_primary_entities[node] = entity; entity->setVisibilityFlags(REGULAR_OBJECTS_MASK); std::string new_material_name = material_name + "_" + boost::lexical_cast<std::string>(it->first); @@ -695,29 +693,30 @@ void CombatWnd::LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (m_selection_drag_start != INVALID_SELECTION_DRAG_POS) - EndShiftDrag(); + EndSelectionDrag(); } void CombatWnd::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (m_selection_drag_start != INVALID_SELECTION_DRAG_POS) { SelectObjectsInVolume(mod_keys & GG::MOD_KEY_CTRL); - EndShiftDrag(); + EndSelectionDrag(); } else if (!m_mouse_dragged) { if (Ogre::MovableObject* movable_object = GetObjectUnderPt(pt)) { Ogre::SceneNode* clicked_scene_node = movable_object->getParentSceneNode(); + movable_object = m_primary_entities[clicked_scene_node]; assert(clicked_scene_node); - if (mod_keys & GG::MOD_KEY_CTRL) { - std::set<SelectedObject>::iterator it = - m_current_selections.find(SelectedObject::Key(movable_object)); - if (it == m_current_selections.end()) - m_current_selections.insert(SelectedObject(movable_object)); - else + std::map<Ogre::MovableObject*, SelectedObject>::iterator it = + m_current_selections.find(movable_object); + if (it == m_current_selections.end()) { + if (!(mod_keys & GG::MOD_KEY_CTRL)) { + DeselectAll(); + m_currently_selected_scene_node = clicked_scene_node; + } + m_current_selections[movable_object] = SelectedObject(movable_object); + } else { + if (mod_keys & GG::MOD_KEY_CTRL) m_current_selections.erase(it); - } else { - DeselectAll(); - m_current_selections.insert(SelectedObject(movable_object)); - m_currently_selected_scene_node = clicked_scene_node; } } else { DeselectAll(); @@ -981,7 +980,7 @@ m_initial_right_horizontal_flare_scroll + m_right_horizontal_flare_scroll_offset); } -void CombatWnd::EndShiftDrag() +void CombatWnd::EndSelectionDrag() { m_selection_drag_start = INVALID_SELECTION_DRAG_POS; m_selection_rect->setVisible(false); @@ -1025,10 +1024,12 @@ DeselectAll(); Ogre::SceneQueryResult& result = m_volume_scene_query->execute(); for (Ogre::SceneQueryResultMovableList::iterator it = result.movables.begin(); it != result.movables.end(); ++it) { - std::pair<std::set<SelectedObject>::iterator, bool> insertion_result = - m_current_selections.insert(SelectedObject(*it)); - if (!insertion_result.second) - m_current_selections.erase(insertion_result.first); + Ogre::MovableObject* object = m_primary_entities[(*it)->getParentSceneNode()]; + std::map<Ogre::MovableObject*, SelectedObject>::iterator object_it = m_current_selections.find(object); + if (object_it != m_current_selections.end()) + m_current_selections.erase(object_it); + else + m_current_selections[object] = SelectedObject(*it); } } Modified: branches/ogre-integration/UI/CombatWnd.h =================================================================== --- branches/ogre-integration/UI/CombatWnd.h 2008-04-24 02:47:24 UTC (rev 2520) +++ branches/ogre-integration/UI/CombatWnd.h 2008-04-26 20:36:45 UTC (rev 2521) @@ -67,8 +67,6 @@ explicit SelectedObject(Ogre::MovableObject* object); bool operator<(const SelectedObject& rhs) const; - static SelectedObject Key(Ogre::MovableObject* object); - boost::shared_ptr<SelectedObjectImpl> m_impl; }; @@ -79,7 +77,7 @@ void UpdateCameraPosition(); void UpdateStarFromCameraPosition(); - void EndShiftDrag(); + void EndSelectionDrag(); void SelectObjectsInVolume(bool toggle_selected_items); Ogre::MovableObject* GetObjectUnderPt(const GG::Pt& pt); void DeselectAll(); @@ -100,7 +98,7 @@ Ogre::SceneNode* m_currently_selected_scene_node; SelectionRect* m_selection_rect; Ogre::Vector3 m_lookat_point; - std::set<SelectedObject> m_current_selections; + std::map<Ogre::MovableObject*, SelectedObject> m_current_selections; Ogre::Billboard* m_star_back_billboard; // The scene nodes representing planets in the system and the materials @@ -109,6 +107,8 @@ // The scene nodes representing starlane entrance points in the system. std::set<Ogre::SceneNode*> m_starlane_entrance_point_nodes; + std::map<Ogre::SceneNode*, Ogre::Entity*> m_primary_entities; + Ogre::Real m_initial_left_horizontal_flare_scroll; Ogre::Real m_initial_right_horizontal_flare_scroll; Ogre::Real m_left_horizontal_flare_scroll_offset; |
From: <tz...@us...> - 2008-04-26 22:04:35
|
Revision: 2523 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2523&view=rev Author: tzlaine Date: 2008-04-26 15:04:40 -0700 (Sat, 26 Apr 2008) Log Message: ----------- Added an FPSIndicator to CombatWnd, and added code to CombatWnd's keyboard handler to bring up the OptionsWnd when F10 is pressed. This allows me to start adding and using CombatWnd-specific graphics options in the OptionsWnd. In the final version of the CombatWnd, F10 will bring up InGameOptions, just like the MapWnd. Modified Paths: -------------- branches/ogre-integration/UI/CombatWnd.cpp branches/ogre-integration/UI/CombatWnd.h Modified: branches/ogre-integration/UI/CombatWnd.cpp =================================================================== --- branches/ogre-integration/UI/CombatWnd.cpp 2008-04-26 22:01:53 UTC (rev 2522) +++ branches/ogre-integration/UI/CombatWnd.cpp 2008-04-26 22:04:40 UTC (rev 2523) @@ -1,6 +1,9 @@ #include "CombatWnd.h" #include "ClientUI.h" +#include "CUIControls.h" +#include "InGameMenu.h" +#include "OptionsWnd.h" // TODO: Remove this when the InGameMenu is in use. #include "../universe/System.h" #include "../universe/Planet.h" #include "../universe/Predicates.h" @@ -32,7 +35,6 @@ #include <boost/filesystem/fstream.hpp> #include <boost/filesystem/operations.hpp> - namespace { const GG::Pt INVALID_SELECTION_DRAG_POS(-1, -1); @@ -386,6 +388,8 @@ m_left_horizontal_flare_scroll_offset(0.0), m_right_horizontal_flare_scroll_offset(0.0), m_stencil_op_frame_listener(new StencilOpQueueListener), + m_fps_text(new FPSIndicator(5, 5)), + m_menu_showing(false), m_exit(false) { Ogre::Root::getSingleton().addFrameListener(this); @@ -463,6 +467,8 @@ m_currently_selected_scene_node = star_node; UpdateCameraPosition(); + AttachChild(m_fps_text); + ////////////////////////////////////////////////////////////////// // NOTE: Below is temporary code for combat system prototyping! // ////////////////////////////////////////////////////////////////// @@ -812,6 +818,18 @@ { if (key == GG::GGK_q && mod_keys & GG::MOD_KEY_CTRL) m_exit = true; + + if (key == GG::GGK_F10 && !mod_keys && !m_menu_showing) { + m_menu_showing = true; +#if 0 // TODO: Use the full in-game menu when the code is a bit more developed. + InGameMenu menu; + menu.Run(); +#else + OptionsWnd options_wnd; + options_wnd.Run(); +#endif + m_menu_showing = false; + } } bool CombatWnd::frameStarted(const Ogre::FrameEvent& event) @@ -821,18 +839,14 @@ UpdateCameraPosition(); } -#if 0 // TODO: Remove this; it only here for profiling the number of triangles rendered. Ogre::RenderTarget::FrameStats stats = Ogre::Root::getSingleton().getRenderTarget("FreeOrion " + FreeOrionVersionString())->getStatistics(); - std::cout << "tris: " << stats.triangleCount << " batches: " << stats.batchCount << std::endl; -#endif + m_fps_text->SetText(boost::lexical_cast<std::string>(stats.lastFPS) + " FPS"); + return !m_exit; } bool CombatWnd::frameEnded(const Ogre::FrameEvent& event) { - Ogre::CompositorPtr glow_compositor = Ogre::CompositorManager::getSingleton().getByName("effects/glow"); - - return !m_exit; } Modified: branches/ogre-integration/UI/CombatWnd.h =================================================================== --- branches/ogre-integration/UI/CombatWnd.h 2008-04-26 22:01:53 UTC (rev 2522) +++ branches/ogre-integration/UI/CombatWnd.h 2008-04-26 22:04:40 UTC (rev 2523) @@ -20,6 +20,7 @@ class PlaneBoundedVolumeListSceneQuery; } class System; +class FPSIndicator; class CombatWnd : public GG::Wnd, @@ -116,6 +117,10 @@ StencilOpQueueListener* m_stencil_op_frame_listener; + FPSIndicator* m_fps_text; + + bool m_menu_showing; + bool m_exit; // TODO: Remove this; it is only here for prototyping. }; |
From: <tz...@us...> - 2008-04-27 00:22:16
|
Revision: 2525 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2525&view=rev Author: tzlaine Date: 2008-04-26 17:22:20 -0700 (Sat, 26 Apr 2008) Log Message: ----------- Set the query flag UNSELECTABLE_OBJECT_MASK on all entities that are not the "primary" entity for the node to which they are attached. This solves the problems formerly fixed by using m_primary_entities, which has now been removed. This change also fixes the broken region (box) selection feature. Modified Paths: -------------- branches/ogre-integration/UI/CombatWnd.cpp branches/ogre-integration/UI/CombatWnd.h Modified: branches/ogre-integration/UI/CombatWnd.cpp =================================================================== --- branches/ogre-integration/UI/CombatWnd.cpp 2008-04-26 22:51:50 UTC (rev 2524) +++ branches/ogre-integration/UI/CombatWnd.cpp 2008-04-27 00:22:20 UTC (rev 2525) @@ -620,7 +620,6 @@ if (material_name == "gas_giant") { Ogre::Entity* entity = m_scene_manager->createEntity(planet_name, "sphere.mesh"); - m_primary_entities[node] = entity; entity->setMaterialName("gas_giant_core"); assert(entity->getNumSubEntities() == 1u); entity->setCastShadows(true); @@ -630,6 +629,7 @@ entity = m_scene_manager->createEntity(planet_name + " atmosphere", "sphere.mesh"); entity->setRenderQueueGroup(ALPHA_OBJECTS_QUEUE); entity->setVisibilityFlags(REGULAR_OBJECTS_MASK); + entity->setQueryFlags(UNSELECTABLE_OBJECT_MASK); std::string new_material_name = material_name + "_" + boost::lexical_cast<std::string>(it->first); Ogre::MaterialPtr material = @@ -642,7 +642,6 @@ node->attachObject(entity); } else { Ogre::Entity* entity = m_scene_manager->createEntity(planet_name, "sphere.mesh"); - m_primary_entities[node] = entity; entity->setVisibilityFlags(REGULAR_OBJECTS_MASK); std::string new_material_name = material_name + "_" + boost::lexical_cast<std::string>(it->first); @@ -663,6 +662,7 @@ entity = m_scene_manager->createEntity(planet_name + " atmosphere", "sphere.mesh"); entity->setRenderQueueGroup(ALPHA_OBJECTS_QUEUE); entity->setVisibilityFlags(REGULAR_OBJECTS_MASK); + entity->setQueryFlags(UNSELECTABLE_OBJECT_MASK); entity->setMaterialName(AtmosphereNameFromBaseName(base_name)); entity->getSubEntity(0)->getMaterial()->getTechnique(0)->getPass(0)->getVertexProgramParameters()->setNamedConstant("light_dir", light_dir); node->attachObject(entity); @@ -717,7 +717,6 @@ } else if (!m_mouse_dragged) { if (Ogre::MovableObject* movable_object = GetObjectUnderPt(pt)) { Ogre::SceneNode* clicked_scene_node = movable_object->getParentSceneNode(); - movable_object = m_primary_entities[clicked_scene_node]; assert(clicked_scene_node); std::map<Ogre::MovableObject*, SelectedObject>::iterator it = m_current_selections.find(movable_object); @@ -1048,12 +1047,11 @@ DeselectAll(); Ogre::SceneQueryResult& result = m_volume_scene_query->execute(); for (Ogre::SceneQueryResultMovableList::iterator it = result.movables.begin(); it != result.movables.end(); ++it) { - Ogre::MovableObject* object = m_primary_entities[(*it)->getParentSceneNode()]; - std::map<Ogre::MovableObject*, SelectedObject>::iterator object_it = m_current_selections.find(object); + std::map<Ogre::MovableObject*, SelectedObject>::iterator object_it = m_current_selections.find(*it); if (object_it != m_current_selections.end()) m_current_selections.erase(object_it); else - m_current_selections[object] = SelectedObject(*it); + m_current_selections[*it] = SelectedObject(*it); } } Modified: branches/ogre-integration/UI/CombatWnd.h =================================================================== --- branches/ogre-integration/UI/CombatWnd.h 2008-04-26 22:51:50 UTC (rev 2524) +++ branches/ogre-integration/UI/CombatWnd.h 2008-04-27 00:22:20 UTC (rev 2525) @@ -108,8 +108,6 @@ // The scene nodes representing starlane entrance points in the system. std::set<Ogre::SceneNode*> m_starlane_entrance_point_nodes; - std::map<Ogre::SceneNode*, Ogre::Entity*> m_primary_entities; - Ogre::Real m_initial_left_horizontal_flare_scroll; Ogre::Real m_initial_right_horizontal_flare_scroll; Ogre::Real m_left_horizontal_flare_scroll_offset; |
From: <tz...@us...> - 2008-04-27 00:59:43
|
Revision: 2526 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2526&view=rev Author: tzlaine Date: 2008-04-26 17:59:50 -0700 (Sat, 26 Apr 2008) Log Message: ----------- Removed CombatWnd::SelectionRect and moved the rendering of the selection rect. to CombatWnd::Render(). This was necessary due to the bad way that the selection rect and glow compositor interacted. Modified Paths: -------------- branches/ogre-integration/UI/CombatWnd.cpp branches/ogre-integration/UI/CombatWnd.h Modified: branches/ogre-integration/UI/CombatWnd.cpp =================================================================== --- branches/ogre-integration/UI/CombatWnd.cpp 2008-04-27 00:22:20 UTC (rev 2525) +++ branches/ogre-integration/UI/CombatWnd.cpp 2008-04-27 00:59:50 UTC (rev 2526) @@ -64,8 +64,6 @@ const int SELECTION_HILITING_FILLED_1_RENDER_QUEUE = Ogre::RENDER_QUEUE_7 + 1; const int SELECTION_HILITING_FILLED_2_RENDER_QUEUE = Ogre::RENDER_QUEUE_7 + 2; - const int SELECTION_RECT_QUEUE = Ogre::RENDER_QUEUE_OVERLAY - 1; - const std::set<int> STENCIL_OP_RENDER_QUEUES = boost::assign::list_of (SELECTION_HILITING_OBJECT_RENDER_QUEUE) @@ -172,50 +170,6 @@ } //////////////////////////////////////////////////////////// -// SelectionRect -//////////////////////////////////////////////////////////// -CombatWnd::SelectionRect::SelectionRect() : - ManualObject("SelectionRect") -{ - setUseIdentityProjection(true); - setUseIdentityView(true); - setRenderQueueGroup(SELECTION_RECT_QUEUE); - setUseIdentityProjection(true); - setUseIdentityView(true); - setQueryFlags(0); -} - -void CombatWnd::SelectionRect::Resize(const GG::Pt& pt1, const GG::Pt& pt2) -{ - const float APP_WIDTH = GG::GUI::GetGUI()->AppWidth(); - const float APP_HEIGHT = GG::GUI::GetGUI()->AppHeight(); - - float left = std::min(pt1.x, pt2.x) / APP_WIDTH; - float right = std::max(pt1.x, pt2.x) / APP_WIDTH; - float top = std::min(pt1.y, pt2.y) / APP_HEIGHT; - float bottom = std::max(pt1.y, pt2.y) / APP_HEIGHT; - - left = left * 2 - 1; - right = right * 2 - 1; - top = 1 - top * 2; - bottom = 1 - bottom * 2; - - clear(); - begin("", Ogre::RenderOperation::OT_LINE_STRIP); - position(left, top, -1); - position(right, top, -1); - position(right, bottom, -1); - position(left, bottom, -1); - position(left, top, -1); - end(); - - Ogre::AxisAlignedBox box; - box.setInfinite(); - setBoundingBox(box); -} - - -//////////////////////////////////////////////////////////// // SelectedObject //////////////////////////////////////////////////////////// // SelectedObjectImpl @@ -388,7 +342,7 @@ m_selection_drag_stop(INVALID_SELECTION_DRAG_POS), m_mouse_dragged(false), m_currently_selected_scene_node(0), - m_selection_rect(new SelectionRect), + m_selection_rect(), m_lookat_point(0, 0, 0), m_star_back_billboard(0), m_initial_left_horizontal_flare_scroll(0.0), @@ -435,8 +389,6 @@ m_scene_manager->setAmbientLight(Ogre::ColourValue(0.2, 0.2, 0.2)); m_scene_manager->setShadowTechnique(Ogre::SHADOWTYPE_NONE);//STENCIL_MODULATIVE); - m_scene_manager->getRootSceneNode()->createChildSceneNode()->attachObject(m_selection_rect); - Ogre::SceneNode* star_node = m_scene_manager->getRootSceneNode()->createChildSceneNode(); Ogre::BillboardSet* star_billboard_set = m_scene_manager->createBillboardSet("StarBackBillboardSet"); star_billboard_set->setRenderQueueGroup(STAR_BACK_QUEUE); @@ -509,7 +461,6 @@ m_scene_manager->removeRenderQueueListener(m_stencil_op_frame_listener); m_scene_manager->destroyQuery(m_ray_scene_query); m_scene_manager->destroyQuery(m_volume_scene_query); - delete m_selection_rect; Ogre::CompositorManager::getSingleton().removeCompositor(m_viewport, "effects/glow"); // TODO: delete nodes and materials in m_planet_assets (or maybe everything @@ -679,6 +630,19 @@ } } +void CombatWnd::Render() +{ + if (m_selection_rect.ul != m_selection_rect.lr) { + glColor4f(1.0, 1.0, 1.0, 0.5); + glBegin(GL_LINE_LOOP); + glVertex2i(m_selection_rect.lr.x, m_selection_rect.ul.y); + glVertex2i(m_selection_rect.ul.x, m_selection_rect.ul.y); + glVertex2i(m_selection_rect.ul.x, m_selection_rect.lr.y); + glVertex2i(m_selection_rect.lr.x, m_selection_rect.lr.y); + glEnd(); + } +} + void CombatWnd::LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { m_last_pos = pt; @@ -693,11 +657,10 @@ delta_pos.x * delta_pos.x + delta_pos.y * delta_pos.y) { if (m_selection_drag_start == INVALID_SELECTION_DRAG_POS) { m_selection_drag_start = pt; - m_selection_rect->setVisible(true); - m_selection_rect->clear(); + m_selection_rect = GG::Rect(); } else { m_selection_drag_stop = pt; - m_selection_rect->Resize(m_selection_drag_start, m_selection_drag_stop); + m_selection_rect = GG::Rect(m_selection_drag_start, m_selection_drag_stop); } m_mouse_dragged = true; } @@ -1006,7 +969,7 @@ void CombatWnd::EndSelectionDrag() { m_selection_drag_start = INVALID_SELECTION_DRAG_POS; - m_selection_rect->setVisible(false); + m_selection_rect = GG::Rect(); } void CombatWnd::SelectObjectsInVolume(bool toggle_selected_items) Modified: branches/ogre-integration/UI/CombatWnd.h =================================================================== --- branches/ogre-integration/UI/CombatWnd.h 2008-04-27 00:22:20 UTC (rev 2525) +++ branches/ogre-integration/UI/CombatWnd.h 2008-04-27 00:59:50 UTC (rev 2526) @@ -34,6 +34,8 @@ void InitCombat(const System& system); + virtual void Render(); + virtual void LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys); virtual void LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); @@ -53,13 +55,6 @@ virtual void KeyPress(GG::Key key, GG::Flags<GG::ModKey> mod_keys); private: - class SelectionRect : public Ogre::ManualObject - { - public: - SelectionRect(); - void Resize(const GG::Pt& pt1, const GG::Pt& pt2); - }; - struct SelectedObject { struct SelectedObjectImpl; @@ -97,7 +92,7 @@ GG::Pt m_selection_drag_stop; bool m_mouse_dragged; Ogre::SceneNode* m_currently_selected_scene_node; - SelectionRect* m_selection_rect; + GG::Rect m_selection_rect; Ogre::Vector3 m_lookat_point; std::map<Ogre::MovableObject*, SelectedObject> m_current_selections; Ogre::Billboard* m_star_back_billboard; |
From: <tz...@us...> - 2008-04-27 18:28:00
|
Revision: 2533 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2533&view=rev Author: tzlaine Date: 2008-04-27 11:28:03 -0700 (Sun, 27 Apr 2008) Log Message: ----------- Added a short camera movement interval when recentering, during which the camera moves smoothly to its new center. This will hopefully keep the player oriented better than the sudden jumps the previous recentering code caused. Modified Paths: -------------- branches/ogre-integration/UI/CombatWnd.cpp branches/ogre-integration/UI/CombatWnd.h Modified: branches/ogre-integration/UI/CombatWnd.cpp =================================================================== --- branches/ogre-integration/UI/CombatWnd.cpp 2008-04-27 13:21:44 UTC (rev 2532) +++ branches/ogre-integration/UI/CombatWnd.cpp 2008-04-27 18:28:03 UTC (rev 2533) @@ -11,6 +11,7 @@ #include "OptionsWnd.h" // TODO: Remove this later, once the InGameMenu is in use for F10 presses instead. +#include <OgreAnimation.h> #include <OgreBillboard.h> #include <OgreBillboardSet.h> #include <OgreCamera.h> @@ -78,6 +79,9 @@ // query masks const Ogre::uint32 UNSELECTABLE_OBJECT_MASK = 1 << 0; + // The time it takes to recenter on a new point, in seconds. + const Ogre::Real CAMERA_RECENTER_TIME = 0.33333; + Ogre::Real OrbitRadius(unsigned int orbit) { assert(orbit < 10); @@ -131,7 +135,6 @@ &x, &y, &z)) { retval = Ogre::Vector3(x * 2 - 1.0, y * 2 - 1.0, z * 2 - 1.0); } - Ogre::Vector3 eyeSpacePos = modelview_ * world_pt; } return retval; @@ -198,8 +201,6 @@ assert(m_scene_manager); m_core_entity = boost::polymorphic_downcast<Ogre::Entity*>(m_object); - std::cout << "SelectedObjectImpl() m_core_entity \"" << m_core_entity->getName() << "\"" << std::endl; - m_core_entity->setRenderQueueGroup(SELECTION_HILITING_OBJECT_RENDER_QUEUE); const bool FILLED = GetOptionsDB().Get<bool>("combat.filled-selection"); @@ -331,9 +332,12 @@ Wnd(0, 0, GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight(), GG::CLICKABLE), m_scene_manager(scene_manager), m_camera(camera), + m_camera_node(m_scene_manager->getRootSceneNode()->createChildSceneNode()), m_viewport(viewport), m_ray_scene_query(m_scene_manager->createRayQuery(Ogre::Ray())), m_volume_scene_query(m_scene_manager->createPlaneBoundedVolumeQuery(Ogre::PlaneBoundedVolumeList())), + m_camera_animation(m_scene_manager->createAnimation("CameraTrack", CAMERA_RECENTER_TIME)), + m_camera_animation_state(m_scene_manager->createAnimationState("CameraTrack")), m_distance_to_lookat_point(SYSTEM_RADIUS / 2.0), m_pitch(0.0), m_roll(0.0), @@ -341,7 +345,7 @@ m_selection_drag_start(INVALID_SELECTION_DRAG_POS), m_selection_drag_stop(INVALID_SELECTION_DRAG_POS), m_mouse_dragged(false), - m_currently_selected_scene_node(0), + m_lookat_scene_node(0), m_selection_rect(), m_lookat_point(0, 0, 0), m_star_back_billboard(0), @@ -354,7 +358,8 @@ m_menu_showing(false), m_exit(false) { - GG::Connect(GetOptionsDB().OptionChangedSignal("combat.enable-glow"), &CombatWnd::UpdateStarFromCameraPosition, this); + GG::Connect(GetOptionsDB().OptionChangedSignal("combat.enable-glow"), + &CombatWnd::UpdateStarFromCameraPosition, this); Ogre::Root::getSingleton().addFrameListener(this); m_scene_manager->addRenderQueueListener(m_stencil_op_frame_listener); @@ -423,9 +428,15 @@ m_camera->setNearClipDistance(NEAR_CLIP); m_camera->setFarClipDistance(FAR_CLIP); + m_camera->setQueryFlags(UNSELECTABLE_OBJECT_MASK); + m_camera_node->attachObject(m_camera); + m_camera_animation->setInterpolationMode(Ogre::Animation::IM_SPLINE); + m_camera_animation_state->setEnabled(true); + m_camera_animation_state->setLoop(false); + // look at the star initially - m_currently_selected_scene_node = star_node; + m_lookat_scene_node = star_node; UpdateCameraPosition(); AttachChild(m_fps_text); @@ -434,7 +445,7 @@ // NOTE: Below is temporary code for combat system prototyping! // ////////////////////////////////////////////////////////////////// - // a system that looks much like the solar system + // a sample system std::vector<Planet*> planets; planets.push_back(new Planet(PT_SWAMP, SZ_SMALL)); planets.push_back(new Planet(PT_TOXIC, SZ_LARGE)); @@ -688,7 +699,20 @@ if (it == m_current_selections.end()) { if (!(mod_keys & GG::MOD_KEY_CTRL)) { DeselectAll(); - m_currently_selected_scene_node = clicked_scene_node; + const Ogre::Vector3 DISTANCE = + clicked_scene_node->getWorldPosition() - m_lookat_scene_node->getWorldPosition(); + m_lookat_scene_node = clicked_scene_node; + m_camera_animation_state->setTimePosition(0.0); + Ogre::NodeAnimationTrack* track = m_camera_animation->createNodeTrack(0, m_camera_node); + const int STEPS = 8; + const Ogre::Real TIME_INCREMENT = CAMERA_RECENTER_TIME / STEPS; + const Ogre::Vector3 DISTANCE_INCREMENT = DISTANCE / STEPS; + // the loop extends an extra 2 steps in either direction, to + // ensure smoothness (since splines are being used) + for (int i = -2; i < STEPS + 2; ++i) { + Ogre::TransformKeyFrame* key = track->createNodeKeyFrame(i * TIME_INCREMENT); + key->setTranslate(m_lookat_scene_node->getWorldPosition() - DISTANCE + i * DISTANCE_INCREMENT); + } } m_current_selections[movable_object] = SelectedObject(movable_object); } else { @@ -771,8 +795,8 @@ void CombatWnd::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { Ogre::Sphere bounding_sphere(Ogre::Vector3(), 0.0); - if (m_currently_selected_scene_node) - bounding_sphere = m_currently_selected_scene_node->getAttachedObject(0)->getWorldBoundingSphere(); + if (m_lookat_scene_node) + bounding_sphere = m_lookat_scene_node->getAttachedObject(0)->getWorldBoundingSphere(); const Ogre::Real EFFECTIVE_MIN_DISTANCE = std::max(bounding_sphere.getRadius() * Ogre::Real(1.05), MIN_ZOOM_IN_DISTANCE); @@ -788,7 +812,6 @@ else if (MAX_ZOOM_OUT_DISTANCE < m_distance_to_lookat_point + total_move) total_move -= (m_distance_to_lookat_point + total_move) - MAX_ZOOM_OUT_DISTANCE; m_distance_to_lookat_point += total_move; - m_camera->moveRelative(Ogre::Vector3(0, 0, -total_move)); } void CombatWnd::KeyPress(GG::Key key, GG::Flags<GG::ModKey> mod_keys) @@ -811,12 +834,13 @@ bool CombatWnd::frameStarted(const Ogre::FrameEvent& event) { - if (m_currently_selected_scene_node) { - m_lookat_point = m_currently_selected_scene_node->getWorldPosition(); + if (m_lookat_scene_node) { + m_lookat_point = m_lookat_scene_node->getWorldPosition(); UpdateCameraPosition(); } - Ogre::RenderTarget::FrameStats stats = Ogre::Root::getSingleton().getRenderTarget("FreeOrion " + FreeOrionVersionString())->getStatistics(); + Ogre::RenderTarget::FrameStats stats = + Ogre::Root::getSingleton().getRenderTarget("FreeOrion " + FreeOrionVersionString())->getStatistics(); m_fps_text->SetText(boost::lexical_cast<std::string>(stats.lastFPS) + " FPS"); const bool ENABLE_GLOW = GetOptionsDB().Get<bool>("combat.enable-glow"); @@ -825,6 +849,10 @@ material->getTechnique(0)->getPass(3)->setDepthCheckEnabled(!ENABLE_GLOW); material->getTechnique(0)->getPass(4)->setDepthCheckEnabled(!ENABLE_GLOW); + m_camera_animation_state->addTime(event.timeSinceLastFrame); + if (m_camera_animation_state->hasEnded()) + m_camera_animation->destroyAllTracks(); + return !m_exit; } @@ -835,7 +863,8 @@ void CombatWnd::UpdateCameraPosition() { - m_camera->setPosition(m_lookat_point); + m_camera_node->setPosition(m_lookat_point); + m_camera->setPosition(Ogre::Vector3::ZERO); m_camera->setDirection(Ogre::Vector3::NEGATIVE_UNIT_Z); m_camera->roll(m_roll); m_camera->pitch(m_pitch); @@ -963,10 +992,10 @@ m_right_horizontal_flare_scroll_offset = 0.0; } - Ogre::Vector3 star_direction = Ogre::Vector3(0.0, 0.0, 0.0) - m_camera->getPosition(); + Ogre::Vector3 star_direction = Ogre::Vector3(0.0, 0.0, 0.0) - m_camera->getRealPosition(); star_direction.normalise(); Ogre::Radian angle_at_view_center_to_star = - Ogre::Math::ACos(m_camera->getDirection().dotProduct(star_direction)); + Ogre::Math::ACos(m_camera->getRealDirection().dotProduct(star_direction)); Ogre::Real BRIGHTNESS_AT_MAX_FOVY = 0.25; Ogre::Real center_nearness_factor = 1.0 - angle_at_view_center_to_star.valueRadians() / (m_camera->getFOVy() / 2.0).valueRadians(); Modified: branches/ogre-integration/UI/CombatWnd.h =================================================================== --- branches/ogre-integration/UI/CombatWnd.h 2008-04-27 13:21:44 UTC (rev 2532) +++ branches/ogre-integration/UI/CombatWnd.h 2008-04-27 18:28:03 UTC (rev 2533) @@ -80,10 +80,14 @@ Ogre::SceneManager* m_scene_manager; Ogre::Camera* m_camera; + Ogre::SceneNode* m_camera_node; Ogre::Viewport* m_viewport; Ogre::RaySceneQuery* m_ray_scene_query; Ogre::PlaneBoundedVolumeListSceneQuery* m_volume_scene_query; + Ogre::Animation* m_camera_animation; + Ogre::AnimationState* m_camera_animation_state; + Ogre::Real m_distance_to_lookat_point; Ogre::Radian m_pitch; Ogre::Radian m_roll; @@ -91,7 +95,7 @@ GG::Pt m_selection_drag_start; GG::Pt m_selection_drag_stop; bool m_mouse_dragged; - Ogre::SceneNode* m_currently_selected_scene_node; + Ogre::SceneNode* m_lookat_scene_node; GG::Rect m_selection_rect; Ogre::Vector3 m_lookat_point; std::map<Ogre::MovableObject*, SelectedObject> m_current_selections; |
From: <tz...@us...> - 2008-04-27 21:18:42
|
Revision: 2534 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2534&view=rev Author: tzlaine Date: 2008-04-27 14:18:49 -0700 (Sun, 27 Apr 2008) Log Message: ----------- Changed the mouse interface to CombatWnd slightly. Now, clicking is used for selection only; it no longer recenters. Recentering is performed by double-clicking. Recentering can be done on any point on the x-y plane, or on an object. Modified Paths: -------------- branches/ogre-integration/UI/CombatWnd.cpp branches/ogre-integration/UI/CombatWnd.h Modified: branches/ogre-integration/UI/CombatWnd.cpp =================================================================== --- branches/ogre-integration/UI/CombatWnd.cpp 2008-04-27 18:28:03 UTC (rev 2533) +++ branches/ogre-integration/UI/CombatWnd.cpp 2008-04-27 21:18:49 UTC (rev 2534) @@ -338,16 +338,16 @@ m_volume_scene_query(m_scene_manager->createPlaneBoundedVolumeQuery(Ogre::PlaneBoundedVolumeList())), m_camera_animation(m_scene_manager->createAnimation("CameraTrack", CAMERA_RECENTER_TIME)), m_camera_animation_state(m_scene_manager->createAnimationState("CameraTrack")), - m_distance_to_lookat_point(SYSTEM_RADIUS / 2.0), + m_distance_to_look_at_point(SYSTEM_RADIUS / 2.0), m_pitch(0.0), m_roll(0.0), m_last_pos(), m_selection_drag_start(INVALID_SELECTION_DRAG_POS), m_selection_drag_stop(INVALID_SELECTION_DRAG_POS), m_mouse_dragged(false), - m_lookat_scene_node(0), + m_look_at_scene_node(0), m_selection_rect(), - m_lookat_point(0, 0, 0), + m_look_at_point(0, 0, 0), m_star_back_billboard(0), m_initial_left_horizontal_flare_scroll(0.0), m_initial_right_horizontal_flare_scroll(0.0), @@ -436,7 +436,7 @@ m_camera_animation_state->setLoop(false); // look at the star initially - m_lookat_scene_node = star_node; + m_look_at_scene_node = star_node; UpdateCameraPosition(); AttachChild(m_fps_text); @@ -685,6 +685,30 @@ EndSelectionDrag(); } +void CombatWnd::LookAt(Ogre::SceneNode* look_at_node) +{ + m_look_at_scene_node = look_at_node; + LookAt(m_look_at_scene_node->getWorldPosition()); +} + +void CombatWnd::LookAt(const Ogre::Vector3& look_at_point) +{ + const Ogre::Vector3 DISTANCE = look_at_point - m_look_at_point; + m_look_at_point = look_at_point; + UpdateCameraPosition(); + m_camera_animation_state->setTimePosition(0.0); + Ogre::NodeAnimationTrack* track = m_camera_animation->createNodeTrack(0, m_camera_node); + const int STEPS = 8; + const Ogre::Real TIME_INCREMENT = CAMERA_RECENTER_TIME / STEPS; + const Ogre::Vector3 DISTANCE_INCREMENT = DISTANCE / STEPS; + // the loop extends an extra 2 steps in either direction, to + // ensure smoothness (since splines are being used) + for (int i = -2; i < STEPS + 2; ++i) { + Ogre::TransformKeyFrame* key = track->createNodeKeyFrame(i * TIME_INCREMENT); + key->setTranslate(look_at_point - DISTANCE + i * DISTANCE_INCREMENT); + } +} + void CombatWnd::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (m_selection_drag_start != INVALID_SELECTION_DRAG_POS) { @@ -697,23 +721,8 @@ std::map<Ogre::MovableObject*, SelectedObject>::iterator it = m_current_selections.find(movable_object); if (it == m_current_selections.end()) { - if (!(mod_keys & GG::MOD_KEY_CTRL)) { + if (!(mod_keys & GG::MOD_KEY_CTRL)) DeselectAll(); - const Ogre::Vector3 DISTANCE = - clicked_scene_node->getWorldPosition() - m_lookat_scene_node->getWorldPosition(); - m_lookat_scene_node = clicked_scene_node; - m_camera_animation_state->setTimePosition(0.0); - Ogre::NodeAnimationTrack* track = m_camera_animation->createNodeTrack(0, m_camera_node); - const int STEPS = 8; - const Ogre::Real TIME_INCREMENT = CAMERA_RECENTER_TIME / STEPS; - const Ogre::Vector3 DISTANCE_INCREMENT = DISTANCE / STEPS; - // the loop extends an extra 2 steps in either direction, to - // ensure smoothness (since splines are being used) - for (int i = -2; i < STEPS + 2; ++i) { - Ogre::TransformKeyFrame* key = track->createNodeKeyFrame(i * TIME_INCREMENT); - key->setTranslate(m_lookat_scene_node->getWorldPosition() - DISTANCE + i * DISTANCE_INCREMENT); - } - } m_current_selections[movable_object] = SelectedObject(movable_object); } else { if (mod_keys & GG::MOD_KEY_CTRL) @@ -727,6 +736,20 @@ void CombatWnd::LDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { + if (!m_mouse_dragged) { + if (Ogre::MovableObject* movable_object = GetObjectUnderPt(pt)) { + Ogre::SceneNode* clicked_scene_node = movable_object->getParentSceneNode(); + assert(clicked_scene_node); + LookAt(clicked_scene_node); + } else { + Ogre::Ray ray = m_camera->getCameraToViewportRay(pt.x * 1.0 / GG::GUI::GetGUI()->AppWidth(), + pt.y * 1.0 / GG::GUI::GetGUI()->AppHeight()); + std::pair<bool, Ogre::Real> intersection = + Ogre::Math::intersects(ray, Ogre::Plane(Ogre::Vector3::UNIT_Z, Ogre::Vector3::ZERO)); + if (intersection.first) + LookAt(ray.getPoint(intersection.second)); + } + } } void CombatWnd::MButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) @@ -795,23 +818,23 @@ void CombatWnd::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { Ogre::Sphere bounding_sphere(Ogre::Vector3(), 0.0); - if (m_lookat_scene_node) - bounding_sphere = m_lookat_scene_node->getAttachedObject(0)->getWorldBoundingSphere(); + if (m_look_at_scene_node) + bounding_sphere = m_look_at_scene_node->getAttachedObject(0)->getWorldBoundingSphere(); const Ogre::Real EFFECTIVE_MIN_DISTANCE = std::max(bounding_sphere.getRadius() * Ogre::Real(1.05), MIN_ZOOM_IN_DISTANCE); - Ogre::Real move_incr = m_distance_to_lookat_point * 0.25; + Ogre::Real move_incr = m_distance_to_look_at_point * 0.25; Ogre::Real scale_factor = 1.0; if (mod_keys & GG::MOD_KEY_SHIFT) scale_factor *= 2.0; if (mod_keys & GG::MOD_KEY_CTRL) scale_factor /= 4.0; Ogre::Real total_move = move_incr * scale_factor * -move; - if (m_distance_to_lookat_point + total_move < EFFECTIVE_MIN_DISTANCE) - total_move += EFFECTIVE_MIN_DISTANCE - (m_distance_to_lookat_point + total_move); - else if (MAX_ZOOM_OUT_DISTANCE < m_distance_to_lookat_point + total_move) - total_move -= (m_distance_to_lookat_point + total_move) - MAX_ZOOM_OUT_DISTANCE; - m_distance_to_lookat_point += total_move; + if (m_distance_to_look_at_point + total_move < EFFECTIVE_MIN_DISTANCE) + total_move += EFFECTIVE_MIN_DISTANCE - (m_distance_to_look_at_point + total_move); + else if (MAX_ZOOM_OUT_DISTANCE < m_distance_to_look_at_point + total_move) + total_move -= (m_distance_to_look_at_point + total_move) - MAX_ZOOM_OUT_DISTANCE; + m_distance_to_look_at_point += total_move; } void CombatWnd::KeyPress(GG::Key key, GG::Flags<GG::ModKey> mod_keys) @@ -834,11 +857,6 @@ bool CombatWnd::frameStarted(const Ogre::FrameEvent& event) { - if (m_lookat_scene_node) { - m_lookat_point = m_lookat_scene_node->getWorldPosition(); - UpdateCameraPosition(); - } - Ogre::RenderTarget::FrameStats stats = Ogre::Root::getSingleton().getRenderTarget("FreeOrion " + FreeOrionVersionString())->getStatistics(); m_fps_text->SetText(boost::lexical_cast<std::string>(stats.lastFPS) + " FPS"); @@ -863,12 +881,12 @@ void CombatWnd::UpdateCameraPosition() { - m_camera_node->setPosition(m_lookat_point); + m_camera_node->setPosition(m_look_at_point); m_camera->setPosition(Ogre::Vector3::ZERO); m_camera->setDirection(Ogre::Vector3::NEGATIVE_UNIT_Z); m_camera->roll(m_roll); m_camera->pitch(m_pitch); - m_camera->moveRelative(Ogre::Vector3(0, 0, m_distance_to_lookat_point)); + m_camera->moveRelative(Ogre::Vector3(0, 0, m_distance_to_look_at_point)); UpdateStarFromCameraPosition(); } Modified: branches/ogre-integration/UI/CombatWnd.h =================================================================== --- branches/ogre-integration/UI/CombatWnd.h 2008-04-27 18:28:03 UTC (rev 2533) +++ branches/ogre-integration/UI/CombatWnd.h 2008-04-27 21:18:49 UTC (rev 2534) @@ -71,6 +71,8 @@ virtual bool frameStarted(const Ogre::FrameEvent& event); virtual bool frameEnded(const Ogre::FrameEvent& event); + void LookAt(Ogre::SceneNode* look_at_node); + void LookAt(const Ogre::Vector3& look_at_point); void UpdateCameraPosition(); void UpdateStarFromCameraPosition(); void EndSelectionDrag(); @@ -88,16 +90,16 @@ Ogre::Animation* m_camera_animation; Ogre::AnimationState* m_camera_animation_state; - Ogre::Real m_distance_to_lookat_point; + Ogre::Real m_distance_to_look_at_point; Ogre::Radian m_pitch; Ogre::Radian m_roll; GG::Pt m_last_pos; GG::Pt m_selection_drag_start; GG::Pt m_selection_drag_stop; bool m_mouse_dragged; - Ogre::SceneNode* m_lookat_scene_node; + Ogre::SceneNode* m_look_at_scene_node; GG::Rect m_selection_rect; - Ogre::Vector3 m_lookat_point; + Ogre::Vector3 m_look_at_point; std::map<Ogre::MovableObject*, SelectedObject> m_current_selections; Ogre::Billboard* m_star_back_billboard; |