creating multiple windows using glfw

I have a problem related to client server programming . I want to create multiple windows created by glfw These windows have the same 3D environment but different views (Virtual reality).

I want to clear things before posting the code.

  1. I have an application running where i have one window by glfw and I want to create 4 camera views (4 clients)

  2. My client is supposed to be on the same computer on which I have the server. i will give server Ip as
    127.0.0.1 meaning a local server on the same computer on which i will have 4 camera views (4 clients).

  3. I create a client and I can see the camera view in that client. For example right, left or forward.

My main.cpp looks like this


#include "stdafx.h"

#include "DemoApp.h"
#include "GLFW/glfw.h"
#include <iostream>
#ifdef MEMORYCHECK
#include <vld.h>
#endif

static int width = 1024;
static int height = 768;


static DemoApp* app = 0x0;
static bool running = false;
static bool fullScreen = false;
const char* sceneFile = 0; 

bool setupWindow( int, int, bool );

// GLFW Callback functions
int windowCloseListener()
{
	running = false;
	return 0;
}

void  mouseMoveListener( int x, int y )
{
	if( !running )	return;

	app->mouseMoved(x, y);
}

void  resizeCb(int w, int h)
{
	if( !running ) return;

	app->resize(w, h);
	width=w; height=h;
}

void  mouseButtonListener(int button, int action)
{
	if( !running )	return;

	app->mouseClick(button, action);
}

void  keyPressListener( int key, int action )
{
	if( !running ) return;

	if( key == GLFW_KEY_ESC )
	{
		running = false;
		return;
	}


	switch( action )
	{
	case GLFW_PRESS:
		app->keyPressed( key, true);
		break;
	case GLFW_RELEASE:
		app->keyPressed( key, false);
		break;
	}
}

bool setupWindow( int width, int height, bool fullscreen )
{
	// Create OpenGL window
	if( !glfwOpenWindow( width, height, 8, 8, 8, 8, 24, 8, fullscreen ? GLFW_FULLSCREEN : GLFW_WINDOW ) )
	{
		glfwTerminate();
		return false;
	}

	if (!fullscreen)
		glfwSetWindowTitle("Cave");
	
	// Disable vertical synchronization
	glfwSwapInterval(0);
	
	return true;
}

int main(int argc, char ** argv)
{
	if (argc < 2)
	{
		glfwOpenWindow( 800, 16, 8, 8, 8, 8, 24, 8, GLFW_WINDOW );
		glfwSetWindowTitle( "You have to specify a GameEngine file as argument" );
		double startTime = glfwGetTime();
		while( glfwGetTime() - startTime < 5.0 ) {}  // Sleep
		
		std::cout << "You have to specify a GameEngine file as argument" << std::endl;
		glfwTerminate();
		return -1;
	}
	//- Initialize GLFW
	glfwInit();

	if( fullScreen )
	{
		GLFWvidmode mode;
		glfwGetDesktopMode( &mode );
		
		// Use desktop resolution
		width = mode.Width; height = mode.Height;
	}

	if( !setupWindow( width, height, fullScreen ) ) return -1;	

	sceneFile = argv[1];
	//- Initalize application and engine
	app = new DemoApp();
	if ( !app || !app->init(argv[1]) )
	{
		// Fake message box
		glfwCloseWindow();
		glfwOpenWindow( 800, 16, 8, 8, 8, 8, 24, 8, GLFW_WINDOW );
		glfwSetWindowTitle( "Unable to initalize engine - Make sure you have an OpenGL 2.0 compatible graphics card" );
		double startTime = glfwGetTime();
		while( glfwGetTime() - startTime < 5.0 ) {}  // Sleep
		
		std::cout << "Unable to initalize engine" << std::endl;
		std::cout << "Make sure you have an OpenGL 2.0 compatible graphics card";
		delete app;
		glfwTerminate();
		return -1;
	}

	// Set listeners
	glfwSetWindowCloseCallback(windowCloseListener);
	glfwSetKeyCallback(keyPressListener);
	glfwSetMousePosCallback(mouseMoveListener);
	glfwSetWindowSizeCallback(resizeCb); 
	glfwSetMouseButtonCallback(mouseButtonListener);

	running = true;
	resizeCb(width, height);

	//glfwDisable( GLFW_MOUSE_CURSOR );

	// Game loop
	while( running )
	{
		// Render
		app->render();
		glfwSwapBuffers();
	}

	//glfwEnable( GLFW_MOUSE_CURSOR );

	// Quit
	delete app;
	glfwTerminate();

	return 0;
}

My DemoApp.cpp looks like this


#include "stdafx.h"
#include "DemoApp.h"
#include <GLFW/glfw.h>
#include <gl/gl.h>


using namespace Horde3D;

DemoApp::DemoApp() : m_running(true)
{
	memset(m_keys, 0, sizeof(m_keys));
	memset(m_stepHistory, 0, sizeof(m_stepHistory));
	m_character = UINT_MAX;
	m_networkState = "Not connected.";
	m_spectator = false;
	m_spectatorNum = 0;
	m_networkStarted = false;

	waypoints[0] = Vec3f(-8.0f, 0, -8.0f);
	waypoints[1] = Vec3f(-8.0f, 0, 8.0f);
	waypoints[2] = Vec3f(8.0f, 0, 8.0f);
	waypoints[3] = Vec3f(8.0f, 0, -8.0f);

	m_frameCount = 0;
	m_historyCounter = 0;

	m_currentWaypoint = -1;
	sensorON = false; 
}

DemoApp::~DemoApp()
{
	GameEngine::release();
}

void DemoApp::startServer()
{
	// only once
	if (m_networkStarted)
		return;

	m_networkStarted = true;

	GameEngine::registerCallbackOnClientConnect(NetworkApp::clientConnectCb);
	GameEngine::registerCallbackOnClientDisconnect(NetworkApp::clientDisconnectCb);
	/*
	GameEngine::registerComponentOnServer("Player1", "Horde3D");
	//GameEngine::registerComponentOnServer("Player1", "KeyframeAnimComponent");
	//GameEngine::registerComponentOnServer("Player1", "Sound3D");

	GameEngine::registerComponentOnServer("Player2", "Horde3D");
	GameEngine::registerComponentOnServer("Player2", "KeyframeAnimComponent");*/
	//GameEngine::registerComponentOnServer("Player2", "Sound3D");

	//GameEngine::registerComponentOnServer("Player3", "Horde3D");
	//GameEngine::registerComponentOnServer("Player3", "KeyframeAnimComponent");
	//GameEngine::registerComponentOnServer("Player3", "Sound3D");

	//GameEngine::registerComponentOnServer("Player4", "Horde3D");
	//GameEngine::registerComponentOnServer("Player4", "KeyframeAnimComponent");
	//GameEngine::registerComponentOnServer("Player4", "Sound3D");

	//GameEngine::registerComponentOnServer("Player5", "Horde3D");
	//GameEngine::registerComponentOnServer("Player5", "KeyframeAnimComponent");
	//GameEngine::registerComponentOnServer("Player5", "Sound3D");

	//GameEngine::registerComponentOnServer("Player6", "Horde3D");
	//GameEngine::registerComponentOnServer("Player6", "KeyframeAnimComponent");
	//GameEngine::registerComponentOnServer("Player6", "Sound3D");

	//GameEngine::registerComponentOnServer("Player7", "Horde3D");
	//GameEngine::registerComponentOnServer("Player7", "KeyframeAnimComponent");
	//GameEngine::registerComponentOnServer("Player7", "Sound3D");

	GameEngine::disconnect();

	GameEngine::startServer();

	m_networkState = "Server running.";

}

void DemoApp::startClient(const char* character, int spectator)
{
	// only once
	if (m_networkStarted){
	cout<<"Zulqarnain imran";
		
	
		
	
	if(spectator > 0)
	{
		cout<<"Zulqarnain";
		m_spectator = true;
		m_character = GameEngine::entityWorldID("Hans");
		m_spectatorNum = spectator;
		h3dSetupCameraView(GameEngine::entitySceneGraphID(m_camID),73.7f,4.0f / 3.0f, 0.1f, 1000.0f);
	}
	else
	{	
		cout<<"Zulqarnain Elseeeeeeeeeeeee";
		m_character = GameEngine::entityWorldID(character);
		m_NPC = GameEngine::entityWorldID("Marie");
	}

	const char* serverip = "127.0.0.1";

	m_networkStarted = true;

	if(!m_spectator)
	{
		//typedef _W64 unsigned int cameraAbduallah_ID;
		
		m_camID = GameEngine::entityWorldID("camera");
		
		GameEngine::registerCallbackOnClientConnect(NetworkApp::clientConnectCb);
	    string entityID = "Hans";
		setupStepper();
	}

	GameEngine::disconnect();
	GameEngine::connectToServer(serverip);


	m_networkState = new char[50];
	sprintf(m_networkState, "Client running. Server IP = %s", serverip);
	}
	else
	{return;}
}


bool DemoApp::init(const char *fileName)
{
	if (!GameEngine::init()) return false;
	
	if (GameEngine::loadScene(fileName))
	{
		m_camID = GameEngine::entityWorldID("camera");


		m_camRX =0;
		m_camRY =0;

		
		_fontMatRes = h3dAddResource( H3DResTypes::Material, "overlays/font.material.xml", 0 );
		_logoHordeMatRes = h3dAddResource( H3DResTypes::Material, "overlays/logo.material.xml", 0 );
		//_logoSesamMatRes = h3dAddResource( H3DResTypes::Material, "overlays/logo2.material.xml", 0 );
		h3dutLoadResourcesFromDisk( "." );

		return true;
	}
	else
		return false;	
}

void DemoApp::keyHandler()
{		
	m_running = m_keys[27] == 0; // quit application on ESC

	if( m_keys[GLFW_KEY_F7] )  // F7
	{
		h3dSetOption( H3DOptions::DebugViewMode, h3dGetOption(H3DOptions::DebugViewMode) != 0.0f ? 0.0f : 1.0f );	
		m_keys[GLFW_KEY_F7] = 0;
	}


	if ( m_keys['1'] ) {
		startClient("Hans", 0);
	}
		
	if ( m_keys['2'] ) {
		startClient("ObserverFront", 1);
		
		//cout<<"You Pressed 2 I m in this section of observing Front";
	}
		
	if ( m_keys['3'] ) {
		startClient("ObserverRight", 2);
		//cout<<"You Pressed 3 I m in this section of observing Right";
	}
		
	if ( m_keys['4'] ) {
		startClient("ObserverBack", 3);
		//cout<<"You Pressed 4 I m in this section of observing Back";
	}
		
	if ( m_keys['5'] ) {
		startClient("OberverLeft", 4);
		//cout<<"You Pressed 5 I m in this section of observing Left";
	}
		
	if ( m_keys['6'] ) {
		startClient("Marie", 0);
	}

	if ( m_keys['7'] ) {
		startClient("Hans", 0);
	}

	if( m_keys['X'] ){
		startServer();
	cout<<"Now i am in X Server";
	}

	if( m_keys[' '] ){
		sensorON = !sensorON;
		m_keys[' '] = 0;
	}

	if (m_keys[27])
	{	// Esc
		GameEngine::disconnect();
		m_running = false;
	}

	if (m_character == UINT_MAX)
		return;

	if (m_spectator)
		return;

	if( m_keys['U'] )
	{
		m_currentWaypoint = 0;
	}
	
	if( m_keys['J'] ) {
		if (!GameEngine::isPlaying(m_NPC, "wave")) {
			GameEngine::playAnim(m_NPC, "wave", 0 , 1.0, 3.0, 30.0, 0);
			GameEngine::setSoundGain(m_NPC, 1.0f);
		}
	}

	if( m_keys['K'] )
	{
		Matrix4f trans(GameEngine::getEntityTransformation(m_character));
		if( !GameEngine::isPlaying( m_character, "walk") )  {
	    GameEngine::playAnim( m_character, "walk", 0, 1.0f, -1.0f, 30.0f, 0.0f );  }
		Vec3f t, r, s;

		trans.decompose(t, r, s);
		
		printf("%f, %f
", t.x, t.z);
	}
}

void DemoApp::mouseClick(int button, int action)
{
}


void DemoApp::updateNPC()
{
	

}

bool DemoApp::waypointReached()
{
	
}

//Function to  be removed
void DemoApp::turnToWaypoint()
{
	
}

//Function to  be removed 
void DemoApp::walkToWaypoint()
{
	
}


void DemoApp::updateCamera()
{
	if (m_character == UINT_MAX)
		return;

	Matrix4f trans(GameEngine::getEntityTransformation(m_character));

	Vec3f t, r, s;

	trans.decompose(t, r, s);

	if(m_spectator)
	{
		t.y += 2;
		float rotYOffset = 0.0f;
		if(m_spectatorNum == 1)
			rotYOffset =  - 270.0f;
		else if(m_spectatorNum == 2)
			rotYOffset =  0.0f;
	    else if(m_spectatorNum == 3)
			rotYOffset =  - 90.0f;
	    else if(m_spectatorNum == 4)
			rotYOffset =  - 180.0f;
		GameEngine::setEntityTranslation(m_camID, t.x, t.y, t.z);
		//GameEngine::setEntityRotation(m_camID, 0,r.y / Math::Pi * 180.0f - rotYOffset , 0);
		GameEngine::setEntityRotation(m_camID, 0, rotYOffset , 0);
	}
	else
	{
		t.y += 2;
		t.x -= 2 * sin(r.y);
		t.z -= 2 * cos(r.y);
		GameEngine::setEntityTranslation(m_camID, t.x, t.y, t.z);
		GameEngine::setEntityRotation(m_camID, -10, r.y / Math::Pi * 180.0f - 180.0f, 0);
	}
		
}



void DemoApp::mouseMoved(float x, float y)
{
}

void DemoApp::render()
{
	keyHandler();
	
	//m_frameCount++;
	//if(m_frameCount / GameEngine::FPS() > 1.0f)
	//{
	if(m_character != UINT_MAX && sensorON == true)	
		{
			//int angle = hismodgametrak_getAngle();
			//printf("Steering angle: %d
",angle);
			//GameEngine::setEntityRotation(m_character,0,angle - 90,0);

			readFromStepper(); //a good idea is to use a key to start reading from sensor
			
			if(checkStepHistory())
				GameEngine::translateEntityLocal(m_character, 0, 0, 0.8f);
			
			//m_frameCount = 0;
		}
	//}
	
	updateCamera();

	updateNPC();
	
	h3dutShowText( m_networkState, 0.01f, 0.02f, 0.03f, 1, 1, 1, _fontMatRes );
	
	GameEngine::update();

	glDisable(GL_DEPTH_TEST);
	drawReticle();
	glEnable(GL_DEPTH_TEST);
	
	h3dutDumpMessages();
}

void DemoApp::keyPressed(unsigned int param, bool pressed)
{	
	m_keys[param] = pressed ? 1 : 0 ;
}
void DemoApp::resize(int width, int height)
{	
	

}

void DemoApp::keyboardCb(unsigned int param, bool pressed, void *userData)
{
	
}

void DemoApp::mouseCb(float x, float y, void *userData)
{
	
}

void DemoApp::renderCb(void *userData)
{
	
}

void DemoApp::resizeCb(void *userData, int width, int height)
{	
	DemoApp* app = static_cast<DemoApp*>(userData);
	H3DNode camID = GameEngine::entitySceneGraphID( app->m_camID );
	h3dSetNodeParamI( camID, H3DCamera::ViewportXI, 0 );
	h3dSetNodeParamI( camID, H3DCamera::ViewportYI, 0 );
	h3dSetNodeParamI( camID, H3DCamera::ViewportWidthI, width );
	h3dSetNodeParamI( camID, H3DCamera::ViewportHeightI, height );	
	h3dResizePipelineBuffers( h3dGetNodeParamI( camID, H3DCamera::PipeResI ), width, height );
}


void DemoApp::drawSquare(float xMid, float yMid, float zMid, float yRot, float sideLength, bool fill)
{
	float sinY = sin(yRot);
	float cosY = cos(yRot);
	
	xMid += 2 * sinY;
	zMid += 2 * cosY;
	
	float halfLength = sideLength * 0.5f;
	if (fill)
	{
		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
		glBegin(GL_POLYGON);
	}
	else
	{
		glBegin(GL_LINE_STRIP);			
	}
	
	glVertex3f(xMid - halfLength * cosY, yMid-halfLength, zMid + halfLength * sinY);
	glVertex3f(xMid - halfLength * cosY, yMid+halfLength, zMid + halfLength * sinY);
	glVertex3f(xMid + halfLength * cosY, yMid+halfLength, zMid - halfLength * sinY);
	glVertex3f(xMid + halfLength * cosY, yMid-halfLength, zMid - halfLength * sinY);
	
	glEnd();
}

void DemoApp::drawReticle()
{
	if (m_character == UINT_MAX || !m_spectator)
		return;

	Matrix4f trans(GameEngine::getEntityTransformation(m_character));

	Vec3f t, r, s;

	trans.decompose(t, r, s);

	t.y += 2;
	//t.x += 2 * sin(r.y);
	//t.z += 2 * cos(r.y);
	
	glLineWidth(1.5f);
	glColor3f(1.0f, 0.5f, 0.0f);
	
	drawSquare(t.x,t.y,t.z,r.y,0.05f,true);
}

void DemoApp::setupStepper()
{
}

void DemoApp::readFromStepper()
{
	
}

bool DemoApp::checkStepHistory()
{
	
}

Demoapp.h


//Whre i have all headers

Now problem, according to this application whn i am pressing a key for example 2 then my client starts but it starts in the same while the previous view is not there .I want that as soon as i start my client it should start in new window . I want this camera view to be viewed in a separate window so this is how i will have all my four clients connected to the server. If I will create 4 windows then i can see four different views in 4 different windows. In simple terms according to vitrtual reality we see on front camera view whatever is infront of virtual agent. on the right of the camera view i would see wht is on the right side of the virtual agent similarly all four views will have thier respective views.

I saw in this code that as in main it is creating a window i can create the window as soon as i connect a client but if I am doing this, it doesn’t allow me to create a window it gives an error on run time of Assertion failed at the time of connection of the client that I want to connect (for example On pressing key 2).

So what possibly can be stopping me from creating a new window?