void cameraInitialize(GLCamera *theCam, WindowPtr winPtr)
{
    Rect winPort;
    GLdouble viewparms[] = {-0.5, 0.5, 		// Left Right
			    -0.5, 0.5, 		// Bottom Top
			    0.5, 100.0};	// zNear zFar
    GLdouble *viewVol = theCam->viewVolume;
    
    GetWindowBounds(winPtr, kWindowContentRgn, &winPort);
    theCam->w = winPort.right - winPort.left;
    theCam->h = winPort.bottom - winPort.top;

    theCam->aspectRatio = theCam->h / theCam->w;
    theCam->fov = 3.141517/2; // pi/2
    theCam->hFrac = tan(theCam->fov * 0.5);
    theCam->vFrac = tan(theCam->fov * 0.5 * theCam->aspectRatio);

    glViewport(0, 0, (GLsizei) theCam->w, (GLsizei) theCam->h);

    cameraSetViewParameters(theCam, viewparms);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    cameraMove(theCam, 0.0, 0.0, -4.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
#if 1
//USE_PERSPECTIVE
   glFrustum(viewVol[0], viewVol[1], viewVol[2], viewVol[3], viewVol[4], viewVol[5]);
#else
    glOrtho(viewVol[0], viewVol[1], viewVol[2], viewVol[3], viewVol[4], viewVol[5]);
#endif
    glMatrixMode(GL_MODELVIEW);
}
Exemple #2
0
int main (int argc, char **argv)
{
	if( Import3DS(myModel, argv[1]) == false ){
//		printf("Error: import 3ds file failed");
//		exit(0);
		inputModel = false;
	}

	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize(600, 600);
	glutInitWindowPosition(100, 70);
	glutCreateWindow("Model Viewer (Lighting & texture mapping) Bo CHEN");
	DrawInit();
	init();
	cameraMove();

	glutDisplayFunc(DisplayFunc);
	glutIdleFunc(IdleFunc);

	glutKeyboardFunc(keyboard);  /* set keyboard handler */
	glutSpecialFunc(ProcessArrowKey);
	glutMouseFunc(ProcessMouse);
	glutMotionFunc(ProcessMouseMotion);
	glutMainLoop();
	return 0;
}
void IIRenderWindow::keyPressEvent(QKeyEvent * event)
{
    switch(event->key())
    {
                case Qt::Key_W:
        {
            mTranslateVector.z=-1;
            break;
        }
                case Qt::Key_S:
        {
            mTranslateVector.z=1;
            break;
        }
                case Qt::Key_A:
        {
            mTranslateVector.x=-1;
            break;
        }
                case Qt::Key_D:
        {
            mTranslateVector.x=1;
            break;
        }
                case Qt::Key_Q:
        {
            mTranslateVector.y=1;
            break;
        }
                case Qt::Key_E:
        {
            mTranslateVector.y=-1;
            break;
        }
                case Qt::Key_H:
        {
            mCamera->setPosition( 40, 300, 580 );
            break;
        }
    }
    QString x;
    x.setNum(mCamera->getPosition().x);
    QString y;
    y.setNum(mCamera->getPosition().y);
    QString z;
    z.setNum(mCamera->getPosition().z);
    mCameraLable->setText("Camera:"+x+","+y+","+z);

	emit cameraMove(mCamera->getPosition().x,mCamera->getPosition().y,mCamera->getPosition().z);
}
Exemple #4
0
static void CG_DemosUpdatePlayer( void ) {
	demo.oldcmd = demo.cmd;
	trap_GetUserCmd( trap_GetCurrentCmdNumber(), &demo.cmd );
	demoMoveUpdateAngles();
	demoMoveDeltaCmd();

	if ( demo.seekEnabled ) {
		int delta;
		demo.play.fraction -= demo.serverDeltaTime * 1000 * demo.cmdDeltaAngles[YAW];
		delta = (int)demo.play.fraction;
		demo.play.time += delta;
		demo.play.fraction -= delta;
	
		if (demo.deltaRight) {
			int interval = mov_seekInterval.value * 1000;
			int rem = demo.play.time % interval;
			if (demo.deltaRight > 0) {
                demo.play.time += interval - rem;
			} else {
                demo.play.time -= interval + rem;
			}
			demo.play.fraction = 0;
		}
		if (demo.play.fraction < 0) {
			demo.play.fraction += 1;
			demo.play.time -= 1;
		}
		if (demo.play.time < 0) {
			demo.play.time = demo.play.fraction = 0;
		}
		return;
	}
	switch ( demo.editType ) {
	case editCamera:
		cameraMove();
		break;
	case editChase:
		demoMoveChase();
		break;
	case editDof:
		dofMove();
		break;
	case editEffect:
		demoEffectMove();
		break;
	case editLine:
		demoMoveLine();
		break;
	}
}
Exemple #5
0
void loop() {
  while(action!='s'){while(getChar(action));};
  //confirm here
  while(1){
    if(getChar(action)){
      if(action=='a')cameraMove(0,1);
      if(action=='d')cameraMove(0,-1);
      if(action=='w')cameraMove(1,0);
      if(action=='x')cameraMove(-1,0);
      if(action=='q')cameraMove(1,1);
      if(action=='e')cameraMove(1,-1);
      if(action=='z')cameraMove(-1,1);
      if(action=='c')cameraMove(-1,-1);
    }
  }
  //confirm here
}
Exemple #6
0
//
// Callbacks
//
void DisplayFunc() 
{
	/* Implement zoom in and out with mose right button is pressed */
	if( (zoomIn == true) && (cameraZoom > 50) ){
		cameraZoom--;
		zoomIn = false;
		glPushMatrix();  // To preserve the matrix of rotation 
		init();
		cameraMove();
		glPopMatrix();
	}
	if( (zoomOut == true) && (cameraZoom < 180) ){
		cameraZoom++;
		zoomOut = false;
		glPushMatrix(); 
		init();
		cameraMove();
		glPushMatrix(); 
	}
	
	/* Implement camera rotation */
	if( (leftButton == true) ){
		if( leftRotation == true ){
			cameraPosX += 0.08;
		}
		
		if( rightRotation == true){
			cameraPosX -= 0.08;
		}
		
		if( upRotation == true){
			cameraPosY += 0.08;
		}
		if( downRotation == true){
			cameraPosY -= 0.08;
		}
		init();
		cameraMove();
		cameraRotate = false;
	}
	
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
//	glMatrixMode(GL_MODELVIEW);
//	glMatrixMode(GL_PROJECTION);
//	glLoadIdentity();
	DisplayAxes();
//	glPopMatrix();
	glPushMatrix();

	/* rotate around x or y axis when arrow key is pressed */
	if( rotateLeftX == true){
//		glPopMatrix();	
//		glPushMatrix();
//		glMatrixMode(GL_MODELVIEW);
//    	glRotatef( 9.0f, 1.0f, 0.0f, 0.0f );
//    	DrawScene();
//    	glPopMatrix();
//    	glMatrixMode(GL_MODELVIEW);
//    	glPushMatrix();
		rotateX = rotateX + 9.0;
    	rotateLeftX = false;
	}
	if( rotateRightX == true){
		rotateX = rotateX - 9.0;
    	rotateRightX = false;		
	}
	if( rotateUpY == true){
		rotateY = rotateY + 9.0;
    	rotateUpY = false;		
	}
	if( rotateDownY == true){
		rotateY = rotateY - 9.0;
    	rotateDownY = false;		
	}
	glRotatef(rotateX, 1.0f, 0.0f, 0.0f );
	glRotatef(rotateY, 0.0f, 1.0f, 0.0f);
	DrawScene();
	glPopMatrix();
	glutSwapBuffers();
}
Exemple #7
0
void GameScene::initGame()
{
    blockVertexShader=new QGLShader(QGLShader::Vertex);
    blockVertexShader->compileSourceFile(QLatin1String(":/res/divinecraft/shader/block.vsh"));
    blockFragmentShader=new QGLShader(QGLShader::Fragment);
    blockFragmentShader->compileSourceFile(QLatin1String(":/res/divinecraft/shader/block.fsh"));
    blockProgram=new QGLShaderProgram;
    blockProgram->addShader(blockVertexShader);
    blockProgram->addShader(blockFragmentShader);
    if(!blockProgram->link()){
        qWarning("Failed to compile and link shader program");
        qWarning("Vertex shader log:");
        qWarning() << blockVertexShader->log();
        qWarning() << blockFragmentShader->log();
        qWarning("Shader program log:");
        qWarning() << blockProgram->log();
        QMessageBox::warning(0,tr("错误"),tr("着色器程序加载失败造成游戏无法正常启动\n"
                                           "请联系开发者寻求解决方案"),QMessageBox::Ok);
        exit(1);
    }

    lineVertexShader=new QGLShader(QGLShader::Vertex);
    lineVertexShader->compileSourceFile(QLatin1String(":/res/divinecraft/shader/line.vsh"));
    lineFragmentShader=new QGLShader(QGLShader::Fragment);
    lineFragmentShader->compileSourceFile(QLatin1String(":/res/divinecraft/shader/line.fsh"));
    lineProgram=new QGLShaderProgram;
    lineProgram->addShader(lineVertexShader);
    lineProgram->addShader(lineFragmentShader);
    if(!lineProgram->link()){
        qWarning("Failed to compile and link shader program");
        qWarning("Vertex shader log:");
        qWarning() << lineVertexShader->log();
        qWarning() << lineFragmentShader->log();
        qWarning("Shader program log:");
        qWarning() << lineProgram->log();
        QMessageBox::warning(0,tr("错误"),tr("着色器程序加载失败造成游戏无法正常启动\n"
                                           "请联系开发者寻求解决方案"),QMessageBox::Ok);
        exit(1);
    }
    ////////////////////////////
    camera=new Camera(QVector3D(0,4,0),QPointF(180.0,0.0));

    world=new World;
    wThread=new QThread;
    world->moveToThread(wThread);
    connect(wThread,SIGNAL(finished()),world,SLOT(deleteLater()));              //线程被销毁的同时销毁world
    connect(this,SIGNAL(reloadWorld()),world,SLOT(forcedUpdateWorld()));                //强制进行世界刷新
    connect(camera,SIGNAL(cameraMove(QVector3D)),world,SLOT(changeCameraPosition(QVector3D)));          //连接camera移动与世界相机位移的槽
    connect(this,SIGNAL(resetRenderLen()),world,SLOT(updateWorld()));
    connect(this,SIGNAL(addBlock()),camera,SLOT(addBlock()));
    connect(this,SIGNAL(removeBlock()),camera,SLOT(removeBlock()));
    connect(world,SIGNAL(loadOver()),this,SLOT(loadOverSlot()));
    wThread->start();

    //    world->setMaxRenderLen(maxRenderLen);
    world->setWorldName("new_world");
    camera->setWorld(world);                                //传递世界指针
    ///////////////////////////
    //这里是一个规定的加载顺序,后步骤会依赖于前步骤
    world->loadBlockIndex();            //加载方块属性列表

    loadTexture();                      //加载纹理
    //======================
    line=new LineMesh(2);           //十字准心
    float lineLen=0.0004;
    line->addLine(QVector3D(-lineLen,0,-0.02),QVector3D(lineLen,0,-0.02));
    line->addLine(QVector3D(0,-lineLen,-0.02),QVector3D(0,lineLen,-0.02));

    lineQua=new LineMesh(12);           //被选方块的包围线框

    //=======================
    //数据面板
    dataPanel=new DataPanel(0,0,200,100);
    addItem(dataPanel);
    glFps=0;
    drawCount=0;
    dataPanel->setRenderLen(maxRenderLen);
    connect(camera,SIGNAL(getPositions(QVector3D,QVector3D)),this,SLOT(dataShowPosition(QVector3D,QVector3D)));
    //    dataPanel->hide();
    //背包物品栏
    backPackBar=new BackPackBar(this);
    hideBackPackBar();
    backPackBar->setWorld(world);               //传递world指针
    //物品栏
    itemBar=new ItemBar(this);
    connect(itemBar,SIGNAL(thingIndexChange(int)),camera,SLOT(setBlockId(int)));
    backPackBar->setPocket(itemBar);
    //=======================
    //消息面板
    messagePanel=new MessagePanel;
    addItem(messagePanel);
    //===========================
    //选项菜单
    opWidget=new OptionsWidget();
    opWidgetProxy=new QGraphicsProxyWidget(0);
    opWidgetProxy->setWidget(opWidget);
    this->addItem(opWidgetProxy);
    opWidgetProxy->hide();
    inOpWidget=false;

    connect(opWidget,SIGNAL(continueGame()),this,SLOT(continueGame()));
    connect(opWidget,SIGNAL(mouseLevelValueChange(int)),camera,SLOT(setMouseLevel(int)));
    connect(opWidget,SIGNAL(renderValueChange(int)),this,SLOT(setRenderLen(int)));
    connect(opWidget,SIGNAL(quitClick()),gView,SLOT(close()));
    //=============================
    loadSettings();
    camera->loadPosRot();                                   //加载位置视角信息
    setRenderLen(maxRenderLen);                     //设置渲染距离并刷新整个世界
    opWidget->setRenderLen(maxRenderLen);
    opWidget->setMouseLevel(camera->getMouseLevel());
}
Exemple #8
0
static int demoSetupView( void) {
	vec3_t forward;
	int inwater = qfalse;
	qboolean behindView = qfalse;
	int contents;

	cg.playerPredicted = qfalse;
	cg.playerCent = 0;
	demo.viewFocus = 0;
	demo.viewTarget = -1;

	switch (demo.viewType) {
	case viewChase:
		if ( demo.chase.cent && demo.chase.distance < mov_chaseRange.value ) {
			centity_t *cent = demo.chase.cent;
			
			if ( cent->currentState.number < MAX_CLIENTS ) {
				cg.playerCent = cent;
				cg.playerPredicted = cent == &cg.predictedPlayerEntity;
				if (!cg.playerPredicted ) {
					//Make sure lerporigin of playercent is val
					CG_CalcEntityLerpPositions( cg.playerCent );
				}
				cg.renderingThirdPerson = cg_thirdPerson.integer || (cg.snap->ps.stats[STAT_HEALTH] <= 0);
				CG_CalcViewValues();
				// first person blend blobs, done after AnglesToAxis
				if ( !cg.renderingThirdPerson ) {
					CG_DamageBlendBlob();
				}
				VectorCopy( cg.refdef.vieworg, demo.viewOrigin );
				VectorCopy( cg.refdefViewAngles, demo.viewAngles );
			} else {
				VectorCopy( cent->lerpOrigin, demo.viewOrigin );
				VectorCopy( cent->lerpAngles, demo.viewAngles );
			}
			demo.viewFov = cg_fov.value;
		} else {
			memset( &cg.refdef, 0, sizeof(refdef_t));
			AngleVectors( demo.chase.angles, forward, 0, 0 );
			VectorMA( demo.chase.origin , -demo.chase.distance, forward, demo.viewOrigin );
			VectorCopy( demo.chase.angles, demo.viewAngles );
			demo.viewFov = cg_fov.value;
			demo.viewTarget = demo.chase.target;
			cg.renderingThirdPerson = qtrue;
		}
		break;
	case viewCamera:
		memset( &cg.refdef, 0, sizeof(refdef_t));
		VectorCopy( demo.camera.origin, demo.viewOrigin );
		VectorCopy( demo.camera.angles, demo.viewAngles );
		demo.viewFov = demo.camera.fov + cg_fov.value;
		demo.viewTarget = demo.camera.target;
		cg.renderingThirdPerson = qtrue;
		cameraMove();
		break;
	case viewEffect:
		memset( &cg.refdef, 0, sizeof(refdef_t));
		if ( demo.effect.active ) {
			VectorCopy( demo.effect.active->origin, demo.viewOrigin );
			VectorCopy( demo.effect.active->angles, demo.viewAngles );
			demo.viewAngles[ROLL] = 0;
			demo.viewFov = cg_fov.value;
			cg.renderingThirdPerson = qtrue;
		}
		break;
	default:
		return inwater;
	}

	demo.viewAngles[YAW]	+= mov_deltaYaw.value;
	demo.viewAngles[PITCH]	+= mov_deltaPitch.value;
	demo.viewAngles[ROLL]	+= mov_deltaRoll.value;

	trap_FX_VibrateView( 1.0f, demo.viewOrigin, demo.viewAngles );
	VectorCopy( demo.viewOrigin, cg.refdef.vieworg );
	AnglesToAxis( demo.viewAngles, cg.refdef.viewaxis );

	/* find focus ditance to certain target but don't apply if dof is not locked, use for drawing */
	if ( demo.dof.target >= 0 ) {
		centity_t* targetCent = demoTargetEntity( demo.dof.target );
		if ( targetCent ) {
			vec3_t targetOrigin;
			chaseEntityOrigin( targetCent, targetOrigin );
			//Find distance betwene plane of camera and this target
			demo.viewFocus = DotProduct( cg.refdef.viewaxis[0], targetOrigin ) - DotProduct( cg.refdef.viewaxis[0], cg.refdef.vieworg  );
			demo.dof.focus = demo.viewFocusOld = demo.viewFocus;
		} else {
			demo.dof.focus = demo.viewFocus = demo.viewFocusOld;
		}
		if (demo.dof.focus < 0.001f) {
			behindView = qtrue;
		}
	}
	if ( demo.dof.locked ) {
		if (!behindView) {
			demo.viewFocus = demo.dof.focus;		
			demo.viewRadius = demo.dof.radius;
		} else {
			demo.viewFocus = 0.002f;		// no matter what value, just not less or equal zero
			demo.viewRadius = 0.0f;
		}
	} else if ( demo.viewTarget >= 0 ) {
		centity_t* targetCent = demoTargetEntity( demo.viewTarget );
		if ( targetCent ) {
			vec3_t targetOrigin;
			chaseEntityOrigin( targetCent, targetOrigin );
			//Find distance betwene plane of camera and this target
			demo.viewFocus = DotProduct( cg.refdef.viewaxis[0], targetOrigin ) - DotProduct( cg.refdef.viewaxis[0], cg.refdef.vieworg  );
			demo.viewRadius = CG_Cvar_Get( "mme_dofRadius" );
		}
	} else if ( demo.dof.target >= 0 ) {
		demo.viewFocus = 0;
		demo.viewRadius = 0;
	}

	cg.refdef.width = cgs.glconfig.vidWidth*cg_viewsize.integer/100;
	cg.refdef.width &= ~1;

	cg.refdef.height = cgs.glconfig.vidHeight*cg_viewsize.integer/100;
	cg.refdef.height &= ~1;

	cg.refdef.x = (cgs.glconfig.vidWidth - cg.refdef.width)/2;
	cg.refdef.y = (cgs.glconfig.vidHeight - cg.refdef.height)/2;

	cg.refdef.fov_x = demo.viewFov;
	cg.refdef.fov_y = atan2( cg.refdef.height, (cg.refdef.width / tan( demo.viewFov / 360 * M_PI )) ) * 360 / M_PI;
	
	contents = CG_PointContents( cg.refdef.vieworg, -1 );
	if ( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ){
		double v = WAVE_AMPLITUDE * sin(((double)cg.time + (double)cg.timeFraction) / 1000.0 * WAVE_FREQUENCY * M_PI * 2);
		cg.refdef.fov_x += v;
		cg.refdef.fov_y -= v;
		inwater = qtrue;
	} else {
		inwater = qfalse;
	}
	return inwater;
}