예제 #1
0
		bool CRoomManager::init()
		{
			// register to console: TODO register some usefull stuff
			CV_GAME_MANAGER->getConsole()->registerClass(this,"ROOM MANAGER");
			CV_GAME_MANAGER->getConsole()->addParam(RLROOM,"() Reloads the rooms.");
			CV_GAME_MANAGER->getConsole()->addParam(RC,"() Prints room count.");
			CV_GAME_MANAGER->getConsole()->addParam(RC,"() Prints room count.");
			CV_GAME_MANAGER->getConsole()->addParam(SRA,"() Shows room area.");

			// construct new rooms
			CLevelManager *lManager = CV_GAME_MANAGER->getLevelManager();
			for (GLuint y=0; y<CV_LEVEL_MAP_SIZE; y++)
			{
				for (GLuint x=0; x<CV_LEVEL_MAP_SIZE; x++)
				{
					CBlock *block = lManager->getBlock(x,y);
					if (block->isRoom() && !block->isInRoom())
					{
						if(block->getType() == CV_BLOCK_TYPE_HEART_ID && block->getOwner() == CV_PLAYER_0)
						{
							cml::vector3f position = block->getRealPosition();
							CV_GAME_MANAGER->getControlManager()->getCamera()->setPosition(cml::vector3f(position[0]+0.3, CV_CAMERA_INITIAL_HEIGHT, position[2]+1));
						}
						// we found a room tile that isn't in a room yet. we create a new room.
						CRoom *newRoom = new CRoom();
						newRoom->init(block);
						allRooms[newRoom->getIndex()] = newRoom;
						roomColors[newRoom->getIndex()] = vector3f((GLfloat)(rand()%101)/100.0f,(GLfloat)(rand()%101)/100.0f,(GLfloat)(rand()%101)/100.0f);
					}
				}
			}

			return true;
		}
예제 #2
0
		GLvoid CRoomManager::locateRoom(GLint roomType, GLubyte owner)
		{
				CBlock *roomTile = getRoom(roomType, owner);
				if(roomTile)
				{
					cml::vector3f currPos = roomTile->getRealPosition();
					CV_GAME_MANAGER->getControlManager()->getCamera()->setPosition(cml::vector3f(currPos[0], CV_CAMERA_INITIAL_HEIGHT, currPos[2]+1));
				}
		}
예제 #3
0
		GLvoid CLightingManager::addLightSource(vector2i position, GLint lightSourceType)
		{
			// depending on the block position we need to setup from 1 to 4 lights
			CLevelManager *lManager = CV_GAME_MANAGER->getLevelManager();
				
			GLint faces[4];
			GLint bfVis = lManager->getBlock(position)->getFreeFaces(faces);

			vector3f lPoss[] =
			{
				vector3f(CV_BLOCK_WIDTH/2,CV_BLOCK_HEIGHT,CV_BLOCK_DEPTH+CV_BLOCK_DEPTH/10.0f),		// front
				vector3f(CV_BLOCK_WIDTH/2,CV_BLOCK_HEIGHT,-CV_BLOCK_DEPTH/10.0f),					// back
				vector3f(CV_BLOCK_WIDTH+CV_BLOCK_DEPTH/10.0f,CV_BLOCK_HEIGHT,CV_BLOCK_DEPTH/2.0f),	// left
				vector3f(-CV_BLOCK_DEPTH/10.0f,CV_BLOCK_HEIGHT,CV_BLOCK_DEPTH/2.0f),				// right
				vector3f(CV_BLOCK_DEPTH/2.0f,CV_BLOCK_HEIGHT,CV_BLOCK_DEPTH/2.0f)					// middle
			};

			if (bfVis==-1)
			{
				bfVis=1;
				faces[0]=4;
			}
				
			for (GLint i=0; i<bfVis; i++)
			{
				// get a light from the light pool
				//CLightSource *light = lightSourcePool[lightSourceType].popObject();
				CLightSource *light = new CLightSource(lightIndexName[lightSourceType]);
				if (light)
				{
					// set its position
					light->setPosition(lManager->getBlock(position)->getRealPosition()+lPoss[faces[i]]);

					// append to block
					//blockLightData[position[1]][position[0]].add(light);
					//blockLightData[position[1]][position[0]].add(light,lManager->getBlock(position));

					// and add to the global list of used lights
					lightSources.push_back(light);

					GLint lightRadius = (int)ceil(light->getRadius()/CV_BLOCK_WIDTH)+2; // +2 is there for extended radius comparison

					//vector2i lightPos = CConversions::realToLogical(light->getPosition());

					// now for every block of this light, add references of this light to influenced neighbour blocks.
					for (GLint y=-lightRadius; y<=lightRadius; y++)
					{
						for (GLint x=-lightRadius; x<=lightRadius; x++)
						{			
							if (position[1]+y<0 || position[0]+x<0 || position[1]+y>=84 || position[0]+x>=84)
							{
								continue;
							}

							if (faces[i]==CBlock::BFS_FRONT && y<0)
							{
								continue;
							}

							if (faces[i]==CBlock::BFS_BACK && y>0)
							{
								continue;
							}

							if (faces[i]==CBlock::BFS_LEFT && x<0)
							{
								continue;
							}

							if (faces[i]==CBlock::BFS_RIGHT && x>0)
							{
								continue;
							}

							CBlock *block = lManager->getBlock(position[0]+x,position[1]+y);

							vector3f lPos(light->getPosition()[0],0.0f,light->getPosition()[2]);

							GLfloat d1 = (block->getRealPosition()-lPos).length();
							GLfloat d2 = ((block->getRealPosition()+vector3f(CV_BLOCK_WIDTH,0.0f,0.0f))-lPos).length();
							GLfloat d3 = ((block->getRealPosition()+vector3f(CV_BLOCK_WIDTH,0.0f,CV_BLOCK_DEPTH))-lPos).length();
							GLfloat d4 = ((block->getRealPosition()+vector3f(0.0f,0.0f,CV_BLOCK_DEPTH))-lPos).length();

							GLfloat rad =light->getRadius();

							if (d1<=rad || d2<=rad || d3<=rad || d4<=rad)
							{
								blockLightData[position[1]+y][position[0]+x].add(light,block);
							}
						}
					}
				}
			}	
		}