1
/************************************************************************************
3
AstroMenace (Hardcore 3D space shooter with spaceship upgrade possibilities)
4
Copyright © 2006-2012 Michael Kurinnoy, Viewizard
7
AstroMenace is free software: you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation, either version 3 of the License, or
10
(at your option) any later version.
12
AstroMenace is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
17
You should have received a copy of the GNU General Public License
18
along with AstroMenace. If not, see <http://www.gnu.org/licenses/>.
21
Web Site: http://www.viewizard.com/
22
Project: http://sourceforge.net/projects/openastromenace/
23
E-mail: viewizard@viewizard.com
25
*************************************************************************************/
32
#include "../Math/Math.h"
33
#include "../VirtualFileSystem/VFS.h"
40
//-----------------------------------------------------------------------------
41
// структура блока объектов
42
//-----------------------------------------------------------------------------
46
virtual ~eObjectBlock(void);
48
int VertexFormat; // формат вертексов данных
49
int VertexStride; // отступ в (байтах*4, т.е. во float или DWORD) до начала данных следующей точки
50
int VertexCount; // кол-во прорисовываемых вертексов (кол-во обрабатываемых индексов)
51
BYTE DrawType; // тип прорисовки, 0- нормальный, 1-blend т.е. с прозрачностью
53
// начальный номер индекса в буфере (в случае использования глобальных буферов)
54
// если индексных данных нет - номер вертекса
55
unsigned int RangeStart;
58
// шейдер (зарезервированные переменные для работы внешнего блока кода)
63
// положение локальной системы координат
65
// поворот модели в локальной системе координат
68
// анимация геометрией (вращение)
69
bool NeedGeometryAnimation;
70
VECTOR3D GeometryAnimation;
71
// анимация текстуры (тайловая анимация)
72
bool NeedTextureAnimation;
73
VECTOR3D TextureAnimation;
75
bool NeedDestroyDataInObjectBlock; // если данные были не общие, а созданные для этого ObjectBlock, нужно их удалить в деструкторе
77
float *VertexBuffer; // указатель на структуру данных
78
unsigned int *VBO; // номер VBO
80
unsigned int *IndexBuffer; // указатель на структуру данных
81
unsigned int *IBO; // номер IBO
83
unsigned int *VAO; // номер VAO
84
// указатель на буфер, с мешем приведенным к опеределнному размеру треугольников (для взрывов)
85
// для него никогда не делаем VBO, буфер исключительно для работы внутри программы
86
float *VertexBufferLimitedBySizeTriangles;
87
int VertexBufferLimitedBySizeTrianglesCount; // кол-во вертексов в нем
93
//-----------------------------------------------------------------------------
95
//-----------------------------------------------------------------------------
101
virtual ~eModel3D(void);
103
// имя объекта (путь к файлу)
106
// лист объектов, из которых состоит модель
107
eObjectBlock *DrawObjectList;
109
unsigned int GlobalVertexCount; // фактическое кол-во вертексов в буфере
110
unsigned int GlobalIndexCount; // фактическое кол-во индексов в буфере
113
// читаем-пишем форматы 3д моделей
114
bool ReadVW3D(const char *FileName);
115
bool WriteVW3D(const char *FileName);
117
// пересоздаем вертексный буфер, добавляем тангент и бинормаль в 2 и 3 текстурные координаты
118
void CreateTangentAndBinormal();
119
// создание вертекс и индекс буферов для каждого блока модели
120
void CreateObjectsBuffers();
121
// создание всех поддерживаемых буферов (VAO, VBO, IBO)
122
void CreateHardwareBuffers();
123
// создаем буфер для разрушаемых объектов с ограничением по размеру треугольников
124
void CreateVertexBufferLimitedBySizeTriangles(float TriangleSizeLimit);
128
float *GlobalVertexBuffer;
129
unsigned int *GlobalVBO;
130
unsigned int *GlobalIndexBuffer;
131
unsigned int *GlobalIBO;
132
unsigned int *GlobalVAO;
134
// указатели на цепь моделей
144
//-----------------------------------------------------------------------------
145
// Менеджер eObject3D
146
//-----------------------------------------------------------------------------
148
// Предварительная загрузка геометрии модели, если нужно создания доп. буфера с треугольниками не более TriangleSizeLimit
149
// если не нужно, передаем отрицательное значение
150
eModel3D *vw_LoadModel3D(const char *FileName, float TriangleSizeLimit, bool NeedTangentAndBinormal);
151
// Присоеденяем Model3D к списку
152
void vw_AttachModel3D(eModel3D * NewModel3D);
153
// Удаляем Model3D из списка
154
void vw_DetachModel3D(eModel3D * OldModel3D);
155
// Удаляем все Model3D в списке
156
void vw_ReleaseAllModel3D();