GameObject* GameObjectManager::CreatePlane(const Ogre::Vector3& position, void* data, const Ogre::String& id){ GameObject* go = new GameObject(GAME_OBJECT_PLANE); NodeComponent* node_comp = new NodeComponent; go->AddComponent(node_comp); MeshRenderComponent* mrc = new MeshRenderComponent; go->AddComponent(mrc); RigidbodyComponent* rc = new RigidbodyComponent; go->AddComponent(rc); node_comp->Init(position, m_scene_manager); PlaneDef& plane_def = *static_cast<PlaneDef*>(data); mrc->Init(plane_def.plane_name, m_scene_manager); mrc->GetEntity()->setMaterialName(plane_def.material_name); mrc->GetEntity()->setCastShadows(false); RigidBodyDef def; def.body_type = STATIC_BODY; def.collider_type = COLLIDER_TRIANGLE_MESH_SHAPE; def.friction = plane_def.friction; def.restitution = plane_def.restitution; def.mass = 0.0f; def.collision_filter.filter = COL_WORLD_STATIC; def.collision_filter.mask = COL_PLAYER | COL_BUBBLE | COL_TOTT; rc->Init(position, mrc->GetEntity(), m_physics_engine, def); rc->GetCollisionDef().flag = COLLISION_FLAG_STATIC; return go; }
GameObject* GameObjectManager::CreatePlane(const Ogre::Vector3& position, void* data){ GameObject* go = new GameObject(GAME_OBJECT_PLANE); MeshRenderComponent* mrc = new MeshRenderComponent; go->AddComponent(mrc); RigidbodyComponent* rc = new RigidbodyComponent; go->AddComponent(rc); PlaneDef& plane_def = *static_cast<PlaneDef*>(data); mrc->Init(plane_def.plane_name, m_scene_manager); mrc->GetEntity()->setMaterialName(plane_def.material_name); rc->Init(position, mrc->GetEntity(), m_physics_engine, 0.0f, COLLIDER_TRIANGLE_MESH_SHAPE, STATIC_BODY); rc->GetRigidbody()->setRestitution(0.5); rc->GetRigidbody()->setFriction(0.5f); return go; }
GameObject* GameObjectManager::CreatePinkBubble(const Ogre::Vector3& position, void* data){ GameObject* go = new GameObject(GAME_OBJECT_BLUE_BUBBLE); MeshRenderComponent* mrc = new MeshRenderComponent; go->AddComponent(mrc); RigidbodyComponent* rc = new RigidbodyComponent; go->AddComponent(rc); mrc->Init("sphere.mesh", m_scene_manager); Ogre::Vector3 scale(0.002,0.002,0.002); mrc->GetSceneNode()->setScale(scale); //mrc->GetEntity()->setMaterialName(); rc->Init(position, mrc->GetEntity(), m_physics_engine, 1.0f, COLLIDER_SPHERE, DYNAMIC_BODY); rc->GetRigidbody()->setGravity(btVector3(0.0f, 0.0f, 0.0f)); rc->GetRigidbody()->setLinearFactor(btVector3(1,0,1)); return go; }
GameObject* GameObjectManager::CreateGate(const Ogre::Vector3& position, void* data, const Ogre::String& id){ GateDef& def = *static_cast<GateDef*>(data); GameObject* go = new GameObject(GAME_OBJECT_GATE); NodeComponent* nc = new NodeComponent; go->AddComponent(nc); MeshRenderComponent* left_gate_mesh = new MeshRenderComponent; go->AddComponent(left_gate_mesh); MeshRenderComponent* right_gate_mesh = new MeshRenderComponent; go->AddComponent(right_gate_mesh); ChildSceneNodeComponent* left_gate_node = new ChildSceneNodeComponent; go->AddComponent(left_gate_node); ChildSceneNodeComponent* right_gate_node = new ChildSceneNodeComponent; go->AddComponent(right_gate_node); RigidbodyComponent* rc = new RigidbodyComponent; go->AddComponent(rc); GateControllerComponent* gate_controller = new GateControllerComponent; go->AddComponent(gate_controller); go->AddUpdateable(gate_controller); nc->Init(position, m_scene_manager); left_gate_mesh->Init("GateLeft.mesh", m_scene_manager, Ogre::StringUtil::BLANK); right_gate_mesh->Init("GateRight.mesh", m_scene_manager, Ogre::StringUtil::BLANK); left_gate_node->Init(Ogre::Vector3(2.7f,0,0), "left_gate_node", nc->GetSceneNode()); left_gate_node->SetId("left_gate_node"); right_gate_node->Init(Ogre::Vector3(-2.7f,0,0), "right_gate_node", nc->GetSceneNode()); right_gate_node->SetId("right_gate_node"); left_gate_node->GetNode()->attachObject(left_gate_mesh->GetEntity()); right_gate_node->GetNode()->attachObject(right_gate_mesh->GetEntity()); RigidBodyDef body_def; body_def.body_type = STATIC_BODY; body_def.collider_type = COLLIDER_BOX; body_def.mass = 1.0f; body_def.collision_filter.filter = COL_WORLD_STATIC; body_def.collision_filter.mask = COL_PLAYER | COL_TOTT | COL_BUBBLE | COL_QUESTITEM; body_def.collider_def.x = 10.0f; body_def.collider_def.y = 12.0f; body_def.collider_def.z = 0.5f; rc->Init(position, m_physics_engine, body_def); gate_controller->Init(m_message_system, def.leaves); return go; }
GameObject* GameObjectManager::CreateQuestItem(const Ogre::Vector3& position, void* data, const Ogre::String& id){ GameObject* tott = *static_cast<GameObject**>(data); //Ogre::SceneNode* node = static_cast<NodeComponent*>(tott->GetComponent(COMPONENT_NODE))->GetSceneNode(); //TottDef tott_def = static_cast<TottController*>(tott->GetComponent(COMPONENT_CHARACTER_CONTROLLER))->m_def; QuestItemDef& quest_item_def = *static_cast<QuestItemDef*>(data); GameObject* go = new GameObject(GAME_OBJECT_QUEST_ITEM); DestroyCallbackComponent* dcc = new DestroyCallbackComponent; go->AddComponent(dcc); NodeComponent* node_comp = new NodeComponent; go->AddComponent(node_comp); MeshRenderComponent* mrc = new MeshRenderComponent; go->AddComponent(mrc); RigidbodyComponent* rc = new RigidbodyComponent; go->AddComponent(rc); RotationComponent* rot_comp = new RotationComponent; go->AddComponent(rot_comp); go->AddUpdateable(rot_comp); StringComponent* string_comp = new StringComponent; go->AddComponent(string_comp); string_comp->Init(quest_item_def.id); std::function<void()> func = [&] { IEvent evt; evt.m_type = EVT_QUEST_ITEM_REMOVE; m_message_system->Notify(&evt); }; dcc->Init(func); std::ostringstream stream; stream << "Quest_Item_" << m_quest_item_iterations; m_quest_item_iterations++; Ogre::String quest_item_id = stream.str(); node_comp->Init(position, m_scene_manager); node_comp->SetId(quest_item_id); mrc->Init(quest_item_def.mesh_name, m_scene_manager); RigidBodyDef body_def; body_def.body_type = DYNAMIC_BODY; body_def.collider_type = COLLIDER_SPHERE; body_def.friction = 1.0; body_def.mass = 1.0f; body_def.collision_filter.filter = COL_QUESTITEM; body_def.collision_filter.mask = COL_PLAYER | COL_TOTT | COL_WORLD_STATIC | COL_BUBBLE; body_def.sync_orientation = false; rc->Init(position, mrc->GetEntity(), m_physics_engine, body_def); rc->GetRigidbody()->setGravity(btVector3(0.0f, -0.3f, 0.0f)); rc->GetRigidbody()->setContactProcessingThreshold(btScalar(0)); rc->GetRigidbody()->setActivationState(DISABLE_DEACTIVATION); rc->GetRigidbody()->setDamping(0.5, 0.5); rc->SetId(quest_item_id); rot_comp->Init(node_comp->GetSceneNode(), VariableManager::GetSingletonPtr()->GetAsFloat("QuestItemRotationSpeed")); return go; };
GameObject* GameObjectManager::CreateBlueBubble(const Ogre::Vector3& position, void* data, const Ogre::String& id){ BubbleDef& def = *static_cast<BubbleDef*>(data); GameObject* go = new GameObject(GAME_OBJECT_BLUE_BUBBLE); BubbleController* bc = new BubbleController; go->AddComponent(bc); go->AddUpdateable(bc); NodeComponent* node_comp = new NodeComponent; go->AddComponent(node_comp); MeshRenderComponent* mrc = new MeshRenderComponent; go->AddComponent(mrc); Point2PointConstraintComponent* cons = new Point2PointConstraintComponent; go->AddComponent(cons); RigidbodyComponent* rc = new RigidbodyComponent; go->AddComponent(rc); node_comp->Init(position, m_scene_manager); mrc->Init("BlueBubble.mesh", m_scene_manager); mrc->GetEntity()->setRenderQueueGroup(60); Ogre::Vector3 scale(def.start_scale); node_comp->GetSceneNode()->setScale(scale); //bc->SetCustomVariables(VariableManager::GetSingletonPtr()->GetAsFloat("Blue_Bubble_Life_Time")); RigidBodyDef body_def; body_def.body_type = DYNAMIC_BODY; body_def.collider_type = COLLIDER_SPHERE; body_def.friction = def.friction; body_def.mass = 1.0f; body_def.collision_filter.filter = COL_BUBBLE; body_def.collision_filter.mask = COL_PLAYER | COL_TOTT | COL_BUBBLE | COL_WORLD_STATIC | COL_QUESTITEM; rc->Init(position, mrc->GetEntity(), m_physics_engine, body_def); rc->SetId("body"); rc->GetRigidbody()->setContactProcessingThreshold(btScalar(0)); rc->GetRigidbody()->setGravity(btVector3(0.0f, 0.0f, 0.0f)); rc->GetRigidbody()->setActivationState(DISABLE_DEACTIVATION); rc->GetRigidbody()->setDamping(VariableManager::GetSingletonPtr()->GetAsFloat("Bubble_Linear_Damping"), VariableManager::GetSingletonPtr()->GetAsFloat("Bubble_Angular_Damping")); cons->Init(m_physics_engine,rc->GetRigidbody(), def.connection_body, btVector3(0,0,0), btVector3(0,0,0)); bc->Init(m_physics_engine, m_message_system, VariableManager::GetSingletonPtr()->GetAsFloat("OnBubbleImpulse"), VariableManager::GetSingletonPtr()->GetAsFloat("OnBubbleMaxVelocity"), def.start_scale); this->CheckBubbleSize(); m_bubbles.push_back(go); return go; }