//! render void CCameraSceneNode::render() { core::vector3df pos = getAbsolutePosition(); core::vector3df tgtv = Target - pos; tgtv.normalize(); // if upvector and vector to the target are the same, we have a // problem. so solve this problem: core::vector3df up = UpVector; up.normalize(); f32 dp = tgtv.dotProduct(up); if ( core::equals(core::abs_<f32>(dp), 1.f) ) { up.X += 0.5f; } ViewArea.getTransform(video::ETS_VIEW).buildCameraLookAtMatrixLH(pos, Target, up); ViewArea.getTransform(video::ETS_VIEW) *= Affector; recalculateViewArea(); video::IVideoDriver* driver = SceneManager->getVideoDriver(); if ( driver) { driver->setTransform(video::ETS_PROJECTION, ViewArea.getTransform ( video::ETS_PROJECTION) ); driver->setTransform(video::ETS_VIEW, ViewArea.getTransform ( video::ETS_VIEW) ); } }
//! prerender void CCameraSceneNode::OnRegisterSceneNode() { core::vector3df pos = getAbsolutePosition(); core::vector3df tgtv = Target - pos; tgtv.normalize(); // if upvector and vector to the target are the same, we have a // problem. so solve this problem: core::vector3df up = UpVector; up.normalize(); f32 dp = tgtv.dotProduct(up); if ( core::equals(fabsf(dp), 1.f) ) { up.X += 0.5f; } ViewArea.getTransform(video::ETS_VIEW).buildCameraLookAtMatrixLH(pos, Target, up); ViewArea.getTransform(video::ETS_VIEW) *= Affector; recalculateViewArea(); if ( SceneManager->getActiveCamera () == this ) SceneManager->registerNodeForRendering(this, ESNRP_CAMERA); ISceneNode::OnRegisterSceneNode(); }
//! constructor CCameraSceneNode::CCameraSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, const core::vector3df& position, const core::vector3df& lookat) : ICameraSceneNode(parent, mgr, id, position, core::vector3df(0.0f, 0.0f, 0.0f), core::vector3df(1.0f, 1.0f, 1.0f)), InputReceiverEnabled(true) { #ifdef _DEBUG setDebugName("CCameraSceneNode"); #endif // set default view UpVector.set(0.0f, 1.0f, 0.0f); Target.set(lookat); // set default projection Fovy = core::PI / 2.5f; // Field of view, in radians. Aspect = 4.0f / 3.0f; // Aspect ratio. ZNear = 1.0f; // value of the near view-plane. ZFar = 3000.0f; // Z-value of the far view-plane. video::IVideoDriver* d = mgr->getVideoDriver(); if (d) Aspect = (f32)d->getCurrentRenderTargetSize().Width / (f32)d->getCurrentRenderTargetSize().Height; recalculateProjectionMatrix(); recalculateViewArea(); }
//! constructor CCameraSceneNode::CCameraSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, const core::vector3df& position, const core::vector3df& lookat) : ICameraSceneNode(parent, mgr, id, position), BoundingBox(core::vector3df(0, 0, 0)), // Camera has no size. Still not sure if FLT_MAX might be the better variant Target(lookat), UpVector(0.0f, 1.0f, 0.0f), ZNear(1.0f), ZFar(3000.0f), InputReceiverEnabled(true), TargetAndRotationAreBound(false) { #ifdef _DEBUG setDebugName("CCameraSceneNode"); #endif // set default projection Fovy = core::PI / 2.5f; // Field of view, in radians. const video::IVideoDriver* const d = mgr?mgr->getVideoDriver():0; if (d) Aspect = (f32)d->getCurrentRenderTargetSize().Width / (f32)d->getCurrentRenderTargetSize().Height; else Aspect = 4.0f / 3.0f; // Aspect ratio. ViewArea.setFarNearDistance(ZFar - ZNear); recalculateProjectionMatrix(); recalculateViewArea(); }
void RTSCamera::OnRegisterSceneNode() { vector3df pos = getAbsolutePosition(); vector3df tgtv = Target - pos; tgtv.normalize(); vector3df up = UpVector; up.normalize(); f32 dp = tgtv.dotProduct(up); f32 adp = fabs ( dp ); f32 o = 1; if ( core::equals (adp, o ) ) { up.X += 0.5f; } ViewArea.getTransform(video::ETS_VIEW).buildCameraLookAtMatrixLH(pos, Target, up); ViewArea.getTransform(video::ETS_VIEW) *= Affector; recalculateViewArea(); if( SceneManager->getActiveCamera () == this ) SceneManager->registerNodeForRendering(this, ESNRP_CAMERA); ISceneNode::OnRegisterSceneNode(); }
//! Reads attributes of the scene node. void CCameraSceneNode::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options) { ISceneNode::deserializeAttributes(in, options); Target = in->getAttributeAsVector3d("Target"); UpVector = in->getAttributeAsVector3d("UpVector"); Fovy = in->getAttributeAsFloat("Fovy"); Aspect = in->getAttributeAsFloat("Aspect"); ZNear = in->getAttributeAsFloat("ZNear"); ZFar = in->getAttributeAsFloat("ZFar"); recalculateProjectionMatrix(); recalculateViewArea(); }
RTSCamera::RTSCamera(IrrlichtDevice* devicepointer,ISceneNode* parent,ISceneManager* smgr,s32 id, f32 rs,f32 zs,f32 ts) : ICameraSceneNode(parent,smgr,id,vector3df(1.0f,1.0f,1.0f),vector3df(0.0f,0.0f,0.0f), vector3df(1.0f,1.0f,1.0f)),InputReceiverEnabled(true) { device = devicepointer; BBox.reset(0,0,0); UpVector.set(0.0f, 1.0f, 0.0f); // set default projection Fovy = core::PI / 2.5f; // Field of view, in radians. Aspect = 4.0f / 3.0f; // Aspect ratio. ZNear = 1.0f; // value of the near view-plane. ZFar = 100000.0f; // Z-value of the far view-plane. oldTimeMs = 0; IVideoDriver* d = smgr->getVideoDriver(); if (d) Aspect = (f32)d->getCurrentRenderTargetSize().Width / (f32)d->getCurrentRenderTargetSize().Height; zooming = false; rotating = false; moving = false; translating = false; zoomSpeed = zs; rotateSpeed = rs; translateSpeed = ts; targetMinDistance = 1.0f; targetMaxDistance = 900.0f; Target.set(0.0f,0.0f,0.0f); rotX = 0; rotY = 0; oldTarget = Target; maxRot = 0; atMinDistance = false; atMaxDistance = false; allKeysUp(); allMouseButtonsUp(); recalculateProjectionMatrix(); recalculateViewArea(); smgr->setActiveCamera(this); }
//! Reads attributes of the scene node. void CCameraSceneNode::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options) { ICameraSceneNode::deserializeAttributes(in, options); Target = in->getAttributeAsVector3d("Target"); UpVector = in->getAttributeAsVector3d("UpVector"); Fovy = in->getAttributeAsFloat("Fovy"); Aspect = in->getAttributeAsFloat("Aspect"); ZNear = in->getAttributeAsFloat("ZNear"); ZFar = in->getAttributeAsFloat("ZFar"); TargetAndRotationAreBound = in->getAttributeAsBool("Binding"); if ( in->findAttribute("ReceiveInput") ) InputReceiverEnabled = in->getAttributeAsBool("InputReceiverEnabled"); recalculateProjectionMatrix(); recalculateViewArea(); }
//! constructor CCameraMayaSceneNode::CCameraMayaSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, f32 rs, f32 zs, f32 ts) : CCameraSceneNode(parent, mgr, id), zooming(false), rotating(false), moving(false), translating(false), zoomSpeed(zs), rotateSpeed(ts), translateSpeed(ts), rotateStartX(0.0f), rotateStartY(0.0f), zoomStartX(0.0f), zoomStartY(0.0f), translateStartX(0.0f), translateStartY(0.0f), currentZoom(70.0f), rotX(0.0f), rotY(0.0f) { #ifdef _DEBUG setDebugName("CCameraMayaSceneNode"); #endif Target.set(0.0f, 0.0f, 0.0f); oldTarget = Target; allKeysUp(); recalculateViewArea(); }
//! update void CCameraSceneNode::updateMatrices() { core::vector3df pos = getAbsolutePosition(); core::vector3df tgtv = Target - pos; tgtv.normalize(); // if upvector and vector to the target are the same, we have a // problem. so solve this problem: core::vector3df up = UpVector; up.normalize(); f32 dp = tgtv.dotProduct(up); if ( core::equals(core::abs_<f32>(dp), 1.f) ) { up.X += 0.5f; } ViewArea.getTransform(video::ETS_VIEW).buildCameraLookAtMatrixLH(pos, Target, up); ViewArea.getTransform(video::ETS_VIEW) *= Affector; recalculateViewArea(); }
//! constructor CCameraSceneNode::CCameraSceneNode(ISceneNode * parent, ISceneManager * mgr, s32 id, const core::vector3df & position, const core::vector3df & lookat) : ICameraSceneNode(parent, mgr, id, position), Target(lookat), UpVector(0.0f, 1.0f, 0.0f), ZNear(1.0f), ZFar(3000.0f), InputReceiverEnabled(true), TargetAndRotationAreBound(false) { #ifdef _DEBUG setDebugName("CCameraSceneNode"); #endif // set default projection Fovy = core::PI / 2.5f; // Field of view, in radians. const video::IVideoDriver * const d = mgr ? mgr->getVideoDriver() : 0; if (d) Aspect = (f32)d->getCurrentRenderTargetSize().Width / (f32)d->getCurrentRenderTargetSize().Height; else { Aspect = 4.0f / 3.0f; } // Aspect ratio. recalculateProjectionMatrix(); recalculateViewArea(); }
//! prerender void CCameraSceneNode::OnPreRender() { video::IVideoDriver* driver = SceneManager->getVideoDriver(); if (!driver) return; if (SceneManager->getActiveCamera() == this) { screenDim.Width = (f32)driver->getScreenSize().Width; screenDim.Height = (f32)driver->getScreenSize().Height; driver->setTransform(video::ETS_PROJECTION, Projection); // if upvector and vector to the target are the same, we have a // problem. so solve this problem: core::vector3df pos = getAbsolutePosition(); core::vector3df tgtv = Target - pos; tgtv.normalize(); core::vector3df up = UpVector; up.normalize(); f32 dp = tgtv.dotProduct(up); if ((dp > -1.0001f && dp < -0.9999f) || (dp < 1.0001f && dp > 0.9999f)) up.X += 1.0f; View.buildCameraLookAtMatrixLH(pos, Target, up); recalculateViewArea(); SceneManager->registerNodeForRendering(this, ESNRP_LIGHT_AND_CAMERA); } if (IsVisible) ISceneNode::OnPreRender(); }