История изменений
Исправление LINUX-ORG-RU, (текущая версия) :
У тебя большую часть кода занимают захардкоженные данные геометрии и текстур. Их можно описать как вершина, текстурная координата,цвет
записать это просто в файл так как удобно тебе. Затем прочесть и сделать glGenBuffers
задать ему прочтённый массив этих всех данных, а потом сделать glBindBuffer()
выбрав что ты рисуешь и отрисовать glDrawElements()
всё. Просто разделяй данные и код. Если ты не хочешь всех этих буферов и последующих шейдеров. То опять же раздели данные и код, вершины, uv координаты и цвета укажи отдельно просто в хоть текстовом файле строка на треугольник например. Затем читая свой сохранённый с данными файл передавай данные в цикле в glTexCoord2f(); glVertex3f();
Типа, хотя бы так (не прям так, а по такому принципу) :
enum renderable_offsets
{
UV_1 = 0,
UV_2 = 1,
VE_1 = 2,
VE_2 = 3,
VE_3 = 4,
RENDERABLE_OFFSET
};
void func(data)
{
glBindTexture(GL_TEXTURE_2D, data->texture);
glBegin(data->type);
for(int i; i < data->num_elems;i+=RENDERABLE_OFFSET)
{
glTexCoord2f(data->renderable[i+UV_1],data->renderable[i+UV_2] );
glVertex3f(data->renderable[i+VE_1], data->renderable[i+VE_2],data->renderable[i+VE_3]);
}
glEnd();
}
Загружай данные как данные просто в массив, заведи функцию которая эти данные обрабатывает. Когда у тебя всё вместе и код и данные то тебе самому тяжело. При любом изменении нужно компелять. Навигация очень затруднена.
Те данные которые всё же не хочется хранить во вне например из этого куска
if (i == 0)
{
glBegin(GL_POLYGON);//HELP
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-.45f, -.9f, 1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-.45f, -1.f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-.65f, -1.f, 1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-.65f, -.9f, 1.0f);
glEnd();//HELP
}
Опять же вынеси в отдельный массив
// 4 4 4 4 4
//[uv][uv][vertex][vertex][vertex] = offset 20
float help_data[] =
{
1.0,1.0,-0.45,-0.9,1.0,//1
1.0,0.0,-0.45,-1.0,1.0,//2
0.0,0.0,-0.65,-1.0,1.0,//3
0.0,1.0,-065,-0.9,1.0, //4
}
//4 размер
//20 смещение
//функция по аналогии что выше
make_geometry(help_data,4,20);
Так ты получишь
- Универсальную функцию построения геометрии
- Универсальный (для тебя) формат записи данных модели
В разы уменьшишь объёмы кода без ущерба чему-то. Хотя уменьшение это будет побочный результат, суть тут в разделении кода и данных и унификации кода, он будет универсальным. Захотелось добавить цвет, ты не будешь в сотни строк его вписывать, а просто в функцию добавишь 1 строку, и в формате увеличишь смещение, а в данные уже просто впишешь цвет.
И вообще нафиг тебе это ООП которое ты всё равно мало используешь, пиши если уж так хочется на плюсах, но в процедурном стиле.
Для однотипных данных заведи структуры, а не поля классов, для обработки этих структур заведи функции простые, а не методы классов. Это и наглядно будет, у тебя все структуры данных будут в объявлениях видны и логика работы будет наглядной будет набор функций по обработке структур. Ну как вариант.
Исходная версия LINUX-ORG-RU, :
У тебя большую часть кода занимают захардкоженные данные геометрии и текстур. Их можно описать как вершина, текстурная координата,цвет
записать это просто в файл так как удобно тебе. Затем прочесть и сделать glGenBuffers
задать ему прочтённый массив этих всех данных, а потом сделать glBindBuffer()
выбрав что ты рисуешь и отрисовать glDrawElements()
всё. Просто разделяй данные и код. Если ты не хочешь всех этих буферов и последующих шейдеров. То опять же раздели данные и код, вершины, uv координаты и цвета укажи отдельно просто в хоть текстовом файле строка на треугольник например. Затем читая свой сохранённый с данными файл передавай данные в цикле в glTexCoord2f(); glVertex3f();
Типа, хотя бы так (не прям так, а по такому принципу) :
enum renderable_offsets
{
UV_1 = 0,
UV_2 = 1,
VE_1 = 2,
VE_2 = 3,
VE_3 = 4,
RENDERABLE_OFFSET
};
void func(data)
{
glBindTexture(GL_TEXTURE_2D, data->texture);
glBegin(data->type);
for(int i; i < data->num_elems;i+=RENDERABLE_OFFSET)
{
glTexCoord2f(data->renderable[i+UV_1],data->renderable[i+UV_2] );
glVertex3f(data->renderable[i+VE_1], data->renderable[i+VE_2],data->renderable[i+VE_3]);
}
glEnd();
}
Загружай данные как данные просто в массив, заведи функцию которая эти данные обрабатывает. Когда у тебя всё вместе и код и данные то тебе самому тяжело. При любом изменении нужно компелять. Навигация очень затруднена.
Те данные которые всё же не хочется хранить во вне например из этого куска
if (i == 0)
{
glBegin(GL_POLYGON);//HELP
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-.45f, -.9f, 1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-.45f, -1.f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-.65f, -1.f, 1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-.65f, -.9f, 1.0f);
glEnd();//HELP
}
Опять же вынеси в отдельный массив
// 4 4 4 4 4
//[uv][uv][vertex][vertex][vertex] = offset 20
float help_data[] =
{
1.0,1.0,-0.45,-0.9,1.0,//1
1.0,0.0,-0.45,-1.0,1.0,//2
0.0,0.0,-0.65,-1.0,1.0,//3
0.0,1.0,-065,-0.9,1.0, //4
}
//4 размер
//20 смещение
//функция по аналогии что выше
make_geometry(help_data,4,20);
Так ты получишь
- Универсальную функцию построения геометрии
- Универсальный (для тебя) формат записи данных модели
В разы уменьшишь объёмы кода без ущерба чему-то. Хотя уменьшение это будет побочный результат, суть тут в разделении кода и данных и унификации кода, он будет универсальным. Захотелось добавить цвет, ты не будешь в сотни строк его вписывать, а просто в функцию добавишь 1 строку, и в формате увеличишь смещение, а в данные уже просто впишешь цвет.