1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351
|
/************************************************************************************
AstroMenace (Hardcore 3D space shooter with spaceship upgrade possibilities)
Copyright © 2006-2013 Michael Kurinnoy, Viewizard
AstroMenace is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
AstroMenace is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with AstroMenace. If not, see <http://www.gnu.org/licenses/>.
Web Site: http://www.viewizard.com/
Project: http://sourceforge.net/projects/openastromenace/
E-mail: viewizard@viewizard.com
*************************************************************************************/
#ifndef OBJECT3D_H
#define OBJECT3D_H
#include "../Core/Core.h"
#include "../Struct.h"
extern GameSetup Setup;
extern int GameNPCWeaponPenalty;
extern int GameNPCArmorPenalty;
extern int GameNPCTargetingSpeedPenalty;
extern int GameLimitedAmmo;
extern int GameDestroyableWeapon;
extern int GameWeaponTargetingMode;
extern int GameSpaceShipControlMode;
extern int GameEngineSystem;
extern int GameTargetingSystem;
extern int GameAdvancedProtectionSystem;
extern int GamePowerSystem;
extern int GameTargetingMechanicSystem;
int Audio_PlaySound3D(int SoundID, float fVol, VECTOR3D Location, bool Loop, int AtType=1);
//-----------------------------------------------------------------------------
// еденичная запись поведения
//-----------------------------------------------------------------------------
struct CTimeSheet
{
// флаг, показывает что установлен и задействован этот режим
bool InUse;
// кол-во времени (оставшееся), которое работает этот режим
float Time;
// включена ли автоматическая настройка поведения по предустановкам
int AI_Mode;
// данные, скорость
float Speed;
float Acceler;
float SpeedLR;
float AccelerLR;
float SpeedUD;
float AccelerUD;
float SpeedByCamFB;
float AccelerByCamFB;
float SpeedByCamLR;
float AccelerByCamLR;
float SpeedByCamUD;
float AccelerByCamUD;
// поворот
VECTOR3D Rotation;
VECTOR3D RotationAcceler;
// стрельба
bool Fire;
// стрельба спец оружием боса
bool BossFire;
// наведение на цель (для турелей)
bool Targeting;
// указатели на цепочку
CTimeSheet *Next;
CTimeSheet *Prev;
};
//-----------------------------------------------------------------------------
// Класс CObject3D
//-----------------------------------------------------------------------------
class CObject3D
{
public:
// базовые конструктор и деструктор объекта
CObject3D();
virtual ~CObject3D();
// Установка AABB, OBB и габаритов по геометрии объекта
virtual void InitByDrawObjectList();
// Прорисовка объектa Object3D
virtual void Draw(bool VertexOnlyPass, bool ShadowMap=false);
bool NeedCullFaces; // нужно резать бэк фейсы
bool NeedAlphaTest; // нужно включить альфа тест
// Обновление данных объектa Object3D
virtual bool Update(float Time);
// Установка положения 1 объекта модели
void SetObjectLocation(VECTOR3D NewLocation, int ObjectNum);
// Установка углов поворота 1 объекта модели
void SetObjectRotation(VECTOR3D NewRotation, int ObjectNum);
// Установка положения модели
virtual void SetLocation(VECTOR3D NewLocation);
// Установка углов поворота модели
virtual void SetRotation(VECTOR3D NewRotation);
// статус объекта свой-чужой (1враг-2друг-3игрок)
int ObjectStatus;
// флаг показать - удалить -1 - не задействован, 0-ждем показа, 1-показали, 2-нужно удалить
int ShowDeleteOnHide;
// уникальный идентифакационный номер, или 0, если он не нужен
int ID;
// тип объекта
// 1 - Earth Fighter
// 2 - Alien Fighter
// 3 - Alien MotherShip
// 4 - Pirate Ship
// 5 - Pirate Vehicle (Wheeled + Tracked)
// 6 - Pirate Building
// 7 - Asteroids
// 8 - ShipPart
// 9 - ShipWeapon
// 10 - Projectile
// 11 - Explosion
// 12 - Civilian Building
// 13 - BasePart
// 14 - Planet
// 15 - Big Asteroid
// добавь в функцию NeedCheckCollision!!!
int ObjectType;
// тип (номер при создании)
int ObjectCreationType;
// время жизни объекта в секундах, оставшееся
float Lifetime;
// направление, куда ориентирован объект
VECTOR3D Orientation;
// углы поворота объекта по трем осям на данный момент
VECTOR3D Rotation;
// обратный угол поворота, старого
VECTOR3D OldRotationInv;
// положение объекта
VECTOR3D Location;
VECTOR3D GeometryCenterLocation; // точка "центра геометрии" внутри модели
// предыдущее положение объекта
VECTOR3D PrevLocation;
// коробки объекта для проверки прорисовки и коллизий
VECTOR3D AABB[8]; // в AABB всегда абсолютные координаты (относ. коорд. модели)
VECTOR3D OBB[8];
VECTOR3D OBBLocation; // положение OBB относительно координат модели
// для каждого объекта в моделе
VECTOR3D **HitBB;
VECTOR3D *HitBBLocation; // положение HitBB относительно координат модели
float *HitBBRadius2; // квадрат радиуса HitBB
VECTOR3D *HitBBSize; // размеры HitBB
// радиус, для первой проверки коллизий
float Radius;
// последнее время, когда проверяли-обновляли объект
float TimeLastUpdate;
// время между апдейтами
float TimeDelta;
// небольшая девиация-болтание модели или каки-то объектов
bool DeviationOn;
int DeviationObjQuantity;
VECTOR3D *Deviation;
float *CurentDeviation;
float *NeedDeviation;
float *CurentDeviationSum;
// ассоциированный объект (если нужно)
int *DeviationObjNum;
// текстура для объектов геометрии
eTexture **Texture;
eTexture **TextureIllum;
eTexture **NormalMap;
// список с геометрией модели, объекты для прорисовки
eObjectBlock *DrawObjectList;
float *GlobalVertexBuffer;
unsigned int *GlobalVBO;
unsigned int *GlobalIndexBuffer;
unsigned int *GlobalIBO;
unsigned int *GlobalVAO;
// кол-во объектов в списке
int DrawObjectQuantity;
// минимальное расстояние (квадрат) с которого надо рисовать пообъектно, если -1 всегда рисовать только пообъектно
float PromptDrawDist2;
int InternalLights; // кол-во внутренних источников света
// данные материала объекта
float Diffuse[4];
float Specular[4];
float Ambient[4];
float Power[1];
// вес объекта
float Weight;
// ширина
float Width;
// длина
float Length;
// высота
float Height;
// прочность
float Strength;
float StrengthStart;
// прочность щита
float ShieldStrength;
float ShieldStrengthStart;
float ShieldRecharge; // перезарядка щита в секунду
// показывать полосу или нет
bool ShowStrength;
// этот параметр устанавливается автоматически!
// если попали, будем всегда показывать (даже если щит перезарядился)
bool NeedShowStrengthNow;
// максимально возможное ослабление воздействий на корпус
float ResistanceHull;
// максимально возможное ослабление воздействий на системы
float ResistanceSystems;
// матрицы поворота, для оптимизации просчетов
float CurrentRotationMat[9];
float OldInvRotationMat[9];
// отладочная информация... номер линии в скрипте
char *DebugInfo;
// данные по текущему сценарию действий объекта
CTimeSheet *StartTimeSheet; // - этот текущий
CTimeSheet *EndTimeSheet;
// действия
void AttachTimeSheet(CTimeSheet *TimeSheet);
void DetachTimeSheet(CTimeSheet *TimeSheet);
};
// работа с распаковкой CTimeSheet
void InterAIMode(CObject3D *Object, CTimeSheet *TimeSheet);
// работа с набором AI
void ReleaseGameAI();
void InitGameAI(const char *FileName);
//-----------------------------------------------------------------------------
// Менеджер CObject3D
//-----------------------------------------------------------------------------
// Удаляем все объекты в списке
void ReleaseAllObject3D();
// Прорисовываем все объекты
void DrawAllObject3D(int DrawType); // 1- меню, 2- игра
// Проверяем все объекты на столкновение
void DetectCollisionAllObject3D();
// Проверяем все объекты, обновляем данные
void UpdateAllObject3D(float Time);
//-----------------------------------------------------------------------------
// Дополнительные функции для CObject3D
//-----------------------------------------------------------------------------
// Проверяем, нужно ли для данного объекта проверка коллизии и наведение на него
bool NeedCheckCollision(CObject3D* Object3D);
// Загрузка в модель нужной геометрии
void LoadObjectData(const char *Name, CObject3D* Object3D, int ObjectNum, float TriangleSizeLimit, bool NeedTangentAndBinormal=false);
// Получение угла поворота оружия на врага
void GetShipOnTargetOrientateion(int ObjectStatus, VECTOR3D Location, VECTOR3D CurrentObjectRotation,
float MinDistance, float RotationMatrix[9], VECTOR3D *NeedAngle, float ObjectWidth, bool NeedCenterOrientation,
bool NeedByWeaponOrientation, VECTOR3D WeponLocation, int WeaponType);
// Получение угла поворота оружия на врага для противника
void GetEnemyShipOnTargetOrientateion(int ObjectStatus, VECTOR3D Location, VECTOR3D CurrentObjectRotation,
float RotationMatrix[9], VECTOR3D *NeedAngle, int WeaponType);
// Получение угла поворота турели на врага
bool GetTurretOnTargetOrientateion(int ObjectStatus, VECTOR3D Location, VECTOR3D CurrentObjectRotation,
float RotationMatrix[9], VECTOR3D *NeedAngle, int WeaponType);
// Получение данных для наведение ракет
CObject3D *GetMissileOnTargetOrientateion(int ObjectStatus, VECTOR3D Location,
VECTOR3D CurrentObjectRotation, float RotationMatrix[9], VECTOR3D *NeedAngle, float MaxDistance);
bool GetMissileOnTargetOrientateion(VECTOR3D Location, VECTOR3D CurrentObjectRotation, float RotationMatrix[9], CObject3D *TargetObject, VECTOR3D *NeedAngle);
bool GetMissileTargetStatus(CObject3D *TargetObject, VECTOR3D Location, float RotationMatrix[9]);
// Получение положения ближайшего врага, для мин
CObject3D *GetCloserTargetPosition(int ObjectStatus, VECTOR3D Location);
#endif // OBJECT3D_H
|