Пример #1
0
void TriangleEncoder::encode(
    const vector<TriangleVertexInfo>&   triangle_vertex_infos,
    const vector<GVector3>&             triangle_vertices,
    const vector<size_t>&               triangle_indices,
    const size_t                        item_begin,
    const size_t                        item_count,
    MemoryWriter&                       writer)
{
    for (size_t i = 0; i < item_count; ++i)
    {
        const size_t triangle_index = triangle_indices[item_begin + i];
        const TriangleVertexInfo& vertex_info = triangle_vertex_infos[triangle_index];

        writer.write(static_cast<uint32>(vertex_info.m_motion_segment_count));

        if (vertex_info.m_motion_segment_count == 0)
        {
            writer.write(
                GTriangleType(
                    triangle_vertices[vertex_info.m_vertex_index + 0],
                    triangle_vertices[vertex_info.m_vertex_index + 1],
                    triangle_vertices[vertex_info.m_vertex_index + 2]));
        }
        else
        {
            writer.write(
                &triangle_vertices[vertex_info.m_vertex_index],
                (vertex_info.m_motion_segment_count + 1) * 3 * sizeof(GVector3));
        }
    }
}
Пример #2
0
int CFParser :: buildDerivationTree(_ScriptReader& reader, size_t startRuleId, MemoryWriter& writer)
{
   DerivationQueue predictions;
   predictions.push(DerivationItem(startRuleId, 0, -1));

   ScriptBookmark bm;
   while (predictions.Count() > 0) {
      predictions.push(DerivationItem(0));

      bm = reader.read();
      int terminalOffset = writer.Position();
      writer.write(&bm, sizeof(ScriptBookmark));

      DerivationItem current = predictions.pop();
      
      while (current.ruleId != 0) {
         if (current.ruleId == -1) {
            return current.trace;
         }

         predict(predictions, current, reader, bm, terminalOffset, writer);

         current = predictions.pop();
      }      
   }

   throw EParseError(bm.column, bm.row);
}