Newer
Older
cg / sources / animation.cpp
@glproj03 glproj03 on 30 Jan 2006 3 KB Started work on UserAnimation.
#include "animation.h"

#ifndef UNIX
#include <SDL.h>        // This file import the SDL inteface
#else
#include <SDL/SDL.h>    // This file import the SDL inteface
#endif

#ifndef PI
#define PI                 3.14159265f
#endif

/* class Animation */

Animation::Animation() {
}

void Animation::tick() {
}

void Animation::init() {
}

/* class UserAnimation */

UserAnimation::UserAnimation() {
	current = -1;
}

UserAnimation::UserAnimation(Thing* ths) {
	things.push_back(ths);
	current = 0;
}

UserAnimation::UserAnimation(std::vector<Thing*> ths) {
	things = ths;
	current = 0;
}

void UserAnimation::init() {
	speed = 1.0f;
	current = -1;
	kbdlock = 0;
	mouseX = 0;
	mouseY = 0;
	delta = 0.0f;
	trace = false;
	showNormals = false;
	showMe = true;
}

void UserAnimation::tick() {
	/* get mouse */
	int newmouseX;
	int newmouseY;
	unsigned mouseButtons = SDL_GetMouseState(&newmouseX, &newmouseY);

	if ( mouseButtons & SDL_BUTTON(1) ) { }
	if ( mouseButtons & SDL_BUTTON(3) ) { }

	if ( newmouseX != mouseX || newmouseY != mouseY ) {
		Vec v = Vec(speed*0.1f*(newmouseY-mouseY), speed*0.1f*(newmouseX-mouseX), 0.0f);
		((View*)things.at(current))->rotate(v);
		mouseX = newmouseX;
		mouseY = newmouseY;
	}


	/* get keyboard */
	if ( kbdlock > 0 ) {
		kbdlock--;
	} else {
		Uint8 *kbd = SDL_GetKeyState(NULL);

		/* object selection */
		if ( kbd[SDLK_0] ) { current = 0; }
		if ( kbd[SDLK_1] ) { current = 1; }
		if ( kbd[SDLK_2] ) { current = 2; }
		if ( kbd[SDLK_3] ) { current = 3; }
		if ( kbd[SDLK_4] ) { current = 4; }
		if ( kbd[SDLK_5] ) { current = 5; }
		if ( kbd[SDLK_6] ) { current = 6; }
		if ( kbd[SDLK_7] ) { current = 7; }
		if ( kbd[SDLK_8] ) { current = 8; }
		if ( kbd[SDLK_9] ) { current = 9; }

		if ( kbd[SDLK_RIGHT] ) { current++; kbdlock = 3; }
		if ( kbd[SDLK_LEFT] ) { current--; kbdlock = 3; }

		if ( things.size() > 0 ) {
			if ( current < 0 ) {
				current = 0;
			} else {
				current = current % things.size();
			}
		} else {
			current = -1;
		}

		/* speed */
		if ( kbd[SDLK_LSHIFT] || kbd[SDLK_RSHIFT] ) {
			speed = 10.0f;
		} else {
			if ( kbd[SDLK_LCTRL] || kbd[SDLK_RCTRL] ) {
				speed = 0.1f;
			} else {
				speed = 1.0f;
			}
		}

		/* move x */
		if ( kbd[SDLK_a] ) { things.at(current)->move(Vec(-1.0f*speed, 0.0f, 0.0f)); }
		if ( kbd[SDLK_d] ) { things.at(current)->move(Vec(1.0f*speed, 0.0f, 0.0f)); }
		/* move y */
		if ( kbd[SDLK_UP] ) { things.at(current)->move(Vec(0.0f, 1.0f*speed, 0.0f)); }
		if ( kbd[SDLK_DOWN] ) { things.at(current)->move(Vec(0.0f, -1.0f*speed, 0.0f)); }
		/* move z */
		if ( kbd[SDLK_w] ) { things.at(current)->move(Vec(0.0f, 0.0f, -1.0f*speed)); }
		if ( kbd[SDLK_s] ) { things.at(current)->move(Vec(0.0f, 0.0f, 1.0f*speed)); }

		/* rotate z */
		if ( kbd[SDLK_q] ) { things.at(current)->rotate(Vec(0.0f, 0.0f, 1.0f*speed)); }
		if ( kbd[SDLK_e] ) { things.at(current)->rotate(Vec(0.0f, 0.0f, -1.0f*speed)); }

		/* scaling */
		if ( kbd[SDLK_x] ) { things.at(current)->scale(1.1f*speed); }
		if ( kbd[SDLK_y] ) { things.at(current)->scale(0.9f*speed); }

		/* cycle color */
		//TODO
		
		/* normals */
		if ( kbd[SDLK_n] ) {
			if ( showNormals ) {
				things.at(current)->hideNormals();
				showNormals = false;
			} else {
				things.at(current)->showNormals();
				showNormals = true;
			}
			kbdlock = 3;
		}

		/* delta */
		if ( kbd[SDLK_m] ) { 
			if ( delta > 0.0f ) {
				if ( delta < PI/8.0f ) {
					delta = 0.0f;
				} else {
					delta = delta/2.0f;
				}
			} else {
				delta = PI;
			}
			things.at(current)->setDelta(delta);
			kbdlock = 3;
		}

		/* trace */
		if ( kbd[SDLK_t] ) { things.at(current)->trace(trace); trace = !trace; kbdlock = 3; }
	}
}

void UserAnimation::addThing(Thing* t) {
	things.push_back(t);
	if ( current < 0 ) { current = 0; }
}