Ticket #3301: cinematic_camera_map_saving_fix.2.patch

File cinematic_camera_map_saving_fix.2.patch, 3.4 KB (added by Vladislav Belov, 8 years ago)
  • source/graphics/CinemaPath.h

     
    126126
    127127    fixed GetTimescale() const { return m_Timescale; }
    128128
    129     TNSpline* getTargetSpline() { return &m_TargetSpline; }
     129    const TNSpline& getTargetSpline() const { return m_TargetSpline; }
    130130
    131131private:
    132132
  • 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();
    413414                const CCinemaData* data = it->second.GetData();
    414 
     415               
    415416                XML_Element("Path");
    416417                XML_Attribute("name", data->m_Name);
    417418                XML_Attribute("timescale", timescale);
     
    419420                XML_Attribute("mode", data->m_Mode);
    420421                XML_Attribute("style", data->m_Style);
    421422
    422                 // TODO: write target nodes
    423                 for (size_t j = 0; j < nodes.size(); ++j)
     423                fixed last_target = fixed::Zero();
     424                for (size_t i = 0, j = 0; i < nodes.size(); ++i)
    424425                {
    425426                    XML_Element("Node");
    426                     if (j > 0)
    427                         XML_Attribute("deltatime", nodes[j - 1].Distance);
    428                     else
    429                         XML_Attribute("deltatime", 0.0f);
     427                    fixed distance = i > 0 ? nodes[i - 1].Distance : fixed::Zero();
     428                    last_target += distance;
    430429
     430                    XML_Attribute("deltatime", distance);
     431
    431432                    {
    432433                        XML_Element("Position");
    433                         XML_Attribute("x", nodes[j].Position.X);
    434                         XML_Attribute("y", nodes[j].Position.Y);
    435                         XML_Attribute("z", nodes[j].Position.Z);
     434                        XML_Attribute("x", nodes[i].Position.X);
     435                        XML_Attribute("y", nodes[i].Position.Y);
     436                        XML_Attribute("z", nodes[i].Position.Z);
    436437                    }
    437438
    438439                    {
    439440                        XML_Element("Rotation");
    440                         XML_Attribute("x", nodes[j].Rotation.X);
    441                         XML_Attribute("y", nodes[j].Rotation.Y);
    442                         XML_Attribute("z", nodes[j].Rotation.Z);
     441                        XML_Attribute("x", nodes[i].Rotation.X);
     442                        XML_Attribute("y", nodes[i].Rotation.Y);
     443                        XML_Attribute("z", nodes[i].Rotation.Z);
    443444                    }
     445
     446                    if (j >= target_nodes.size())
     447                        continue;
     448
     449                    fixed target_distance = j > 0 ? target_nodes[j - 1].Distance : fixed::Zero();
     450
     451                    if (target_distance > last_target)
     452                        continue;
     453
     454                    {
     455                        XML_Element("Target");
     456                        XML_Attribute("x", target_nodes[j].Position.X);
     457                        XML_Attribute("y", target_nodes[j].Position.Y);
     458                        XML_Attribute("z", target_nodes[j].Position.Z);
     459                    }
     460
     461                    last_target = fixed::Zero();
     462                    ++j;
    444463                }
    445464            }
    446465        }
  • 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            {