From a4c0ea9d075c01b69ad2c66e9736d6693ade25e8 Mon Sep 17 00:00:00 2001 From: pyrolink Date: Tue, 27 Feb 2007 02:14:18 +0000 Subject: [PATCH] #Cinematic changes -Eliminated tracks, rotation is per node This was SVN commit r4929. --- source/graphics/CinemaTrack.cpp | 392 ++----- source/graphics/CinemaTrack.h | 91 +- source/graphics/GameView.cpp | 1 - source/graphics/MapReader.cpp | 129 +-- source/graphics/MapWriter.cpp | 67 +- source/maths/NUSpline.cpp | 10 +- source/maths/NUSpline.h | 11 +- source/ps/GameSetup/GameSetup.cpp | 2 +- .../Sections/Cinematic/Cinematic.cpp | 983 +++++------------- .../Sections/Cinematic/Cinematic.h | 46 +- .../Sections/Trigger/Trigger.cpp | 118 ++- .../ScenarioEditor/Sections/Trigger/Trigger.h | 1 + .../GameInterface/Handlers/CinemaHandler.cpp | 181 ++-- .../GameInterface/Handlers/MiscHandlers.cpp | 4 +- .../GameInterface/Handlers/TriggerHandler.cpp | 4 +- source/tools/atlas/GameInterface/Messages.h | 13 +- .../tools/atlas/GameInterface/SharedTypes.h | 32 +- 17 files changed, 749 insertions(+), 1336 deletions(-) diff --git a/source/graphics/CinemaTrack.cpp b/source/graphics/CinemaTrack.cpp index 24efca317d..63a8ff84ce 100644 --- a/source/graphics/CinemaTrack.cpp +++ b/source/graphics/CinemaTrack.cpp @@ -16,10 +16,54 @@ #include "lib/res/mem.h" CCinemaPath::CCinemaPath(const CCinemaData& data, const TNSpline& spline) -: CCinemaData(data), TNSpline(spline), m_TimeElapsed(0.f) + : CCinemaData(data), TNSpline(spline), m_TimeElapsed(0.f) { - DistStylePtr = &CCinemaPath::EaseDefault; - DistModePtr = &CCinemaPath::EaseIn; + m_TimeElapsed = 0; + BuildSpline(); + + //Set distortion mode and style + switch(data.m_Mode) + { + case CCinemaPath::EM_IN: + DistModePtr = &CCinemaPath::EaseIn; + break; + case CCinemaPath::EM_OUT: + DistModePtr = &CCinemaPath::EaseOut; + break; + case CCinemaPath::EM_INOUT: + DistModePtr = &CCinemaPath::EaseInOut; + break; + case CCinemaPath::EM_OUTIN: + DistModePtr = &CCinemaPath::EaseOutIn; + break; + default: + debug_printf("Cinematic mode not found for %d ", data.m_Mode); + break; + } + + switch (data.m_Style) + { + case CCinemaPath::ES_DEFAULT: + DistStylePtr = &CCinemaPath::EaseDefault; + break; + case CCinemaPath::ES_GROWTH: + DistStylePtr = &CCinemaPath::EaseGrowth; + break; + case CCinemaPath::ES_EXPO: + DistStylePtr = &CCinemaPath::EaseExpo; + break; + case CCinemaPath::ES_CIRCLE: + DistStylePtr = &CCinemaPath::EaseCircle; + break; + case CCinemaPath::ES_SINE: + DistStylePtr = &CCinemaPath::EaseSine; + break; + default: + debug_printf("Cinematic mode not found for %d !", data.m_Style); + break; + } + //UpdateDuration(); + } void CCinemaPath::DrawSpline(const CVector4D& RGBA, int smoothness, bool lines) const @@ -75,16 +119,18 @@ void CCinemaPath::DrawSpline(const CVector4D& RGBA, int smoothness, bool lines) glDisable(GL_POINT_SMOOTH); } } -void CCinemaPath::MoveToPointAt(float t, const CVector3D &startRotation) +void CCinemaPath::MoveToPointAt(float t, float nodet, const CVector3D& startRotation) { - CCamera *Cam=g_Game->GetView()->GetCamera(); + CCamera *Cam = g_Game->GetView()->GetCamera(); t = (this->*DistModePtr)(t); - + + CVector3D nodeRotation = Node[m_CurrentNode + 1].Rotation; CQuaternion start, end; - start.FromEulerAngles(startRotation.X, startRotation.Y, startRotation.Z); - end.FromEulerAngles(m_TotalRotation.X, m_TotalRotation.Y, m_TotalRotation.Z); - start.Slerp(start, end, t); + start.FromEulerAngles(DEGTORAD(startRotation.X), DEGTORAD(startRotation.Y), DEGTORAD(startRotation.Z)); + end.FromEulerAngles(DEGTORAD(nodeRotation.X), DEGTORAD(nodeRotation.Y), DEGTORAD(nodeRotation.Z)); + start.Slerp(start, end, nodet); CVector3D pos = GetPosition(t); + CQuaternion quat; Cam->m_Orientation.SetIdentity(); Cam->m_Orientation.Rotate(start); @@ -153,338 +199,120 @@ float CCinemaPath::EaseSine(float t) const return t; } -//-------CinemaTrack functions------ -//AddPath-For building tracks from loaded file -CCinemaTrack::CCinemaTrack() : m_AbsoluteTime(0), m_Timescale(1), - m_TotalDuration(0) +bool CCinemaPath::Validate() { - m_CPA = m_Paths.end(); -} -void CCinemaTrack::AddPath(const CCinemaData& data, const TNSpline& spline) -{ - CCinemaPath path(data, spline); - path.m_TimeElapsed=0; - - path.BuildSpline(); - m_Paths.push_back(path); - std::vector::iterator SetTemp; - SetTemp=m_Paths.end() - 1; - - //Set distortion mode and style - switch(data.m_Mode) + if ( m_TimeElapsed < GetDuration() && m_TimeElapsed > 0.0f ) { - case CCinemaPath::EM_IN: - SetTemp->DistModePtr = &CCinemaPath::EaseIn; - break; - case CCinemaPath::EM_OUT: - SetTemp->DistModePtr = &CCinemaPath::EaseOut; - break; - case CCinemaPath::EM_INOUT: - SetTemp->DistModePtr = &CCinemaPath::EaseInOut; - break; - case CCinemaPath::EM_OUTIN: - SetTemp->DistModePtr = &CCinemaPath::EaseOutIn; - break; - default: - debug_printf("Cinematic mode not found for %d ", data.m_Mode); - break; - } - - switch (data.m_Style) - { - case CCinemaPath::ES_DEFAULT: - SetTemp->DistStylePtr = &CCinemaPath::EaseDefault; - break; - case CCinemaPath::ES_GROWTH: - SetTemp->DistStylePtr = &CCinemaPath::EaseGrowth; - break; - case CCinemaPath::ES_EXPO: - SetTemp->DistStylePtr = &CCinemaPath::EaseExpo; - break; - case CCinemaPath::ES_CIRCLE: - SetTemp->DistStylePtr = &CCinemaPath::EaseCircle; - break; - case CCinemaPath::ES_SINE: - SetTemp->DistStylePtr = &CCinemaPath::EaseSine; - break; - default: - debug_printf("Cinematic mode not found for %d !", data.m_Style); - break; - } - UpdateDuration(); -} -void CCinemaTrack::AddPath(const CCinemaPath& path) -{ - m_Paths.push_back(path); - m_Paths.back().BuildSpline(); - m_Paths.back().m_TimeElapsed = 0; - - UpdateDuration(); -} - -void CCinemaTrack::UpdateDuration() -{ - m_TotalDuration=0; - for ( std::vector::iterator it=m_Paths.begin(); it!=m_Paths.end(); it++ ) - { - m_TotalDuration += it->MaxDistance; - } -} -bool CCinemaTrack::Validate() -{ - if ( m_CPA->m_TimeElapsed > 0.f ) - return ValidateForward(); - else - return ValidateRewind(); -} - -bool CCinemaTrack::ValidateRewind() -{ - if (m_CPA->m_TimeElapsed < 0) - { - if (m_CPA == m_Paths.begin()) + //Find current node and past "node time" + float previousTime = 0.0f, cumulation = 0.0f; + //Ignore the last node, since it is a blank (node time values are shifted down one from interface) + for ( size_t i = 0; i < Node.size() - 1; ++i ) { - m_CPA->m_TimeElapsed = 0.0f; - m_CPA->MoveToPointAt(0.0f, m_StartRotation); - return false; - } - //Make sure it's within limits of path - else - { - float Pos=m_CPA->m_TimeElapsed; - m_CPA--; - while (1) + cumulation += Node[i].Distance; + if ( m_TimeElapsed < cumulation ) { - if (m_CPA->GetDuration() + Pos < 0) - { - if (m_CPA == m_Paths.begin()) - { - m_CPA->m_TimeElapsed = m_CPA->MaxDistance; - m_CPA->MoveToPointAt(0.0f, m_StartRotation ); - return false; - } - Pos+=m_CPA->GetDuration(); - m_CPA->m_TimeElapsed=0; - m_CPA--; - } - else - { - m_CPA->m_TimeElapsed+=Pos; - break; - } + m_PreviousNodeTime = previousTime; + m_PreviousRotation = Node[i].Rotation; + m_CurrentNode = i; //We're moving toward this next node, so use its rotation + return true; } - } //inside limits - } - return true; -} - -bool CCinemaTrack::ValidateForward() -{ - if (m_CPA->m_TimeElapsed >= m_CPA->MaxDistance) - { - if (m_CPA == m_Paths.end() - 1) - { - if ( m_CPA->GetDuration() < .0001f ) //blank path - return false; - m_CPA->MoveToPointAt(1.f, CalculateRotation()); - return false; + else + previousTime += Node[i].Distance; } - //Make sure it's within limits of path - else - { - float Pos = m_CPA->m_TimeElapsed - m_CPA->MaxDistance; - m_CPA++; - - while (1) - { - if (Pos > m_CPA->MaxDistance) - { - if (m_CPA == m_Paths.end() -1) - { - if ( m_CPA->MaxDistance < .0001f ) //blank path - return false; - - m_CPA->m_TimeElapsed = m_CPA->MaxDistance; - m_CPA->MoveToPointAt(1.0f, m_StartRotation ); - return false; - } - Pos -= m_CPA->MaxDistance; - m_CPA->m_TimeElapsed = m_CPA->MaxDistance; - m_CPA++; - } - else - { - m_CPA->m_TimeElapsed = Pos; - break; - } - } - } //inside limits of path - } - return true; -} -CVector3D CCinemaTrack::CalculateRotation() -{ - CVector3D rotation; - if ( m_CPA == m_Paths.begin() ) - return m_StartRotation; - else - return (m_CPA-1)->GetData()->m_TotalRotation; + } + return false; } -bool CCinemaTrack::Play(float DeltaTime) +bool CCinemaPath::Play(float DeltaTime) { - m_CPA->m_TimeElapsed += m_Timescale*DeltaTime; - m_AbsoluteTime += m_Timescale*DeltaTime; + m_TimeElapsed += m_Timescale*DeltaTime; if (!Validate()) return false; - m_CPA->MoveToPointAt( m_CPA->GetElapsedTime() / m_CPA->GetDuration(), CalculateRotation() ); + MoveToPointAt( m_TimeElapsed / GetDuration(), GetNodeFraction(), m_PreviousRotation ); return true; } -CCinemaManager::CCinemaManager() : m_DrawCurrentSpline(false), - m_DrawAllSplines(false), m_Active(true), m_CurrentTrack(false) + +CCinemaManager::CCinemaManager() : m_DrawCurrentSpline(false), m_Active(true) { + m_CurrentPath = m_Paths.end(); } -void CCinemaManager::AddTrack(CCinemaTrack track, const CStrW& name) +void CCinemaManager::AddPath(CCinemaPath path, const CStrW& name) { - debug_assert( m_Tracks.find( name ) == m_Tracks.end() ); - m_Tracks[name] = track; + debug_assert( m_Paths.find( name ) == m_Paths.end() ); + m_Paths[name] = path; } -void CCinemaManager::QueueTrack(const CStrW& name, bool queue ) +void CCinemaManager::QueuePath(const CStrW& name, bool queue ) { - if (!m_TrackQueue.empty() && queue == false) + if (!m_PathQueue.empty() && queue == false) { return; } else { debug_assert(HasTrack(name)); - if ( m_Tracks[name].m_Paths.empty() ) - return; - m_TrackQueue.push_back(m_Tracks[name]); - m_TrackQueue.back().m_CPA = m_TrackQueue.back().m_Paths.begin(); + m_PathQueue.push_back(m_Paths[name]); } } -void CCinemaManager::OverrideTrack(const CStrW& name) + +void CCinemaManager::OverridePath(const CStrW& name) { - m_TrackQueue.clear(); + m_PathQueue.clear(); debug_assert(HasTrack(name)); - if ( m_Tracks[name].m_Paths.empty() ) - return; - m_TrackQueue.push_back( m_Tracks[name] ); - m_TrackQueue.back().m_CPA = m_TrackQueue.back().m_Paths.begin(); + m_PathQueue.push_back( m_Paths[name] ); } -void CCinemaManager::SetAllTracks( const std::map& tracks) + +void CCinemaManager::SetAllPaths( const std::map& paths) { - m_Tracks = tracks; - - // TODO: this just assumes that if you had any track selected, it was the - // first. (We need to change m_CurrentTrack because it was pointing into - // the old m_Tracks.) - if (m_CurrentTrack) - m_CurrentTrack = (tracks.empty() ? NULL : &m_Tracks.begin()->second); - - for ( std::map::iterator it=m_Tracks.begin(); - it != m_Tracks.end(); ++it ) - { - it->second.m_CPA = it->second.m_Paths.begin(); - } + CStrW name; + m_Paths = paths; } -void CCinemaManager::SetCurrentTrack(const CStrW& name, bool all, bool current, bool drawLines) +void CCinemaManager::SetCurrentPath(const CStrW& name, bool current, bool drawLines) { debug_assert(HasTrack(name)); - m_CurrentTrack = &m_Tracks[name]; - m_DrawAllSplines = all; + m_CurrentPath = m_Paths.find(name); m_DrawCurrentSpline = current; m_DrawLines = drawLines; - DrawAllSplines(); -} -void CCinemaManager::SetCurrentPath(const int path) -{ - debug_assert(m_CurrentTrack); - m_CurrentPath = path; - m_CurrentTrack->m_CPA = m_CurrentTrack->m_Paths.begin() + path; + DrawSpline(); } + bool CCinemaManager::HasTrack(const CStrW& name) const { - return m_Tracks.find(name) != m_Tracks.end(); + return m_Paths.find(name) != m_Paths.end(); } -void CCinemaManager::DrawAllSplines() const +void CCinemaManager::DrawSpline() const { - if ( !(m_DrawAllSplines || m_DrawCurrentSpline) || !m_CurrentTrack ) + if ( !(m_DrawCurrentSpline || m_CurrentPath != m_Paths.end()) ) return; static const int smoothness = 200; - - if ( m_DrawAllSplines ) - { - for ( std::vector::iterator it = m_CurrentTrack->m_Paths.begin(); - it != m_CurrentTrack->m_Paths.end(); ++it ) - { - it->DrawSpline(CVector4D(0.f, 0.f, 1.f, 1.f), smoothness, m_DrawLines); - } - } - if ( m_DrawCurrentSpline && m_CurrentTrack->m_CPA != - m_CurrentTrack->m_Paths.end() ) - { - if ( m_DrawAllSplines ) - { - m_CurrentTrack->m_CPA->DrawSpline(CVector4D(1.f, 0.f, 0.f, 1.f), - smoothness, m_DrawLines); - } - else - { - m_CurrentTrack->m_CPA->DrawSpline(CVector4D(0.f, 0.f, 1.f, 1.f), - smoothness, m_DrawLines); - } - } + + m_CurrentPath->second.DrawSpline(CVector4D(0.f, 0.f, 1.f, 1.f), smoothness, m_DrawLines); } + void CCinemaManager::MoveToPointAt(float time) { - debug_assert(m_CurrentTrack); + debug_assert(m_CurrentPath != m_Paths.end()); StopPlaying(); - if ( m_CurrentTrack->m_Paths.empty() ) + + m_CurrentPath->second.m_TimeElapsed = time; + if ( !m_CurrentPath->second.Validate() ) return; - m_CurrentTrack->m_CPA->m_TimeElapsed = time; - if ( !m_CurrentTrack->Validate() ) - return; - m_CurrentTrack->m_CPA->MoveToPointAt(m_CurrentTrack->m_CPA->m_TimeElapsed / - m_CurrentTrack->m_CPA->GetDuration(), m_CurrentTrack->CalculateRotation()); + m_CurrentPath->second.MoveToPointAt(m_CurrentPath->second.m_TimeElapsed / + m_CurrentPath->second.GetDuration(), m_CurrentPath->second.GetNodeFraction(), + m_CurrentPath->second.m_PreviousRotation ); } -void CCinemaManager::MoveToPointAbsolute(float time) -{ - debug_assert(m_CurrentTrack); - g_Game->GetView()->GetCinema()->StopPlaying(); - if ( m_CurrentTrack->m_Paths.empty() ) - return; - m_CurrentTrack->m_CPA = m_CurrentTrack->m_Paths.begin(); - //Small adjustment for blank paths at end of track (so it doesn't count the last path) - m_CurrentTrack->m_AbsoluteTime = m_CurrentTrack->m_CPA->m_TimeElapsed = time - .0001f; - - if (!m_CurrentTrack->ValidateForward()) - return; - - float duration = m_CurrentTrack->m_CPA->GetDuration(); -/* if ( duration < .0001f ) //blank path, used for finishing rotation - { - m_CurrentTrack->m_CPA->MoveToPointAt(1.0f, m_CurrentTrack->CalculateRotation()); - return; - }*/ - m_CurrentTrack->m_CPA->MoveToPointAt(m_CurrentTrack->m_CPA->m_TimeElapsed / duration, - m_CurrentTrack->CalculateRotation()); - -} bool CCinemaManager::Update(float DeltaTime) { - if (!m_TrackQueue.front().Play(DeltaTime)) + if (!m_PathQueue.front().Play(DeltaTime)) { - m_TrackQueue.pop_front(); + m_PathQueue.pop_front(); return false; } return true; diff --git a/source/graphics/CinemaTrack.h b/source/graphics/CinemaTrack.h index e3df65b4a2..a25b018abb 100644 --- a/source/graphics/CinemaTrack.h +++ b/source/graphics/CinemaTrack.h @@ -10,7 +10,7 @@ /* Andrew Decker (aka pyrolink) Contact: ajdecker1022@msn.com - desc: contains various functions used for cinematic camera tracks + desc: contains various functions used for cinematic camera paths See also: CinemaHandler.cpp, Cinematic.h/.cpp */ @@ -23,27 +23,30 @@ class CCinemaData { public: CCinemaData() : m_GrowthCount(0), m_Growth(0), m_Switch(0), - m_Mode(0), m_Style(0) {} + m_Mode(0), m_Style(0), m_Timescale(1) {} virtual ~CCinemaData() {} const CCinemaData* GetData() const { return this; } - CVector3D m_TotalRotation; - //Distortion variables mutable float m_GrowthCount; float m_Growth; float m_Switch; int m_Mode; int m_Style; + float m_Timescale; //a negative timescale results in backwards play }; -//Once the data is part of the path, it shouldn't be changeable + +//Once the data is part of the path, it shouldn't be changeable, so use private inheritance. +//This class encompasses the spline and the information which determines how the path will operate +//and also provides the functionality for doing so + class CCinemaPath : private CCinemaData, public TNSpline { - //friend class CCinemaTrack; public: + CCinemaPath() { m_TimeElapsed = 0.0f; m_PreviousNodeTime = 0.0f; } CCinemaPath(const CCinemaData& data, const TNSpline& spline); ~CCinemaPath() { DistStylePtr = NULL; DistModePtr = NULL; } @@ -51,7 +54,7 @@ public: enum { ES_DEFAULT, ES_GROWTH, ES_EXPO, ES_CIRCLE, ES_SINE }; //sets camera position to calculated point on spline - void MoveToPointAt(float t, const CVector3D &startRotation); + void MoveToPointAt(float t, float nodet, const CVector3D& ); //Distortion mode functions-change how ratio is passed to distortion style functions float EaseIn(float t) const; @@ -78,86 +81,62 @@ public: inline CVector3D GetNodePosition(const int index) const { return Node[index].Position; } inline float GetNodeDuration(const int index) const { return Node[index].Distance; } inline float GetDuration() const { return MaxDistance; } + + inline float GetNodeFraction() const { return (m_TimeElapsed - m_PreviousNodeTime) / Node[m_CurrentNode].Distance; } inline float GetElapsedTime() const { return m_TimeElapsed; } - const std::vector& GetAllNodes() const { return Node; } + + inline void SetTimescale(float scale) { m_Timescale = scale; } float m_TimeElapsed; -}; - -class CCinemaTrack -{ - friend class CCinemaManager; -public: - CCinemaTrack(); - ~CCinemaTrack() {} + float m_PreviousNodeTime; //How much time has passed before the current node - void AddPath(const CCinemaData& data, const TNSpline& spline); - void AddPath(const CCinemaPath& path); - inline void SetTimescale(float scale) { m_Timescale = scale; } - inline void SetStartRotation(CVector3D rotation) { m_StartRotation = rotation; } - void UpdateDuration(); + size_t m_CurrentNode; + CVector3D m_PreviousRotation; + +public: //Returns false if finished bool Play(float DeltaTime); bool Validate(); - inline const CVector3D& GetRotation() const { return m_StartRotation; } - inline float GetTimescale() const { return m_Timescale; } - inline float GetTotalDuration() const { return m_TotalDuration; } - inline const std::vector& GetAllPaths() const { return m_Paths; } - - -private: - std::vector m_Paths; - std::vector::iterator m_CPA; //current path - CVector3D m_StartRotation; - float m_Timescale; //a negative timescale results in backwards play - float m_AbsoluteTime; //Current time of track, in absolute terms (not path) - float m_TotalDuration; - - bool ValidateForward(); - bool ValidateRewind(); - CVector3D CalculateRotation(); + inline float GetTimescale() const { return m_Timescale; } }; -//Class for in game playing of cinematics. Should only be instantiated -//in CGameView. +//Class for in game playing of cinematics. Should only be instantiated in CGameView. class CCinemaManager { public: CCinemaManager(); ~CCinemaManager() {} - void AddTrack(CCinemaTrack track, const CStrW& name); + void AddPath(CCinemaPath path, const CStrW& name); //Adds track to list of being played. - void QueueTrack(const CStrW& name, bool queue); - void OverrideTrack(const CStrW& name); //clears track queue and replaces with 'name' + void QueuePath(const CStrW& name, bool queue); + void OverridePath(const CStrW& name); //clears track queue and replaces with 'name' bool Update(float DeltaTime); //These stop track play, and accept time, not ratio of time void MoveToPointAt(float time); - void MoveToPointAbsolute(float time); //Time in terms of track - inline void StopPlaying() { m_TrackQueue.clear(); } - void DrawAllSplines() const; + inline void StopPlaying() { m_PathQueue.clear(); } + void DrawSpline() const; - inline bool IsPlaying() const { return !m_TrackQueue.empty(); } + inline bool IsPlaying() const { return !m_PathQueue.empty(); } bool HasTrack(const CStrW& name) const; inline bool IsActive() const { return m_Active; } inline void SetActive(bool active) { m_Active=active; } - inline const std::map& GetAllTracks() { return m_Tracks; } - void SetAllTracks( const std::map& tracks); - void SetCurrentTrack(const CStrW& name, bool all, bool current, bool lines); - void SetCurrentPath(int path); + inline const std::map& GetAllPaths() { return m_Paths; } + void SetAllPaths( const std::map& tracks); + void SetCurrentPath(const CStrW& name, bool current, bool lines); private: - bool m_Active, m_DrawCurrentSpline, m_DrawAllSplines, m_DrawLines; - int m_CurrentPath; - CCinemaTrack* m_CurrentTrack; - std::map m_Tracks; - std::list m_TrackQueue; + + bool m_Active, m_DrawCurrentSpline, m_DrawLines; + std::map::iterator m_CurrentPath; + std::map m_Paths; + std::list m_PathQueue; }; #endif diff --git a/source/graphics/GameView.cpp b/source/graphics/GameView.cpp index f717dc322c..6dc8d5435c 100644 --- a/source/graphics/GameView.cpp +++ b/source/graphics/GameView.cpp @@ -121,7 +121,6 @@ public: CLightEnv CachedLightEnv; CCinemaManager TrackManager; - CCinemaTrack TestTrack; //////////////////////////////////////// // Settings diff --git a/source/graphics/MapReader.cpp b/source/graphics/MapReader.cpp index e1679612b8..2c08c79b83 100644 --- a/source/graphics/MapReader.cpp +++ b/source/graphics/MapReader.cpp @@ -508,12 +508,12 @@ void CXMLReader::ReadCinema(XMBElement parent) #define EL(x) int el_##x = xmb_file.getElementID(#x) #define AT(x) int at_##x = xmb_file.getAttributeID(#x) - EL(track); - EL(startrotation); EL(path); EL(rotation); EL(distortion); EL(node); + EL(position); + EL(time); AT(name); AT(timescale); AT(mode); @@ -523,97 +523,98 @@ void CXMLReader::ReadCinema(XMBElement parent) AT(x); AT(y); AT(z); - AT(t); #undef EL #undef AT - std::map trackList; + std::map pathList; XERO_ITER_EL(parent, element) { int elementName = element.getNodeName(); - if ( elementName == el_track ) + if ( elementName == el_path ) { - CCinemaTrack track; XMBAttributeList attrs = element.getAttributes(); CStrW name( CStr(attrs.getNamedItem(at_name)) ); float timescale = CStr(attrs.getNamedItem(at_timescale)).ToFloat(); - track.SetTimescale(timescale); + CCinemaData pathData; + pathData.m_Timescale = timescale; + TNSpline spline, backwardSpline; - XERO_ITER_EL(element, trackChild) + XERO_ITER_EL(element, pathChild) { - elementName = trackChild.getNodeName(); + elementName = pathChild.getNodeName(); + attrs = pathChild.getAttributes(); - if ( elementName == el_startrotation ) + //Load distortion attributes + if ( elementName == el_distortion ) { - attrs = trackChild.getAttributes(); - float x = CStr(attrs.getNamedItem(at_x)).ToFloat(); - float y = CStr(attrs.getNamedItem(at_y)).ToFloat(); - float z = CStr(attrs.getNamedItem(at_z)).ToFloat(); - track.SetStartRotation(CVector3D(x, y, z)); + pathData.m_Mode = CStr(attrs.getNamedItem(at_mode)).ToInt(); + pathData.m_Style = CStr(attrs.getNamedItem(at_style)).ToInt(); + pathData.m_Growth = CStr(attrs.getNamedItem(at_growth)).ToInt(); + pathData.m_Switch = CStr(attrs.getNamedItem(at_switch)).ToInt(); } - else if ( elementName == el_path ) + + //Load node data used for spline + else if ( elementName == el_node ) { - CCinemaData pathData; - TNSpline spline, backwardSpline; - - XERO_ITER_EL(trackChild, pathChild) + SplineData data; + XERO_ITER_EL(pathChild, nodeChild) { - elementName = pathChild.getNodeName(); - attrs = pathChild.getAttributes(); - - if ( elementName == el_rotation ) + elementName = nodeChild.getNodeName(); + attrs = nodeChild.getAttributes(); + + //Fix?: assumes that time is last element + if ( elementName == el_position ) { - float x = CStr(attrs.getNamedItem(at_x)).ToFloat(); - float y = CStr(attrs.getNamedItem(at_y)).ToFloat(); - float z = CStr(attrs.getNamedItem(at_z)).ToFloat(); - pathData.m_TotalRotation = CVector3D(x, y, z); - } - else if ( elementName == el_distortion ) - { - pathData.m_Mode = CStr(attrs.getNamedItem(at_mode)).ToInt(); - pathData.m_Style = CStr(attrs.getNamedItem(at_style)).ToInt(); - pathData.m_Growth = CStr(attrs.getNamedItem(at_growth)).ToInt(); - pathData.m_Switch = CStr(attrs.getNamedItem(at_switch)).ToInt(); - } - else if ( elementName == el_node ) - { - SplineData data; data.Position.X = CStr(attrs.getNamedItem(at_x)).ToFloat(); data.Position.Y = CStr(attrs.getNamedItem(at_y)).ToFloat(); data.Position.Z = CStr(attrs.getNamedItem(at_z)).ToFloat(); - data.Distance = CStr(attrs.getNamedItem(at_t)).ToFloat(); - backwardSpline.AddNode(data.Position, data.Distance); + continue; } - else - debug_warn("Invalid cinematic element for path child"); - } //node loop - CCinemaPath temp(pathData, backwardSpline); - const std::vector& nodes = temp.GetAllNodes(); - if ( nodes.empty() ) - { - debug_warn("Failure loading cinematics"); - return; - } + else if ( elementName == el_rotation ) + { + data.Rotation.X = CStr(attrs.getNamedItem(at_x)).ToFloat(); + data.Rotation.Y = CStr(attrs.getNamedItem(at_y)).ToFloat(); + data.Rotation.Z = CStr(attrs.getNamedItem(at_z)).ToFloat(); + continue; + } + else if ( elementName == el_time ) + data.Distance = CStr( nodeChild.getText() ).ToFloat(); + else + debug_warn("Invalid cinematic element for node child"); - for ( std::vector::const_reverse_iterator - it=nodes.rbegin(); it != nodes.rend(); ++it ) - { - spline.AddNode(it->Position, it->Distance); + backwardSpline.AddNode(data.Position, data.Rotation, data.Distance); } - track.AddPath(pathData, spline); - - } // == el_path + } else - debug_warn("Invalid cinematic element for track child"); + debug_warn("Invalid cinematic element for path child"); + + } - trackList[name] = track; + + //Construct cinema path with data gathered + CCinemaPath temp(pathData, backwardSpline); + const std::vector& nodes = temp.GetAllNodes(); + if ( nodes.empty() ) + { + debug_warn("Failure loading cinematics"); + return; + } + + for ( std::vector::const_reverse_iterator it = nodes.rbegin(); + it != nodes.rend(); ++it ) + { + spline.AddNode(it->Position, it->Rotation, it->Distance); + } + + CCinemaPath path(pathData, spline); + pathList[name] = path; } - else - debug_warn("Invalid cinematic element for root track child"); + else + debug_assert("Invalid cinema child"); } - g_Game->GetView()->GetCinema()->SetAllTracks(trackList); + g_Game->GetView()->GetCinema()->SetAllPaths(pathList); } void CXMLReader::ReadTriggers(XMBElement parent) @@ -987,7 +988,7 @@ int CXMLReader::ProgressiveRead() if (ret != 0) // error or timed out return ret; } - else if (name == "Tracks") + else if (name == "Paths") { ReadCinema(node); } diff --git a/source/graphics/MapWriter.cpp b/source/graphics/MapWriter.cpp index 09cfa84f45..0bcf122063 100644 --- a/source/graphics/MapWriter.cpp +++ b/source/graphics/MapWriter.cpp @@ -333,62 +333,51 @@ void CMapWriter::WriteXML(const char* filename, } } - const std::map& tracks = pCinema->GetAllTracks(); - std::map::const_iterator it = tracks.begin(); + const std::map& paths = pCinema->GetAllPaths(); + std::map::const_iterator it = paths.begin(); { - XML_Element("Tracks"); + XML_Element("Paths"); - for ( ; it != tracks.end(); it++ ) + for ( ; it != paths.end(); it++ ) { - const std::vector& paths = it->second.GetAllPaths(); CStrW name = it->first; - size_t numPaths = paths.size(); - CVector3D startRotation = it->second.GetRotation(); float timescale = it->second.GetTimescale(); - - XML_Element("Track"); + + XML_Element("Path"); XML_Attribute("name", name); XML_Attribute("timescale", timescale); + + const std::vector& nodes = it->second.GetAllNodes(); + const CCinemaData* data = it->second.GetData(); { - XML_Element("StartRotation"); - XML_Attribute("x", startRotation.X); - XML_Attribute("y", startRotation.Y); - XML_Attribute("z", startRotation.Z); + XML_Element("Distortion"); + XML_Attribute("mode", data->m_Mode); + XML_Attribute("style", data->m_Style); + XML_Attribute("growth", data->m_Growth); + XML_Attribute("switch", data->m_Switch); } - - for ( size_t i=0; i= 0; --j ) { - const std::vector& nodes = paths[i].GetAllNodes(); - const CCinemaData* data = paths[i].GetData(); - - XML_Element("Path"); - - { - CVector3D rot = data->m_TotalRotation; - XML_Element("Rotation"); - XML_Attribute("x", rot.X); - XML_Attribute("y", rot.Y); - XML_Attribute("z", rot.Z); - } - + XML_Element("Node"); + { - XML_Element("Distortion"); - XML_Attribute("mode", data->m_Mode); - XML_Attribute("style", data->m_Style); - XML_Attribute("growth", data->m_Growth); - XML_Attribute("switch", data->m_Switch); - } - - for ( int j=(int)nodes.size()-1; j >= 0; --j ) - { - XML_Element("Node"); + XML_Element("Position"); XML_Attribute("x", nodes[j].Position.X); XML_Attribute("y", nodes[j].Position.Y); XML_Attribute("z", nodes[j].Position.Z); - XML_Attribute("t", nodes[j].Distance); } + + { + XML_Element("Rotation"); + XML_Attribute("x", nodes[j].Rotation.X); + XML_Attribute("y", nodes[j].Rotation.Y); + XML_Attribute("z", nodes[j].Rotation.Z); + } + + XML_Setting("Time", nodes[j].Distance); } } } diff --git a/source/maths/NUSpline.cpp b/source/maths/NUSpline.cpp index 44a40aa61e..ccc5110f7c 100644 --- a/source/maths/NUSpline.cpp +++ b/source/maths/NUSpline.cpp @@ -146,7 +146,7 @@ void SNSpline::Smooth() // as with RNSpline but use timePeriod in place of actual node spacing // ie time period is time from last node to this node -void TNSpline::AddNode(const CVector3D &pos, float timePeriod) +void TNSpline::AddNode(const CVector3D &pos, const CVector3D& rotation, float timePeriod) { if ( NodeCount >= MAX_SPLINE_NODES ) return; @@ -155,19 +155,22 @@ void TNSpline::AddNode(const CVector3D &pos, float timePeriod) else { Node[NodeCount-1].Distance = timePeriod; - MaxDistance += Node[NodeCount-1].Distance; + MaxDistance += Node[NodeCount-1].Distance; } + SplineData temp; temp.Position = pos; + //make sure we don't end up using undefined numbers... temp.Distance = 0.0f; temp.Velocity = CVector3D( 0.0f, 0.0f, 0.0f ); + temp.Rotation = rotation; Node.push_back(temp); NodeCount++; } //Inserts node before position -void TNSpline::InsertNode(const int index, const CVector3D &pos, float timePeriod) +void TNSpline::InsertNode(const int index, const CVector3D &pos, const CVector3D& rotation, float timePeriod) { if ( NodeCount >= MAX_SPLINE_NODES || index < NodeCount - 1 ) return; @@ -176,6 +179,7 @@ void TNSpline::InsertNode(const int index, const CVector3D &pos, float timePerio else { Node[NodeCount-1].Distance = timePeriod; + Node[NodeCount-1].Rotation = rotation; MaxDistance += Node[NodeCount-1].Distance; } SplineData temp; diff --git a/source/maths/NUSpline.h b/source/maths/NUSpline.h index 6e3aaabffb..325845347c 100644 --- a/source/maths/NUSpline.h +++ b/source/maths/NUSpline.h @@ -13,7 +13,8 @@ struct SplineData { CVector3D Position; CVector3D Velocity; - float Distance; + CVector3D Rotation; + float Distance/*, DistanceOffset*/; //DistanceOffset is to keep track of how far into the spline this node is }; class RNSpline @@ -22,9 +23,12 @@ public: RNSpline() { NodeCount = 0; } virtual ~RNSpline() {} + void AddNode(const CVector3D &pos); void BuildSpline(); CVector3D GetPosition(float time) const; + CVector3D GetRotation(float time) const; + const std::vector& GetAllNodes() const { return Node; } float MaxDistance; int NodeCount; @@ -47,9 +51,10 @@ class TNSpline : public SNSpline { public: virtual ~TNSpline() {} - void AddNode(const CVector3D &pos, float timePeriod); + + void AddNode(const CVector3D& pos, const CVector3D& rotation, float timePeriod); void PushNode() { Node.push_back( SplineData() ); } - void InsertNode(const int index, const CVector3D &pos, float timePeriod); + void InsertNode(const int index, const CVector3D &pos, const CVector3D& rotation, float timePeriod); void RemoveNode(const int index); void UpdateNodeTime(const int index, float time); void UpdateNodePos(const int index, const CVector3D &pos); diff --git a/source/ps/GameSetup/GameSetup.cpp b/source/ps/GameSetup/GameSetup.cpp index f55c80a741..c3c03fa16b 100644 --- a/source/ps/GameSetup/GameSetup.cpp +++ b/source/ps/GameSetup/GameSetup.cpp @@ -362,7 +362,7 @@ void Render() PROFILE_START( "render cinematic splines" ); //Sets/resets renderering properties itself - g_Game->GetView()->GetCinema()->DrawAllSplines(); + g_Game->GetView()->GetCinema()->DrawSpline(); PROFILE_END( "render cinematic splines" ); } diff --git a/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Cinematic/Cinematic.cpp b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Cinematic/Cinematic.cpp index 2d2bc10168..20e46f494e 100644 --- a/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Cinematic/Cinematic.cpp +++ b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Cinematic/Cinematic.cpp @@ -35,20 +35,19 @@ class CinematicBottomBar : public wxPanel friend void TimescaleSpin(void*); public: CinematicBottomBar(wxWindow* parent, CinematicSidebar* side); - void AddLists(CinematicSidebar* side, TrackListCtrl* tracks, - PathListCtrl* paths, NodeListCtrl* nodes); + void AddLists(CinematicSidebar* side, PathListCtrl* paths, NodeListCtrl* nodes); void OnText(wxCommandEvent& WXUNUSED(event)) { m_OldScale = CinemaTextFloat(*m_TimeText, 2, -5.f, 5.f, m_OldScale); - m_Sidebar->UpdateTrack(m_Name->GetLineText(0).wc_str(), m_OldScale); + m_Sidebar->UpdatePath(m_Name->GetLineText(0).wc_str(), m_OldScale); } void Update(std::wstring name, float scale) { m_Name->SetValue( wxString(name.c_str()) ); m_TimeText->SetValue( wxString::Format(L"%f", scale) ); - if ( m_OldTrackIndex != m_Sidebar->GetSelectedTrack() ) + if ( m_OldPathIndex != m_Sidebar->GetSelectedPath() ) { - m_OldTrackIndex = m_Sidebar->GetSelectedTrack(); + m_OldPathIndex = m_Sidebar->GetSelectedPath(); m_OldScale = 0.f; } CinemaTextFloat(*m_TimeText, 2, -5.f, 5.f, 0.f); @@ -58,7 +57,7 @@ private: CinematicSidebar* m_Sidebar; wxTextCtrl* m_Name, *m_TimeText; float m_OldScale; - ssize_t m_OldTrackIndex; + ssize_t m_OldPathIndex; DECLARE_EVENT_TABLE(); }; BEGIN_EVENT_TABLE(CinematicBottomBar, wxPanel) @@ -66,48 +65,6 @@ EVT_TEXT_ENTER(wxID_ANY, CinematicBottomBar::OnText) END_EVENT_TABLE() ///////////////////////////////////////////////////////////////////// -class TrackListCtrl : public wxListCtrl -{ -public: - TrackListCtrl(wxWindow* parent, CinematicSidebar* side) - : wxListCtrl(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|/*wxLC_EDIT_LABELS|*/wxLC_SINGLE_SEL), - m_Sidebar(side) - { - InsertColumn(0, _("Tracks"), wxLIST_FORMAT_LEFT, 180); - } - - void OnSelect(wxListEvent& event) - { - m_Sidebar->SelectTrack(event.GetIndex()); - m_Sidebar->UpdateTexts(); - } - void AddTrack() - { - std::wstringstream message; - message << "Track " << GetItemCount(); - std::wstring msgString = message.str(); - wxString fmt( msgString.c_str(), msgString.length() ); - InsertItem(GetItemCount(), fmt); - - qGetCameraInfo qry; - qry.Post(); - sCameraInfo info = qry.info; - m_Sidebar->AddTrack(msgString, GetItemCount()-1); - } - void DeleteTrack() - { - DeleteItem(m_Sidebar->GetSelectedTrack()); - m_Sidebar->DeleteTrack(); - } - -private: - CinematicSidebar* m_Sidebar; - - DECLARE_EVENT_TABLE(); -}; -BEGIN_EVENT_TABLE(TrackListCtrl, wxListCtrl) - EVT_LIST_ITEM_SELECTED(wxID_ANY, TrackListCtrl::OnSelect) -END_EVENT_TABLE() class PathListCtrl : public wxListCtrl { @@ -131,24 +88,13 @@ public: std::wstring msgString = message.str(); wxString fmt( msgString.c_str(), msgString.length() ); InsertItem(GetItemCount(), fmt); - - qGetCameraInfo qry; - qry.Post(); - sCameraInfo info = qry.info; - m_Sidebar->AddPath(info.rX, info.rY, info.rZ, GetItemCount()-1); + m_Sidebar->AddPath(msgString, GetItemCount()-1); } void DeletePath() { DeleteItem(m_Sidebar->GetSelectedPath()); m_Sidebar->DeletePath(); } - void UpdatePath() - { - qGetCameraInfo qry; - qry.Post(); - sCameraInfo info = qry.info; - m_Sidebar->UpdatePath(info.rX, info.rY, info.rZ); - } private: CinematicSidebar* m_Sidebar; @@ -184,7 +130,7 @@ public: qGetCameraInfo qry; qry.Post(); sCameraInfo info = qry.info; - m_Sidebar->AddNode(info.pX, info.pY, info.pZ, GetItemCount()-1); + m_Sidebar->AddNode(info.pX, info.pY, info.pZ, info.rX, info.rY, info.rZ, GetItemCount()-1); } void DeleteNode() { @@ -196,7 +142,7 @@ public: qGetCameraInfo qry; qry.Post(); sCameraInfo info = qry.info; - m_Sidebar->UpdateNode(info.pX, info.pY, info.pZ); + m_Sidebar->UpdateNode(info.pX, info.pY, info.pZ, info.rX, info.rY, info.rZ, -1.f); } void GotoNode() { @@ -213,11 +159,7 @@ END_EVENT_TABLE() ///////////////////////////////////////////////////////////////// -void CinemaTrackAdd(void* data) -{ - TrackListCtrl* list = reinterpret_cast(data); - list->AddTrack(); -} + void CinemaPathAdd(void* data) { PathListCtrl* list = reinterpret_cast(data); @@ -228,11 +170,7 @@ void CinemaNodeAdd(void* data) NodeListCtrl* list = reinterpret_cast(data); list->AddNode(); } -void CinemaTrackDel(void* data) -{ - TrackListCtrl* list = reinterpret_cast(data); - list->DeleteTrack(); -} + void CinemaPathDel(void* data) { PathListCtrl* list = reinterpret_cast(data); @@ -244,11 +182,6 @@ void CinemaNodeDel(void* data) list->DeleteNode(); } -void CinemaPathUpdate(void* data) -{ - PathListCtrl* list = reinterpret_cast(data); - list->UpdatePath(); -} void CinemaNodeUpdate(void* data) { NodeListCtrl* list = reinterpret_cast(data); @@ -304,137 +237,90 @@ float CinemaTextFloat(wxTextCtrl& ctrl, size_t decimals, float min, return val; } -void WrapCinemaPath(sCinemaPath& path) -{ - if ( path.x > 360 ) - path.x = 360; - else if ( path.x < -360 ) - path.x = -360; - - if ( path.y > 360 ) - path.y = 360; - else if ( path.y < -360 ) - path.y = -360; - - if ( path.y > 360 ) - path.z = 360; - else if ( path.x < -360 ) - path.z = -360; -} + ///////////////////////////////////////////////////////////// class CinemaSpinnerBox : public wxPanel { public: - enum { /*TrackX_ID, TrackY_ID, TrackZ_ID,*/ - PathX_ID, PathY_ID, PathZ_ID, - NodeX_ID, NodeY_ID, NodeZ_ID }; + enum { RotationX_ID, RotationY_ID, RotationZ_ID, PositionX_ID, PositionY_ID, PositionZ_ID }; CinemaSpinnerBox(wxWindow* parent, CinematicSidebar* side) : wxPanel(parent), m_OldT(0), m_OldIndex(0) { m_MainSizer = new wxBoxSizer(wxHORIZONTAL); SetSizer(m_MainSizer); m_Sidebar = side; - - //wxStaticBoxSizer* tracks = new wxStaticBoxSizer(wxHORIZONTAL, - //this, _T("Start Rotation")); - wxStaticBoxSizer* paths = new wxStaticBoxSizer(wxHORIZONTAL,this, _T("Rotation")); - wxStaticBoxSizer* nodes = new wxStaticBoxSizer(wxHORIZONTAL,this, _T("Position")); + + wxStaticBoxSizer* rotation = new wxStaticBoxSizer(wxHORIZONTAL,this, _T("Rotation")); + wxStaticBoxSizer* position = new wxStaticBoxSizer(wxHORIZONTAL,this, _T("Position")); wxStaticBoxSizer* time = new wxStaticBoxSizer(wxHORIZONTAL, this, _T("Time")); - /* m_TrackX = new wxSpinCtrl(this, TrackX_ID, _T("x"), - wxDefaultPosition, wxSize(50, 15), wxSP_ARROW_KEYS|wxSP_WRAP ); - m_TrackY = new wxSpinCtrl(this, TrackY_ID, _T("y"), - wxDefaultPosition, wxSize(50, 15), wxSP_ARROW_KEYS|wxSP_WRAP ); - m_TrackZ = new wxSpinCtrl(this, TrackZ_ID, _T("z"), - wxDefaultPosition, wxSize(50, 15), wxSP_ARROW_KEYS|wxSP_WRAP );*/ - - m_PathX = new wxSpinCtrl(this, PathX_ID, _T("x"), - wxDefaultPosition, wxSize(50, 15), wxSP_ARROW_KEYS|wxSP_WRAP ); - m_PathY = new wxSpinCtrl(this, PathY_ID, _T("y"), - wxDefaultPosition, wxSize(50, 15), wxSP_ARROW_KEYS|wxSP_WRAP ); - m_PathZ = new wxSpinCtrl(this, PathZ_ID, _T("z"), - wxDefaultPosition, wxSize(50, 15), wxSP_ARROW_KEYS|wxSP_WRAP ); + m_NodeRotationX = new wxSpinCtrl(this, RotationX_ID, _T("x"), + wxDefaultPosition, wxSize(50, 15), wxSP_ARROW_KEYS|wxSP_WRAP ); + m_NodeRotationY = new wxSpinCtrl(this, RotationY_ID, _T("y"), + wxDefaultPosition, wxSize(50, 15), wxSP_ARROW_KEYS|wxSP_WRAP ); + m_NodeRotationZ = new wxSpinCtrl(this, RotationZ_ID, _T("z"), + wxDefaultPosition, wxSize(50, 15), wxSP_ARROW_KEYS|wxSP_WRAP ); - m_NodeX = new wxSpinCtrl(this, NodeX_ID, _T("x"), - wxDefaultPosition, wxSize(55, 15), wxSP_ARROW_KEYS|wxSP_WRAP ); - m_NodeY = new wxSpinCtrl(this, NodeY_ID, _T("y"), - wxDefaultPosition, wxSize(55, 15), wxSP_ARROW_KEYS|wxSP_WRAP ); - m_NodeZ = new wxSpinCtrl(this, NodeZ_ID, _T("z"), - wxDefaultPosition, wxSize(55, 15), wxSP_ARROW_KEYS|wxSP_WRAP ); - m_NodeT = new wxTextCtrl(this, wxID_ANY, _T("0.00"), - wxDefaultPosition, wxSize(55, 15), wxTE_PROCESS_ENTER ); + m_NodePositionX = new wxSpinCtrl(this, PositionX_ID, _T("x"), + wxDefaultPosition, wxSize(55, 15), wxSP_ARROW_KEYS|wxSP_WRAP ); + m_NodePositionY = new wxSpinCtrl(this, PositionY_ID, _T("y"), + wxDefaultPosition, wxSize(55, 15), wxSP_ARROW_KEYS|wxSP_WRAP ); + m_NodePositionZ = new wxSpinCtrl(this, PositionZ_ID, _T("z"), + wxDefaultPosition, wxSize(55, 15), wxSP_ARROW_KEYS | wxSP_WRAP ); + m_NodeT = new wxTextCtrl(this, wxID_ANY, _T("0.00"), + wxDefaultPosition, wxSize(55, 15), wxTE_PROCESS_ENTER ); time->Add(m_NodeT); - /*m_TrackX->SetRange(-360, 360); - m_TrackY->SetRange(-360, 360); - m_TrackZ->SetRange(-360, 360);*/ - m_PathX->SetRange(-360, 360); - m_PathY->SetRange(-360, 360); - m_PathZ->SetRange(-360, 360); - m_NodeX->SetRange(-1000, 1000); //TODO make these more exact - m_NodeY->SetRange(-200, 600); - m_NodeZ->SetRange(-1000, 1000); + m_NodeRotationX->SetRange(-360, 360); + m_NodeRotationY->SetRange(-360, 360); + m_NodeRotationZ->SetRange(-360, 360); + m_NodePositionX->SetRange(-1000, 1000); //TODO make these more exact + m_NodePositionY->SetRange(-200, 600); + m_NodePositionZ->SetRange(-1000, 1000); - - /*tracks->Add(m_TrackX); - tracks->Add(m_TrackY); - tracks->Add(m_TrackZ);*/ - paths->Add(m_PathX); - paths->Add(m_PathY); - paths->Add(m_PathZ); - nodes->Add(m_NodeX); - nodes->Add(m_NodeY); - nodes->Add(m_NodeZ); - - //m_MainSizer->Add(tracks); - m_MainSizer->Add(paths, 0, wxLEFT, 60); - m_MainSizer->Add(nodes); + rotation->Add(m_NodeRotationX); + rotation->Add(m_NodeRotationY); + rotation->Add(m_NodeRotationZ); + position->Add(m_NodePositionX); + position->Add(m_NodePositionY); + position->Add(m_NodePositionZ); + + m_MainSizer->Add(rotation); + m_MainSizer->Add(position); m_MainSizer->Add(time); } - /*void OnTrackPush(wxSpinEvent& WXUNUSED(event)) - { - m_Sidebar->UpdateTrack( m_TrackX->GetValue(), - m_TrackY->GetValue(), m_TrackZ->GetValue()); - }*/ - void OnPathPush(wxSpinEvent& WXUNUSED(event)) - { - m_Sidebar->UpdatePath( m_PathX->GetValue(), - m_PathY->GetValue(), m_PathZ->GetValue()); - } void OnNodePush(wxSpinEvent& WXUNUSED(event)) { - m_OldT = CinemaTextFloat(*m_NodeT, 2, 0.f, 100.f, m_OldT); - m_Sidebar->UpdateNode( m_NodeX->GetValue(), - m_NodeY->GetValue(), m_NodeZ->GetValue(), m_OldT); + m_Sidebar->UpdateNode( m_NodePositionX->GetValue(), m_NodePositionY->GetValue(), + m_NodePositionZ->GetValue(), m_NodeRotationX->GetValue(), + m_NodeRotationY->GetValue(), m_NodeRotationZ->GetValue(), m_OldT); } + void OnText(wxCommandEvent& WXUNUSED(event)) { m_OldT = CinemaTextFloat(*m_NodeT, 2, 0.f, 100.f, m_OldT); - m_Sidebar->UpdateNode( m_NodeX->GetValue(), - m_NodeY->GetValue(), m_NodeZ->GetValue(), m_OldT); + m_Sidebar->UpdateNode( m_NodePositionX->GetValue(), m_NodePositionY->GetValue(), + m_NodePositionZ->GetValue(), m_NodeRotationX->GetValue(), + m_NodeRotationY->GetValue(), m_NodeRotationZ->GetValue(), m_OldT ); } - /*void UpdateTrackSpinners(int x, int y, int z) + void UpdateRotationSpinners(int x, int y, int z) { - m_TrackX->SetValue(x); - m_TrackY->SetValue(y); - m_TrackZ->SetValue(z); - }*/ - void UpdatePathSpinners(int x, int y, int z) - { - m_PathX->SetValue(x); - m_PathY->SetValue(y); - m_PathZ->SetValue(z); + m_NodeRotationX->SetValue(x); + m_NodeRotationY->SetValue(y); + m_NodeRotationZ->SetValue(z); } - void UpdateNodeSpinners(int x, int y, int z, float t, ssize_t index) + + void UpdatePositionSpinners(int x, int y, int z, float t, ssize_t index) { - m_NodeX->SetValue(x); - m_NodeY->SetValue(y); - m_NodeZ->SetValue(z); + m_NodePositionX->SetValue(x); + m_NodePositionY->SetValue(y); + m_NodePositionZ->SetValue(z); m_NodeT->SetValue(wxString::Format(L"%f", t)); + if ( m_OldIndex != index ) { m_OldT = 0.f; @@ -443,7 +329,7 @@ public: m_OldT = CinemaTextFloat(*m_NodeT, 2, 0.f, 100.f, m_OldT); } private: - wxSpinCtrl* m_TrackX, *m_TrackY, *m_TrackZ, *m_PathX, *m_PathY, *m_PathZ, *m_NodeX, *m_NodeY, *m_NodeZ; + wxSpinCtrl* m_NodeRotationX, *m_NodeRotationY, *m_NodeRotationZ, *m_NodePositionX, *m_NodePositionY, *m_NodePositionZ; wxTextCtrl* m_NodeT; float m_OldT; int m_OldIndex; @@ -451,50 +337,41 @@ private: CinematicSidebar* m_Sidebar; DECLARE_EVENT_TABLE(); }; + BEGIN_EVENT_TABLE(CinemaSpinnerBox, wxPanel) -//EVT_SPINCTRL(CinemaSpinnerBox::TrackX_ID, CinemaSpinnerBox::OnTrackPush) -//EVT_SPINCTRL(CinemaSpinnerBox::TrackY_ID, CinemaSpinnerBox::OnTrackPush) -//EVT_SPINCTRL(CinemaSpinnerBox::TrackZ_ID, CinemaSpinnerBox::OnTrackPush) -EVT_SPINCTRL(CinemaSpinnerBox::PathX_ID, CinemaSpinnerBox::OnPathPush) -EVT_SPINCTRL(CinemaSpinnerBox::PathY_ID, CinemaSpinnerBox::OnPathPush) -EVT_SPINCTRL(CinemaSpinnerBox::PathZ_ID, CinemaSpinnerBox::OnPathPush) -EVT_SPINCTRL(CinemaSpinnerBox::NodeX_ID, CinemaSpinnerBox::OnNodePush) -EVT_SPINCTRL(CinemaSpinnerBox::NodeY_ID, CinemaSpinnerBox::OnNodePush) -EVT_SPINCTRL(CinemaSpinnerBox::NodeZ_ID, CinemaSpinnerBox::OnNodePush) +EVT_SPINCTRL(CinemaSpinnerBox::RotationX_ID, CinemaSpinnerBox::OnNodePush) +EVT_SPINCTRL(CinemaSpinnerBox::RotationY_ID, CinemaSpinnerBox::OnNodePush) +EVT_SPINCTRL(CinemaSpinnerBox::RotationZ_ID, CinemaSpinnerBox::OnNodePush) +EVT_SPINCTRL(CinemaSpinnerBox::PositionX_ID, CinemaSpinnerBox::OnNodePush) +EVT_SPINCTRL(CinemaSpinnerBox::PositionY_ID, CinemaSpinnerBox::OnNodePush) +EVT_SPINCTRL(CinemaSpinnerBox::PositionZ_ID, CinemaSpinnerBox::OnNodePush) EVT_TEXT_ENTER(wxID_ANY, CinemaSpinnerBox::OnText) END_EVENT_TABLE() ///////////////////////////////////////////////////////////// CinematicBottomBar::CinematicBottomBar(wxWindow* parent, CinematicSidebar* side) -: wxPanel(parent), m_Sidebar(side), m_OldScale(0), m_OldTrackIndex(-1) +: wxPanel(parent), m_Sidebar(side), m_OldScale(0), m_OldPathIndex(-1) { m_Sizer = new wxStaticBoxSizer(wxVERTICAL, this); SetSizer(m_Sizer); } -void CinematicBottomBar::AddLists(CinematicSidebar* side, - TrackListCtrl* tracks, PathListCtrl* paths, NodeListCtrl* nodes) +void CinematicBottomBar::AddLists(CinematicSidebar* side, PathListCtrl* paths, NodeListCtrl* nodes) { wxBoxSizer* top = new wxBoxSizer(wxHORIZONTAL); CinemaSpinnerBox* spinners = new CinemaSpinnerBox(this, side); side->SetSpinners(spinners); - wxBoxSizer* trackButtons = new wxBoxSizer(wxVERTICAL); + wxBoxSizer* pathButtons = new wxBoxSizer(wxVERTICAL); wxBoxSizer* nodeButtons = new wxBoxSizer(wxVERTICAL); - ActionButton* TrackAdd = new ActionButton(this, _T("Add"), - &CinemaTrackAdd, tracks, wxSize(40, 18)); ActionButton* PathAdd = new ActionButton(this, _T("Add"), &CinemaPathAdd, paths, wxSize(40, 18)); ActionButton* NodeAdd = new ActionButton(this, _T("Add"), &CinemaNodeAdd, nodes, wxSize(40, 18)); - ActionButton* TrackDel = new ActionButton(this, _T("Del"), - &CinemaTrackDel, tracks, wxSize(40, 18)); ActionButton* PathDel = new ActionButton(this, _T("Del"), &CinemaPathDel, paths, wxSize(40, 18)); ActionButton* NodeDel = new ActionButton(this, _T("Del"), &CinemaNodeDel, nodes, wxSize(40, 18)); - ActionButton* PathUpdate = new ActionButton(this, _T("Mod"), - &CinemaPathUpdate, paths, wxSize(40, 18)); ActionButton* NodeUpdate = new ActionButton(this, _T("Mod"), &CinemaNodeUpdate, nodes, wxSize(40, 18)); ActionButton* NodeGoto = new ActionButton(this, _T("Goto"), @@ -518,18 +395,13 @@ void CinematicBottomBar::AddLists(CinematicSidebar* side, textBoxes->Add(timescale); textBoxes->Add(nameBox, 0, wxEXPAND); - trackButtons->Add(TrackAdd, 0); - trackButtons->Add(TrackDel, 0); pathButtons->Add(PathAdd, 0); pathButtons->Add(PathDel, 0); - pathButtons->Add(PathUpdate, 0); nodeButtons->Add(NodeAdd, 0); nodeButtons->Add(NodeDel, 0); nodeButtons->Add(NodeUpdate, 0); nodeButtons->Add(NodeGoto, 0); - top->Add(tracks, 0); - top->Add(trackButtons, 0); top->Add(textBoxes, 0); top->Add(paths, 0); top->Add(pathButtons, 0); @@ -546,7 +418,7 @@ public: enum { Mode_ID, Style_ID, Rotation_ID, Spline_ID, Reset_ID }; CinemaInfoBox(CinematicSidebar* side) : wxPanel(side), - m_Sidebar(side), m_OldGrowth(0), m_OldSwitch(0), m_OldTrackIndex(-1) + m_Sidebar(side), m_OldGrowth(0), m_OldSwitch(0), m_OldPathIndex(-1) { m_Sizer = new wxBoxSizer(wxVERTICAL); SetSizer(m_Sizer); @@ -588,7 +460,6 @@ public: //Put this here since there isn't any other place yet wxBoxSizer* displayH = new wxBoxSizer(wxHORIZONTAL); - m_DrawAll = new wxCheckBox(this, wxID_ANY, _T("Draw all")); m_DrawCurrent = new wxCheckBox(this, wxID_ANY, _T("Draw current")); wxString splineStrings[2] = { _T("Points"), _T("Lines") }; @@ -601,16 +472,16 @@ public: displayH->Add(m_SplineDisplay, 0); displayH->Add(m_RotationDisplay, 0); m_Sizer->Add(displayH, 0, wxTop | wxALIGN_CENTER, 10); - m_Sizer->Add(m_DrawAll, 0); m_Sizer->Add(m_DrawCurrent, 0); m_Sizer->Add( new wxButton(this, Reset_ID, L"Reset Camera"), 0, wxALIGN_CENTER ); } - void Update(const sCinemaPath& path) + void Update(const sCinemaPath* path) { - m_ModeBox->SetSelection(path.mode); - m_StyleBox->SetSelection(path.style); - float growth = path.growth; //wxFormat doesn't like to share(able) - float change = path.change; + m_ModeBox->SetSelection(path->mode); + m_StyleBox->SetSelection(path->style); + float growth = path->growth; //wxFormat doesn't like to share(able) + float change = path->change; + m_Growth->SetValue( wxString::Format(L"%f", growth) ); m_Switch->SetValue( wxString::Format(L"%f", change) ); UpdateOldIndex(); @@ -622,9 +493,9 @@ public: m_OldGrowth = CinemaTextFloat(*m_Growth, 2, 0.f, 10.f, m_OldGrowth); m_OldSwitch = CinemaTextFloat(*m_Switch, 2, 0.f, 10.f, m_OldSwitch); UpdateOldIndex(); - m_Sidebar->UpdatePathInfo( m_ModeBox->GetSelection(), - m_StyleBox->GetSelection(), m_OldGrowth, m_OldSwitch, m_DrawAll->IsChecked(), - m_DrawCurrent->IsChecked(), m_SplineDisplay->GetSelection()!=0 ); + m_Sidebar->UpdatePathInfo( m_ModeBox->GetSelection(), m_StyleBox->GetSelection(), + m_OldGrowth, m_OldSwitch, m_DrawCurrent->IsChecked(), + m_SplineDisplay->GetSelection() != 0 ); } void OnRotation(wxCommandEvent& WXUNUSED(event)) { @@ -633,19 +504,18 @@ public: } void ResetCamera(wxCommandEvent& WXUNUSED(event)) { - POST_MESSAGE(CinemaEvent, ( m_Sidebar->GetSelectedTrackName(), eCinemaEventMode::RESET, - 0.0f, GetDrawAll(),GetDrawCurrent(), GetDrawLines() ) ); + POST_MESSAGE(CinemaEvent, ( m_Sidebar->GetSelectedPathName(), eCinemaEventMode::RESET, + 0.0f, GetDrawCurrent(), GetDrawLines() ) ); } void UpdateOldIndex() { - if ( m_Sidebar->GetSelectedTrack() != m_OldTrackIndex ) + if ( m_Sidebar->GetSelectedPath() != m_OldPathIndex ) { - m_OldTrackIndex = m_Sidebar->GetSelectedTrack(); + m_OldPathIndex = m_Sidebar->GetSelectedPath(); m_OldGrowth = m_OldSwitch = 0.f; } } - bool GetDrawAll() { return m_DrawAll->IsChecked(); } bool GetDrawCurrent() { return m_DrawCurrent->IsChecked(); } bool GetDrawLines() { return m_SplineDisplay->GetSelection()!=0; } @@ -654,10 +524,10 @@ private: CinematicSidebar* m_Sidebar; wxRadioBox* m_ModeBox, *m_StyleBox, *m_RotationDisplay, *m_SplineDisplay; wxTextCtrl* m_Growth, *m_Switch; - wxCheckBox* m_DrawAll, *m_DrawCurrent; + wxCheckBox* m_DrawCurrent; float m_OldGrowth, m_OldSwitch; - ssize_t m_OldTrackIndex; + ssize_t m_OldPathIndex; DECLARE_EVENT_TABLE(); }; BEGIN_EVENT_TABLE(CinemaInfoBox, wxPanel) @@ -670,91 +540,34 @@ EVT_TEXT_ENTER(wxID_ANY, CinemaInfoBox::OnChange) EVT_BUTTON(CinemaInfoBox::Reset_ID, CinemaInfoBox::ResetCamera) END_EVENT_TABLE() -class PathSlider; -class CinemaSliderBox; - -class TrackSlider : public wxSlider -{ - static const int range=1024; -public: - TrackSlider(CinematicSidebar* side, CinemaSliderBox* parent) - : wxSlider((wxWindow*)parent, wxID_ANY, 0, 0, range), - m_Sidebar(side), m_Parent(parent) - { - } - void OnScroll(wxScrollEvent& event); - void Update(float interval); - void SetPathSlider(PathSlider* slider) - { - m_Path = slider; - } - -private: - PathSlider* m_Path; - CinematicSidebar* m_Sidebar; - CinemaSliderBox* m_Parent; - - DECLARE_EVENT_TABLE(); -}; -BEGIN_EVENT_TABLE(TrackSlider, wxSlider) - EVT_SCROLL(TrackSlider::OnScroll) -END_EVENT_TABLE() - class PathSlider : public wxSlider { static const int range=1024; public: - PathSlider(CinematicSidebar* side, wxWindow* parent) - : wxSlider(parent, wxID_ANY, 0, 0, range, wxDefaultPosition, - wxDefaultSize, wxSL_HORIZONTAL, wxDefaultValidator, _("Path")), - m_Sidebar(side) + PathSlider(CinematicSidebar* side) + : wxSlider(side, wxID_ANY, 0, 0, range, wxDefaultPosition, + wxDefaultSize, wxSL_HORIZONTAL, wxDefaultValidator, _("Path")), + m_Sidebar(side), m_OldTime(0), m_NewTime(0) { - } - - void OnScroll(wxScrollEvent& WXUNUSED(event)); - - void SetTrackSlider(TrackSlider* slider) - { - m_Track = slider; - } -private: - TrackSlider* m_Track; - CinematicSidebar* m_Sidebar; - - DECLARE_EVENT_TABLE(); -}; -BEGIN_EVENT_TABLE(PathSlider, wxSlider) - EVT_SCROLL(PathSlider::OnScroll) -END_EVENT_TABLE() - -class CinemaSliderBox : public wxPanel -{ -public: - CinemaSliderBox(CinematicSidebar* parent, const wxString& label) - : wxPanel(parent), m_Sidebar(parent), m_OldTime(0), m_NewTime(0) - { - m_Sizer = new wxStaticBoxSizer(wxVERTICAL, this, label); - SetSizer(m_Sizer); - m_Path = new PathSlider(parent, this); - m_Track = new TrackSlider(parent, this); - m_Path->SetTrackSlider(m_Track); - m_Track->SetPathSlider(m_Path); - - m_Sizer->Add(m_Track, 0); - m_Sizer->Add(m_Path, 0); - m_Timer.SetOwner(this); } - void Update() + + void Update(float interval) { - m_Track->Update(0); + if ( m_Sidebar->m_SelectedPath < 0 ) + return; + int sliderValue = (m_Sidebar->m_TimeElapsed / m_Sidebar->GetCurrentPath()->duration) * range; + SetValue(sliderValue); } + void OnTick(wxTimerEvent& WXUNUSED(event)) { m_NewTime = m_HighResTimer.GetTime(); - m_Track->Update(m_NewTime - m_OldTime); + Update(m_NewTime - m_OldTime); m_OldTime = m_NewTime; } + void OnScroll(wxScrollEvent& WXUNUSED(event)); + void PrepareTimers() { m_OldTime = m_NewTime = m_HighResTimer.GetTime(); @@ -762,109 +575,48 @@ public: } void Reset() { - m_Track->SetValue(0); - m_Path->SetValue(0); + SetValue(0); } float m_OldTime; float m_NewTime; wxTimer m_Timer; + private: - TrackSlider* m_Track; HighResTimer m_HighResTimer; - PathSlider* m_Path; - wxStaticBoxSizer* m_Sizer; CinematicSidebar* m_Sidebar; DECLARE_EVENT_TABLE(); }; -BEGIN_EVENT_TABLE(CinemaSliderBox, wxPanel) - EVT_TIMER(wxID_ANY, CinemaSliderBox::OnTick) +BEGIN_EVENT_TABLE(PathSlider, wxSlider) + EVT_SCROLL(PathSlider::OnScroll) + EVT_TIMER(wxID_ANY, PathSlider::OnTick) END_EVENT_TABLE() -void TrackSlider::OnScroll(wxScrollEvent& WXUNUSED(event)) -{ - //Move path and send movement message - m_Sidebar->m_SliderBox->m_Timer.Stop(); - if ( m_Sidebar->m_SelectedTrack < 0 || m_Sidebar->m_SelectedPath < 0 ) - { - SetValue(0); - return; - } - float ratio = (float)GetValue() / (float)range; - float time = ratio * m_Sidebar->m_Tracks[m_Sidebar->m_SelectedTrack].duration; - - POST_MESSAGE(CinemaEvent, - ( m_Sidebar->GetSelectedTrackName(), eCinemaEventMode::IMMEDIATE_TRACK, time, - m_Sidebar->m_InfoBox->GetDrawAll(), m_Sidebar->m_InfoBox->GetDrawCurrent(), - m_Sidebar->m_InfoBox->GetDrawLines() ) ); - - m_Sidebar->m_AbsoluteTime = time; - m_Path->SetValue( (int)( m_Sidebar->UpdateSelectedPath() / - m_Sidebar->GetCurrentPath().duration * range ) ); -} + void PathSlider::OnScroll(wxScrollEvent& WXUNUSED(event)) { - m_Sidebar->m_SliderBox->m_Timer.Stop(); - if ( m_Sidebar->m_SelectedTrack < 0 || m_Sidebar->m_SelectedPath < 0 ) + m_Timer.Stop(); + if ( m_Sidebar->m_SelectedPath < 0 ) { SetValue(0); return; } - //Move path and send movement message - //If blank path, ignore - if ( m_Sidebar->m_Tracks[m_Sidebar->m_SelectedTrack].duration < .0001f ) + + //Move path and send movement message. If blank path, ignore + if ( m_Sidebar->GetCurrentPath()->duration < .0001f ) return; - float trackTime = 0.0f, ratio = (float)GetValue() / (float)range; - float time = ratio * m_Sidebar->GetCurrentPath().duration; - - for ( ssize_t i=0; im_SelectedPath; ++i ) - { - trackTime += (*m_Sidebar->m_Tracks[m_Sidebar->m_SelectedTrack].paths) - [m_Sidebar->m_SelectedPath].duration; - } + float ratio = (float)GetValue() / (float)range; + float time = ratio * m_Sidebar->GetCurrentPath()->duration; POST_MESSAGE(CinemaEvent, - ( m_Sidebar->GetSelectedTrackName(), eCinemaEventMode::IMMEDIATE_TRACK, trackTime + time, - m_Sidebar->m_InfoBox->GetDrawAll(), m_Sidebar->m_InfoBox->GetDrawCurrent(), - m_Sidebar->m_InfoBox->GetDrawLines()) ); + ( m_Sidebar->GetSelectedPathName(), eCinemaEventMode::IMMEDIATE_PATH, time, + m_Sidebar->m_InfoBox->GetDrawCurrent(), m_Sidebar->m_InfoBox->GetDrawLines()) ); - m_Sidebar->m_AbsoluteTime = trackTime + time; m_Sidebar->m_TimeElapsed = time; - m_Track->SetValue( (int)(m_Sidebar->m_AbsoluteTime / m_Sidebar->m_Tracks - [m_Sidebar->m_SelectedTrack].duration * range) ); } -void TrackSlider::Update(float interval) -{ - if ( m_Sidebar->m_SelectedTrack < 0 || m_Sidebar->m_SelectedPath < 0 ) - { - SetValue(0); - return; - } - interval *= m_Sidebar->m_Tracks[m_Sidebar->m_SelectedTrack].timescale; - m_Sidebar->m_AbsoluteTime += interval; - int move = m_Sidebar->m_AbsoluteTime / m_Sidebar->m_Tracks - [m_Sidebar->m_SelectedTrack].duration * (float)range; - - if ( move > range ) - move = range; - SetValue( move ); - if ( m_Sidebar->GetCurrentPath().duration < CINEMA_EPSILON ) - m_Path->SetValue(range); - else - m_Path->SetValue( (int)( m_Sidebar->m_TimeElapsed / m_Sidebar->GetCurrentPath().duration * range ) ); - - if ( move == range && m_Sidebar->m_Playing ) - { - m_Parent->m_Timer.Stop(); - SetValue(0); - m_Path->SetValue(0); - m_Sidebar->GotoNode(0); - m_Sidebar->m_Playing = false; - } -} ////////////////////////////////////////////////////////////////////////// class CinemaButtonBox : public wxPanel @@ -881,119 +633,89 @@ public: } void OnPrevious(wxCommandEvent& WXUNUSED(event)) { - if ( m_Parent->m_SelectedTrack < 0 ) - return; - m_Parent->m_SliderBox->m_Timer.Stop(); + m_Parent->m_PathSlider->m_Timer.Stop(); m_Parent->m_Playing = false; - std::wstring name=*m_Parent->m_Tracks[m_Parent->m_SelectedTrack].name; - - if ( m_Parent->m_SelectedPath > 0 && m_Parent->m_TimeElapsed < CINEMA_EPSILON) - { - m_Parent->SelectPath(m_Parent->m_SelectedPath-1); - float t = -m_Parent->GetCurrentPath().duration; - m_Parent->m_AbsoluteTime += t; - m_Parent->m_TimeElapsed = 0.f; - POST_MESSAGE(CinemaEvent, - ( name, eCinemaEventMode::IMMEDIATE_PATH, t, m_Parent->m_InfoBox->GetDrawAll(), - m_Parent->m_InfoBox->GetDrawCurrent(), m_Parent->m_InfoBox->GetDrawLines() ) ); - } - else + if ( m_Parent->m_SelectedPath > 0) { - m_Parent->m_AbsoluteTime -= m_Parent->m_TimeElapsed; m_Parent->m_TimeElapsed = 0.0f; - POST_MESSAGE(CinemaEvent, - ( name, eCinemaEventMode::IMMEDIATE_PATH, 0.0f, - m_Parent->m_InfoBox->GetDrawAll(), m_Parent->m_InfoBox->GetDrawCurrent(), - m_Parent->m_InfoBox->GetDrawLines()) ); + POST_MESSAGE(CinemaEvent, + ( m_Parent->GetSelectedPathName(), eCinemaEventMode::IMMEDIATE_PATH, 0.0f, + m_Parent->m_InfoBox->GetDrawCurrent(), m_Parent->m_InfoBox->GetDrawLines()) ); } - m_Parent->m_SliderBox->Update(); + m_Parent->m_PathSlider->Update(0); } //void OnRewind(wxCommandEvent& event) //void OnReverse(wxCommandEvent& event) void OnStop(wxCommandEvent& WXUNUSED(event)) { - if ( m_Parent->m_SelectedTrack < 0 || m_Parent->m_SelectedPath < 0) + if ( m_Parent->m_SelectedPath < 0) return; - m_Parent->m_SliderBox->m_Timer.Stop(); + + m_Parent->m_PathSlider->m_Timer.Stop(); m_Parent->m_Playing = false; - m_Parent->m_AbsoluteTime = m_Parent->m_TimeElapsed = 0.0f; - m_Parent->SelectPath(0); - m_Parent->m_SliderBox->Update(); + m_Parent->m_TimeElapsed = 0.0f; + m_Parent->m_PathSlider->Update(0.0f); POST_MESSAGE(CinemaEvent, - (*m_Parent->m_Tracks[m_Parent->m_SelectedTrack].name, - eCinemaEventMode::IMMEDIATE_TRACK, 0.0f, - m_Parent->m_InfoBox->GetDrawAll(), m_Parent->m_InfoBox->GetDrawCurrent(), - m_Parent->m_InfoBox->GetDrawLines()) ); + (m_Parent->GetSelectedPathName(), eCinemaEventMode::IMMEDIATE_PATH, 0.0f, + m_Parent->m_InfoBox->GetDrawCurrent(), m_Parent->m_InfoBox->GetDrawLines()) ); } void OnPlay(wxCommandEvent& WXUNUSED(event)) { - if ( m_Parent->m_SelectedTrack < 0 ) + if ( m_Parent->m_SelectedPath < 0 ) return; - m_Parent->m_SliderBox->m_Timer.Stop(); - m_Parent->m_SliderBox->PrepareTimers(); + + m_Parent->m_PathSlider->m_Timer.Stop(); + m_Parent->m_PathSlider->PrepareTimers(); POST_MESSAGE(CinemaEvent, - (*m_Parent->m_Tracks[m_Parent->m_SelectedTrack].name, - eCinemaEventMode::SMOOTH, 0.0f, - m_Parent->m_InfoBox->GetDrawAll(), m_Parent->m_InfoBox->GetDrawCurrent(), + (m_Parent->GetSelectedPathName(), + eCinemaEventMode::SMOOTH, 0.0f, m_Parent->m_InfoBox->GetDrawCurrent(), m_Parent->m_InfoBox->GetDrawLines()) ); m_Parent->m_Playing = true; } void OnRecord(wxCommandEvent& WXUNUSED(event)) { - if ( m_Parent->m_SelectedTrack < 0 ) + if ( m_Parent->m_SelectedPath < 0 ) return; - m_Parent->m_SliderBox->m_Timer.Stop(); - m_Parent->m_SliderBox->PrepareTimers(); + m_Parent->m_PathSlider->m_Timer.Stop(); + m_Parent->m_PathSlider->PrepareTimers(); VideoRecorder::RecordCinematic(this, - m_Parent->m_Tracks[m_Parent->m_SelectedTrack].name.c_str(), - m_Parent->m_Tracks[m_Parent->m_SelectedTrack].duration); + wxString( m_Parent->GetSelectedPathName().c_str() ), m_Parent->GetCurrentPath()->duration); } void OnPause(wxCommandEvent& WXUNUSED(event)) { - if ( m_Parent->m_SelectedTrack < 0 ) + if ( m_Parent->m_SelectedPath < 0 ) return; - m_Parent->m_SliderBox->m_Timer.Stop(); + m_Parent->m_PathSlider->m_Timer.Stop(); //m_Parent->m_SliderBox->Reset(); //m_Parent->m_NodeList->Thaw(); m_Parent->m_Playing = false; POST_MESSAGE(CinemaEvent, - (*m_Parent->m_Tracks[m_Parent->m_SelectedTrack].name, + (m_Parent->GetSelectedPathName(), eCinemaEventMode::IMMEDIATE_PATH, m_Parent->m_TimeElapsed, - m_Parent->m_InfoBox->GetDrawAll(), m_Parent->m_InfoBox->GetDrawCurrent(), - m_Parent->m_InfoBox->GetDrawLines()) ); + m_Parent->m_InfoBox->GetDrawCurrent(), m_Parent->m_InfoBox->GetDrawLines()) ); } void OnNext(wxCommandEvent& WXUNUSED(event)) { - m_Parent->m_SliderBox->m_Timer.Stop(); + m_Parent->m_PathSlider->m_Timer.Stop(); m_Parent->m_Playing = false; - std::wstring name=*m_Parent->m_Tracks[m_Parent->m_SelectedTrack].name; - sCinemaPath path = m_Parent->GetCurrentPath(); - float t = path.duration - m_Parent->m_TimeElapsed; + std::wstring name = m_Parent->GetSelectedPathName(); + const sCinemaPath* path = m_Parent->GetCurrentPath(); - if ( m_Parent->m_SelectedPath < (ssize_t)m_Parent->m_Tracks - [m_Parent->m_SelectedTrack].paths.GetSize()-1 ) - { - m_Parent->SelectPath(m_Parent->m_SelectedPath+1); - m_Parent->m_TimeElapsed = 0.f; - } - else - m_Parent->m_TimeElapsed = path.duration; - m_Parent->m_AbsoluteTime += t; + m_Parent->m_TimeElapsed = path->duration; POST_MESSAGE(CinemaEvent, - ( name, eCinemaEventMode::IMMEDIATE_TRACK, m_Parent->m_AbsoluteTime, - m_Parent->m_InfoBox->GetDrawAll(), m_Parent->m_InfoBox->GetDrawCurrent(), - m_Parent->m_InfoBox->GetDrawLines()) ); + ( name, eCinemaEventMode::IMMEDIATE_PATH, path->duration, + m_Parent->m_InfoBox->GetDrawCurrent(), m_Parent->m_InfoBox->GetDrawLines()) ); - m_Parent->m_SliderBox->Update(); + m_Parent->m_PathSlider->Update(0); } CinematicSidebar* m_Parent; wxStaticBoxSizer* m_Sizer; @@ -1011,15 +733,16 @@ END_EVENT_TABLE() ////////////////////////////////////////////////////////////////////////// CinematicSidebar::CinematicSidebar(wxWindow* sidebarContainer, wxWindow* bottomBarContainer) -: Sidebar(sidebarContainer, bottomBarContainer), m_SelectedTrack(-1), -m_SelectedPath(-1), m_SelectedSplineNode(-1), m_TimeElapsed(0.f), -m_AbsoluteTime(0.f), m_RotationAbsolute(false), //m_UpdatePathEcho(false), -m_Playing(false) +: Sidebar(sidebarContainer, bottomBarContainer), m_SelectedPath(-1), m_SelectedSplineNode(-1), +m_TimeElapsed(0.f), m_RotationAbsolute(false), m_Playing(false) { - m_SliderBox = new CinemaSliderBox(this, _T("Timeline")); - m_MainSizer->Add(m_SliderBox, 0, wxALIGN_CENTER); + m_PathSlider = new PathSlider(this); + wxStaticBoxSizer* sliderBox = new wxStaticBoxSizer(wxVERTICAL, this, _T("Timeline")); + sliderBox->Add(m_PathSlider); + m_MainSizer->Add(sliderBox, 0, wxALIGN_CENTER); m_IconSizer = new CinemaButtonBox(this); LoadIcons(); //do this here; buttons must be added before box is + m_MainSizer->Add(m_IconSizer, 0, wxALIGN_CENTER); m_InfoBox = new CinemaInfoBox(this); m_MainSizer->Add(m_InfoBox, 0, wxALIGN_CENTER); @@ -1027,61 +750,30 @@ m_Playing(false) CinematicBottomBar* bottom = new CinematicBottomBar(bottomBarContainer, this); m_BottomBar = bottom; m_CinemaBottomBar = bottom; //avoid casting later - m_TrackList = new TrackListCtrl(bottom, this); + m_PathList = new PathListCtrl(bottom, this); m_NodeList = new NodeListCtrl(bottom, this); - bottom->AddLists(this, m_TrackList, m_PathList, m_NodeList); + bottom->AddLists(this, m_PathList, m_NodeList); } void CinematicSidebar::OnFirstDisplay() { - qGetCinemaTracks qry; + qGetCinemaPaths qry; qry.Post(); - m_Tracks = *qry.tracks; + m_Paths = *qry.paths; - m_TrackList->Freeze(); - for (size_t track = 0; track < m_Tracks.size(); ++track) + m_PathList->Freeze(); + for (size_t path = 0; path < m_Paths.size(); ++path) { - m_TrackList->InsertItem((long)track, wxString(m_Tracks[track].name.c_str())); + m_PathList->InsertItem((long)path, wxString(m_Paths[path].name.c_str())); } - m_TrackList->Thaw(); + m_PathList->Thaw(); } -void CinematicSidebar::SelectTrack(ssize_t n) -{ - if (n == -1) - { - m_SelectedTrack = -1; - SelectPath(-1); - return; - } - else - { - wxCHECK_RET (n >= 0 && n < (ssize_t)m_Tracks.size(), _T("SelectTrack out of bounds")); - - m_SelectedTrack = n; - SelectPath(-1); - m_PathList->Freeze(); - m_PathList->DeleteAllItems(); - - if (n != -1) - { - std::vector paths = *m_Tracks[n].paths; - for (size_t path = 0; path < paths.size(); ++path) - { - m_PathList->InsertItem((long)path, wxString::Format(_("Path %d"), path)); - } - } - m_PathList->Thaw(); - } - - UpdateSpinners(); -} - void CinematicSidebar::SelectPath(ssize_t n) { - if (n == -1 || m_SelectedTrack == -1) + if (n == -1) { m_PathList->DeleteAllItems(); //Do this here to avoid thinking that there's still a path @@ -1091,9 +783,7 @@ void CinematicSidebar::SelectPath(ssize_t n) } else { - std::vector paths = *m_Tracks[m_SelectedTrack].paths; - ssize_t size = (ssize_t)paths.size(); - wxCHECK_RET (n >= 0 && n < size, _T("SelectPath out of bounds")); + wxCHECK_RET (n >= 0 && n < (ssize_t)m_Paths.size(), _T("SelectPath out of bounds")); m_SelectedPath = n; SelectSplineNode(-1); @@ -1102,8 +792,8 @@ void CinematicSidebar::SelectPath(ssize_t n) if (n != -1) { - std::vector nodes = *paths[n].nodes; - for ( size_t i=0; inodes.GetSize(); + for ( size_t i=0; iInsertItem((long)i, wxString::Format(_("Node %d"), i)); } @@ -1111,9 +801,8 @@ void CinematicSidebar::SelectPath(ssize_t n) m_NodeList->Thaw(); } - POST_MESSAGE(CinemaEvent, ( *GetCurrentTrack()->name, - eCinemaEventMode::SELECT, (int)m_SelectedPath, m_InfoBox->GetDrawAll(), - m_InfoBox->GetDrawCurrent(), m_InfoBox->GetDrawLines() )); + POST_MESSAGE(CinemaEvent, ( GetSelectedPathName(), eCinemaEventMode::SELECT, + (int)m_SelectedPath, m_InfoBox->GetDrawCurrent(), m_InfoBox->GetDrawLines() )); UpdateSpinners(); } @@ -1129,23 +818,19 @@ void CinematicSidebar::SelectSplineNode(ssize_t n, ssize_t size) m_SelectedSplineNode = n; UpdateSpinners(); } -const sCinemaTrack* CinematicSidebar::GetCurrentTrack() +const sCinemaPath* CinematicSidebar::GetCurrentPath() const { - return &m_Tracks[m_SelectedTrack]; + return &m_Paths[m_SelectedPath]; } -sCinemaPath CinematicSidebar::GetCurrentPath() + +sCinemaSplineNode CinematicSidebar::GetCurrentNode() const { - if ( m_SelectedPath < 0 ) + if ( m_SelectedSplineNode < 0 ) { - wxFAIL_MSG(L"CurrentPath() request out of range. The game will attempt to continue."); - return sCinemaPath(); + wxLogError(_("Invalid request for current spline node (no node selected)")); + return sCinemaSplineNode(); } - return (*m_Tracks[m_SelectedTrack].paths)[m_SelectedPath]; -} -sCinemaSplineNode CinematicSidebar::GetCurrentNode() -{ - return (* (*m_Tracks[m_SelectedTrack].paths)[m_SelectedPath].nodes ) - [m_SelectedSplineNode]; + return (*GetCurrentPath()->nodes)[m_SelectedSplineNode]; } //copied from sectionlayout's addpage() wxImage CinematicSidebar::LoadIcon(const wxString& filename) @@ -1193,71 +878,43 @@ void CinematicSidebar::LoadIcons() eCinemaButton::record, LoadIcon( _T("record_s.bmp") )); m_IconSizer->Add(record); } -void CinematicSidebar::AddTrack(std::wstring& name, int count) + +void CinematicSidebar::AddPath(std::wstring& name, int count) //rotation { - m_Tracks.push_back(sCinemaTrack(name)); - SelectPath(-1); - SelectTrack(count); - UpdateEngineData(); -} -void CinematicSidebar::AddPath(int x, int y, int z, int count) //rotation -{ - if ( m_SelectedTrack < 0 ) - return; - std::vector paths=*m_Tracks[m_SelectedTrack].paths; - paths.push_back( sCinemaPath(x, y, z) ); - - m_Tracks[m_SelectedTrack].paths = paths; + m_Paths.push_back( sCinemaPath(name) ); SelectSplineNode(-1); + m_SelectedSplineNode = -1; + m_SelectedPath = count; //Ensure that selection is valid for UpdateEngineData + UpdateEngineData(); //Make sure the path exists in the engine before we send a select message to it SelectPath(count); - UpdateEngineData(); + } -void CinematicSidebar::AddNode(float x, float y, float z, int count) +void CinematicSidebar::AddNode(float px, float py, float pz, float rx, float ry, float rz, int count) { - if ( m_SelectedTrack < 0 || m_SelectedPath < 0 ) + if ( m_SelectedPath < 0 ) return; - std::vector paths=*m_Tracks[m_SelectedTrack].paths; - std::vector nodes=*(*m_Tracks[m_SelectedTrack].paths) - [m_SelectedPath].nodes; - sCinemaSplineNode newNode(x, y, z); + std::vector nodes = *GetCurrentPath()->nodes; + sCinemaSplineNode newNode(px, py, pz, rx, ry, rz); if ( !nodes.empty() ) { newNode.SetTime(1.0f); - paths[m_SelectedPath].duration = paths[m_SelectedPath].duration + 1.0f; - m_Tracks[m_SelectedTrack].duration = m_Tracks[m_SelectedTrack].duration + 1.0f; + m_Paths[m_SelectedPath].duration = m_Paths[m_SelectedPath].duration + 1.0f; } nodes.push_back(newNode); - paths[m_SelectedPath].nodes = nodes; - m_Tracks[m_SelectedTrack].paths = paths; + m_Paths[m_SelectedPath].nodes = nodes; UpdateEngineData(); SelectSplineNode(count, count+1); } -void CinematicSidebar::DeleteTrack() -{ - m_Tracks.erase( m_Tracks.begin() + m_SelectedTrack ); - ssize_t size = (ssize_t)m_Tracks.size(); - - m_SelectedPath = -1; - m_SelectedSplineNode = -1; - if ( size == 0 ) - SelectTrack(-1); - else if ( m_SelectedTrack > size-1 ) - SelectTrack(size-1); - else - SelectTrack(m_SelectedTrack); - UpdateEngineData(); -} void CinematicSidebar::DeletePath() { - if ( m_SelectedTrack < 0 || m_SelectedPath < 0 ) + if ( m_SelectedPath < 0 ) return; - std::vector paths = *m_Tracks[m_SelectedTrack].paths; - paths.erase( paths.begin() + m_SelectedPath ); - m_Tracks[m_SelectedTrack].paths = paths; - ssize_t size = (ssize_t)paths.size(); + + m_Paths.erase( m_Paths.begin() + m_SelectedPath ); + ssize_t size = (ssize_t)m_Paths.size(); m_SelectedSplineNode = -1; if ( size == 0 ) @@ -1267,31 +924,22 @@ void CinematicSidebar::DeletePath() else SelectPath(m_SelectedPath); - SelectTrack(m_SelectedTrack); UpdateEngineData(); } + void CinematicSidebar::DeleteNode() { - if ( m_SelectedTrack < 0 || m_SelectedPath < 0 || - m_SelectedSplineNode < 0 ) - { + if ( m_SelectedPath < 0 || m_SelectedSplineNode < 0 ) return; - } - std::vector paths = *m_Tracks[m_SelectedTrack].paths; - std::vector nodes = *paths[m_SelectedPath].nodes; - m_Tracks[m_SelectedTrack].duration = m_Tracks[m_SelectedTrack].duration - - nodes[m_SelectedSplineNode].t; - paths[m_SelectedPath].duration = paths[m_SelectedPath].duration - - nodes[m_SelectedSplineNode].t; + + std::vector nodes = *m_Paths[m_SelectedPath].nodes; + m_Paths[m_SelectedPath].duration = m_Paths[m_SelectedPath].duration - nodes[m_SelectedSplineNode].t; - if ( m_AbsoluteTime > m_Tracks[m_SelectedTrack].duration ) - m_AbsoluteTime = m_Tracks[m_SelectedTrack].duration; - if ( m_TimeElapsed > paths[m_SelectedPath].duration ) - m_TimeElapsed = paths[m_SelectedPath].duration; + if ( m_TimeElapsed > m_Paths[m_SelectedPath].duration ) + m_TimeElapsed = m_Paths[m_SelectedPath].duration; nodes.erase( nodes.begin() + m_SelectedSplineNode ); - paths[m_SelectedPath].nodes = nodes; - m_Tracks[m_SelectedTrack].paths = paths; + m_Paths[m_SelectedPath].nodes = nodes; ssize_t size = (ssize_t)nodes.size(); if ( size == 0 ) @@ -1300,206 +948,143 @@ void CinematicSidebar::DeleteNode() SelectSplineNode(size-1, size); else SelectSplineNode(m_SelectedSplineNode, size); + SelectPath(m_SelectedPath); //Correct numbering UpdateEngineData(); - } -void CinematicSidebar::UpdateTrack(std::wstring name, float timescale) +void CinematicSidebar::UpdatePath(std::wstring name, float timescale) { - if ( m_SelectedTrack < 0 ) + if ( m_SelectedPath < 0 ) return; - m_Tracks[m_SelectedTrack].name = name; - m_Tracks[m_SelectedTrack].timescale = timescale; - m_TrackList->SetItemText(m_SelectedTrack, wxString(name.c_str())); + + m_Paths[m_SelectedPath].name = name; + m_Paths[m_SelectedPath].timescale = timescale; UpdateEngineData(); } -void CinematicSidebar::UpdatePath(int x, int y, int z, ssize_t index) + +void CinematicSidebar::UpdateNode(float px, float py, float pz, float rx, float ry, float rz, float t) { - if ( m_SelectedTrack < 0 || m_SelectedPath < 0 ) + if ( m_SelectedPath < 0 || m_SelectedSplineNode < 0 ) return; - if ( index < 0 ) - index = m_SelectedPath; - - std::vector paths=*m_Tracks[m_SelectedTrack].paths; - - //Convert to relative rotation - if ( m_RotationAbsolute || index == 0 ) - { - /*int x2, y2, z2; - GetAbsoluteRotation(x2, y2, z2, index-1); - paths[index].x = x - x2; - paths[index].y = y - y2; - paths[index].z = z - z2;*/ - paths[index].x = x; - paths[index].y = y; - paths[index].z = z; - } - else - { - paths[index].x = x + paths[index-1].x; - paths[index].y = y + paths[index-1].y; - paths[index].z = z + paths[index-1].z; - } - - /*if ( index != (ssize_t)paths.size()-1 && !m_UpdatePathEcho ) - { - //Recalculate relative rotation for path - m_Tracks[m_SelectedTrack].paths = paths; - int x2, y2, z2; - bool marker = m_RotationAbsolute; - m_RotationAbsolute = false; - GetAbsoluteRotation(x, y, z, index); - GetAbsoluteRotation(x2, y2, z2, index+1); - - m_UpdatePathEcho = true; - UpdatePath(x2 - x, y2 - y, z2 - z, m_SelectedPath+1); - m_RotationAbsolute = marker; - } - else if ( m_UpdatePathEcho ) - m_UpdatePathEcho = false;*/ - - m_Tracks[m_SelectedTrack].paths = paths; - UpdateEngineData(); -} -void CinematicSidebar::UpdateNode(float x, float y, float z, float t) -{ - if ( m_SelectedTrack < 0 || m_SelectedPath < 0 || - m_SelectedSplineNode < 0 ) - { - return; - } else if ( m_SelectedSplineNode == 0 && t > 0.0f ) { wxBell(); //Let them know: the first node has no meaning return; } - std::vector paths=*m_Tracks[m_SelectedTrack].paths; - std::vector nodes=*(*m_Tracks[m_SelectedTrack].paths)[m_SelectedPath].nodes; + + std::vector nodes = *GetCurrentPath()->nodes; if ( t < 0 ) t = nodes[m_SelectedSplineNode].t; - sCinemaSplineNode newNode(x, y, z); + if ( m_RotationAbsolute ) + { + nodes[m_SelectedSplineNode].rx = rx; + nodes[m_SelectedSplineNode].ry = ry; + nodes[m_SelectedSplineNode].rz = rz; + } + else + { + nodes[m_SelectedSplineNode].rx = rx + nodes[m_SelectedSplineNode-1].rx; + nodes[m_SelectedSplineNode].ry = ry + nodes[m_SelectedSplineNode-1].ry; + nodes[m_SelectedSplineNode].rz = rz + nodes[m_SelectedSplineNode-1].rz; + } + + sCinemaSplineNode newNode(px, py, pz, rx, ry, rz); newNode.SetTime(t); float delta = newNode.t - nodes[m_SelectedSplineNode].t; - paths[m_SelectedPath].duration = paths[m_SelectedPath].duration + delta; - m_Tracks[m_SelectedTrack].duration = m_Tracks[m_SelectedTrack].duration + delta; + m_Paths[m_SelectedPath].duration = m_Paths[m_SelectedPath].duration + delta; nodes[m_SelectedSplineNode] = newNode; - paths[m_SelectedPath].nodes = nodes; - m_Tracks[m_SelectedTrack].paths = paths; + m_Paths[m_SelectedPath].nodes = nodes; + UpdateEngineData(); } + void CinematicSidebar::UpdateSpinners() { - if ( m_SelectedTrack < 0 || m_SelectedPath < 0 ) + if ( m_SelectedPath < 0 || m_SelectedSplineNode < 0 ) return; - - sCinemaPath path = GetCurrentPath(); - int x = path.x, y = path.y, z = path.z; - if ( !m_RotationAbsolute && m_SelectedPath != 0 ) + std::vector nodes = *GetCurrentPath()->nodes; + sCinemaSplineNode node = nodes[m_SelectedSplineNode]; + + if ( !m_RotationAbsolute && m_SelectedSplineNode != 0 ) { - std::vector paths = *m_Tracks[m_SelectedTrack].paths; - x -= paths[m_SelectedPath-1].x; - y -= paths[m_SelectedPath-1].y; - z -= paths[m_SelectedPath-1].z; + m_SpinnerBox->UpdateRotationSpinners(node.rx - nodes[m_SelectedSplineNode-1].rx, + node.ry - nodes[m_SelectedSplineNode-1].ry, + node.rz - nodes[m_SelectedSplineNode-1].rz); } - m_SpinnerBox->UpdatePathSpinners(x, y, z); - - if ( m_SelectedSplineNode < 0 ) - return; + else + m_SpinnerBox->UpdateRotationSpinners(node.rx, node.ry, node.rz); - sCinemaSplineNode node = (*path.nodes)[m_SelectedSplineNode]; - x = node.x, y = node.y, z = node.z; - float t = node.t; - m_SpinnerBox->UpdateNodeSpinners(x, y, z, t, m_SelectedSplineNode); + m_SpinnerBox->UpdatePositionSpinners(node.px, node.py, node.pz, node.t, m_SelectedSplineNode); } + void CinematicSidebar::UpdateTexts() { - if ( m_SelectedTrack < 0 ) + if ( m_SelectedPath < 0 ) return; - m_CinemaBottomBar->Update(* m_Tracks[m_SelectedTrack].name, - m_Tracks[m_SelectedTrack].timescale ); + m_CinemaBottomBar->Update(GetSelectedPathName(), m_Paths[m_SelectedPath].timescale ); if ( m_SelectedPath >= 0 ) { - sCinemaPath path = GetCurrentPath(); + const sCinemaPath* path = GetCurrentPath(); m_InfoBox->Update(path); } } -void CinematicSidebar::UpdatePathInfo(int mode, int style, float growth, - float change, bool drawAll, bool drawCurrent, bool drawLine) +void CinematicSidebar::UpdatePathInfo(int mode, int style, float growth, float change, + bool drawCurrent, bool drawLine) { - if ( m_SelectedTrack < 0 || m_SelectedPath < 0 ) + if ( m_SelectedPath < 0 ) return; - std::vector paths = *m_Tracks[m_SelectedTrack].paths; - paths[m_SelectedPath].mode = mode; - paths[m_SelectedPath].style = style; - paths[m_SelectedPath].growth = growth; - paths[m_SelectedPath].change = change; - m_Tracks[m_SelectedTrack].paths = paths; + + m_Paths[m_SelectedPath].mode = mode; + m_Paths[m_SelectedPath].style = style; + m_Paths[m_SelectedPath].growth = growth; + m_Paths[m_SelectedPath].change = change; + UpdateEngineData(); - POST_MESSAGE( CinemaEvent, (*m_Tracks[m_SelectedTrack].name, - eCinemaEventMode::SELECT, (int)m_SelectedPath, drawAll, - drawCurrent, drawLine) ); + POST_MESSAGE( CinemaEvent, (GetSelectedPathName(), + eCinemaEventMode::SELECT, (int)m_SelectedPath, drawCurrent, drawLine) ); } + void CinematicSidebar::UpdateEngineData() { - POST_COMMAND(SetCinemaTracks, (m_Tracks) ); + POST_COMMAND(SetCinemaPaths, (m_Paths) ); + SendEngineSelection(); UpdateSpinners(); } +void CinematicSidebar::SendEngineSelection() +{ + POST_MESSAGE(CinemaEvent, ( GetSelectedPathName(), eCinemaEventMode::SELECT, + (int)m_SelectedPath, m_InfoBox->GetDrawCurrent(), m_InfoBox->GetDrawLines() )); +} void CinematicSidebar::GotoNode(ssize_t index) { - if ( m_SelectedTrack < 0 || m_SelectedPath < 0 || - m_SelectedSplineNode < 0 ) - { + if ( m_SelectedPath < 0 || m_SelectedSplineNode < 0 ) return; - } if ( index < 0 ) index = m_SelectedSplineNode; - std::vector paths=*m_Tracks[m_SelectedTrack].paths; - std::vector nodes=*(*m_Tracks[m_SelectedTrack].paths) - [m_SelectedPath].nodes; - float nodeTime=0; - float pathTime=0; - for ( ssize_t i=0; i<=index; ++i ) - nodeTime += nodes[i].t; - for ( ssize_t i=0; i nodes = *GetCurrentPath()->nodes; + float time = 0; - POST_MESSAGE(CinemaEvent, - ( *m_Tracks[m_SelectedTrack].name, eCinemaEventMode::IMMEDIATE_TRACK, m_AbsoluteTime, - m_InfoBox->GetDrawAll(), m_InfoBox->GetDrawCurrent(), m_InfoBox->GetDrawLines() ) ); + for ( ssize_t i=0; i<=index; ++i ) + time += nodes[i].t; + + m_TimeElapsed = time; + POST_MESSAGE( CinemaEvent, (GetSelectedPathName(), eCinemaEventMode::IMMEDIATE_PATH, time, + m_InfoBox->GetDrawCurrent(), m_InfoBox->GetDrawLines()) ); //this is just an echo if false - if ( m_AbsoluteTime / m_Tracks[m_SelectedTrack].duration + CINEMA_EPSILON < 1.f || !m_Playing ) - m_SliderBox->Update(); + if ( m_TimeElapsed / GetCurrentPath()->duration < 1.f ) + m_PathSlider->Update(0.0f); } -float CinematicSidebar::UpdateSelectedPath() -{ - size_t i=0; - std::vectorpaths = *m_Tracks[m_SelectedTrack].paths; - for ( float time=0.0f; i < paths.size(); ++i ) - { - float duration = paths[i].duration; - time += duration; - if ( time > m_AbsoluteTime ) - { - static size_t index=(size_t)-1; //Bogus value to begin with - if ( index != i ) //If not the same as previous path, change - { - SelectPath((ssize_t)i); - index = i; - } - m_TimeElapsed = m_AbsoluteTime-(time-duration); - return m_TimeElapsed; - } - } - return m_TimeElapsed; +std::wstring CinematicSidebar::GetSelectedPathName() const +{ + if ( m_SelectedPath < 0 ) + return std::wstring(L"Invalid path"); + return *m_Paths[m_SelectedPath].name; } diff --git a/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Cinematic/Cinematic.h b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Cinematic/Cinematic.h index 0e96d3131a..8bf92223ed 100644 --- a/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Cinematic/Cinematic.h +++ b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Cinematic/Cinematic.h @@ -8,10 +8,8 @@ #include "GameInterface/Messages.h" -class TrackListCtrl; class PathListCtrl; class NodeListCtrl; -class CinemaSliderBox; class CinemaSpinnerBox; class CinemaInfoBox; class CinematicBottomBar; @@ -22,23 +20,21 @@ class CinematicSidebar : public Sidebar { //For ease (from lazyness) friend class CinemaButtonBox; - friend class TrackSlider; friend class PathSlider; + public: + CinematicSidebar(wxWindow* sidebarContainer, wxWindow* bottomBarContainer); + //The actual data is stored in bottom bar, but is controled from here - void SelectTrack(ssize_t n); void SelectPath(ssize_t n); //avoid excessive shareable->vector conversion with size paramater void SelectSplineNode(ssize_t n, ssize_t size = -1); - void AddTrack(std::wstring& name, int count); - void AddPath(int x, int y, int z, int count); - void AddNode(float x, float y, float z, int count); - void UpdateTrack(std::wstring name, float timescale); - //void UpdateTrack(float x, float y, float z); - void UpdatePath(int x, int y, int z, ssize_t index=-1); - void UpdateNode(float x, float y, float z, float t=-1); + void AddPath(std::wstring& name, int count); + void AddNode(float px, float py, float pz, float rx, float ry, float rz, int count); + void UpdatePath(std::wstring name, float timescale); + void UpdateNode(float px, float py, float pz, float rx, float ry, float rz, float t=-1); void DeleteTrack(); void DeletePath(); @@ -46,23 +42,21 @@ public: void SetSpinners(CinemaSpinnerBox* box) { m_SpinnerBox = box; } - const AtlasMessage::sCinemaTrack* GetCurrentTrack(); - AtlasMessage::sCinemaPath GetCurrentPath(); - AtlasMessage::sCinemaSplineNode GetCurrentNode(); + const AtlasMessage::sCinemaPath* GetCurrentPath() const; + AtlasMessage::sCinemaSplineNode GetCurrentNode() const; - int GetSelectedTrack() { return m_SelectedTrack; } - std::wstring GetSelectedTrackName() { return *m_Tracks[m_SelectedTrack].name; } - int GetSelectedPath() { return m_SelectedPath; } - int GetSelectedNode() { return m_SelectedSplineNode; } + std::wstring GetSelectedPathName() const; + int GetSelectedPath() const { return m_SelectedPath; } + int GetSelectedNode() const { return m_SelectedSplineNode; } void GotoNode(ssize_t index=-1); - float UpdateSelectedPath(); - void UpdatePathInfo(int mode, int style, float growth, float change, - bool drawAll, bool drawCurrent, bool drawLine); + void UpdatePathInfo(int mode, int style, float growth, float change, bool drawCurrent, bool drawLine); void UpdateSpinners(); void UpdateTexts(); + void UpdateEngineData(); + void SendEngineSelection(); float m_TimeElapsed; //path time float m_AbsoluteTime; //track time @@ -76,20 +70,18 @@ protected: private: // Stores all cinematics data for this map. Initialised by OnFirstDisplay. // Sent back to the game by [TODO]. (TODO: handle 'undo' correctly) - std::vector m_Tracks; + std::vector m_Paths; CinemaButtonBox* m_IconSizer; - ssize_t m_SelectedTrack; // -1 for none ssize_t m_SelectedPath; // -1 for none ssize_t m_SelectedSplineNode; // -1 for none - TrackListCtrl* m_TrackList; PathListCtrl* m_PathList; NodeListCtrl* m_NodeList; - CinemaSliderBox* m_SliderBox; - CinemaSpinnerBox* m_SpinnerBox; //We must update the display - CinemaInfoBox* m_InfoBox; // ^same^ + PathSlider* m_PathSlider; + CinemaSpinnerBox* m_SpinnerBox; //We must update the display + CinemaInfoBox* m_InfoBox; // ^same^ CinematicBottomBar* m_CinemaBottomBar; wxImage LoadIcon(const wxString& filename); diff --git a/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Trigger/Trigger.cpp b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Trigger/Trigger.cpp index cce653180b..4dcafe5ee7 100644 --- a/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Trigger/Trigger.cpp +++ b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Trigger/Trigger.cpp @@ -287,13 +287,17 @@ public: TriggerSidebar* m_Sidebar; size_t m_CondCount, m_EffectCount; bool m_Group; - std::list m_BlockIndices, m_BlockEndIndices; + std::list m_BlockIndices, m_BlockEndIndices; //index in sidebar list void AddBlock(const int block, const int index) { std::vector copy = *logicBlocks; + std::vector notCopy = *logicNots; copy.push_back(block); + notCopy.push_back(false); + logicBlocks = copy; + logicNots = notCopy; m_BlockIndices.push_back(index); } void AddBlockEnd(const int block, const int index) @@ -345,10 +349,10 @@ class TriggerBottomBar : public wxPanel enum { ID_TimeEdit, ID_CondNameEdit, ID_EffectNameEdit, ID_TriggerNameEdit, ID_RunsEdit, ID_EffectChoice, ID_CondChoice, ID_TimeRadio, ID_LogicRadio, - ID_NotCheck, ID_ActiveCheck }; + ID_NotCheck, ID_ActiveCheck, ID_LogicNotCheck }; public: - enum { NO_VIEW, TRIGGER_VIEW, CONDITION_VIEW, EFFECT_VIEW }; + enum { NO_VIEW, TRIGGER_VIEW, CONDITION_VIEW, EFFECT_VIEW, LOGIC_END_VIEW, LOGIC_VIEW }; TriggerBottomBar(TriggerSidebar* sidebar, wxWindow* parent) : wxPanel(parent), m_Sidebar(sidebar) @@ -477,6 +481,7 @@ public: m_Sidebar->GetSelectedItemData()->maxRuns = iValue; m_Sidebar->UpdateEngineData(); } + void onLogicRadio(wxCommandEvent& evt) { if ( m_Sidebar->m_SelectedCond == -1 ) @@ -508,11 +513,22 @@ public: m_Sidebar->UpdateEngineData(); } + void onLogicNotCheck(wxCommandEvent& evt) + { + TriggerItemData* data = m_Sidebar->GetSelectedItemData(); + + int logicIndex = m_Sidebar->GetLogicBlockCount(m_Sidebar->m_SelectedCond) - 1; + std::vector nots = *data->logicNots; + nots[logicIndex] = evt.IsChecked(); + data->logicNots = nots; + } + void DisplayTriggerSpec(const sTriggerSpec& spec) { if ( m_Sizer->Detach(m_ParameterSizer) ) { m_ParameterSizer->DeleteWindows(); + delete m_ParameterSizer; //m_Sizer->Layout(); // Layout(); } @@ -642,11 +658,13 @@ public: void FillConditionData() { - if ( m_Sidebar->m_SelectedCond== -1 ) + if ( m_Sidebar->m_SelectedCond == -1 ) return; TriggerItemData* itemData = m_Sidebar->GetSelectedItemData(); int iCondition = m_Sidebar->GetConditionCount(m_Sidebar->m_SelectedCond); + if ( iCondition <= 0 ) + return; sTriggerCondition condition = (*itemData->conditions)[iCondition-1]; wxString display( (*condition.displayName).c_str() ); m_ConditionEdit->SetValue( wxString(condition.name.c_str()) ); @@ -708,6 +726,13 @@ public: } + void FillLogicData() + { + std::vector nots = *m_Sidebar->GetSelectedItemData()->logicNots; + m_LogicNotCheck->SetValue( nots[m_Sidebar->GetLogicBlockCount(m_Sidebar->m_SelectedCond)-1] ); + } + + void ToEffectView() { DestroyChildren(); @@ -828,6 +853,22 @@ public: Layout(); m_DependentStatus = TRIGGER_VIEW; } + //void ToLogicEndView(); + + void ToLogicView() + { + DestroyChildren(); + m_Sizer = new wxBoxSizer(wxHORIZONTAL); + m_DependentSizer = new wxStaticBoxSizer(wxVERTICAL, this, wxString(L"Trigger Editor")); + SetSizer(m_Sizer, true); + + m_LogicNotCheck = new wxCheckBox(this, ID_LogicNotCheck, L"Not"); + m_DependentSizer->Add(m_LogicNotCheck); + m_Sizer->Add(m_DependentSizer, 0, wxTOP | wxLEFT | wxALIGN_LEFT, 10); + m_Sizer->Layout(); + Layout(); + m_DependentStatus = LOGIC_VIEW; + } void ToNoView() { if ( m_DependentStatus == NO_VIEW ) @@ -844,9 +885,9 @@ private: wxStaticBoxSizer* m_DependentSizer; //dependent = effect/condition wxTextCtrl* m_TimeEdit, *m_ConditionEdit, *m_EffectEdit, *m_TriggerEdit, *m_RunsEdit; - wxCheckBox* m_ActiveCheck, *m_NotCheck; + wxCheckBox* m_ActiveCheck, *m_NotCheck, *m_LogicNotCheck; wxChoice* m_ConditionChoice, *m_EffectChoice; - wxRadioBox* m_LogicRadio, *m_TimeRadio; + wxRadioBox* m_LogicRadio, *m_TimeRadio, m_LogicEndRadio; std::vector m_ConditionSpecs, m_EffectSpecs; @@ -868,6 +909,7 @@ EVT_CHOICE(TriggerBottomBar::ID_CondChoice, TriggerBottomBar::onCondChoice) EVT_RADIOBOX(TriggerBottomBar::ID_LogicRadio, TriggerBottomBar::onLogicRadio) EVT_CHECKBOX(TriggerBottomBar::ID_ActiveCheck, TriggerBottomBar::onActiveCheck) EVT_CHECKBOX(TriggerBottomBar::ID_NotCheck, TriggerBottomBar::onNotCheck) +EVT_CHECKBOX(TriggerBottomBar::ID_LogicNotCheck, TriggerBottomBar::onLogicNotCheck) //EVT_RADIOBOX(TriggerBotomBar::ID_TimeRadio, TriggerBottomBar::onTimeRadio) END_EVENT_TABLE() @@ -892,9 +934,34 @@ void TriggerListCtrl::onClick(wxMouseEvent& evt) if ( m_Condition ) { //if ( m_Sidebar->m_TriggerBottom->GetDependentStatus() != TriggerBottomBar::CONDITION_VIEW ) + + /*if ( m_Sidebar->m_ConditionPage->m_List->GetItemText(m_Sidebar->m_SelectedCond) + == m_Sidebar->m_LogicBlockEndString ) + { + m_Sidebar->m_TriggerBottom->ToLogicEndView(); + + if ( m_Sidebar->m_SelectedCond != -1 ) + m_Sidebar->m_TriggerBottom->FillLogicEndData(); + }*/ + if ( m_Sidebar->m_ConditionPage->m_List->GetItemText(m_Sidebar->m_SelectedCond) + == m_Sidebar->m_LogicBlockEndString ) + { + m_Sidebar->m_TriggerBottom->ToNoView(); + } + else if ( m_Sidebar->m_ConditionPage->m_List->GetItemText(m_Sidebar->m_SelectedCond) + == m_Sidebar->m_LogicBlockString ) + { + m_Sidebar->m_TriggerBottom->ToLogicView(); + + if ( m_Sidebar->m_SelectedCond != -1 ) + m_Sidebar->m_TriggerBottom->FillLogicData(); + } + else + { m_Sidebar->m_TriggerBottom->ToConditionView(); - if ( m_Sidebar->m_SelectedCond != -1 ) - m_Sidebar->m_TriggerBottom->FillConditionData(); + if ( m_Sidebar->m_SelectedCond != -1 ) + m_Sidebar->m_TriggerBottom->FillConditionData(); + } } else { @@ -1233,6 +1300,8 @@ void onLogicBlockPush(void* data) sidebar->GetSelectedItemData()->AddBlock(conditionCount, limit); sidebar->UpdateLists(); + sidebar->m_TriggerBottom->ToLogicView(); //Some data is not valid, so reset + sidebar->m_TriggerBottom->FillLogicData(); sidebar->UpdateEngineData(); } @@ -1336,12 +1405,22 @@ int TriggerSidebar::GetConditionCount(int limit) for ( int i = 0; i <= limit; ++i ) { if ( list->GetItemText(i) != m_LogicBlockString && list->GetItemText(i) != m_LogicBlockEndString) - { ++conditionCount; - } } return conditionCount; } + +int TriggerSidebar::GetLogicBlockCount(int limit) +{ + int logicCount = 0; + wxListCtrl* list = m_ConditionPage->m_List; + for ( int i = 0; i <= limit; ++i ) + { + if ( list->GetItemText(i) == m_LogicBlockString ) + ++logicCount; + } + return logicCount; +} void TriggerSidebar::OnFirstDisplay() { qGetTriggerData dataQuery; @@ -1542,8 +1621,25 @@ void TriggerSidebar::onCondSelect(wxListEvent& evt) { m_SelectedCond = evt.GetIndex(); //if ( m_TriggerBottom->GetDependentStatus() != TriggerBottomBar::CONDITION_VIEW ) + if ( m_ConditionPage->m_List->GetItemText(m_SelectedCond) + == m_LogicBlockEndString ) + { + m_TriggerBottom->ToNoView(); + } + else if ( m_ConditionPage->m_List->GetItemText(m_SelectedCond) + == m_LogicBlockString ) + { + m_TriggerBottom->ToLogicView(); + + if ( m_SelectedCond != -1 ) + m_TriggerBottom->FillLogicData(); + } + else + { m_TriggerBottom->ToConditionView(); - m_TriggerBottom->FillConditionData(); + if ( m_SelectedCond != -1 ) + m_TriggerBottom->FillConditionData(); + } } void TriggerSidebar::onEffectSelect(wxListEvent& evt) { diff --git a/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Trigger/Trigger.h b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Trigger/Trigger.h index b08037df58..a5380ca061 100644 --- a/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Trigger/Trigger.h +++ b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Trigger/Trigger.h @@ -37,6 +37,7 @@ public: //Finds condition number (index+1) of m_SelectedCond [needed because of logic blocks] int GetConditionCount(int limit); + int GetLogicBlockCount(int limit); void UpdateLists(); void UpdateEngineData(); diff --git a/source/tools/atlas/GameInterface/Handlers/CinemaHandler.cpp b/source/tools/atlas/GameInterface/Handlers/CinemaHandler.cpp index 06fbca5c74..3769069aad 100644 --- a/source/tools/atlas/GameInterface/Handlers/CinemaHandler.cpp +++ b/source/tools/atlas/GameInterface/Handlers/CinemaHandler.cpp @@ -17,14 +17,7 @@ namespace AtlasMessage { -sCinemaTrack ConstructCinemaTrack(const CCinemaTrack& data) -{ - sCinemaTrack track; - track.timescale = data.GetTimescale(); - track.duration = data.GetTotalDuration(); - - return track; -} + sCinemaPath ConstructCinemaPath(const CCinemaPath* source) { sCinemaPath path; @@ -32,6 +25,7 @@ sCinemaPath ConstructCinemaPath(const CCinemaPath* source) path.mode = data->m_Mode; path.style = data->m_Style; path.growth = data->m_Growth; + path.timescale = data->m_Timescale; path.change = data->m_Switch; return path; @@ -49,121 +43,75 @@ CCinemaData ConstructCinemaData(const sCinemaPath& path) sCinemaSplineNode ConstructCinemaNode(const SplineData& data) { sCinemaSplineNode node; - node.x = data.Position.X; - node.y = data.Position.Y; - node.z = data.Position.Z; + node.px = data.Position.X; + node.py = data.Position.Y; + node.pz = data.Position.Z; + + node.rx = data.Rotation.X; + node.ry = data.Rotation.Y; + node.rz = data.Rotation.Z; node.t = data.Distance; return node; } -std::vector GetCurrentTracks() +std::vector GetCurrentPaths() { - const std::map& tracks = g_Game->GetView()->GetCinema()->GetAllTracks(); - std::vector atlasTracks; + const std::map& paths = g_Game->GetView()->GetCinema()->GetAllPaths(); + std::vector atlasPaths; - for ( std::map::const_iterator it=tracks.begin(); it!=tracks.end(); it++ ) + for ( std::map::const_iterator it=paths.begin(); it!=paths.end(); it++ ) { - sCinemaTrack atlasTrack = ConstructCinemaTrack(it->second); - - atlasTrack.name = it->first; - const std::vector& paths = it->second.GetAllPaths(); - - std::vector atlasPaths; - - for ( std::vector::const_iterator it2=paths.begin(); it2!=paths.end(); it2++ ) + sCinemaPath path = ConstructCinemaPath(&it->second); + path.name = it->first; + + const std::vector& nodes = it->second.GetAllNodes(); + std::vector atlasNodes; + + for ( size_t i=0; isecond.GetRotation(); - else - rotation = (it2-1)->GetData()->m_TotalRotation; - - path.x = RADTODEG(rotation.X); - path.y = RADTODEG(rotation.Y); - path.z = RADTODEG(rotation.Z); - - const std::vector& nodes = it2->GetAllNodes(); - std::vector atlasNodes; - - for ( size_t i=0; i 2 ) { - atlasNodes.push_back( ConstructCinemaNode(nodes[i]) ); + for ( size_t i=atlasNodes.size()-2; i>0; --i ) + atlasNodes[i].t = atlasNodes[i-1].t; } - if ( !atlasNodes.empty() ) - { - float back = atlasNodes.back().t; - if ( atlasNodes.size() > 2 ) - { - for ( size_t i=atlasNodes.size()-2; i>0; --i ) - atlasNodes[i].t = atlasNodes[i-1].t; - } - atlasNodes.back().t = atlasNodes.front().t; - atlasNodes.front().t = back; - } - path.nodes = atlasNodes; - path.duration = it2->GetDuration(); - atlasPaths.push_back(path); + atlasNodes.back().t = atlasNodes.front().t; + atlasNodes.front().t = back; } - atlasTrack.paths = atlasPaths; - atlasTracks.push_back(atlasTrack); + path.nodes = atlasNodes; + atlasPaths.push_back(path); } - return atlasTracks; + return atlasPaths; } -void SetCurrentTracks(const std::vector& atlasTracks) +void SetCurrentPaths(const std::vector& atlasPaths) { - std::map tracks; + std::map paths; - for ( std::vector::const_iterator it=atlasTracks.begin(); it!=atlasTracks.end(); it++ ) + for ( std::vector::const_iterator it=atlasPaths.begin(); it!=atlasPaths.end(); it++ ) { - CStrW trackName(*it->name); - tracks[trackName] = CCinemaTrack(); - - tracks[trackName].SetTimescale(it->timescale); - const std::vector paths = *it->paths; - size_t i=0; + CStrW pathName(*it->name); + paths[pathName] = CCinemaPath(); + paths[pathName].SetTimescale(it->timescale); - for ( std::vector::const_iterator it2=paths.begin(); - it2!=paths.end(); it2++, ++i ) - { - const sCinemaPath& atlasPath = *it2; - const std::vector nodes = *atlasPath.nodes; - TNSpline spline; - CCinemaData data = ConstructCinemaData(atlasPath); - - if ( i == 0 ) - { - tracks[trackName].SetStartRotation( CVector3D(DEGTORAD(it2->x), - DEGTORAD(it2->y), DEGTORAD(it2->z)) ); - if ( paths.size() == 1 ) - { - data.m_TotalRotation = CVector3D( DEGTORAD(it2->x), - DEGTORAD(it2->y), DEGTORAD(it2->z) ); - } - } - - if ( i < paths.size() -1 ) - { - data.m_TotalRotation = CVector3D(CVector3D(DEGTORAD((it2+1)->x), - DEGTORAD((it2+1)->y), DEGTORAD((it2+1)->z))); - } - else if ( i > 0 ) //no rotation (ending path) - { - data.m_TotalRotation = CVector3D(DEGTORAD((it2)->x), - DEGTORAD((it2)->y), DEGTORAD((it2)->z)); - } - - for ( size_t j=0; j nodes = *atlasPath.nodes; + TNSpline spline; + CCinemaData data = ConstructCinemaData(atlasPath); + + for ( size_t j=0; jGetView()->GetCinema()->SetAllTracks(tracks); + + g_Game->GetView()->GetCinema()->SetAllPaths(paths); } QUERYHANDLER(GetCameraInfo) { @@ -190,44 +138,43 @@ QUERYHANDLER(GetCameraInfo) MESSAGEHANDLER(CinemaEvent) { CCinemaManager* manager = g_Game->GetView()->GetCinema(); - manager->SetCurrentTrack(*msg->track, msg->drawAll, - msg->drawCurrent, msg->lines); + if ( msg->mode == eCinemaEventMode::SMOOTH ) - manager->OverrideTrack(*msg->track); + manager->OverridePath(*msg->path); else if ( msg->mode == eCinemaEventMode::IMMEDIATE_PATH ) manager->MoveToPointAt(msg->t); - else if ( msg->mode == eCinemaEventMode::IMMEDIATE_TRACK ) - manager->MoveToPointAbsolute(msg->t); else if ( msg->mode == eCinemaEventMode::RESET ) g_Game->GetView()->ResetCamera(); + else if ( msg->mode == eCinemaEventMode::SELECT ) + manager->SetCurrentPath(*msg->path, msg->drawCurrent, msg->lines); else - manager->SetCurrentPath((int)msg->t); + debug_assert(false); } -BEGIN_COMMAND(SetCinemaTracks) +BEGIN_COMMAND(SetCinemaPaths) { - std::vector m_oldTracks, m_newTracks; + std::vector m_oldPaths, m_newPaths; void Do() { - m_oldTracks = GetCurrentTracks(); - m_newTracks = *msg->tracks; + m_oldPaths = GetCurrentPaths(); + m_newPaths = *msg->paths; Redo(); } void Redo() { - SetCurrentTracks(m_newTracks); + SetCurrentPaths(m_newPaths); } void Undo() { - SetCurrentTracks(m_oldTracks); + SetCurrentPaths(m_oldPaths); } }; -END_COMMAND(SetCinemaTracks) +END_COMMAND(SetCinemaPaths) -QUERYHANDLER(GetCinemaTracks) +QUERYHANDLER(GetCinemaPaths) { - msg->tracks = GetCurrentTracks(); + msg->paths = GetCurrentPaths(); } } diff --git a/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp b/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp index 59536ce2ae..5d6f98921f 100644 --- a/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp +++ b/source/tools/atlas/GameInterface/Handlers/MiscHandlers.cpp @@ -32,7 +32,7 @@ MESSAGEHANDLER(Screenshot) QUERYHANDLER(CinemaRecord) { CCinemaManager* manager = g_Game->GetView()->GetCinema(); - manager->SetCurrentTrack(*msg->track, false, false, false); + manager->SetCurrentPath(*msg->path, false, false); const int w = msg->width, h = msg->height; @@ -57,7 +57,7 @@ QUERYHANDLER(CinemaRecord) { View::GetView_Game()->Update(1.f / msg->framerate); - manager->MoveToPointAbsolute((float)frame/msg->framerate); + manager->MoveToPointAt((float)frame/msg->framerate); Render(); Atlas_GLSwapBuffers((void*)g_GameLoop->glCanvas); diff --git a/source/tools/atlas/GameInterface/Handlers/TriggerHandler.cpp b/source/tools/atlas/GameInterface/Handlers/TriggerHandler.cpp index 2012686c54..00168b6a65 100644 --- a/source/tools/atlas/GameInterface/Handlers/TriggerHandler.cpp +++ b/source/tools/atlas/GameInterface/Handlers/TriggerHandler.cpp @@ -266,8 +266,8 @@ QUERYHANDLER(GetTriggerChoices) if ( choices[0] == std::wstring(L"ATLAS_CINEMA_LIST") ) { choices.clear(); - const std::map& tracks = g_Game->GetView()->GetCinema()->GetAllTracks(); - for ( std::map::const_iterator it = tracks.begin(); it != tracks.end(); ++it ) + const std::map& paths = g_Game->GetView()->GetCinema()->GetAllPaths(); + for ( std::map::const_iterator it = paths.begin(); it != paths.end(); ++it ) { choices.push_back(it->first); translations.push_back( L"\"" + it->first + L"\"" ); //Strings need quotes in JS diff --git a/source/tools/atlas/GameInterface/Messages.h b/source/tools/atlas/GameInterface/Messages.h index 60cba32624..7e4ef6fcaf 100644 --- a/source/tools/atlas/GameInterface/Messages.h +++ b/source/tools/atlas/GameInterface/Messages.h @@ -106,7 +106,7 @@ struct sCinemaRecordCB SHAREABLE_STRUCT(sCinemaRecordCB); QUERY(CinemaRecord, - ((std::wstring, track)) + ((std::wstring, path)) ((int, framerate)) ((float, duration)) ((int, width)) @@ -354,9 +354,9 @@ COMMAND(SetObjectSettings, NOMERGE, ////////////////////////////////////////////////////////////////////////// -QUERY(GetCinemaTracks, +QUERY(GetCinemaPaths, , // no inputs - ((std::vector , tracks)) + ((std::vector , paths)) ); QUERY(GetCameraInfo, @@ -364,15 +364,14 @@ QUERY(GetCameraInfo, ((AtlasMessage::sCameraInfo, info)) ); -COMMAND(SetCinemaTracks, NOMERGE, - ((std::vector, tracks)) +COMMAND(SetCinemaPaths, NOMERGE, + ((std::vector, paths)) ); MESSAGE(CinemaEvent, - ((std::wstring, track)) + ((std::wstring, path)) ((int, mode)) ((float, t)) - ((bool, drawAll)) ((bool, drawCurrent)) ((bool, lines)) ); diff --git a/source/tools/atlas/GameInterface/SharedTypes.h b/source/tools/atlas/GameInterface/SharedTypes.h index 13ed05d6bd..44dab4995d 100644 --- a/source/tools/atlas/GameInterface/SharedTypes.h +++ b/source/tools/atlas/GameInterface/SharedTypes.h @@ -70,9 +70,10 @@ inline bool ObjectIDIsValid(ObjectID id) { return (id >= 0); } struct sCinemaSplineNode { - Shareable x, y, z, t; + Shareable px, py, pz, rx, ry, rz, t; public: - sCinemaSplineNode(float px, float py, float pz) : x(px), y(py), z(pz), t(0.0f) {} + sCinemaSplineNode(float _px, float _py, float _pz, float _rx, float _ry, float _rz) + : px(_px), py(_py), pz(_pz), rx(_rx), ry(_ry), rz(_rz), t(0.0f) {} sCinemaSplineNode() {} void SetTime(float _t) { t = _t; } }; @@ -81,39 +82,26 @@ SHAREABLE_STRUCT(sCinemaSplineNode); struct sCinemaPath { Shareable > nodes; - Shareable duration, x, y, z; + Shareable name; + Shareable duration, timescale; Shareable mode, growth, change, style; // change == switch point - sCinemaPath(float rx, float ry, float rz) : x(rx), y(ry), z(rz), - mode(0), style(0), change(0), growth(0), duration(0) {} - sCinemaPath() : x(0), y(0), z(0), mode(0), style(0), - change(0), growth(0), duration(0) {} + sCinemaPath(const std::wstring& _name) : name(_name), mode(0), style(0), change(0), growth(0), duration(0), timescale(1) {} + sCinemaPath() : mode(0), style(0), change(0), growth(0), duration(0), timescale(1) {} - AtlasMessage::sCinemaPath operator-(const AtlasMessage::sCinemaPath& path) + /*AtlasMessage::sCinemaPath operator-(const AtlasMessage::sCinemaPath& path) { return AtlasMessage::sCinemaPath(x - path.x, y - path.y, z - path.z); } AtlasMessage::sCinemaPath operator+(const AtlasMessage::sCinemaPath& path) { return AtlasMessage::sCinemaPath(x + path.x, y + path.y, z + path.z); - } + }*/ }; SHAREABLE_STRUCT(sCinemaPath); -struct sCinemaTrack -{ - Shareable name; - Shareable timescale, duration; - Shareable > paths; -public: - sCinemaTrack(std::wstring track) - : timescale(1.f), duration(0), name(track) {} - sCinemaTrack() : timescale(1.f), duration(0) {} -}; -SHAREABLE_STRUCT(sCinemaTrack); - -struct eCinemaEventMode { enum { SMOOTH, SELECT, IMMEDIATE_PATH, IMMEDIATE_TRACK, RESET }; }; +struct eCinemaEventMode { enum { SMOOTH, SELECT, IMMEDIATE_PATH, RESET }; }; struct sCameraInfo { Shareable pX, pY, pZ, rX, rY, rZ; // position and rotation