示例#1
0
static ParsedData parse(Allocator* alloc, unsigned char* data, unsigned data_size)
{
    ParserState ps = {};
    ps.data = data;
    ps.head = data;
    ps.end = (unsigned char*)mem_ptr_add(data, data_size);
    ParsedData pd = {};
    pd.vertices = dynamic_array_create<Vector3>(alloc);
    pd.normals = dynamic_array_create<Vector3>(alloc);
    pd.uvs = dynamic_array_create<Vector2>(alloc);
    pd.faces = dynamic_array_create<ParsedFace>(alloc);
    ps.head = ps.data;

    while (ps.head < ps.end)
    {
        unsigned char c = *ps.head;
        bool first_on_line = ps.head == ps.data || (ps.head > ps.data && (*(ps.head - 1)) == '\n');

        if (!first_on_line)
            skip_line(&ps);
        else if (c == 'v' && ps.head + 1 < ps.end && (*(ps.head+1)) == 't')
            parse_uv(&ps, &pd);
        else if (c == 'v' && ps.head + 1 < ps.end && (*(ps.head+1)) == 'n')
            parse_normal(&ps, &pd);
        else if (c == 'v')
            parse_vertex(&ps, &pd);
        else if (c == 'f')
            parse_face(&ps, &pd);
        else
            skip_line(&ps);
    }

    return pd;
}
xml_cc *
parse_cc (xmlNode *cur_node)
{
    xml_cc *ret;
    
    if ((ret = g_new0(xml_cc, 1)) == NULL)
        return NULL;
    
    for (cur_node = cur_node->children; cur_node; cur_node = cur_node->next)
    {
        if (cur_node->type != XML_ELEMENT_NODE)
            continue;

        if (NODE_IS_TYPE (cur_node, "tmp"))
            ret->tmp = DATA(cur_node);
        else if (NODE_IS_TYPE (cur_node, "icon"))
            ret->icon = DATA(cur_node);
        else if (NODE_IS_TYPE (cur_node, "t"))
            ret->t = DATA(cur_node);
        else if (NODE_IS_TYPE (cur_node, "flik"))
            ret->flik = DATA(cur_node);
        else if (NODE_IS_TYPE (cur_node, "bar"))
            ret->bar = parse_bar(cur_node);
        else if (NODE_IS_TYPE (cur_node, "wind"))
            ret->wind = parse_wind(cur_node);
        else if (NODE_IS_TYPE (cur_node, "hmid"))
            ret->hmid = DATA(cur_node);
        else if (NODE_IS_TYPE (cur_node, "vis"))
            ret->vis = DATA(cur_node);
        else if (NODE_IS_TYPE (cur_node, "uv"))
            ret->uv = parse_uv(cur_node);
        else if (NODE_IS_TYPE (cur_node, "dewp"))
            ret->dewp = DATA(cur_node);
        else if (NODE_IS_TYPE (cur_node, "lsup"))
            ret->lsup = DATA(cur_node);
        else if (NODE_IS_TYPE (cur_node, "obst"))
            ret->obst = DATA(cur_node);
    }

    return ret;
}