int main(){
	gWidth = 1024;
	gHeight = 600;

	if (!initGLFW() || !initUserInterface())
		return EXIT_FAILURE;

	if (!initialize())
		exit(EXIT_FAILURE);

	gpScene = new CScene();

	gpCamera = new CCamera();

	gpScene->loadObjects();

	reshape(gpWindow, gWidth, gHeight);
	
	mainLoop();

	destroy();
	return EXIT_SUCCESS;
}
int
main(int argc, char **argv)
{
	sctpAdaptorMod *sctpA;
	distributor *dist;
	int i;
	int rwnd=0;
	int swnd=0;
	int sctpPort,mySctpPort,scopeVal;
	char *addr;
	char *binda[100];
	int tcpmodel = 0;

	scopeVal = mySctpPort = sctpPort = 0;
	addr = binda[0] = NULL;
	while((i= getopt(argc,argv,"v46h:p:m:b:?s:tr:z:")) != EOF)
	{
		switch(i)
		{
		case 'v':
			sctp_verbose = 1;
			break;
		case 'z':
			swnd = strtol(optarg,NULL,0);
			break;
		case 't':
			tcpmodel = 1;
			break;
		case 'r':
			rwnd = strtol(optarg,NULL,0);
			break;
		case 's':
			scopeVal = strtol(optarg,NULL,0);
			break;
		case 'h':
			addr = optarg;
			destinationSet++;
			break;
		case '4':
			v4only = 1;
			SCTP_setV4only();
			break;
		case '6':
			v6only = 1;
			SCTP_setV6only();
			break;
		case 'p':
			sctpPort = strtol(optarg, NULL, 10);
			destinationSet++;
			break;
		case 'm':
			mySctpPort = (u_short)strtol(optarg, NULL, 0);
			break;
		case 'b':
			binda[bindSpecific] = optarg;
			bindSpecific++;
			break;
		default:
		case '?':
			printf("Usage: %s [-h destAddress [-s v6scope]] [-p destport]\n"
			       "       [-m myPort] [-b bindAddress] [-6] [-4]\n"
			       "  -6 : v6 only (default is v4 + v6)\n"
			       "  -4 : v4 only\n",
			       argv[0]);
			return(0);
			break;
		}
	}
	sendOptions = 0;
	if (v6only && v4only) {
		printf("Can't set to v4 only and v6 only at the same time!\n");
		return(-4);
	}
	/* init the distibutor */
	dist = createDistributor();
	if(dist == NULL){
		printf("Can't create distributor return is NULL?\n");
		return(-1);
	}

	/* set the v6 scope */
	if (scopeVal)
		SCTP_setIPv6scope((u_int)scopeVal);

	/* validate the bind address */
	if (bindSpecific) {
		int i;
		for (i=0; i<bindSpecific; i++) {
			struct in6_addr in6;
			struct in_addr in;
			if (inet_pton(AF_INET6, binda[i], (void *)&in6)) {
				SCTP_setBind6Addr((u_char *)&in6);
			} else if (inet_pton(AF_INET, binda[i], (void *) &in)) {
				SCTP_setBindAddr(in.s_addr);
			} else {
				printf("Invalid bind address format [%s]!\n", binda[i]);
				return(-3);
			}
		}
	}
	/* now init the SCTP adaptor */
	if(tcpmodel)
		sctpA = create_SCTP_adaptor(dist,mySctpPort,SCTP_TCP_TYPE,rwnd,swnd);
	else
		sctpA = create_SCTP_adaptor(dist,mySctpPort,SCTP_UDP_TYPE,rwnd,swnd);

	if(sctpA == NULL){
		printf("Can't init the SCTP adaptor for port %d\n",
		       mySctpPort);
		return(-2);
	}
	/* get the destination address */
	if (addr != NULL) {
		struct in6_addr in6;
		struct in_addr in;
		if (inet_pton(AF_INET6, addr, (void *)&in6)) {
			SCTP_setIPaddr6((u_char *)&in6);
			destinationSet = 1;
		} else if (inet_pton(AF_INET, addr, (void *) &in)) {
			SCTP_setIPaddr(in.s_addr);
			destinationSet = 1;
		} else {
			printf("Invalid destination address format [%s]!\n", addr);
			return(-3);
		}
	}
	if (sctpPort) {
		SCTP_setport(htons(sctpPort)); 
		portSet = 1;
	}

	/* now init the user interface module */
	initUserInterface(dist,sctpA);

	/* start the main loop */
	dist_process(dist);
  
	/* if we reach here someone quit ... cleanup */

	destroyUserInterface();

	/* kill the sctp adaptor */
	destroy_SCTP_adaptor(sctpA);

	/* kill the distributor */
	destroyDistributor(dist);
	/* we are done */
	return(0);
}