MegaGlest/source/glest_game/game/game_camera.h
titiger 341c7ce46f Shake without effecting the real camera pos
The camera shake effect does not manipulate the real camera pos anymore, 
just the Opengl campos is effected by it. By this all camera pos related caches 
don't need to refresh just beause the camera shakes.
2014-02-04 21:14:52 +01:00

193 lines
4.5 KiB
C++

// ==============================================================
// This file is part of Glest (www.glest.org)
//
// Copyright (C) 2001-2008 Martiño Figueroa
//
// You can redistribute this code and/or modify it under
// the terms of the GNU General Public License as published
// by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version
// ==============================================================
#ifndef _GLEST_GAME_GAMECAMERA_H_
#define _GLEST_GAME_GAMECAMERA_H_
#ifdef WIN32
#include <winsock2.h>
#include <winsock.h>
#endif
#include "vec.h"
#include "math_util.h"
#include <map>
#include <string>
#include "leak_dumper.h"
namespace Shared { namespace Xml {
class XmlNode;
}}
namespace Glest{ namespace Game{
using ::Shared::Graphics::Quad2i;
using ::Shared::Graphics::Vec3f;
using ::Shared::Graphics::Vec2f;
using ::Shared::Xml::XmlNode;
class Config;
// =====================================================
// class GameCamera
//
/// A basic camera that holds information about the game view
// =====================================================
class GameCamera {
public:
static const float startingVAng;
static const float startingHAng;
static const float vTransitionMult;
static const float hTransitionMult;
static const float defaultHeight;
static const float centerOffsetZ;
static const float shakeDist;
public:
enum State{
sGame,
sFree,
sUnit
};
private:
Vec3f pos;
Vec3f destPos;
Vec2f shakeOffset;
float hAng; //YZ plane positive -Z axis
float vAng; //XZ plane positive +Z axis
float lastHAng;
float lastVAng;
Vec2f destAng;
float rotate;
Vec3f move;
float shakeDecrement;
float currentShakeIntensity;
State state;
int limitX;
int limitY;
//config
float speed;
bool clampBounds;
bool clampDisable;
//float maxRenderDistance;
float maxHeight;
float minHeight;
//float maxCameraDist;
//float minCameraDist;
float minVAng;
float maxVAng;
float fov;
float calculatedDefault;
std::map<float, std::map<float, std::map<Vec3f, Quad2i> > > cacheVisibleQuad;
int MaxVisibleQuadItemCache;
public:
GameCamera();
~GameCamera();
void init(int limitX, int limitY);
//get
float getHAng() const {return hAng;};
float getVAng() const {return vAng;}
State getState() const {return state;}
void setState(State s);
void resetCamera() {setState(sGame);}
const Vec3f &getPos() const {return pos;}
float getFov() const {return fov;}
//set
void setRotate(float rotate){this->rotate= rotate;}
void setPos(Vec2f pos);
void setPos(Vec3f pos);
const Vec2f &getShakeOffset() const {return shakeOffset;}
void shake(int shakeDuration, int shakeStartIntensity , bool cameraDistanceAffected, Vec3f unitVector);
void setMoveX(float f) {this->move.x= f;}
void setMoveY(float f) {this->move.y= f;}
void setMoveZ(float f) {this->move.z= f;}
inline bool isMoving() const {
return (this->move.x != 0.0 || this->move.y != 0.0 || this->move.z != 0.0);
}
inline void stopMove() {
this->move.x = 0.0;
this->move.y = 0.0;
this->move.z = 0.0;
}
void stop() {
destPos = pos;
destAng.x = vAng;
destAng.y = hAng;
}
std::string getCameraMovementKey() const;
//other
void update();
Quad2i computeVisibleQuad();
void centerXZ(float x, float z);
void transitionXYZ(float x, float y, float z);
void transitionVH(float v, float h);
void rotateToVH(float v, float h);
void zoom(float dist);
void moveForwardH(float dist, float response); // response: 1.0 for immediate, 0 for full inertia
void moveSideH(float dist, float response);
void load(const XmlNode *node);
void save(XmlNode *node) const;
void setMaxHeight(float value);
float getCalculatedDefault() const{ return calculatedDefault; }
void setCalculatedDefault(float calculatedDefault);
float getMaxHeight() const {return maxHeight;}
void setFov(float value) { fov = value; }
void setMinVAng(float value) { minVAng = value; }
void setMaxVAng(float value) { maxVAng = value; }
void setHAng(float value) { hAng=value;};
void setVAng(float value) { vAng=value;}
void saveGame(XmlNode *rootNode);
void loadGame(const XmlNode *rootNode);
private:
void setClampBounds(bool value) { clampBounds = value; }
void resetPosition();
void setClampDisabled(bool value) { clampDisable = value; };
void clampPosXYZ(float x1, float x2, float y1, float y2, float z1, float z2);
void clampPosXZ(float x1, float x2, float z1, float z2);
void clampAng();
void moveUp(float dist);
void rotateHV(float h, float v);
void shakeCamera();
};
}} //end namespace
#endif