Ejemplo n.º 1
0
void Space::CreateTestScene(Entity player, double time)
{
	auto renderer = p3::game->GetRenderer();
	m_renderer = renderer;

	StarSystemCache::ShrinkCache(SystemPath(), true);
	Sector::cache.ClearCache();
	SystemPath path(10,0,0,0);
	m_starSystem = StarSystemCache::GetCached(path);

	GenBody(time, m_starSystem->m_rootBody.Get(), m_rootFrame.get());
	m_rootFrame->UpdateOrbitRails(time, 1.0);

	//init "player"
	{
		auto model = p3::game->GetModelCache()->FindModel("kanara");
		SDL_assert(model);
		player.assign<GraphicComponent>(new ModelGraphic(renderer, model));
		player.assign<PosOrientComponent>(vector3d(0,0,1e6), matrix3x3d(1.0));
		player.assign<MassComponent>(10.0);
		player.assign<DynamicsComponent>();
		player.assign<ThrusterComponent>();
		player.assign<WeaponComponent>();
		player.assign<PlayerInputComponent>();
		player.assign<CollisionMeshComponent>(player, model->GetCollisionMesh());
		player.assign<FrameComponent>(GetRootFrame());
		//player.assign<ColorComponent>(Color(0,255,255,255));
		player.assign<ShipAIComponent>();
		player.assign<NameComponent>("Player");

		GetRootFrame()->GetCollisionSpace()->AddGeom(player.component<CollisionMeshComponent>()->geom.get());
	}

	//init "AI"
	{
		auto model = p3::game->GetModelCache()->FindModel("natrix");
		SDL_assert(model);
		Entity ship = m_entities->create();
		ship.assign<GraphicComponent>(new ModelGraphic(renderer, model));
		ship.assign<PosOrientComponent>(vector3d(0,0,1e6 - 200), matrix3x3d(1.0));
		ship.assign<MassComponent>(10.0);
		ship.assign<DynamicsComponent>();
		ship.assign<ThrusterComponent>();
		ship.assign<WeaponComponent>();
		ship.assign<CollisionMeshComponent>(ship, model->GetCollisionMesh());
		ship.assign<FrameComponent>(GetRootFrame());
		ship.assign<ColorComponent>(Color(255,0,0,255));
		ship.assign<ShipAIComponent>();
		ship.assign<NameComponent>("Drone");
		ship.assign<AICommandComponent>(); //kamikaze
		auto aicmd = ship.component<AICommandComponent>();
		aicmd->SetKamikaze(player);

		GetRootFrame()->GetCollisionSpace()->AddGeom(ship.component<CollisionMeshComponent>()->geom.get());
	}

	//some scenery
	//Entity obstacle = m_entities->create();
	if (0)
	{
		Entity obstacle = m_entities->create();
		auto model = p3::game->GetModelCache()->FindModel("kbuilding02");
		obstacle.assign<PosOrientComponent>(vector3d(0, 0, -200), matrix3x3d(1.0));
		obstacle.assign<GraphicComponent>(new ModelGraphic(renderer, model));
		obstacle.assign<MassComponent>(100.0);
		obstacle.assign<DynamicsComponent>();
		obstacle.assign<CollisionMeshComponent>(obstacle, model->GetCollisionMesh());
		obstacle.assign<FrameComponent>(GetRootFrame());

		GetRootFrame()->GetCollisionSpace()->AddGeom(obstacle.component<CollisionMeshComponent>()->geom.get());

		Entity hangAroundMember = m_entities->create();
		hangAroundMember.assign<PosOrientComponent>(vector3d(0.0), matrix3x3d(1.0));
		hangAroundMember.assign<AttachToEntityComponent>(obstacle, vector3d(0, 50, 0));
		hangAroundMember.assign<GraphicComponent>(new ModelGraphic(renderer, model));
		hangAroundMember.assign<FrameComponent>(GetRootFrame());
	}

	//init camera
	//left camera
	if (0)
	{
		Entity camera = m_entities->create();
		ent_ptr<CameraComponent> camc(new CameraComponent());
		camc->camera.reset(new Camera());
		camc->camera->viewport = vector4f(0.f, 0.f, 0.5f, 1.f);
		camc->camera->clearColor = Color(0, 40, 0, 0);
		camera.assign(camc);
		camera.assign<PosOrientComponent>(vector3d(0, 50, 100), matrix3x3d(1.0));
		camera.assign<CameraLookAtComponent>(player);
		camera.assign<FrameComponent>(GetRootFrame());
		//camera.assign<AttachToEntityComponent>(player, vector3d(0, 5, 50));
	}

	//right top camera
	if (0)
	{
		Entity camera = m_entities->create();
		ent_ptr<CameraComponent> camc(new CameraComponent());
		camc->camera.reset(new Camera());
		camc->camera->viewport = vector4f(0.5f, 0.5f, 0.5f, 0.5f);
		camera.assign(camc);
		camera.assign<PosOrientComponent>(vector3d(100, -10, -10), matrix3x3d(1.0));
		//camera.assign<CameraLookAtComponent>(obstacle);
		camera.assign<FrameComponent>(GetRootFrame());
	}
	//right bottom camera
	{
		Entity camera = m_entities->create();
		ent_ptr<CameraComponent> camc(new CameraComponent());
		camc->camera.reset(new Camera());
		//camc->camera->clearColor = Color(10, 10, 10, 0);
		camc->camera->viewport = vector4f(0.0f, 0.f, 1.0f, 1.0f);
		//camc->camera->viewport = vector4f(0.5f, 0.f, 0.5f, 1.0f);
		camera.assign(camc);
		camera.assign<PosOrientComponent>(vector3d(0, 0, 0), matrix3x3d(1.0));
		camera.assign<AttachToEntityComponent>(player, vector3d(0, 5, 10));
		camera.assign<FrameComponent>(GetRootFrame());
	}
}
Ejemplo n.º 2
0
void Furniture::Update()
{
  // Lots of problems if furniture can fall. Every furniture will need collision meshes for terrain
  //  and other intersecting objects.
//  static const float GRAVITY = ROConfig()->GetFloat("gravity", -50.0f); 
//  m_acc.y = GRAVITY;

  Ve1Object::Update();

  if (!m_sceneNode)
  {
    return; // assert ?
  }

  // WHY doesn't this work ??? 
  //if (m_handlePickup)
  //{
  //  HandlePickup(m_pickupId);
  //}

  if (m_pickupId == 0)
  {
    Matrix m;
    m.Translate(m_pos);
    m_sceneNode->SetLocalTransform(m);
  }
  else
  {
    // Get pos of pickup player. Set scene node pos to this.
    GameObject* go = TheGame::Instance()->GetGameObject(m_pickupId);
    if (go)
    {
      static const float PICKUP_Y = ROConfig()->GetFloat("pickup-y", 60.0f);
      m_pos = go->GetPos() + Vec3f(0, PICKUP_Y, 0); 
      Player* p = dynamic_cast<Player*>(go); 
      if (p)
      {
        p->SetCarrying(this);
      }
    }

    // TODO recalc AABB for VFC and picking
  }

  //TurnToFaceDir(); // ?

  // If we got moved or rotated, transform Collision Mesh and recalc bounding box
  if ((m_pos - m_collMeshPos).SqLen() > 0.1f || fabs(m_collMeshRot - m_dir) > 0.1f)
  { 
    Matrix m;

    SceneCollisionMesh* scm = dynamic_cast<SceneCollisionMesh*>(m_sceneNode.GetPtr());
    if (scm)
    {
      scm->CalcCollisionMesh();
  
      m.RotateY(DegToRad(m_dir));
      GetCollisionMesh()->Transform(m);

      m.Translate(m_pos);
      GetCollisionMesh()->Transform(m);
      GetCollisionMesh()->CalcAABB(&m_aabb);

      m_sceneNode->SetAABB(m_aabb);

      m_collMeshPos = m_pos;
      m_collMeshRot = m_dir;
    }
  }

  // If moving and like a ball, we should rotate
}