[go: up one dir, main page]

Menu

[r8]: / main.cpp.old  Maximize  Restore  History

Download this file

229 lines (176 with data), 7.1 kB

#include <irrlicht.h>
#include <driverChoice.h>

using namespace irr;

using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

#pragma comment(lib, "Irrlicht.lib")

#include <iostream>
using namespace std;

#define _DEBUG_INFO

int error(int errnum, const char errmsg[])
{
    cerr << "ERROR: " << errmsg << " (error ID: " << errnum << ")" << endl;
    return errnum;
}

int warning(int errnum, const char errmsg[])
{
    cerr << "WARNING: " << errmsg << " (error ID: " << errnum << ")" << endl;
    return errnum;
}

void info(const char errmsg[])
{
    cout << "INFO: " << errmsg << endl;
}

void debug(const char errmsg[])
{
     #ifdef _DEBUG_INFO
     cout << "DEBUG: " << errmsg << endl;
     #warning "Debug info enabled! Disable it if you compiling relase version!"
     #endif
}

class MyEventReceiver : public IEventReceiver
{
public:

	MyEventReceiver(scene::ISceneNode* terrain, scene::ISceneNode* skybox, scene::ISceneNode* skydome) :
		Terrain(terrain), Skybox(skybox), Skydome(skydome), showBox(true)
	{
		Skybox->setVisible(true);
		Skydome->setVisible(false);
		
                for (u32 i=0; i<KEY_KEY_CODES_COUNT; ++i)
                        KeyIsDown[i] = false;
	}

	bool OnEvent(const SEvent& event)
	{
                if (event.EventType == irr::EET_KEY_INPUT_EVENT)
                        KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;

		return false;
	}
	
        // This is used to check whether a key is being held down
        virtual bool IsKeyDown(EKEY_CODE keyCode) const
        {
                return KeyIsDown[keyCode];
        }

private:
	scene::ISceneNode* Terrain;
	scene::ISceneNode* Skybox;
	scene::ISceneNode* Skydome;
        bool KeyIsDown[KEY_KEY_CODES_COUNT];
	bool showBox;
};

int main()
{
    cout << "Colonization v1.0" << endl << endl;
	video::E_DRIVER_TYPE driverType=driverChoiceConsole();
	if (driverType==video::EDT_COUNT) return error(1, "User not selected driver");
	
	irr::SIrrlichtCreationParameters params;
	params.DriverType=driverType;
	params.WindowSize=core::dimension2d<u32>(800, 600);
	IrrlichtDevice* device = createDeviceEx(params);
	
    if(!device) return error(2, "Failed to create device");
    debug("Device created!");

	video::IVideoDriver* driver = device->getVideoDriver();
	scene::ISceneManager* smgr = device->getSceneManager();
	gui::IGUIEnvironment* env = device->getGUIEnvironment();

	driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true);

	scene::ICameraSceneNode* camera =
		smgr->addCameraSceneNodeFPS(0,100.0f,1.2f);

	camera->setPosition(core::vector3df(2700*2,255*2,2600*2));
	camera->setTarget(core::vector3df(2397*2,343*2,2700*2));
	camera->setFarValue(42000.0f);

	device->getCursorControl()->setVisible(false);

	scene::ITerrainSceneNode* terrain = smgr->addTerrainSceneNode(
		"textures/terrain-heightmap.bmp",
		0,					// parent node
		-1,					// node id
		core::vector3df(0.f, 0.f, 0.f),		// position
		core::vector3df(0.f, 0.f, 0.f),		// rotation
		//core::vector3df(40.f, 4.4f, 40.f),	// scale
		core::vector3df(160.f, 22.f, 160.f),	// scale
		video::SColor ( 255, 255, 255, 255 ),	// vertexColor
		5,					// maxLOD
		scene::ETPS_17,				// patchSize
		4					// smoothFactor
		);

	terrain->setMaterialFlag(video::EMF_LIGHTING, false);

	terrain->setMaterialTexture(0, driver->getTexture("textures/terrain-texture.jpg"));
	terrain->setMaterialTexture(1, driver->getTexture("textures/detailmap3.jpg"));
	
	terrain->setMaterialType(video::EMT_DETAIL_MAP);

	terrain->scaleTexture(1.0f, 20.0f);

	scene::ITriangleSelector* selector
		= smgr->createTerrainTriangleSelector(terrain, 0);
	terrain->setTriangleSelector(selector);

	scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
		selector, camera, core::vector3df(60,100,60),
		core::vector3df(0,0,0),
		core::vector3df(0,50,0));
	selector->drop();
	camera->addAnimator(anim);
	anim->drop();

	scene::CDynamicMeshBuffer* buffer = new scene::CDynamicMeshBuffer(video::EVT_2TCOORDS, video::EIT_16BIT);
	terrain->getMeshBufferForLOD(*buffer, 0);
	video::S3DVertex2TCoords* data = (video::S3DVertex2TCoords*)buffer->getVertexBuffer().getData();
	buffer->drop();
	
	driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);

	scene::ISceneNode* skybox=smgr->addSkyBoxSceneNode(
		driver->getTexture("textures/irrlicht2_up.jpg"),
		driver->getTexture("textures/irrlicht2_dn.jpg"),
		driver->getTexture("textures/irrlicht2_lf.jpg"),
		driver->getTexture("textures/irrlicht2_rt.jpg"),
		driver->getTexture("textures/irrlicht2_ft.jpg"),
		driver->getTexture("textures/irrlicht2_bk.jpg"));
	scene::ISceneNode* skydome=smgr->addSkyDomeSceneNode(driver->getTexture("textures/skydome.jpg"),16,8,0.95f,2.0f);

	driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true);
	
        scene::ISceneNode* n = smgr->addCubeSceneNode();

        if (n)
        {
                n->setMaterialTexture(0, driver->getTexture("textures/t351sml.jpg"));
                n->setMaterialFlag(video::EMF_LIGHTING, false);
                scene::ISceneNodeAnimator* anim = smgr->createFlyCircleAnimator(core::vector3df(0,0,30), 20.0f);
                if (anim)
                {
                        n->addAnimator(anim);
                        anim->drop();
                }
        }

	MyEventReceiver receiver(terrain, skybox, skydome);
	device->setEventReceiver(&receiver);

	int lastFPS = -1;
        u32 then = device->getTimer()->getTime();
        const f32 MOVEMENT_SPEED = 5.f;

	while(device->run())
	if (device->isWindowActive())
	{
                const u32 now = device->getTimer()->getTime();
                const f32 frameDeltaTime = (f32)(now - then) / 1000.f; // Time in seconds
                then = now;
                
                /*core::vector3df nodePosition = node->getPosition();

                if(receiver.IsKeyDown(irr::KEY_KEY_W))
                        nodePosition.Y += MOVEMENT_SPEED * frameDeltaTime;
                else if(receiver.IsKeyDown(irr::KEY_KEY_S))
                        nodePosition.Y -= MOVEMENT_SPEED * frameDeltaTime;

                if(receiver.IsKeyDown(irr::KEY_KEY_A))
                        nodePosition.X -= MOVEMENT_SPEED * frameDeltaTime;
                else if(receiver.IsKeyDown(irr::KEY_KEY_D))
                        nodePosition.X += MOVEMENT_SPEED * frameDeltaTime;

                node->setPosition(nodePosition);*/
                                 
		driver->beginScene(true, true, 0 );

		smgr->drawAll();
		env->drawAll();

		driver->endScene();

		int fps = driver->getFPS();
		if (lastFPS != fps)
		{
			core::stringw str = L"Colonization [";
			str += driver->getName();
			str += "] FPS:";
			str += fps;

			device->setWindowCaption(str.c_str());
			lastFPS = fps;
		}
	}

	device->drop();
	
	return 0;
}