void MyScene::pan(pfloat32 deltaAngle) { deltaAngle = deltaAngle * P_PI / 180.0f; PCamera *camera = mainCamera(); pfloat32 y = camera->transform().rotationY(); camera->transform().setRotationY(y + deltaAngle); }
void MyScene::yaw(pfloat32 deltaAngle) { deltaAngle = deltaAngle * P_PI / 180.0f; PCamera *camera = mainCamera(); pfloat32 x = camera->transform().rotationX(); camera->transform().setRotationX(x + deltaAngle); }
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(); }
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(); } } }
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)); }
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)); }
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); }