std::unique_ptr<CExchangePost> CExchangePost::Create( const ObjectCreateParams& params, Gfx::COldModelManager* modelManager, Gfx::CEngine* engine) { auto obj = MakeUnique<CExchangePost>(params.id); obj->SetTeam(params.team); int rank = engine->CreateObject(); engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); // it is a stationary object obj->SetObjectRank(0, rank); modelManager->AddModelReference("info1.mod", false, rank); obj->SetPosition(params.pos); obj->SetRotationY(params.angle); obj->SetFloorHeight(0.0f); rank = engine->CreateObject(); engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT); obj->SetObjectRank(1, rank); obj->SetObjectParent(1, 0); modelManager->AddModelReference("info2.mod", false, rank); obj->SetPartPosition(1, Math::Vector(0.0f, 5.0f, 0.0f)); for (int i = 0; i < 3; ++i) { rank = engine->CreateObject(); engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT); obj->SetObjectRank(2+i*2, rank); obj->SetObjectParent(2+i*2, 1); modelManager->AddModelReference("info3.mod", false, rank); obj->SetPartPosition(2+i*2, Math::Vector(0.0f, 4.5f, 0.0f)); rank = engine->CreateObject(); engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT); obj->SetObjectRank(3+i*2, rank); obj->SetObjectParent(3+i*2, 2+i*2); modelManager->AddModelReference("radar4.mod", false, rank); obj->SetPartPosition(3+i*2, Math::Vector(0.0f, 0.0f, -4.0f)); obj->SetPartRotationY(2+i*2, 2.0f*Math::PI/3.0f*i); } obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 3.0f, 0.0f), 6.0f, SOUND_BOUMm, 0.45f)); obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 11.0f, 0.0f), 6.0f, SOUND_BOUMm, 0.45f)); obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 5.0f, 0.0f), 6.0f)); obj->CreateShadowCircle(8.0f, 1.0f); Math::Vector pos = obj->GetPosition(); pos.y += params.height; obj->SetPosition(pos); // to display the shadows immediately auto objAuto = MakeUnique<CAutoInfo>(obj.get()); objAuto->Init(); obj->SetAuto(std::move(objAuto)); engine->LoadAllTextures(); return obj; }
void CMotionWorm::Create(Math::Vector pos, float angle, ObjectType type, float power, Gfx::COldModelManager* modelManager) { int rank, i; float px; m_object->SetType(type); // Creates the main base. rank = m_engine->CreateObject(); m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICLE); // this is a moving object m_object->SetObjectRank(0, rank); // This is an "empty" object, without triangles m_object->SetPosition(pos); m_object->SetRotationY(angle); // A vehicle must have a obligatory collision with a sphere of center (0, y, 0) (see GetCrashSphere). m_object->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 0.0f, 0.0f), 4.0f, SOUND_BOUM, 0.20f)); m_object->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 0.0f, 0.0f), 5.0f)); px = 1.0f+WORM_PART/2; // Creates the head. rank = m_engine->CreateObject(); m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT); m_object->SetObjectRank(1, rank); m_object->SetObjectParent(1, 0); modelManager->AddModelReference("worm1.mod", false, rank); m_object->SetPartPosition(1, Math::Vector(px, 0.0f, 0.0f)); px -= 1.0f; // Creates the body. for ( i=0 ; i<WORM_PART ; i++ ) { rank = m_engine->CreateObject(); m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT); m_object->SetObjectRank(2+i, rank); m_object->SetObjectParent(2+i, 0); modelManager->AddModelReference("worm2.mod", false, rank); m_object->SetPartPosition(2+i, Math::Vector(px, 0.0f, 0.0f)); px -= 1.0f; } // Creates the tail. rank = m_engine->CreateObject(); m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT); m_object->SetObjectRank(2+WORM_PART, rank); m_object->SetObjectParent(2+WORM_PART, 0); modelManager->AddModelReference("worm3.mod", false, rank); m_object->SetPartPosition(2+WORM_PART, Math::Vector(px, 0.0f, 0.0f)); m_object->CreateShadowCircle(0.0f, 1.0f, Gfx::ENG_SHADOW_WORM); CreatePhysics(); m_object->SetFloorHeight(0.0f); pos = m_object->GetPosition(); m_object->SetPosition(pos); // to display the shadows immediately m_engine->LoadAllTextures(); }