diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2012-01-11 11:27:39 +0400 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2012-01-11 11:27:39 +0400 |
commit | 782f0b63829a2c257a6e2942c49882f7fe04c33c (patch) | |
tree | b7d421c7d4560167b8f71b4fb2d2fd2ad2d59daf /source/gameengine | |
parent | 0effb45d58b75d96f8bc1be74affc43e99fe2a92 (diff) |
bge camera actuator: -X and -Y axis
The camera actuator only allows to look the object from its front face.
Given that Blender takes -Y as the default forward orientation, the current
functionality doesn't let a camera to track an actor from behind.
This patch allows for -X and -Y axis tracking. This way a camera over the
shoulders of a character is possible (without resorting to rotate the
mesh/armature original orientation.
- patch reviewed by Campbell Barton, thanks
Diffstat (limited to 'source/gameengine')
-rw-r--r-- | source/gameengine/Converter/KX_ConvertActuators.cpp | 2 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_CameraActuator.cpp | 67 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_CameraActuator.h | 6 |
3 files changed, 51 insertions, 24 deletions
diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index f4b173763d3..be14400f33a 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -300,7 +300,7 @@ void BL_ConvertActuators(const char* maggiename, camact->height, camact->min, camact->max, - camact->axis=='x', + camact->axis, camact->damping); baseact = tmpcamact; } diff --git a/source/gameengine/Ketsji/KX_CameraActuator.cpp b/source/gameengine/Ketsji/KX_CameraActuator.cpp index d4aae68dafb..cd0aff0a87b 100644 --- a/source/gameengine/Ketsji/KX_CameraActuator.cpp +++ b/source/gameengine/Ketsji/KX_CameraActuator.cpp @@ -53,7 +53,7 @@ KX_CameraActuator::KX_CameraActuator( float hght, float minhght, float maxhght, - bool xytog, + short axis, float damping ): SCA_IActuator(gameobj, KX_ACT_CAMERA), @@ -61,7 +61,7 @@ KX_CameraActuator::KX_CameraActuator( m_height (hght), m_minHeight (minhght), m_maxHeight (maxhght), - m_x (xytog), + m_axis(axis), m_damping (damping) { if (m_ob) @@ -264,23 +264,50 @@ bool KX_CameraActuator::Update(double curtime, bool frame) /* C4: camera behind actor */ - if (m_x) { - fp1[0] = actormat[0][0]; - fp1[1] = actormat[1][0]; - fp1[2] = actormat[2][0]; - - fp2[0] = frommat[0][0]; - fp2[1] = frommat[1][0]; - fp2[2] = frommat[2][0]; - } - else { - fp1[0] = actormat[0][1]; - fp1[1] = actormat[1][1]; - fp1[2] = actormat[2][1]; - - fp2[0] = frommat[0][1]; - fp2[1] = frommat[1][1]; - fp2[2] = frommat[2][1]; + switch (m_axis) { + case OB_POSX: + /* X */ + fp1[0] = actormat[0][0]; + fp1[1] = actormat[1][0]; + fp1[2] = actormat[2][0]; + + fp2[0] = frommat[0][0]; + fp2[1] = frommat[1][0]; + fp2[2] = frommat[2][0]; + break; + case OB_POSY: + /* Y */ + fp1[0] = actormat[0][1]; + fp1[1] = actormat[1][1]; + fp1[2] = actormat[2][1]; + + fp2[0] = frommat[0][1]; + fp2[1] = frommat[1][1]; + fp2[2] = frommat[2][1]; + break; + case OB_NEGX: + /* -X */ + fp1[0] = -actormat[0][0]; + fp1[1] = -actormat[1][0]; + fp1[2] = -actormat[2][0]; + + fp2[0] = frommat[0][0]; + fp2[1] = frommat[1][0]; + fp2[2] = frommat[2][0]; + break; + case OB_NEGY: + /* -Y */ + fp1[0] = -actormat[0][1]; + fp1[1] = -actormat[1][1]; + fp1[2] = -actormat[2][1]; + + fp2[0] = frommat[0][1]; + fp2[1] = frommat[1][1]; + fp2[2] = frommat[2][1]; + break; + default: + assert(0); + break; } inp= fp1[0]*fp2[0] + fp1[1]*fp2[1] + fp1[2]*fp2[2]; @@ -389,7 +416,7 @@ PyAttributeDef KX_CameraActuator::Attributes[] = { KX_PYATTRIBUTE_FLOAT_RW("min",-FLT_MAX,FLT_MAX,KX_CameraActuator,m_minHeight), KX_PYATTRIBUTE_FLOAT_RW("max",-FLT_MAX,FLT_MAX,KX_CameraActuator,m_maxHeight), KX_PYATTRIBUTE_FLOAT_RW("height",-FLT_MAX,FLT_MAX,KX_CameraActuator,m_height), - KX_PYATTRIBUTE_BOOL_RW("useXY",KX_CameraActuator,m_x), + KX_PYATTRIBUTE_SHORT_RW("axis", 0, 3, true, KX_CameraActuator,m_axis), KX_PYATTRIBUTE_RW_FUNCTION("object", KX_CameraActuator, pyattr_get_object, pyattr_set_object), KX_PYATTRIBUTE_FLOAT_RW("damping",0.f,10.f,KX_CameraActuator,m_damping), {NULL} diff --git a/source/gameengine/Ketsji/KX_CameraActuator.h b/source/gameengine/Ketsji/KX_CameraActuator.h index a6344ae380a..1cae676fe3f 100644 --- a/source/gameengine/Ketsji/KX_CameraActuator.h +++ b/source/gameengine/Ketsji/KX_CameraActuator.h @@ -70,8 +70,8 @@ private : /** max (float), */ float m_maxHeight; - /** xy toggle (pick one): true == x, false == y */ - bool m_x; + /** axis the camera tries to get behind: +x/+y/-x/-y */ + short m_axis; /** damping (float), */ float m_damping; @@ -97,7 +97,7 @@ private : float hght, float minhght, float maxhght, - bool xytog, + short axis, float damping ); |