diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-07-26 00:59:09 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-07-26 00:59:09 +0400 |
commit | 1b142434055e2b56b23991f0c9d695b6d4f33390 (patch) | |
tree | 8689574221e0d98697af406292b0383c14fc0c3b /source/gameengine | |
parent | dff9dce1cdcb5250797f529456649510d2396096 (diff) | |
parent | 1c00eacca2b084d7189de33cb75e8612cb542030 (diff) |
svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r20937:21899
missing commits from peter 20942, 21165, 21170, 21174, 21597
these files still need manual merging
source/blender/makesdna/DNA_sequence_types.h
source/blender/src/sequence.c
source/blender/src/seqeffects.c
source/blender/src/editseq.c
source/blender/include/BSE_sequence.h
Diffstat (limited to 'source/gameengine')
-rw-r--r-- | source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp | 9 | ||||
-rw-r--r-- | source/gameengine/Converter/BL_ActionActuator.cpp | 58 | ||||
-rw-r--r-- | source/gameengine/Converter/BL_ActionActuator.h | 2 | ||||
-rw-r--r-- | source/gameengine/Converter/BL_ArmatureObject.h | 1 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp | 2 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_BulletPhysicsController.cpp | 2 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_MeshProxy.cpp | 2 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_SoundActuator.cpp | 16 | ||||
-rw-r--r-- | source/gameengine/PyDoc/API_intro.py | 2 | ||||
-rw-r--r-- | source/gameengine/PyDoc/GameTypes.py | 7 |
10 files changed, 80 insertions, 21 deletions
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp index ffff7185fe4..8ed36e860b4 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp @@ -261,6 +261,12 @@ void KX_BlenderRenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmat // couldn't find something to cast the shadow on... glMultMatrixd(oglmatrix); } + else + { // we found the "ground", but the cast matrix doesn't take + // scaling in consideration, so we must apply the object scale + MT_Vector3 size = gameobj->GetSGNode()->GetLocalScale(); + glScalef(size[0], size[1], size[2]); + } } else { @@ -384,5 +390,4 @@ void KX_BlenderRenderTools::Update2DFilter(vector<STR_String>& propNames, void* void KX_BlenderRenderTools::Render2DFilters(RAS_ICanvas* canvas) { m_filtermanager.RenderFilters(canvas); -} - +}
\ No newline at end of file diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp index bed99a4f502..30055a717e3 100644 --- a/source/gameengine/Converter/BL_ActionActuator.cpp +++ b/source/gameengine/Converter/BL_ActionActuator.cpp @@ -805,6 +805,10 @@ PyObject* BL_ActionActuator::PyGetChannel(PyObject* value) { bPoseChannel *pchan; + if(m_userpose==NULL && m_pose==NULL) { + BL_ArmatureObject *obj = (BL_ArmatureObject*)GetParent(); + obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ + } // get_pose_channel accounts for NULL pose, run on both incase one exists but // the channel doesnt @@ -950,14 +954,18 @@ KX_PYMETHODDEF_DOC(BL_ActionActuator, setChannel, obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ if (!m_userpose) { - obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ + if(!m_pose) + obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ game_copy_pose(&m_userpose, m_pose); } - pchan= verify_pose_channel(m_userpose, string); // adds the channel if its not there. + // pchan= verify_pose_channel(m_userpose, string); // adds the channel if its not there. + pchan= get_pose_channel(m_userpose, string); // adds the channel if its not there. - VECCOPY (pchan->loc, matrix[3]); - Mat4ToSize(matrix, pchan->size); - Mat4ToQuat(matrix, pchan->quat); + if(pchan) { + VECCOPY (pchan->loc, matrix[3]); + Mat4ToSize(matrix, pchan->size); + Mat4ToQuat(matrix, pchan->quat); + } } else { MT_Vector3 loc; @@ -969,15 +977,24 @@ KX_PYMETHODDEF_DOC(BL_ActionActuator, setChannel, // same as above if (!m_userpose) { - obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ + if(!m_pose) + obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ game_copy_pose(&m_userpose, m_pose); } - pchan= verify_pose_channel(m_userpose, string); + // pchan= verify_pose_channel(m_userpose, string); + pchan= get_pose_channel(m_userpose, string); // adds the channel if its not there. // for some reason loc.setValue(pchan->loc) fails - pchan->loc[0]= loc[0]; pchan->loc[1]= loc[1]; pchan->loc[2]= loc[2]; - pchan->size[0]= size[0]; pchan->size[1]= size[1]; pchan->size[2]= size[2]; - pchan->quat[0]= quat[3]; pchan->quat[1]= quat[0]; pchan->quat[2]= quat[1]; pchan->quat[3]= quat[2]; /* notice xyzw -> wxyz is intentional */ + if(pchan) { + pchan->loc[0]= loc[0]; pchan->loc[1]= loc[1]; pchan->loc[2]= loc[2]; + pchan->size[0]= size[0]; pchan->size[1]= size[1]; pchan->size[2]= size[2]; + pchan->quat[0]= quat[3]; pchan->quat[1]= quat[0]; pchan->quat[2]= quat[1]; pchan->quat[3]= quat[2]; /* notice xyzw -> wxyz is intentional */ + } + } + + if(pchan==NULL) { + PyErr_SetString(PyExc_ValueError, "Channel could not be found, use the 'channelNames' attribute to get a list of valid channels"); + return NULL; } pchan->flag |= POSE_ROT|POSE_LOC|POSE_SIZE; @@ -1051,6 +1068,7 @@ PyAttributeDef BL_ActionActuator::Attributes[] = { KX_PYATTRIBUTE_FLOAT_RW("frameEnd", 0, MAXFRAMEF, BL_ActionActuator, m_endframe), KX_PYATTRIBUTE_FLOAT_RW("blendIn", 0, MAXFRAMEF, BL_ActionActuator, m_blendin), KX_PYATTRIBUTE_RW_FUNCTION("action", BL_ActionActuator, pyattr_get_action, pyattr_set_action), + KX_PYATTRIBUTE_RO_FUNCTION("channelNames", BL_ActionActuator, pyattr_get_channel_names), KX_PYATTRIBUTE_SHORT_RW("priority", 0, 100, false, BL_ActionActuator, m_priority), KX_PYATTRIBUTE_FLOAT_RW_CHECK("frame", 0, MAXFRAMEF, BL_ActionActuator, m_localtime, CheckFrame), KX_PYATTRIBUTE_STRING_RW("propName", 0, 31, false, BL_ActionActuator, m_propname), @@ -1094,3 +1112,23 @@ int BL_ActionActuator::pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF return PY_SET_ATTR_SUCCESS; } + +PyObject* BL_ActionActuator::pyattr_get_channel_names(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + BL_ActionActuator* self= static_cast<BL_ActionActuator*>(self_v); + PyObject *ret= PyList_New(0); + PyObject *item; + + bPose *pose= ((BL_ArmatureObject*)self->GetParent())->GetOrigPose(); + + if(pose) { + bPoseChannel *pchan; + for(pchan= (bPoseChannel *)pose->chanbase.first; pchan; pchan= (bPoseChannel *)pchan->next) { + item= PyUnicode_FromString(pchan->name); + PyList_Append(ret, item); + Py_DECREF(item); + } + } + + return ret; +} diff --git a/source/gameengine/Converter/BL_ActionActuator.h b/source/gameengine/Converter/BL_ActionActuator.h index e328ce126ca..6003e23e315 100644 --- a/source/gameengine/Converter/BL_ActionActuator.h +++ b/source/gameengine/Converter/BL_ActionActuator.h @@ -114,7 +114,7 @@ public: static PyObject* pyattr_get_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); static int pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); - + static PyObject* pyattr_get_channel_names(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); /* attribute check */ static int CheckFrame(void *self, const PyAttributeDef*) { diff --git a/source/gameengine/Converter/BL_ArmatureObject.h b/source/gameengine/Converter/BL_ArmatureObject.h index e1e176840a6..684d89d492b 100644 --- a/source/gameengine/Converter/BL_ArmatureObject.h +++ b/source/gameengine/Converter/BL_ArmatureObject.h @@ -60,6 +60,7 @@ public: void GetMRDPose(struct bPose **pose); void GetPose(struct bPose **pose); void SetPose (struct bPose *pose); + struct bPose *GetOrigPose() {return m_pose;} // never edit this, only for accessing names void ApplyPose(); void RestorePose(); diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp index 7cb287d02b2..de820ddaaae 100644 --- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp +++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp @@ -146,7 +146,7 @@ PyAttributeDef KX_NetworkMessageActuator::Attributes[] = { KX_PYATTRIBUTE_STRING_RW("propName", 0, 100, false, KX_NetworkMessageActuator, m_toPropName), KX_PYATTRIBUTE_STRING_RW("subject", 0, 100, false, KX_NetworkMessageActuator, m_subject), KX_PYATTRIBUTE_BOOL_RW("usePropBody", KX_NetworkMessageActuator, m_bPropBody), - KX_PYATTRIBUTE_STRING_RW("body", 0, 100, false, KX_NetworkMessageActuator, m_body), + KX_PYATTRIBUTE_STRING_RW("body", 0, 16384, false, KX_NetworkMessageActuator, m_body), { NULL } //Sentinel }; diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp index 748b0667061..db1595db36f 100644 --- a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp +++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp @@ -402,6 +402,8 @@ void KX_BulletPhysicsController::RestoreDynamics() btRigidBody *body = GetRigidBody(); if (body && m_suspended) { + // before make sure any position change that was done in this logic frame are accounted for + SetTransform(); GetPhysicsEnvironment()->updateCcdPhysicsController(this, m_savedMass, m_savedCollisionFlags, diff --git a/source/gameengine/Ketsji/KX_MeshProxy.cpp b/source/gameengine/Ketsji/KX_MeshProxy.cpp index 96e8f61e4c8..606ba0e16c2 100644 --- a/source/gameengine/Ketsji/KX_MeshProxy.cpp +++ b/source/gameengine/Ketsji/KX_MeshProxy.cpp @@ -328,7 +328,7 @@ bool ConvertPythonToMesh(PyObject * value, RAS_MeshObject **object, bool py_none KX_MeshProxy *kx_mesh = static_cast<KX_MeshProxy*>BGE_PROXY_REF(value); /* sets the error */ - if (*object==NULL) { + if (kx_mesh==NULL) { PyErr_Format(PyExc_SystemError, "%s, " BGE_PROXY_ERROR_MSG, error_prefix); return false; } diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp index 673f42283dd..39381182944 100644 --- a/source/gameengine/Ketsji/KX_SoundActuator.cpp +++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp @@ -104,7 +104,8 @@ bool KX_SoundActuator::Update(double curtime, bool frame) // do nothing on negative events, otherwise sounds are played twice! bool bNegativeEvent = IsNegativeEvent(); - + bool bPositiveEvent = m_posevent; + RemoveAllEvents(); if (!m_soundObject) @@ -153,8 +154,17 @@ bool KX_SoundActuator::Update(double curtime, bool frame) // remember that we tried to stop the actuator m_isplaying = false; } - else - { + +#if 1 + // Warning: when de-activating the actuator, after a single negative event this runs again with... + // m_posevent==false && m_posevent==false, in this case IsNegativeEvent() returns false + // and assumes this is a positive event. + // check that we actually have a positive event so as not to play sounds when being disabled. + else if(bPositiveEvent) { // <- added since 2.49 +#else + else { // <- works in most cases except a loop-end sound will never stop unless + // the negative pulse is done continuesly +#endif if (!m_isplaying) { switch (m_type) diff --git a/source/gameengine/PyDoc/API_intro.py b/source/gameengine/PyDoc/API_intro.py index 578b56eb2b0..0a687088627 100644 --- a/source/gameengine/PyDoc/API_intro.py +++ b/source/gameengine/PyDoc/API_intro.py @@ -24,7 +24,7 @@ The Blender Game Engine Python API Reference Additional Modules: ------------------- - These modules have no GameEngine spesific functionality but are useful in many cases. + These modules have no GameEngine specific functionality but are useful in many cases. - L{Mathutils} - L{Geometry} diff --git a/source/gameengine/PyDoc/GameTypes.py b/source/gameengine/PyDoc/GameTypes.py index 63dd1a7fabf..35d8cd63c44 100644 --- a/source/gameengine/PyDoc/GameTypes.py +++ b/source/gameengine/PyDoc/GameTypes.py @@ -310,6 +310,8 @@ class BL_ActionActuator(SCA_IActuator): @ivar action: The name of the action to set as the current action. @type action: string + @ivar channelNames: A list of channel names that may be used with L{setChannel} and L{getChannel} + @type channelNames: list of strings @ivar frameStart: Specifies the starting frame of the animation. @type frameStart: float @ivar frameEnd: Specifies the ending frame of the animation. @@ -340,7 +342,8 @@ class BL_ActionActuator(SCA_IActuator): """ Alternative to the 2 arguments, 4 arguments (channel, matrix, loc, size, quat) are also supported. - @param channel: A string specifying the name of the bone channel, created if missing. + @note: These values are relative to the bones rest position, currently the api has no way to get this info (which is annoying), but can be worked around by using bones with a rest pose that has no translation. + @param channel: A string specifying the name of the bone channel, error raised if not in L{channelNames}. @type channel: string @param matrix: A 4x4 matrix specifying the overriding transformation as an offset from the bone's rest position. @@ -349,7 +352,7 @@ class BL_ActionActuator(SCA_IActuator): def getChannel(channel): """ - @param channel: A string specifying the name of the bone channel. error raised if missing. + @param channel: A string specifying the name of the bone channel. error raised if not in L{channelNames}. @type channel: string @rtype: tuple @return: (loc, size, quat) |