| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- //============================================================================================
- // Spirenkov Maxim, 2005
- //============================================================================================
- // Mission objects
- //============================================================================================
- // CollisionBox
- //============================================================================================
- #include "CollisionBox.h"
- MissionCollisionBox::MissionCollisionBox(): colliders(_FL_)
- {
- needAiRegistry = false;
- aiColider = null;
- }
- MissionCollisionBox::~MissionCollisionBox()
- {
- DelAllColliders();
- RELEASE(aiColider);
- }
- //Инициализировать объект
- bool MissionCollisionBox::Create(MOPReader & reader)
- {
- DelAllColliders();
- needAiRegistry = false;
- InitParams(reader);
-
- PhysicsCollisionGroup groups[] = { phys_world, phys_character, phys_player, phys_enemy, phys_ally, phys_boss};
- for (int i=0;i<(int)(sizeof(groups)/sizeof(PhysicsCollisionGroup));i++)
- {
- if (reader.Bool())
- {
- AddCollider(groups[i]);
- if (phys_character == groups[i])
- {
- needAiRegistry = true;
- }
- }
- }
- Activate(reader.Bool());
- if(reader.Bool())
- {
- SetUpdate(&MissionCollisionBox::Draw, ML_DYNAMIC1);
- }
- return true;
- }
- //Пересоздать объект
- void MissionCollisionBox::Restart()
- {
- ReCreate();
- }
- //Обработчик команд для объекта
- void MissionCollisionBox::Command(const char * id, dword numParams, const char ** params)
- {
- if(!id || !id[0]) return;
- if(string::IsEqual(id, "teleport"))
- {
- if(numParams < 1) return;
- MOSafePointer obj;
- if(FindObject(ConstString(params[0]), obj))
- {
- Matrix mObj;
- obj.Ptr()->GetMatrix(mObj);
- if(aiColider)
- {
- aiColider->SetMatrix(mObj);
- }
- for (int i=0;i<(int)colliders.Size();i++)
- {
- colliders[i]->SetTransform(mObj);
- }
-
- LogicDebug("Teleport box \"%s\" to mission object \"%s\"", GetObjectID().c_str(), obj.Ptr()->GetObjectID().c_str());
- }
- else
- {
- LogicDebugError("Can't teleport box \"%s\" to mission object \"%s\", object not found...", GetObjectID().c_str(), params[0]);
- }
- }
- }
- //Инициализировать объект
- bool MissionCollisionBox::EditMode_Create(MOPReader & reader)
- {
- InitParams(reader);
- MissionObject::Activate(reader.Bool());
- SetUpdate(&MissionCollisionBox::Draw, ML_DYNAMIC1);
- return true;
- }
- //Обновить параметры
- bool MissionCollisionBox::EditMode_Update(MOPReader & reader)
- {
- InitParams(reader);
- return true;
- }
- //Получить размеры описывающего ящика
- void MissionCollisionBox::EditMode_GetSelectBox(Vector & min, Vector & max)
- {
- min = -aiColider->GetBoxSize()*0.5f;
- max = aiColider->GetBoxSize()*0.5f;
- }
- void MissionCollisionBox::GetBox(Vector & min, Vector & max)
- {
- min = -aiColider->GetBoxSize()*0.5f;
- max = aiColider->GetBoxSize()*0.5f;
- }
- //Получить матрицу объекта
- Matrix & MissionCollisionBox::GetMatrix(Matrix & mtx)
- {
- return (mtx = aiColider->GetMatrix());
- }
- //Нарисовать модельку
- void _cdecl MissionCollisionBox::Draw(float dltTime, long level)
- {
- if(!EditMode_IsVisible()) return;
- if(!Mission().EditMode_IsAdditionalDraw()) return;
- Render().DrawSolidBox(-aiColider->GetBoxSize()*0.5f, aiColider->GetBoxSize()*0.5f, aiColider->GetMatrix(), IsActive() ? 0xff00ff00 : 0xffff0000);
- }
- //Активировать/деактивировать объект
- void MissionCollisionBox::Activate(bool isActive)
- {
- MissionObject::Activate(isActive);
- for (int i=0;i<(int)colliders.Size();i++)
- {
- colliders[i]->Activate(isActive);
- }
-
- if(needAiRegistry)
- {
- aiColider->Activate(isActive);
- }
- }
- void MissionCollisionBox::InitParams(MOPReader & reader)
- {
- if(!aiColider)
- {
- aiColider = QTCreateObject(MG_AI_COLLISION, _FL_);
- }
- aiColider->Activate(false);
- aiColider->SetBoxCenter(0.0f);
- Vector size;
- size.x = reader.Float();
- size.y = reader.Float();
- size.z = reader.Float();
- aiColider->SetBoxSize(size);
- Vector pos = reader.Position();
- Vector ang = reader.Angles();
- aiColider->SetMatrix(Matrix(ang, pos));
- }
- void MissionCollisionBox::AddCollider(PhysicsCollisionGroup group)
- {
- IPhysBox* collider = Physics().CreateBox(_FL_, aiColider->GetBoxSize(), aiColider->GetMatrix(), false);
- collider->SetGroup(group);
- colliders.Add(collider);
- }
- void MissionCollisionBox::DelAllColliders()
- {
- for (int i=0;i<(int)colliders.Size();i++)
- {
- colliders[i]->Release();
- }
- colliders.DelAll();
- }
- //============================================================================================
- //Параметры инициализации
- //============================================================================================
- MOP_BEGINLISTCG(MissionCollisionBox, "Collision box", '1.00', 0, "Designer's defined collision box", "Physics")
- MOP_FLOATEX("Width", 3.0f, 0.01f, 100.0f)
- MOP_FLOATEX("Height", 3.0f, 0.01f, 100.0f)
- MOP_FLOATEX("Length", 0.5f, 0.01f, 100.0f)
- MOP_POSITION("Position", Vector(0.0f))
- MOP_ANGLES("Angles", Vector(0.0f))
- MOP_BOOLC("World", false, "Collision with physic objects")
- MOP_BOOLC("Characters", true, "Collision with any character (include player)")
- MOP_BOOLC("Player", false, "Collision with player")
- MOP_BOOLC("Enemy", false, "Collision with enemy")
- MOP_BOOLC("Ally", false, "Collision with ally")
- MOP_BOOLC("Boss", false, "Collision with boss")
- MOP_BOOL("Active", true)
- MOP_BOOL("Debug draw", false)
- MOP_ENDLIST(MissionCollisionBox)
|