Page 1 of 1

Incorect work ShTlTerrainSceneNode+camera in IrrAI

Posted: Sat Jun 05, 2010 1:04 pm
by full_newbie
hello everyone . Please help me.
If i use camera in IrrAI and ShTlTerrainSceneNode begin incorect work ShTlTerrainSceneNode.
This full code:

Code: Select all

#include <irrlicht.h>
#include "terrain/ShTlTerrainSceneNode.h"
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

enum {UP, PRESSED, DOWN, RELEASED};
int keyState[KEY_KEY_CODES_COUNT] = {0};
bool paused = false;
bool quitGame = false;
IrrlichtDevice  *Device=createDevice(EDT_OPENGL, dimension2d<u32>(1024, 768), 32, true, false, false, 0);
IVideoDriver    *Driver=Device->getVideoDriver();
ISceneManager   *SceneManager=Device->getSceneManager();
IGUIEnvironment *Gui=Device->getGUIEnvironment();
scene::IAnimatedMeshSceneNode* playerNode = NULL;
scene::EMD2_ANIMATION_TYPE playerAnim;
void resetKeys() {

	for (int i = 0 ; i < KEY_KEY_CODES_COUNT ; ++i)
		keyState[i] = UP;

}
void updateKeys() {

	for(int i = 0 ; i < KEY_KEY_CODES_COUNT ; ++i)
		if (keyState[i] == RELEASED)
			keyState[i] = UP;
		else if (keyState[i] == PRESSED)
			keyState[i] = DOWN;

}
class MyEventReceiver : public IEventReceiver {

	public:
		virtual bool OnEvent(const SEvent& event) {

			if (event.EventType == EET_KEY_INPUT_EVENT) {

				// update keyStates
				if (event.KeyInput.PressedDown) {
					// If key was not down before
					if (keyState[event.KeyInput.Key] != DOWN)
						keyState[event.KeyInput.Key] = PRESSED; // Set to Pressed
					else
						// if key was down before
						keyState[event.KeyInput.Key] = DOWN; // Set to Down
				} else {
					// if the key is down
					if (keyState[event.KeyInput.Key] != UP)
						keyState[event.KeyInput.Key] = RELEASED; // Set to Released
				}

				switch(event.KeyInput.Key) {
					case KEY_ESCAPE: {
						if (!event.KeyInput.PressedDown) {
							quitGame = true;
							return true;
						}
						break;
					}
/*					case KEY_KEY_V: {
						if (!event.KeyInput.PressedDown) {
							static bool vis = false;
							vis = !vis;
							if (aimgr) aimgr->setDebugVisible(vis);
							return true;
						}
						break;
					}*/
					case KEY_KEY_P: {
						if (!event.KeyInput.PressedDown) {
							// Pause the scene
							paused = !paused;
//							if (pausedText) pausedText->setVisible(paused);
							if (Device)
								if (paused) // Freezes animators
									Device->getTimer()->setSpeed(0);
								else // Unfreezes animators
									Device->getTimer()->setSpeed(1);
							return true;
						}
						break;
					}
/*					case KEY_SPACE: { // Starts the conversation with the npc
						if (!event.KeyInput.PressedDown && character)
							character->startConvo(device->getTimer(), playerNode, playerText);
						return true;
					}*/
				}
			}

			return false;

		}

};

void processKeys(int elapsedTime) {

	bool turning = false;
	bool walking = false;

	if (keyState[KEY_KEY_W] == PRESSED || keyState[KEY_KEY_W] == DOWN) {
		// Move forward
		core::vector3df move = core::vector3df(5,0,0);
		core::matrix4 mat;
		mat.setRotationDegrees(playerNode->getRotation());
		mat.transformVect(move);
		move *= 0.1f * elapsedTime;
		playerNode->setPosition(playerNode->getPosition() + move);
		if (playerAnim != scene::EMAT_RUN) {
			playerNode->setMD2Animation(scene::EMAT_RUN);
			playerAnim = scene::EMAT_RUN;
		}
		walking = true;
	}

	if(keyState[KEY_KEY_S] == PRESSED || keyState[KEY_KEY_S] == DOWN) {
		// Move backward
		core::vector3df move = core::vector3df(5,0,0);
		core::matrix4 mat;
		mat.setRotationDegrees(playerNode->getRotation());
		mat.transformVect(move);
		move *= 0.1f * elapsedTime;
		playerNode->setPosition(playerNode->getPosition() - move);
		if (playerAnim != scene::EMAT_RUN) {
			playerNode->setMD2Animation(scene::EMAT_RUN);
			playerAnim = scene::EMAT_RUN;
		}
		walking = true;
	}

	if(keyState[KEY_KEY_A] == PRESSED || keyState[KEY_KEY_A] == DOWN) {
		// Turn left
		core::vector3df rot = core::vector3df(0,10,0) * 0.1f * (f32)elapsedTime;
		playerNode->setRotation(playerNode->getRotation() - rot);
		if (!walking && playerAnim != scene::EMAT_STAND) {
			playerNode->setMD2Animation(scene::EMAT_STAND);
			playerAnim = scene::EMAT_STAND;
		}
		turning = true;
	}

	if(keyState[KEY_KEY_D] == PRESSED || keyState[KEY_KEY_D] == DOWN) {
		// Turn right
		core::vector3df rot = core::vector3df(0,10,0) * 0.1f * (f32)elapsedTime;
		playerNode->setRotation(playerNode->getRotation() + rot);
		if (!walking && playerAnim != scene::EMAT_STAND) {
			playerNode->setMD2Animation(scene::EMAT_STAND);
			playerAnim = scene::EMAT_STAND;
		}
		turning = true;
	}

	if (!walking && !turning && playerAnim != scene::EMAT_STAND) {
		// Stand still
		playerNode->setMD2Animation(scene::EMAT_STAND);
		playerAnim = scene::EMAT_STAND;
	}

}
int main(int argc, char** argv)
{
MyEventReceiver receiver;
Device->setEventReceiver(&receiver);
ShTlTerrainSceneNode* terrain;
 scene::IAnimatedMesh* mesh = SceneManager->getMesh("data/avatar/sydney.md2");
	if (!mesh) printf("couldn't load player mesh\n");
	playerNode = SceneManager->addAnimatedMeshSceneNode(mesh);
	if (!playerNode) printf("couldn't create player node\n");
	playerNode->setMaterialFlag(video::EMF_LIGHTING, false);
	playerNode->setMD2Animation(scene::EMAT_STAND);
	playerAnim = scene::EMAT_STAND;
	playerNode->setMaterialTexture(0, Driver->getTexture("data/avatar/sydney.jpg"));
	playerNode->OnAnimate(0);
	playerNode->setPosition(vector3df(-1200,-50,-1400));
	core::aabbox3d<f32> box = playerNode->getTransformedBoundingBox();
	playerNode->setPosition(box.MaxEdge - box.getCenter());
	scene::ICameraSceneNode* camera = SceneManager->addCameraSceneNode(playerNode);
	if (!camera) printf("Failed camera creation\n");
	camera->setPosition(((box.MaxEdge - box.getCenter())*2.0f)+core::vector3df(-100,25,0));
	camera->setTarget(playerNode->getPosition());

    terrain = new ShTlTerrainSceneNode(SceneManager, 500, 500, 1., 100);
	terrain->drop();
    terrain->loadHeightMap("data/world/111.bmp", 10, 0, 0);
	// setup terrain node
	terrain->setMaterialTexture(0, Driver->getTexture("data/world/terrain-texture.jpg"));
	terrain->setMaterialTexture(1, Driver->getTexture("data/world/detail_grass.jpg"));
	terrain->setMaterialFlag(video::EMF_LIGHTING, true);
	terrain->setMaterialFlag(video::EMF_FOG_ENABLE, true);
	core::vector3df terrainPos(-1200,-50,-1400);
    terrain->setPosition(terrainPos);
    terrain->follow(camera);

    scene::ISceneNode* skybox=SceneManager->addSkyBoxSceneNode(
		Driver->getTexture("data/world/irrlicht2_up.jpg"),
		Driver->getTexture("data/world/irrlicht2_dn.jpg"),
		Driver->getTexture("data/world/irrlicht2_lf.jpg"),
		Driver->getTexture("data/world/irrlicht2_rt.jpg"),
		Driver->getTexture("data/world/irrlicht2_ft.jpg"),
		Driver->getTexture("data/world/irrlicht2_bk.jpg"));

    int startTime = Device->getTimer()->getTime();
	int elapsedTime = 0;
    while(Device->run())
    {
        elapsedTime = Device->getTimer()->getTime() - startTime;
		startTime = Device->getTimer()->getTime();
		processKeys(elapsedTime);

		// Update third person cam
		camera->setTarget(playerNode->getPosition());
        Driver->beginScene(true, true, SColor(0,200,200,200));

        SceneManager->drawAll();
        Gui->drawAll();

        Driver->endScene();
    }

    Device->drop();

    return 0;
}


Posted: Wed Jun 09, 2010 1:03 pm
by xirtamatrix
Can you try to explain a bit more what exactly is the problem?
In what way the ShTlTerrainSceneNode is working incorrectly?