Exemplo n.º 1
0
void CameraManager::next() { 
	for(int i = 0; i<cameras.size(); i++) { 
		CameraWrapper * currentCamera = cameras[i]; 
		if(currentCamera == camera) {
			if(i==cameras.size()-1) {
				changeCamera(cameras[0]);
			} else { 
				changeCamera(cameras[i+1]); 
			}
			break; 
		}
	}
}
Exemplo n.º 2
0
Arquivo: main.cpp Projeto: Pinkii-/IDI
void reset() {
    dist = s.radio*4;
    rotateX = rotateY = 45;
    rotateZ = 0;
    zoom = 1;
    changeCamera(Perspective);
}
Exemplo n.º 3
0
/*
 * BOUCLE D'AFFICHAGE
 */
bool SceneManager::execute(SDL_Window* window, unsigned int w, unsigned int h)
{
  init3D(w,h);
  init2D();
  initSounds();
  unsigned int debut ,fin;							  	/* VARIABLES DE GESTION DU TEMPS */
  float period = 1.0 / FPS_LIMIT,fps,time;
  while(!m_input.terminer())								/* BOUCLE D'EXECUTION */
  {
    debut = SDL_GetTicks();								/* ON RELEVE LE TEMPS DE DEBUT DE BOUCLE */
    onPreRender();									/* ON MET À JOUR LES MODELES DYNAMIQUES */
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);					/* NETTOYAGE DE LA FENETRE */
    m_input.update();									/* MISE A JOUR DES EVENEMENTS */
    updateCameras();									/* MISE À JOUR DES CAMERAS */
    if(m_input.getKey(SDL_SCANCODE_ESCAPE))  break;					/* QUITTER EN APPUYANT SUR ESPACE */
    if(m_input.getKeyRelease(SDL_SCANCODE_V)) changeCamera();					/* CHANGER DE CAMERA EN APPUYANT SUR ESPACE */
    if(m_input.getKeyRelease(SDL_SCANCODE_SPACE)) m_soundMgr.playEffect("laser",127/2);
    drawAll();										/* AFFICHAGE DE TOUS LES MODELES DU MONDE 3D */
    SDL_GL_SwapWindow(window);								/* RAFRAICHISSEMENT DE LA FENETRE */    
    fin = SDL_GetTicks();								/* ON RELEVE LE TEMPS DE FIN DE BOUCLE */
    time = (float)(fin - debut);							/* ON CALCULE LE TEMPS D'EXECUTION DE LA BOUCLE */
    fps = 1000.0/time;									/* ON CALCULE LA FREQUENCE MAXIMALE */
    std::ostringstream streamTitle;
    streamTitle << "fps: " << fps;							
    SDL_SetWindowTitle(window,streamTitle.str().c_str());				/* ON AFFICHE LA FREQUENCE COMME TITRE DE LA FENETRE */
    if(time < period)
      SDL_Delay((unsigned int)(period - time));  					/* ON LIMITE LA FREQUENCE A 60 FPS */
  }
  printf("toto\n");
  return true;
}
Exemplo n.º 4
0
CameraProperty::CameraProperty(const CameraProperty& rhs)
    : CompositeProperty(rhs)
    , cameraType_(rhs.cameraType_)
    , lookFrom_(rhs.lookFrom_)
    , lookTo_(rhs.lookTo_)
    , lookUp_(rhs.lookUp_)
    , aspectRatio_(rhs.aspectRatio_)
    , nearPlane_(rhs.nearPlane_)
    , farPlane_(rhs.farPlane_)
    , mouseChangeFocusPoint_(rhs.mouseChangeFocusPoint_)
    , adjustCameraOnDataChange_(rhs.adjustCameraOnDataChange_)
    , camera_()
    , inport_(rhs.inport_)
    , data_(nullptr)
    , prevDataToWorldMatrix_(0) 

{
    // Make sure that the Camera) is
    // in sync with the property values.
    addProperty(cameraType_);
    cameraType_.onChange([&]() {
        changeCamera(InviwoApplication::getPtr()->getCameraFactory()->create(cameraType_.get()));
    });

    lookFrom_.onChange([&]() { camera_->setLookFrom(lookFrom_.get()); });
    lookTo_.onChange([&]() { camera_->setLookTo(lookTo_.get()); });
    lookUp_.onChange([&]() { camera_->setLookUp(lookUp_.get()); });
    addProperty(lookFrom_);
    addProperty(lookTo_);
    addProperty(lookUp_);
    aspectRatio_.onChange([&]() { camera_->setAspectRatio(aspectRatio_.get()); });
    nearPlane_.onChange([&]() { camera_->setNearPlaneDist(nearPlane_.get()); });
    farPlane_.onChange([&]() { camera_->setFarPlaneDist(farPlane_.get()); });
    addProperty(aspectRatio_);
    addProperty(nearPlane_);
    addProperty(farPlane_);
    addProperty(mouseChangeFocusPoint_);

    adjustCameraOnDataChange_.onChange([&]() { resetAdjustCameraToData(); });
    addProperty(adjustCameraOnDataChange_);

    changeCamera(InviwoApplication::getPtr()->getCameraFactory()->create(cameraType_.get()));

    if (inport_) inport_->onChange(this, &CameraProperty::inportChanged);

    inportChanged();
}
Exemplo n.º 5
0
void CameraProperty::set(const Property* srcProperty) {
    if (const auto cameraSrcProp = dynamic_cast<const CameraProperty*>(srcProperty)) {
        if (!camera_->update(cameraSrcProp->camera_.get())) {
            // update failed, make a clone
            changeCamera(std::unique_ptr<Camera>(cameraSrcProp->camera_->clone()));
        }
        CompositeProperty::set(static_cast<const CompositeProperty*>(srcProperty));
    }
}
void HumanPlayer::controlRobotAt(int index)
{
	selectRobotView(robots.at(0));
	changeCamera(CAMERA_ROBOT);

	selectRobot(index);
	aRobotIsSelected = true;
	robots.at(0)->isRobotBeingControlled = true;
}
Exemplo n.º 7
0
bool CameraManager:: changeCamera(string camname) { 
	for(int i = 0; i<cameras.size(); i++) { 
		CameraWrapper * cam = cameras[i]; 
		if(cam->name == camname) { 
			changeCamera(cam); 
			return true; 
		}
	}
	return false; 
	
}
Exemplo n.º 8
0
void End::update()
{
    // timer for each 1 second
	if (ofGetElapsedTimeMillis() - getSharedData().lastUpdate > 1000)
	{
		getSharedData().counter++;
		getSharedData().lastUpdate = ofGetElapsedTimeMillis();
        
        if (getSharedData().counter > 5) {
            init();
            changeCamera(getSharedData().qrcodeCamId);
            changeState("Start");
        }
    }
}
Exemplo n.º 9
0
CameraProperty& CameraProperty::operator=(const CameraProperty& that) {
    if (this != &that) {
        CompositeProperty::operator=(that);
        changeCamera(std::unique_ptr<Camera>(that.camera_->clone()));

        if (inport_) inport_->removeOnChange(this);
        inport_ = that.inport_;
        if (inport_) inport_->onChange(this, &CameraProperty::inportChanged);
        data_ = nullptr;
        prevDataToWorldMatrix_ = mat4(0);
        updatePropertyFromValue();

        inportChanged();
    }
    return *this;
}
void HumanPlayer::lockRobotAndUfo(){
	V3 ufoPos = ufo->getPosition();
	if(!robotUfoLock && ufo->ufoCollisionTest(ufoPos.x,ufoPos.y-0.1f,ufoPos.z) > 0){
		controlRobotAt(0);
		//searched for robot being collided with and finds index in vector
		for(int i = 0; i < (int)robots.size(); i++){
			if(robots.at(i)->getRobotId() == ufo->ufoCollisionTest(ufoPos.x,ufoPos.y-0.05f,ufoPos.z)){
				//input vector index to control that robot
				controlRobotAt(i);
			}
		}
		robotUfoLock = true;
	}
	else{
		changeCamera(CAMERA_FOLLOW);
		robots.at(0)->isRobotBeingControlled = false;
		robotUfoLock = false;
	}
}
Exemplo n.º 11
0
Arquivo: main.cpp Projeto: Pinkii-/IDI
void init() {
    modelos = std::vector<Model>(qttModels);
    loadedModels = std::vector<bool>(qttModels,false);
    balas = std::vector<Bala>(0);
    patricio1 = Muneco(kpatricio,1,Vector3f(0,0,0));
    patricio2 = Muneco(patricio,1.5,Vector3f(2.5,0,2.5));
    speed = 0.1;
    direccionPatricio = -90;
//    textCamera = "fps";
    showing = sFill;
    textShow = "Fill";
    r = g = 1;
    b = a = 0.8;
    monigote = 0.5;
    sferaVisible = false;
    wallVisible = true;
    reset();
    changeCamera(Fps);
    updateCamera();
    glEnable(GL_NORMALIZE);

}
Exemplo n.º 12
0
void Player::event(sf::Event event) {
    switch (event.type) {
        case sf::Event::KeyPressed: {
            switch (event.key.code) {
                case sf::Keyboard::W: upPressed = true; break;
                case sf::Keyboard::A: leftPressed = true; break;
                case sf::Keyboard::D: rightPressed = true; break;
                case sf::Keyboard::S: downPressed = true; break;
                case sf::Keyboard::F: pushEnemy = true; break;
                case sf::Keyboard::V: changeCamera(); break;
                case sf::Keyboard::Left: rotLeftPressed = true; break;
                case sf::Keyboard::Right: rotRightPressed = true; break;
                case sf::Keyboard::Space: generateCrack(); break;
                default: break;
            }
        } break;
        case sf::Event::KeyReleased: {
            switch (event.key.code) {
                case sf::Keyboard::W: upPressed = false; break;
                case sf::Keyboard::A: leftPressed = false; break;
                case sf::Keyboard::D: rightPressed = false; break;
                case sf::Keyboard::S: downPressed = false; break;
                case sf::Keyboard::Left: rotLeftPressed = false; break;
                case sf::Keyboard::Right: rotRightPressed = false; break;
                default: break;
            }
        } break;
        case sf::Event::MouseMoved: {
            unsigned int xMiddle = window->getSize().x / 2;
            unsigned int yMiddle = window->getSize().y / 2;
            if (event.mouseMove.x != int(xMiddle) || event.mouseMove.y != int(yMiddle)) {
                xDeltaMouse = event.mouseMove.x - xMiddle;
                yDeltaMouse = event.mouseMove.y - yMiddle;
                sf::Mouse::setPosition(sf::Vector2i(xMiddle, yMiddle), *window);
            }
        } break;
        default: break;
    }
}
Exemplo n.º 13
0
void GameProcess::Update() {

	//cout << "Timer" << endl;
	restartSnake();
	pastX = snake[num - 1].x;
	pastY = snake[num - 1].y;
	for (int i = num; i > 0; --i) {
		snake[i].x = snake[i - 1].x;
		snake[i].y = snake[i - 1].y;
	}
	if (dir == 0)
		snake[0].y += 1;
	if (dir == 1)
		snake[0].x += 1;
	if (dir == 2)
		snake[0].y -= 1;
	if (dir == 3)
		snake[0].x -= 1;

	if (snake[0].x > N - 1)
		snake[0].x = 0;
	if (snake[0].x < 0)
		snake[0].x = N - 1;
	if (snake[0].y > M - 1)
		snake[0].y = 0;
	if (snake[0].y < 0)
		snake[0].y = M - 1;

	checkIntersects();
	//changeCamera();
	cout << "Camera x: " << camera->getPosition().x << " "
			<< camera->getPosition().y << " " << camera->getPosition().z
			<< endl;
	changeCamera();
	//cout << "EAT " << eat.x << " " << eat.y << endl;

}
Exemplo n.º 14
0
//--------------------------------------------------------------
void End::keyPressed(int key){
    switch (key) {
        case 'a':
            init();
            changeState("Print");
            break;
            
        case 's':
            init();
            changeCamera(getSharedData().qrcodeCamId);
            changeState("Start");
            break;
            
        case ' ':
            _count++;
            if(_count > 2){
                _count = 0;
            }
            break;
            
        default:
            break;
    }
}
void ImageViewer::updateCameraandImages()
{
    // 关闭所有灯
    changeCamera("", false);

    // 打开灯
    QString cameraindex = ui->cam1->itemText(tmpUpdateCameraImage_cam1index);
    //qDebug() << uicameraindex << cameraindex;
    changeCamera(cameraindex, true);
    cameraindex = ui->cam1->itemText(tmpUpdateCameraImage_cam2index);
    changeCamera(cameraindex, true);
    cameraindex = ui->cam1->itemText(tmpUpdateCameraImage_cam3index);
    changeCamera(cameraindex, true);
    cameraindex = ui->cam1->itemText(tmpUpdateCameraImage_cam4index);
    changeCamera(cameraindex, true);
    cameraindex = ui->cam1->itemText(tmpUpdateCameraImage_cam5index);
    changeCamera(cameraindex, true);

    setCamerasCurrentFCs(current_fc_master);
    updateImages();
}
Exemplo n.º 16
0
void End::mousePressed(int x, int y, int button)
{
    init();
    changeCamera(getSharedData().qrcodeCamId);
	changeState("Start");
}
/**
 * 构造函数传入WorkingStatus status初始化界面
 * @param newsinglewidgetapp 是否为单一界面程序(采集程序有可能为单一界面程序,其结束方式与复界面程序不用) @see closeEvent方法
 * @param status 工作状态,@see status.h
 * Collecting = 1 采集时
 * Calculating_Backuping = 5 计算备份同时进行
 */
MainWidget::MainWidget(bool newsinglewidgetapp, WorkingStatus initstatus, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MainWidget)
{
    ui->setupUi(this);

    // 初始化结束方式
    singlewidgetapp = newsinglewidgetapp;

    // 初始化工作状态
    workingstatus = initstatus;

    // 初始时采集工程文件名为空
    projectfilename = "";

    // 默认用户不知道是谁
    currentusername = "******";

    // 在主界面连接主控底层服务信号槽
    connect(MasterProgram::getMasterProgramInstance(), SIGNAL(makeGUIActive(WorkingStatus, bool)), this, SLOT(msgToGUICreateProjectWidget(WorkingStatus, bool)));
    connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalMsgToGUI(WorkingStatus, QString)), this, SLOT(appendMsg(WorkingStatus, QString)));
    connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalErrorToGUI(WorkingStatus, QString)), this, SLOT(appendError(WorkingStatus, QString)));
    // [采集转发消息]
    connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalToLights(HardwareType, QString, HardwareStatus)), this, SLOT(changeHardwareStatus(HardwareType, QString, HardwareStatus)));
    connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalToCameraFC(QString, qint64)), this, SLOT(changeCameraFC_slot(QString, qint64)));
    // [采集、计算、备份转发消息]
    connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalToCameraTask(WorkingStatus, QString, int, QString, QString)), this, SLOT(changeSlaveCameraTask_slot(WorkingStatus, QString, int, QString, QString)));
    // [计算转发消息]
    // 每个从控每个线程每个任务帧号反馈消息转发
    connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalToCameraTaskFC(WorkingStatus, QString, int, QString, long long)), this, SLOT(changeSlaveCameraTaskFC_slot(WorkingStatus, QString, int, QString, long long)));
    // 每个从控每个线程每个任务初始化界面(起始帧、终止帧)消息转发
    connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalToSlaveCameraTaskFC_init(WorkingStatus, QString, int, QString, long long, long long)), this, SLOT(changeSlaveCameraTaskFC_init_slot(WorkingStatus, QString, int, QString, long long, long long)));
    // [计算备份转发消息]
    connect(MasterProgram::getMasterProgramInstance(), SIGNAL(calcubackupProgressingBar(WorkingStatus, QString, int, int, int, bool)), this, SLOT(changecalcubackupProgressingBar_slot(WorkingStatus, QString, int, int, int, bool)));
    
    connect(MasterProgram::getMasterProgramInstance(), SIGNAL(turnOffAllHardware()), this, SLOT(turnOffLights()));
    //connect(MasterProgram::getMasterProgramInstance(), SIGNAL(makeGUIActive(bool)), this, SLOT(getCalcuBackupGUIActive(bool)));

    // 重启服务器按钮信号槽
    connect(ui->restartServerButton, SIGNAL(clicked()), this, SLOT(restartServer()));
    // 关闭服务器
    connect(ui->closeServerButton, SIGNAL(clicked()), this, SLOT(closeServer()));
 
    // 初始时关闭所有提示灯
    turnOffLights();
    // 开启网络连接从控计算机提示灯
    initConnectedSlaves();

    /******设置采集机、备份机、相机的状态,正常或者不正常**********/
    //   statuscollectmessage为从控机发送过来的采集机和备份机的状态信息,如0表示正常,则显示为黄色,1表示异常,则显示为红色。
    //     if 采集机异常
    //     ui->slave1Label_net->setPixmap(QPixmap(":/image/lightred.png"));

    this->setWindowTitle(QObject::tr("铁路隧道建筑限界测量系统-主控终端"));
    QIcon icon;
    icon.addFile(QString::fromUtf8(":image/icon.png"), QSize(), QIcon::Normal, QIcon::Off);
    this->setWindowIcon(icon);

    // 功能,设置小图标变灰
    ui->collectstatuslabel->setPixmap(QString::fromUtf8(":image//collectstatus1_2.png"));
    ui->backupstatuslabel->setPixmap(QString::fromUtf8(":image//up_alt_2.png"));
    ui->calculatestatuslabel->setPixmap(QString::fromUtf8(":image//Calculatorstatus1_2.png"));

    // 导入已有工程、创建新工程界面
    CreateProjectWidget * cpwidget = new CreateProjectWidget(workingstatus, ui->createprojwidget);
    connect(cpwidget, SIGNAL(sendproject_file_name(QString)), this, SLOT(slotprojectfilename(QString)));
    connect(this, SIGNAL(setCreateProjectWidgetEnabled(bool)), cpwidget, SLOT(setWidgetEnabled(bool)));

    // @author 范翔 3个界面合二为一之后,关闭重启服务器两个按钮无效
    ui->closeServerButton->setVisible(false);
    ui->restartServerButton->setVisible(false);

    if (workingstatus == Collecting)
    {        
        // Tab界面布局
        // ui->gridLayout_5是整个Window的最外层布局Layout。可从.ui文件中找出
        ui->gridLayout_5->addWidget(ui->page, 4, 0);
        CollectWidget * collectWidget = new CollectWidget(ui->page, MasterSetting::getSettingInstance()->getDefaultDistanceMode());

        QGridLayout *layout5 = new QGridLayout();
        layout5->addWidget(collectWidget);
        ui->page->setLayout(layout5);

        // 得到帧间隔里程
        connect(this, SIGNAL(sendproject_file_name(QString)), collectWidget,SLOT(getDistanceMode(QString)));

        // 界面信号槽
        connect(this, SIGNAL(changeCameraStatus(QString,HardwareStatus)), collectWidget, SLOT(changeCamera(QString, HardwareStatus)));
        connect(this, SIGNAL(changeLayserStatus(QString,HardwareStatus)), collectWidget, SLOT(changeLayser(QString, HardwareStatus)));
        connect(this, SIGNAL(changeCameraFC(QString,qint64)), collectWidget, SLOT(changeCameraFC(QString, qint64)));
        connect(this, SIGNAL(changeSlaveCameraTask(WorkingStatus, QString, int, QString, QString)), collectWidget, SLOT(changeCameraTask(WorkingStatus, QString, int, QString, QString)));
        connect(this, SIGNAL(turnOffAllHardware()), collectWidget, SLOT(turnOffHardwares()), Qt::DirectConnection);

        collectWidget->turnOffHardwares();

        // 【标记1】此处作废
        // 因为有master的单一实例模式+各种对应方法,此处无需接受底层界面发送的消息了,因为底层界面可以直接调用各类主控方法
        //connect(calcuWidget,SIGNAL(clicked111()),this,SLOT(sendToMaster(QString)));

        // 可以导入已有、创建新工程
        connect(ui->operationConfigButton, SIGNAL(clicked()), this, SLOT(configCurrentOperation()));
        connect(ui->operationConfigButton2, SIGNAL(clicked()), this, SLOT(configCurrentOperation2()));

        // 初始时的界面显示
        ui->page->setVisible(true);

        // projectclass
        projectclass = LzProjectClass::Collect;
        projectclassstr = "collect";
    }
Exemplo n.º 18
0
Arquivo: main.cpp Projeto: Pinkii-/IDI
void teclado(unsigned char c, int x, int y) {
    (void)x;(void)y;
    switch (c) {
    case 27:
        glutExit();
        break;
    case 'h':
        help; //Nesisito aiuda amiho servesa bier
        std::cout << "You can see the state of the camera type on the up left corner." << std::endl;
        std::cout << "Press H to display the help(lolol)" << std::endl;
        std::cout << "Press R to reset the camera" << std::endl;
        std::cout << "Press P to switch between perspective and ortho camera" << std::endl;
        std::cout << "Press C to switch between first person camera and third person camera" << std::endl;
        std::cout << "Press WASD to move the Patricio" << std::endl;
        std::cout << "Press Z or X to increment/decrement the speed of the Patricio" << std::endl;
        std::cout << "Press V to make the walls visible/invisible" << std::endl;
        std::cout << "Press B to make the sfere of the scene visible/invisible" << std::endl;
        std::cout << "Press M to switch the model of the main character" << std::endl;
        std::cout << "Press O to change the polygon mode" << std::endl;
        std::cout << "Press Space to unleash the hidden and destructive power of the Killer Patricio" << std::endl;
        std::cout << std::endl;
        break;
    case 'w':
        patricio1.posFinal = patricio1.posFinal + Vector3f(sin(direccionPatricio*M_PI/180)*speed,0,cos(direccionPatricio*M_PI/180)*speed);
        updateCamera(); // Por si el patricio se ha salido de la esfera i ase iorar al ninio jisus
        glutPostRedisplay();
        break;
    case 's':
        patricio1.posFinal = patricio1.posFinal - Vector3f(sin(direccionPatricio*M_PI/180)*speed,0,cos(direccionPatricio*M_PI/180)*speed);
        updateCamera(); // Por si el patricio se ha salido de la esfera i ase iorar al ninio jisus
        glutPostRedisplay();
        break;
    case 'a':
        direccionPatricio += 2.5;
        if (fps) updateCamera();
        else glutPostRedisplay();
        break;
    case 'd':
        direccionPatricio -= 2.5;
        if (fps) updateCamera();
        else glutPostRedisplay();
        break;
    case 'z':
        speed += 0.03;
        break;
    case 'x':
        speed -= 0.03; if (speed < 0) speed = 0;
        break;
    case 'r':
        reset();
        glutPostRedisplay();
        break;
    case 'c':
        fps = not fps;
        if (fps) changeCamera(Fps);
        else changeCamera(ortho ? Ortho : Perspective);
        updateCamera();
        break;
    case 'p':
        if (cameraState != Fps) changeCamera(CameraType((cameraState+1)%(qttCameraType-1)));
        updateCameraType();
        break;
    case 'o':
        changeShowing(Showing((showing+1)%qttShowing));
        break;
    case 'm':
        patricio1.changeModel(Models((patricio1.name+1)%qttModels));
        glutPostRedisplay();
        break;
    case 'v':
        wallVisible = not wallVisible;
        glutPostRedisplay();
        break;
    case 'b':
        sferaVisible = not sferaVisible;
        glutPostRedisplay();
        break;
    case ' ':
        balas.push_back(Bala(patricio1.posFinal,direccionPatricio));
        break;
    default:
        break;
    }
}
Exemplo n.º 19
0
CameraProperty::CameraProperty(std::string identifier, std::string displayName, vec3 eye,
                               vec3 center, vec3 lookUp, Inport* inport,
                               InvalidationLevel invalidationLevel, PropertySemantics semantics)
    : CompositeProperty(identifier, displayName, invalidationLevel, semantics)
    , cameraType_("cameraType", "Camera Type",
                  []() {
                      std::vector<OptionPropertyStringOption> options;
                      for (auto& key : InviwoApplication::getPtr()->getCameraFactory()->getKeys()) {
                          options.emplace_back(key, key, key);
                      }
                      return options;
                  }(),
                  0)
    , lookFrom_("lookFrom", "Look from", eye, -vec3(100.0f), vec3(100.0f), vec3(0.1f),
                InvalidationLevel::InvalidOutput, PropertySemantics("Spherical"))
    , lookTo_("lookTo", "Look to", center, -vec3(100.0f), vec3(100.0f), vec3(0.1f))
    , lookUp_("lookUp", "Look up", lookUp, -vec3(100.0f), vec3(100.0f), vec3(0.1f))
    , aspectRatio_("aspectRatio", "Aspect Ratio", 1.0f, 0.01f, 100.0f, 0.01f)
    , nearPlane_("near", "Near Plane", 0.1f, 0.001f, 10.f, 0.001f)
    , farPlane_("far", "Far Plane", 100.0f, 1.0f, 1000.0f, 1.0f)

    , mouseChangeFocusPoint_("mouseChangeFocusPoint", "Change Focus Point",
        new MouseEvent(MouseEvent::MOUSE_BUTTON_LEFT, InteractionEvent::MODIFIER_NONE,
            MouseEvent::MOUSE_STATE_DOUBLE_CLICK),
        new Action(this, &CameraProperty::changeFocusPoint))

    , adjustCameraOnDataChange_("fitToBasis_", "Adjust camera on data change", true)

    , camera_()
    , inport_(inport)
    , data_(nullptr)
    , prevDataToWorldMatrix_(0) {
    // Make sure that the Camera) is
    // in sync with the property values.
    cameraType_.setSelectedIdentifier("PerspectiveCamera");
    cameraType_.setCurrentStateAsDefault();
    addProperty(cameraType_);
    cameraType_.onChange([&]() {
        changeCamera(InviwoApplication::getPtr()->getCameraFactory()->create(cameraType_.get()));
    });

    lookFrom_.onChange([&]() { camera_->setLookFrom(lookFrom_.get()); });
    lookTo_.onChange([&]() { camera_->setLookTo(lookTo_.get()); });
    lookUp_.onChange([&]() { camera_->setLookUp(lookUp_.get()); });
    addProperty(lookFrom_);
    addProperty(lookTo_);
    addProperty(lookUp_);
    aspectRatio_.onChange([&]() { camera_->setAspectRatio(aspectRatio_.get()); });
    nearPlane_.onChange([&]() { camera_->setNearPlaneDist(nearPlane_.get()); });
    farPlane_.onChange([&]() { camera_->setFarPlaneDist(farPlane_.get()); });
    addProperty(aspectRatio_);
    addProperty(nearPlane_);
    addProperty(farPlane_);
    addProperty(mouseChangeFocusPoint_);

    adjustCameraOnDataChange_.onChange([&]() { resetAdjustCameraToData(); });
    addProperty(adjustCameraOnDataChange_);

    changeCamera(InviwoApplication::getPtr()->getCameraFactory()->create(cameraType_.get()));

    if (inport_) inport_->onChange(this, &CameraProperty::inportChanged);
}