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)); } } }
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); }