3 Replies - 709 Views - Last Post: 27 July 2012 - 10:55 PM Rate Topic: -----

#1 imranhabib  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 31
  • Joined: 28-February 11

A small Client/Server application problem

Posted 27 July 2012 - 09:10 PM

I have a problem related to client server programming

I want to clear things before posting the code.

1. I have an application running 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.

3. I already have one window (camera view) displayed using glfw .

4. 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\n", 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\n",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 and i want that as soon as i start my client it should start in new window. I want this window to be viewed in a separate window so this is how i will have all my four clients connected to the server. The already code that I am posting here is giving me a single window and when i connect new clients i get the client connected and i get the new camera view but it is in the same window which removes the previous view and shows new. if i create 4 windows then i can see four different views in 4 different windows.

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?

Is This A Good Question/Topic? 0
  • +

Replies To: A small Client/Server application problem

#2 Skydiver  Icon User is offline

  • Code herder
  • member icon

Reputation: 3449
  • View blog
  • Posts: 10,643
  • Joined: 05-May 12

Re: A small Client/Server application problem

Posted 27 July 2012 - 09:39 PM

I think you will be better served by asking a moderator to move this question to the Game Dev forum because this question requires more intimate knowledge about the game engine you are using.
Was This Post Helpful? 1
  • +
  • -

#3 imranhabib  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 31
  • Joined: 28-February 11

Re: A small Client/Server application problem

Posted 27 July 2012 - 09:48 PM

View PostSkydiver, on 27 July 2012 - 09:39 PM, said:

I think you will be better served by asking a moderator to move this question to the Game Dev forum because this question requires more intimate knowledge about the game engine you are using.

yes you are right. how can i tell him to move this post to the game development group?
Was This Post Helpful? 0
  • +
  • -

#4 Skydiver  Icon User is offline

  • Code herder
  • member icon

Reputation: 3449
  • View blog
  • Posts: 10,643
  • Joined: 05-May 12

Re: A small Client/Server application problem

Posted 27 July 2012 - 10:55 PM

Most of the mods scan through the forums that they manage. If you can't wait, at the top of each from is a pinned thread titled something like "Get to know your forum leaders". You can usually click on their name to get to their profile, and from there be able to send them a private message.
Was This Post Helpful? 0
  • +
  • -

Page 1 of 1