Ticket #3814: cinematic_camera_cleanup_2.patch

File cinematic_camera_cleanup_2.patch, 7.7 KB (added by Vladislav Belov, 8 years ago)
  • source/graphics/CinemaPath.cpp

     
    8989void CCinemaPath::Draw() const
    9090{
    9191    DrawSpline(*this, CVector4D(0.2f, 0.2f, 1.f, 0.5f), 100, true);
     92    DrawNodes(*this, CVector4D(0.5f, 1.0f, 0.f, 0.5f));
     93
     94    if (!m_LookAtTarget)
     95        return;
     96
    9297    DrawSpline(m_TargetSpline, CVector4D(1.0f, 0.2f, 0.2f, 0.5f), 100, true);
    93     DrawNodes(CVector4D(0.5f, 1.0f, 0.f, 0.5f));
     98    DrawNodes(m_TargetSpline, CVector4D(1.0f, 0.5f, 0.f, 0.5f));
    9499}
    95100
    96101void CCinemaPath::DrawSpline(const RNSpline& spline, const CVector4D& RGBA, int smoothness, bool lines) const
     
    157162#endif
    158163}
    159164
    160 void CCinemaPath::DrawNodes(const CVector4D& RGBA) const
     165void CCinemaPath::DrawNodes(const RNSpline& spline, const CVector4D& RGBA) const
    161166{
    162167#if CONFIG2_GLES
    163168    #warning TODO : do something about CCinemaPath on GLES
     
    167172
    168173    glColor4f(RGBA.X, RGBA.Y, RGBA.Z, RGBA.W);
    169174    glBegin(GL_POINTS);
    170     for (size_t i = 0; i < Node.size(); ++i)
    171         glVertex3f(Node[i].Position.X.ToFloat(), Node[i].Position.Y.ToFloat(), Node[i].Position.Z.ToFloat());
     175    const std::vector<SplineData> nodes = spline.GetAllNodes();
     176    for (size_t i = 0; i < nodes.size(); ++i)
     177        glVertex3f(nodes[i].Position.X.ToFloat(), nodes[i].Position.Y.ToFloat(), nodes[i].Position.Z.ToFloat());
    172178    glEnd();
    173179
    174     if (!m_LookAtTarget)
    175     {
    176         glPointSize(1.0f);
    177         glDisable(GL_POINT_SMOOTH);
    178         return;
    179     }
    180 
    181     // draw target nodes
    182     glColor4f(RGBA.Y, RGBA.X, RGBA.Z, RGBA.W);
    183     glBegin(GL_POINTS);
    184     for (size_t i = 0; i < m_TargetSpline.GetAllNodes().size(); ++i)
    185         glVertex3f(
    186             m_TargetSpline.GetAllNodes()[i].Position.X.ToFloat(),
    187             m_TargetSpline.GetAllNodes()[i].Position.Y.ToFloat(),
    188             m_TargetSpline.GetAllNodes()[i].Position.Z.ToFloat()
    189         );
    190     glEnd();
    191 
    192180    glPointSize(1.0f);
    193181    glDisable(GL_POINT_SMOOTH);
    194182#endif
     
    357345{
    358346    m_TimeElapsed += m_Timescale.ToFloat() * deltaRealTime;
    359347    if (!Validate())
    360     {
    361         m_TimeElapsed = 0.0f;
    362348        return false;
    363     }
    364349
    365350    MoveToPointAt(m_TimeElapsed / GetDuration().ToFloat(), GetNodeFraction(), m_PreviousRotation);
    366351    return true;
     
    371356    return Node.empty();
    372357}
    373358
     359void CCinemaPath::Reset()
     360{
     361    m_TimeElapsed = 0.0f;
     362}
     363
    374364fixed CCinemaPath::GetTimescale() const
    375365{
    376366    return m_Timescale;
    377367}
    378368
    379 const TNSpline& CCinemaPath::getTargetSpline() const
     369const TNSpline& CCinemaPath::GetTargetSpline() const
    380370{
    381371    return m_TargetSpline;
    382372}
  • source/graphics/CinemaPath.h

     
    8585
    8686    void Draw() const;
    8787    void DrawSpline(const RNSpline& spline, const CVector4D& RGBA, int smoothness, bool lines) const;
    88     void DrawNodes(const CVector4D& RGBA) const;
     88    void DrawNodes(const RNSpline& spline, const CVector4D& RGBA) const;
    8989
    9090    CVector3D GetNodePosition(const int index) const;
    9191    fixed GetNodeDuration(const int index) const;
     
    123123     */
    124124    bool Empty() const;
    125125
     126    /**
     127     * Resets the path state
     128     */
     129    void Reset();
     130
    126131    fixed GetTimescale() const;
    127132
    128     const TNSpline& getTargetSpline() const;
     133    const TNSpline& GetTargetSpline() const;
    129134
    130135private:
    131136
  • source/graphics/MapWriter.cpp

     
    410410            {
    411411                fixed timescale = it->second.GetTimescale();
    412412                const std::vector<SplineData>& nodes = it->second.GetAllNodes();
    413                 const std::vector<SplineData>& target_nodes = it->second.getTargetSpline().GetAllNodes();
     413                const std::vector<SplineData>& target_nodes = it->second.GetTargetSpline().GetAllNodes();
    414414                const CCinemaData* data = it->second.GetData();
    415415               
    416416                XML_Element("Path");
  • source/simulation2/components/CCmpCinemaManager.cpp

     
    9696            if (!data->m_LookAtTarget)
    9797                continue;
    9898
    99             const std::vector<SplineData>& targetNodes = path.getTargetSpline().GetAllNodes();
     99            const std::vector<SplineData>& targetNodes = path.GetTargetSpline().GetAllNodes();
    100100            serialize.NumberU32("NumberOfTargetNodes", targetNodes.size(), 1, MAX_SPLINE_NODES);
    101101            for (size_t i = 0; i < targetNodes.size(); ++i)
    102102            {
    103103                if (i > 0)
    104                     serialize.NumberFixed_Unbounded("NodeDeltaTime", nodes[i - 1].Distance);
     104                    serialize.NumberFixed_Unbounded("NodeDeltaTime", targetNodes[i - 1].Distance);
    105105                else
    106106                    serialize.NumberFixed_Unbounded("NodeDeltaTime", fixed::Zero());
    107                 serialize.NumberFixed_Unbounded("PositionX", nodes[i].Position.X);
    108                 serialize.NumberFixed_Unbounded("PositionY", nodes[i].Position.Y);
    109                 serialize.NumberFixed_Unbounded("PositionZ", nodes[i].Position.Z);
     107                serialize.NumberFixed_Unbounded("PositionX", targetNodes[i].Position.X);
     108                serialize.NumberFixed_Unbounded("PositionY", targetNodes[i].Position.Y);
     109                serialize.NumberFixed_Unbounded("PositionZ", targetNodes[i].Position.Z);
    110110            }
    111111        }
    112112    }
     
    188188            if (!pCinematicSimulationData->m_Enabled)
    189189                break;
    190190
     191            pCinematicSimulationData->m_ElapsedTime += msgData.turnLength;
     192            pCinematicSimulationData->m_CurrentPathElapsedTime += msgData.turnLength;
     193            if (pCinematicSimulationData->m_CurrentPathElapsedTime >= pCinematicSimulationData->m_PathQueue.front().GetDuration())
     194            {
     195                CMessageCinemaPathEnded msgCinemaPathEnded(pCinematicSimulationData->m_PathQueue.front().GetName());
     196                pCinematicSimulationData->m_PathQueue.pop_front();
     197                g_Game->GetSimulation2()->PostMessage(SYSTEM_ENTITY, msgCinemaPathEnded);
     198                pCinematicSimulationData->m_CurrentPathElapsedTime = fixed::Zero();
     199                if (!pCinematicSimulationData->m_PathQueue.empty())
     200                    pCinematicSimulationData->m_PathQueue.front().Reset();
     201            }
    191202            if (pCinematicSimulationData->m_ElapsedTime >= pCinematicSimulationData->m_TotalTime)
    192203            {
     204                pCinematicSimulationData->m_CurrentPathElapsedTime = fixed::Zero();
    193205                pCinematicSimulationData->m_ElapsedTime = fixed::Zero();
    194206                pCinematicSimulationData->m_TotalTime = fixed::Zero();
    195207                g_Game->GetView()->GetCinema()->SetEnabled(false);
    196208                g_Game->GetSimulation2()->PostMessage(SYSTEM_ENTITY, CMessageCinemaQueueEnded());
    197209            }
    198             else
    199             {
    200                 pCinematicSimulationData->m_ElapsedTime += msgData.turnLength;
    201                 pCinematicSimulationData->m_CurrentPathElapsedTime += msgData.turnLength;
    202                 if (pCinematicSimulationData->m_CurrentPathElapsedTime >= pCinematicSimulationData->m_PathQueue.front().GetDuration())
    203                 {
    204                     CMessageCinemaPathEnded msgCinemaPathEnded(pCinematicSimulationData->m_PathQueue.front().GetName());
    205                     pCinematicSimulationData->m_PathQueue.pop_front();
    206                     g_Game->GetSimulation2()->PostMessage(SYSTEM_ENTITY, msgCinemaPathEnded);
    207                 }
    208             }
    209210            break;
    210211        }
    211212        default:
     
    218219        if (!g_Game || !g_Game->GetView())
    219220            return;
    220221        g_Game->GetView()->GetCinema()->AddPathToQueue(name);
    221         CinematicSimulationData* pGetCinematicSimulationData = g_Game->GetView()->GetCinema()->GetCinematicSimulationData();
    222         pGetCinematicSimulationData->m_TotalTime += pGetCinematicSimulationData->m_Paths[name].GetDuration();
     222        CinematicSimulationData* pCinematicSimulationData = g_Game->GetView()->GetCinema()->GetCinematicSimulationData();
     223        if (pCinematicSimulationData->m_PathQueue.size() == 1)
     224            pCinematicSimulationData->m_PathQueue.front().Reset();
     225        pCinematicSimulationData->m_TotalTime += pCinematicSimulationData->m_Paths[name].GetDuration();
    223226    }
    224227
    225228    virtual void Play()