Личный прогресс в программировании.
Считаю формат OBJ простым и понятным инструментом для описания геометрии трехмерных объектов.
http://paulbourke.net/dataformats/obj/
После загрузки файла в виртуальную пространство оперативной памяти средствами ОС (через MapFileMapping), первым проходом подсчитываю количество вершин и полигонов для выделения места под массив вершин.
Геометрия считывается из буфера посимвольно в распараллеленом цикле.
Если первый символ новой строки "v", а второй — " "(пробел), то строка содержит три координаты вершины, "f" и " " — полигон и его координаты.
Второй проход переводит (парсит) текстовые значения координат вершин в вещественные и записывает в подготовленный массив.
Два вопроса возникают при подобном переводе.
1. При посимвольном считывании координат вершин необходимо учитывать знак вещественного числа, а точнее, местонахождение (порядковый номер) знака. Может быть значение -0.55555, а может, 0.55555.
2. Нет единого варианта точности, то есть разное число символов после запятой.
Пример 1:
С первой коодинатой вершины все ясно — после "v" и " ", третий символ либо "-", либо начало значения координаты X.
v 0.786019 -2.928538 0.601628
12!
Труднее определить порядковый номер символа начала второй вершины.
Пример 2:
v 0.786019 -2.928538 0.601628
1234567890!
Одиннадцатый символ " "(пробел) отделяет координату X от Y. Это крайне неудачное решение, но, увы. После парсинга первой координаты X (с 3-го символа до пробела), цикл должен парсить вторую координату Y.
Для указания порядкого номера начала второй координаты (от пробела) использую промежуточный расчет «Пролета» ("Span").
Пролет — это расстояние от третьего символа (начала первой координаты) до первого встреченного пробельного символа (функция strcspn).
Начало парсинга второй координаты = начало парсинга первой координаты + Пролет.
Третья координата вершины Z начинается с порядкового номера «Начало парсинга1 + Пролет2». Пролет2 = от любого символа во второй координате до первого встреченного пробела.
Тестирование:
1. Три координаты каждой вершины могут иметь знак + или -.
№ 1 2 3
1 + + +
2 - - -
3 + - -
4 - + +
5 + - +
6 - + -
7 + + -
8 - - +
2. Разное количество символов в целой и дробной части.
0.1111 или 2222.3333
3. Комбинированные варианты 1 и 2 в одной строке.
s — short (координата малого порядка), l — long (большого).
v s s s или v l l l или v -s l -l или v l -s l и так далее.
Для большинства вариантов промежуточный расчет пролетов работает приемлимо. Такой же расчет использую при парсинге Индекса полигонов.
Доклад закончил.