Actor* addModel(string filename, vec3 pos = vec3(0), vec3 s = vec3(1)) { Actor* sphere = new Actor; TransformComponent* trans = new TransformComponent(); trans->setPos(pos); trans->setScale(s); sphere->addComponent(trans); glDebug(); sphere->addComponent(new StaticMeshStaticPhysicsComponent(AssetManager::getBasePath() + filename)); glDebug(); MeshGraphicComponent* mesh = new MeshGraphicComponent(AssetManager::getBasePath() + filename); glDebug(); mesh->setTextureMatrix(mat2(scale(mat4(1), vec3(10)))); glDebug(); Material *mat = new Material(); glDebug(); mat->setDiffuse(AssetManager::getBasePath() + "Data/Texture/floor1_d.png"); mat->setNormal(AssetManager::getBasePath() + "Data/Texture/floor1_n.png"); mat->setSpecular(AssetManager::getBasePath() + "Data/Texture/floor1_s.png"); mat->setShininess(20); glDebug(); mesh->addMaterial(mat); glDebug(); sphere->addComponent(mesh); glDebug(); return sphere; }
Actor* addLucy(Scene* scene) { string tex[] = {"#666666", "#666667", "#666668", "#666669"}; for(int i = 0; i < 5; i++) { Actor* sphere = new Actor; vec3 pos(i * 3, 0, -25); TransformComponent* trans = new TransformComponent(); trans->setScale(vec3(0.2)); trans->setPos(pos); sphere->addComponent(trans); glDebug(); sphere->addComponent(new SpherePhysicsComponent(1)); glDebug(); MeshGraphicComponent* mesh = new MeshGraphicComponent(AssetManager::getBasePath() + "Data/Model/lucy_low.obj"); glDebug(); mesh->setTextureMatrix(mat2(scale(mat4(1), vec3(10)))); glDebug(); Material *mat = new Material(); glDebug(); if(i) { mat->setDiffuse(tex[i - 1]); mat->setShininess(i * i * i * i); } else { mat->setDiffuse(AssetManager::getBasePath() + "Data/Texture/floor1_d.png"); mat->setNormal(AssetManager::getBasePath() + "Data/Texture/floor1_n.png"); mat->setSpecular(AssetManager::getBasePath() + "Data/Texture/floor1_s.png"); mat->setShininess(20); } glDebug(); mesh->addMaterial(mat); glDebug(); sphere->addComponent(mesh); glDebug(); scene->addActor(sphere); } return 0; }
// Example 2D physics scene. void PhysicsTestScene::onSceneLoad(GameInstance *instance) { ContextData *context = instance->getContextData(); { Entity *entity = rtti::dynamicCast<Entity>(rtti::RTTI::generateSerializable("Entity", instance->getContextData()));; entity->setName("background"); TransformComponent *transform = rtti::dynamicCast<TransformComponent>(rtti::RTTI::generateSerializable("TransformComponent", instance->getContextData())); transform->setPosition(math::Vec3(0.f, 0.f, LAYER_BACKGROUND_0)); transform->setDirection(math::Vec3(0.0f, 0.0f, 1.f)); transform->setScale(150.f); renderer::SpriteComponent *sprite = rtti::dynamicCast<renderer::SpriteComponent>(rtti::RTTI::generateSerializable("SpriteComponent", instance->getContextData())); sprite->setTexture("grass.png"); sprite->setDisableCullCheck(true); entity->addComponent(transform); entity->addComponent(sprite); instance->getScene()->addEntity(entity); } { Entity *entity = rtti::dynamicCast<Entity>(rtti::RTTI::generateSerializable("Entity", instance->getContextData()));; entity->setName("block"); TransformComponent *transform = rtti::dynamicCast<TransformComponent>(rtti::RTTI::generateSerializable("TransformComponent", instance->getContextData())); transform->setPosition(math::Vec3(0.f, 50.f, LAYER_BACKGROUND_0)); transform->setDirection(math::Vec3(-0.5f, 0.5f, 1.f)); transform->setScale(1.f); renderer::SpriteComponent *sprite = rtti::dynamicCast<renderer::SpriteComponent>(rtti::RTTI::generateSerializable("SpriteComponent", instance->getContextData())); sprite->setTexture("biggrass.png"); physics::Box2DRigidBodyComponent *phys = rtti::dynamicCast<physics::Box2DRigidBodyComponent>(rtti::RTTI::generateSerializable("Box2DRigidBodyComponent", instance->getContextData())); phys->setMass(5); phys->setFriction(1.f); phys->setDensity(1.0f); phys->setRestitution(0.8f); phys->setKinematic(true); phys->setGroup(physics::BOX2D_GROUP_LEVEL); entity->addComponent(transform); entity->addComponent(sprite); entity->addComponent(phys); instance->getScene()->addEntity(entity); } for (unsigned i = 0; i < 2000; ++i) { Entity *entity = rtti::dynamicCast<Entity>(rtti::RTTI::generateSerializable("Entity", instance->getContextData()));; entity->setName("block"); TransformComponent *transform = rtti::dynamicCast<TransformComponent>(rtti::RTTI::generateSerializable("TransformComponent", instance->getContextData())); transform->setPosition(math::Vec3(150.f + i * 250.f, 50.f, LAYER_BACKGROUND_0)); transform->setDirection(math::Vec3(-0.5f, 0.5f, 1.f)); transform->setScale(1.f); renderer::SpriteComponent *sprite = rtti::dynamicCast<renderer::SpriteComponent>(rtti::RTTI::generateSerializable("SpriteComponent", instance->getContextData())); sprite->setTexture("biggrass.png"); physics::Box2DRigidBodyComponent *phys = rtti::dynamicCast<physics::Box2DRigidBodyComponent>(rtti::RTTI::generateSerializable("Box2DRigidBodyComponent", instance->getContextData())); phys->setMass(5); phys->setFriction(1.f); phys->setDensity(1.0f); phys->setRestitution(0.8f); phys->setKinematic(true); phys->setGroup(physics::BOX2D_GROUP_LEVEL); entity->addComponent(transform); entity->addComponent(sprite); entity->addComponent(phys); instance->getScene()->addEntity(entity); } unsigned l = 10; for (unsigned i = 0; i < 10; ++i) { Entity *entity = rtti::dynamicCast<Entity>(rtti::RTTI::generateSerializable("Entity", instance->getContextData()));; entity->setName("Object"); TransformComponent *transform = rtti::dynamicCast<TransformComponent>(rtti::RTTI::generateSerializable("TransformComponent", instance->getContextData())); transform->setPosition(math::Vec3(0.f, 750.f + 150.f * i, LAYER_OBJECT_1)); transform->setDirection(math::Vec3(0.f, 0.f, 1.f)); transform->setScale(1.f); renderer::SpriteComponent *sprite = rtti::dynamicCast<renderer::SpriteComponent>(rtti::RTTI::generateSerializable("SpriteComponent", instance->getContextData())); sprite->setTexture("isopropelli.png"); physics::Box2DRigidBodyComponent *phys = rtti::dynamicCast<physics::Box2DRigidBodyComponent>(rtti::RTTI::generateSerializable("Box2DRigidBodyComponent", instance->getContextData())); game::PickupComponent *pickup = rtti::dynamicCast<game::PickupComponent>(rtti::RTTI::generateSerializable("PickupComponent", instance->getContextData())); phys->setMass(10); phys->setKinematic(false); phys->setFriction(0.8f); phys->setDensity(1.f); //phys->setGroup(physics::BOX2D_GROUP_NONSOLID_OBJECT); phys->setSizeY(64); phys->setSizeX(84); entity->addComponent(transform); entity->addComponent(sprite); entity->addComponent(phys); entity->addComponent(pickup); --l; if (l == 0) { /* renderer::LightComponent *light = rtti::generate<renderer::LightComponent>(instance->getContextData()); light->setColor(math::Vec3(0.0f, 0.0f, 1.f)); light->setDistance(10.f); sprite->setWidthScale(5.f); entity->addComponent(light); l = 5; */ } instance->getScene()->addEntity(entity); } { Entity *entity = rtti::dynamicCast<Entity>(rtti::RTTI::generateSerializable("Entity", instance->getContextData()));; entity->setName("Ground2"); TransformComponent *transform = rtti::dynamicCast<TransformComponent>(rtti::RTTI::generateSerializable("TransformComponent", instance->getContextData())); transform->setPosition(math::Vec3(150.f, -450.f, LAYER_BACKGROUND_2)); transform->setDirection(math::Vec3(0.f, 0.f, 1.f)); transform->setScale(1.f); renderer::SpriteComponent *sprite = rtti::dynamicCast<renderer::SpriteComponent>(rtti::RTTI::generateSerializable("SpriteComponent", instance->getContextData())); sprite->setTexture("hellknight.png"); physics::Box2DRigidBodyComponent *phys = rtti::dynamicCast<physics::Box2DRigidBodyComponent>(rtti::RTTI::generateSerializable("Box2DRigidBodyComponent", instance->getContextData())); phys->setMass(5); phys->setFriction(1.f); phys->setDensity(1.0f); phys->setKinematic(true); phys->setGroup(physics::BOX2D_GROUP_LEVEL); entity->addComponent(transform); entity->addComponent(sprite); entity->addComponent(phys); instance->getScene()->addEntity(entity); } { Entity *entity = rtti::dynamicCast<Entity>(rtti::RTTI::generateSerializable("Entity", instance->getContextData()));; entity->setName("Ground3"); TransformComponent *transform = rtti::dynamicCast<TransformComponent>(rtti::RTTI::generateSerializable("TransformComponent", instance->getContextData())); transform->setPosition(math::Vec3(850.f, 0.f, LAYER_BACKGROUND_2)); transform->setDirection(math::Vec3(0.f, 0.f, 1.f)); transform->setScale(1.f); renderer::SpriteComponent *sprite = rtti::dynamicCast<renderer::SpriteComponent>(rtti::RTTI::generateSerializable("SpriteComponent", instance->getContextData())); sprite->setTexture("hellknight.png"); physics::Box2DRigidBodyComponent *phys = rtti::dynamicCast<physics::Box2DRigidBodyComponent>(rtti::RTTI::generateSerializable("Box2DRigidBodyComponent", instance->getContextData())); phys->setFriction(1.f); phys->setMass(5); phys->setDensity(1.0f); phys->setKinematic(true); phys->setGroup(physics::BOX2D_GROUP_LEVEL); entity->addComponent(transform); entity->addComponent(sprite); entity->addComponent(phys); instance->getScene()->addEntity(entity); } { Entity *entity = rtti::dynamicCast<Entity>(rtti::RTTI::generateSerializable("Entity", instance->getContextData()));; entity->setName("Ground"); TransformComponent *transform = rtti::dynamicCast<TransformComponent>(rtti::RTTI::generateSerializable("TransformComponent", instance->getContextData())); transform->setPosition(math::Vec3(850.f, 550.f, LAYER_BACKGROUND_2)); transform->setDirection(math::Vec3(0.f, 0.f, 1.f)); transform->setScale(1.f); renderer::SpriteComponent *sprite = rtti::dynamicCast<renderer::SpriteComponent>(rtti::RTTI::generateSerializable("SpriteComponent", instance->getContextData())); sprite->setTexture("hellknight.png"); physics::Box2DRigidBodyComponent *phys = rtti::dynamicCast<physics::Box2DRigidBodyComponent>(rtti::RTTI::generateSerializable("Box2DRigidBodyComponent", instance->getContextData())); phys->setFriction(1.f); phys->setMass(5); phys->setDensity(1.0f); phys->setKinematic(true); phys->setGroup(physics::BOX2D_GROUP_LEVEL); entity->addComponent(transform); entity->addComponent(sprite); entity->addComponent(phys); instance->getScene()->addEntity(entity); } { Entity *entity = rtti::generate<Entity>(instance->getContextData()); entity->setName("Player"); TransformComponent *transform = rtti::dynamicCast<TransformComponent>(rtti::RTTI::generateSerializable("TransformComponent", instance->getContextData())); transform->setPosition(math::Vec3(150.f, 1750.f, LAYER_OBJECT_1)); transform->setDirection(math::Vec3(0.f, 0.f, 1.f)); transform->setScale(1.f); renderer::SpriteComponent *sprite = rtti::dynamicCast<renderer::SpriteComponent>(rtti::RTTI::generateSerializable("SpriteComponent", instance->getContextData())); sprite->setTexture("testcube.png"); physics::Box2DRigidBodyComponent *phys = rtti::dynamicCast<physics::Box2DRigidBodyComponent>(rtti::RTTI::generateSerializable("Box2DRigidBodyComponent", instance->getContextData())); phys->setMass(5); phys->setFriction(0.5f); phys->setDensity(1.0f); phys->setKinematic(false); phys->setBodyShape(physics::SHAPE_CIRCLE); phys->setFixedRotation(true); phys->setGroup(physics::BOX2D_GROUP_SOLID_OBJECT); player::PlayerInputComponent *playerInput = rtti::dynamicCast<player::PlayerInputComponent>(rtti::RTTI::generateSerializable("PlayerInputComponent", instance->getContextData())); #ifndef NULLRENDERER scene::CameraComponent *camera = rtti::dynamicCast<scene::CameraComponent>(rtti::RTTI::generateSerializable("CameraComponent", instance->getContextData())); #endif // renderer::LightComponent *light = rtti::generate<renderer::LightComponent>(instance->getContextData()); // light->setColor(math::Vec3(1.0f, 1.0f, 1.f)); // light->setDistance(50); entity->addComponent(transform); entity->addComponent(sprite); entity->addComponent(phys); entity->addComponent(playerInput); // entity->addComponent(light); #ifndef NULLRENDERER entity->addComponent(camera); #endif // Create parent Entity scene::Entity *ent = rtti::generate<scene::Entity>(instance->getContextData()); scene::TransformComponent *ent2_transform = rtti::generate<scene::TransformComponent>(instance->getContextData()); renderer::SpriteComponent *ent2_sprite = rtti::generate<renderer::SpriteComponent>(instance->getContextData()); // 0.3f to move it up a bit ent2_transform->setPosition(math::Vec3(75.f, 75.f, LAYER_OBJECT_2)); ent2_sprite->setTexture("testcube.png"); ent->addComponent(ent2_transform); ent->addComponent(ent2_sprite); // PARENTING ent->setParentEntity(entity); instance->getScene()->addEntity(entity); instance->getScene()->addEntity(ent); ent2_transform->getPosition(); #ifndef NULLRENDERER camera->setActive(true); #endif if (instance->getContextData()->rendererSystem != NULL) instance->getContextData()->rendererSystem->setAmbientLight(math::Vec4(0.3f, 0.3f, 0.3f, 0.3f)); } { Entity *entity = rtti::dynamicCast<Entity>(rtti::RTTI::generateSerializable("Entity", instance->getContextData()));; entity->setName("Ground4"); TransformComponent *transform = rtti::dynamicCast<TransformComponent>(rtti::RTTI::generateSerializable("TransformComponent", instance->getContextData())); transform->setPosition(math::Vec3(-2050.f, 0.f, LAYER_FOREGROUND_2)); transform->setDirection(math::Vec3(0.f, 0.f, 1.f)); transform->setScale(1.f); renderer::SpriteComponent *sprite = rtti::dynamicCast<renderer::SpriteComponent>(rtti::RTTI::generateSerializable("SpriteComponent", instance->getContextData())); sprite->setTexture("trans.png"); physics::Box2DRigidBodyComponent *phys = rtti::dynamicCast<physics::Box2DRigidBodyComponent>(rtti::RTTI::generateSerializable("Box2DRigidBodyComponent", instance->getContextData())); phys->setMass(5); phys->setFriction(1.f); phys->setDensity(1.0f); phys->setKinematic(true); //phys->setGroup(physics::BOX2D_GROUP_LEVEL); phys->setGroup(physics::BOX2D_GROUP_NONSOLID_OBJECT); entity->addComponent(transform); entity->addComponent(sprite); entity->addComponent(phys); instance->getScene()->addEntity(entity); } LOG_INFO("Physics test scene loaded!"); }
void FieldSystem::CreateBoard() { //Temporary board for building neighbourhood std::vector<std::vector<FieldComponent*>> fieldBoard; fieldBoard.resize(FIELDSIZE_Y); for(unsigned int y = 0; y < FIELDSIZE_Y; ++y) { fieldBoard[y].resize(FIELDSIZE_X); for(unsigned int x = 0; x < FIELDSIZE_X; ++x) { //Create field unsigned int entityId = m_dataModel->getUnusedEntityId(); SpriteComponent* sprite = new SpriteComponent(entityId); sprite->setTexture(m_textureLoader->Load("resources/textures/hexagon.png")); int height = static_cast<int>(sprite->getTextureBounds().w); TransformComponent* hexagonTransform = new TransformComponent(entityId, glm::vec3(BOARD_OFFSET_X + x * FIELD_OFFSET_X, BOARD_OFFSET_Y + y * height + (x % 2) * (height / 2), -5)); hexagonTransform->setScale(glm::vec2(0.4f)); FieldComponent* fieldComp = new FieldComponent(entityId); fieldComp->setCoordinates(glm::ivec2(x, y)); m_eventManager->FireEvent<RegisterComponentEvent>(new RegisterComponentEvent(sprite)); m_eventManager->FireEvent<RegisterComponentEvent>(new RegisterComponentEvent(hexagonTransform)); m_eventManager->FireEvent<RegisterComponentEvent>(new RegisterComponentEvent(fieldComp)); fieldBoard[y][x] = fieldComp; //Build neighbourhood if(y > 0) { fieldBoard[y-1][x]->getNeighbours().push_back(fieldComp); fieldComp->getNeighbours().push_back(fieldBoard[y-1][x]); } if(x > 0) { fieldBoard[y][x-1]->getNeighbours().push_back(fieldComp); fieldComp->getNeighbours().push_back(fieldBoard[y][x-1]); } if(x > 0 && y > 0 && x % 2 == 0) { fieldBoard[y-1][x-1]->getNeighbours().push_back(fieldComp); fieldComp->getNeighbours().push_back(fieldBoard[y-1][x-1]); } if(x < FIELDSIZE_X - 1 && y > 0 && x % 2 == 0) { fieldBoard[y-1][x+1]->getNeighbours().push_back(fieldComp); fieldComp->getNeighbours().push_back(fieldBoard[y-1][x+1]); } } } //Create hole/unpassable fields fieldBoard[7][9]->setIsPassable(false); fieldBoard[7][10]->setIsPassable(false); fieldBoard[7][11]->setIsPassable(false); fieldBoard[7][12]->setIsPassable(false); fieldBoard[7][13]->setIsPassable(false); RecalculateColors(); }
// instance provides access to the engine when the load is happening, all the changes should be loaded against it. void PhysicsTestScene::onSceneLoad(GameInstance *instance) { // Scopes are here just to make it easier to use the same name multiple times (entity, etc) { // creating a static ground with box2d physics Entity *entity = rtti::generate<Entity>(instance->getContextData()); entity->setName("Ground"); TransformComponent *transform = rtti::generate<TransformComponent>(instance->getContextData()); // set position of the ground transform->setPosition(math::Vec3(50.f, 550.f, 0.f)); transform->setDirection(math::Vec3(0.f, 0.f, 1.f)); transform->setScale(1.f); // Create spritecomponent to display the image renderer::SpriteComponent *sprite = rtti::generate<renderer::SpriteComponent>(instance->getContextData()); sprite->setTexture("hellknight.png"); // hellknight.png is automatically loaded and cached by the RendererSystem, etc on the background, no need to worry about it // Lets add 2D-physics physics::Box2DRigidBodyComponent *phys = rtti::generate<physics::Box2DRigidBodyComponent>(instance->getContextData()); phys->setFriction(1.f); phys->setMass(5); phys->setDensity(1.0f); phys->setKinematic(true); // kinematic makes the object static. (useful for ground, etc) // Lets add all the components to the entity entity->addComponent(transform); entity->addComponent(sprite); entity->addComponent(phys); // aaand lets add the entity to the scene! instance->getScene()->addEntity(entity); } // And the lets create the player, { Entity *entity = rtti::generate<Entity>(instance->getContextData()); entity->setName("Player"); // name can be checked during the code, but string comparison is slow, so I would recommend to check against something else // for example if only the player has "PlayerInfoComponent" or something like that, you can try to find that component to // detect the player. TransformComponent *transform = rtti::generate<TransformComponent>(instance->getContextData()); transform->setPosition(math::Vec3(50.f, 750.f, 0.2f)); transform->setDirection(math::Vec3(0.f, 0.f, 1.f)); transform->setScale(1.f); renderer::SpriteComponent *sprite = rtti::generate<renderer::SpriteComponent>(instance->getContextData()); sprite->setTexture("testcube.png"); physics::Box2DRigidBodyComponent *phys = rtti::generate<physics::Box2DRigidBodyComponent>(instance->getContextData()); phys->setMass(5); phys->setFriction(1.f); phys->setDensity(1.0f); phys->setKinematic(false); player::PlayerInputComponent *playerInput = rtti::generate<player::PlayerInputComponent>(instance->getContextData()); // camera is used to center the camera to the player scene::CameraComponent *camera = rtti::generate<scene::CameraComponent>(instance->getContextData()); renderer::LightComponent *light = rtti::generate<renderer::LightComponent>(instance->getContextData()); light->setColor(math::Vec3(0.8f, 0.8f, 1.f)); entity->addComponent(transform); entity->addComponent(sprite); entity->addComponent(phys); entity->addComponent(playerInput); entity->addComponent(light); entity->addComponent(camera); instance->getScene()->addEntity(entity); camera->setActive(true); } LOG_INFO("Physics test scene loaded!"); }