예제 #1
0
void MyScene::pan(pfloat32 deltaAngle)
{
    deltaAngle = deltaAngle * P_PI / 180.0f;
    PCamera *camera = mainCamera();
    pfloat32 y = camera->transform().rotationY();
    camera->transform().setRotationY(y + deltaAngle);
}
예제 #2
0
void MyScene::yaw(pfloat32 deltaAngle)
{
    deltaAngle = deltaAngle * P_PI / 180.0f;
    PCamera *camera = mainCamera();
    pfloat32 x = camera->transform().rotationX();
    camera->transform().setRotationX(x + deltaAngle);
}
예제 #3
0
 void Node::AddChild(PNode node)
 {
     CHECK_ASSERT(node && node.get() != this);
     children_.push_back(node);
     childrenHash_.insert(std::make_pair(node->name_, node));
     PNode thisNode = SharedFromPointerNode(this);
     node->parent_ = thisNode;
     PScene scene = scene_.lock();
     if (!scene) scene = std::dynamic_pointer_cast<Scene>(thisNode);
     node->scene_ = scene;
     if (scene)
     {
         PLight light = std::dynamic_pointer_cast<Light>(node);
         if (light)
             scene->AddLight(light.get());
         else
         {
             PCamera camera = std::dynamic_pointer_cast<Camera>(node);
             if (camera) scene->AddCamera(camera.get());
             else
             {
                 auto ps = std::dynamic_pointer_cast<ParticleSystem>(node);
                 if (ps) scene->AddParticleSystem(ps.get());
             }
         }
     }
     node->MarkAsDirty();
 }
예제 #4
0
void EngineRunningBase::DrawLensflare()
{
  // Lensflare: draw if the sparkling sun is on screen.
  if (!m_pLevel->IsCurrentRoomIndoors() && 
      GetEngine()->GetDayNightSky()->IsSparkleVisible())
  {
    // Make a bounding sphere around the sun coords.
    Vec3f sunPos = GetEngine()->GetDayNightSky()->GetSunPosition();
    BoundingSphere sunBs(sunPos, 50.0f); // sun's "radius"
    // Find out if the sun intersects the view frustum
    if (Frustum::Instance()->Contains(sunBs))
    {
      PCamera pCam = GetCamera();
      Assert(pCam.GetPtr());
      Vec3f eyePos(pCam->GetOrientation()->GetX(), 
                        pCam->GetOrientation()->GetY(), 
                        pCam->GetOrientation()->GetZ());

      // We have to draw the lens flare, unless the sun is obscured by part of 
      // the scene.
      // Test the line from camera to sun for obstructions.
      //Mgc::Segment3 seg;
      //seg.Origin() = Mgc::Vector3(eyePos.x, eyePos.y, eyePos.z);
      //seg.Direction() = Mgc::Vector3(
      //  sunPos.x - eyePos.x, 
      //  sunPos.y - eyePos.y, 
      //  sunPos.z - eyePos.z);

      // Do intersection test on the scenery for the current room.
      if (m_pLevel->GetScene()->LineIntersects(eyePos, sunPos, 1.0f /* some radius */ ))
      {
        return; // Sun is obscured.
      }

      // We should draw the lens flare. Get the Camera eye position and 
      // "look at" position (some point along the line we are pointing at).

      GetEngine()->PushColour(1.0f, 1.0f, 1.0f, 1.0f);

      //GetEngine()->GetLensflare()->Draw(
      //  GetEngine()->GetDayNightSky()->GetSunPosition(),
      //  eyePos,
      //  pCam->GetLookAtPos() );

      GetEngine()->PopColour();
    }
  }
}
예제 #5
0
MyScene::MyScene(PContext *context)
    : PScene("my-scene", context)
{
    PRandom random(1001);

    const puint32 *rect = context->rect();

    for (puint32 i = 0; i < NUM_LOGOS; ++i)
    {
        m_velocities[i][0] = (random.getFloat32() - 0.5f) * (pfloat32)rect[2] * 0.001f; 
        m_velocities[i][1] = (random.getFloat32() - 0.5f) * (pfloat32)rect[3] * 0.001f; 
    }

    // -------------------------------------------------------------- 
    // Add camera
    // -------------------------------------------------------------- 
    PCamera *camera = PNEW(PCamera("camera", this));
    camera->setFixed(true);
    camera->transform().setLookAt(0.0f, 0.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
    camera->projection().window((pfloat32)rect[2], (pfloat32)rect[3]);
    setMainCamera(camera);
    
	PResourceManager* resMgr = context->module<PResourceManager>("resource-manager");

    // -------------------------------------------------------------- 
    // Scene objects
    // -------------------------------------------------------------- 
    PMaterial *material = PNEW(PMaterial("texture.pmt", resMgr));
    material->parameter("texture") = resMgr->getTexture("texture.png");
    material->setTransparent(true);
        
    PAbstractGeometry *geometry = PNEW(PGeometryPlane(resMgr));

    for (puint32 i = 0; i < NUM_LOGOS; ++i)
    {
        PString name = PString::fromUint(i);
        m_logos[i] = PNEW(PDrawable(name.c_str(), this));
        m_logos[i]->setGeometry(geometry);
        m_logos[i]->setMaterial(material);

        m_logos[i]->transform().setTranslation(pVector3(0.0f, 0.0f, 0.0f));
        m_logos[i]->transform().setScaling(pVector3(64.0f, 16.0f, 1.0f));
    }

    setBackgroundColor(pColorRGBA(1.0f, 1.0f, 1.0f, 0.0f));
}
예제 #6
0
MyScene::MyScene(PContext *context)
    : PScene("my-scene", context)
{
    m_nextSprite = 0;

    PResourceManager *resMgr = context->module<PResourceManager>("resource-manager");

    const puint32 *rect = context->rect();

    PCamera *camera = PNEW(PCamera("camera", this));
    camera->setFixed(true);
    camera->transform().setLookAt(0.0f, 10.0f, 7.0f, 0.0f, 5.0f, 0.0f, 0.0f, 1.0f, 0.0f);
    camera->projection().perspective(60.0f, (pfloat32)rect[2] / (pfloat32)rect[3], 0.1f, 100.0f);
    setMainCamera(camera);
    
    m_plane = PNEW(PDrawable("plane", this));
    m_plane->setGeometry(PNEW(PGeometryPlane(resMgr)));
    m_plane->setMaterial(PNEW(PMaterial("color.pmt", resMgr)));
    m_plane->material()->parameter("color") = P_COLOR_RED;

    PTexture* textures[1];
    textures[0] = resMgr->getTexture("texture.png");

    pchar name[] = "sprite0";
    for (puint32 i = 0; i < NUM_SPRITES; ++i)
    {
        name[6]++;        
        m_sprites[i] = PNEW(PSprite(name, this));
        m_sprites[i]->setAnimationDuration(4, 2000);
        m_sprites[i]->setTextureAtlas(textures, 1, 2, 2, true);

        m_sprites[i]->transform().setScaling(pVector3(0.25f, 0.25f, 1.0f));
        m_sprites[i]->transform().setTranslation(pVector3(-100000.0f, -100000.0f, -100000.0f));
    }

    pfloat32 aspect = (pfloat32)rect[2] / (pfloat32)rect[3];
    PSprite2D *legend = PNEW(PSprite2D("legend", this));
    legend->transform().setScaling(pVector3(aspect * 0.25f, aspect * 0.0625f, 1.0f));
    textures[0] = resMgr->getTexture("legend.png");
    legend->setTextureAtlas(textures, 1, 1, 1, true);
    legend->setAnimationDuration(1, 10000);
    legend->transform().setTranslation(pVector3(0, 0.4f, -1.0f));
}
예제 #7
0
MyScene::MyScene(PContext *context)
    : PScene("my-scene", context)
{
	PResourceManager *resMgr = context->module<PResourceManager>("resource-manager");
    
    // -------------------------------------------------------------- 
    // Add camera
    // -------------------------------------------------------------- 
    const puint32 *rect = context->rect();

    PCamera *camera = PNEW(PCamera("camera", this));
    camera->setFixed(true);
    camera->transform().setLookAt(0.0f, 0.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
    camera->projection().orthogonal((pfloat32)rect[2] / (pfloat32)rect[3], 0.1f, 100.0f);
    setMainCamera(camera);
    
    // -------------------------------------------------------------- 
    // Scene background
    // -------------------------------------------------------------- 
    setBackgroundColor(P_COLOR_BLACK_TRANSPARENT);    

    // -------------------------------------------------------------- 
    // Scene objects
    // -------------------------------------------------------------- 
    PMaterial *material; 
    PAbstractGeometry *geometry;

    material = PNEW(PMaterial("color.pmt", resMgr));
    material->parameter("color") = pColorRGBA(1.0f, 0.0f, 0.0f, 1.0f);
    geometry = PNEW(PGeometryPlane(resMgr));
    PDrawable *plane1 = PNEW(PDrawable("plane1", this));
    plane1->setMaterial(material);
    plane1->setGeometry(geometry);
    plane1->transform().setScaling(pVector3(0.2f, 0.2f, 1.0f));
    plane1->transform().setTranslation(pVector3(0.0f, -0.6f, 0.0f));
    
    material = PNEW(PMaterial("color.pmt", resMgr));
    material->parameter("color") = pColorRGBA(0.0f, 1.0f, 0.0f, 1.0f);
    geometry = PNEW(PGeometryPlane(resMgr));
    PDrawable *plane2 = PNEW(PDrawable("plane2", this));
    plane2->setMaterial(material);
    plane2->setGeometry(geometry);
    plane2->transform().setScaling(pVector3(0.2f, 0.2f, 1.0f));
    plane2->transform().setTranslation(pVector3(0.0f, 0.0f, 0.0f));
    
    material = PNEW(PMaterial("color.pmt", resMgr));
    material->parameter("color") = pColorRGBA(0.0f, 0.0f, 1.0f, 1.0f);
    geometry = PNEW(PGeometryPlane(resMgr));
    PDrawable *plane3 = PNEW(PDrawable("plane3", this));
    plane3->setMaterial(material);
    plane3->setGeometry(geometry);
    plane3->transform().setScaling(pVector3(0.2f, 0.2f, 1.0f));
    plane3->transform().setTranslation(pVector3(0.0f, 0.6f, 0.0f));

    // -------------------------------------------------------------- 
    // Global post processing effect.
    // -------------------------------------------------------------- 
    PEffectGlow *glow;
    glow = PNEW(PEffectGlow(this));
    glow->setBlendMode(P_EFFECTBLEND_MIX);
    glow->setBlurIterations(1);
    glow->setBlurKernelSize(5);
    glow->setBlurDistance(2);
}